Keccak-f[1600]
The crypto_core_keccak1600 functions provide direct access to the Keccak-f[1600] permutation, the core building block of SHA-3, SHAKE, and TurboSHAKE.
This is a low-level API. For most applications, use the high-level XOF API (SHAKE128, SHAKE256, TurboSHAKE128, TurboSHAKE256) instead.
Usage
The API follows the sponge construction pattern:
Initialize the state
Absorb data by XORing it into the state, applying the permutation between blocks
Squeeze output by extracting bytes from the state, applying the permutation between blocks
crypto_core_keccak1600_state state;
/* Initialize */
crypto_core_keccak1600_init(&state);
/* Absorb: XOR data into state and permute */
crypto_core_keccak1600_xor_bytes(&state, input, 0, input_len);
crypto_core_keccak1600_permute_24(&state);
/* Squeeze: extract output from state */
crypto_core_keccak1600_extract_bytes(&state, output, 0, output_len);State
The state is an opaque 224-byte structure with 16-byte alignment. The internal Keccak state is 200 bytes (1600 bits), with additional bytes reserved for metadata and alignment.
The state size can be queried at runtime:
Returns 224.
Initialization
Initializes the state to all zeros. Must be called before any other operation on a fresh state.
Absorbing data
XORs length bytes from bytes into the state starting at byte position offset.
Parameters:
state: pointer to the statebytes: input data to absorboffset: byte offset within the state (0-199)length: number of bytes to XOR
The offset and length must satisfy offset + length <= 200. This function does not apply the permutation; call permute_24() or permute_12() after absorbing a block.
Extracting output
Extracts length bytes from the state starting at byte position offset into bytes.
Parameters:
state: pointer to the state (not modified)bytes: output bufferoffset: byte offset within the state (0-199)length: number of bytes to extract
The offset and length must satisfy offset + length <= 200. This function does not apply the permutation; call permute_24() or permute_12() to generate additional output.
Permutations
Applies the Keccak-f[1600] permutation with 24 rounds. This is the full-strength permutation used by SHAKE128 and SHAKE256.
Applies the Keccak-p[1600,12] permutation with 12 rounds. This reduced-round variant is used by TurboSHAKE128 and TurboSHAKE256 for approximately 2x better performance while maintaining the same security claims.
Building a sponge
To implement a sponge-based construction:
The rate depends on the desired security level:
168 bytes for 128-bit security (SHAKE128, TurboSHAKE128)
136 bytes for 256-bit security (SHAKE256, TurboSHAKE256)
Notes
This is a low-level primitive with no built-in padding or domain separation. Applications must implement proper padding (typically pad10*1) and domain separation to build secure constructions.
For standard XOF functionality with proper padding and domain separation, use the high-level API:
crypto_xof_shake128()/crypto_xof_shake256()crypto_xof_turboshake128()/crypto_xof_turboshake256()
The state type uses an opaque structure to provide type safety. The state must be declared as crypto_core_keccak1600_state, not allocated manually using the size from crypto_core_keccak1600_statebytes().
These functions are constant-time and safe for use with secret data.
Last updated