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