libkeccak_shakesum_fd - Calculate a SHAKE hashsum of a file
int libkeccak_shakesum_fd(int fd, struct libkeccak_state *state, long int semicapacity, long int output, void *hashsum);
Link with -lkeccak.
The libkeccak_shakesum_fd() function calculates a SHAKE hashsum of a file, whose file desriptor is specified by fd (and should be at the beginning of the file.) The hash algorithm is tuned by the semicapacity and output parameters; they specify the half of the capacity and the output size, respectively, in bits.
The hash is stored in binary form to hashsum. hashsum should have an allocation size of at least (((output + 7) / 8) * sizeof(char)).
*state should not be initialised. libkeccak_shakesum_fd() initialises *state itself. Therefore there would be a memory leak if *state is already initialised.
The libkeccak_shakesum_fd() function returns 0 upon successful completion. On error, -1 is returned and errno is set to describe the error.
Be aware, libkeccak_shakesum_fd() hashes the file until the end has been reached. For pipes and sockets and this means until the file has been closed. But for character devices, this usually means never. Attempting to hash files in /dev is therefore usually a bad idea. libkeccak_shakesum_fd() does not check for the file length or file type before hashing as this could limit what you can do, and make the library more complex.
libkeccak_shakesum_fd() does not stop if interrupted (read(2) returns EINTR.)
libkeccak_shakesum_fd() assumes all information is non-sensitive, and will therefore not perform any secure erasure of information.
libkeccak_shakesum_fd() does not validate the tuning of the algorithm.
This example calculates the SHAKE256(, 512) hash of the input from stdin, and prints the hash, in hexadecimal form, to stdout.
struct libkeccak_state state; if (libkeccak_shakesum_fd(STDIN_FILENO, &state, 256, 512, binhash) < 0) goto fail; libkeccak_behex_lower(hexhash, binhash, sizeof(binhash)); printf(\(dq%s\n\(dq, hexhash); libkeccak_state_destroy(&state);