1 /* 2 * Copyright 2016-2017 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 /* 11 * Derived from the BLAKE2 reference implementation written by Samuel Neves. 12 * Copyright 2012, Samuel Neves <sneves@dei.uc.pt> 13 * More information about the BLAKE2 hash function and its implementations 14 * can be found at https://blake2.net. 15 */ 16 17 #include <stddef.h> 18 19 #define BLAKE2S_BLOCKBYTES 64 20 #define BLAKE2S_OUTBYTES 32 21 #define BLAKE2S_KEYBYTES 32 22 #define BLAKE2S_SALTBYTES 8 23 #define BLAKE2S_PERSONALBYTES 8 24 25 #define BLAKE2B_BLOCKBYTES 128 26 #define BLAKE2B_OUTBYTES 64 27 #define BLAKE2B_KEYBYTES 64 28 #define BLAKE2B_SALTBYTES 16 29 #define BLAKE2B_PERSONALBYTES 16 30 31 struct blake2s_param_st { 32 uint8_t digest_length; /* 1 */ 33 uint8_t key_length; /* 2 */ 34 uint8_t fanout; /* 3 */ 35 uint8_t depth; /* 4 */ 36 uint8_t leaf_length[4];/* 8 */ 37 uint8_t node_offset[6];/* 14 */ 38 uint8_t node_depth; /* 15 */ 39 uint8_t inner_length; /* 16 */ 40 uint8_t salt[BLAKE2S_SALTBYTES]; /* 24 */ 41 uint8_t personal[BLAKE2S_PERSONALBYTES]; /* 32 */ 42 }; 43 44 typedef struct blake2s_param_st BLAKE2S_PARAM; 45 46 struct blake2s_ctx_st { 47 uint32_t h[8]; 48 uint32_t t[2]; 49 uint32_t f[2]; 50 uint8_t buf[BLAKE2S_BLOCKBYTES]; 51 size_t buflen; 52 }; 53 54 struct blake2b_param_st { 55 uint8_t digest_length; /* 1 */ 56 uint8_t key_length; /* 2 */ 57 uint8_t fanout; /* 3 */ 58 uint8_t depth; /* 4 */ 59 uint8_t leaf_length[4];/* 8 */ 60 uint8_t node_offset[8];/* 16 */ 61 uint8_t node_depth; /* 17 */ 62 uint8_t inner_length; /* 18 */ 63 uint8_t reserved[14]; /* 32 */ 64 uint8_t salt[BLAKE2B_SALTBYTES]; /* 48 */ 65 uint8_t personal[BLAKE2B_PERSONALBYTES]; /* 64 */ 66 }; 67 68 typedef struct blake2b_param_st BLAKE2B_PARAM; 69 70 struct blake2b_ctx_st { 71 uint64_t h[8]; 72 uint64_t t[2]; 73 uint64_t f[2]; 74 uint8_t buf[BLAKE2B_BLOCKBYTES]; 75 size_t buflen; 76 }; 77 78 #define BLAKE2B_DIGEST_LENGTH 64 79 #define BLAKE2S_DIGEST_LENGTH 32 80 81 typedef struct blake2s_ctx_st BLAKE2S_CTX; 82 typedef struct blake2b_ctx_st BLAKE2B_CTX; 83 84 int BLAKE2b_Init(BLAKE2B_CTX *c); 85 int BLAKE2b_Update(BLAKE2B_CTX *c, const void *data, size_t datalen); 86 int BLAKE2b_Final(unsigned char *md, BLAKE2B_CTX *c); 87 88 int BLAKE2s_Init(BLAKE2S_CTX *c); 89 int BLAKE2s_Update(BLAKE2S_CTX *c, const void *data, size_t datalen); 90 int BLAKE2s_Final(unsigned char *md, BLAKE2S_CTX *c); 91