]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/crypto/blake2/blake2-sw.c
zfs: merge openzfs/zfs@39be46f43
[FreeBSD/FreeBSD.git] / sys / crypto / blake2 / blake2-sw.c
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 };