aes_impl.c revision 1.3 1 1.3 riastrad /* $NetBSD: aes_impl.c,v 1.3 2020/06/30 16:21:17 riastradh Exp $ */
2 1.1 riastrad
3 1.1 riastrad /*-
4 1.1 riastrad * Copyright (c) 2020 The NetBSD Foundation, Inc.
5 1.1 riastrad * All rights reserved.
6 1.1 riastrad *
7 1.1 riastrad * Redistribution and use in source and binary forms, with or without
8 1.1 riastrad * modification, are permitted provided that the following conditions
9 1.1 riastrad * are met:
10 1.1 riastrad * 1. Redistributions of source code must retain the above copyright
11 1.1 riastrad * notice, this list of conditions and the following disclaimer.
12 1.1 riastrad * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 riastrad * notice, this list of conditions and the following disclaimer in the
14 1.1 riastrad * documentation and/or other materials provided with the distribution.
15 1.1 riastrad *
16 1.1 riastrad * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17 1.1 riastrad * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 1.1 riastrad * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 1.1 riastrad * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20 1.1 riastrad * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 1.1 riastrad * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 1.1 riastrad * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 1.1 riastrad * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 1.1 riastrad * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 1.1 riastrad * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 1.1 riastrad * POSSIBILITY OF SUCH DAMAGE.
27 1.1 riastrad */
28 1.1 riastrad
29 1.1 riastrad #include <sys/cdefs.h>
30 1.3 riastrad __KERNEL_RCSID(1, "$NetBSD: aes_impl.c,v 1.3 2020/06/30 16:21:17 riastradh Exp $");
31 1.1 riastrad
32 1.1 riastrad #include <sys/types.h>
33 1.1 riastrad #include <sys/kernel.h>
34 1.1 riastrad #include <sys/module.h>
35 1.1 riastrad #include <sys/once.h>
36 1.3 riastrad #include <sys/sysctl.h>
37 1.1 riastrad #include <sys/systm.h>
38 1.1 riastrad
39 1.1 riastrad #include <crypto/aes/aes.h>
40 1.1 riastrad #include <crypto/aes/aes_bear.h> /* default implementation */
41 1.1 riastrad
42 1.2 riastrad static int aes_selftest_stdkeysched(void);
43 1.2 riastrad
44 1.1 riastrad static const struct aes_impl *aes_md_impl __read_mostly;
45 1.1 riastrad static const struct aes_impl *aes_impl __read_mostly;
46 1.1 riastrad
47 1.3 riastrad static int
48 1.3 riastrad sysctl_hw_aes_impl(SYSCTLFN_ARGS)
49 1.3 riastrad {
50 1.3 riastrad struct sysctlnode node;
51 1.3 riastrad
52 1.3 riastrad KASSERTMSG(aes_impl != NULL,
53 1.3 riastrad "sysctl ran before AES implementation was selected");
54 1.3 riastrad
55 1.3 riastrad node = *rnode;
56 1.3 riastrad node.sysctl_data = __UNCONST(aes_impl->ai_name);
57 1.3 riastrad node.sysctl_size = strlen(aes_impl->ai_name) + 1;
58 1.3 riastrad return sysctl_lookup(SYSCTLFN_CALL(&node));
59 1.3 riastrad }
60 1.3 riastrad
61 1.3 riastrad SYSCTL_SETUP(sysctl_hw_aes_setup, "sysctl hw.aes_impl setup")
62 1.3 riastrad {
63 1.3 riastrad
64 1.3 riastrad sysctl_createv(clog, 0, NULL, NULL,
65 1.3 riastrad CTLFLAG_PERMANENT|CTLFLAG_READONLY, CTLTYPE_STRING, "aes_impl",
66 1.3 riastrad SYSCTL_DESCR("Selected AES implementation"),
67 1.3 riastrad sysctl_hw_aes_impl, 0, NULL, 0,
68 1.3 riastrad CTL_HW, CTL_CREATE, CTL_EOL);
69 1.3 riastrad }
70 1.3 riastrad
71 1.1 riastrad /*
72 1.1 riastrad * The timing of AES implementation selection is finicky:
73 1.1 riastrad *
74 1.1 riastrad * 1. It has to be done _after_ cpu_attach for implementations,
75 1.1 riastrad * such as AES-NI, that rely on fpu initialization done by
76 1.1 riastrad * fpu_attach.
77 1.1 riastrad *
78 1.1 riastrad * 2. It has to be done _before_ the cgd self-tests or anything
79 1.1 riastrad * else that might call AES.
80 1.1 riastrad *
81 1.1 riastrad * For the moment, doing it in module init works. However, if a
82 1.1 riastrad * driver-class module depended on the aes module, that would break.
83 1.1 riastrad */
84 1.1 riastrad
85 1.1 riastrad static int
86 1.1 riastrad aes_select(void)
87 1.1 riastrad {
88 1.1 riastrad
89 1.1 riastrad KASSERT(aes_impl == NULL);
90 1.1 riastrad
91 1.2 riastrad if (aes_selftest_stdkeysched())
92 1.2 riastrad panic("AES is busted");
93 1.2 riastrad
94 1.1 riastrad if (aes_md_impl) {
95 1.1 riastrad if (aes_selftest(aes_md_impl))
96 1.1 riastrad aprint_error("aes: self-test failed: %s\n",
97 1.1 riastrad aes_md_impl->ai_name);
98 1.1 riastrad else
99 1.1 riastrad aes_impl = aes_md_impl;
100 1.1 riastrad }
101 1.1 riastrad if (aes_impl == NULL) {
102 1.1 riastrad if (aes_selftest(&aes_bear_impl))
103 1.1 riastrad aprint_error("aes: self-test failed: %s\n",
104 1.1 riastrad aes_bear_impl.ai_name);
105 1.1 riastrad else
106 1.1 riastrad aes_impl = &aes_bear_impl;
107 1.1 riastrad }
108 1.1 riastrad if (aes_impl == NULL)
109 1.1 riastrad panic("AES self-tests failed");
110 1.1 riastrad
111 1.1 riastrad aprint_normal("aes: %s\n", aes_impl->ai_name);
112 1.1 riastrad return 0;
113 1.1 riastrad }
114 1.1 riastrad
115 1.1 riastrad MODULE(MODULE_CLASS_MISC, aes, NULL);
116 1.1 riastrad
117 1.1 riastrad static int
118 1.1 riastrad aes_modcmd(modcmd_t cmd, void *opaque)
119 1.1 riastrad {
120 1.1 riastrad
121 1.1 riastrad switch (cmd) {
122 1.1 riastrad case MODULE_CMD_INIT:
123 1.1 riastrad return aes_select();
124 1.1 riastrad case MODULE_CMD_FINI:
125 1.1 riastrad return 0;
126 1.1 riastrad default:
127 1.1 riastrad return ENOTTY;
128 1.1 riastrad }
129 1.1 riastrad }
130 1.1 riastrad
131 1.1 riastrad static void
132 1.1 riastrad aes_guarantee_selected(void)
133 1.1 riastrad {
134 1.1 riastrad #if 0
135 1.1 riastrad static once_t once;
136 1.1 riastrad int error;
137 1.1 riastrad
138 1.1 riastrad error = RUN_ONCE(&once, aes_select);
139 1.1 riastrad KASSERT(error == 0);
140 1.1 riastrad #endif
141 1.1 riastrad }
142 1.1 riastrad
143 1.1 riastrad void
144 1.1 riastrad aes_md_init(const struct aes_impl *impl)
145 1.1 riastrad {
146 1.1 riastrad
147 1.1 riastrad KASSERT(cold);
148 1.1 riastrad KASSERTMSG(aes_impl == NULL,
149 1.1 riastrad "AES implementation `%s' already chosen, can't offer `%s'",
150 1.1 riastrad aes_impl->ai_name, impl->ai_name);
151 1.1 riastrad KASSERTMSG(aes_md_impl == NULL,
152 1.1 riastrad "AES implementation `%s' already offered, can't offer `%s'",
153 1.1 riastrad aes_md_impl->ai_name, impl->ai_name);
154 1.1 riastrad
155 1.1 riastrad aes_md_impl = impl;
156 1.1 riastrad }
157 1.1 riastrad
158 1.1 riastrad static void
159 1.1 riastrad aes_setenckey(struct aesenc *enc, const uint8_t key[static 16],
160 1.1 riastrad uint32_t nrounds)
161 1.1 riastrad {
162 1.1 riastrad
163 1.1 riastrad aes_guarantee_selected();
164 1.1 riastrad aes_impl->ai_setenckey(enc, key, nrounds);
165 1.1 riastrad }
166 1.1 riastrad
167 1.1 riastrad uint32_t
168 1.1 riastrad aes_setenckey128(struct aesenc *enc, const uint8_t key[static 16])
169 1.1 riastrad {
170 1.1 riastrad uint32_t nrounds = AES_128_NROUNDS;
171 1.1 riastrad
172 1.1 riastrad aes_setenckey(enc, key, nrounds);
173 1.1 riastrad return nrounds;
174 1.1 riastrad }
175 1.1 riastrad
176 1.1 riastrad uint32_t
177 1.1 riastrad aes_setenckey192(struct aesenc *enc, const uint8_t key[static 24])
178 1.1 riastrad {
179 1.1 riastrad uint32_t nrounds = AES_192_NROUNDS;
180 1.1 riastrad
181 1.1 riastrad aes_setenckey(enc, key, nrounds);
182 1.1 riastrad return nrounds;
183 1.1 riastrad }
184 1.1 riastrad
185 1.1 riastrad uint32_t
186 1.1 riastrad aes_setenckey256(struct aesenc *enc, const uint8_t key[static 32])
187 1.1 riastrad {
188 1.1 riastrad uint32_t nrounds = AES_256_NROUNDS;
189 1.1 riastrad
190 1.1 riastrad aes_setenckey(enc, key, nrounds);
191 1.1 riastrad return nrounds;
192 1.1 riastrad }
193 1.1 riastrad
194 1.1 riastrad static void
195 1.1 riastrad aes_setdeckey(struct aesdec *dec, const uint8_t key[static 16],
196 1.1 riastrad uint32_t nrounds)
197 1.1 riastrad {
198 1.1 riastrad
199 1.1 riastrad aes_guarantee_selected();
200 1.1 riastrad aes_impl->ai_setdeckey(dec, key, nrounds);
201 1.1 riastrad }
202 1.1 riastrad
203 1.1 riastrad uint32_t
204 1.1 riastrad aes_setdeckey128(struct aesdec *dec, const uint8_t key[static 16])
205 1.1 riastrad {
206 1.1 riastrad uint32_t nrounds = AES_128_NROUNDS;
207 1.1 riastrad
208 1.1 riastrad aes_setdeckey(dec, key, nrounds);
209 1.1 riastrad return nrounds;
210 1.1 riastrad }
211 1.1 riastrad
212 1.1 riastrad uint32_t
213 1.1 riastrad aes_setdeckey192(struct aesdec *dec, const uint8_t key[static 24])
214 1.1 riastrad {
215 1.1 riastrad uint32_t nrounds = AES_192_NROUNDS;
216 1.1 riastrad
217 1.1 riastrad aes_setdeckey(dec, key, nrounds);
218 1.1 riastrad return nrounds;
219 1.1 riastrad }
220 1.1 riastrad
221 1.1 riastrad uint32_t
222 1.1 riastrad aes_setdeckey256(struct aesdec *dec, const uint8_t key[static 32])
223 1.1 riastrad {
224 1.1 riastrad uint32_t nrounds = AES_256_NROUNDS;
225 1.1 riastrad
226 1.1 riastrad aes_setdeckey(dec, key, nrounds);
227 1.1 riastrad return nrounds;
228 1.1 riastrad }
229 1.1 riastrad
230 1.1 riastrad void
231 1.1 riastrad aes_enc(const struct aesenc *enc, const uint8_t in[static 16],
232 1.1 riastrad uint8_t out[static 16], uint32_t nrounds)
233 1.1 riastrad {
234 1.1 riastrad
235 1.1 riastrad aes_guarantee_selected();
236 1.1 riastrad aes_impl->ai_enc(enc, in, out, nrounds);
237 1.1 riastrad }
238 1.1 riastrad
239 1.1 riastrad void
240 1.1 riastrad aes_dec(const struct aesdec *dec, const uint8_t in[static 16],
241 1.1 riastrad uint8_t out[static 16], uint32_t nrounds)
242 1.1 riastrad {
243 1.1 riastrad
244 1.1 riastrad aes_guarantee_selected();
245 1.1 riastrad aes_impl->ai_dec(dec, in, out, nrounds);
246 1.1 riastrad }
247 1.1 riastrad
248 1.1 riastrad void
249 1.1 riastrad aes_cbc_enc(struct aesenc *enc, const uint8_t in[static 16],
250 1.1 riastrad uint8_t out[static 16], size_t nbytes, uint8_t iv[static 16],
251 1.1 riastrad uint32_t nrounds)
252 1.1 riastrad {
253 1.1 riastrad
254 1.1 riastrad aes_guarantee_selected();
255 1.1 riastrad aes_impl->ai_cbc_enc(enc, in, out, nbytes, iv, nrounds);
256 1.1 riastrad }
257 1.1 riastrad
258 1.1 riastrad void
259 1.1 riastrad aes_cbc_dec(struct aesdec *dec, const uint8_t in[static 16],
260 1.1 riastrad uint8_t out[static 16], size_t nbytes, uint8_t iv[static 16],
261 1.1 riastrad uint32_t nrounds)
262 1.1 riastrad {
263 1.1 riastrad
264 1.1 riastrad aes_guarantee_selected();
265 1.1 riastrad aes_impl->ai_cbc_dec(dec, in, out, nbytes, iv, nrounds);
266 1.1 riastrad }
267 1.1 riastrad
268 1.1 riastrad void
269 1.1 riastrad aes_xts_enc(struct aesenc *enc, const uint8_t in[static 16],
270 1.1 riastrad uint8_t out[static 16], size_t nbytes, uint8_t tweak[static 16],
271 1.1 riastrad uint32_t nrounds)
272 1.1 riastrad {
273 1.1 riastrad
274 1.1 riastrad aes_guarantee_selected();
275 1.1 riastrad aes_impl->ai_xts_enc(enc, in, out, nbytes, tweak, nrounds);
276 1.1 riastrad }
277 1.1 riastrad
278 1.1 riastrad void
279 1.1 riastrad aes_xts_dec(struct aesdec *dec, const uint8_t in[static 16],
280 1.1 riastrad uint8_t out[static 16], size_t nbytes, uint8_t tweak[static 16],
281 1.1 riastrad uint32_t nrounds)
282 1.1 riastrad {
283 1.1 riastrad
284 1.1 riastrad aes_guarantee_selected();
285 1.1 riastrad aes_impl->ai_xts_dec(dec, in, out, nbytes, tweak, nrounds);
286 1.1 riastrad }
287 1.2 riastrad
288 1.2 riastrad /*
289 1.2 riastrad * Known-answer self-tests for the standard key schedule.
290 1.2 riastrad */
291 1.2 riastrad static int
292 1.2 riastrad aes_selftest_stdkeysched(void)
293 1.2 riastrad {
294 1.2 riastrad static const uint8_t key[32] = {
295 1.2 riastrad 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
296 1.2 riastrad 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
297 1.2 riastrad 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
298 1.2 riastrad 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
299 1.2 riastrad };
300 1.2 riastrad static const uint32_t rk128enc[] = {
301 1.2 riastrad 0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c,
302 1.2 riastrad 0xfd74aad6, 0xfa72afd2, 0xf178a6da, 0xfe76abd6,
303 1.2 riastrad 0x0bcf92b6, 0xf1bd3d64, 0x00c59bbe, 0xfeb33068,
304 1.2 riastrad 0x4e74ffb6, 0xbfc9c2d2, 0xbf0c596c, 0x41bf6904,
305 1.2 riastrad 0xbcf7f747, 0x033e3595, 0xbc326cf9, 0xfd8d05fd,
306 1.2 riastrad 0xe8a3aa3c, 0xeb9d9fa9, 0x57aff350, 0xaa22f6ad,
307 1.2 riastrad 0x7d0f395e, 0x9692a6f7, 0xc13d55a7, 0x6b1fa30a,
308 1.2 riastrad 0x1a70f914, 0x8ce25fe3, 0x4ddf0a44, 0x26c0a94e,
309 1.2 riastrad 0x35874347, 0xb9651ca4, 0xf4ba16e0, 0xd27abfae,
310 1.2 riastrad 0xd1329954, 0x685785f0, 0x9ced9310, 0x4e972cbe,
311 1.2 riastrad 0x7f1d1113, 0x174a94e3, 0x8ba707f3, 0xc5302b4d,
312 1.2 riastrad };
313 1.2 riastrad static const uint32_t rk192enc[] = {
314 1.2 riastrad 0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c,
315 1.2 riastrad 0x13121110, 0x17161514, 0xf9f24658, 0xfef4435c,
316 1.2 riastrad 0xf5fe4a54, 0xfaf04758, 0xe9e25648, 0xfef4435c,
317 1.2 riastrad 0xb349f940, 0x4dbdba1c, 0xb843f048, 0x42b3b710,
318 1.2 riastrad 0xab51e158, 0x55a5a204, 0x41b5ff7e, 0x0c084562,
319 1.2 riastrad 0xb44bb52a, 0xf6f8023a, 0x5da9e362, 0x080c4166,
320 1.2 riastrad 0x728501f5, 0x7e8d4497, 0xcac6f1bd, 0x3c3ef387,
321 1.2 riastrad 0x619710e5, 0x699b5183, 0x9e7c1534, 0xe0f151a3,
322 1.2 riastrad 0x2a37a01e, 0x16095399, 0x779e437c, 0x1e0512ff,
323 1.2 riastrad 0x880e7edd, 0x68ff2f7e, 0x42c88f60, 0x54c1dcf9,
324 1.2 riastrad 0x235f9f85, 0x3d5a8d7a, 0x5229c0c0, 0x3ad6efbe,
325 1.2 riastrad 0x781e60de, 0x2cdfbc27, 0x0f8023a2, 0x32daaed8,
326 1.2 riastrad 0x330a97a4, 0x09dc781a, 0x71c218c4, 0x5d1da4e3,
327 1.2 riastrad };
328 1.2 riastrad static const uint32_t rk256enc[] = {
329 1.2 riastrad 0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c,
330 1.2 riastrad 0x13121110, 0x17161514, 0x1b1a1918, 0x1f1e1d1c,
331 1.2 riastrad 0x9fc273a5, 0x98c476a1, 0x93ce7fa9, 0x9cc072a5,
332 1.2 riastrad 0xcda85116, 0xdabe4402, 0xc1a45d1a, 0xdeba4006,
333 1.2 riastrad 0xf0df87ae, 0x681bf10f, 0xfbd58ea6, 0x6715fc03,
334 1.2 riastrad 0x48f1e16d, 0x924fa56f, 0x53ebf875, 0x8d51b873,
335 1.2 riastrad 0x7f8256c6, 0x1799a7c9, 0xec4c296f, 0x8b59d56c,
336 1.2 riastrad 0x753ae23d, 0xe7754752, 0xb49ebf27, 0x39cf0754,
337 1.2 riastrad 0x5f90dc0b, 0x48097bc2, 0xa44552ad, 0x2f1c87c1,
338 1.2 riastrad 0x60a6f545, 0x87d3b217, 0x334d0d30, 0x0a820a64,
339 1.2 riastrad 0x1cf7cf7c, 0x54feb4be, 0xf0bbe613, 0xdfa761d2,
340 1.2 riastrad 0xfefa1af0, 0x7929a8e7, 0x4a64a5d7, 0x40e6afb3,
341 1.2 riastrad 0x71fe4125, 0x2500f59b, 0xd5bb1388, 0x0a1c725a,
342 1.2 riastrad 0x99665a4e, 0xe04ff2a9, 0xaa2b577e, 0xeacdf8cd,
343 1.2 riastrad 0xcc79fc24, 0xe97909bf, 0x3cc21a37, 0x36de686d,
344 1.2 riastrad };
345 1.2 riastrad static const uint32_t rk128dec[] = {
346 1.2 riastrad 0x7f1d1113, 0x174a94e3, 0x8ba707f3, 0xc5302b4d,
347 1.2 riastrad 0xbe29aa13, 0xf6af8f9c, 0x80f570f7, 0x03bff700,
348 1.2 riastrad 0x63a46213, 0x4886258f, 0x765aff6b, 0x834a87f7,
349 1.2 riastrad 0x74fc828d, 0x2b22479c, 0x3edcdae4, 0xf510789c,
350 1.2 riastrad 0x8d09e372, 0x5fdec511, 0x15fe9d78, 0xcbcca278,
351 1.2 riastrad 0x2710c42e, 0xd2d72663, 0x4a205869, 0xde323f00,
352 1.2 riastrad 0x04f5a2a8, 0xf5c7e24d, 0x98f77e0a, 0x94126769,
353 1.2 riastrad 0x91e3c6c7, 0xf13240e5, 0x6d309c47, 0x0ce51963,
354 1.2 riastrad 0x9902dba0, 0x60d18622, 0x9c02dca2, 0x61d58524,
355 1.2 riastrad 0xf0df568c, 0xf9d35d82, 0xfcd35a80, 0xfdd75986,
356 1.2 riastrad 0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c,
357 1.2 riastrad };
358 1.2 riastrad static const uint32_t rk192dec[] = {
359 1.2 riastrad 0x330a97a4, 0x09dc781a, 0x71c218c4, 0x5d1da4e3,
360 1.2 riastrad 0x0dbdbed6, 0x49ea09c2, 0x8073b04d, 0xb91b023e,
361 1.2 riastrad 0xc999b98f, 0x3968b273, 0x9dd8f9c7, 0x728cc685,
362 1.2 riastrad 0xc16e7df7, 0xef543f42, 0x7f317853, 0x4457b714,
363 1.2 riastrad 0x90654711, 0x3b66cf47, 0x8dce0e9b, 0xf0f10bfc,
364 1.2 riastrad 0xb6a8c1dc, 0x7d3f0567, 0x4a195ccc, 0x2e3a42b5,
365 1.2 riastrad 0xabb0dec6, 0x64231e79, 0xbe5f05a4, 0xab038856,
366 1.2 riastrad 0xda7c1bdd, 0x155c8df2, 0x1dab498a, 0xcb97c4bb,
367 1.2 riastrad 0x08f7c478, 0xd63c8d31, 0x01b75596, 0xcf93c0bf,
368 1.2 riastrad 0x10efdc60, 0xce249529, 0x15efdb62, 0xcf20962f,
369 1.2 riastrad 0xdbcb4e4b, 0xdacf4d4d, 0xc7d75257, 0xdecb4949,
370 1.2 riastrad 0x1d181f1a, 0x191c1b1e, 0xd7c74247, 0xdecb4949,
371 1.2 riastrad 0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c,
372 1.2 riastrad };
373 1.2 riastrad static const uint32_t rk256dec[] = {
374 1.2 riastrad 0xcc79fc24, 0xe97909bf, 0x3cc21a37, 0x36de686d,
375 1.2 riastrad 0xffd1f134, 0x2faacebf, 0x5fe2e9fc, 0x6e015825,
376 1.2 riastrad 0xeb48165e, 0x0a354c38, 0x46b77175, 0x84e680dc,
377 1.2 riastrad 0x8005a3c8, 0xd07b3f8b, 0x70482743, 0x31e3b1d9,
378 1.2 riastrad 0x138e70b5, 0xe17d5a66, 0x4c823d4d, 0xc251f1a9,
379 1.2 riastrad 0xa37bda74, 0x507e9c43, 0xa03318c8, 0x41ab969a,
380 1.2 riastrad 0x1597a63c, 0xf2f32ad3, 0xadff672b, 0x8ed3cce4,
381 1.2 riastrad 0xf3c45ff8, 0xf3054637, 0xf04d848b, 0xe1988e52,
382 1.2 riastrad 0x9a4069de, 0xe7648cef, 0x5f0c4df8, 0x232cabcf,
383 1.2 riastrad 0x1658d5ae, 0x00c119cf, 0x0348c2bc, 0x11d50ad9,
384 1.2 riastrad 0xbd68c615, 0x7d24e531, 0xb868c117, 0x7c20e637,
385 1.2 riastrad 0x0f85d77f, 0x1699cc61, 0x0389db73, 0x129dc865,
386 1.2 riastrad 0xc940282a, 0xc04c2324, 0xc54c2426, 0xc4482720,
387 1.2 riastrad 0x1d181f1a, 0x191c1b1e, 0x15101712, 0x11141316,
388 1.2 riastrad 0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c,
389 1.2 riastrad };
390 1.2 riastrad static const struct {
391 1.2 riastrad unsigned len;
392 1.2 riastrad unsigned nr;
393 1.2 riastrad const uint32_t *enc, *dec;
394 1.2 riastrad } C[] = {
395 1.2 riastrad { 16, AES_128_NROUNDS, rk128enc, rk128dec },
396 1.2 riastrad { 24, AES_192_NROUNDS, rk192enc, rk192dec },
397 1.2 riastrad { 32, AES_256_NROUNDS, rk256enc, rk256dec },
398 1.2 riastrad };
399 1.2 riastrad uint32_t rk[60];
400 1.2 riastrad unsigned i;
401 1.2 riastrad
402 1.2 riastrad for (i = 0; i < __arraycount(C); i++) {
403 1.2 riastrad if (br_aes_ct_keysched_stdenc(rk, key, C[i].len) != C[i].nr)
404 1.2 riastrad return -1;
405 1.2 riastrad if (memcmp(rk, C[i].enc, 4*(C[i].nr + 1)))
406 1.2 riastrad return -1;
407 1.2 riastrad if (br_aes_ct_keysched_stddec(rk, key, C[i].len) != C[i].nr)
408 1.2 riastrad return -1;
409 1.2 riastrad if (memcmp(rk, C[i].dec, 4*(C[i].nr + 1)))
410 1.2 riastrad return -1;
411 1.2 riastrad }
412 1.2 riastrad
413 1.2 riastrad return 0;
414 1.2 riastrad }
415