115 lines
5.4 KiB
C
115 lines
5.4 KiB
C
|
/*
|
||
|
Implementation by the Keccak, Keyak and Ketje Teams, namely, Guido Bertoni,
|
||
|
Joan Daemen, Michaël Peeters, Gilles Van Assche and Ronny Van Keer, hereby
|
||
|
denoted as "the implementer".
|
||
|
|
||
|
For more information, feedback or questions, please refer to our websites:
|
||
|
http://keccak.noekeon.org/
|
||
|
http://keyak.noekeon.org/
|
||
|
http://ketje.noekeon.org/
|
||
|
|
||
|
To the extent possible under law, the implementer has waived all copyright
|
||
|
and related or neighboring rights to the source code in this file.
|
||
|
http://creativecommons.org/publicdomain/zero/1.0/
|
||
|
*/
|
||
|
|
||
|
#ifndef _KeccakHashInterface_h_
|
||
|
#define _KeccakHashInterface_h_
|
||
|
|
||
|
#ifndef KeccakP1600_excluded
|
||
|
|
||
|
#include "KeccakSponge.h"
|
||
|
#include <string.h>
|
||
|
|
||
|
typedef unsigned char BitSequence;
|
||
|
typedef size_t DataLength;
|
||
|
typedef enum { SUCCESS = 0, FAIL = 1, BAD_HASHLEN = 2 } HashReturn;
|
||
|
|
||
|
typedef struct {
|
||
|
KeccakWidth1600_SpongeInstance sponge;
|
||
|
unsigned int fixedOutputLength;
|
||
|
unsigned char delimitedSuffix;
|
||
|
} Keccak_HashInstance;
|
||
|
|
||
|
/**
|
||
|
* Function to initialize the Keccak[r, c] sponge function instance used in sequential hashing mode.
|
||
|
* @param hashInstance Pointer to the hash instance to be initialized.
|
||
|
* @param rate The value of the rate r.
|
||
|
* @param capacity The value of the capacity c.
|
||
|
* @param hashbitlen The desired number of output bits,
|
||
|
* or 0 for an arbitrarily-long output.
|
||
|
* @param delimitedSuffix Bits that will be automatically appended to the end
|
||
|
* of the input message, as in domain separation.
|
||
|
* This is a byte containing from 0 to 7 bits
|
||
|
* formatted like the @a delimitedData parameter of
|
||
|
* the Keccak_SpongeAbsorbLastFewBits() function.
|
||
|
* @pre One must have r+c=1600 and the rate a multiple of 8 bits in this implementation.
|
||
|
* @return SUCCESS if successful, FAIL otherwise.
|
||
|
*/
|
||
|
HashReturn Keccak_HashInitialize(Keccak_HashInstance *hashInstance, unsigned int rate, unsigned int capacity, unsigned int hashbitlen, unsigned char delimitedSuffix);
|
||
|
|
||
|
/** Macro to initialize a SHAKE128 instance as specified in the FIPS 202 standard.
|
||
|
*/
|
||
|
#define Keccak_HashInitialize_SHAKE128(hashInstance) Keccak_HashInitialize(hashInstance, 1344, 256, 0, 0x1F)
|
||
|
|
||
|
/** Macro to initialize a SHAKE256 instance as specified in the FIPS 202 standard.
|
||
|
*/
|
||
|
#define Keccak_HashInitialize_SHAKE256(hashInstance) Keccak_HashInitialize(hashInstance, 1088, 512, 0, 0x1F)
|
||
|
|
||
|
/** Macro to initialize a SHA3-224 instance as specified in the FIPS 202 standard.
|
||
|
*/
|
||
|
#define Keccak_HashInitialize_SHA3_224(hashInstance) Keccak_HashInitialize(hashInstance, 1152, 448, 224, 0x06)
|
||
|
|
||
|
/** Macro to initialize a SHA3-256 instance as specified in the FIPS 202 standard.
|
||
|
*/
|
||
|
#define Keccak_HashInitialize_SHA3_256(hashInstance) Keccak_HashInitialize(hashInstance, 1088, 512, 256, 0x06)
|
||
|
|
||
|
/** Macro to initialize a SHA3-384 instance as specified in the FIPS 202 standard.
|
||
|
*/
|
||
|
#define Keccak_HashInitialize_SHA3_384(hashInstance) Keccak_HashInitialize(hashInstance, 832, 768, 384, 0x06)
|
||
|
|
||
|
/** Macro to initialize a SHA3-512 instance as specified in the FIPS 202 standard.
|
||
|
*/
|
||
|
#define Keccak_HashInitialize_SHA3_512(hashInstance) Keccak_HashInitialize(hashInstance, 576, 1024, 512, 0x06)
|
||
|
|
||
|
/**
|
||
|
* Function to give input data to be absorbed.
|
||
|
* @param hashInstance Pointer to the hash instance initialized by Keccak_HashInitialize().
|
||
|
* @param data Pointer to the input data.
|
||
|
* When @a databitLen is not a multiple of 8, the last bits of data must be
|
||
|
* in the least significant bits of the last byte (little-endian convention).
|
||
|
* @param databitLen The number of input bits provided in the input data.
|
||
|
* @pre In the previous call to Keccak_HashUpdate(), databitlen was a multiple of 8.
|
||
|
* @return SUCCESS if successful, FAIL otherwise.
|
||
|
*/
|
||
|
HashReturn Keccak_HashUpdate(Keccak_HashInstance *hashInstance, const BitSequence *data, DataLength databitlen);
|
||
|
|
||
|
/**
|
||
|
* Function to call after all input blocks have been input and to get
|
||
|
* output bits if the length was specified when calling Keccak_HashInitialize().
|
||
|
* @param hashInstance Pointer to the hash instance initialized by Keccak_HashInitialize().
|
||
|
* If @a hashbitlen was not 0 in the call to Keccak_HashInitialize(), the number of
|
||
|
* output bits is equal to @a hashbitlen.
|
||
|
* If @a hashbitlen was 0 in the call to Keccak_HashInitialize(), the output bits
|
||
|
* must be extracted using the Keccak_HashSqueeze() function.
|
||
|
* @param state Pointer to the state of the sponge function initialized by Init().
|
||
|
* @param hashval Pointer to the buffer where to store the output data.
|
||
|
* @return SUCCESS if successful, FAIL otherwise.
|
||
|
*/
|
||
|
HashReturn Keccak_HashFinal(Keccak_HashInstance *hashInstance, BitSequence *hashval);
|
||
|
|
||
|
/**
|
||
|
* Function to squeeze output data.
|
||
|
* @param hashInstance Pointer to the hash instance initialized by Keccak_HashInitialize().
|
||
|
* @param data Pointer to the buffer where to store the output data.
|
||
|
* @param databitlen The number of output bits desired (must be a multiple of 8).
|
||
|
* @pre Keccak_HashFinal() must have been already called.
|
||
|
* @pre @a databitlen is a multiple of 8.
|
||
|
* @return SUCCESS if successful, FAIL otherwise.
|
||
|
*/
|
||
|
HashReturn Keccak_HashSqueeze(Keccak_HashInstance *hashInstance, BitSequence *data, DataLength databitlen);
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#endif
|