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