sha3.c (6824B)
1 #ifdef FREEBL_NO_DEPEND 2 #include "stubs.h" 3 #endif 4 5 #include "prtypes.h" /* for PRUintXX */ 6 #include "secport.h" /* for PORT_XXX */ 7 #include "blapi.h" 8 #include "blapii.h" 9 #include "blapit.h" 10 #include "secerr.h" 11 #include "Hacl_Hash_SHA3.h" 12 13 struct SHA3ContextStr { 14 Hacl_Streaming_Keccak_state *st; 15 }; 16 17 SHA3_224Context * 18 SHA3_224_NewContext() 19 { 20 SHA3_224Context *ctx = PORT_New(SHA3_224Context); 21 ctx->st = Hacl_Streaming_Keccak_malloc(Spec_Hash_Definitions_SHA3_224); 22 return ctx; 23 } 24 25 SHA3_256Context * 26 SHA3_256_NewContext() 27 { 28 SHA3_256Context *ctx = PORT_New(SHA3_256Context); 29 ctx->st = Hacl_Streaming_Keccak_malloc(Spec_Hash_Definitions_SHA3_256); 30 return ctx; 31 } 32 33 SHA3_384Context * 34 SHA3_384_NewContext() 35 { 36 SHA3_384Context *ctx = PORT_New(SHA3_384Context); 37 ctx->st = Hacl_Streaming_Keccak_malloc(Spec_Hash_Definitions_SHA3_384); 38 return ctx; 39 } 40 41 SHA3_512Context * 42 SHA3_512_NewContext() 43 { 44 SHA3_512Context *ctx = PORT_New(SHA3_512Context); 45 ctx->st = Hacl_Streaming_Keccak_malloc(Spec_Hash_Definitions_SHA3_512); 46 return ctx; 47 } 48 49 void 50 SHA3_224_DestroyContext(SHA3_224Context *ctx, PRBool freeit) 51 { 52 Hacl_Streaming_Keccak_reset(ctx->st); 53 if (freeit) { 54 Hacl_Streaming_Keccak_free(ctx->st); 55 PORT_Free(ctx); 56 } 57 } 58 59 void 60 SHA3_256_DestroyContext(SHA3_256Context *ctx, PRBool freeit) 61 { 62 Hacl_Streaming_Keccak_reset(ctx->st); 63 if (freeit) { 64 Hacl_Streaming_Keccak_free(ctx->st); 65 PORT_Free(ctx); 66 } 67 } 68 69 void 70 SHA3_384_DestroyContext(SHA3_384Context *ctx, PRBool freeit) 71 { 72 Hacl_Streaming_Keccak_reset(ctx->st); 73 if (freeit) { 74 Hacl_Streaming_Keccak_free(ctx->st); 75 PORT_Free(ctx); 76 } 77 } 78 79 void 80 SHA3_512_DestroyContext(SHA3_512Context *ctx, PRBool freeit) 81 { 82 Hacl_Streaming_Keccak_reset(ctx->st); 83 if (freeit) { 84 Hacl_Streaming_Keccak_free(ctx->st); 85 PORT_Free(ctx); 86 } 87 } 88 89 unsigned int 90 SHA3_224_FlattenSize(SHA3_224Context *ctx) 91 { 92 return 0; 93 } 94 95 unsigned int 96 SHA3_256_FlattenSize(SHA3_256Context *ctx) 97 { 98 return 0; 99 } 100 101 unsigned int 102 SHA3_384_FlattenSize(SHA3_384Context *ctx) 103 { 104 return 0; 105 } 106 107 unsigned int 108 SHA3_512_FlattenSize(SHA3_512Context *ctx) 109 { 110 return 0; 111 } 112 113 void 114 SHA3_224_Begin(SHA3_224Context *ctx) 115 { 116 Hacl_Streaming_Keccak_reset(ctx->st); 117 } 118 119 void 120 SHA3_256_Begin(SHA3_256Context *ctx) 121 { 122 Hacl_Streaming_Keccak_reset(ctx->st); 123 } 124 125 void 126 SHA3_384_Begin(SHA3_384Context *ctx) 127 { 128 Hacl_Streaming_Keccak_reset(ctx->st); 129 } 130 131 void 132 SHA3_512_Begin(SHA3_512Context *ctx) 133 { 134 Hacl_Streaming_Keccak_reset(ctx->st); 135 } 136 137 void 138 SHA3_224_Update(SHA3_224Context *ctx, const unsigned char *input, 139 unsigned int inputLen) 140 { 141 Hacl_Streaming_Keccak_update(ctx->st, (uint8_t *)input, inputLen); 142 } 143 144 void 145 SHA3_256_Update(SHA3_256Context *ctx, const unsigned char *input, 146 unsigned int inputLen) 147 { 148 Hacl_Streaming_Keccak_update(ctx->st, (uint8_t *)input, inputLen); 149 } 150 151 void 152 SHA3_384_Update(SHA3_384Context *ctx, const unsigned char *input, 153 unsigned int inputLen) 154 { 155 Hacl_Streaming_Keccak_update(ctx->st, (uint8_t *)input, inputLen); 156 } 157 158 void 159 SHA3_512_Update(SHA3_512Context *ctx, const unsigned char *input, 160 unsigned int inputLen) 161 { 162 Hacl_Streaming_Keccak_update(ctx->st, (uint8_t *)input, inputLen); 163 } 164 165 void 166 SHA3_224_End(SHA3_224Context *ctx, unsigned char *digest, 167 unsigned int *digestLen, unsigned int maxDigestLen) 168 { 169 uint8_t sha3_digest[SHA3_224_LENGTH] = { 0 }; 170 Hacl_Streaming_Keccak_finish(ctx->st, sha3_digest); 171 172 unsigned int len = PR_MIN(SHA3_224_LENGTH, maxDigestLen); 173 memcpy(digest, sha3_digest, len); 174 if (digestLen) 175 *digestLen = len; 176 } 177 178 void 179 SHA3_256_End(SHA3_256Context *ctx, unsigned char *digest, 180 unsigned int *digestLen, unsigned int maxDigestLen) 181 { 182 uint8_t sha3_digest[SHA3_256_LENGTH] = { 0 }; 183 Hacl_Streaming_Keccak_finish(ctx->st, sha3_digest); 184 185 unsigned int len = PR_MIN(SHA3_256_LENGTH, maxDigestLen); 186 memcpy(digest, sha3_digest, len); 187 if (digestLen) 188 *digestLen = len; 189 } 190 191 void 192 SHA3_384_End(SHA3_384Context *ctx, unsigned char *digest, 193 unsigned int *digestLen, unsigned int maxDigestLen) 194 { 195 uint8_t sha3_digest[SHA3_384_LENGTH] = { 0 }; 196 Hacl_Streaming_Keccak_finish(ctx->st, sha3_digest); 197 198 unsigned int len = PR_MIN(SHA3_384_LENGTH, maxDigestLen); 199 memcpy(digest, sha3_digest, len); 200 if (digestLen) 201 *digestLen = len; 202 } 203 204 void 205 SHA3_512_End(SHA3_512Context *ctx, unsigned char *digest, 206 unsigned int *digestLen, unsigned int maxDigestLen) 207 { 208 uint8_t sha3_digest[SHA3_512_LENGTH] = { 0 }; 209 Hacl_Streaming_Keccak_finish(ctx->st, sha3_digest); 210 211 unsigned int len = PR_MIN(SHA3_512_LENGTH, maxDigestLen); 212 memcpy(digest, sha3_digest, len); 213 if (digestLen) 214 *digestLen = len; 215 } 216 217 SECStatus 218 SHA3_224_HashBuf(unsigned char *dest, const unsigned char *src, 219 PRUint32 src_length) 220 { 221 SHA3_224Context *ctx = SHA3_224_NewContext(); 222 SHA3_224_Begin(ctx); 223 SHA3_224_Update(ctx, src, src_length); 224 SHA3_224_End(ctx, dest, NULL, SHA3_224_LENGTH); 225 SHA3_224_DestroyContext(ctx, true); 226 return SECSuccess; 227 } 228 229 SECStatus 230 SHA3_256_HashBuf(unsigned char *dest, const unsigned char *src, 231 PRUint32 src_length) 232 { 233 SHA3_256Context *ctx = SHA3_256_NewContext(); 234 SHA3_256_Begin(ctx); 235 SHA3_256_Update(ctx, src, src_length); 236 SHA3_256_End(ctx, dest, NULL, SHA3_256_LENGTH); 237 SHA3_256_DestroyContext(ctx, true); 238 return SECSuccess; 239 } 240 241 SECStatus 242 SHA3_384_HashBuf(unsigned char *dest, const unsigned char *src, 243 PRUint32 src_length) 244 { 245 SHA3_384Context *ctx = SHA3_384_NewContext(); 246 SHA3_384_Begin(ctx); 247 SHA3_384_Update(ctx, src, src_length); 248 SHA3_384_End(ctx, dest, NULL, SHA3_384_LENGTH); 249 SHA3_384_DestroyContext(ctx, true); 250 return SECSuccess; 251 } 252 253 SECStatus 254 SHA3_512_HashBuf(unsigned char *dest, const unsigned char *src, 255 PRUint32 src_length) 256 { 257 SHA3_512Context *ctx = SHA3_512_NewContext(); 258 SHA3_512_Begin(ctx); 259 SHA3_512_Update(ctx, src, src_length); 260 SHA3_512_End(ctx, dest, NULL, SHA3_512_LENGTH); 261 SHA3_512_DestroyContext(ctx, true); 262 return SECSuccess; 263 } 264 265 SECStatus 266 SHA3_224_Hash(unsigned char *dest, const char *src) 267 { 268 return SHA3_224_HashBuf(dest, (const unsigned char *)src, PORT_Strlen(src)); 269 } 270 271 SECStatus 272 SHA3_256_Hash(unsigned char *dest, const char *src) 273 { 274 return SHA3_256_HashBuf(dest, (const unsigned char *)src, PORT_Strlen(src)); 275 } 276 277 SECStatus 278 SHA3_384_Hash(unsigned char *dest, const char *src) 279 { 280 return SHA3_384_HashBuf(dest, (const unsigned char *)src, PORT_Strlen(src)); 281 } 282 283 SECStatus 284 SHA3_512_Hash(unsigned char *dest, const char *src) 285 { 286 return SHA3_512_HashBuf(dest, (const unsigned char *)src, PORT_Strlen(src)); 287 }