1 /* 2 The Keccak sponge function, designed by Guido Bertoni, Joan Daemen, 3 Michaël Peeters and Gilles Van Assche. For more information, feedback or 4 questions, please refer to our website: http://keccak.noekeon.org/ 5 6 Implementation by the designers, 7 hereby denoted as "the implementer". 8 9 To the extent possible under law, the implementer has waived all copyright 10 and related or neighboring rights to the source code in this file. 11 http://creativecommons.org/publicdomain/zero/1.0/ 12 */ 13 14 #ifndef _KeccakSponge_h_ 15 #define _KeccakSponge_h_ 16 17 #define KeccakPermutationSize 1600 18 #define KeccakPermutationSizeInBytes (KeccakPermutationSize/8) 19 #define KeccakMaximumRate 1536 20 #define KeccakMaximumRateInBytes (KeccakMaximumRate/8) 21 22 #if defined(UseSSE) || defined(UseXOP) 23 #if defined(__GNUC__) 24 #define ALIGN __attribute__ ((aligned(32))) 25 #elif defined(_MSC_VER) 26 #define ALIGN __declspec(align(32)) 27 #endif 28 #endif 29 30 #ifndef ALIGN 31 # define ALIGN 32 #endif 33 34 ALIGN typedef struct spongeStateStruct { 35 ALIGN unsigned char state[KeccakPermutationSizeInBytes]; 36 ALIGN unsigned char dataQueue[KeccakMaximumRateInBytes]; 37 unsigned int rate; 38 unsigned int capacity; 39 unsigned int bitsInQueue; 40 unsigned int fixedOutputLength; 41 int squeezing; 42 unsigned int bitsAvailableForSqueezing; 43 } spongeState; 44 45 /** 46 * Function to initialize the state of the Keccak[r, c] sponge function. 47 * The sponge function is set to the absorbing phase. 48 * @param state Pointer to the state of the sponge function to be initialized. 49 * @param rate The value of the rate r. 50 * @param capacity The value of the capacity c. 51 * @pre One must have r+c=1600 and the rate a multiple of 64 bits in this implementation. 52 * @return Zero if successful, 1 otherwise. 53 */ 54 static int InitSponge(spongeState *state, unsigned int rate, unsigned int capacity); 55 /** 56 * Function to give input data for the sponge function to absorb. 57 * @param state Pointer to the state of the sponge function initialized by InitSponge(). 58 * @param data Pointer to the input data. 59 * When @a databitLen is not a multiple of 8, the last bits of data must be 60 * in the least significant bits of the last byte. 61 * @param databitLen The number of input bits provided in the input data. 62 * @pre In the previous call to Absorb(), databitLen was a multiple of 8. 63 * @pre The sponge function must be in the absorbing phase, 64 * i.e., Squeeze() must not have been called before. 65 * @return Zero if successful, 1 otherwise. 66 */ 67 static int Absorb(spongeState *state, const unsigned char *data, unsigned long long databitlen); 68 /** 69 * Function to squeeze output data from the sponge function. 70 * If the sponge function was in the absorbing phase, this function 71 * switches it to the squeezing phase. 72 * @param state Pointer to the state of the sponge function initialized by InitSponge(). 73 * @param output Pointer to the buffer where to store the output data. 74 * @param outputLength The number of output bits desired. 75 * It must be a multiple of 8. 76 * @return Zero if successful, 1 otherwise. 77 */ 78 static int Squeeze(spongeState *state, unsigned char *output, unsigned long long outputLength); 79 80 #endif 81