LIBKECCAK_DIGEST(3)

NAME
libkeccak_digest - Complete the hashing of a message with erasure

SYNOPSIS
#include <libkeccak.h>
int libkeccak_digest(struct libkeccak_state *state, const void *msg, size_t msglen,
                     size_t bits, const char *suffix, void *hashsum);

Link with -lkeccak.

DESCRIPTION
The libkeccak_digest() function absorbs the last part of (or all of) a message, and returns the hash of the entire message. The last part of the message is specified by the msg parameter, and its byte-size is specified by the msglen parameter. If all of the message has already be processed by calls to the libkeccak_update(3), libkeccak_fast_update(3), or libkeccak_zerocopy_update(3) function (with the same pointer on state,) msg and msglen should be set to NULL and 0, respectively.

If the message is not comprised a whole number of bytes, the number of bits, modulus 8, in the message should be specified in the bits parameter. msglen must only count the number of whole bytes, that is, the floor of the number of bits in the message divided by 8.

suffix should be a NUL-terminated string of ASCII '1':s and '0':s, representing the bits that should be appended to the message. If this string is empty, NULL may be used instead. This is used to select hash algorithm. For pure Keccak, NULL or "" is used. For the other algorithms the constants LIBKECCAK_SHA3_SUFFIX (for SHA-3), LIBKECCAK_RAWSHAKE_SUFFIX (for RawSHAKE), and LIBKECCAK_SHAKE_SUFFIX (for SHAKE), or the return of the libkeccak_cshake_suffix(3) function (for cSHAKE), are used.

The hash of the message will be stored to hashsum, unless hashsum is NULL (which increases the performance of the call.) A total of ((state->n + 7) / 8) bytes will be written to the beginning of hashsum. Therefore, hashsum needs at least an allocation size of that number of bytes.

The libkeccak_digest() 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_digest() function returns 0 upon successful completion. On error, -1 is returned and errno is set to describe the error.

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

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 any of the libkeccak_fast_update(), libkeccak_zerocopy_update(), libkeccak_update(), and libkeccak_digest() functions.

SEE ALSO
libkeccak_state_initialise(3), libkeccak_cshake_initialise(3), libkeccak_fast_update(3), libkeccak_update(3), libkeccak_cshake_suffix(3), libkeccak_fast_digest(3), libkeccak_zerocopy_digest(3), libkeccak_simple_squeeze(3), libkeccak_fast_squeeze(3), libkeccak_squeeze(3)