1/* This file is in the public domain. */ 2 3#include <sys/cdefs.h> 4#include <contrib/libb2/blake2.h> 5#include <opencrypto/xform_auth.h> 6 7extern int blake2b_init_ref(blake2b_state *S, size_t outlen); 8extern int blake2b_init_param_ref(blake2b_state *S, const blake2b_param *P); 9extern int blake2b_init_key_ref(blake2b_state *S, size_t outlen, 10 const void *key, size_t keylen); 11extern int blake2b_update_ref(blake2b_state *S, const uint8_t *in, 12 size_t inlen); 13extern int blake2b_final_ref(blake2b_state *S, uint8_t *out, size_t outlen); 14extern int blake2b_ref(uint8_t *out, const void *in, const void *key, 15 size_t outlen, size_t inlen, size_t keylen); 16 17extern int blake2s_init_ref(blake2s_state *S, size_t outlen); 18extern int blake2s_init_param_ref(blake2s_state *S, const blake2s_param *P); 19extern int blake2s_init_key_ref(blake2s_state *S, size_t outlen, 20 const void *key, size_t keylen); 21extern int blake2s_update_ref(blake2s_state *S, const uint8_t *in, 22 size_t inlen); 23extern int blake2s_final_ref(blake2s_state *S, uint8_t *out, size_t outlen); 24extern int blake2s_ref(uint8_t *out, const void *in, const void *key, 25 size_t outlen, size_t inlen, size_t keylen); 26 27struct blake2b_xform_ctx { 28 blake2b_state state; 29}; 30CTASSERT(sizeof(union authctx) >= sizeof(struct blake2b_xform_ctx)); 31 32static void 33blake2b_xform_init(void *vctx) 34{ 35 struct blake2b_xform_ctx *ctx = vctx; 36 int rc; 37 38 rc = blake2b_init_ref(&ctx->state, BLAKE2B_OUTBYTES); 39 if (rc != 0) 40 panic("blake2b_init: invalid arguments"); 41} 42 43static void 44blake2b_xform_setkey(void *vctx, const uint8_t *key, u_int klen) 45{ 46 struct blake2b_xform_ctx *ctx = vctx; 47 int rc; 48 49 rc = blake2b_init_key_ref(&ctx->state, BLAKE2B_OUTBYTES, key, 50 klen); 51 if (rc != 0) 52 panic("blake2b_init_key: invalid arguments"); 53} 54 55static int 56blake2b_xform_update(void *vctx, const void *data, u_int len) 57{ 58 struct blake2b_xform_ctx *ctx = vctx; 59 int rc; 60 61 rc = blake2b_update_ref(&ctx->state, data, len); 62 if (rc != 0) 63 return (EINVAL); 64 return (0); 65} 66 67static void 68blake2b_xform_final(uint8_t *out, void *vctx) 69{ 70 struct blake2b_xform_ctx *ctx = vctx; 71 int rc; 72 73 rc = blake2b_final_ref(&ctx->state, out, BLAKE2B_OUTBYTES); 74 if (rc != 0) 75 panic("blake2b_final: invalid"); 76} 77 78const struct auth_hash auth_hash_blake2b = { 79 .type = CRYPTO_BLAKE2B, 80 .name = "Blake2b", 81 .keysize = BLAKE2B_KEYBYTES, 82 .hashsize = BLAKE2B_OUTBYTES, 83 .ctxsize = sizeof(struct blake2b_xform_ctx), 84 .Setkey = blake2b_xform_setkey, 85 .Init = blake2b_xform_init, 86 .Update = blake2b_xform_update, 87 .Final = blake2b_xform_final, 88}; 89 90struct blake2s_xform_ctx { 91 blake2s_state state; 92}; 93CTASSERT(sizeof(union authctx) >= sizeof(struct blake2s_xform_ctx)); 94 95static void 96blake2s_xform_init(void *vctx) 97{ 98 struct blake2s_xform_ctx *ctx = vctx; 99 int rc; 100 101 rc = blake2s_init_ref(&ctx->state, BLAKE2S_OUTBYTES); 102 if (rc != 0) 103 panic("blake2s_init: invalid arguments"); 104} 105 106static void 107blake2s_xform_setkey(void *vctx, const uint8_t *key, u_int klen) 108{ 109 struct blake2s_xform_ctx *ctx = vctx; 110 int rc; 111 112 rc = blake2s_init_key_ref(&ctx->state, BLAKE2S_OUTBYTES, key, 113 klen); 114 if (rc != 0) 115 panic("blake2s_init_key: invalid arguments"); 116} 117 118static int 119blake2s_xform_update(void *vctx, const void *data, u_int len) 120{ 121 struct blake2s_xform_ctx *ctx = vctx; 122 int rc; 123 124 rc = blake2s_update_ref(&ctx->state, data, len); 125 if (rc != 0) 126 return (EINVAL); 127 return (0); 128} 129 130static void 131blake2s_xform_final(uint8_t *out, void *vctx) 132{ 133 struct blake2s_xform_ctx *ctx = vctx; 134 int rc; 135 136 rc = blake2s_final_ref(&ctx->state, out, BLAKE2S_OUTBYTES); 137 if (rc != 0) 138 panic("blake2s_final: invalid"); 139} 140 141const struct auth_hash auth_hash_blake2s = { 142 .type = CRYPTO_BLAKE2S, 143 .name = "Blake2s", 144 .keysize = BLAKE2S_KEYBYTES, 145 .hashsize = BLAKE2S_OUTBYTES, 146 .ctxsize = sizeof(struct blake2s_xform_ctx), 147 .Setkey = blake2s_xform_setkey, 148 .Init = blake2s_xform_init, 149 .Update = blake2s_xform_update, 150 .Final = blake2s_xform_final, 151}; 152