| 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 |  |