Home | History | Annotate | Line # | Download | only in ref
      1 /*
      2    BLAKE2 reference source code package - reference C implementations
      3 
      4    Written in 2012 by Samuel Neves <sneves (at) dei.uc.pt>
      5 
      6    To the extent possible under law, the author(s) have dedicated all copyright
      7    and related and neighboring rights to this software to the public domain
      8    worldwide. This software is distributed without any warranty.
      9 
     10    All code is triple-licensed under the
     11    [CC0](http://creativecommons.org/publicdomain/zero/1.0), the
     12    [OpenSSL Licence](https://www.openssl.org/source/license.html), or
     13    the [Apache Public License 2.0](http://www.apache.org/licenses/LICENSE-2.0),
     14    at your choosing.
     15  */
     16 
     17 #ifndef blake2_H
     18 #define blake2_H
     19 
     20 #include <stddef.h>
     21 #include <stdint.h>
     22 
     23 #include "crypto_generichash_blake2b.h"
     24 #include "export.h"
     25 
     26 #define blake2b_init_param crypto_generichash_blake2b__init_param
     27 #define blake2b_init crypto_generichash_blake2b__init
     28 #define blake2b_init_salt_personal \
     29     crypto_generichash_blake2b__init_salt_personal
     30 #define blake2b_init_key crypto_generichash_blake2b__init_key
     31 #define blake2b_init_key_salt_personal \
     32     crypto_generichash_blake2b__init_key_salt_personal
     33 #define blake2b_update crypto_generichash_blake2b__update
     34 #define blake2b_final crypto_generichash_blake2b__final
     35 #define blake2b crypto_generichash_blake2b__blake2b
     36 #define blake2b_salt_personal crypto_generichash_blake2b__blake2b_salt_personal
     37 #define blake2b_pick_best_implementation \
     38     crypto_generichash_blake2b__pick_best_implementation
     39 
     40 enum blake2b_constant {
     41     BLAKE2B_BLOCKBYTES    = 128,
     42     BLAKE2B_OUTBYTES      = 64,
     43     BLAKE2B_KEYBYTES      = 64,
     44     BLAKE2B_SALTBYTES     = 16,
     45     BLAKE2B_PERSONALBYTES = 16
     46 };
     47 
     48 #if defined(__IBMC__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
     49 #pragma pack(1)
     50 #else
     51 #pragma pack(push, 1)
     52 #endif
     53 
     54 typedef struct blake2b_param_ {
     55     uint8_t digest_length;                   /*  1 */
     56     uint8_t key_length;                      /*  2 */
     57     uint8_t fanout;                          /*  3 */
     58     uint8_t depth;                           /*  4 */
     59     uint8_t leaf_length[4];                  /*  8 */
     60     uint8_t node_offset[8];                  /* 16 */
     61     uint8_t node_depth;                      /* 17 */
     62     uint8_t inner_length;                    /* 18 */
     63     uint8_t reserved[14];                    /* 32 */
     64     uint8_t salt[BLAKE2B_SALTBYTES];         /* 48 */
     65     uint8_t personal[BLAKE2B_PERSONALBYTES]; /* 64 */
     66 } blake2b_param;
     67 
     68 typedef crypto_generichash_blake2b_state blake2b_state;
     69 
     70 #if defined(__IBMC__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
     71 #pragma pack()
     72 #else
     73 #pragma pack(pop)
     74 #endif
     75 
     76 /* Streaming API */
     77 int blake2b_init(blake2b_state *S, const uint8_t outlen);
     78 int blake2b_init_salt_personal(blake2b_state *S, const uint8_t outlen,
     79                                const void *salt, const void *personal);
     80 int blake2b_init_key(blake2b_state *S, const uint8_t outlen, const void *key,
     81                      const uint8_t keylen);
     82 int blake2b_init_key_salt_personal(blake2b_state *S, const uint8_t outlen,
     83                                    const void *key, const uint8_t keylen,
     84                                    const void *salt, const void *personal);
     85 int blake2b_init_param(blake2b_state *S, const blake2b_param *P);
     86 int blake2b_update(blake2b_state *S, const uint8_t *in, uint64_t inlen);
     87 int blake2b_final(blake2b_state *S, uint8_t *out, uint8_t outlen);
     88 
     89 /* Simple API */
     90 int blake2b(uint8_t *out, const void *in, const void *key, const uint8_t outlen,
     91             const uint64_t inlen, uint8_t keylen);
     92 int blake2b_salt_personal(uint8_t *out, const void *in, const void *key,
     93                           const uint8_t outlen, const uint64_t inlen,
     94                           uint8_t keylen, const void *salt,
     95                           const void *personal);
     96 
     97 typedef int (*blake2b_compress_fn)(blake2b_state *S,
     98                                    const uint8_t  block[BLAKE2B_BLOCKBYTES]);
     99 int blake2b_pick_best_implementation(void);
    100 int blake2b_compress_ref(blake2b_state *S,
    101                          const uint8_t  block[BLAKE2B_BLOCKBYTES]);
    102 int blake2b_compress_ssse3(blake2b_state *S,
    103                            const uint8_t  block[BLAKE2B_BLOCKBYTES]);
    104 int blake2b_compress_sse41(blake2b_state *S,
    105                            const uint8_t  block[BLAKE2B_BLOCKBYTES]);
    106 int blake2b_compress_avx2(blake2b_state *S,
    107                           const uint8_t  block[BLAKE2B_BLOCKBYTES]);
    108 
    109 #endif
    110