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