blake2-int.h (5481B)
1 /* 2 BLAKE2 reference source code package - reference C implementations 3 4 Written in 2012 by Samuel Neves <sneves@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 You should have received a copy of the CC0 Public Domain Dedication along with 11 this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>. 12 */ 13 /* blake2-int.h 14 * 15 * Copyright (C) 2006-2025 wolfSSL Inc. 16 * 17 * This file is part of wolfSSL. 18 * 19 * wolfSSL is free software; you can redistribute it and/or modify 20 * it under the terms of the GNU General Public License as published by 21 * the Free Software Foundation; either version 3 of the License, or 22 * (at your option) any later version. 23 * 24 * wolfSSL is distributed in the hope that it will be useful, 25 * but WITHOUT ANY WARRANTY; without even the implied warranty of 26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 27 * GNU General Public License for more details. 28 * 29 * You should have received a copy of the GNU General Public License 30 * along with this program; if not, write to the Free Software 31 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA 32 */ 33 34 35 36 37 #ifndef WOLFCRYPT_BLAKE2_INT_H 38 #define WOLFCRYPT_BLAKE2_INT_H 39 40 #include <wolfssl/wolfcrypt/types.h> 41 42 #if defined(__cplusplus) 43 extern "C" { 44 #endif 45 46 enum blake2s_constant 47 { 48 BLAKE2S_BLOCKBYTES = 64, 49 BLAKE2S_OUTBYTES = 32, 50 BLAKE2S_KEYBYTES = 32, 51 BLAKE2S_SALTBYTES = 8, 52 BLAKE2S_PERSONALBYTES = 8 53 }; 54 55 enum blake2b_constant 56 { 57 BLAKE2B_BLOCKBYTES = 128, 58 BLAKE2B_OUTBYTES = 64, 59 BLAKE2B_KEYBYTES = 64, 60 BLAKE2B_SALTBYTES = 16, 61 BLAKE2B_PERSONALBYTES = 16 62 }; 63 64 #pragma pack(push, 1) 65 typedef struct __blake2s_param 66 { 67 byte digest_length; /* 1 */ 68 byte key_length; /* 2 */ 69 byte fanout; /* 3 */ 70 byte depth; /* 4 */ 71 word32 leaf_length; /* 8 */ 72 byte node_offset[6];/* 14 */ 73 byte node_depth; /* 15 */ 74 byte inner_length; /* 16 */ 75 /* byte reserved[0]; */ 76 byte salt[BLAKE2S_SALTBYTES]; /* 24 */ 77 byte personal[BLAKE2S_PERSONALBYTES]; /* 32 */ 78 } blake2s_param; 79 80 typedef struct __blake2s_state 81 { 82 word32 h[8]; 83 word32 t[2]; 84 word32 f[2]; 85 byte buf[2 * BLAKE2S_BLOCKBYTES]; 86 word32 buflen; 87 byte last_node; 88 } blake2s_state ; 89 90 typedef struct __blake2b_param 91 { 92 byte digest_length; /* 1 */ 93 byte key_length; /* 2 */ 94 byte fanout; /* 3 */ 95 byte depth; /* 4 */ 96 word32 leaf_length; /* 8 */ 97 word64 node_offset; /* 16 */ 98 byte node_depth; /* 17 */ 99 byte inner_length; /* 18 */ 100 byte reserved[14]; /* 32 */ 101 byte salt[BLAKE2B_SALTBYTES]; /* 48 */ 102 byte personal[BLAKE2B_PERSONALBYTES]; /* 64 */ 103 } blake2b_param; 104 105 typedef struct __blake2b_state 106 { 107 word64 h[8]; 108 word64 t[2]; 109 word64 f[2]; 110 byte buf[2 * BLAKE2B_BLOCKBYTES]; 111 word64 buflen; 112 byte last_node; 113 } blake2b_state; 114 115 typedef struct __blake2sp_state 116 { 117 blake2s_state S[8][1]; 118 blake2s_state R[1]; 119 byte buf[8 * BLAKE2S_BLOCKBYTES]; 120 word32 buflen; 121 } blake2sp_state; 122 123 typedef struct __blake2bp_state 124 { 125 blake2b_state S[4][1]; 126 blake2b_state R[1]; 127 byte buf[4 * BLAKE2B_BLOCKBYTES]; 128 word64 buflen; 129 } blake2bp_state; 130 #pragma pack(pop) 131 132 /* Streaming API */ 133 int blake2s_init( blake2s_state *S, byte outlen ); 134 int blake2s_init_key( blake2s_state *S, byte outlen, const void *key, byte keylen ); 135 int blake2s_init_param( blake2s_state *S, const blake2s_param *P ); 136 int blake2s_update( blake2s_state *S, const byte *in, word32 inlen ); 137 int blake2s_final( blake2s_state *S, byte *out, byte outlen ); 138 139 int blake2b_init( blake2b_state *S, byte outlen ); 140 int blake2b_init_key( blake2b_state *S, byte outlen, const void *key, byte keylen ); 141 int blake2b_init_param( blake2b_state *S, const blake2b_param *P ); 142 int blake2b_update( blake2b_state *S, const byte *in, word64 inlen ); 143 int blake2b_final( blake2b_state *S, byte *out, byte outlen ); 144 145 int blake2sp_init( blake2sp_state *S, byte outlen ); 146 int blake2sp_init_key( blake2sp_state *S, byte outlen, const void *key, byte keylen ); 147 int blake2sp_update( blake2sp_state *S, const byte *in, word32 inlen ); 148 int blake2sp_final( blake2sp_state *S, byte *out, byte outlen ); 149 150 int blake2bp_init( blake2bp_state *S, byte outlen ); 151 int blake2bp_init_key( blake2bp_state *S, byte outlen, const void *key, byte keylen ); 152 int blake2bp_update( blake2bp_state *S, const byte *in, word64 inlen ); 153 int blake2bp_final( blake2bp_state *S, byte *out, byte outlen ); 154 155 /* Simple API */ 156 int blake2s( byte *out, const void *in, const void *key, byte outlen, word32 inlen, byte keylen ); 157 int blake2b( byte *out, const void *in, const void *key, byte outlen, word64 inlen, byte keylen ); 158 159 int blake2sp( byte *out, const void *in, const void *key, byte outlen, word32 inlen, byte keylen ); 160 int blake2bp( byte *out, const void *in, const void *key, byte outlen, word64 inlen, byte keylen ); 161 162 static WC_INLINE int blake2( byte *out, const void *in, const void *key, byte outlen, word64 inlen, byte keylen ) 163 { 164 return blake2b( out, in, key, outlen, inlen, keylen ); 165 } 166 167 168 169 #if defined(__cplusplus) 170 } 171 #endif 172 173 #endif /* WOLFCRYPT_BLAKE2_INT_H */ 174