1*0e33efe4SConrad Meyer /* 2*0e33efe4SConrad Meyer BLAKE2 reference source code package - optimized C implementations 3*0e33efe4SConrad Meyer 4*0e33efe4SConrad Meyer Written in 2012 by Samuel Neves <sneves@dei.uc.pt> 5*0e33efe4SConrad Meyer 6*0e33efe4SConrad Meyer To the extent possible under law, the author(s) have dedicated all copyright 7*0e33efe4SConrad Meyer and related and neighboring rights to this software to the public domain 8*0e33efe4SConrad Meyer worldwide. This software is distributed without any warranty. 9*0e33efe4SConrad Meyer 10*0e33efe4SConrad Meyer You should have received a copy of the CC0 Public Domain Dedication along with 11*0e33efe4SConrad Meyer this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>. 12*0e33efe4SConrad Meyer */ 13*0e33efe4SConrad Meyer #pragma once 14*0e33efe4SConrad Meyer #ifndef __BLAKE2_H__ 15*0e33efe4SConrad Meyer #define __BLAKE2_H__ 16*0e33efe4SConrad Meyer 17*0e33efe4SConrad Meyer #include <stddef.h> 18*0e33efe4SConrad Meyer #include <stdint.h> 19*0e33efe4SConrad Meyer 20*0e33efe4SConrad Meyer #if defined(_WIN32) || defined(__CYGWIN__) 21*0e33efe4SConrad Meyer #define BLAKE2_DLL_IMPORT __declspec(dllimport) 22*0e33efe4SConrad Meyer #define BLAKE2_DLL_EXPORT __declspec(dllexport) 23*0e33efe4SConrad Meyer #define BLAKE2_DLL_PRIVATE 24*0e33efe4SConrad Meyer #elif __GNUC__ >= 4 25*0e33efe4SConrad Meyer #define BLAKE2_DLL_IMPORT __attribute__ ((visibility ("default"))) 26*0e33efe4SConrad Meyer #define BLAKE2_DLL_EXPORT __attribute__ ((visibility ("default"))) 27*0e33efe4SConrad Meyer #define BLAKE2_DLL_PRIVATE __attribute__ ((visibility ("hidden"))) 28*0e33efe4SConrad Meyer #else 29*0e33efe4SConrad Meyer #define BLAKE2_DLL_IMPORT 30*0e33efe4SConrad Meyer #define BLAKE2_DLL_EXPORT 31*0e33efe4SConrad Meyer #define BLAKE2_DLL_PRIVATE 32*0e33efe4SConrad Meyer #endif 33*0e33efe4SConrad Meyer 34*0e33efe4SConrad Meyer #if defined(BLAKE2_DLL) 35*0e33efe4SConrad Meyer #if defined(BLAKE2_DLL_EXPORTS) // defined if we are building the DLL 36*0e33efe4SConrad Meyer #define BLAKE2_API BLAKE2_DLL_EXPORT 37*0e33efe4SConrad Meyer #else 38*0e33efe4SConrad Meyer #define BLAKE2_API BLAKE2_DLL_IMPORT 39*0e33efe4SConrad Meyer #endif 40*0e33efe4SConrad Meyer #define BLAKE2_PRIVATE BLAKE2_DLL_PRIVATE // must only be used by hidden logic 41*0e33efe4SConrad Meyer #else 42*0e33efe4SConrad Meyer #define BLAKE2_API 43*0e33efe4SConrad Meyer #define BLAKE2_PRIVATE 44*0e33efe4SConrad Meyer #endif 45*0e33efe4SConrad Meyer 46*0e33efe4SConrad Meyer #if defined(__cplusplus) 47*0e33efe4SConrad Meyer extern "C" { 48*0e33efe4SConrad Meyer #elif defined(_MSC_VER) && !defined(inline) 49*0e33efe4SConrad Meyer #define inline __inline 50*0e33efe4SConrad Meyer #endif 51*0e33efe4SConrad Meyer 52*0e33efe4SConrad Meyer enum blake2s_constant 53*0e33efe4SConrad Meyer { 54*0e33efe4SConrad Meyer BLAKE2S_BLOCKBYTES = 64, 55*0e33efe4SConrad Meyer BLAKE2S_OUTBYTES = 32, 56*0e33efe4SConrad Meyer BLAKE2S_KEYBYTES = 32, 57*0e33efe4SConrad Meyer BLAKE2S_SALTBYTES = 8, 58*0e33efe4SConrad Meyer BLAKE2S_PERSONALBYTES = 8 59*0e33efe4SConrad Meyer }; 60*0e33efe4SConrad Meyer 61*0e33efe4SConrad Meyer enum blake2b_constant 62*0e33efe4SConrad Meyer { 63*0e33efe4SConrad Meyer BLAKE2B_BLOCKBYTES = 128, 64*0e33efe4SConrad Meyer BLAKE2B_OUTBYTES = 64, 65*0e33efe4SConrad Meyer BLAKE2B_KEYBYTES = 64, 66*0e33efe4SConrad Meyer BLAKE2B_SALTBYTES = 16, 67*0e33efe4SConrad Meyer BLAKE2B_PERSONALBYTES = 16 68*0e33efe4SConrad Meyer }; 69*0e33efe4SConrad Meyer 70*0e33efe4SConrad Meyer #pragma pack(push, 1) 71*0e33efe4SConrad Meyer typedef struct __blake2s_param 72*0e33efe4SConrad Meyer { 73*0e33efe4SConrad Meyer uint8_t digest_length; // 1 74*0e33efe4SConrad Meyer uint8_t key_length; // 2 75*0e33efe4SConrad Meyer uint8_t fanout; // 3 76*0e33efe4SConrad Meyer uint8_t depth; // 4 77*0e33efe4SConrad Meyer uint32_t leaf_length; // 8 78*0e33efe4SConrad Meyer uint8_t node_offset[6];// 14 79*0e33efe4SConrad Meyer uint8_t node_depth; // 15 80*0e33efe4SConrad Meyer uint8_t inner_length; // 16 81*0e33efe4SConrad Meyer // uint8_t reserved[0]; 82*0e33efe4SConrad Meyer uint8_t salt[BLAKE2S_SALTBYTES]; // 24 83*0e33efe4SConrad Meyer uint8_t personal[BLAKE2S_PERSONALBYTES]; // 32 84*0e33efe4SConrad Meyer } blake2s_param; 85*0e33efe4SConrad Meyer 86*0e33efe4SConrad Meyer typedef struct __blake2s_state 87*0e33efe4SConrad Meyer { 88*0e33efe4SConrad Meyer uint32_t h[8]; 89*0e33efe4SConrad Meyer uint32_t t[2]; 90*0e33efe4SConrad Meyer uint32_t f[2]; 91*0e33efe4SConrad Meyer uint8_t buf[2 * BLAKE2S_BLOCKBYTES]; 92*0e33efe4SConrad Meyer uint32_t buflen; 93*0e33efe4SConrad Meyer uint8_t outlen; 94*0e33efe4SConrad Meyer uint8_t last_node; 95*0e33efe4SConrad Meyer } blake2s_state; 96*0e33efe4SConrad Meyer 97*0e33efe4SConrad Meyer typedef struct __blake2b_param 98*0e33efe4SConrad Meyer { 99*0e33efe4SConrad Meyer uint8_t digest_length; // 1 100*0e33efe4SConrad Meyer uint8_t key_length; // 2 101*0e33efe4SConrad Meyer uint8_t fanout; // 3 102*0e33efe4SConrad Meyer uint8_t depth; // 4 103*0e33efe4SConrad Meyer uint32_t leaf_length; // 8 104*0e33efe4SConrad Meyer uint64_t node_offset; // 16 105*0e33efe4SConrad Meyer uint8_t node_depth; // 17 106*0e33efe4SConrad Meyer uint8_t inner_length; // 18 107*0e33efe4SConrad Meyer uint8_t reserved[14]; // 32 108*0e33efe4SConrad Meyer uint8_t salt[BLAKE2B_SALTBYTES]; // 48 109*0e33efe4SConrad Meyer uint8_t personal[BLAKE2B_PERSONALBYTES]; // 64 110*0e33efe4SConrad Meyer } blake2b_param; 111*0e33efe4SConrad Meyer 112*0e33efe4SConrad Meyer typedef struct __blake2b_state 113*0e33efe4SConrad Meyer { 114*0e33efe4SConrad Meyer uint64_t h[8]; 115*0e33efe4SConrad Meyer uint64_t t[2]; 116*0e33efe4SConrad Meyer uint64_t f[2]; 117*0e33efe4SConrad Meyer uint8_t buf[2 * BLAKE2B_BLOCKBYTES]; 118*0e33efe4SConrad Meyer uint32_t buflen; 119*0e33efe4SConrad Meyer uint8_t outlen; 120*0e33efe4SConrad Meyer uint8_t last_node; 121*0e33efe4SConrad Meyer } blake2b_state; 122*0e33efe4SConrad Meyer 123*0e33efe4SConrad Meyer typedef struct __blake2sp_state 124*0e33efe4SConrad Meyer { 125*0e33efe4SConrad Meyer blake2s_state S[8][1]; 126*0e33efe4SConrad Meyer blake2s_state R[1]; 127*0e33efe4SConrad Meyer uint8_t buf[8 * BLAKE2S_BLOCKBYTES]; 128*0e33efe4SConrad Meyer uint32_t buflen; 129*0e33efe4SConrad Meyer uint8_t outlen; 130*0e33efe4SConrad Meyer } blake2sp_state; 131*0e33efe4SConrad Meyer 132*0e33efe4SConrad Meyer typedef struct __blake2bp_state 133*0e33efe4SConrad Meyer { 134*0e33efe4SConrad Meyer blake2b_state S[4][1]; 135*0e33efe4SConrad Meyer blake2b_state R[1]; 136*0e33efe4SConrad Meyer uint8_t buf[4 * BLAKE2B_BLOCKBYTES]; 137*0e33efe4SConrad Meyer uint32_t buflen; 138*0e33efe4SConrad Meyer uint8_t outlen; 139*0e33efe4SConrad Meyer } blake2bp_state; 140*0e33efe4SConrad Meyer #pragma pack(pop) 141*0e33efe4SConrad Meyer 142*0e33efe4SConrad Meyer // Streaming API 143*0e33efe4SConrad Meyer BLAKE2_API int blake2s_init( blake2s_state *S, size_t outlen ); 144*0e33efe4SConrad Meyer BLAKE2_API int blake2s_init_key( blake2s_state *S, size_t outlen, const void *key, size_t keylen ); 145*0e33efe4SConrad Meyer BLAKE2_API int blake2s_init_param( blake2s_state *S, const blake2s_param *P ); 146*0e33efe4SConrad Meyer BLAKE2_API int blake2s_update( blake2s_state *S, const uint8_t *in, size_t inlen ); 147*0e33efe4SConrad Meyer BLAKE2_API int blake2s_final( blake2s_state *S, uint8_t *out, size_t outlen ); 148*0e33efe4SConrad Meyer 149*0e33efe4SConrad Meyer BLAKE2_API int blake2b_init( blake2b_state *S, size_t outlen ); 150*0e33efe4SConrad Meyer BLAKE2_API int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen ); 151*0e33efe4SConrad Meyer BLAKE2_API int blake2b_init_param( blake2b_state *S, const blake2b_param *P ); 152*0e33efe4SConrad Meyer BLAKE2_API int blake2b_update( blake2b_state *S, const uint8_t *in, size_t inlen ); 153*0e33efe4SConrad Meyer BLAKE2_API int blake2b_final( blake2b_state *S, uint8_t *out, size_t outlen ); 154*0e33efe4SConrad Meyer 155*0e33efe4SConrad Meyer BLAKE2_API int blake2sp_init( blake2sp_state *S, size_t outlen ); 156*0e33efe4SConrad Meyer BLAKE2_API int blake2sp_init_key( blake2sp_state *S, size_t outlen, const void *key, size_t keylen ); 157*0e33efe4SConrad Meyer BLAKE2_API int blake2sp_update( blake2sp_state *S, const uint8_t *in, size_t inlen ); 158*0e33efe4SConrad Meyer BLAKE2_API int blake2sp_final( blake2sp_state *S, uint8_t *out, size_t outlen ); 159*0e33efe4SConrad Meyer 160*0e33efe4SConrad Meyer BLAKE2_API int blake2bp_init( blake2bp_state *S, size_t outlen ); 161*0e33efe4SConrad Meyer BLAKE2_API int blake2bp_init_key( blake2bp_state *S, size_t outlen, const void *key, size_t keylen ); 162*0e33efe4SConrad Meyer BLAKE2_API int blake2bp_update( blake2bp_state *S, const uint8_t *in, size_t inlen ); 163*0e33efe4SConrad Meyer BLAKE2_API int blake2bp_final( blake2bp_state *S, uint8_t *out, size_t outlen ); 164*0e33efe4SConrad Meyer 165*0e33efe4SConrad Meyer // Simple API 166*0e33efe4SConrad Meyer BLAKE2_API int blake2s( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); 167*0e33efe4SConrad Meyer BLAKE2_API int blake2b( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); 168*0e33efe4SConrad Meyer 169*0e33efe4SConrad Meyer BLAKE2_API int blake2sp( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); 170*0e33efe4SConrad Meyer BLAKE2_API int blake2bp( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ); 171*0e33efe4SConrad Meyer blake2(uint8_t * out,const void * in,const void * key,size_t outlen,size_t inlen,size_t keylen)172*0e33efe4SConrad Meyer static inline int blake2( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen ) 173*0e33efe4SConrad Meyer { 174*0e33efe4SConrad Meyer return blake2b( out, in, key, outlen, inlen, keylen ); 175*0e33efe4SConrad Meyer } 176*0e33efe4SConrad Meyer 177*0e33efe4SConrad Meyer #if defined(__cplusplus) 178*0e33efe4SConrad Meyer } 179*0e33efe4SConrad Meyer #endif 180*0e33efe4SConrad Meyer 181*0e33efe4SConrad Meyer #endif 182*0e33efe4SConrad Meyer 183