LIBKECCAK_UPDATE(3)

NAME
libkeccak_update - Partially hash a message with erasure

SYNOPSIS
#include <libkeccak.h>
int libkeccak_update(struct libkeccak_state *state, const void *msg, size_t msglen);

Link with -lkeccak.

DESCRIPTION
The libkeccak_update() function continues (or starts) hashing a message. The current state of the hashing is stored in *state, and will be updated. The message specified by the msg parameter with the byte-size specified by the msglen parameter, will be hashed.

The libkeccak_update() function may reallocate the state's message chunk buffer. When doing so, it attempts to do so as securely as possible, rather than as fast as possible.

RETURN VALUES
The libkeccak_update() function returns 0 upon successful completion. On error, -1 is returned and errno is set to describe the error.

ERRORS
The libkeccak_update() function may fail for any reason specified by the function malloc(3).

NOTES
Neither parameter by be NULL or 0.

EXAMPLE
This example calculates the Keccak[b = 1024, c = 576, n = 256] hash of the input from stdin, and prints the hash, in hexadecimal form, to stdout.

struct libkeccak_state state;
struct libkeccak_spec spec;
char binhash[256 / 8];
char hexhash[256 / 8 * 2 + 1];
char chunk[4 << 10];
ssize_t len;
spec.bitrate = 1024;
spec.capacity = 576;
spec.output = 256;
if (libkeccak_state_initialise(&state, &spec) < 0)
	goto fail;
for (;;) {
	len = read(STDIN_FILENO, chunk, sizeof(chunk));
	if ((len < 0) && (errno == EINTR))
		continue;
	if (len < 0)
		goto fail;
	if (len == 0)
		break;
	if (libkeccak_update(&state, chunk, (size_t)len) < 0)
		goto fail;
}
if (libkeccak_digest(&state, NULL, 0, 0, "", binhash) < 0)
	goto fail;
libkeccak_behex_lower(hexhash, binhash, sizeof(binhash));
printf("%s\n", hexhash);
libkeccak_state_destroy(&state);

NOTES
For cSHAKE, the libkeccak_cshake_initialise(3), must be called, once, immediately after state initialisation; before the first call to the libkeccak_update() function.

SEE ALSO
libkeccak_state_initialise(3), libkeccak_cshake_initialise(3), libkeccak_fast_update(3), libkeccak_zerocopy_update(3), libkeccak_fast_digest(3), libkeccak_zerocopy_digest(3), libkeccak_digest(3)