17db96d56Sopenharmony_ci/*
27db96d56Sopenharmony_ci   BLAKE2 reference source code package - optimized C implementations
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci   Written in 2012 by Samuel Neves <sneves@dei.uc.pt>
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_ci   To the extent possible under law, the author(s) have dedicated all copyright
77db96d56Sopenharmony_ci   and related and neighboring rights to this software to the public domain
87db96d56Sopenharmony_ci   worldwide. This software is distributed without any warranty.
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci   You should have received a copy of the CC0 Public Domain Dedication along with
117db96d56Sopenharmony_ci   this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
127db96d56Sopenharmony_ci*/
137db96d56Sopenharmony_ci#pragma once
147db96d56Sopenharmony_ci#ifndef __BLAKE2_H__
157db96d56Sopenharmony_ci#define __BLAKE2_H__
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ci#include <stddef.h>
187db96d56Sopenharmony_ci#include <stdint.h>
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ci#if defined(_WIN32) || defined(__CYGWIN__)
217db96d56Sopenharmony_ci    #define BLAKE2_DLL_IMPORT __declspec(dllimport)
227db96d56Sopenharmony_ci    #define BLAKE2_DLL_EXPORT __declspec(dllexport)
237db96d56Sopenharmony_ci    #define BLAKE2_DLL_PRIVATE
247db96d56Sopenharmony_ci#elif __GNUC__ >= 4
257db96d56Sopenharmony_ci  #define BLAKE2_DLL_IMPORT   __attribute__ ((visibility ("default")))
267db96d56Sopenharmony_ci  #define BLAKE2_DLL_EXPORT   __attribute__ ((visibility ("default")))
277db96d56Sopenharmony_ci  #define BLAKE2_DLL_PRIVATE  __attribute__ ((visibility ("hidden")))
287db96d56Sopenharmony_ci#else
297db96d56Sopenharmony_ci  #define BLAKE2_DLL_IMPORT
307db96d56Sopenharmony_ci  #define BLAKE2_DLL_EXPORT
317db96d56Sopenharmony_ci  #define BLAKE2_DLL_PRIVATE
327db96d56Sopenharmony_ci#endif
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_ci#if defined(BLAKE2_DLL)
357db96d56Sopenharmony_ci  #if defined(BLAKE2_DLL_EXPORTS) // defined if we are building the DLL
367db96d56Sopenharmony_ci    #define BLAKE2_API BLAKE2_DLL_EXPORT
377db96d56Sopenharmony_ci  #else
387db96d56Sopenharmony_ci    #define BLAKE2_API BLAKE2_DLL_IMPORT
397db96d56Sopenharmony_ci  #endif
407db96d56Sopenharmony_ci  #define BLAKE2_PRIVATE BLAKE2_DLL_PRIVATE // must only be used by hidden logic
417db96d56Sopenharmony_ci#else
427db96d56Sopenharmony_ci  #define BLAKE2_API
437db96d56Sopenharmony_ci  #define BLAKE2_PRIVATE
447db96d56Sopenharmony_ci#endif
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_ci#if defined(__cplusplus)
477db96d56Sopenharmony_ciextern "C" {
487db96d56Sopenharmony_ci#elif defined(_MSC_VER) && !defined(inline)
497db96d56Sopenharmony_ci#define inline __inline
507db96d56Sopenharmony_ci#endif
517db96d56Sopenharmony_ci
527db96d56Sopenharmony_ci  enum blake2s_constant
537db96d56Sopenharmony_ci  {
547db96d56Sopenharmony_ci    BLAKE2S_BLOCKBYTES = 64,
557db96d56Sopenharmony_ci    BLAKE2S_OUTBYTES   = 32,
567db96d56Sopenharmony_ci    BLAKE2S_KEYBYTES   = 32,
577db96d56Sopenharmony_ci    BLAKE2S_SALTBYTES  = 8,
587db96d56Sopenharmony_ci    BLAKE2S_PERSONALBYTES = 8
597db96d56Sopenharmony_ci  };
607db96d56Sopenharmony_ci
617db96d56Sopenharmony_ci  enum blake2b_constant
627db96d56Sopenharmony_ci  {
637db96d56Sopenharmony_ci    BLAKE2B_BLOCKBYTES = 128,
647db96d56Sopenharmony_ci    BLAKE2B_OUTBYTES   = 64,
657db96d56Sopenharmony_ci    BLAKE2B_KEYBYTES   = 64,
667db96d56Sopenharmony_ci    BLAKE2B_SALTBYTES  = 16,
677db96d56Sopenharmony_ci    BLAKE2B_PERSONALBYTES = 16
687db96d56Sopenharmony_ci  };
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_ci#pragma pack(push, 1)
717db96d56Sopenharmony_ci  typedef struct __blake2s_param
727db96d56Sopenharmony_ci  {
737db96d56Sopenharmony_ci    uint8_t  digest_length; // 1
747db96d56Sopenharmony_ci    uint8_t  key_length;    // 2
757db96d56Sopenharmony_ci    uint8_t  fanout;        // 3
767db96d56Sopenharmony_ci    uint8_t  depth;         // 4
777db96d56Sopenharmony_ci    uint32_t leaf_length;   // 8
787db96d56Sopenharmony_ci    uint8_t  node_offset[6];// 14
797db96d56Sopenharmony_ci    uint8_t  node_depth;    // 15
807db96d56Sopenharmony_ci    uint8_t  inner_length;  // 16
817db96d56Sopenharmony_ci    // uint8_t  reserved[0];
827db96d56Sopenharmony_ci    uint8_t  salt[BLAKE2S_SALTBYTES]; // 24
837db96d56Sopenharmony_ci    uint8_t  personal[BLAKE2S_PERSONALBYTES];  // 32
847db96d56Sopenharmony_ci  } blake2s_param;
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci  typedef struct __blake2s_state
877db96d56Sopenharmony_ci  {
887db96d56Sopenharmony_ci    uint32_t h[8];
897db96d56Sopenharmony_ci    uint32_t t[2];
907db96d56Sopenharmony_ci    uint32_t f[2];
917db96d56Sopenharmony_ci    uint8_t  buf[2 * BLAKE2S_BLOCKBYTES];
927db96d56Sopenharmony_ci    uint32_t buflen;
937db96d56Sopenharmony_ci    uint8_t  outlen;
947db96d56Sopenharmony_ci    uint8_t  last_node;
957db96d56Sopenharmony_ci  } blake2s_state;
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ci  typedef struct __blake2b_param
987db96d56Sopenharmony_ci  {
997db96d56Sopenharmony_ci    uint8_t  digest_length; // 1
1007db96d56Sopenharmony_ci    uint8_t  key_length;    // 2
1017db96d56Sopenharmony_ci    uint8_t  fanout;        // 3
1027db96d56Sopenharmony_ci    uint8_t  depth;         // 4
1037db96d56Sopenharmony_ci    uint32_t leaf_length;   // 8
1047db96d56Sopenharmony_ci    uint64_t node_offset;   // 16
1057db96d56Sopenharmony_ci    uint8_t  node_depth;    // 17
1067db96d56Sopenharmony_ci    uint8_t  inner_length;  // 18
1077db96d56Sopenharmony_ci    uint8_t  reserved[14];  // 32
1087db96d56Sopenharmony_ci    uint8_t  salt[BLAKE2B_SALTBYTES]; // 48
1097db96d56Sopenharmony_ci    uint8_t  personal[BLAKE2B_PERSONALBYTES];  // 64
1107db96d56Sopenharmony_ci  } blake2b_param;
1117db96d56Sopenharmony_ci
1127db96d56Sopenharmony_ci  typedef struct __blake2b_state
1137db96d56Sopenharmony_ci  {
1147db96d56Sopenharmony_ci    uint64_t h[8];
1157db96d56Sopenharmony_ci    uint64_t t[2];
1167db96d56Sopenharmony_ci    uint64_t f[2];
1177db96d56Sopenharmony_ci    uint8_t  buf[2 * BLAKE2B_BLOCKBYTES];
1187db96d56Sopenharmony_ci    uint32_t buflen;
1197db96d56Sopenharmony_ci    uint8_t  outlen;
1207db96d56Sopenharmony_ci    uint8_t  last_node;
1217db96d56Sopenharmony_ci  } blake2b_state;
1227db96d56Sopenharmony_ci
1237db96d56Sopenharmony_ci  typedef struct __blake2sp_state
1247db96d56Sopenharmony_ci  {
1257db96d56Sopenharmony_ci    blake2s_state S[8][1];
1267db96d56Sopenharmony_ci    blake2s_state R[1];
1277db96d56Sopenharmony_ci    uint8_t  buf[8 * BLAKE2S_BLOCKBYTES];
1287db96d56Sopenharmony_ci    uint32_t buflen;
1297db96d56Sopenharmony_ci    uint8_t  outlen;
1307db96d56Sopenharmony_ci  } blake2sp_state;
1317db96d56Sopenharmony_ci
1327db96d56Sopenharmony_ci  typedef struct __blake2bp_state
1337db96d56Sopenharmony_ci  {
1347db96d56Sopenharmony_ci    blake2b_state S[4][1];
1357db96d56Sopenharmony_ci    blake2b_state R[1];
1367db96d56Sopenharmony_ci    uint8_t  buf[4 * BLAKE2B_BLOCKBYTES];
1377db96d56Sopenharmony_ci    uint32_t buflen;
1387db96d56Sopenharmony_ci    uint8_t  outlen;
1397db96d56Sopenharmony_ci  } blake2bp_state;
1407db96d56Sopenharmony_ci#pragma pack(pop)
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ci  // Streaming API
1437db96d56Sopenharmony_ci  BLAKE2_API int blake2s_init( blake2s_state *S, size_t outlen );
1447db96d56Sopenharmony_ci  BLAKE2_API int blake2s_init_key( blake2s_state *S, size_t outlen, const void *key, size_t keylen );
1457db96d56Sopenharmony_ci  BLAKE2_API int blake2s_init_param( blake2s_state *S, const blake2s_param *P );
1467db96d56Sopenharmony_ci  BLAKE2_API int blake2s_update( blake2s_state *S, const uint8_t *in, size_t inlen );
1477db96d56Sopenharmony_ci  BLAKE2_API int blake2s_final( blake2s_state *S, uint8_t *out, size_t outlen );
1487db96d56Sopenharmony_ci
1497db96d56Sopenharmony_ci  BLAKE2_API int blake2b_init( blake2b_state *S, size_t outlen );
1507db96d56Sopenharmony_ci  BLAKE2_API int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen );
1517db96d56Sopenharmony_ci  BLAKE2_API int blake2b_init_param( blake2b_state *S, const blake2b_param *P );
1527db96d56Sopenharmony_ci  BLAKE2_API int blake2b_update( blake2b_state *S, const uint8_t *in, size_t inlen );
1537db96d56Sopenharmony_ci  BLAKE2_API int blake2b_final( blake2b_state *S, uint8_t *out, size_t outlen );
1547db96d56Sopenharmony_ci
1557db96d56Sopenharmony_ci  BLAKE2_API int blake2sp_init( blake2sp_state *S, size_t outlen );
1567db96d56Sopenharmony_ci  BLAKE2_API int blake2sp_init_key( blake2sp_state *S, size_t outlen, const void *key, size_t keylen );
1577db96d56Sopenharmony_ci  BLAKE2_API int blake2sp_update( blake2sp_state *S, const uint8_t *in, size_t inlen );
1587db96d56Sopenharmony_ci  BLAKE2_API int blake2sp_final( blake2sp_state *S, uint8_t *out, size_t outlen );
1597db96d56Sopenharmony_ci
1607db96d56Sopenharmony_ci  BLAKE2_API int blake2bp_init( blake2bp_state *S, size_t outlen );
1617db96d56Sopenharmony_ci  BLAKE2_API int blake2bp_init_key( blake2bp_state *S, size_t outlen, const void *key, size_t keylen );
1627db96d56Sopenharmony_ci  BLAKE2_API int blake2bp_update( blake2bp_state *S, const uint8_t *in, size_t inlen );
1637db96d56Sopenharmony_ci  BLAKE2_API int blake2bp_final( blake2bp_state *S, uint8_t *out, size_t outlen );
1647db96d56Sopenharmony_ci
1657db96d56Sopenharmony_ci  // Simple API
1667db96d56Sopenharmony_ci  BLAKE2_API int blake2s( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen );
1677db96d56Sopenharmony_ci  BLAKE2_API int blake2b( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen );
1687db96d56Sopenharmony_ci
1697db96d56Sopenharmony_ci  BLAKE2_API int blake2sp( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen );
1707db96d56Sopenharmony_ci  BLAKE2_API int blake2bp( uint8_t *out, const void *in, const void *key, size_t outlen, size_t inlen, size_t keylen );
1717db96d56Sopenharmony_ci
1727db96d56Sopenharmony_ci#if defined(__cplusplus)
1737db96d56Sopenharmony_ci}
1747db96d56Sopenharmony_ci#endif
1757db96d56Sopenharmony_ci
1767db96d56Sopenharmony_ci#endif
1777db96d56Sopenharmony_ci
178