---
name: "libkeccak_digest"
section: "3"
platform: "linux"
package: "libkeccak"
version: "1.4.3-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/libkeccak_digest"
---

# libkeccak\_digest(3)

Complete the hashing of a message with erasure

## 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_update/3.md), [**libkeccak\_fast\_update**(3)](/libkeccak_fast_update/3.md), or [**libkeccak\_zerocopy\_update**(3)](/libkeccak_zerocopy_update/3.md) 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)](/libkeccak_cshake_suffix/3.md) 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)](/malloc/3.md).

## 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)](/libkeccak_cshake_initialise/3.md), 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_state_initialise/3.md), [**libkeccak\_cshake\_initialise**(3)](/libkeccak_cshake_initialise/3.md), [**libkeccak\_fast\_update**(3)](/libkeccak_fast_update/3.md), [**libkeccak\_update**(3)](/libkeccak_update/3.md), [**libkeccak\_cshake\_suffix**(3)](/libkeccak_cshake_suffix/3.md), [**libkeccak\_fast\_digest**(3)](/libkeccak_fast_digest/3.md), [**libkeccak\_zerocopy\_digest**(3)](/libkeccak_zerocopy_digest/3.md), [**libkeccak\_simple\_squeeze**(3)](/libkeccak_simple_squeeze/3.md), [**libkeccak\_fast\_squeeze**(3)](/libkeccak_fast_squeeze/3.md), [**libkeccak\_squeeze**(3)](/libkeccak_squeeze/3.md)
