aboutsummaryrefslogtreecommitdiffstats
path: root/libkeccak_update.3
blob: 384e4925e4b697fcac949a1c6b9c0e4d8f0f605d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
.TH LIBKECCAK_UPDATE 3 LIBKECCAK
.SH NAME
libkeccak_update - Partially hash a message with erasure
.SH SYNOPSIS
.nf
#include <libkeccak.h>

int libkeccak_update(struct libkeccak_state *\fIstate\fP, const void *\fImsg\fP, size_t \fImsglen\fP);
.fi
.PP
Link with
.IR -lkeccak .
.SH DESCRIPTION
The
.BR libkeccak_update ()
function continues (or starts) hashing a message.
The current state of the hashing is stored in
.IR *state ,
and will be updated. The message specified by the
.I msg
parameter with the byte-size specified by the
.I msglen
parameter, will be hashed.
.PP
The
.BR 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.
.SH RETURN VALUES
The
.BR libkeccak_update ()
function returns 0 upon successful completion. On error,
-1 is returned and
.I errno
is set to describe the error.
.SH ERRORS
The
.BR libkeccak_update ()
function may fail for any reason specified by the function
.BR malloc (3).
.SH NOTES
Neither parameter by be
.I NULL
or 0.
.SH 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.
.PP
.nf
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, \(dq\(dq, binhash) < 0)
	goto fail;

libkeccak_behex_lower(hexhash, binhash, sizeof(binhash));
printf(\(dq%s\en\(dq, hexhash);
libkeccak_state_destroy(&state);
.fi
.SH NOTES
For cSHAKE, the
.BR libkeccak_cshake_initialise (3),
must be called, once, immediately after
state initialisation; before the first
call to the
.BR libkeccak_update ()
function.
.SH SEE ALSO
.BR libkeccak_state_initialise (3),
.BR libkeccak_cshake_initialise (3),
.BR libkeccak_fast_update (3),
.BR libkeccak_zerocopy_update (3),
.BR libkeccak_fast_digest (3),
.BR libkeccak_zerocopy_digest (3),
.BR libkeccak_digest (3)