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 7 extern int blake2b_init_ref(blake2b_state *S, size_t outlen); 8 extern int blake2b_init_param_ref(blake2b_state *S, const blake2b_param *P); 9 extern int blake2b_init_key_ref(blake2b_state *S, size_t outlen, 10 const void *key, size_t keylen); 11 extern int blake2b_update_ref(blake2b_state *S, const uint8_t *in, 12 size_t inlen); 13 extern int blake2b_final_ref(blake2b_state *S, uint8_t *out, size_t outlen); 14 extern int blake2b_ref(uint8_t *out, const void *in, const void *key, 15 size_t outlen, size_t inlen, size_t keylen); 16 17 extern int blake2s_init_ref(blake2s_state *S, size_t outlen); 18 extern int blake2s_init_param_ref(blake2s_state *S, const blake2s_param *P); 19 extern int blake2s_init_key_ref(blake2s_state *S, size_t outlen, 20 const void *key, size_t keylen); 21 extern int blake2s_update_ref(blake2s_state *S, const uint8_t *in, 22 size_t inlen); 23 extern int blake2s_final_ref(blake2s_state *S, uint8_t *out, size_t outlen); 24 extern int blake2s_ref(uint8_t *out, const void *in, const void *key, 25 size_t outlen, size_t inlen, size_t keylen); 26 27 struct blake2b_xform_ctx { 28 blake2b_state state; 29 }; 30 CTASSERT(sizeof(union authctx) >= sizeof(struct blake2b_xform_ctx)); 31 32 static void 33 blake2b_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 43 static void 44 blake2b_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 55 static int 56 blake2b_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 67 static void 68 blake2b_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 78 const 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 90 struct blake2s_xform_ctx { 91 blake2s_state state; 92 }; 93 CTASSERT(sizeof(union authctx) >= sizeof(struct blake2s_xform_ctx)); 94 95 static void 96 blake2s_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 106 static void 107 blake2s_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 118 static int 119 blake2s_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 130 static void 131 blake2s_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 141 const 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