Home | History | Annotate | Download | only in kcp
      1 /*
      2 Implementation by the Keccak, Keyak and Ketje Teams, namely, Guido Bertoni,
      3 Joan Daemen, Michal Peeters, Gilles Van Assche and Ronny Van Keer, hereby
      4 denoted as "the implementer".
      5 
      6 For more information, feedback or questions, please refer to our websites:
      7 http://keccak.noekeon.org/
      8 http://keyak.noekeon.org/
      9 http://ketje.noekeon.org/
     10 
     11 To the extent possible under law, the implementer has waived all copyright
     12 and related or neighboring rights to the source code in this file.
     13 http://creativecommons.org/publicdomain/zero/1.0/
     14 */
     15 
     16 #ifndef _KeccakHashInterface_h_
     17 #define _KeccakHashInterface_h_
     18 
     19 #ifndef KeccakP1600_excluded
     20 
     21 #include "KeccakSponge.h"
     22 #include <string.h>
     23 
     24 typedef unsigned char BitSequence;
     25 typedef size_t DataLength;
     26 typedef enum { SUCCESS = 0, FAIL = 1, BAD_HASHLEN = 2 } HashReturn;
     27 
     28 typedef struct {
     29     KeccakWidth1600_SpongeInstance sponge;
     30     unsigned int fixedOutputLength;
     31     unsigned char delimitedSuffix;
     32 } Keccak_HashInstance;
     33 
     34 /**
     35   * Function to initialize the Keccak[r, c] sponge function instance used in sequential hashing mode.
     36   * @param  hashInstance    Pointer to the hash instance to be initialized.
     37   * @param  rate        The value of the rate r.
     38   * @param  capacity    The value of the capacity c.
     39   * @param  hashbitlen  The desired number of output bits,
     40   *                     or 0 for an arbitrarily-long output.
     41   * @param  delimitedSuffix Bits that will be automatically appended to the end
     42   *                         of the input message, as in domain separation.
     43   *                         This is a byte containing from 0 to 7 bits
     44   *                         formatted like the @a delimitedData parameter of
     45   *                         the Keccak_SpongeAbsorbLastFewBits() function.
     46   * @pre    One must have r+c=1600 and the rate a multiple of 8 bits in this implementation.
     47   * @return SUCCESS if successful, FAIL otherwise.
     48   */
     49 HashReturn Keccak_HashInitialize(Keccak_HashInstance *hashInstance, unsigned int rate, unsigned int capacity, unsigned int hashbitlen, unsigned char delimitedSuffix);
     50 
     51 /** Macro to initialize a SHAKE128 instance as specified in the FIPS 202 standard.
     52   */
     53 #define Keccak_HashInitialize_SHAKE128(hashInstance)        Keccak_HashInitialize(hashInstance, 1344,  256,   0, 0x1F)
     54 
     55 /** Macro to initialize a SHAKE256 instance as specified in the FIPS 202 standard.
     56   */
     57 #define Keccak_HashInitialize_SHAKE256(hashInstance)        Keccak_HashInitialize(hashInstance, 1088,  512,   0, 0x1F)
     58 
     59 /** Macro to initialize a SHA3-224 instance as specified in the FIPS 202 standard.
     60   */
     61 #define Keccak_HashInitialize_SHA3_224(hashInstance)        Keccak_HashInitialize(hashInstance, 1152,  448, 224, 0x06)
     62 
     63 /** Macro to initialize a SHA3-256 instance as specified in the FIPS 202 standard.
     64   */
     65 #define Keccak_HashInitialize_SHA3_256(hashInstance)        Keccak_HashInitialize(hashInstance, 1088,  512, 256, 0x06)
     66 
     67 /** Macro to initialize a SHA3-384 instance as specified in the FIPS 202 standard.
     68   */
     69 #define Keccak_HashInitialize_SHA3_384(hashInstance)        Keccak_HashInitialize(hashInstance,  832,  768, 384, 0x06)
     70 
     71 /** Macro to initialize a SHA3-512 instance as specified in the FIPS 202 standard.
     72   */
     73 #define Keccak_HashInitialize_SHA3_512(hashInstance)        Keccak_HashInitialize(hashInstance,  576, 1024, 512, 0x06)
     74 
     75 /**
     76   * Function to give input data to be absorbed.
     77   * @param  hashInstance    Pointer to the hash instance initialized by Keccak_HashInitialize().
     78   * @param  data        Pointer to the input data.
     79   *                     When @a databitLen is not a multiple of 8, the last bits of data must be
     80   *                     in the least significant bits of the last byte (little-endian convention).
     81   * @param  databitLen  The number of input bits provided in the input data.
     82   * @pre    In the previous call to Keccak_HashUpdate(), databitlen was a multiple of 8.
     83   * @return SUCCESS if successful, FAIL otherwise.
     84   */
     85 HashReturn Keccak_HashUpdate(Keccak_HashInstance *hashInstance, const BitSequence *data, DataLength databitlen);
     86 
     87 /**
     88   * Function to call after all input blocks have been input and to get
     89   * output bits if the length was specified when calling Keccak_HashInitialize().
     90   * @param  hashInstance    Pointer to the hash instance initialized by Keccak_HashInitialize().
     91   * If @a hashbitlen was not 0 in the call to Keccak_HashInitialize(), the number of
     92   *     output bits is equal to @a hashbitlen.
     93   * If @a hashbitlen was 0 in the call to Keccak_HashInitialize(), the output bits
     94   *     must be extracted using the Keccak_HashSqueeze() function.
     95   * @param  state       Pointer to the state of the sponge function initialized by Init().
     96   * @param  hashval     Pointer to the buffer where to store the output data.
     97   * @return SUCCESS if successful, FAIL otherwise.
     98   */
     99 HashReturn Keccak_HashFinal(Keccak_HashInstance *hashInstance, BitSequence *hashval);
    100 
    101  /**
    102   * Function to squeeze output data.
    103   * @param  hashInstance    Pointer to the hash instance initialized by Keccak_HashInitialize().
    104   * @param  data        Pointer to the buffer where to store the output data.
    105   * @param  databitlen  The number of output bits desired (must be a multiple of 8).
    106   * @pre    Keccak_HashFinal() must have been already called.
    107   * @pre    @a databitlen is a multiple of 8.
    108   * @return SUCCESS if successful, FAIL otherwise.
    109   */
    110 HashReturn Keccak_HashSqueeze(Keccak_HashInstance *hashInstance, BitSequence *data, DataLength databitlen);
    111 
    112 #endif
    113 
    114 #endif
    115