adiantum.c revision 1.1 1 1.1 riastrad /* $NetBSD: adiantum.c,v 1.1 2020/06/29 23:44:01 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 /*
30 1.1 riastrad * The Adiantum wide-block cipher, from
31 1.1 riastrad *
32 1.1 riastrad * Paul Crowley and Eric Biggers, `Adiantum: length-preserving
33 1.1 riastrad * encryption for entry-level processors', IACR Transactions on
34 1.1 riastrad * Symmetric Cryptology 2018(4), pp. 39--61.
35 1.1 riastrad *
36 1.1 riastrad * https://doi.org/10.13154/tosc.v2018.i4.39-61
37 1.1 riastrad */
38 1.1 riastrad
39 1.1 riastrad #include <sys/cdefs.h>
40 1.1 riastrad __KERNEL_RCSID(1, "$NetBSD: adiantum.c,v 1.1 2020/06/29 23:44:01 riastradh Exp $");
41 1.1 riastrad
42 1.1 riastrad #include <sys/types.h>
43 1.1 riastrad #include <sys/endian.h>
44 1.1 riastrad
45 1.1 riastrad #ifdef _KERNEL
46 1.1 riastrad
47 1.1 riastrad #include <sys/module.h>
48 1.1 riastrad #include <sys/systm.h>
49 1.1 riastrad
50 1.1 riastrad #include <lib/libkern/libkern.h>
51 1.1 riastrad
52 1.1 riastrad #include <crypto/adiantum/adiantum.h>
53 1.1 riastrad #include <crypto/aes/aes.h>
54 1.1 riastrad
55 1.1 riastrad #else /* !defined(_KERNEL) */
56 1.1 riastrad
57 1.1 riastrad #include <sys/cdefs.h>
58 1.1 riastrad
59 1.1 riastrad #include <assert.h>
60 1.1 riastrad #include <stdint.h>
61 1.1 riastrad #include <stdio.h>
62 1.1 riastrad #include <string.h>
63 1.1 riastrad
64 1.1 riastrad #include <openssl/aes.h>
65 1.1 riastrad
66 1.1 riastrad struct aesenc {
67 1.1 riastrad AES_KEY enckey;
68 1.1 riastrad };
69 1.1 riastrad
70 1.1 riastrad struct aesdec {
71 1.1 riastrad AES_KEY deckey;
72 1.1 riastrad };
73 1.1 riastrad
74 1.1 riastrad #define AES_256_NROUNDS 14
75 1.1 riastrad #define aes_setenckey256(E, K) AES_set_encrypt_key((K), 256, &(E)->enckey)
76 1.1 riastrad #define aes_setdeckey256(D, K) AES_set_decrypt_key((K), 256, &(D)->deckey)
77 1.1 riastrad #define aes_enc(E, P, C, NR) AES_encrypt(P, C, &(E)->enckey)
78 1.1 riastrad #define aes_dec(D, C, P, NR) AES_decrypt(C, P, &(D)->deckey)
79 1.1 riastrad
80 1.1 riastrad #include "adiantum.h"
81 1.1 riastrad
82 1.1 riastrad #define CTASSERT __CTASSERT
83 1.1 riastrad #define KASSERT assert
84 1.1 riastrad #define MIN(x,y) ((x) < (y) ? (x) : (y))
85 1.1 riastrad
86 1.1 riastrad static void
87 1.1 riastrad hexdump(int (*prf)(const char *, ...) __printflike(1,2), const char *prefix,
88 1.1 riastrad const void *buf, size_t len)
89 1.1 riastrad {
90 1.1 riastrad const uint8_t *p = buf;
91 1.1 riastrad size_t i;
92 1.1 riastrad
93 1.1 riastrad (*prf)("%s (%zu bytes)\n", prefix, len);
94 1.1 riastrad for (i = 0; i < len; i++) {
95 1.1 riastrad if (i % 16 == 8)
96 1.1 riastrad (*prf)(" ");
97 1.1 riastrad else
98 1.1 riastrad (*prf)(" ");
99 1.1 riastrad (*prf)("%02hhx", p[i]);
100 1.1 riastrad if ((i + 1) % 16 == 0)
101 1.1 riastrad (*prf)("\n");
102 1.1 riastrad }
103 1.1 riastrad if (i % 16)
104 1.1 riastrad (*prf)("\n");
105 1.1 riastrad }
106 1.1 riastrad
107 1.1 riastrad #endif /* _KERNEL */
108 1.1 riastrad
109 1.1 riastrad /* Arithmetic modulo 2^128, represented by 16-digit strings in radix 2^8. */
111 1.1 riastrad
112 1.1 riastrad /* s := a + b (mod 2^128) */
113 1.1 riastrad static inline void
114 1.1 riastrad add128(uint8_t s[restrict static 16],
115 1.1 riastrad const uint8_t a[static 16], const uint8_t b[static 16])
116 1.1 riastrad {
117 1.1 riastrad unsigned i, c;
118 1.1 riastrad
119 1.1 riastrad c = 0;
120 1.1 riastrad for (i = 0; i < 16; i++) {
121 1.1 riastrad c = a[i] + b[i] + c;
122 1.1 riastrad s[i] = c & 0xff;
123 1.1 riastrad c >>= 8;
124 1.1 riastrad }
125 1.1 riastrad }
126 1.1 riastrad
127 1.1 riastrad /* s := a - b (mod 2^128) */
128 1.1 riastrad static inline void
129 1.1 riastrad sub128(uint8_t d[restrict static 16],
130 1.1 riastrad const uint8_t a[static 16], const uint8_t b[static 16])
131 1.1 riastrad {
132 1.1 riastrad unsigned i, c;
133 1.1 riastrad
134 1.1 riastrad c = 0;
135 1.1 riastrad for (i = 0; i < 16; i++) {
136 1.1 riastrad c = a[i] - b[i] - c;
137 1.1 riastrad d[i] = c & 0xff;
138 1.1 riastrad c = 1 & (c >> 8);
139 1.1 riastrad }
140 1.1 riastrad }
141 1.1 riastrad
142 1.1 riastrad static int
143 1.1 riastrad addsub128_selftest(void)
144 1.1 riastrad {
145 1.1 riastrad static const uint8_t zero[16] = {
146 1.1 riastrad 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
147 1.1 riastrad 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
148 1.1 riastrad };
149 1.1 riastrad static const uint8_t one[16] = {
150 1.1 riastrad 0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
151 1.1 riastrad 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
152 1.1 riastrad };
153 1.1 riastrad static const uint8_t negativeone[16] = {
154 1.1 riastrad 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,
155 1.1 riastrad 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,
156 1.1 riastrad };
157 1.1 riastrad static const uint8_t a[16] = {
158 1.1 riastrad 0x03,0x80,0x00,0x00, 0x00,0x00,0x00,0x00,
159 1.1 riastrad 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
160 1.1 riastrad };
161 1.1 riastrad static const uint8_t b[16] = {
162 1.1 riastrad 0x01,0x82,0x00,0x00, 0x00,0x00,0x00,0x00,
163 1.1 riastrad 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
164 1.1 riastrad };
165 1.1 riastrad static const uint8_t c[16] = {
166 1.1 riastrad 0x02,0xfe,0xff,0xff, 0xff,0xff,0xff,0xff,
167 1.1 riastrad 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,
168 1.1 riastrad };
169 1.1 riastrad uint8_t r[16];
170 1.1 riastrad int result = 0;
171 1.1 riastrad
172 1.1 riastrad sub128(r, zero, one);
173 1.1 riastrad if (memcmp(r, negativeone, 16)) {
174 1.1 riastrad hexdump(printf, "sub128 1", r, sizeof r);
175 1.1 riastrad result = -1;
176 1.1 riastrad }
177 1.1 riastrad
178 1.1 riastrad sub128(r, a, b);
179 1.1 riastrad if (memcmp(r, c, 16)) {
180 1.1 riastrad hexdump(printf, "sub128 2", r, sizeof r);
181 1.1 riastrad result = -1;
182 1.1 riastrad }
183 1.1 riastrad
184 1.1 riastrad return result;
185 1.1 riastrad }
186 1.1 riastrad
187 1.1 riastrad /* Poly1305 */
189 1.1 riastrad
190 1.1 riastrad struct poly1305 {
191 1.1 riastrad uint32_t r[5]; /* evaluation point */
192 1.1 riastrad uint32_t h[5]; /* value */
193 1.1 riastrad };
194 1.1 riastrad
195 1.1 riastrad static void
196 1.1 riastrad poly1305_init(struct poly1305 *P, const uint8_t key[static 16])
197 1.1 riastrad {
198 1.1 riastrad
199 1.1 riastrad /* clamp */
200 1.1 riastrad P->r[0] = (le32dec(key + 0) >> 0) & 0x03ffffff;
201 1.1 riastrad P->r[1] = (le32dec(key + 3) >> 2) & 0x03ffff03;
202 1.1 riastrad P->r[2] = (le32dec(key + 6) >> 4) & 0x03ffc0ff;
203 1.1 riastrad P->r[3] = (le32dec(key + 9) >> 6) & 0x03f03fff;
204 1.1 riastrad P->r[4] = (le32dec(key + 12) >> 8) & 0x000fffff;
205 1.1 riastrad
206 1.1 riastrad /* initialize polynomial evaluation */
207 1.1 riastrad P->h[0] = P->h[1] = P->h[2] = P->h[3] = P->h[4] = 0;
208 1.1 riastrad }
209 1.1 riastrad
210 1.1 riastrad static void
211 1.1 riastrad poly1305_update_internal(struct poly1305 *P, const uint8_t m[static 16],
212 1.1 riastrad uint32_t pad)
213 1.1 riastrad {
214 1.1 riastrad uint32_t r0 = P->r[0];
215 1.1 riastrad uint32_t r1 = P->r[1];
216 1.1 riastrad uint32_t r2 = P->r[2];
217 1.1 riastrad uint32_t r3 = P->r[3];
218 1.1 riastrad uint32_t r4 = P->r[4];
219 1.1 riastrad uint32_t h0 = P->h[0];
220 1.1 riastrad uint32_t h1 = P->h[1];
221 1.1 riastrad uint32_t h2 = P->h[2];
222 1.1 riastrad uint32_t h3 = P->h[3];
223 1.1 riastrad uint32_t h4 = P->h[4];
224 1.1 riastrad uint64_t k0, k1, k2, k3, k4; /* 64-bit extension of h */
225 1.1 riastrad uint64_t p0, p1, p2, p3, p4; /* columns of product */
226 1.1 riastrad uint32_t c; /* carry */
227 1.1 riastrad
228 1.1 riastrad /* h' := h + m */
229 1.1 riastrad h0 += (le32dec(m + 0) >> 0) & 0x03ffffff;
230 1.1 riastrad h1 += (le32dec(m + 3) >> 2) & 0x03ffffff;
231 1.1 riastrad h2 += (le32dec(m + 6) >> 4) & 0x03ffffff;
232 1.1 riastrad h3 += (le32dec(m + 9) >> 6);
233 1.1 riastrad h4 += (le32dec(m + 12) >> 8) | (pad << 24);
234 1.1 riastrad
235 1.1 riastrad /* extend to 64 bits */
236 1.1 riastrad k0 = h0;
237 1.1 riastrad k1 = h1;
238 1.1 riastrad k2 = h2;
239 1.1 riastrad k3 = h3;
240 1.1 riastrad k4 = h4;
241 1.1 riastrad
242 1.1 riastrad /* p := h' * r = (h + m)*r mod 2^130 - 5 */
243 1.1 riastrad p0 = r0*k0 + 5*r4*k1 + 5*r3*k2 + 5*r2*k3 + 5*r1*k4;
244 1.1 riastrad p1 = r1*k0 + r0*k1 + 5*r4*k2 + 5*r3*k3 + 5*r2*k4;
245 1.1 riastrad p2 = r2*k0 + r1*k1 + r0*k2 + 5*r4*k3 + 5*r3*k4;
246 1.1 riastrad p3 = r3*k0 + r2*k1 + r1*k2 + r0*k3 + 5*r4*k4;
247 1.1 riastrad p4 = r4*k0 + r3*k1 + r2*k2 + r1*k3 + r0*k4;
248 1.1 riastrad
249 1.1 riastrad /* propagate carries */
250 1.1 riastrad p0 += 0; c = p0 >> 26; h0 = p0 & 0x03ffffff;
251 1.1 riastrad p1 += c; c = p1 >> 26; h1 = p1 & 0x03ffffff;
252 1.1 riastrad p2 += c; c = p2 >> 26; h2 = p2 & 0x03ffffff;
253 1.1 riastrad p3 += c; c = p3 >> 26; h3 = p3 & 0x03ffffff;
254 1.1 riastrad p4 += c; c = p4 >> 26; h4 = p4 & 0x03ffffff;
255 1.1 riastrad
256 1.1 riastrad /* reduce 2^130 = 5 */
257 1.1 riastrad h0 += c*5; c = h0 >> 26; h0 &= 0x03ffffff;
258 1.1 riastrad h1 += c;
259 1.1 riastrad
260 1.1 riastrad /* update hash values */
261 1.1 riastrad P->h[0] = h0;
262 1.1 riastrad P->h[1] = h1;
263 1.1 riastrad P->h[2] = h2;
264 1.1 riastrad P->h[3] = h3;
265 1.1 riastrad P->h[4] = h4;
266 1.1 riastrad }
267 1.1 riastrad
268 1.1 riastrad static void
270 1.1 riastrad poly1305_update_block(struct poly1305 *P, const uint8_t m[static 16])
271 1.1 riastrad {
272 1.1 riastrad
273 1.1 riastrad poly1305_update_internal(P, m, 1);
274 1.1 riastrad }
275 1.1 riastrad
276 1.1 riastrad static void
277 1.1 riastrad poly1305_update_last(struct poly1305 *P, const uint8_t *m, size_t mlen)
278 1.1 riastrad {
279 1.1 riastrad uint8_t buf[16];
280 1.1 riastrad unsigned i;
281 1.1 riastrad
282 1.1 riastrad if (mlen == 16) {
283 1.1 riastrad poly1305_update_internal(P, m, 1);
284 1.1 riastrad return;
285 1.1 riastrad }
286 1.1 riastrad
287 1.1 riastrad for (i = 0; i < mlen; i++)
288 1.1 riastrad buf[i] = m[i];
289 1.1 riastrad buf[i++] = 1;
290 1.1 riastrad for (; i < 16; i++)
291 1.1 riastrad buf[i] = 0;
292 1.1 riastrad poly1305_update_internal(P, buf, 0);
293 1.1 riastrad }
294 1.1 riastrad
295 1.1 riastrad static void
296 1.1 riastrad poly1305_final(uint8_t h[static 16], struct poly1305 *P)
297 1.1 riastrad {
298 1.1 riastrad uint32_t h0 = P->h[0];
299 1.1 riastrad uint32_t h1 = P->h[1];
300 1.1 riastrad uint32_t h2 = P->h[2];
301 1.1 riastrad uint32_t h3 = P->h[3];
302 1.1 riastrad uint32_t h4 = P->h[4];
303 1.1 riastrad uint32_t s0, s1, s2, s3, s4; /* h - (2^130 - 5) */
304 1.1 riastrad uint32_t m; /* mask */
305 1.1 riastrad uint32_t c;
306 1.1 riastrad
307 1.1 riastrad /* propagate carries */
308 1.1 riastrad h1 += 0; c = h1 >> 26; h1 &= 0x03ffffff;
309 1.1 riastrad h2 += c; c = h2 >> 26; h2 &= 0x03ffffff;
310 1.1 riastrad h3 += c; c = h3 >> 26; h3 &= 0x03ffffff;
311 1.1 riastrad h4 += c; c = h4 >> 26; h4 &= 0x03ffffff;
312 1.1 riastrad
313 1.1 riastrad /* reduce 2^130 = 5 */
314 1.1 riastrad h0 += c*5; c = h0 >> 26; h0 &= 0x03ffffff;
315 1.1 riastrad h1 += c;
316 1.1 riastrad
317 1.1 riastrad /* s := h - (2^130 - 5) */
318 1.1 riastrad c = 5;
319 1.1 riastrad s0 = h0 + c; c = s0 >> 26; s0 &= 0x03ffffff;
320 1.1 riastrad s1 = h1 + c; c = s1 >> 26; s1 &= 0x03ffffff;
321 1.1 riastrad s2 = h2 + c; c = s2 >> 26; s2 &= 0x03ffffff;
322 1.1 riastrad s3 = h3 + c; c = s3 >> 26; s3 &= 0x03ffffff;
323 1.1 riastrad s4 = h4 + c;
324 1.1 riastrad s4 -= 0x04000000;
325 1.1 riastrad
326 1.1 riastrad /* m := -1 if h < 2^130 - 5 else 0 */
327 1.1 riastrad m = -(s4 >> 31);
328 1.1 riastrad
329 1.1 riastrad /* conditional subtract */
330 1.1 riastrad h0 = (m & h0) | (~m & s0);
331 1.1 riastrad h1 = (m & h1) | (~m & s1);
332 1.1 riastrad h2 = (m & h2) | (~m & s2);
333 1.1 riastrad h3 = (m & h3) | (~m & s3);
334 1.1 riastrad h4 = (m & h4) | (~m & s4);
335 1.1 riastrad
336 1.1 riastrad /* reduce modulo 2^128 */
337 1.1 riastrad le32enc(h + 0, ((h1 << 26) | (h0 >> 0)) & 0xffffffff);
338 1.1 riastrad le32enc(h + 4, ((h2 << 20) | (h1 >> 6)) & 0xffffffff);
339 1.1 riastrad le32enc(h + 8, ((h3 << 14) | (h2 >> 12)) & 0xffffffff);
340 1.1 riastrad le32enc(h + 12, ((h4 << 8) | (h3 >> 18)) & 0xffffffff);
341 1.1 riastrad }
342 1.1 riastrad
343 1.1 riastrad static void
345 1.1 riastrad poly1305(uint8_t h[static 16], const uint8_t *m, size_t mlen,
346 1.1 riastrad const uint8_t k[static 16])
347 1.1 riastrad {
348 1.1 riastrad struct poly1305 P;
349 1.1 riastrad
350 1.1 riastrad poly1305_init(&P, k);
351 1.1 riastrad for (; mlen > 16; mlen -= 16, m += 16)
352 1.1 riastrad poly1305_update_block(&P, m);
353 1.1 riastrad poly1305_update_last(&P, m, mlen);
354 1.1 riastrad poly1305_final(h, &P);
355 1.1 riastrad }
356 1.1 riastrad
357 1.1 riastrad static int
358 1.1 riastrad poly1305_selftest(void)
359 1.1 riastrad {
360 1.1 riastrad /* https://tools.ietf.org/html/rfc7539#section-2.5.2 */
361 1.1 riastrad static const uint8_t r[16] = {
362 1.1 riastrad 0x85,0xd6,0xbe,0x78, 0x57,0x55,0x6d,0x33,
363 1.1 riastrad 0x7f,0x44,0x52,0xfe, 0x42,0xd5,0x06,0xa8,
364 1.1 riastrad };
365 1.1 riastrad static const uint8_t s[16] = {
366 1.1 riastrad 0x01,0x03,0x80,0x8a, 0xfb,0x0d,0xb2,0xfd,
367 1.1 riastrad 0x4a,0xbf,0xf6,0xaf, 0x41,0x49,0xf5,0x1b,
368 1.1 riastrad };
369 1.1 riastrad static const uint8_t m[] = {
370 1.1 riastrad 0x43,0x72,0x79,0x70, 0x74,0x6f,0x67,0x72,
371 1.1 riastrad 0x61,0x70,0x68,0x69, 0x63,0x20,0x46,0x6f,
372 1.1 riastrad 0x72,0x75,0x6d,0x20, 0x52,0x65,0x73,0x65,
373 1.1 riastrad 0x61,0x72,0x63,0x68, 0x20,0x47,0x72,0x6f,
374 1.1 riastrad 0x75,0x70,
375 1.1 riastrad };
376 1.1 riastrad static const uint8_t expected[16] = {
377 1.1 riastrad 0xa8,0x06,0x1d,0xc1, 0x30,0x51,0x36,0xc6,
378 1.1 riastrad 0xc2,0x2b,0x8b,0xaf, 0x0c,0x01,0x27,0xa9,
379 1.1 riastrad };
380 1.1 riastrad uint8_t h[16], t[16];
381 1.1 riastrad int result = 0;
382 1.1 riastrad
383 1.1 riastrad poly1305(h, m, sizeof m, r);
384 1.1 riastrad add128(t, h, s);
385 1.1 riastrad if (memcmp(t, expected, 16)) {
386 1.1 riastrad hexdump(printf, "poly1305 h", h, sizeof h);
387 1.1 riastrad hexdump(printf, "poly1305 t", t, sizeof t);
388 1.1 riastrad result = -1;
389 1.1 riastrad }
390 1.1 riastrad
391 1.1 riastrad return result;
392 1.1 riastrad }
393 1.1 riastrad
394 1.1 riastrad /* NHPoly1305 */
396 1.1 riastrad
397 1.1 riastrad static void
398 1.1 riastrad nh(uint8_t h[static 32], const uint8_t *m, size_t mlen,
399 1.1 riastrad const uint32_t k[static 268 /* u/w + 2s(r - 1) */])
400 1.1 riastrad {
401 1.1 riastrad const unsigned w = 32; /* word size */
402 1.1 riastrad const unsigned s = 2; /* stride */
403 1.1 riastrad const unsigned r = 4; /* rounds */
404 1.1 riastrad const unsigned u = 8192; /* unit count (bits per msg unit) */
405 1.1 riastrad uint64_t h0 = 0, h1 = 0, h2 = 0, h3 = 0;
406 1.1 riastrad unsigned i;
407 1.1 riastrad
408 1.1 riastrad CTASSERT(r*w/8 == 16);
409 1.1 riastrad CTASSERT(u/w + 2*s*(r - 1) == 268);
410 1.1 riastrad
411 1.1 riastrad KASSERT(mlen <= u/8);
412 1.1 riastrad KASSERT(mlen % 16 == 0);
413 1.1 riastrad
414 1.1 riastrad for (i = 0; i < mlen/16; i++) {
415 1.1 riastrad uint32_t m0 = le32dec(m + 16*i + 4*0);
416 1.1 riastrad uint32_t m1 = le32dec(m + 16*i + 4*1);
417 1.1 riastrad uint32_t m2 = le32dec(m + 16*i + 4*2);
418 1.1 riastrad uint32_t m3 = le32dec(m + 16*i + 4*3);
419 1.1 riastrad
420 1.1 riastrad uint32_t k00 = k[4*i + 4*0 + 0];
421 1.1 riastrad uint32_t k01 = k[4*i + 4*0 + 1];
422 1.1 riastrad uint32_t k02 = k[4*i + 4*0 + 2];
423 1.1 riastrad uint32_t k03 = k[4*i + 4*0 + 3];
424 1.1 riastrad uint32_t k10 = k[4*i + 4*1 + 0];
425 1.1 riastrad uint32_t k11 = k[4*i + 4*1 + 1];
426 1.1 riastrad uint32_t k12 = k[4*i + 4*1 + 2];
427 1.1 riastrad uint32_t k13 = k[4*i + 4*1 + 3];
428 1.1 riastrad uint32_t k20 = k[4*i + 4*2 + 0];
429 1.1 riastrad uint32_t k21 = k[4*i + 4*2 + 1];
430 1.1 riastrad uint32_t k22 = k[4*i + 4*2 + 2];
431 1.1 riastrad uint32_t k23 = k[4*i + 4*2 + 3];
432 1.1 riastrad uint32_t k30 = k[4*i + 4*3 + 0];
433 1.1 riastrad uint32_t k31 = k[4*i + 4*3 + 1];
434 1.1 riastrad uint32_t k32 = k[4*i + 4*3 + 2];
435 1.1 riastrad uint32_t k33 = k[4*i + 4*3 + 3];
436 1.1 riastrad
437 1.1 riastrad CTASSERT(s == 2);
438 1.1 riastrad h0 += (uint64_t)(m0 + k00) * (m2 + k02);
439 1.1 riastrad h1 += (uint64_t)(m0 + k10) * (m2 + k12);
440 1.1 riastrad h2 += (uint64_t)(m0 + k20) * (m2 + k22);
441 1.1 riastrad h3 += (uint64_t)(m0 + k30) * (m2 + k32);
442 1.1 riastrad h0 += (uint64_t)(m1 + k01) * (m3 + k03);
443 1.1 riastrad h1 += (uint64_t)(m1 + k11) * (m3 + k13);
444 1.1 riastrad h2 += (uint64_t)(m1 + k21) * (m3 + k23);
445 1.1 riastrad h3 += (uint64_t)(m1 + k31) * (m3 + k33);
446 1.1 riastrad }
447 1.1 riastrad
448 1.1 riastrad le64enc(h + 8*0, h0);
449 1.1 riastrad le64enc(h + 8*1, h1);
450 1.1 riastrad le64enc(h + 8*2, h2);
451 1.1 riastrad le64enc(h + 8*3, h3);
452 1.1 riastrad }
453 1.1 riastrad
454 1.1 riastrad static void
455 1.1 riastrad nhpoly1305(uint8_t h[static 16], const uint8_t *m, size_t mlen,
456 1.1 riastrad const uint8_t pk[static 16],
457 1.1 riastrad const uint32_t nhk[static 268 /* u/w + 2s(r - 1) */])
458 1.1 riastrad {
459 1.1 riastrad struct poly1305 P;
460 1.1 riastrad uint8_t h0[32];
461 1.1 riastrad
462 1.1 riastrad /*
463 1.1 riastrad * In principle NHPoly1305 is defined on uneven message
464 1.1 riastrad * lengths, but that's a pain in the patootie.
465 1.1 riastrad */
466 1.1 riastrad KASSERT(mlen % 16 == 0);
467 1.1 riastrad
468 1.1 riastrad poly1305_init(&P, pk);
469 1.1 riastrad for (; mlen; m += MIN(mlen, 1024), mlen -= MIN(mlen, 1024)) {
470 1.1 riastrad nh(h0, m, MIN(mlen, 1024), nhk);
471 1.1 riastrad poly1305_update_block(&P, h0 + 16*0);
472 1.1 riastrad poly1305_update_block(&P, h0 + 16*1);
473 1.1 riastrad }
474 1.1 riastrad poly1305_final(h, &P);
475 1.1 riastrad }
476 1.1 riastrad
477 1.1 riastrad /* https://github.com/google/adiantum/blob/68971e9c6684121b2203b4b05a22768b84051b58/test_vectors/ours/NH/NH.json */
479 1.1 riastrad static int
480 1.1 riastrad nh_selftest(void)
481 1.1 riastrad {
482 1.1 riastrad static const struct {
483 1.1 riastrad uint8_t k[1072];
484 1.1 riastrad unsigned mlen;
485 1.1 riastrad uint8_t m[1024];
486 1.1 riastrad uint8_t h[32];
487 1.1 riastrad } C[] = {
488 1.1 riastrad [0] = { /* 16-byte message */
489 1.1 riastrad .k = {
490 1.1 riastrad 0x22,0x5b,0x80,0xc8, 0x18,0x05,0x37,0x09,
491 1.1 riastrad 0x76,0x14,0x4b,0x67, 0xc4,0x50,0x7f,0x2b,
492 1.1 riastrad 0x2c,0xff,0x56,0xc5, 0xd5,0x66,0x45,0x68,
493 1.1 riastrad 0x35,0xe6,0xd2,0x9a, 0xe5,0xd0,0xc1,0xfb,
494 1.1 riastrad 0xac,0x59,0x81,0x1a, 0x60,0xb0,0x3d,0x81,
495 1.1 riastrad 0x4b,0xa3,0x5b,0xa9, 0xcc,0xb3,0xfe,0x2d,
496 1.1 riastrad 0xc2,0x4d,0xd9,0x26, 0xad,0x36,0xcf,0x8c,
497 1.1 riastrad 0x05,0x11,0x3b,0x8a, 0x99,0x15,0x81,0xc8,
498 1.1 riastrad 0x23,0xf5,0x5a,0x94, 0x10,0x2f,0x92,0x80,
499 1.1 riastrad 0x38,0xc5,0xb2,0x63, 0x80,0xd5,0xdc,0xa3,
500 1.1 riastrad 0x6c,0x2f,0xaa,0x03, 0x96,0x4a,0x75,0x33,
501 1.1 riastrad 0x4c,0xa8,0x60,0x05, 0x96,0xbf,0xe5,0x7a,
502 1.1 riastrad 0xc8,0x4f,0x5c,0x22, 0xf9,0x92,0x74,0x4a,
503 1.1 riastrad 0x75,0x5f,0xa2,0x2a, 0x8d,0x3f,0xe2,0x43,
504 1.1 riastrad 0xfd,0xd9,0x04,0x8c, 0x8e,0xea,0x84,0xcc,
505 1.1 riastrad 0x4d,0x3f,0x94,0x96, 0xed,0x1a,0x51,0xbb,
506 1.1 riastrad 0x2f,0xc4,0x63,0x28, 0x31,0x0b,0xda,0x92,
507 1.1 riastrad 0x1e,0x4d,0xe2,0x1d, 0x82,0xb5,0x65,0xb4,
508 1.1 riastrad 0x75,0x69,0xd7,0x6f, 0x29,0xe4,0xbe,0x7e,
509 1.1 riastrad 0xcc,0xbd,0x95,0xbd, 0x7a,0x62,0xea,0xfa,
510 1.1 riastrad 0x33,0x34,0x80,0x58, 0xbf,0xfa,0x00,0x7e,
511 1.1 riastrad 0xa7,0xb4,0xc9,0x32, 0x7c,0xc7,0x8f,0x8a,
512 1.1 riastrad 0x28,0x27,0xdd,0xeb, 0xb9,0x1c,0x01,0xad,
513 1.1 riastrad 0xec,0xf4,0x30,0x5e, 0xce,0x3b,0xaa,0x22,
514 1.1 riastrad 0x60,0xbd,0x84,0xd9, 0x9e,0xaf,0xe8,0x4c,
515 1.1 riastrad 0x44,0xb6,0x84,0x2d, 0x5c,0xe6,0x26,0xee,
516 1.1 riastrad 0x8a,0xa2,0x0d,0xe3, 0x97,0xed,0xf5,0x47,
517 1.1 riastrad 0xdb,0x50,0x72,0x4a, 0x5e,0x9a,0x8d,0x10,
518 1.1 riastrad 0xc2,0x25,0xdd,0x5b, 0xd0,0x39,0xc4,0x5b,
519 1.1 riastrad 0x2a,0x79,0x81,0xb7, 0x5c,0xda,0xed,0x77,
520 1.1 riastrad 0x17,0x53,0xb5,0x8b, 0x1e,0x5f,0xf3,0x48,
521 1.1 riastrad 0x30,0xac,0x97,0x7d, 0x29,0xe3,0xc9,0x18,
522 1.1 riastrad 0xe1,0x2b,0x31,0xa0, 0x08,0xe9,0x15,0x59,
523 1.1 riastrad 0x29,0xdb,0x84,0x2a, 0x33,0x98,0x8a,0xd4,
524 1.1 riastrad 0xc3,0xfc,0xf7,0xca, 0x65,0x02,0x4d,0x9f,
525 1.1 riastrad 0xe2,0xb1,0x5e,0xa6, 0x6a,0x01,0xf9,0xcf,
526 1.1 riastrad 0x7e,0xa6,0x09,0xd9, 0x16,0x90,0x14,0x5f,
527 1.1 riastrad 0x3a,0xf8,0xd8,0x34, 0x38,0xd6,0x1f,0x89,
528 1.1 riastrad 0x0c,0x81,0xc2,0x68, 0xc4,0x65,0x78,0xf3,
529 1.1 riastrad 0xfe,0x27,0x48,0x70, 0x38,0x43,0x48,0x5a,
530 1.1 riastrad 0xc1,0x24,0xc5,0x6f, 0x65,0x63,0x1b,0xb0,
531 1.1 riastrad 0x5b,0xb4,0x07,0x1e, 0x69,0x08,0x8f,0xfc,
532 1.1 riastrad 0x93,0x29,0x04,0x16, 0x6a,0x8b,0xb3,0x3d,
533 1.1 riastrad 0x0f,0xba,0x5f,0x46, 0xff,0xfe,0x77,0xa1,
534 1.1 riastrad 0xb9,0xdc,0x29,0x66, 0x9a,0xd1,0x08,0xdd,
535 1.1 riastrad 0x32,0xe3,0x21,0x7b, 0xcc,0x2e,0x5c,0xf7,
536 1.1 riastrad 0x79,0x68,0xd4,0xc1, 0x8b,0x3c,0x5d,0x0e,
537 1.1 riastrad 0xd4,0x26,0xa6,0x19, 0x92,0x45,0xf7,0x19,
538 1.1 riastrad 0x0e,0xa2,0x17,0xd8, 0x1c,0x7f,0x8d,0xd6,
539 1.1 riastrad 0x68,0x37,0x6c,0xbf, 0xb1,0x8a,0x5e,0x36,
540 1.1 riastrad 0x4b,0xc0,0xca,0x21, 0x02,0x24,0x69,0x9b,
541 1.1 riastrad 0x2b,0x19,0x0a,0x1b, 0xe3,0x17,0x30,0x57,
542 1.1 riastrad 0xf6,0xfc,0xd6,0x66, 0x36,0x30,0xc2,0x11,
543 1.1 riastrad 0x08,0x8d,0xc5,0x84, 0x67,0xa0,0x89,0xc3,
544 1.1 riastrad 0x74,0x48,0x15,0xca, 0x6e,0x0c,0x6d,0x78,
545 1.1 riastrad 0x66,0x15,0x73,0x85, 0xf9,0x8b,0xba,0xb2,
546 1.1 riastrad 0x09,0xda,0x79,0xe6, 0x00,0x08,0x2a,0xda,
547 1.1 riastrad 0x6b,0xd7,0xd1,0xa7, 0x8b,0x5f,0x11,0x87,
548 1.1 riastrad 0x96,0x1b,0x23,0xb0, 0x6c,0x55,0xb6,0x86,
549 1.1 riastrad 0xfb,0xff,0xe3,0x69, 0xac,0x43,0xcd,0x8f,
550 1.1 riastrad 0x8a,0xe7,0x1c,0x3c, 0xa0,0x6a,0xd5,0x63,
551 1.1 riastrad 0x80,0x66,0xd8,0x7f, 0xb5,0xb8,0x96,0xd4,
552 1.1 riastrad 0xe2,0x20,0x40,0x53, 0x6d,0x0d,0x8b,0x6d,
553 1.1 riastrad 0xd5,0x5d,0x51,0xfb, 0x4d,0x80,0x82,0x01,
554 1.1 riastrad 0x14,0x97,0x96,0x9b, 0x13,0xb8,0x1d,0x76,
555 1.1 riastrad 0x7a,0xa1,0xca,0x19, 0x90,0xec,0x7b,0xe0,
556 1.1 riastrad 0x8e,0xa8,0xb4,0xf2, 0x33,0x67,0x0e,0x10,
557 1.1 riastrad 0xb1,0xa2,0x82,0xea, 0x81,0x82,0xa2,0xc6,
558 1.1 riastrad 0x78,0x51,0xa6,0xd3, 0x25,0xe4,0x9c,0xf2,
559 1.1 riastrad 0x6b,0xa8,0xec,0xfb, 0xd4,0x1d,0x5b,0xa4,
560 1.1 riastrad 0x79,0x66,0x62,0xb8, 0x2b,0x6f,0x9e,0x0f,
561 1.1 riastrad 0xcc,0xcb,0x9e,0x92, 0x6f,0x06,0xdb,0xf0,
562 1.1 riastrad 0x97,0xce,0x3f,0x90, 0xa2,0x1f,0xbe,0x3b,
563 1.1 riastrad 0x7b,0x10,0xf0,0x23, 0x30,0x0c,0xc5,0x0c,
564 1.1 riastrad 0x6c,0x78,0xfc,0xa8, 0x71,0x62,0xcf,0x98,
565 1.1 riastrad 0xa2,0xb1,0x44,0xb5, 0xc6,0x3b,0x5c,0x63,
566 1.1 riastrad 0x83,0x1d,0x35,0xf2, 0xc7,0x42,0x67,0x5d,
567 1.1 riastrad 0xc1,0x26,0x36,0xc8, 0x6e,0x1d,0xf6,0xd5,
568 1.1 riastrad 0x52,0x35,0xa4,0x9e, 0xce,0x4c,0x3b,0x92,
569 1.1 riastrad 0x20,0x86,0xb7,0x89, 0x63,0x73,0x1a,0x8b,
570 1.1 riastrad 0xa6,0x35,0xfe,0xb9, 0xdf,0x5e,0x0e,0x53,
571 1.1 riastrad 0x0b,0xf2,0xb3,0x4d, 0x34,0x1d,0x66,0x33,
572 1.1 riastrad 0x1f,0x08,0xf5,0xf5, 0x0a,0xab,0x76,0x19,
573 1.1 riastrad 0xde,0x82,0x2f,0xcf, 0x11,0xa6,0xcb,0xb3,
574 1.1 riastrad 0x17,0xec,0x8d,0xaf, 0xcb,0xf0,0x92,0x1e,
575 1.1 riastrad 0xb8,0xa3,0x04,0x0a, 0xac,0x2c,0xae,0xc5,
576 1.1 riastrad 0x0b,0xc4,0x4e,0xef, 0x0a,0xe2,0xda,0xe9,
577 1.1 riastrad 0xd7,0x75,0x2d,0x95, 0xc7,0x1b,0xf3,0x0b,
578 1.1 riastrad 0x43,0x19,0x16,0xd7, 0xc6,0x90,0x2d,0x6b,
579 1.1 riastrad 0xe1,0xb2,0xce,0xbe, 0xd0,0x7d,0x15,0x99,
580 1.1 riastrad 0x24,0x37,0xbc,0xb6, 0x8c,0x89,0x7a,0x8c,
581 1.1 riastrad 0xcb,0xa7,0xf7,0x0b, 0x5f,0xd4,0x96,0x8d,
582 1.1 riastrad 0xf5,0x80,0xa3,0xce, 0xf5,0x9e,0xed,0x60,
583 1.1 riastrad 0x00,0x92,0xa5,0x67, 0xc9,0x21,0x79,0x0b,
584 1.1 riastrad 0xfb,0xe2,0x57,0x0e, 0xdf,0xb6,0x16,0x90,
585 1.1 riastrad 0xd3,0x75,0xf6,0xb0, 0xa3,0x4e,0x43,0x9a,
586 1.1 riastrad 0xb7,0xf4,0x73,0xd8, 0x34,0x46,0xc6,0xbe,
587 1.1 riastrad 0x80,0xec,0x4a,0xc0, 0x7f,0x9e,0xb6,0xb0,
588 1.1 riastrad 0x58,0xc2,0xae,0xa1, 0xf3,0x60,0x04,0x62,
589 1.1 riastrad 0x11,0xea,0x0f,0x90, 0xa9,0xea,0x6f,0x0c,
590 1.1 riastrad 0x4c,0xcf,0xe8,0xd0, 0xea,0xbf,0xdb,0xf2,
591 1.1 riastrad 0x53,0x0c,0x09,0x4d, 0xd4,0xed,0xf3,0x22,
592 1.1 riastrad 0x10,0x99,0xc6,0x4f, 0xcf,0xcf,0x96,0xc9,
593 1.1 riastrad 0xd9,0x6b,0x08,0x3b, 0xf0,0x62,0x2d,0xac,
594 1.1 riastrad 0x55,0x38,0xd5,0x5c, 0x57,0xad,0x51,0xc3,
595 1.1 riastrad 0xf5,0xd2,0x37,0x45, 0xb3,0x3f,0x6d,0xaf,
596 1.1 riastrad 0x10,0x62,0x57,0xb9, 0x58,0x40,0xb3,0x3c,
597 1.1 riastrad 0x6a,0x98,0x97,0x1a, 0x9c,0xeb,0x66,0xf1,
598 1.1 riastrad 0xa5,0x93,0x0b,0xe7, 0x8b,0x29,0x0f,0xff,
599 1.1 riastrad 0x2c,0xd0,0x90,0xf2, 0x67,0xa0,0x69,0xcd,
600 1.1 riastrad 0xd3,0x59,0xad,0xad, 0xf1,0x1f,0xd7,0xad,
601 1.1 riastrad 0x24,0x74,0x29,0xcd, 0x06,0xd5,0x42,0x90,
602 1.1 riastrad 0xf9,0x96,0x4a,0xd9, 0xa0,0x37,0xe4,0x64,
603 1.1 riastrad 0x8e,0x13,0x2a,0x2a, 0xe7,0xc2,0x1e,0xf6,
604 1.1 riastrad 0xb2,0xd3,0xdc,0x9f, 0x33,0x32,0x0c,0x50,
605 1.1 riastrad 0x88,0x37,0x8b,0x9b, 0xfe,0x6f,0xfd,0x05,
606 1.1 riastrad 0x96,0x26,0x6c,0x96, 0x73,0x73,0xe1,0x09,
607 1.1 riastrad 0x28,0xf3,0x7f,0xa6, 0x59,0xc5,0x2e,0xf4,
608 1.1 riastrad 0xd3,0xd5,0xda,0x6b, 0xca,0x42,0x05,0xe5,
609 1.1 riastrad 0xed,0x13,0xe2,0x4e, 0xcd,0xd5,0xd0,0xfb,
610 1.1 riastrad 0x6e,0xf7,0x8a,0x3e, 0x91,0x9d,0x6b,0xc5,
611 1.1 riastrad 0x33,0x05,0x07,0x86, 0xb2,0x26,0x41,0x6e,
612 1.1 riastrad 0xf8,0x38,0x38,0x7a, 0xf0,0x6c,0x27,0x5a,
613 1.1 riastrad 0x01,0xd8,0x03,0xe5, 0x91,0x33,0xaa,0x20,
614 1.1 riastrad 0xcd,0xa7,0x4f,0x18, 0xa0,0x91,0x28,0x74,
615 1.1 riastrad 0xc0,0x58,0x27,0x0f, 0x9b,0xa8,0x85,0xb0,
616 1.1 riastrad 0xe0,0xfd,0x5b,0xdb, 0x5b,0xb8,0x86,0x79,
617 1.1 riastrad 0x94,0x6d,0xde,0x26, 0x64,0x2d,0x6c,0xb9,
618 1.1 riastrad 0xba,0xc7,0xf0,0xd7, 0xaa,0x68,0x68,0xd0,
619 1.1 riastrad 0x40,0x71,0xdb,0x94, 0x54,0x62,0xa5,0x7f,
620 1.1 riastrad 0x98,0xea,0xe3,0x4c, 0xe4,0x44,0x9a,0x03,
621 1.1 riastrad 0xf9,0x1c,0x20,0x36, 0xeb,0x0d,0xa4,0x41,
622 1.1 riastrad 0x24,0x06,0xcb,0x94, 0x86,0x35,0x22,0x62,
623 1.1 riastrad 0x80,0x19,0x16,0xba, 0x2c,0x10,0x38,0x96,
624 1.1 riastrad },
625 1.1 riastrad .mlen = 16,
626 1.1 riastrad .m = {
627 1.1 riastrad 0xd3,0x82,0xe7,0x04, 0x35,0xcc,0xf7,0xa4,
628 1.1 riastrad 0xf9,0xb2,0xc5,0xed, 0x5a,0xd9,0x58,0xeb,
629 1.1 riastrad },
630 1.1 riastrad .h = {
631 1.1 riastrad 0x41,0xd9,0xad,0x54, 0x5a,0x0d,0xcc,0x53,
632 1.1 riastrad 0x48,0xf6,0x4c,0x75, 0x43,0x5d,0xdd,0x77,
633 1.1 riastrad 0xda,0xca,0x7d,0xec, 0x91,0x3b,0x53,0x16,
634 1.1 riastrad 0x5c,0x4b,0x58,0xdc, 0x70,0x0a,0x7b,0x37,
635 1.1 riastrad },
636 1.1 riastrad },
637 1.1 riastrad [1] = { /* 1008-byte message */
638 1.1 riastrad .k = {
639 1.1 riastrad 0xd9,0x94,0x65,0xda, 0xc2,0x60,0xdd,0xa9,
640 1.1 riastrad 0x39,0xe5,0x37,0x11, 0xf6,0x74,0xa5,0x95,
641 1.1 riastrad 0x36,0x07,0x24,0x99, 0x64,0x6b,0xda,0xe2,
642 1.1 riastrad 0xd5,0xd1,0xd2,0xd9, 0x25,0xd5,0xcc,0x48,
643 1.1 riastrad 0xf8,0xa5,0x9e,0xff, 0x84,0x5a,0xd1,0x6f,
644 1.1 riastrad 0xb7,0x6a,0x4d,0xd2, 0xc8,0x13,0x3d,0xde,
645 1.1 riastrad 0x17,0xed,0x64,0xf1, 0x2b,0xcc,0xdd,0x65,
646 1.1 riastrad 0x11,0x16,0xf2,0xaf, 0x34,0xd2,0xc5,0x31,
647 1.1 riastrad 0xaa,0x69,0x33,0x0a, 0x0b,0xc1,0xb4,0x6d,
648 1.1 riastrad 0xaa,0xcd,0x43,0xc4, 0x0b,0xef,0xf9,0x7d,
649 1.1 riastrad 0x97,0x3c,0xa7,0x22, 0xda,0xa6,0x6a,0xf0,
650 1.1 riastrad 0xad,0xe3,0x6f,0xde, 0xfb,0x33,0xf3,0xd8,
651 1.1 riastrad 0x96,0x5f,0xca,0xda, 0x18,0x63,0x03,0xd0,
652 1.1 riastrad 0x8f,0xb6,0xc4,0x62, 0x9d,0x50,0x6c,0x8f,
653 1.1 riastrad 0x85,0xdd,0x6d,0x52, 0x2d,0x45,0x01,0x36,
654 1.1 riastrad 0x57,0x9f,0x51,0xf0, 0x70,0xe0,0xb2,0x99,
655 1.1 riastrad 0x3a,0x11,0x68,0xbd, 0xe5,0xfa,0x7c,0x59,
656 1.1 riastrad 0x12,0x5a,0xbc,0xd9, 0xd6,0x9a,0x09,0xe6,
657 1.1 riastrad 0xa2,0x80,0x1f,0xd6, 0x47,0x20,0x82,0x4e,
658 1.1 riastrad 0xac,0xb5,0x6d,0xde, 0x5b,0xff,0x9c,0xd4,
659 1.1 riastrad 0x2a,0xae,0x27,0x7c, 0x0f,0x5a,0x5d,0x35,
660 1.1 riastrad 0x2d,0xff,0x07,0xf9, 0x79,0x6a,0xf9,0x3e,
661 1.1 riastrad 0xd9,0x22,0x62,0x30, 0x40,0xce,0xe1,0xf4,
662 1.1 riastrad 0x46,0x0a,0x24,0xca, 0x7a,0x3e,0xa1,0x92,
663 1.1 riastrad 0x1a,0x29,0xa0,0xbf, 0x23,0x95,0x99,0x31,
664 1.1 riastrad 0xe3,0x51,0x25,0x3d, 0xaf,0x1e,0xfc,0xb3,
665 1.1 riastrad 0x65,0xa2,0x10,0x37, 0xe6,0xa7,0x20,0xa0,
666 1.1 riastrad 0xe3,0x6a,0xd4,0x81, 0x2c,0x8d,0xa0,0x87,
667 1.1 riastrad 0xec,0xae,0x9f,0x44, 0x10,0xda,0x2e,0x17,
668 1.1 riastrad 0xba,0xb2,0xa5,0x5c, 0x89,0xc6,0xfa,0x70,
669 1.1 riastrad 0x7e,0xc2,0xe3,0xb6, 0xa0,0x98,0x9c,0xb8,
670 1.1 riastrad 0x14,0x33,0x27,0x3a, 0x6e,0x4d,0x94,0x72,
671 1.1 riastrad 0x4b,0xc8,0xac,0x24, 0x2f,0x85,0xd9,0xa4,
672 1.1 riastrad 0xda,0x22,0x95,0xc5, 0xb3,0xfc,0xbe,0xd2,
673 1.1 riastrad 0x96,0x57,0x91,0xf9, 0xfd,0x18,0x9c,0x56,
674 1.1 riastrad 0x70,0x15,0x5f,0xe7, 0x40,0x45,0x28,0xb3,
675 1.1 riastrad 0x2b,0x56,0x44,0xca, 0x6a,0x2b,0x0e,0x25,
676 1.1 riastrad 0x66,0x3e,0x32,0x04, 0xe2,0xb7,0x91,0xc8,
677 1.1 riastrad 0xd2,0x02,0x79,0x0f, 0x7e,0xa9,0xb3,0x86,
678 1.1 riastrad 0xb2,0x76,0x74,0x18, 0x57,0x16,0x63,0x06,
679 1.1 riastrad 0x6e,0x16,0xfa,0xef, 0x52,0x3c,0x5e,0x0d,
680 1.1 riastrad 0x33,0x55,0xd2,0x8d, 0x57,0x4d,0xfe,0x54,
681 1.1 riastrad 0x65,0x7a,0x54,0x52, 0xf0,0x7b,0x2c,0xf8,
682 1.1 riastrad 0xd5,0x43,0xba,0x92, 0xa5,0x2e,0xbe,0x1a,
683 1.1 riastrad 0xce,0x25,0x4f,0x34, 0x31,0xe7,0xa3,0xff,
684 1.1 riastrad 0x90,0xf6,0xbc,0x0c, 0xbc,0x98,0xdf,0x4a,
685 1.1 riastrad 0xc3,0xeb,0xb6,0x27, 0x68,0xa9,0xb5,0x33,
686 1.1 riastrad 0xbc,0x13,0xe8,0x13, 0x7c,0x6b,0xec,0x31,
687 1.1 riastrad 0xd9,0x79,0x2a,0xa7, 0xe4,0x02,0x4f,0x02,
688 1.1 riastrad 0xd4,0x5c,0x57,0x4f, 0xa4,0xbc,0xa3,0xe1,
689 1.1 riastrad 0x7e,0x36,0x8a,0xde, 0x11,0x55,0xec,0xb3,
690 1.1 riastrad 0x8b,0x65,0x06,0x02, 0x9a,0x68,0x06,0x64,
691 1.1 riastrad 0x63,0xc7,0x9a,0x67, 0xdc,0x70,0xbf,0xb5,
692 1.1 riastrad 0xf8,0x49,0x2a,0xe1, 0x59,0x4c,0xe4,0x1e,
693 1.1 riastrad 0xb5,0x56,0xa5,0xad, 0x24,0x82,0x8c,0xd0,
694 1.1 riastrad 0x66,0xe4,0x72,0x79, 0x02,0x5d,0x0d,0xf9,
695 1.1 riastrad 0x19,0x44,0xe3,0x86, 0x1a,0xda,0xda,0xf0,
696 1.1 riastrad 0x2d,0x47,0xc0,0x07, 0x47,0x0b,0xf8,0x06,
697 1.1 riastrad 0xf6,0x45,0x8a,0x7f, 0xb9,0xf9,0x33,0x2e,
698 1.1 riastrad 0xc2,0xf1,0xf1,0x81, 0x41,0x99,0xcd,0xf6,
699 1.1 riastrad 0xb1,0x71,0x1b,0xfa, 0x21,0x53,0x7c,0xa1,
700 1.1 riastrad 0xeb,0x2a,0x38,0x5b, 0x9b,0xfe,0x96,0xa5,
701 1.1 riastrad 0xe3,0x78,0x77,0x47, 0x98,0x0f,0x7d,0xef,
702 1.1 riastrad 0xf6,0x05,0x37,0x88, 0x79,0x0c,0x21,0x8d,
703 1.1 riastrad 0x87,0x1f,0xae,0xce, 0x83,0xaf,0xa3,0xd6,
704 1.1 riastrad 0x6e,0xc5,0x3c,0x47, 0xc6,0xd6,0x4a,0xdc,
705 1.1 riastrad 0x7c,0xcc,0xdc,0x11, 0x7c,0x7d,0x0f,0x03,
706 1.1 riastrad 0xc1,0x80,0x75,0x2a, 0x64,0x76,0xf0,0x08,
707 1.1 riastrad 0x0c,0x11,0x4b,0xe4, 0x05,0x41,0x78,0x0f,
708 1.1 riastrad 0x86,0xa0,0xd6,0x61, 0xb0,0xfb,0x15,0x3d,
709 1.1 riastrad 0x3c,0xc3,0xd5,0x1b, 0x72,0x0e,0x79,0x53,
710 1.1 riastrad 0x07,0xd2,0x2c,0x6e, 0x83,0xbd,0x72,0x88,
711 1.1 riastrad 0x41,0x07,0x4b,0xd2, 0xe9,0xcc,0x2a,0x9d,
712 1.1 riastrad 0x5b,0x82,0x0d,0x02, 0x29,0x6e,0xf3,0xbc,
713 1.1 riastrad 0x34,0x31,0x62,0x8d, 0x83,0xc1,0x7e,0x94,
714 1.1 riastrad 0x21,0xd5,0xfd,0xa6, 0x6a,0x2b,0xe8,0x86,
715 1.1 riastrad 0x05,0x48,0x97,0x41, 0xad,0xca,0xef,0x79,
716 1.1 riastrad 0x5e,0xd8,0x51,0xc4, 0xae,0xf7,0xfa,0xac,
717 1.1 riastrad 0x3d,0x74,0x2e,0xf4, 0x41,0x3b,0x19,0xc2,
718 1.1 riastrad 0x04,0xf3,0x40,0xfe, 0x77,0x7c,0x6a,0x4c,
719 1.1 riastrad 0x8e,0x24,0x84,0xe0, 0x70,0xe4,0xb2,0x19,
720 1.1 riastrad 0x6c,0x0c,0x85,0x9e, 0xe1,0xad,0xa4,0x73,
721 1.1 riastrad 0x90,0xdd,0xbf,0x7d, 0x1b,0x6f,0x8b,0x4d,
722 1.1 riastrad 0x3b,0xec,0xd7,0xb0, 0xd9,0x90,0xf1,0xf5,
723 1.1 riastrad 0xb9,0x32,0xe3,0x79, 0x15,0x08,0x3e,0x71,
724 1.1 riastrad 0xed,0x91,0xc4,0x5c, 0x18,0xe8,0x16,0x52,
725 1.1 riastrad 0xae,0x9d,0xf3,0x09, 0xac,0x57,0x11,0xf8,
726 1.1 riastrad 0x16,0x55,0xd0,0x28, 0x60,0xc1,0x7e,0x6d,
727 1.1 riastrad 0x87,0xc1,0x7a,0xe8, 0x5d,0xc5,0x12,0x68,
728 1.1 riastrad 0x6d,0x63,0x39,0x27, 0x49,0xb8,0x0c,0x78,
729 1.1 riastrad 0x92,0xea,0x6f,0x52, 0xeb,0x43,0xc2,0x0b,
730 1.1 riastrad 0xd8,0x28,0x77,0xe5, 0x43,0x5f,0xb8,0xa6,
731 1.1 riastrad 0x32,0xb7,0xaa,0x01, 0x1e,0xa6,0xde,0xe4,
732 1.1 riastrad 0x9b,0x0f,0xb6,0x49, 0xcc,0x6f,0x2c,0x04,
733 1.1 riastrad 0x41,0xcb,0xd8,0x80, 0xd1,0x15,0x5e,0x57,
734 1.1 riastrad 0x1e,0x4a,0x77,0xbf, 0xc4,0xcb,0x09,0x7c,
735 1.1 riastrad 0x6e,0x81,0xb8,0x64, 0x51,0x6a,0xf2,0x71,
736 1.1 riastrad 0x06,0xf6,0x00,0xac, 0x79,0x2c,0x83,0x7a,
737 1.1 riastrad 0x6c,0xa4,0x85,0x89, 0x69,0x06,0x26,0x72,
738 1.1 riastrad 0xe1,0x00,0x66,0xc0, 0xc5,0x8e,0xc8,0x51,
739 1.1 riastrad 0x6e,0x25,0xdd,0xc9, 0x54,0x98,0x45,0x64,
740 1.1 riastrad 0xaa,0x51,0x18,0x1b, 0xe4,0xbe,0x1b,0xee,
741 1.1 riastrad 0x13,0xd6,0x34,0x50, 0x4c,0xcf,0x3c,0x31,
742 1.1 riastrad 0x9b,0xd2,0x6f,0x07, 0x79,0xf4,0x63,0x3f,
743 1.1 riastrad 0x09,0x01,0x64,0xf1, 0xc1,0xf1,0xae,0xa9,
744 1.1 riastrad 0x0c,0x60,0xc9,0x62, 0x84,0xf6,0xe8,0x15,
745 1.1 riastrad 0x55,0xdf,0xdd,0x71, 0x95,0xa9,0x0f,0x65,
746 1.1 riastrad 0x97,0x40,0x79,0x86, 0x95,0xd9,0x57,0x23,
747 1.1 riastrad 0x2f,0x61,0x51,0xb5, 0x16,0x18,0x62,0xd2,
748 1.1 riastrad 0x1a,0xd9,0x8b,0x88, 0x84,0xa9,0x9b,0x47,
749 1.1 riastrad 0xd7,0x22,0x68,0xe9, 0x9c,0x69,0x68,0x74,
750 1.1 riastrad 0x13,0x95,0xd3,0x99, 0x33,0xdb,0x30,0x96,
751 1.1 riastrad 0xbf,0x01,0xc6,0x68, 0xbd,0x19,0x32,0xc1,
752 1.1 riastrad 0xf8,0xa9,0x7f,0x2b, 0xc5,0x69,0x2f,0xa2,
753 1.1 riastrad 0xce,0x5a,0x46,0x43, 0x8d,0x36,0x9c,0xfa,
754 1.1 riastrad 0x5c,0x7f,0x03,0xe0, 0x80,0xaa,0xc7,0x9e,
755 1.1 riastrad 0x3b,0xa3,0x27,0x6b, 0x2e,0xc6,0x59,0x0a,
756 1.1 riastrad 0xf6,0x36,0x37,0xa6, 0xc0,0xd1,0xa1,0xa1,
757 1.1 riastrad 0x7e,0xc1,0xf8,0x5b, 0x0f,0x9b,0xdd,0x6d,
758 1.1 riastrad 0x9f,0x54,0x16,0x6b, 0x6e,0x53,0xfd,0xe8,
759 1.1 riastrad 0x72,0xd0,0x3e,0x46, 0xce,0xaf,0x94,0x36,
760 1.1 riastrad 0x85,0xa8,0xae,0x4c, 0x8d,0xb5,0xc2,0x1b,
761 1.1 riastrad 0x5d,0x29,0x46,0x40, 0x87,0x50,0x59,0xdd,
762 1.1 riastrad 0x04,0xbe,0xba,0x8f, 0x0b,0x9b,0xd2,0x50,
763 1.1 riastrad 0x67,0x19,0x83,0x80, 0x87,0x5c,0x58,0x86,
764 1.1 riastrad 0x20,0x39,0xbf,0xdf, 0xd2,0xc8,0xbb,0xe8,
765 1.1 riastrad 0xc8,0xd8,0xe8,0x8d, 0xcc,0x97,0xe0,0xc9,
766 1.1 riastrad 0x6c,0x2f,0x47,0xb6, 0x75,0x8f,0x0d,0x37,
767 1.1 riastrad 0x5a,0x83,0xb0,0xce, 0x59,0xc2,0x0b,0x84,
768 1.1 riastrad 0xa2,0x54,0xe5,0x38, 0x59,0x29,0x0f,0xa8,
769 1.1 riastrad 0x26,0x2d,0x11,0xa9, 0x89,0x0e,0x0b,0x75,
770 1.1 riastrad 0xe0,0xbc,0xf0,0xf8, 0x92,0x1f,0x29,0x71,
771 1.1 riastrad 0x91,0xc4,0x63,0xcc, 0xf8,0x52,0xb5,0xd4,
772 1.1 riastrad 0xb8,0x94,0x6a,0x30, 0x90,0xf7,0x44,0xbe,
773 1.1 riastrad },
774 1.1 riastrad .mlen = 1008,
775 1.1 riastrad .m = {
776 1.1 riastrad 0x05,0xe3,0x6f,0x44, 0xa4,0x40,0x35,0xf6,
777 1.1 riastrad 0xeb,0x86,0xa9,0x6d, 0xed,0x16,0xdb,0xb6,
778 1.1 riastrad 0x5b,0x59,0xda,0x30, 0x54,0x6c,0x59,0x35,
779 1.1 riastrad 0x42,0x59,0x56,0x45, 0x9a,0x85,0x20,0x73,
780 1.1 riastrad 0xcf,0x21,0xf5,0x98, 0x58,0x07,0x0e,0x7f,
781 1.1 riastrad 0x44,0x1f,0xf1,0x53, 0x92,0xc7,0x81,0x53,
782 1.1 riastrad 0x5e,0x97,0x8a,0x23, 0x1d,0xe8,0xad,0xca,
783 1.1 riastrad 0x19,0x55,0x96,0x9d, 0x9b,0xfd,0x0a,0x0a,
784 1.1 riastrad 0xad,0xa8,0x0f,0x76, 0xe2,0x6a,0x8f,0x33,
785 1.1 riastrad 0x36,0xbf,0xcb,0x7a, 0xfd,0x61,0xc6,0xfb,
786 1.1 riastrad 0x75,0xea,0xd4,0x09, 0x5e,0x70,0xfb,0x32,
787 1.1 riastrad 0x54,0xe3,0x47,0x48, 0xd4,0x8c,0xa9,0x7c,
788 1.1 riastrad 0x72,0xdb,0xdb,0xf7, 0x09,0x6d,0x58,0xa6,
789 1.1 riastrad 0x42,0xb5,0x74,0x8c, 0x98,0x66,0x83,0x7a,
790 1.1 riastrad 0x6d,0xeb,0x91,0xfb, 0x22,0x1c,0x78,0x3d,
791 1.1 riastrad 0x22,0xa6,0xf8,0xb0, 0xd1,0x9f,0xc8,0x69,
792 1.1 riastrad 0x8a,0xba,0xd3,0x78, 0x21,0xb0,0x7b,0x9f,
793 1.1 riastrad 0xb8,0xed,0xe0,0x65, 0xff,0xa0,0x8b,0x4c,
794 1.1 riastrad 0x17,0x9e,0xf7,0x3e, 0xa2,0x5f,0x82,0x77,
795 1.1 riastrad 0xce,0x2a,0xda,0x41, 0x76,0x07,0x68,0xa4,
796 1.1 riastrad 0xa1,0xbb,0xe0,0x1d, 0x7b,0xab,0x9c,0x03,
797 1.1 riastrad 0x90,0x2c,0xd2,0x93, 0x46,0x43,0x3a,0x44,
798 1.1 riastrad 0x29,0xe8,0xb5,0x7a, 0x23,0xbb,0xe9,0xaf,
799 1.1 riastrad 0x2b,0x17,0x88,0x8f, 0x7a,0x81,0x7a,0x25,
800 1.1 riastrad 0x3b,0xc7,0x1e,0x6e, 0xde,0x3e,0x54,0xbc,
801 1.1 riastrad 0xc6,0xff,0x07,0xdc, 0xe6,0x29,0x02,0x4c,
802 1.1 riastrad 0x95,0x57,0x0e,0x44, 0xc4,0x9c,0xc7,0x45,
803 1.1 riastrad 0x01,0xd7,0x17,0xfd, 0x0f,0x1a,0x83,0x74,
804 1.1 riastrad 0xa0,0xd5,0xb3,0x1a, 0xc0,0x97,0xdc,0xc3,
805 1.1 riastrad 0x0f,0x3d,0x5d,0x8c, 0x02,0x58,0xc6,0x4d,
806 1.1 riastrad 0x43,0x10,0xae,0xc9, 0x94,0xe2,0x9b,0xcd,
807 1.1 riastrad 0xf9,0xcc,0xfe,0xbd, 0x9c,0x69,0xd0,0xec,
808 1.1 riastrad 0xf8,0x67,0xde,0x98, 0xe5,0x50,0x5e,0x93,
809 1.1 riastrad 0x6a,0x5b,0x31,0x2a, 0x62,0xee,0x03,0xbe,
810 1.1 riastrad 0x76,0x9c,0x1d,0x13, 0x16,0x13,0xcf,0x63,
811 1.1 riastrad 0x30,0x18,0x7d,0x1e, 0x55,0x94,0xf5,0x29,
812 1.1 riastrad 0xb4,0x91,0xb4,0x76, 0x1c,0x31,0x9e,0xe5,
813 1.1 riastrad 0x1b,0x0a,0xee,0x89, 0xb4,0xd9,0x45,0x19,
814 1.1 riastrad 0xd7,0x47,0x2c,0x01, 0x20,0xe6,0x1d,0x7c,
815 1.1 riastrad 0xb3,0x5e,0x1b,0x2a, 0x8c,0x3d,0x4d,0x1a,
816 1.1 riastrad 0x6b,0x35,0x84,0x41, 0x6a,0xe4,0x32,0x8f,
817 1.1 riastrad 0x9a,0x0d,0xbf,0x90, 0xff,0xcf,0x4c,0xfb,
818 1.1 riastrad 0x9b,0x07,0x81,0x94, 0xcf,0x8e,0x1a,0x8a,
819 1.1 riastrad 0xfc,0xbd,0x91,0xfe, 0xc3,0xe1,0x18,0xc7,
820 1.1 riastrad 0x1f,0x0d,0x8e,0x1c, 0x2e,0xfc,0x02,0xe8,
821 1.1 riastrad 0x39,0xbf,0x05,0x90, 0x58,0x94,0xee,0xe7,
822 1.1 riastrad 0x15,0x31,0x5d,0x9f, 0x68,0x36,0x64,0x32,
823 1.1 riastrad 0x25,0x49,0xdd,0x3e, 0xc8,0xb6,0x83,0x5e,
824 1.1 riastrad 0x09,0x90,0xcd,0x48, 0xaf,0x9e,0xfe,0xd6,
825 1.1 riastrad 0x79,0x8e,0x69,0x4b, 0x94,0xd5,0xf4,0x84,
826 1.1 riastrad 0x7b,0xce,0xea,0x2f, 0x9b,0x79,0x7a,0x7c,
827 1.1 riastrad 0x22,0x28,0x4d,0xa1, 0x38,0x1a,0x66,0x24,
828 1.1 riastrad 0x79,0xa3,0xfa,0xfa, 0x8d,0x98,0x7c,0x54,
829 1.1 riastrad 0x71,0x54,0xef,0x37, 0xa6,0xf1,0x97,0x54,
830 1.1 riastrad 0xad,0xe7,0x67,0xa0, 0xf3,0x33,0xcf,0x4f,
831 1.1 riastrad 0x4e,0xa3,0x47,0xee, 0x31,0xd3,0x98,0xf9,
832 1.1 riastrad 0x7f,0x9f,0x44,0x18, 0x2f,0x13,0x1b,0x44,
833 1.1 riastrad 0x57,0xcd,0x15,0x5b, 0xde,0x8f,0x1a,0x3c,
834 1.1 riastrad 0xb5,0x1e,0xa7,0x2d, 0x4d,0xbe,0x85,0x08,
835 1.1 riastrad 0x78,0xeb,0xe2,0x35, 0x3a,0xbe,0x55,0x6b,
836 1.1 riastrad 0xc3,0xe1,0x0f,0x77, 0x43,0x41,0x11,0x5a,
837 1.1 riastrad 0x61,0xc9,0x3b,0xbc, 0xad,0x88,0x9e,0xba,
838 1.1 riastrad 0xc6,0xd2,0xdc,0x87, 0xd9,0x54,0xcc,0x86,
839 1.1 riastrad 0x46,0xe6,0xa5,0x29, 0x2c,0x08,0x49,0x53,
840 1.1 riastrad 0x2c,0xe3,0x0e,0x60, 0xc5,0x48,0xca,0x62,
841 1.1 riastrad 0x3f,0xf6,0x93,0xc1, 0xba,0x8d,0x36,0x49,
842 1.1 riastrad 0xe7,0x0f,0x9c,0x49, 0x7d,0xee,0x2a,0x22,
843 1.1 riastrad 0xc3,0xe5,0x11,0x21, 0xfa,0xc7,0xeb,0x79,
844 1.1 riastrad 0xcc,0x4d,0x75,0x4e, 0x66,0x33,0xf5,0x09,
845 1.1 riastrad 0xa3,0xb9,0x60,0xa5, 0xd6,0xbd,0x38,0x75,
846 1.1 riastrad 0x0c,0x2f,0x5f,0x1f, 0xea,0xa5,0x9d,0x45,
847 1.1 riastrad 0x3c,0xe4,0x41,0xb8, 0xf6,0x4e,0x15,0x87,
848 1.1 riastrad 0x0b,0x7f,0x42,0x4e, 0x51,0x3d,0xc4,0x9a,
849 1.1 riastrad 0xb2,0xca,0x37,0x16, 0x0f,0xed,0x9e,0x0b,
850 1.1 riastrad 0x93,0x86,0x12,0x93, 0x36,0x5e,0x39,0xc4,
851 1.1 riastrad 0xf0,0xf4,0x48,0xdb, 0xeb,0x18,0x5e,0x50,
852 1.1 riastrad 0x71,0x30,0x83,0xe5, 0x0f,0xb1,0x73,0xa7,
853 1.1 riastrad 0xc6,0xf0,0xca,0x29, 0x0e,0xc4,0x07,0x5b,
854 1.1 riastrad 0x8b,0x09,0x68,0x68, 0x10,0x32,0x92,0x62,
855 1.1 riastrad 0x6a,0x6c,0x56,0x8b, 0x01,0x46,0x9a,0x20,
856 1.1 riastrad 0x89,0xe0,0x93,0x85, 0x8c,0x53,0x87,0xf6,
857 1.1 riastrad 0x02,0xd3,0x8d,0x72, 0x31,0x35,0xa1,0x34,
858 1.1 riastrad 0x63,0x70,0x61,0x80, 0x06,0xf1,0x54,0xb3,
859 1.1 riastrad 0x5d,0xdf,0xad,0x9c, 0x7e,0x3a,0xc2,0x8f,
860 1.1 riastrad 0x76,0x8b,0x4c,0x74, 0x2c,0x8c,0x6f,0x0a,
861 1.1 riastrad 0x60,0x13,0xa8,0xce, 0x4c,0x49,0x70,0x90,
862 1.1 riastrad 0x59,0x57,0xf5,0x7b, 0x03,0x94,0x37,0x87,
863 1.1 riastrad 0xfa,0xfe,0xeb,0xe7, 0x2d,0x01,0x45,0x69,
864 1.1 riastrad 0xb4,0x10,0x80,0x6d, 0x13,0x26,0xe3,0x9b,
865 1.1 riastrad 0x49,0x2a,0x0b,0xb1, 0x36,0xf9,0x62,0x63,
866 1.1 riastrad 0x33,0x2a,0xee,0x51, 0x5e,0x35,0xa4,0x2e,
867 1.1 riastrad 0x34,0xa1,0x77,0xac, 0x27,0x99,0x03,0xc6,
868 1.1 riastrad 0xe2,0x83,0x11,0x72, 0x77,0x30,0x8b,0xb7,
869 1.1 riastrad 0xde,0x1a,0xa1,0x4b, 0xa9,0x9c,0x07,0x02,
870 1.1 riastrad 0xf2,0xdc,0x06,0x45, 0xf2,0xab,0x31,0x46,
871 1.1 riastrad 0x50,0x25,0x34,0x54, 0xa8,0x06,0x88,0x6c,
872 1.1 riastrad 0xfc,0x88,0xb5,0xae, 0x30,0xbd,0xe1,0xe7,
873 1.1 riastrad 0xfe,0x51,0x46,0x05, 0x9a,0x29,0xd9,0x93,
874 1.1 riastrad 0x99,0x60,0x69,0x4a, 0x5c,0xb2,0x29,0x6b,
875 1.1 riastrad 0xa1,0xbb,0x9d,0xe4, 0x9b,0x7d,0x4a,0xe5,
876 1.1 riastrad 0x37,0xcb,0x16,0x6f, 0x44,0x93,0xe4,0x71,
877 1.1 riastrad 0x34,0x7b,0x54,0xec, 0x5b,0x2b,0xe0,0xf7,
878 1.1 riastrad 0x32,0xed,0x77,0xa6, 0xb3,0x7c,0x8d,0x1a,
879 1.1 riastrad 0xc0,0x57,0xbe,0x2b, 0x6d,0x7f,0xd7,0x35,
880 1.1 riastrad 0xe6,0x93,0xed,0x90, 0x26,0xfe,0x41,0xf3,
881 1.1 riastrad 0x58,0x55,0x03,0xb7, 0xb2,0x94,0xe2,0x0c,
882 1.1 riastrad 0x34,0xc3,0x06,0xc6, 0x9e,0x4b,0x17,0xc7,
883 1.1 riastrad 0xb9,0x58,0x23,0x58, 0xd3,0x73,0x18,0x5e,
884 1.1 riastrad 0xcf,0x28,0xac,0x90, 0xa0,0xba,0x35,0x90,
885 1.1 riastrad 0x96,0xb3,0xc7,0x6c, 0xe1,0x07,0xdf,0x5d,
886 1.1 riastrad 0xaa,0x2c,0xa6,0x6b, 0x82,0x2d,0x71,0x66,
887 1.1 riastrad 0xb7,0x76,0x37,0xdb, 0x39,0x7f,0x22,0x8f,
888 1.1 riastrad 0x38,0x70,0xd4,0xeb, 0xf8,0xf0,0x73,0xed,
889 1.1 riastrad 0xb6,0x67,0x75,0xaf, 0xd7,0x5d,0x01,0x01,
890 1.1 riastrad 0xc4,0xd6,0x7c,0xbc, 0xc3,0xe6,0xad,0x9a,
891 1.1 riastrad 0x9c,0x6a,0x43,0x9b, 0xfb,0x34,0x55,0x47,
892 1.1 riastrad 0xcd,0xeb,0x4e,0x2c, 0x29,0x6f,0xb0,0xeb,
893 1.1 riastrad 0xb5,0x08,0xdb,0x6b, 0x40,0x26,0x51,0x54,
894 1.1 riastrad 0x5a,0x97,0x64,0x74, 0x95,0xe6,0xae,0x8a,
895 1.1 riastrad 0x4c,0xe9,0x44,0x47, 0x85,0xd6,0xcf,0xe0,
896 1.1 riastrad 0x11,0x65,0x45,0xb3, 0xe1,0xfc,0x6a,0x01,
897 1.1 riastrad 0x38,0x40,0x8a,0x71, 0xc5,0xd6,0x64,0xa8,
898 1.1 riastrad 0x36,0x95,0x44,0x9c, 0x10,0x41,0xa3,0x71,
899 1.1 riastrad 0xb4,0x70,0x02,0xdf, 0xf9,0xad,0x2b,0xec,
900 1.1 riastrad 0x75,0xf7,0x09,0x6c, 0x5d,0x2a,0xd0,0x0b,
901 1.1 riastrad 0x2e,0xb3,0xf0,0xd3, 0xce,0xdb,0x26,0x80,
902 1.1 riastrad },
903 1.1 riastrad .h = {
904 1.1 riastrad 0x2d,0xb3,0x7e,0x73, 0xde,0x6a,0x9e,0xa9,
905 1.1 riastrad 0x54,0x9a,0x0f,0xb3, 0x0b,0xcc,0xc9,0xde,
906 1.1 riastrad 0x7a,0x4e,0x4a,0x71, 0x07,0x33,0xee,0x06,
907 1.1 riastrad 0x5c,0x9a,0xa1,0x30, 0x5e,0x39,0x4e,0x10,
908 1.1 riastrad },
909 1.1 riastrad },
910 1.1 riastrad [2] = { /* 1024-byte message */
911 1.1 riastrad .k = {
912 1.1 riastrad 0x4c,0xe4,0x3c,0x6e, 0xa0,0xe3,0x0e,0x64,
913 1.1 riastrad 0x35,0x44,0x3e,0x0b, 0x4d,0x29,0xbe,0x04,
914 1.1 riastrad 0xa7,0xaa,0x88,0xe0, 0xe0,0x07,0x7d,0xa8,
915 1.1 riastrad 0x2b,0x87,0x7d,0x08, 0xa6,0x59,0xd0,0xa5,
916 1.1 riastrad 0x03,0xae,0x9b,0xee, 0xd4,0x11,0x39,0x7d,
917 1.1 riastrad 0x9e,0x1d,0x89,0xe3, 0xc6,0x92,0x36,0x07,
918 1.1 riastrad 0xa4,0x43,0xad,0x2f, 0xd5,0x71,0x84,0x2d,
919 1.1 riastrad 0xc0,0x37,0xed,0x62, 0x4e,0x2b,0x8c,0xd5,
920 1.1 riastrad 0x1d,0xf7,0x00,0xbb, 0x3d,0x5e,0xcc,0xc5,
921 1.1 riastrad 0x6d,0xdd,0x17,0xf2, 0x89,0x25,0x30,0x16,
922 1.1 riastrad 0x04,0xd7,0x1f,0x84, 0x7d,0x61,0xa0,0x7a,
923 1.1 riastrad 0x49,0x88,0x44,0x46, 0xc6,0x05,0xd1,0xc9,
924 1.1 riastrad 0xa0,0x2a,0x86,0xdd, 0xd3,0x80,0x40,0xa4,
925 1.1 riastrad 0x28,0xb3,0xa4,0x3b, 0x71,0x0a,0x7f,0x2d,
926 1.1 riastrad 0x3b,0xcd,0xe6,0xac, 0x59,0xda,0x43,0x56,
927 1.1 riastrad 0x6e,0x9a,0x3f,0x1e, 0x82,0xcf,0xb3,0xa0,
928 1.1 riastrad 0xa1,0x46,0xcf,0x2e, 0x32,0x05,0xcd,0x68,
929 1.1 riastrad 0xbb,0x51,0x71,0x8a, 0x16,0x75,0xbe,0x49,
930 1.1 riastrad 0x7e,0xb3,0x63,0x30, 0x95,0x34,0xe6,0x85,
931 1.1 riastrad 0x7e,0x9a,0xdd,0xe6, 0x43,0xd6,0x59,0xf8,
932 1.1 riastrad 0x6a,0xb8,0x8f,0x5f, 0x5d,0xd9,0x55,0x41,
933 1.1 riastrad 0x12,0xf9,0x98,0xc6, 0x93,0x7c,0x3f,0x46,
934 1.1 riastrad 0xab,0x7c,0x8b,0x28, 0xde,0x9a,0xb1,0xf0,
935 1.1 riastrad 0x6c,0x43,0x2a,0xb3, 0x70,0xc5,0x9d,0xc0,
936 1.1 riastrad 0x26,0xcf,0xad,0x9c, 0x87,0x9b,0x3f,0x7c,
937 1.1 riastrad 0x24,0xac,0xe7,0xd4, 0xe8,0x14,0xe3,0x3e,
938 1.1 riastrad 0xf6,0x8a,0x97,0x87, 0x63,0x2c,0x88,0xdc,
939 1.1 riastrad 0xc5,0x23,0x68,0x6e, 0x94,0xe1,0x09,0xc4,
940 1.1 riastrad 0x44,0xda,0x8f,0xa7, 0x9f,0xc4,0x52,0xa4,
941 1.1 riastrad 0x18,0x1d,0x3c,0x08, 0xca,0x0a,0x3e,0xb4,
942 1.1 riastrad 0xbf,0xbe,0xc6,0x47, 0xe2,0x89,0x2b,0x07,
943 1.1 riastrad 0x71,0xd9,0xc8,0x6a, 0x06,0xd5,0xd0,0x47,
944 1.1 riastrad 0x4e,0x07,0x4f,0x6b, 0xdb,0xdf,0x3d,0xf0,
945 1.1 riastrad 0x7c,0x5f,0x49,0x70, 0x17,0x4f,0x9f,0x33,
946 1.1 riastrad 0x7e,0x4b,0x72,0x3b, 0x8c,0x68,0x22,0xf9,
947 1.1 riastrad 0xd2,0xad,0xe4,0xe4, 0xb2,0x61,0x9d,0xb8,
948 1.1 riastrad 0xc2,0x5c,0xf0,0x3b, 0x08,0xb2,0x75,0x30,
949 1.1 riastrad 0x3a,0xd0,0x7d,0xf9, 0xb2,0x00,0x40,0x56,
950 1.1 riastrad 0x79,0xe2,0x0d,0x31, 0x72,0xe2,0xc2,0xd1,
951 1.1 riastrad 0x2e,0x27,0xe7,0xc8, 0x96,0x1a,0xc6,0x7e,
952 1.1 riastrad 0xb8,0xc1,0x93,0xfb, 0x1d,0xbc,0xed,0x97,
953 1.1 riastrad 0x2f,0x2f,0xea,0xa1, 0x40,0x49,0xf6,0x1d,
954 1.1 riastrad 0xab,0x54,0x46,0x2e, 0x73,0xf2,0x74,0xf1,
955 1.1 riastrad 0x6d,0x5c,0xe6,0xa0, 0xd4,0x73,0x1c,0xbc,
956 1.1 riastrad 0x07,0x81,0xf5,0x94, 0xe6,0x18,0xdc,0x42,
957 1.1 riastrad 0x68,0xb9,0xeb,0xfb, 0xa3,0x76,0x8c,0x83,
958 1.1 riastrad 0x98,0xe9,0x96,0xa6, 0xa6,0x5e,0x0e,0xd1,
959 1.1 riastrad 0xfc,0xb7,0x8e,0x8b, 0x9e,0xa4,0x00,0x76,
960 1.1 riastrad 0x0e,0x35,0x92,0x5e, 0x05,0xa1,0x92,0xc4,
961 1.1 riastrad 0x0c,0xd1,0xec,0x8c, 0x04,0x8e,0x65,0x56,
962 1.1 riastrad 0x43,0xae,0x16,0x18, 0x2e,0x3e,0xfe,0x47,
963 1.1 riastrad 0x92,0xe1,0x76,0x1b, 0xb6,0xcc,0x0b,0x82,
964 1.1 riastrad 0xe1,0x8c,0x7b,0x43, 0xe4,0x90,0xed,0x28,
965 1.1 riastrad 0x0b,0xe6,0x05,0xea, 0x4a,0xc0,0xf1,0x12,
966 1.1 riastrad 0x54,0x09,0x93,0xda, 0xfc,0xf4,0x86,0xff,
967 1.1 riastrad 0x4c,0xaa,0x7d,0xbe, 0xd0,0x4a,0xa6,0x9d,
968 1.1 riastrad 0x6b,0x27,0x8f,0xb1, 0xb5,0x3a,0x9b,0xce,
969 1.1 riastrad 0xe2,0x5c,0x29,0x35, 0xd6,0xe7,0xf3,0xa4,
970 1.1 riastrad 0x5e,0x70,0xf6,0xc6, 0xde,0x63,0x86,0xf7,
971 1.1 riastrad 0xc9,0xab,0x42,0xb9, 0xe7,0x5d,0x1c,0x68,
972 1.1 riastrad 0x73,0xa3,0xed,0xb0, 0xa0,0xb6,0x18,0x15,
973 1.1 riastrad 0xe6,0x57,0x4c,0x21, 0xf7,0xf3,0xc6,0x32,
974 1.1 riastrad 0x4d,0x07,0x4a,0x14, 0xde,0xb2,0xc7,0xca,
975 1.1 riastrad 0xf0,0x78,0xc4,0x85, 0xe3,0xdc,0xfb,0x35,
976 1.1 riastrad 0x7c,0x6b,0xc0,0xb8, 0xcd,0x7a,0x22,0xfc,
977 1.1 riastrad 0xe4,0xe8,0xe2,0x98, 0x6c,0x8e,0xdf,0x37,
978 1.1 riastrad 0x8e,0x0f,0x25,0x23, 0xdd,0xea,0x40,0x6f,
979 1.1 riastrad 0xb3,0x07,0x7e,0x7a, 0x6b,0xa1,0xa1,0xcf,
980 1.1 riastrad 0x24,0xd9,0xad,0x72, 0x7a,0x45,0x49,0xca,
981 1.1 riastrad 0xfe,0xc7,0x2e,0x6d, 0xaa,0xc1,0x08,0x2c,
982 1.1 riastrad 0xe6,0xde,0xde,0x73, 0x01,0x9c,0xdc,0x65,
983 1.1 riastrad 0x3a,0xdf,0xc6,0x15, 0x37,0x62,0x0b,0x2c,
984 1.1 riastrad 0x9a,0x36,0xed,0x37, 0xd9,0xfc,0xa9,0xb3,
985 1.1 riastrad 0x32,0xc3,0xde,0x26, 0xe7,0xf0,0x3f,0x02,
986 1.1 riastrad 0xed,0x35,0x74,0xea, 0xdd,0x32,0xe9,0x96,
987 1.1 riastrad 0x75,0x66,0xb8,0xf0, 0x75,0x98,0x8f,0x3a,
988 1.1 riastrad 0xd0,0xc2,0xa1,0x98, 0x5f,0xf9,0x32,0x31,
989 1.1 riastrad 0x00,0x18,0x7d,0xc5, 0x9d,0x15,0x5b,0xdc,
990 1.1 riastrad 0x13,0x37,0x69,0xfc, 0x95,0x7a,0x62,0x0e,
991 1.1 riastrad 0x8a,0x86,0xed,0x18, 0x78,0x3c,0x49,0xf4,
992 1.1 riastrad 0x18,0x73,0xcd,0x2e, 0x7b,0xa3,0x40,0xd7,
993 1.1 riastrad 0x01,0xf6,0xc7,0x2a, 0xc5,0xce,0x13,0x09,
994 1.1 riastrad 0xb1,0xe5,0x25,0x17, 0xdf,0x9d,0x7e,0x0b,
995 1.1 riastrad 0x50,0x46,0x62,0x78, 0xb5,0x25,0xb2,0xd9,
996 1.1 riastrad 0x65,0xfa,0x5b,0xf7, 0xfe,0xc6,0xe0,0x7b,
997 1.1 riastrad 0x7b,0x4e,0x14,0x2e, 0x0d,0x3a,0xd0,0xe0,
998 1.1 riastrad 0xa0,0xd2,0xeb,0x4d, 0x87,0x11,0x42,0x28,
999 1.1 riastrad 0x02,0x7e,0xa8,0x56, 0x5b,0x53,0xbd,0x76,
1000 1.1 riastrad 0x47,0x8f,0x5f,0x8b, 0xc7,0xd9,0x72,0xf7,
1001 1.1 riastrad 0x11,0xbb,0x94,0xdb, 0x0d,0x07,0xb7,0x0a,
1002 1.1 riastrad 0xcc,0x41,0x00,0xcd, 0xd0,0x50,0x25,0x31,
1003 1.1 riastrad 0xc9,0x47,0x6b,0xdd, 0x3f,0x70,0x24,0x3e,
1004 1.1 riastrad 0xde,0x02,0x62,0x6c, 0xb4,0x44,0x92,0x8e,
1005 1.1 riastrad 0x98,0x9c,0x0e,0x30, 0x2f,0x80,0xb9,0x5e,
1006 1.1 riastrad 0x75,0x90,0xa6,0x02, 0xf0,0xed,0xb0,0x8b,
1007 1.1 riastrad 0x44,0xa3,0x59,0x2d, 0xc3,0x08,0xe5,0xd9,
1008 1.1 riastrad 0x89,0x6a,0x71,0x44, 0x04,0xc4,0xb2,0x61,
1009 1.1 riastrad 0x5b,0xf5,0x46,0x44, 0xdc,0x36,0x2e,0xfd,
1010 1.1 riastrad 0x41,0xf5,0xa1,0x3a, 0xb3,0x93,0x74,0x7d,
1011 1.1 riastrad 0x54,0x5e,0x64,0xdc, 0xbc,0xd7,0x07,0x48,
1012 1.1 riastrad 0x3e,0x73,0x81,0x22, 0x9c,0x5a,0xf6,0xde,
1013 1.1 riastrad 0x94,0x42,0xe1,0x6c, 0x92,0xe7,0x6d,0xa0,
1014 1.1 riastrad 0x5e,0xc3,0xd6,0xe9, 0x84,0xd9,0xba,0x57,
1015 1.1 riastrad 0xef,0x85,0x6a,0x9b, 0xe6,0x9a,0x2b,0xf8,
1016 1.1 riastrad 0x8d,0xfe,0x9d,0xad, 0x70,0x26,0x05,0x14,
1017 1.1 riastrad 0x45,0x07,0xcb,0x72, 0xd4,0x8b,0x14,0x44,
1018 1.1 riastrad 0x74,0x40,0x9c,0x29, 0x8b,0xba,0x40,0x09,
1019 1.1 riastrad 0x52,0xfc,0xc5,0x40, 0xb1,0x25,0x69,0xaa,
1020 1.1 riastrad 0x8f,0x12,0xc4,0xc6, 0x2b,0x3f,0x73,0x9d,
1021 1.1 riastrad 0xff,0x52,0xd4,0xac, 0x77,0x43,0xdc,0xd2,
1022 1.1 riastrad 0x06,0x9a,0x1b,0xfc, 0x0c,0x8f,0x6b,0x59,
1023 1.1 riastrad 0xa5,0xd4,0xde,0x06, 0x16,0x34,0xef,0x75,
1024 1.1 riastrad 0x22,0x54,0x9c,0x53, 0x38,0x0b,0x57,0xc7,
1025 1.1 riastrad 0xaa,0x78,0x2d,0x3a, 0x9b,0xdd,0xed,0xb5,
1026 1.1 riastrad 0x0b,0xb0,0x08,0x5f, 0x57,0xdb,0xfc,0xbe,
1027 1.1 riastrad 0x44,0xfd,0x71,0x5f, 0x71,0x14,0xd5,0x14,
1028 1.1 riastrad 0x70,0xb6,0xee,0xd0, 0xf3,0x37,0x6f,0x57,
1029 1.1 riastrad 0x55,0x3c,0x7c,0x23, 0x6f,0xbe,0x83,0x5c,
1030 1.1 riastrad 0xb5,0x64,0xfd,0x6d, 0x7c,0xe4,0x05,0x2b,
1031 1.1 riastrad 0xdb,0xc4,0xf5,0xa0, 0xd3,0xa6,0x15,0x48,
1032 1.1 riastrad 0xc2,0x50,0xf8,0xf7, 0xc2,0xab,0xb5,0x6a,
1033 1.1 riastrad 0x0d,0x1a,0xb5,0x30, 0x33,0xf8,0x12,0x2d,
1034 1.1 riastrad 0xfb,0xa6,0x2e,0xe5, 0xbe,0x40,0xba,0x48,
1035 1.1 riastrad 0xef,0x05,0xc8,0x37, 0x3a,0x36,0xad,0x99,
1036 1.1 riastrad 0x77,0x87,0x84,0xac, 0xd8,0xcb,0x7a,0x88,
1037 1.1 riastrad 0x3e,0x2d,0x8b,0xbe, 0x9a,0x35,0x88,0x26,
1038 1.1 riastrad 0xe9,0x20,0xd4,0x66, 0x80,0x8b,0xf8,0x54,
1039 1.1 riastrad 0xba,0xcd,0xa8,0x47, 0x35,0x1b,0xc4,0x09,
1040 1.1 riastrad 0x6d,0xff,0x0e,0x60, 0x7c,0xf3,0x68,0xbf,
1041 1.1 riastrad 0xe3,0xe9,0x73,0x07, 0x84,0xf0,0x08,0x45,
1042 1.1 riastrad 0x97,0x65,0x94,0xd1, 0x35,0x4e,0x67,0x0c,
1043 1.1 riastrad 0xe3,0xb7,0x61,0x7b, 0x09,0x22,0xed,0x18,
1044 1.1 riastrad 0xee,0x0b,0x54,0xc0, 0xab,0x8b,0xaa,0x71,
1045 1.1 riastrad 0x4c,0x40,0xbf,0xf7, 0xe0,0x7e,0x08,0xaa,
1046 1.1 riastrad },
1047 1.1 riastrad .mlen = 1024,
1048 1.1 riastrad .m = {
1049 1.1 riastrad 0x1d,0xea,0xe5,0x2b, 0x4c,0x22,0x4d,0xf3,
1050 1.1 riastrad 0x15,0x53,0xcb,0x41, 0xf5,0xcf,0x0b,0x7b,
1051 1.1 riastrad 0xc9,0x80,0xc0,0x95, 0xd2,0x7b,0x08,0x4b,
1052 1.1 riastrad 0x3d,0xcd,0xd8,0x3b, 0x2f,0x18,0xd4,0x70,
1053 1.1 riastrad 0x38,0xb2,0xa7,0x2f, 0x7f,0xba,0xd8,0xed,
1054 1.1 riastrad 0xbc,0x8f,0xac,0xe4, 0xe2,0x11,0x2d,0x6d,
1055 1.1 riastrad 0xe6,0xa4,0x36,0x90, 0xc2,0x7f,0xdf,0xe3,
1056 1.1 riastrad 0xdc,0x50,0xdb,0x6c, 0x56,0xcf,0x7d,0xd6,
1057 1.1 riastrad 0xd0,0xcb,0xd6,0x9b, 0x01,0xbb,0xef,0x1c,
1058 1.1 riastrad 0x0a,0x6c,0x92,0x23, 0xeb,0x77,0xf9,0xd1,
1059 1.1 riastrad 0x25,0xdc,0x94,0x30, 0x30,0xa4,0x96,0x3e,
1060 1.1 riastrad 0xdf,0x52,0x4c,0xe7, 0xdf,0x27,0x9f,0x73,
1061 1.1 riastrad 0x78,0x0c,0x8c,0x7f, 0x9d,0xae,0x79,0x5d,
1062 1.1 riastrad 0x91,0x5e,0x4b,0x02, 0xa9,0x31,0x9c,0xff,
1063 1.1 riastrad 0x46,0x73,0xec,0x0d, 0x5a,0xb8,0xeb,0x48,
1064 1.1 riastrad 0x19,0x9c,0x44,0xe0, 0xc8,0x81,0x96,0x4c,
1065 1.1 riastrad 0x47,0x0c,0xe7,0x1d, 0x2a,0x9c,0xd5,0xe0,
1066 1.1 riastrad 0xe7,0xd6,0xa0,0x88, 0xf0,0xf6,0xda,0xa7,
1067 1.1 riastrad 0x6a,0xdd,0xfd,0x4f, 0x00,0x6e,0x25,0x7d,
1068 1.1 riastrad 0xb9,0x81,0x19,0x2f, 0x4e,0xcc,0x8d,0x6e,
1069 1.1 riastrad 0xa6,0x92,0xcf,0xd8, 0x6e,0x78,0x0a,0xf6,
1070 1.1 riastrad 0x8a,0x43,0xeb,0x60, 0x0c,0x8b,0x93,0x50,
1071 1.1 riastrad 0x88,0xd1,0x67,0x05, 0x0c,0xdc,0x43,0x85,
1072 1.1 riastrad 0x50,0x91,0x63,0xa4, 0x32,0x14,0x66,0x84,
1073 1.1 riastrad 0xdb,0x04,0x9f,0x77, 0x95,0x60,0x19,0xc6,
1074 1.1 riastrad 0x98,0x60,0x62,0xe4, 0xc6,0xee,0x70,0x76,
1075 1.1 riastrad 0xb0,0x59,0x80,0x59, 0x46,0xae,0x99,0x26,
1076 1.1 riastrad 0x62,0x4a,0xf0,0x45, 0x8f,0xf0,0x70,0x5b,
1077 1.1 riastrad 0x52,0xfc,0xee,0x4d, 0x30,0x47,0xc8,0xae,
1078 1.1 riastrad 0xe2,0xbc,0x2c,0x73, 0x78,0x67,0xf1,0x00,
1079 1.1 riastrad 0xb4,0xda,0x01,0xad, 0x3b,0xc4,0x5c,0x6c,
1080 1.1 riastrad 0x65,0xca,0x84,0x22, 0x95,0x32,0x95,0x20,
1081 1.1 riastrad 0x4d,0xdc,0x96,0x2e, 0x61,0xe4,0xc8,0xec,
1082 1.1 riastrad 0x2d,0xbf,0xc1,0x5d, 0x70,0xf9,0x75,0xf2,
1083 1.1 riastrad 0xad,0x0a,0xc9,0xd7, 0x0a,0x81,0x3c,0xa1,
1084 1.1 riastrad 0x13,0xec,0x63,0xd4, 0xd0,0x67,0xf4,0xcc,
1085 1.1 riastrad 0x6e,0xb8,0x52,0x08, 0x46,0xc9,0x2a,0x92,
1086 1.1 riastrad 0x59,0xd9,0x14,0x17, 0xde,0x2f,0xc7,0x36,
1087 1.1 riastrad 0xd5,0xd5,0xfc,0x8a, 0x63,0xd5,0x5f,0xe3,
1088 1.1 riastrad 0xdd,0x55,0x00,0x8e, 0x5e,0xc9,0xed,0x04,
1089 1.1 riastrad 0x1d,0xeb,0xae,0xc5, 0xd0,0xf9,0x73,0x28,
1090 1.1 riastrad 0xf3,0x81,0xd5,0xb4, 0x60,0xb2,0x42,0x81,
1091 1.1 riastrad 0x68,0xf3,0xb9,0x73, 0x07,0x2e,0x34,0x8e,
1092 1.1 riastrad 0x47,0x12,0xae,0x7c, 0xa8,0xc2,0xce,0xad,
1093 1.1 riastrad 0x0f,0x6e,0x44,0xa5, 0x35,0x5e,0x61,0x6b,
1094 1.1 riastrad 0xfc,0x67,0x9c,0x82, 0xa1,0xd2,0xff,0xfe,
1095 1.1 riastrad 0x60,0x7c,0x40,0x02, 0x24,0x9e,0x8b,0x90,
1096 1.1 riastrad 0xa0,0x89,0xd9,0x83, 0x04,0xd8,0xef,0x9c,
1097 1.1 riastrad 0x96,0x28,0x77,0x3e, 0xe3,0xb0,0xf8,0x3d,
1098 1.1 riastrad 0xfb,0x91,0x8f,0x6f, 0x83,0x58,0x1e,0x4b,
1099 1.1 riastrad 0x64,0xc7,0xf6,0xe0, 0x85,0x03,0xe3,0xf9,
1100 1.1 riastrad 0x6b,0xc9,0x9e,0x9d, 0x57,0x25,0xe4,0x69,
1101 1.1 riastrad 0x08,0x59,0x28,0x4a, 0x52,0x9c,0x49,0x19,
1102 1.1 riastrad 0x24,0x49,0xba,0xb1, 0x82,0xd4,0xcf,0xd0,
1103 1.1 riastrad 0x1e,0x1d,0xc2,0x02, 0x42,0x4e,0xdf,0xf7,
1104 1.1 riastrad 0x2b,0x3d,0x99,0xf6, 0x99,0xa4,0x3a,0xe1,
1105 1.1 riastrad 0x9d,0x68,0xc8,0x08, 0xec,0xec,0x1c,0xa8,
1106 1.1 riastrad 0x41,0x4a,0x27,0x84, 0xe9,0x0d,0x95,0x54,
1107 1.1 riastrad 0x1a,0xca,0x5f,0x5d, 0x5a,0x96,0xb9,0x5b,
1108 1.1 riastrad 0x6e,0xbc,0x39,0x7f, 0x7a,0x20,0xc5,0xb2,
1109 1.1 riastrad 0x60,0x0c,0xa3,0x78, 0xc3,0x2b,0x87,0xcc,
1110 1.1 riastrad 0xea,0xb0,0x4d,0x27, 0xfb,0x6c,0x58,0x51,
1111 1.1 riastrad 0xce,0x90,0xca,0xd6, 0x86,0x91,0x4d,0x2c,
1112 1.1 riastrad 0x8c,0x82,0xf0,0xc9, 0x9a,0x0a,0x73,0xb3,
1113 1.1 riastrad 0xcb,0xa9,0xd4,0x26, 0x4d,0x74,0xbe,0x0e,
1114 1.1 riastrad 0x4a,0x6e,0x10,0xeb, 0x4e,0xba,0x4e,0xba,
1115 1.1 riastrad 0x0d,0x26,0x69,0x87, 0x5e,0x08,0x2b,0x43,
1116 1.1 riastrad 0xbe,0x97,0x4e,0x2a, 0x63,0xbc,0x52,0xb7,
1117 1.1 riastrad 0xda,0x23,0x23,0x11, 0xfa,0xcf,0x89,0xac,
1118 1.1 riastrad 0x90,0x5f,0x60,0x7a, 0x50,0xb7,0xbe,0x79,
1119 1.1 riastrad 0x0b,0x2c,0xf0,0x27, 0xf0,0xfb,0xaf,0x64,
1120 1.1 riastrad 0xc8,0x57,0x7c,0xeb, 0x1c,0xf7,0x36,0xec,
1121 1.1 riastrad 0x09,0x97,0x66,0x31, 0x54,0xe4,0x00,0xcf,
1122 1.1 riastrad 0x68,0x24,0x77,0x1a, 0xbc,0x27,0x3a,0xad,
1123 1.1 riastrad 0x8a,0x01,0x7e,0x45, 0xe7,0xe4,0xa4,0xeb,
1124 1.1 riastrad 0x38,0x62,0x9d,0x90, 0xea,0x00,0x9c,0x03,
1125 1.1 riastrad 0x5e,0xb2,0x7d,0xd8, 0x2f,0xe9,0xc9,0x3c,
1126 1.1 riastrad 0x1a,0x5c,0x21,0x1a, 0x59,0x45,0x62,0x47,
1127 1.1 riastrad 0x93,0x1b,0xdc,0xd8, 0x3e,0x07,0x8b,0x75,
1128 1.1 riastrad 0xd0,0x6d,0xcc,0x8d, 0xec,0x79,0xa8,0x9a,
1129 1.1 riastrad 0x51,0xa5,0x50,0x18, 0xae,0x44,0x93,0x75,
1130 1.1 riastrad 0xc1,0xc8,0x1e,0x10, 0x59,0x1e,0x0b,0xb3,
1131 1.1 riastrad 0x06,0x30,0xa8,0x66, 0x8d,0x8e,0xd6,0x4d,
1132 1.1 riastrad 0x0d,0x8a,0xb4,0x28, 0xdc,0xfb,0x5d,0x59,
1133 1.1 riastrad 0xe0,0x92,0x77,0x38, 0xfa,0xad,0x46,0x46,
1134 1.1 riastrad 0x25,0x15,0x4c,0xca, 0x09,0x2b,0x31,0xe9,
1135 1.1 riastrad 0x36,0xe8,0xc2,0x67, 0x34,0x4d,0x5e,0xa0,
1136 1.1 riastrad 0x8f,0x9a,0xe8,0x7f, 0xf2,0x2a,0x92,0x78,
1137 1.1 riastrad 0xde,0x09,0x75,0xe7, 0xe5,0x50,0x0a,0x2e,
1138 1.1 riastrad 0x88,0x63,0xc0,0x8f, 0xa8,0x73,0x0f,0xe5,
1139 1.1 riastrad 0x1e,0x9d,0xdb,0xce, 0x53,0xe0,0x42,0x94,
1140 1.1 riastrad 0x7b,0x5c,0xa1,0x5e, 0x1e,0x8f,0x0a,0x6e,
1141 1.1 riastrad 0x8b,0x1a,0xad,0x93, 0x70,0x86,0xf1,0x69,
1142 1.1 riastrad 0x70,0x93,0x24,0xe3, 0x83,0x2f,0xa8,0x04,
1143 1.1 riastrad 0xba,0x27,0x0a,0x2e, 0x03,0xeb,0x69,0xd9,
1144 1.1 riastrad 0x56,0x0e,0xc4,0x10, 0x55,0x31,0x2c,0x3f,
1145 1.1 riastrad 0xd1,0xb2,0x94,0x0f, 0x28,0x15,0x3c,0x02,
1146 1.1 riastrad 0x15,0x5e,0xec,0x26, 0x9c,0xc3,0xfc,0xa7,
1147 1.1 riastrad 0x5c,0xb0,0xfa,0xc0, 0x02,0xf9,0x01,0x3f,
1148 1.1 riastrad 0x01,0x73,0x24,0x22, 0x50,0x28,0x2a,0xca,
1149 1.1 riastrad 0xb1,0xf2,0x03,0x00, 0x2f,0xc6,0x6f,0x28,
1150 1.1 riastrad 0x4f,0x4b,0x4f,0x1a, 0x9a,0xb8,0x16,0x93,
1151 1.1 riastrad 0x31,0x60,0x7c,0x3d, 0x35,0xc8,0xd6,0x90,
1152 1.1 riastrad 0xde,0x8c,0x89,0x39, 0xbd,0x21,0x11,0x05,
1153 1.1 riastrad 0xe8,0xc4,0x04,0x3b, 0x65,0xa5,0x15,0xcf,
1154 1.1 riastrad 0xcf,0x15,0x14,0xf6, 0xe7,0x2e,0x3c,0x47,
1155 1.1 riastrad 0x59,0x0b,0xaa,0xc0, 0xd4,0xab,0x04,0x14,
1156 1.1 riastrad 0x9c,0xd7,0xe2,0x43, 0xc7,0x87,0x09,0x03,
1157 1.1 riastrad 0x27,0xd2,0x0a,0xff, 0x8d,0xd5,0x80,0x34,
1158 1.1 riastrad 0x93,0xa2,0x2c,0xb1, 0x4e,0x16,0x2d,0x82,
1159 1.1 riastrad 0x51,0x5c,0x3c,0xe5, 0x75,0x51,0x7b,0xb4,
1160 1.1 riastrad 0xd8,0x1e,0x59,0x98, 0x0f,0x75,0xed,0x02,
1161 1.1 riastrad 0x1c,0x13,0xf6,0x02, 0xda,0xf9,0x47,0xf7,
1162 1.1 riastrad 0x45,0x25,0x0f,0x58, 0x22,0x5d,0xef,0xf0,
1163 1.1 riastrad 0x1b,0xdb,0xae,0xaf, 0xbe,0xc6,0xe1,0xcd,
1164 1.1 riastrad 0x70,0x46,0x6e,0x03, 0x9a,0x20,0x77,0x00,
1165 1.1 riastrad 0x3c,0x32,0xb5,0x8f, 0x04,0xb6,0x6f,0xa2,
1166 1.1 riastrad 0x31,0xc9,0x7c,0xf9, 0x84,0x67,0x87,0xfb,
1167 1.1 riastrad 0x7b,0x13,0xb0,0x4d, 0x35,0xfd,0x37,0x5b,
1168 1.1 riastrad 0xf4,0x25,0xf0,0x02, 0x74,0xa0,0x69,0xd4,
1169 1.1 riastrad 0x53,0x61,0x4b,0x54, 0x68,0x94,0x0e,0x08,
1170 1.1 riastrad 0x25,0x82,0x90,0xfc, 0x25,0xb6,0x63,0xe2,
1171 1.1 riastrad 0x07,0x9f,0x42,0xf1, 0xbb,0x33,0xea,0xab,
1172 1.1 riastrad 0x92,0x54,0x2b,0x9f, 0x88,0xc0,0x31,0x2b,
1173 1.1 riastrad 0xfd,0x36,0x50,0x80, 0xfc,0x1a,0xff,0xab,
1174 1.1 riastrad 0xe8,0xc4,0x7f,0xb6, 0x98,0xb9,0x2e,0x17,
1175 1.1 riastrad 0xca,0x28,0x3d,0xdf, 0x0f,0x07,0x43,0x20,
1176 1.1 riastrad 0xf0,0x07,0xea,0xe5, 0xcd,0x4e,0x81,0x34,
1177 1.1 riastrad },
1178 1.1 riastrad .h = {
1179 1.1 riastrad 0x9d,0x22,0x88,0xfd, 0x41,0x43,0x88,0x45,
1180 1.1 riastrad 0x34,0xfe,0x85,0xc4, 0xb9,0xff,0xe1,0x55,
1181 1.1 riastrad 0x40,0x1d,0x25,0x37, 0xd1,0xf8,0xfc,0x2b,
1182 1.1 riastrad 0x3a,0xf5,0x3b,0x69, 0xbf,0xa6,0x9d,0xed,
1183 1.1 riastrad },
1184 1.1 riastrad },
1185 1.1 riastrad };
1186 1.1 riastrad static uint32_t k[268];
1187 1.1 riastrad uint8_t h[32];
1188 1.1 riastrad unsigned i, j;
1189 1.1 riastrad int result = 0;
1190 1.1 riastrad
1191 1.1 riastrad for (i = 0; i < __arraycount(C); i++) {
1192 1.1 riastrad for (j = 0; j < 268; j++)
1193 1.1 riastrad k[j] = le32dec(C[i].k + 4*j);
1194 1.1 riastrad nh(h, C[i].m, C[i].mlen, k);
1195 1.1 riastrad if (memcmp(h, C[i].h, 32)) {
1196 1.1 riastrad char prefix[10];
1197 1.1 riastrad snprintf(prefix, sizeof prefix, "nh %u", i);
1198 1.1 riastrad hexdump(printf, prefix, h, 32);
1199 1.1 riastrad result = -1;
1200 1.1 riastrad }
1201 1.1 riastrad }
1202 1.1 riastrad
1203 1.1 riastrad return result;
1204 1.1 riastrad }
1205 1.1 riastrad
1206 1.1 riastrad /* https://github.com/google/adiantum/blob/a5ad5134ab11b10a3ee982c52385953fac88fedc/test_vectors/ours/NHPoly1305/NHPoly1305.json */
1208 1.1 riastrad static int
1209 1.1 riastrad nhpoly1305_selftest(void)
1210 1.1 riastrad {
1211 1.1 riastrad static const struct {
1212 1.1 riastrad uint8_t k[1088];
1213 1.1 riastrad unsigned mlen;
1214 1.1 riastrad uint8_t m[1024];
1215 1.1 riastrad uint8_t h[16];
1216 1.1 riastrad } C[] = {
1217 1.1 riastrad [0] = { /* 0-byte message */
1218 1.1 riastrad .k = {
1219 1.1 riastrad /* Poly1305 key */
1220 1.1 riastrad 0xd2,0x5d,0x4c,0xdd, 0x8d,0x2b,0x7f,0x7a,
1221 1.1 riastrad 0xd9,0xbe,0x71,0xec, 0xd1,0x83,0x52,0xe3,
1222 1.1 riastrad
1223 1.1 riastrad /* NH key */
1224 1.1 riastrad 0xe1,0xad,0xd7,0x5c, 0x0a,0x75,0x9d,0xec,
1225 1.1 riastrad 0x1d,0x13,0x7e,0x5d, 0x71,0x07,0xc9,0xe4,
1226 1.1 riastrad 0x57,0x2d,0x44,0x68, 0xcf,0xd8,0xd6,0xc5,
1227 1.1 riastrad 0x39,0x69,0x7d,0x32, 0x75,0x51,0x4f,0x7e,
1228 1.1 riastrad 0xb2,0x4c,0xc6,0x90, 0x51,0x6e,0xd9,0xd6,
1229 1.1 riastrad 0xa5,0x8b,0x2d,0xf1, 0x94,0xf9,0xf7,0x5e,
1230 1.1 riastrad 0x2c,0x84,0x7b,0x41, 0x0f,0x88,0x50,0x89,
1231 1.1 riastrad 0x30,0xd9,0xa1,0x38, 0x46,0x6c,0xc0,0x4f,
1232 1.1 riastrad 0xe8,0xdf,0xdc,0x66, 0xab,0x24,0x43,0x41,
1233 1.1 riastrad 0x91,0x55,0x29,0x65, 0x86,0x28,0x5e,0x45,
1234 1.1 riastrad 0xd5,0x2d,0xb7,0x80, 0x08,0x9a,0xc3,0xd4,
1235 1.1 riastrad 0x9a,0x77,0x0a,0xd4, 0xef,0x3e,0xe6,0x3f,
1236 1.1 riastrad 0x6f,0x2f,0x9b,0x3a, 0x7d,0x12,0x1e,0x80,
1237 1.1 riastrad 0x6c,0x44,0xa2,0x25, 0xe1,0xf6,0x60,0xe9,
1238 1.1 riastrad 0x0d,0xaf,0xc5,0x3c, 0xa5,0x79,0xae,0x64,
1239 1.1 riastrad 0xbc,0xa0,0x39,0xa3, 0x4d,0x10,0xe5,0x4d,
1240 1.1 riastrad 0xd5,0xe7,0x89,0x7a, 0x13,0xee,0x06,0x78,
1241 1.1 riastrad 0xdc,0xa4,0xdc,0x14, 0x27,0xe6,0x49,0x38,
1242 1.1 riastrad 0xd0,0xe0,0x45,0x25, 0x36,0xc5,0xf4,0x79,
1243 1.1 riastrad 0x2e,0x9a,0x98,0x04, 0xe4,0x2b,0x46,0x52,
1244 1.1 riastrad 0x7c,0x33,0xca,0xe2, 0x56,0x51,0x50,0xe2,
1245 1.1 riastrad 0xa5,0x9a,0xae,0x18, 0x6a,0x13,0xf8,0xd2,
1246 1.1 riastrad 0x21,0x31,0x66,0x02, 0xe2,0xda,0x8d,0x7e,
1247 1.1 riastrad 0x41,0x19,0xb2,0x61, 0xee,0x48,0x8f,0xf1,
1248 1.1 riastrad 0x65,0x24,0x2e,0x1e, 0x68,0xce,0x05,0xd9,
1249 1.1 riastrad 0x2a,0xcf,0xa5,0x3a, 0x57,0xdd,0x35,0x91,
1250 1.1 riastrad 0x93,0x01,0xca,0x95, 0xfc,0x2b,0x36,0x04,
1251 1.1 riastrad 0xe6,0x96,0x97,0x28, 0xf6,0x31,0xfe,0xa3,
1252 1.1 riastrad 0x9d,0xf6,0x6a,0x1e, 0x80,0x8d,0xdc,0xec,
1253 1.1 riastrad 0xaf,0x66,0x11,0x13, 0x02,0x88,0xd5,0x27,
1254 1.1 riastrad 0x33,0xb4,0x1a,0xcd, 0xa3,0xf6,0xde,0x31,
1255 1.1 riastrad 0x8e,0xc0,0x0e,0x6c, 0xd8,0x5a,0x97,0x5e,
1256 1.1 riastrad 0xdd,0xfd,0x60,0x69, 0x38,0x46,0x3f,0x90,
1257 1.1 riastrad 0x5e,0x97,0xd3,0x32, 0x76,0xc7,0x82,0x49,
1258 1.1 riastrad 0xfe,0xba,0x06,0x5f, 0x2f,0xa2,0xfd,0xff,
1259 1.1 riastrad 0x80,0x05,0x40,0xe4, 0x33,0x03,0xfb,0x10,
1260 1.1 riastrad 0xc0,0xde,0x65,0x8c, 0xc9,0x8d,0x3a,0x9d,
1261 1.1 riastrad 0xb5,0x7b,0x36,0x4b, 0xb5,0x0c,0xcf,0x00,
1262 1.1 riastrad 0x9c,0x87,0xe4,0x49, 0xad,0x90,0xda,0x4a,
1263 1.1 riastrad 0xdd,0xbd,0xff,0xe2, 0x32,0x57,0xd6,0x78,
1264 1.1 riastrad 0x36,0x39,0x6c,0xd3, 0x5b,0x9b,0x88,0x59,
1265 1.1 riastrad 0x2d,0xf0,0x46,0xe4, 0x13,0x0e,0x2b,0x35,
1266 1.1 riastrad 0x0d,0x0f,0x73,0x8a, 0x4f,0x26,0x84,0x75,
1267 1.1 riastrad 0x88,0x3c,0xc5,0x58, 0x66,0x18,0x1a,0xb4,
1268 1.1 riastrad 0x64,0x51,0x34,0x27, 0x1b,0xa4,0x11,0xc9,
1269 1.1 riastrad 0x6d,0x91,0x8a,0xfa, 0x32,0x60,0x9d,0xd7,
1270 1.1 riastrad 0x87,0xe5,0xaa,0x43, 0x72,0xf8,0xda,0xd1,
1271 1.1 riastrad 0x48,0x44,0x13,0x61, 0xdc,0x8c,0x76,0x17,
1272 1.1 riastrad 0x0c,0x85,0x4e,0xf3, 0xdd,0xa2,0x42,0xd2,
1273 1.1 riastrad 0x74,0xc1,0x30,0x1b, 0xeb,0x35,0x31,0x29,
1274 1.1 riastrad 0x5b,0xd7,0x4c,0x94, 0x46,0x35,0xa1,0x23,
1275 1.1 riastrad 0x50,0xf2,0xa2,0x8e, 0x7e,0x4f,0x23,0x4f,
1276 1.1 riastrad 0x51,0xff,0xe2,0xc9, 0xa3,0x7d,0x56,0x8b,
1277 1.1 riastrad 0x41,0xf2,0xd0,0xc5, 0x57,0x7e,0x59,0xac,
1278 1.1 riastrad 0xbb,0x65,0xf3,0xfe, 0xf7,0x17,0xef,0x63,
1279 1.1 riastrad 0x7c,0x6f,0x23,0xdd, 0x22,0x8e,0xed,0x84,
1280 1.1 riastrad 0x0e,0x3b,0x09,0xb3, 0xf3,0xf4,0x8f,0xcd,
1281 1.1 riastrad 0x37,0xa8,0xe1,0xa7, 0x30,0xdb,0xb1,0xa2,
1282 1.1 riastrad 0x9c,0xa2,0xdf,0x34, 0x17,0x3e,0x68,0x44,
1283 1.1 riastrad 0xd0,0xde,0x03,0x50, 0xd1,0x48,0x6b,0x20,
1284 1.1 riastrad 0xe2,0x63,0x45,0xa5, 0xea,0x87,0xc2,0x42,
1285 1.1 riastrad 0x95,0x03,0x49,0x05, 0xed,0xe0,0x90,0x29,
1286 1.1 riastrad 0x1a,0xb8,0xcf,0x9b, 0x43,0xcf,0x29,0x7a,
1287 1.1 riastrad 0x63,0x17,0x41,0x9f, 0xe0,0xc9,0x10,0xfd,
1288 1.1 riastrad 0x2c,0x56,0x8c,0x08, 0x55,0xb4,0xa9,0x27,
1289 1.1 riastrad 0x0f,0x23,0xb1,0x05, 0x6a,0x12,0x46,0xc7,
1290 1.1 riastrad 0xe1,0xfe,0x28,0x93, 0x93,0xd7,0x2f,0xdc,
1291 1.1 riastrad 0x98,0x30,0xdb,0x75, 0x8a,0xbe,0x97,0x7a,
1292 1.1 riastrad 0x02,0xfb,0x8c,0xba, 0xbe,0x25,0x09,0xbe,
1293 1.1 riastrad 0xce,0xcb,0xa2,0xef, 0x79,0x4d,0x0e,0x9d,
1294 1.1 riastrad 0x1b,0x9d,0xb6,0x39, 0x34,0x38,0xfa,0x07,
1295 1.1 riastrad 0xec,0xe8,0xfc,0x32, 0x85,0x1d,0xf7,0x85,
1296 1.1 riastrad 0x63,0xc3,0x3c,0xc0, 0x02,0x75,0xd7,0x3f,
1297 1.1 riastrad 0xb2,0x68,0x60,0x66, 0x65,0x81,0xc6,0xb1,
1298 1.1 riastrad 0x42,0x65,0x4b,0x4b, 0x28,0xd7,0xc7,0xaa,
1299 1.1 riastrad 0x9b,0xd2,0xdc,0x1b, 0x01,0xe0,0x26,0x39,
1300 1.1 riastrad 0x01,0xc1,0x52,0x14, 0xd1,0x3f,0xb7,0xe6,
1301 1.1 riastrad 0x61,0x41,0xc7,0x93, 0xd2,0xa2,0x67,0xc6,
1302 1.1 riastrad 0xf7,0x11,0xb5,0xf5, 0xea,0xdd,0x19,0xfb,
1303 1.1 riastrad 0x4d,0x21,0x12,0xd6, 0x7d,0xf1,0x10,0xb0,
1304 1.1 riastrad 0x89,0x07,0xc7,0x5a, 0x52,0x73,0x70,0x2f,
1305 1.1 riastrad 0x32,0xef,0x65,0x2b, 0x12,0xb2,0xf0,0xf5,
1306 1.1 riastrad 0x20,0xe0,0x90,0x59, 0x7e,0x64,0xf1,0x4c,
1307 1.1 riastrad 0x41,0xb3,0xa5,0x91, 0x08,0xe6,0x5e,0x5f,
1308 1.1 riastrad 0x05,0x56,0x76,0xb4, 0xb0,0xcd,0x70,0x53,
1309 1.1 riastrad 0x10,0x48,0x9c,0xff, 0xc2,0x69,0x55,0x24,
1310 1.1 riastrad 0x87,0xef,0x84,0xea, 0xfb,0xa7,0xbf,0xa0,
1311 1.1 riastrad 0x91,0x04,0xad,0x4f, 0x8b,0x57,0x54,0x4b,
1312 1.1 riastrad 0xb6,0xe9,0xd1,0xac, 0x37,0x2f,0x1d,0x2e,
1313 1.1 riastrad 0xab,0xa5,0xa4,0xe8, 0xff,0xfb,0xd9,0x39,
1314 1.1 riastrad 0x2f,0xb7,0xac,0xd1, 0xfe,0x0b,0x9a,0x80,
1315 1.1 riastrad 0x0f,0xb6,0xf4,0x36, 0x39,0x90,0x51,0xe3,
1316 1.1 riastrad 0x0a,0x2f,0xb6,0x45, 0x76,0x89,0xcd,0x61,
1317 1.1 riastrad 0xfe,0x48,0x5f,0x75, 0x1d,0x13,0x00,0x62,
1318 1.1 riastrad 0x80,0x24,0x47,0xe7, 0xbc,0x37,0xd7,0xe3,
1319 1.1 riastrad 0x15,0xe8,0x68,0x22, 0xaf,0x80,0x6f,0x4b,
1320 1.1 riastrad 0xa8,0x9f,0x01,0x10, 0x48,0x14,0xc3,0x02,
1321 1.1 riastrad 0x52,0xd2,0xc7,0x75, 0x9b,0x52,0x6d,0x30,
1322 1.1 riastrad 0xac,0x13,0x85,0xc8, 0xf7,0xa3,0x58,0x4b,
1323 1.1 riastrad 0x49,0xf7,0x1c,0x45, 0x55,0x8c,0x39,0x9a,
1324 1.1 riastrad 0x99,0x6d,0x97,0x27, 0x27,0xe6,0xab,0xdd,
1325 1.1 riastrad 0x2c,0x42,0x1b,0x35, 0xdd,0x9d,0x73,0xbb,
1326 1.1 riastrad 0x6c,0xf3,0x64,0xf1, 0xfb,0xb9,0xf7,0xe6,
1327 1.1 riastrad 0x4a,0x3c,0xc0,0x92, 0xc0,0x2e,0xb7,0x1a,
1328 1.1 riastrad 0xbe,0xab,0xb3,0x5a, 0xe5,0xea,0xb1,0x48,
1329 1.1 riastrad 0x58,0x13,0x53,0x90, 0xfd,0xc3,0x8e,0x54,
1330 1.1 riastrad 0xf9,0x18,0x16,0x73, 0xe8,0xcb,0x6d,0x39,
1331 1.1 riastrad 0x0e,0xd7,0xe0,0xfe, 0xb6,0x9f,0x43,0x97,
1332 1.1 riastrad 0xe8,0xd0,0x85,0x56, 0x83,0x3e,0x98,0x68,
1333 1.1 riastrad 0x7f,0xbd,0x95,0xa8, 0x9a,0x61,0x21,0x8f,
1334 1.1 riastrad 0x06,0x98,0x34,0xa6, 0xc8,0xd6,0x1d,0xf3,
1335 1.1 riastrad 0x3d,0x43,0xa4,0x9a, 0x8c,0xe5,0xd3,0x5a,
1336 1.1 riastrad 0x32,0xa2,0x04,0x22, 0xa4,0x19,0x1a,0x46,
1337 1.1 riastrad 0x42,0x7e,0x4d,0xe5, 0xe0,0xe6,0x0e,0xca,
1338 1.1 riastrad 0xd5,0x58,0x9d,0x2c, 0xaf,0xda,0x33,0x5c,
1339 1.1 riastrad 0xb0,0x79,0x9e,0xc9, 0xfc,0xca,0xf0,0x2f,
1340 1.1 riastrad 0xa8,0xb2,0x77,0xeb, 0x7a,0xa2,0xdd,0x37,
1341 1.1 riastrad 0x35,0x83,0x07,0xd6, 0x02,0x1a,0xb6,0x6c,
1342 1.1 riastrad 0x24,0xe2,0x59,0x08, 0x0e,0xfd,0x3e,0x46,
1343 1.1 riastrad 0xec,0x40,0x93,0xf4, 0x00,0x26,0x4f,0x2a,
1344 1.1 riastrad 0xff,0x47,0x2f,0xeb, 0x02,0x92,0x26,0x5b,
1345 1.1 riastrad 0x53,0x17,0xc2,0x8d, 0x2a,0xc7,0xa3,0x1b,
1346 1.1 riastrad 0xcd,0xbc,0xa7,0xe8, 0xd1,0x76,0xe3,0x80,
1347 1.1 riastrad 0x21,0xca,0x5d,0x3b, 0xe4,0x9c,0x8f,0xa9,
1348 1.1 riastrad 0x5b,0x7f,0x29,0x7f, 0x7c,0xd8,0xed,0x6d,
1349 1.1 riastrad 0x8c,0xb2,0x86,0x85, 0xe7,0x77,0xf2,0x85,
1350 1.1 riastrad 0xab,0x38,0xa9,0x9d, 0xc1,0x4e,0xc5,0x64,
1351 1.1 riastrad 0x33,0x73,0x8b,0x59, 0x03,0xad,0x05,0xdf,
1352 1.1 riastrad 0x25,0x98,0x31,0xde, 0xef,0x13,0xf1,0x9b,
1353 1.1 riastrad 0x3c,0x91,0x9d,0x7b, 0xb1,0xfa,0xe6,0xbf,
1354 1.1 riastrad 0x5b,0xed,0xa5,0x55, 0xe6,0xea,0x6c,0x74,
1355 1.1 riastrad 0xf4,0xb9,0xe4,0x45, 0x64,0x72,0x81,0xc2,
1356 1.1 riastrad 0x4c,0x28,0xd4,0xcd, 0xac,0xe2,0xde,0xf9,
1357 1.1 riastrad 0xeb,0x5c,0xeb,0x61, 0x60,0x5a,0xe5,0x28,
1358 1.1 riastrad },
1359 1.1 riastrad .mlen = 0,
1360 1.1 riastrad .h = {0},
1361 1.1 riastrad },
1362 1.1 riastrad [1] = { /* 16-byte message */
1363 1.1 riastrad .k = {
1364 1.1 riastrad /* Poly1305 key */
1365 1.1 riastrad 0x29,0x21,0x43,0xcb, 0xcb,0x13,0x07,0xde,
1366 1.1 riastrad 0xbf,0x48,0xdf,0x8a, 0x7f,0xa2,0x84,0xde,
1367 1.1 riastrad
1368 1.1 riastrad /* NH key */
1369 1.1 riastrad 0x72,0x23,0x9d,0xf5, 0xf0,0x07,0xf2,0x4c,
1370 1.1 riastrad 0x20,0x3a,0x93,0xb9, 0xcd,0x5d,0xfe,0xcb,
1371 1.1 riastrad 0x99,0x2c,0x2b,0x58, 0xc6,0x50,0x5f,0x94,
1372 1.1 riastrad 0x56,0xc3,0x7c,0x0d, 0x02,0x3f,0xb8,0x5e,
1373 1.1 riastrad 0x7b,0xc0,0x6c,0x51, 0x34,0x76,0xc0,0x0e,
1374 1.1 riastrad 0xc6,0x22,0xc8,0x9e, 0x92,0xa0,0x21,0xc9,
1375 1.1 riastrad 0x85,0x5c,0x7c,0xf8, 0xe2,0x64,0x47,0xc9,
1376 1.1 riastrad 0xe4,0xa2,0x57,0x93, 0xf8,0xa2,0x69,0xcd,
1377 1.1 riastrad 0x62,0x98,0x99,0xf4, 0xd7,0x7b,0x14,0xb1,
1378 1.1 riastrad 0xd8,0x05,0xff,0x04, 0x15,0xc9,0xe1,0x6e,
1379 1.1 riastrad 0x9b,0xe6,0x50,0x6b, 0x0b,0x3f,0x22,0x1f,
1380 1.1 riastrad 0x08,0xde,0x0c,0x5b, 0x08,0x7e,0xc6,0x2f,
1381 1.1 riastrad 0x6c,0xed,0xd6,0xb2, 0x15,0xa4,0xb3,0xf9,
1382 1.1 riastrad 0xa7,0x46,0x38,0x2a, 0xea,0x69,0xa5,0xde,
1383 1.1 riastrad 0x02,0xc3,0x96,0x89, 0x4d,0x55,0x3b,0xed,
1384 1.1 riastrad 0x3d,0x3a,0x85,0x77, 0xbf,0x97,0x45,0x5c,
1385 1.1 riastrad 0x9e,0x02,0x69,0xe2, 0x1b,0x68,0xbe,0x96,
1386 1.1 riastrad 0xfb,0x64,0x6f,0x0f, 0xf6,0x06,0x40,0x67,
1387 1.1 riastrad 0xfa,0x04,0xe3,0x55, 0xfa,0xbe,0xa4,0x60,
1388 1.1 riastrad 0xef,0x21,0x66,0x97, 0xe6,0x9d,0x5c,0x1f,
1389 1.1 riastrad 0x62,0x37,0xaa,0x31, 0xde,0xe4,0x9c,0x28,
1390 1.1 riastrad 0x95,0xe0,0x22,0x86, 0xf4,0x4d,0xf3,0x07,
1391 1.1 riastrad 0xfd,0x5f,0x3a,0x54, 0x2c,0x51,0x80,0x71,
1392 1.1 riastrad 0xba,0x78,0x69,0x5b, 0x65,0xab,0x1f,0x81,
1393 1.1 riastrad 0xed,0x3b,0xff,0x34, 0xa3,0xfb,0xbc,0x73,
1394 1.1 riastrad 0x66,0x7d,0x13,0x7f, 0xdf,0x6e,0xe2,0xe2,
1395 1.1 riastrad 0xeb,0x4f,0x6c,0xda, 0x7d,0x33,0x57,0xd0,
1396 1.1 riastrad 0xd3,0x7c,0x95,0x4f, 0x33,0x58,0x21,0xc7,
1397 1.1 riastrad 0xc0,0xe5,0x6f,0x42, 0x26,0xc6,0x1f,0x5e,
1398 1.1 riastrad 0x85,0x1b,0x98,0x9a, 0xa2,0x1e,0x55,0x77,
1399 1.1 riastrad 0x23,0xdf,0x81,0x5e, 0x79,0x55,0x05,0xfc,
1400 1.1 riastrad 0xfb,0xda,0xee,0xba, 0x5a,0xba,0xf7,0x77,
1401 1.1 riastrad 0x7f,0x0e,0xd3,0xe1, 0x37,0xfe,0x8d,0x2b,
1402 1.1 riastrad 0xd5,0x3f,0xfb,0xd0, 0xc0,0x3c,0x0b,0x3f,
1403 1.1 riastrad 0xcf,0x3c,0x14,0xcf, 0xfb,0x46,0x72,0x4c,
1404 1.1 riastrad 0x1f,0x39,0xe2,0xda, 0x03,0x71,0x6d,0x23,
1405 1.1 riastrad 0xef,0x93,0xcd,0x39, 0xd9,0x37,0x80,0x4d,
1406 1.1 riastrad 0x65,0x61,0xd1,0x2c, 0x03,0xa9,0x47,0x72,
1407 1.1 riastrad 0x4d,0x1e,0x0e,0x16, 0x33,0x0f,0x21,0x17,
1408 1.1 riastrad 0xec,0x92,0xea,0x6f, 0x37,0x22,0xa4,0xd8,
1409 1.1 riastrad 0x03,0x33,0x9e,0xd8, 0x03,0x69,0x9a,0xe8,
1410 1.1 riastrad 0xb2,0x57,0xaf,0x78, 0x99,0x05,0x12,0xab,
1411 1.1 riastrad 0x48,0x90,0x80,0xf0, 0x12,0x9b,0x20,0x64,
1412 1.1 riastrad 0x7a,0x1d,0x47,0x5f, 0xba,0x3c,0xf9,0xc3,
1413 1.1 riastrad 0x0a,0x0d,0x8d,0xa1, 0xf9,0x1b,0x82,0x13,
1414 1.1 riastrad 0x3e,0x0d,0xec,0x0a, 0x83,0xc0,0x65,0xe1,
1415 1.1 riastrad 0xe9,0x95,0xff,0x97, 0xd6,0xf2,0xe4,0xd5,
1416 1.1 riastrad 0x86,0xc0,0x1f,0x29, 0x27,0x63,0xd7,0xde,
1417 1.1 riastrad 0xb7,0x0a,0x07,0x99, 0x04,0x2d,0xa3,0x89,
1418 1.1 riastrad 0xa2,0x43,0xcf,0xf3, 0xe1,0x43,0xac,0x4a,
1419 1.1 riastrad 0x06,0x97,0xd0,0x05, 0x4f,0x87,0xfa,0xf9,
1420 1.1 riastrad 0x9b,0xbf,0x52,0x70, 0xbd,0xbc,0x6c,0xf3,
1421 1.1 riastrad 0x03,0x13,0x60,0x41, 0x28,0x09,0xec,0xcc,
1422 1.1 riastrad 0xb1,0x1a,0xec,0xd6, 0xfb,0x6f,0x2a,0x89,
1423 1.1 riastrad 0x5d,0x0b,0x53,0x9c, 0x59,0xc1,0x84,0x21,
1424 1.1 riastrad 0x33,0x51,0x47,0x19, 0x31,0x9c,0xd4,0x0a,
1425 1.1 riastrad 0x4d,0x04,0xec,0x50, 0x90,0x61,0xbd,0xbc,
1426 1.1 riastrad 0x7e,0xc8,0xd9,0x6c, 0x98,0x1d,0x45,0x41,
1427 1.1 riastrad 0x17,0x5e,0x97,0x1c, 0xc5,0xa8,0xe8,0xea,
1428 1.1 riastrad 0x46,0x58,0x53,0xf7, 0x17,0xd5,0xad,0x11,
1429 1.1 riastrad 0xc8,0x54,0xf5,0x7a, 0x33,0x90,0xf5,0x19,
1430 1.1 riastrad 0xba,0x36,0xb4,0xfc, 0x52,0xa5,0x72,0x3d,
1431 1.1 riastrad 0x14,0xbb,0x55,0xa7, 0xe9,0xe3,0x12,0xf7,
1432 1.1 riastrad 0x1c,0x30,0xa2,0x82, 0x03,0xbf,0x53,0x91,
1433 1.1 riastrad 0x2e,0x60,0x41,0x9f, 0x5b,0x69,0x39,0xf6,
1434 1.1 riastrad 0x4d,0xc8,0xf8,0x46, 0x7a,0x7f,0xa4,0x98,
1435 1.1 riastrad 0x36,0xff,0x06,0xcb, 0xca,0xe7,0x33,0xf2,
1436 1.1 riastrad 0xc0,0x4a,0xf4,0x3c, 0x14,0x44,0x5f,0x6b,
1437 1.1 riastrad 0x75,0xef,0x02,0x36, 0x75,0x08,0x14,0xfd,
1438 1.1 riastrad 0x10,0x8e,0xa5,0x58, 0xd0,0x30,0x46,0x49,
1439 1.1 riastrad 0xaf,0x3a,0xf8,0x40, 0x3d,0x35,0xdb,0x84,
1440 1.1 riastrad 0x11,0x2e,0x97,0x6a, 0xb7,0x87,0x7f,0xad,
1441 1.1 riastrad 0xf1,0xfa,0xa5,0x63, 0x60,0xd8,0x5e,0xbf,
1442 1.1 riastrad 0x41,0x78,0x49,0xcf, 0x77,0xbb,0x56,0xbb,
1443 1.1 riastrad 0x7d,0x01,0x67,0x05, 0x22,0xc8,0x8f,0x41,
1444 1.1 riastrad 0xba,0x81,0xd2,0xca, 0x2c,0x38,0xac,0x76,
1445 1.1 riastrad 0x06,0xc1,0x1a,0xc2, 0xce,0xac,0x90,0x67,
1446 1.1 riastrad 0x57,0x3e,0x20,0x12, 0x5b,0xd9,0x97,0x58,
1447 1.1 riastrad 0x65,0x05,0xb7,0x04, 0x61,0x7e,0xd8,0x3a,
1448 1.1 riastrad 0xbf,0x55,0x3b,0x13, 0xe9,0x34,0x5a,0x37,
1449 1.1 riastrad 0x36,0xcb,0x94,0x45, 0xc5,0x32,0xb3,0xa0,
1450 1.1 riastrad 0x0c,0x3e,0x49,0xc5, 0xd3,0xed,0xa7,0xf0,
1451 1.1 riastrad 0x1c,0x69,0xcc,0xea, 0xcc,0x83,0xc9,0x16,
1452 1.1 riastrad 0x95,0x72,0x4b,0xf4, 0x89,0xd5,0xb9,0x10,
1453 1.1 riastrad 0xf6,0x2d,0x60,0x15, 0xea,0x3c,0x06,0x66,
1454 1.1 riastrad 0x9f,0x82,0xad,0x17, 0xce,0xd2,0xa4,0x48,
1455 1.1 riastrad 0x7c,0x65,0xd9,0xf8, 0x02,0x4d,0x9b,0x4c,
1456 1.1 riastrad 0x89,0x06,0x3a,0x34, 0x85,0x48,0x89,0x86,
1457 1.1 riastrad 0xf9,0x24,0xa9,0x54, 0x72,0xdb,0x44,0x95,
1458 1.1 riastrad 0xc7,0x44,0x1c,0x19, 0x11,0x4c,0x04,0xdc,
1459 1.1 riastrad 0x13,0xb9,0x67,0xc8, 0xc3,0x3a,0x6a,0x50,
1460 1.1 riastrad 0xfa,0xd1,0xfb,0xe1, 0x88,0xb6,0xf1,0xa3,
1461 1.1 riastrad 0xc5,0x3b,0xdc,0x38, 0x45,0x16,0x26,0x02,
1462 1.1 riastrad 0x3b,0xb8,0x8f,0x8b, 0x58,0x7d,0x23,0x04,
1463 1.1 riastrad 0x50,0x6b,0x81,0x9f, 0xae,0x66,0xac,0x6f,
1464 1.1 riastrad 0xcf,0x2a,0x9d,0xf1, 0xfd,0x1d,0x57,0x07,
1465 1.1 riastrad 0xbe,0x58,0xeb,0x77, 0x0c,0xe3,0xc2,0x19,
1466 1.1 riastrad 0x14,0x74,0x1b,0x51, 0x1c,0x4f,0x41,0xf3,
1467 1.1 riastrad 0x32,0x89,0xb3,0xe7, 0xde,0x62,0xf6,0x5f,
1468 1.1 riastrad 0xc7,0x6a,0x4a,0x2a, 0x5b,0x0f,0x5f,0x87,
1469 1.1 riastrad 0x9c,0x08,0xb9,0x02, 0x88,0xc8,0x29,0xb7,
1470 1.1 riastrad 0x94,0x52,0xfa,0x52, 0xfe,0xaa,0x50,0x10,
1471 1.1 riastrad 0xba,0x48,0x75,0x5e, 0x11,0x1b,0xe6,0x39,
1472 1.1 riastrad 0xd7,0x82,0x2c,0x87, 0xf1,0x1e,0xa4,0x38,
1473 1.1 riastrad 0x72,0x3e,0x51,0xe7, 0xd8,0x3e,0x5b,0x7b,
1474 1.1 riastrad 0x31,0x16,0x89,0xba, 0xd6,0xad,0x18,0x5e,
1475 1.1 riastrad 0xba,0xf8,0x12,0xb3, 0xf4,0x6c,0x47,0x30,
1476 1.1 riastrad 0xc0,0x38,0x58,0xb3, 0x10,0x8d,0x58,0x5d,
1477 1.1 riastrad 0xb4,0xfb,0x19,0x7e, 0x41,0xc3,0x66,0xb8,
1478 1.1 riastrad 0xd6,0x72,0x84,0xe1, 0x1a,0xc2,0x71,0x4c,
1479 1.1 riastrad 0x0d,0x4a,0x21,0x7a, 0xab,0xa2,0xc0,0x36,
1480 1.1 riastrad 0x15,0xc5,0xe9,0x46, 0xd7,0x29,0x17,0x76,
1481 1.1 riastrad 0x5e,0x47,0x36,0x7f, 0x72,0x05,0xa7,0xcc,
1482 1.1 riastrad 0x36,0x63,0xf9,0x47, 0x7d,0xe6,0x07,0x3c,
1483 1.1 riastrad 0x8b,0x79,0x1d,0x96, 0x61,0x8d,0x90,0x65,
1484 1.1 riastrad 0x7c,0xf5,0xeb,0x4e, 0x6e,0x09,0x59,0x6d,
1485 1.1 riastrad 0x62,0x50,0x1b,0x0f, 0xe0,0xdc,0x78,0xf2,
1486 1.1 riastrad 0x5b,0x83,0x1a,0xa1, 0x11,0x75,0xfd,0x18,
1487 1.1 riastrad 0xd7,0xe2,0x8d,0x65, 0x14,0x21,0xce,0xbe,
1488 1.1 riastrad 0xb5,0x87,0xe3,0x0a, 0xda,0x24,0x0a,0x64,
1489 1.1 riastrad 0xa9,0x9f,0x03,0x8d, 0x46,0x5d,0x24,0x1a,
1490 1.1 riastrad 0x8a,0x0c,0x42,0x01, 0xca,0xb1,0x5f,0x7c,
1491 1.1 riastrad 0xa5,0xac,0x32,0x4a, 0xb8,0x07,0x91,0x18,
1492 1.1 riastrad 0x6f,0xb0,0x71,0x3c, 0xc9,0xb1,0xa8,0xf8,
1493 1.1 riastrad 0x5f,0x69,0xa5,0xa1, 0xca,0x9e,0x7a,0xaa,
1494 1.1 riastrad 0xac,0xe9,0xc7,0x47, 0x41,0x75,0x25,0xc3,
1495 1.1 riastrad 0x73,0xe2,0x0b,0xdd, 0x6d,0x52,0x71,0xbe,
1496 1.1 riastrad 0xc5,0xdc,0xb4,0xe7, 0x01,0x26,0x53,0x77,
1497 1.1 riastrad 0x86,0x90,0x85,0x68, 0x6b,0x7b,0x03,0x53,
1498 1.1 riastrad 0xda,0x52,0x52,0x51, 0x68,0xc8,0xf3,0xec,
1499 1.1 riastrad 0x6c,0xd5,0x03,0x7a, 0xa3,0x0e,0xb4,0x02,
1500 1.1 riastrad 0x5f,0x1a,0xab,0xee, 0xca,0x67,0x29,0x7b,
1501 1.1 riastrad 0xbd,0x96,0x59,0xb3, 0x8b,0x32,0x7a,0x92,
1502 1.1 riastrad 0x9f,0xd8,0x25,0x2b, 0xdf,0xc0,0x4c,0xda,
1503 1.1 riastrad },
1504 1.1 riastrad .mlen = 16,
1505 1.1 riastrad .m = {
1506 1.1 riastrad 0xbc,0xda,0x81,0xa8, 0x78,0x79,0x1c,0xbf,
1507 1.1 riastrad 0x77,0x53,0xba,0x4c, 0x30,0x5b,0xb8,0x33,
1508 1.1 riastrad },
1509 1.1 riastrad .h = {
1510 1.1 riastrad 0x04,0xbf,0x7f,0x6a, 0xce,0x72,0xea,0x6a,
1511 1.1 riastrad 0x79,0xdb,0xb0,0xc9, 0x60,0xf6,0x12,0xcc,
1512 1.1 riastrad },
1513 1.1 riastrad },
1514 1.1 riastrad [2] = { /* 1024-byte message */
1515 1.1 riastrad .k = {
1516 1.1 riastrad 0x65,0x4d,0xe3,0xf8, 0xd2,0x4c,0xac,0x28,
1517 1.1 riastrad 0x68,0xf5,0xb3,0x81, 0x71,0x4b,0xa1,0xfa,
1518 1.1 riastrad 0x04,0x0e,0xd3,0x81, 0x36,0xbe,0x0c,0x81,
1519 1.1 riastrad 0x5e,0xaf,0xbc,0x3a, 0xa4,0xc0,0x8e,0x8b,
1520 1.1 riastrad 0x55,0x63,0xd3,0x52, 0x97,0x88,0xd6,0x19,
1521 1.1 riastrad 0xbc,0x96,0xdf,0x49, 0xff,0x04,0x63,0xf5,
1522 1.1 riastrad 0x0c,0x11,0x13,0xaa, 0x9e,0x1f,0x5a,0xf7,
1523 1.1 riastrad 0xdd,0xbd,0x37,0x80, 0xc3,0xd0,0xbe,0xa7,
1524 1.1 riastrad 0x05,0xc8,0x3c,0x98, 0x1e,0x05,0x3c,0x84,
1525 1.1 riastrad 0x39,0x61,0xc4,0xed, 0xed,0x71,0x1b,0xc4,
1526 1.1 riastrad 0x74,0x45,0x2c,0xa1, 0x56,0x70,0x97,0xfd,
1527 1.1 riastrad 0x44,0x18,0x07,0x7d, 0xca,0x60,0x1f,0x73,
1528 1.1 riastrad 0x3b,0x6d,0x21,0xcb, 0x61,0x87,0x70,0x25,
1529 1.1 riastrad 0x46,0x21,0xf1,0x1f, 0x21,0x91,0x31,0x2d,
1530 1.1 riastrad 0x5d,0xcc,0xb7,0xd1, 0x84,0x3e,0x3d,0xdb,
1531 1.1 riastrad 0x03,0x53,0x2a,0x82, 0xa6,0x9a,0x95,0xbc,
1532 1.1 riastrad 0x1a,0x1e,0x0a,0x5e, 0x07,0x43,0xab,0x43,
1533 1.1 riastrad 0xaf,0x92,0x82,0x06, 0x91,0x04,0x09,0xf4,
1534 1.1 riastrad 0x17,0x0a,0x9a,0x2c, 0x54,0xdb,0xb8,0xf4,
1535 1.1 riastrad 0xd0,0xf0,0x10,0x66, 0x24,0x8d,0xcd,0xda,
1536 1.1 riastrad 0xfe,0x0e,0x45,0x9d, 0x6f,0xc4,0x4e,0xf4,
1537 1.1 riastrad 0x96,0xaf,0x13,0xdc, 0xa9,0xd4,0x8c,0xc4,
1538 1.1 riastrad 0xc8,0x57,0x39,0x3c, 0xc2,0xd3,0x0a,0x76,
1539 1.1 riastrad 0x4a,0x1f,0x75,0x83, 0x44,0xc7,0xd1,0x39,
1540 1.1 riastrad 0xd8,0xb5,0x41,0xba, 0x73,0x87,0xfa,0x96,
1541 1.1 riastrad 0xc7,0x18,0x53,0xfb, 0x9b,0xda,0xa0,0x97,
1542 1.1 riastrad 0x1d,0xee,0x60,0x85, 0x9e,0x14,0xc3,0xce,
1543 1.1 riastrad 0xc4,0x05,0x29,0x3b, 0x95,0x30,0xa3,0xd1,
1544 1.1 riastrad 0x9f,0x82,0x6a,0x04, 0xf5,0xa7,0x75,0x57,
1545 1.1 riastrad 0x82,0x04,0xfe,0x71, 0x51,0x71,0xb1,0x49,
1546 1.1 riastrad 0x50,0xf8,0xe0,0x96, 0xf1,0xfa,0xa8,0x88,
1547 1.1 riastrad 0x3f,0xa0,0x86,0x20, 0xd4,0x60,0x79,0x59,
1548 1.1 riastrad 0x17,0x2d,0xd1,0x09, 0xf4,0xec,0x05,0x57,
1549 1.1 riastrad 0xcf,0x62,0x7e,0x0e, 0x7e,0x60,0x78,0xe6,
1550 1.1 riastrad 0x08,0x60,0x29,0xd8, 0xd5,0x08,0x1a,0x24,
1551 1.1 riastrad 0xc4,0x6c,0x24,0xe7, 0x92,0x08,0x3d,0x8a,
1552 1.1 riastrad 0x98,0x7a,0xcf,0x99, 0x0a,0x65,0x0e,0xdc,
1553 1.1 riastrad 0x8c,0x8a,0xbe,0x92, 0x82,0x91,0xcc,0x62,
1554 1.1 riastrad 0x30,0xb6,0xf4,0x3f, 0xc6,0x8a,0x7f,0x12,
1555 1.1 riastrad 0x4a,0x8a,0x49,0xfa, 0x3f,0x5c,0xd4,0x5a,
1556 1.1 riastrad 0xa6,0x82,0xa3,0xe6, 0xaa,0x34,0x76,0xb2,
1557 1.1 riastrad 0xab,0x0a,0x30,0xef, 0x6c,0x77,0x58,0x3f,
1558 1.1 riastrad 0x05,0x6b,0xcc,0x5c, 0xae,0xdc,0xd7,0xb9,
1559 1.1 riastrad 0x51,0x7e,0x8d,0x32, 0x5b,0x24,0x25,0xbe,
1560 1.1 riastrad 0x2b,0x24,0x01,0xcf, 0x80,0xda,0x16,0xd8,
1561 1.1 riastrad 0x90,0x72,0x2c,0xad, 0x34,0x8d,0x0c,0x74,
1562 1.1 riastrad 0x02,0xcb,0xfd,0xcf, 0x6e,0xef,0x97,0xb5,
1563 1.1 riastrad 0x4c,0xf2,0x68,0xca, 0xde,0x43,0x9e,0x8a,
1564 1.1 riastrad 0xc5,0x5f,0x31,0x7f, 0x14,0x71,0x38,0xec,
1565 1.1 riastrad 0xbd,0x98,0xe5,0x71, 0xc4,0xb5,0xdb,0xef,
1566 1.1 riastrad 0x59,0xd2,0xca,0xc0, 0xc1,0x86,0x75,0x01,
1567 1.1 riastrad 0xd4,0x15,0x0d,0x6f, 0xa4,0xf7,0x7b,0x37,
1568 1.1 riastrad 0x47,0xda,0x18,0x93, 0x63,0xda,0xbe,0x9e,
1569 1.1 riastrad 0x07,0xfb,0xb2,0x83, 0xd5,0xc4,0x34,0x55,
1570 1.1 riastrad 0xee,0x73,0xa1,0x42, 0x96,0xf9,0x66,0x41,
1571 1.1 riastrad 0xa4,0xcc,0xd2,0x93, 0x6e,0xe1,0x0a,0xbb,
1572 1.1 riastrad 0xd2,0xdd,0x18,0x23, 0xe6,0x6b,0x98,0x0b,
1573 1.1 riastrad 0x8a,0x83,0x59,0x2c, 0xc3,0xa6,0x59,0x5b,
1574 1.1 riastrad 0x01,0x22,0x59,0xf7, 0xdc,0xb0,0x87,0x7e,
1575 1.1 riastrad 0xdb,0x7d,0xf4,0x71, 0x41,0xab,0xbd,0xee,
1576 1.1 riastrad 0x79,0xbe,0x3c,0x01, 0x76,0x0b,0x2d,0x0a,
1577 1.1 riastrad 0x42,0xc9,0x77,0x8c, 0xbb,0x54,0x95,0x60,
1578 1.1 riastrad 0x43,0x2e,0xe0,0x17, 0x52,0xbd,0x90,0xc9,
1579 1.1 riastrad 0xc2,0x2c,0xdd,0x90, 0x24,0x22,0x76,0x40,
1580 1.1 riastrad 0x5c,0xb9,0x41,0xc9, 0xa1,0xd5,0xbd,0xe3,
1581 1.1 riastrad 0x44,0xe0,0xa4,0xab, 0xcc,0xb8,0xe2,0x32,
1582 1.1 riastrad 0x02,0x15,0x04,0x1f, 0x8c,0xec,0x5d,0x14,
1583 1.1 riastrad 0xac,0x18,0xaa,0xef, 0x6e,0x33,0x19,0x6e,
1584 1.1 riastrad 0xde,0xfe,0x19,0xdb, 0xeb,0x61,0xca,0x18,
1585 1.1 riastrad 0xad,0xd8,0x3d,0xbf, 0x09,0x11,0xc7,0xa5,
1586 1.1 riastrad 0x86,0x0b,0x0f,0xe5, 0x3e,0xde,0xe8,0xd9,
1587 1.1 riastrad 0x0a,0x69,0x9e,0x4c, 0x20,0xff,0xf9,0xc5,
1588 1.1 riastrad 0xfa,0xf8,0xf3,0x7f, 0xa5,0x01,0x4b,0x5e,
1589 1.1 riastrad 0x0f,0xf0,0x3b,0x68, 0xf0,0x46,0x8c,0x2a,
1590 1.1 riastrad 0x7a,0xc1,0x8f,0xa0, 0xfe,0x6a,0x5b,0x44,
1591 1.1 riastrad 0x70,0x5c,0xcc,0x92, 0x2c,0x6f,0x0f,0xbd,
1592 1.1 riastrad 0x25,0x3e,0xb7,0x8e, 0x73,0x58,0xda,0xc9,
1593 1.1 riastrad 0xa5,0xaa,0x9e,0xf3, 0x9b,0xfd,0x37,0x3e,
1594 1.1 riastrad 0xe2,0x88,0xa4,0x7b, 0xc8,0x5c,0xa8,0x93,
1595 1.1 riastrad 0x0e,0xe7,0x9a,0x9c, 0x2e,0x95,0x18,0x9f,
1596 1.1 riastrad 0xc8,0x45,0x0c,0x88, 0x9e,0x53,0x4f,0x3a,
1597 1.1 riastrad 0x76,0xc1,0x35,0xfa, 0x17,0xd8,0xac,0xa0,
1598 1.1 riastrad 0x0c,0x2d,0x47,0x2e, 0x4f,0x69,0x9b,0xf7,
1599 1.1 riastrad 0xd0,0xb6,0x96,0x0c, 0x19,0xb3,0x08,0x01,
1600 1.1 riastrad 0x65,0x7a,0x1f,0xc7, 0x31,0x86,0xdb,0xc8,
1601 1.1 riastrad 0xc1,0x99,0x8f,0xf8, 0x08,0x4a,0x9d,0x23,
1602 1.1 riastrad 0x22,0xa8,0xcf,0x27, 0x01,0x01,0x88,0x93,
1603 1.1 riastrad 0x9c,0x86,0x45,0xbd, 0xe0,0x51,0xca,0x52,
1604 1.1 riastrad 0x84,0xba,0xfe,0x03, 0xf7,0xda,0xc5,0xce,
1605 1.1 riastrad 0x3e,0x77,0x75,0x86, 0xaf,0x84,0xc8,0x05,
1606 1.1 riastrad 0x44,0x01,0x0f,0x02, 0xf3,0x58,0xb0,0x06,
1607 1.1 riastrad 0x5a,0xd7,0x12,0x30, 0x8d,0xdf,0x1f,0x1f,
1608 1.1 riastrad 0x0a,0xe6,0xd2,0xea, 0xf6,0x3a,0x7a,0x99,
1609 1.1 riastrad 0x63,0xe8,0xd2,0xc1, 0x4a,0x45,0x8b,0x40,
1610 1.1 riastrad 0x4d,0x0a,0xa9,0x76, 0x92,0xb3,0xda,0x87,
1611 1.1 riastrad 0x36,0x33,0xf0,0x78, 0xc3,0x2f,0x5f,0x02,
1612 1.1 riastrad 0x1a,0x6a,0x2c,0x32, 0xcd,0x76,0xbf,0xbd,
1613 1.1 riastrad 0x5a,0x26,0x20,0x28, 0x8c,0x8c,0xbc,0x52,
1614 1.1 riastrad 0x3d,0x0a,0xc9,0xcb, 0xab,0xa4,0x21,0xb0,
1615 1.1 riastrad 0x54,0x40,0x81,0x44, 0xc7,0xd6,0x1c,0x11,
1616 1.1 riastrad 0x44,0xc6,0x02,0x92, 0x14,0x5a,0xbf,0x1a,
1617 1.1 riastrad 0x09,0x8a,0x18,0xad, 0xcd,0x64,0x3d,0x53,
1618 1.1 riastrad 0x4a,0xb6,0xa5,0x1b, 0x57,0x0e,0xef,0xe0,
1619 1.1 riastrad 0x8c,0x44,0x5f,0x7d, 0xbd,0x6c,0xfd,0x60,
1620 1.1 riastrad 0xae,0x02,0x24,0xb6, 0x99,0xdd,0x8c,0xaf,
1621 1.1 riastrad 0x59,0x39,0x75,0x3c, 0xd1,0x54,0x7b,0x86,
1622 1.1 riastrad 0xcc,0x99,0xd9,0x28, 0x0c,0xb0,0x94,0x62,
1623 1.1 riastrad 0xf9,0x51,0xd1,0x19, 0x96,0x2d,0x66,0xf5,
1624 1.1 riastrad 0x55,0xcf,0x9e,0x59, 0xe2,0x6b,0x2c,0x08,
1625 1.1 riastrad 0xc0,0x54,0x48,0x24, 0x45,0xc3,0x8c,0x73,
1626 1.1 riastrad 0xea,0x27,0x6e,0x66, 0x7d,0x1d,0x0e,0x6e,
1627 1.1 riastrad 0x13,0xe8,0x56,0x65, 0x3a,0xb0,0x81,0x5c,
1628 1.1 riastrad 0xf0,0xe8,0xd8,0x00, 0x6b,0xcd,0x8f,0xad,
1629 1.1 riastrad 0xdd,0x53,0xf3,0xa4, 0x6c,0x43,0xd6,0x31,
1630 1.1 riastrad 0xaf,0xd2,0x76,0x1e, 0x91,0x12,0xdb,0x3c,
1631 1.1 riastrad 0x8c,0xc2,0x81,0xf0, 0x49,0xdb,0xe2,0x6b,
1632 1.1 riastrad 0x76,0x62,0x0a,0x04, 0xe4,0xaa,0x8a,0x7c,
1633 1.1 riastrad 0x08,0x0b,0x5d,0xd0, 0xee,0x1d,0xfb,0xc4,
1634 1.1 riastrad 0x02,0x75,0x42,0xd6, 0xba,0xa7,0x22,0xa8,
1635 1.1 riastrad 0x47,0x29,0xb7,0x85, 0x6d,0x93,0x3a,0xdb,
1636 1.1 riastrad 0x00,0x53,0x0b,0xa2, 0xeb,0xf8,0xfe,0x01,
1637 1.1 riastrad 0x6f,0x8a,0x31,0xd6, 0x17,0x05,0x6f,0x67,
1638 1.1 riastrad 0x88,0x95,0x32,0xfe, 0x4f,0xa6,0x4b,0xf8,
1639 1.1 riastrad 0x03,0xe4,0xcd,0x9a, 0x18,0xe8,0x4e,0x2d,
1640 1.1 riastrad 0xf7,0x97,0x9a,0x0c, 0x7d,0x9f,0x7e,0x44,
1641 1.1 riastrad 0x69,0x51,0xe0,0x32, 0x6b,0x62,0x86,0x8f,
1642 1.1 riastrad 0xa6,0x8e,0x0b,0x21, 0x96,0xe5,0xaf,0x77,
1643 1.1 riastrad 0xc0,0x83,0xdf,0xa5, 0x0e,0xd0,0xa1,0x04,
1644 1.1 riastrad 0xaf,0xc1,0x10,0xcb, 0x5a,0x40,0xe4,0xe3,
1645 1.1 riastrad 0x38,0x7e,0x07,0xe8, 0x4d,0xfa,0xed,0xc5,
1646 1.1 riastrad 0xf0,0x37,0xdf,0xbb, 0x8a,0xcf,0x3d,0xdc,
1647 1.1 riastrad 0x61,0xd2,0xc6,0x2b, 0xff,0x07,0xc9,0x2f,
1648 1.1 riastrad 0x0c,0x2d,0x5c,0x07, 0xa8,0x35,0x6a,0xfc,
1649 1.1 riastrad 0xae,0x09,0x03,0x45, 0x74,0x51,0x4d,0xc4,
1650 1.1 riastrad 0xb8,0x23,0x87,0x4a, 0x99,0x27,0x20,0x87,
1651 1.1 riastrad 0x62,0x44,0x0a,0x4a, 0xce,0x78,0x47,0x22,
1652 1.1 riastrad },
1653 1.1 riastrad .mlen = 1024,
1654 1.1 riastrad .m = {
1655 1.1 riastrad 0x8e,0xb0,0x4c,0xde, 0x9c,0x4a,0x04,0x5a,
1656 1.1 riastrad 0xf6,0xa9,0x7f,0x45, 0x25,0xa5,0x7b,0x3a,
1657 1.1 riastrad 0xbc,0x4d,0x73,0x39, 0x81,0xb5,0xbd,0x3d,
1658 1.1 riastrad 0x21,0x6f,0xd7,0x37, 0x50,0x3c,0x7b,0x28,
1659 1.1 riastrad 0xd1,0x03,0x3a,0x17, 0xed,0x7b,0x7c,0x2a,
1660 1.1 riastrad 0x16,0xbc,0xdf,0x19, 0x89,0x52,0x71,0x31,
1661 1.1 riastrad 0xb6,0xc0,0xfd,0xb5, 0xd3,0xba,0x96,0x99,
1662 1.1 riastrad 0xb6,0x34,0x0b,0xd0, 0x99,0x93,0xfc,0x1a,
1663 1.1 riastrad 0x01,0x3c,0x85,0xc6, 0x9b,0x78,0x5c,0x8b,
1664 1.1 riastrad 0xfe,0xae,0xd2,0xbf, 0xb2,0x6f,0xf9,0xed,
1665 1.1 riastrad 0xc8,0x25,0x17,0xfe, 0x10,0x3b,0x7d,0xda,
1666 1.1 riastrad 0xf4,0x8d,0x35,0x4b, 0x7c,0x7b,0x82,0xe7,
1667 1.1 riastrad 0xc2,0xb3,0xee,0x60, 0x4a,0x03,0x86,0xc9,
1668 1.1 riastrad 0x4e,0xb5,0xc4,0xbe, 0xd2,0xbd,0x66,0xf1,
1669 1.1 riastrad 0x13,0xf1,0x09,0xab, 0x5d,0xca,0x63,0x1f,
1670 1.1 riastrad 0xfc,0xfb,0x57,0x2a, 0xfc,0xca,0x66,0xd8,
1671 1.1 riastrad 0x77,0x84,0x38,0x23, 0x1d,0xac,0xd3,0xb3,
1672 1.1 riastrad 0x7a,0xad,0x4c,0x70, 0xfa,0x9c,0xc9,0x61,
1673 1.1 riastrad 0xa6,0x1b,0xba,0x33, 0x4b,0x4e,0x33,0xec,
1674 1.1 riastrad 0xa0,0xa1,0x64,0x39, 0x40,0x05,0x1c,0xc2,
1675 1.1 riastrad 0x3f,0x49,0x9d,0xae, 0xf2,0xc5,0xf2,0xc5,
1676 1.1 riastrad 0xfe,0xe8,0xf4,0xc2, 0xf9,0x96,0x2d,0x28,
1677 1.1 riastrad 0x92,0x30,0x44,0xbc, 0xd2,0x7f,0xe1,0x6e,
1678 1.1 riastrad 0x62,0x02,0x8f,0x3d, 0x1c,0x80,0xda,0x0e,
1679 1.1 riastrad 0x6a,0x90,0x7e,0x75, 0xff,0xec,0x3e,0xc4,
1680 1.1 riastrad 0xcd,0x16,0x34,0x3b, 0x05,0x6d,0x4d,0x20,
1681 1.1 riastrad 0x1c,0x7b,0xf5,0x57, 0x4f,0xfa,0x3d,0xac,
1682 1.1 riastrad 0xd0,0x13,0x55,0xe8, 0xb3,0xe1,0x1b,0x78,
1683 1.1 riastrad 0x30,0xe6,0x9f,0x84, 0xd4,0x69,0xd1,0x08,
1684 1.1 riastrad 0x12,0x77,0xa7,0x4a, 0xbd,0xc0,0xf2,0xd2,
1685 1.1 riastrad 0x78,0xdd,0xa3,0x81, 0x12,0xcb,0x6c,0x14,
1686 1.1 riastrad 0x90,0x61,0xe2,0x84, 0xc6,0x2b,0x16,0xcc,
1687 1.1 riastrad 0x40,0x99,0x50,0x88, 0x01,0x09,0x64,0x4f,
1688 1.1 riastrad 0x0a,0x80,0xbe,0x61, 0xae,0x46,0xc9,0x0a,
1689 1.1 riastrad 0x5d,0xe0,0xfb,0x72, 0x7a,0x1a,0xdd,0x61,
1690 1.1 riastrad 0x63,0x20,0x05,0xa0, 0x4a,0xf0,0x60,0x69,
1691 1.1 riastrad 0x7f,0x92,0xbc,0xbf, 0x4e,0x39,0x4d,0xdd,
1692 1.1 riastrad 0x74,0xd1,0xb7,0xc0, 0x5a,0x34,0xb7,0xae,
1693 1.1 riastrad 0x76,0x65,0x2e,0xbc, 0x36,0xb9,0x04,0x95,
1694 1.1 riastrad 0x42,0xe9,0x6f,0xca, 0x78,0xb3,0x72,0x07,
1695 1.1 riastrad 0xa3,0xba,0x02,0x94, 0x67,0x4c,0xb1,0xd7,
1696 1.1 riastrad 0xe9,0x30,0x0d,0xf0, 0x3b,0xb8,0x10,0x6d,
1697 1.1 riastrad 0xea,0x2b,0x21,0xbf, 0x74,0x59,0x82,0x97,
1698 1.1 riastrad 0x85,0xaa,0xf1,0xd7, 0x54,0x39,0xeb,0x05,
1699 1.1 riastrad 0xbd,0xf3,0x40,0xa0, 0x97,0xe6,0x74,0xfe,
1700 1.1 riastrad 0xb4,0x82,0x5b,0xb1, 0x36,0xcb,0xe8,0x0d,
1701 1.1 riastrad 0xce,0x14,0xd9,0xdf, 0xf1,0x94,0x22,0xcd,
1702 1.1 riastrad 0xd6,0x00,0xba,0x04, 0x4c,0x05,0x0c,0xc0,
1703 1.1 riastrad 0xd1,0x5a,0xeb,0x52, 0xd5,0xa8,0x8e,0xc8,
1704 1.1 riastrad 0x97,0xa1,0xaa,0xc1, 0xea,0xc1,0xbe,0x7c,
1705 1.1 riastrad 0x36,0xb3,0x36,0xa0, 0xc6,0x76,0x66,0xc5,
1706 1.1 riastrad 0xe2,0xaf,0xd6,0x5c, 0xe2,0xdb,0x2c,0xb3,
1707 1.1 riastrad 0x6c,0xb9,0x99,0x7f, 0xff,0x9f,0x03,0x24,
1708 1.1 riastrad 0xe1,0x51,0x44,0x66, 0xd8,0x0c,0x5d,0x7f,
1709 1.1 riastrad 0x5c,0x85,0x22,0x2a, 0xcf,0x6d,0x79,0x28,
1710 1.1 riastrad 0xab,0x98,0x01,0x72, 0xfe,0x80,0x87,0x5f,
1711 1.1 riastrad 0x46,0xba,0xef,0x81, 0x24,0xee,0xbf,0xb0,
1712 1.1 riastrad 0x24,0x74,0xa3,0x65, 0x97,0x12,0xc4,0xaf,
1713 1.1 riastrad 0x8b,0xa0,0x39,0xda, 0x8a,0x7e,0x74,0x6e,
1714 1.1 riastrad 0x1b,0x42,0xb4,0x44, 0x37,0xfc,0x59,0xfd,
1715 1.1 riastrad 0x86,0xed,0xfb,0x8c, 0x66,0x33,0xda,0x63,
1716 1.1 riastrad 0x75,0xeb,0xe1,0xa4, 0x85,0x4f,0x50,0x8f,
1717 1.1 riastrad 0x83,0x66,0x0d,0xd3, 0x37,0xfa,0xe6,0x9c,
1718 1.1 riastrad 0x4f,0x30,0x87,0x35, 0x18,0xe3,0x0b,0xb7,
1719 1.1 riastrad 0x6e,0x64,0x54,0xcd, 0x70,0xb3,0xde,0x54,
1720 1.1 riastrad 0xb7,0x1d,0xe6,0x4c, 0x4d,0x55,0x12,0x12,
1721 1.1 riastrad 0xaf,0x5f,0x7f,0x5e, 0xee,0x9d,0xe8,0x8e,
1722 1.1 riastrad 0x32,0x9d,0x4e,0x75, 0xeb,0xc6,0xdd,0xaa,
1723 1.1 riastrad 0x48,0x82,0xa4,0x3f, 0x3c,0xd7,0xd3,0xa8,
1724 1.1 riastrad 0x63,0x9e,0x64,0xfe, 0xe3,0x97,0x00,0x62,
1725 1.1 riastrad 0xe5,0x40,0x5d,0xc3, 0xad,0x72,0xe1,0x28,
1726 1.1 riastrad 0x18,0x50,0xb7,0x75, 0xef,0xcd,0x23,0xbf,
1727 1.1 riastrad 0x3f,0xc0,0x51,0x36, 0xf8,0x41,0xc3,0x08,
1728 1.1 riastrad 0xcb,0xf1,0x8d,0x38, 0x34,0xbd,0x48,0x45,
1729 1.1 riastrad 0x75,0xed,0xbc,0x65, 0x7b,0xb5,0x0c,0x9b,
1730 1.1 riastrad 0xd7,0x67,0x7d,0x27, 0xb4,0xc4,0x80,0xd7,
1731 1.1 riastrad 0xa9,0xb9,0xc7,0x4a, 0x97,0xaa,0xda,0xc8,
1732 1.1 riastrad 0x3c,0x74,0xcf,0x36, 0x8f,0xe4,0x41,0xe3,
1733 1.1 riastrad 0xd4,0xd3,0x26,0xa7, 0xf3,0x23,0x9d,0x8f,
1734 1.1 riastrad 0x6c,0x20,0x05,0x32, 0x3e,0xe0,0xc3,0xc8,
1735 1.1 riastrad 0x56,0x3f,0xa7,0x09, 0xb7,0xfb,0xc7,0xf7,
1736 1.1 riastrad 0xbe,0x2a,0xdd,0x0f, 0x06,0x7b,0x0d,0xdd,
1737 1.1 riastrad 0xb0,0xb4,0x86,0x17, 0xfd,0xb9,0x04,0xe5,
1738 1.1 riastrad 0xc0,0x64,0x5d,0xad, 0x2a,0x36,0x38,0xdb,
1739 1.1 riastrad 0x24,0xaf,0x5b,0xff, 0xca,0xf9,0x41,0xe8,
1740 1.1 riastrad 0xf9,0x2f,0x1e,0x5e, 0xf9,0xf5,0xd5,0xf2,
1741 1.1 riastrad 0xb2,0x88,0xca,0xc9, 0xa1,0x31,0xe2,0xe8,
1742 1.1 riastrad 0x10,0x95,0x65,0xbf, 0xf1,0x11,0x61,0x7a,
1743 1.1 riastrad 0x30,0x1a,0x54,0x90, 0xea,0xd2,0x30,0xf6,
1744 1.1 riastrad 0xa5,0xad,0x60,0xf9, 0x4d,0x84,0x21,0x1b,
1745 1.1 riastrad 0xe4,0x42,0x22,0xc8, 0x12,0x4b,0xb0,0x58,
1746 1.1 riastrad 0x3e,0x9c,0x2d,0x32, 0x95,0x0a,0x8e,0xb0,
1747 1.1 riastrad 0x0a,0x7e,0x77,0x2f, 0xe8,0x97,0x31,0x6a,
1748 1.1 riastrad 0xf5,0x59,0xb4,0x26, 0xe6,0x37,0x12,0xc9,
1749 1.1 riastrad 0xcb,0xa0,0x58,0x33, 0x6f,0xd5,0x55,0x55,
1750 1.1 riastrad 0x3c,0xa1,0x33,0xb1, 0x0b,0x7e,0x2e,0xb4,
1751 1.1 riastrad 0x43,0x2a,0x84,0x39, 0xf0,0x9c,0xf4,0x69,
1752 1.1 riastrad 0x4f,0x1e,0x79,0xa6, 0x15,0x1b,0x87,0xbb,
1753 1.1 riastrad 0xdb,0x9b,0xe0,0xf1, 0x0b,0xba,0xe3,0x6e,
1754 1.1 riastrad 0xcc,0x2f,0x49,0x19, 0x22,0x29,0xfc,0x71,
1755 1.1 riastrad 0xbb,0x77,0x38,0x18, 0x61,0xaf,0x85,0x76,
1756 1.1 riastrad 0xeb,0xd1,0x09,0xcc, 0x86,0x04,0x20,0x9a,
1757 1.1 riastrad 0x66,0x53,0x2f,0x44, 0x8b,0xc6,0xa3,0xd2,
1758 1.1 riastrad 0x5f,0xc7,0x79,0x82, 0x66,0xa8,0x6e,0x75,
1759 1.1 riastrad 0x7d,0x94,0xd1,0x86, 0x75,0x0f,0xa5,0x4f,
1760 1.1 riastrad 0x3c,0x7a,0x33,0xce, 0xd1,0x6e,0x9d,0x7b,
1761 1.1 riastrad 0x1f,0x91,0x37,0xb8, 0x37,0x80,0xfb,0xe0,
1762 1.1 riastrad 0x52,0x26,0xd0,0x9a, 0xd4,0x48,0x02,0x41,
1763 1.1 riastrad 0x05,0xe3,0x5a,0x94, 0xf1,0x65,0x61,0x19,
1764 1.1 riastrad 0xb8,0x88,0x4e,0x2b, 0xea,0xba,0x8b,0x58,
1765 1.1 riastrad 0x8b,0x42,0x01,0x00, 0xa8,0xfe,0x00,0x5c,
1766 1.1 riastrad 0xfe,0x1c,0xee,0x31, 0x15,0x69,0xfa,0xb3,
1767 1.1 riastrad 0x9b,0x5f,0x22,0x8e, 0x0d,0x2c,0xe3,0xa5,
1768 1.1 riastrad 0x21,0xb9,0x99,0x8a, 0x8e,0x94,0x5a,0xef,
1769 1.1 riastrad 0x13,0x3e,0x99,0x96, 0x79,0x6e,0xd5,0x42,
1770 1.1 riastrad 0x36,0x03,0xa9,0xe2, 0xca,0x65,0x4e,0x8a,
1771 1.1 riastrad 0x8a,0x30,0xd2,0x7d, 0x74,0xe7,0xf0,0xaa,
1772 1.1 riastrad 0x23,0x26,0xdd,0xcb, 0x82,0x39,0xfc,0x9d,
1773 1.1 riastrad 0x51,0x76,0x21,0x80, 0xa2,0xbe,0x93,0x03,
1774 1.1 riastrad 0x47,0xb0,0xc1,0xb6, 0xdc,0x63,0xfd,0x9f,
1775 1.1 riastrad 0xca,0x9d,0xa5,0xca, 0x27,0x85,0xe2,0xd8,
1776 1.1 riastrad 0x15,0x5b,0x7e,0x14, 0x7a,0xc4,0x89,0xcc,
1777 1.1 riastrad 0x74,0x14,0x4b,0x46, 0xd2,0xce,0xac,0x39,
1778 1.1 riastrad 0x6b,0x6a,0x5a,0xa4, 0x0e,0xe3,0x7b,0x15,
1779 1.1 riastrad 0x94,0x4b,0x0f,0x74, 0xcb,0x0c,0x7f,0xa9,
1780 1.1 riastrad 0xbe,0x09,0x39,0xa3, 0xdd,0x56,0x5c,0xc7,
1781 1.1 riastrad 0x99,0x56,0x65,0x39, 0xf4,0x0b,0x7d,0x87,
1782 1.1 riastrad 0xec,0xaa,0xe3,0x4d, 0x22,0x65,0x39,0x4e,
1783 1.1 riastrad },
1784 1.1 riastrad .h = {
1785 1.1 riastrad 0x64,0x3a,0xbc,0xc3, 0x3f,0x74,0x40,0x51,
1786 1.1 riastrad 0x6e,0x56,0x01,0x1a, 0x51,0xec,0x36,0xde,
1787 1.1 riastrad },
1788 1.1 riastrad },
1789 1.1 riastrad };
1790 1.1 riastrad const uint8_t *pk;
1791 1.1 riastrad const uint8_t *nhk;
1792 1.1 riastrad static uint32_t nhk32[268];
1793 1.1 riastrad uint8_t h[16];
1794 1.1 riastrad unsigned i, j;
1795 1.1 riastrad int result = 0;
1796 1.1 riastrad
1797 1.1 riastrad for (i = 0; i < __arraycount(C); i++) {
1798 1.1 riastrad pk = C[i].k;
1799 1.1 riastrad nhk = C[i].k + 16;
1800 1.1 riastrad for (j = 0; j < 268; j++)
1801 1.1 riastrad nhk32[j] = le32dec(nhk + 4*j);
1802 1.1 riastrad nhpoly1305(h, C[i].m, C[i].mlen, pk, nhk32);
1803 1.1 riastrad if (memcmp(h, C[i].h, 16)) {
1804 1.1 riastrad char prefix[16];
1805 1.1 riastrad snprintf(prefix, sizeof prefix, "nhpoly1305 %u", i);
1806 1.1 riastrad hexdump(printf, prefix, h, 32);
1807 1.1 riastrad result = -1;
1808 1.1 riastrad }
1809 1.1 riastrad }
1810 1.1 riastrad
1811 1.1 riastrad return result;
1812 1.1 riastrad }
1813 1.1 riastrad
1814 1.1 riastrad /* ChaCha core */
1816 1.1 riastrad
1817 1.1 riastrad static uint32_t
1818 1.1 riastrad rol32(uint32_t u, unsigned c)
1819 1.1 riastrad {
1820 1.1 riastrad
1821 1.1 riastrad return (u << c) | (u >> (32 - c));
1822 1.1 riastrad }
1823 1.1 riastrad
1824 1.1 riastrad #define CHACHA_QUARTERROUND(a, b, c, d) do { \
1825 1.1 riastrad (a) += (b); (d) ^= (a); (d) = rol32((d), 16); \
1826 1.1 riastrad (c) += (d); (b) ^= (c); (b) = rol32((b), 12); \
1827 1.1 riastrad (a) += (b); (d) ^= (a); (d) = rol32((d), 8); \
1828 1.1 riastrad (c) += (d); (b) ^= (c); (b) = rol32((b), 7); \
1829 1.1 riastrad } while (/*CONSTCOND*/0)
1830 1.1 riastrad
1831 1.1 riastrad const uint8_t chacha_const32[16] = "expand 32-byte k";
1832 1.1 riastrad
1833 1.1 riastrad static void
1834 1.1 riastrad chacha_core(uint8_t out[restrict static 64], const uint8_t in[static 16],
1835 1.1 riastrad const uint8_t k[static 32], const uint8_t c[static 16], unsigned nr)
1836 1.1 riastrad {
1837 1.1 riastrad uint32_t x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15;
1838 1.1 riastrad uint32_t y0,y1,y2,y3,y4,y5,y6,y7,y8,y9,y10,y11,y12,y13,y14,y15;
1839 1.1 riastrad int i;
1840 1.1 riastrad
1841 1.1 riastrad x0 = y0 = le32dec(c + 0);
1842 1.1 riastrad x1 = y1 = le32dec(c + 4);
1843 1.1 riastrad x2 = y2 = le32dec(c + 8);
1844 1.1 riastrad x3 = y3 = le32dec(c + 12);
1845 1.1 riastrad x4 = y4 = le32dec(k + 0);
1846 1.1 riastrad x5 = y5 = le32dec(k + 4);
1847 1.1 riastrad x6 = y6 = le32dec(k + 8);
1848 1.1 riastrad x7 = y7 = le32dec(k + 12);
1849 1.1 riastrad x8 = y8 = le32dec(k + 16);
1850 1.1 riastrad x9 = y9 = le32dec(k + 20);
1851 1.1 riastrad x10 = y10 = le32dec(k + 24);
1852 1.1 riastrad x11 = y11 = le32dec(k + 28);
1853 1.1 riastrad x12 = y12 = le32dec(in + 0);
1854 1.1 riastrad x13 = y13 = le32dec(in + 4);
1855 1.1 riastrad x14 = y14 = le32dec(in + 8);
1856 1.1 riastrad x15 = y15 = le32dec(in + 12);
1857 1.1 riastrad
1858 1.1 riastrad for (i = nr; i > 0; i -= 2) {
1859 1.1 riastrad CHACHA_QUARTERROUND( y0, y4, y8,y12);
1860 1.1 riastrad CHACHA_QUARTERROUND( y1, y5, y9,y13);
1861 1.1 riastrad CHACHA_QUARTERROUND( y2, y6,y10,y14);
1862 1.1 riastrad CHACHA_QUARTERROUND( y3, y7,y11,y15);
1863 1.1 riastrad CHACHA_QUARTERROUND( y0, y5,y10,y15);
1864 1.1 riastrad CHACHA_QUARTERROUND( y1, y6,y11,y12);
1865 1.1 riastrad CHACHA_QUARTERROUND( y2, y7, y8,y13);
1866 1.1 riastrad CHACHA_QUARTERROUND( y3, y4, y9,y14);
1867 1.1 riastrad }
1868 1.1 riastrad
1869 1.1 riastrad le32enc(out + 0, x0 + y0);
1870 1.1 riastrad le32enc(out + 4, x1 + y1);
1871 1.1 riastrad le32enc(out + 8, x2 + y2);
1872 1.1 riastrad le32enc(out + 12, x3 + y3);
1873 1.1 riastrad le32enc(out + 16, x4 + y4);
1874 1.1 riastrad le32enc(out + 20, x5 + y5);
1875 1.1 riastrad le32enc(out + 24, x6 + y6);
1876 1.1 riastrad le32enc(out + 28, x7 + y7);
1877 1.1 riastrad le32enc(out + 32, x8 + y8);
1878 1.1 riastrad le32enc(out + 36, x9 + y9);
1879 1.1 riastrad le32enc(out + 40, x10 + y10);
1880 1.1 riastrad le32enc(out + 44, x11 + y11);
1881 1.1 riastrad le32enc(out + 48, x12 + y12);
1882 1.1 riastrad le32enc(out + 52, x13 + y13);
1883 1.1 riastrad le32enc(out + 56, x14 + y14);
1884 1.1 riastrad le32enc(out + 60, x15 + y15);
1885 1.1 riastrad }
1886 1.1 riastrad
1887 1.1 riastrad /* https://tools.ietf.org/html/draft-strombergson-chacha-test-vectors-00 */
1889 1.1 riastrad static int
1890 1.1 riastrad chacha_core_selftest(void)
1891 1.1 riastrad {
1892 1.1 riastrad /* TC1, 32-byte key, rounds=12, keystream block 1 */
1893 1.1 riastrad static const uint8_t zero[32];
1894 1.1 riastrad static const uint8_t expected0[64] = {
1895 1.1 riastrad 0x9b,0xf4,0x9a,0x6a, 0x07,0x55,0xf9,0x53,
1896 1.1 riastrad 0x81,0x1f,0xce,0x12, 0x5f,0x26,0x83,0xd5,
1897 1.1 riastrad 0x04,0x29,0xc3,0xbb, 0x49,0xe0,0x74,0x14,
1898 1.1 riastrad 0x7e,0x00,0x89,0xa5, 0x2e,0xae,0x15,0x5f,
1899 1.1 riastrad 0x05,0x64,0xf8,0x79, 0xd2,0x7a,0xe3,0xc0,
1900 1.1 riastrad 0x2c,0xe8,0x28,0x34, 0xac,0xfa,0x8c,0x79,
1901 1.1 riastrad 0x3a,0x62,0x9f,0x2c, 0xa0,0xde,0x69,0x19,
1902 1.1 riastrad 0x61,0x0b,0xe8,0x2f, 0x41,0x13,0x26,0xbe,
1903 1.1 riastrad };
1904 1.1 riastrad /* TC7, 32-byte key, rounds=12, keystream block 2 */
1905 1.1 riastrad static const uint8_t k1[32] = {
1906 1.1 riastrad 0x00,0x11,0x22,0x33, 0x44,0x55,0x66,0x77,
1907 1.1 riastrad 0x88,0x99,0xaa,0xbb, 0xcc,0xdd,0xee,0xff,
1908 1.1 riastrad 0xff,0xee,0xdd,0xcc, 0xbb,0xaa,0x99,0x88,
1909 1.1 riastrad 0x77,0x66,0x55,0x44, 0x33,0x22,0x11,0x00,
1910 1.1 riastrad };
1911 1.1 riastrad static const uint8_t in1[16] = {
1912 1.1 riastrad 0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
1913 1.1 riastrad 0x0f,0x1e,0x2d,0x3c, 0x4b,0x59,0x68,0x77,
1914 1.1 riastrad };
1915 1.1 riastrad static const uint8_t expected1[64] = {
1916 1.1 riastrad 0xcd,0x9a,0x2a,0xa9, 0xea,0x93,0xc2,0x67,
1917 1.1 riastrad 0x5e,0x82,0x88,0x14, 0x08,0xde,0x85,0x2c,
1918 1.1 riastrad 0x62,0xfa,0x74,0x6a, 0x30,0xe5,0x2b,0x45,
1919 1.1 riastrad 0xa2,0x69,0x62,0xcf, 0x43,0x51,0xe3,0x04,
1920 1.1 riastrad 0xd3,0x13,0x20,0xbb, 0xd6,0xaa,0x6c,0xc8,
1921 1.1 riastrad 0xf3,0x26,0x37,0xf9, 0x59,0x34,0xe4,0xc1,
1922 1.1 riastrad 0x45,0xef,0xd5,0x62, 0x31,0xef,0x31,0x61,
1923 1.1 riastrad 0x03,0x28,0x36,0xf4, 0x96,0x71,0x83,0x3e,
1924 1.1 riastrad };
1925 1.1 riastrad uint8_t out[64];
1926 1.1 riastrad int result = 0;
1927 1.1 riastrad
1928 1.1 riastrad chacha_core(out, zero, zero, chacha_const32, 12);
1929 1.1 riastrad if (memcmp(out, expected0, 64)) {
1930 1.1 riastrad hexdump(printf, "chacha core 1", out, sizeof out);
1931 1.1 riastrad result = -1;
1932 1.1 riastrad }
1933 1.1 riastrad
1934 1.1 riastrad chacha_core(out, in1, k1, chacha_const32, 12);
1935 1.1 riastrad if (memcmp(out, expected1, 64)) {
1936 1.1 riastrad hexdump(printf, "chacha core 2", out, sizeof out);
1937 1.1 riastrad result = -1;
1938 1.1 riastrad }
1939 1.1 riastrad
1940 1.1 riastrad return result;
1941 1.1 riastrad }
1942 1.1 riastrad
1943 1.1 riastrad /* HChaCha */
1945 1.1 riastrad
1946 1.1 riastrad static void
1947 1.1 riastrad hchacha(uint8_t out[restrict static 32], const uint8_t in[static 16],
1948 1.1 riastrad const uint8_t k[static 32], const uint8_t c[static 16], unsigned nr)
1949 1.1 riastrad {
1950 1.1 riastrad uint8_t t[64];
1951 1.1 riastrad
1952 1.1 riastrad chacha_core(t, in, k, c, nr);
1953 1.1 riastrad le32enc(out + 0, le32dec(t + 0) - le32dec(c + 0));
1954 1.1 riastrad le32enc(out + 4, le32dec(t + 4) - le32dec(c + 4));
1955 1.1 riastrad le32enc(out + 8, le32dec(t + 8) - le32dec(c + 8));
1956 1.1 riastrad le32enc(out + 12, le32dec(t + 12) - le32dec(c + 12));
1957 1.1 riastrad le32enc(out + 16, le32dec(t + 48) - le32dec(in + 0));
1958 1.1 riastrad le32enc(out + 20, le32dec(t + 52) - le32dec(in + 4));
1959 1.1 riastrad le32enc(out + 24, le32dec(t + 56) - le32dec(in + 8));
1960 1.1 riastrad le32enc(out + 28, le32dec(t + 60) - le32dec(in + 12));
1961 1.1 riastrad }
1962 1.1 riastrad
1963 1.1 riastrad static int
1964 1.1 riastrad hchacha_selftest(void)
1965 1.1 riastrad {
1966 1.1 riastrad /* https://tools.ietf.org/html/draft-irtf-cfrg-xchacha-03, 2.2.1 */
1967 1.1 riastrad static const uint8_t k[32] = {
1968 1.1 riastrad 0x00,0x01,0x02,0x03, 0x04,0x05,0x06,0x07,
1969 1.1 riastrad 0x08,0x09,0x0a,0x0b, 0x0c,0x0d,0x0e,0x0f,
1970 1.1 riastrad 0x10,0x11,0x12,0x13, 0x14,0x15,0x16,0x17,
1971 1.1 riastrad 0x18,0x19,0x1a,0x1b, 0x1c,0x1d,0x1e,0x1f,
1972 1.1 riastrad };
1973 1.1 riastrad static const uint8_t in[16] = {
1974 1.1 riastrad 0x00,0x00,0x00,0x09, 0x00,0x00,0x00,0x4a,
1975 1.1 riastrad 0x00,0x00,0x00,0x00, 0x31,0x41,0x59,0x27,
1976 1.1 riastrad };
1977 1.1 riastrad static const uint8_t expected[32] = {
1978 1.1 riastrad 0x82,0x41,0x3b,0x42, 0x27,0xb2,0x7b,0xfe,
1979 1.1 riastrad 0xd3,0x0e,0x42,0x50, 0x8a,0x87,0x7d,0x73,
1980 1.1 riastrad 0xa0,0xf9,0xe4,0xd5, 0x8a,0x74,0xa8,0x53,
1981 1.1 riastrad 0xc1,0x2e,0xc4,0x13, 0x26,0xd3,0xec,0xdc,
1982 1.1 riastrad };
1983 1.1 riastrad uint8_t out[32];
1984 1.1 riastrad int result = 0;
1985 1.1 riastrad
1986 1.1 riastrad hchacha(out, in, k, chacha_const32, 20);
1987 1.1 riastrad if (memcmp(out, expected, 32)) {
1988 1.1 riastrad hexdump(printf, "hchacha", out, sizeof out);
1989 1.1 riastrad result = -1;
1990 1.1 riastrad }
1991 1.1 riastrad
1992 1.1 riastrad return result;
1993 1.1 riastrad }
1994 1.1 riastrad
1995 1.1 riastrad /* XChaCha */
1997 1.1 riastrad
1998 1.1 riastrad static void
1999 1.1 riastrad xchacha_xor(uint8_t *c, const uint8_t *p, size_t nbytes,
2000 1.1 riastrad const uint8_t nonce[static 24], const uint8_t k[static 32], unsigned nr)
2001 1.1 riastrad {
2002 1.1 riastrad uint8_t h[32];
2003 1.1 riastrad uint8_t in[16];
2004 1.1 riastrad uint8_t block[64];
2005 1.1 riastrad unsigned i;
2006 1.1 riastrad
2007 1.1 riastrad hchacha(h, nonce, k, chacha_const32, nr);
2008 1.1 riastrad memset(in, 0, 8);
2009 1.1 riastrad memcpy(in + 8, nonce + 16, 8);
2010 1.1 riastrad
2011 1.1 riastrad for (; nbytes; nbytes -= i, c += i, p += i) {
2012 1.1 riastrad chacha_core(block, in, h, chacha_const32, nr);
2013 1.1 riastrad for (i = 0; i < MIN(nbytes, 64); i++)
2014 1.1 riastrad c[i] = p[i] ^ block[i];
2015 1.1 riastrad le32enc(in, 1 + le32dec(in));
2016 1.1 riastrad }
2017 1.1 riastrad }
2018 1.1 riastrad
2019 1.1 riastrad static int
2020 1.1 riastrad xchacha_selftest(void)
2021 1.1 riastrad {
2022 1.1 riastrad /* https://tools.ietf.org/html/draft-irtf-cfrg-xchacha-03, A.2.2 */
2023 1.1 riastrad static const uint8_t k[32] = {
2024 1.1 riastrad 0x80,0x81,0x82,0x83, 0x84,0x85,0x86,0x87,
2025 1.1 riastrad 0x88,0x89,0x8a,0x8b, 0x8c,0x8d,0x8e,0x8f,
2026 1.1 riastrad 0x90,0x91,0x92,0x93, 0x94,0x95,0x96,0x97,
2027 1.1 riastrad 0x98,0x99,0x9a,0x9b, 0x9c,0x9d,0x9e,0x9f,
2028 1.1 riastrad };
2029 1.1 riastrad static const uint8_t nonce[24] = {
2030 1.1 riastrad 0x40,0x41,0x42,0x43, 0x44,0x45,0x46,0x47,
2031 1.1 riastrad 0x48,0x49,0x4a,0x4b, 0x4c,0x4d,0x4e,0x4f,
2032 1.1 riastrad 0x50,0x51,0x52,0x53, 0x54,0x55,0x56,0x58,
2033 1.1 riastrad };
2034 1.1 riastrad static const uint8_t p[128] = {
2035 1.1 riastrad 0x54,0x68,0x65,0x20, 0x64,0x68,0x6f,0x6c,
2036 1.1 riastrad 0x65,0x20,0x28,0x70, 0x72,0x6f,0x6e,0x6f,
2037 1.1 riastrad 0x75,0x6e,0x63,0x65, 0x64,0x20,0x22,0x64,
2038 1.1 riastrad 0x6f,0x6c,0x65,0x22, 0x29,0x20,0x69,0x73,
2039 1.1 riastrad 0x20,0x61,0x6c,0x73, 0x6f,0x20,0x6b,0x6e,
2040 1.1 riastrad 0x6f,0x77,0x6e,0x20, 0x61,0x73,0x20,0x74,
2041 1.1 riastrad 0x68,0x65,0x20,0x41, 0x73,0x69,0x61,0x74,
2042 1.1 riastrad 0x69,0x63,0x20,0x77, 0x69,0x6c,0x64,0x20,
2043 1.1 riastrad 0x64,0x6f,0x67,0x2c, 0x20,0x72,0x65,0x64,
2044 1.1 riastrad 0x20,0x64,0x6f,0x67, 0x2c,0x20,0x61,0x6e,
2045 1.1 riastrad 0x64,0x20,0x77,0x68, 0x69,0x73,0x74,0x6c,
2046 1.1 riastrad 0x69,0x6e,0x67,0x20, 0x64,0x6f,0x67,0x2e,
2047 1.1 riastrad 0x20,0x49,0x74,0x20, 0x69,0x73,0x20,0x61,
2048 1.1 riastrad 0x62,0x6f,0x75,0x74, 0x20,0x74,0x68,0x65,
2049 1.1 riastrad 0x20,0x73,0x69,0x7a, 0x65,0x20,0x6f,0x66,
2050 1.1 riastrad 0x20,0x61,0x20,0x47, 0x65,0x72,0x6d,0x61,
2051 1.1 riastrad };
2052 1.1 riastrad static const uint8_t expected[128] = {
2053 1.1 riastrad 0x45,0x59,0xab,0xba, 0x4e,0x48,0xc1,0x61,
2054 1.1 riastrad 0x02,0xe8,0xbb,0x2c, 0x05,0xe6,0x94,0x7f,
2055 1.1 riastrad 0x50,0xa7,0x86,0xde, 0x16,0x2f,0x9b,0x0b,
2056 1.1 riastrad 0x7e,0x59,0x2a,0x9b, 0x53,0xd0,0xd4,0xe9,
2057 1.1 riastrad 0x8d,0x8d,0x64,0x10, 0xd5,0x40,0xa1,0xa6,
2058 1.1 riastrad 0x37,0x5b,0x26,0xd8, 0x0d,0xac,0xe4,0xfa,
2059 1.1 riastrad 0xb5,0x23,0x84,0xc7, 0x31,0xac,0xbf,0x16,
2060 1.1 riastrad 0xa5,0x92,0x3c,0x0c, 0x48,0xd3,0x57,0x5d,
2061 1.1 riastrad 0x4d,0x0d,0x2c,0x67, 0x3b,0x66,0x6f,0xaa,
2062 1.1 riastrad 0x73,0x10,0x61,0x27, 0x77,0x01,0x09,0x3a,
2063 1.1 riastrad 0x6b,0xf7,0xa1,0x58, 0xa8,0x86,0x42,0x92,
2064 1.1 riastrad 0xa4,0x1c,0x48,0xe3, 0xa9,0xb4,0xc0,0xda,
2065 1.1 riastrad 0xec,0xe0,0xf8,0xd9, 0x8d,0x0d,0x7e,0x05,
2066 1.1 riastrad 0xb3,0x7a,0x30,0x7b, 0xbb,0x66,0x33,0x31,
2067 1.1 riastrad 0x64,0xec,0x9e,0x1b, 0x24,0xea,0x0d,0x6c,
2068 1.1 riastrad 0x3f,0xfd,0xdc,0xec, 0x4f,0x68,0xe7,0x44,
2069 1.1 riastrad };
2070 1.1 riastrad uint8_t c[128];
2071 1.1 riastrad int result = 0;
2072 1.1 riastrad
2073 1.1 riastrad xchacha_xor(c, p, 128, nonce, k, 20);
2074 1.1 riastrad if (memcmp(c, expected, 128)) {
2075 1.1 riastrad hexdump(printf, "xchacha", c, sizeof c);
2076 1.1 riastrad result = -1;
2077 1.1 riastrad }
2078 1.1 riastrad
2079 1.1 riastrad return result;
2080 1.1 riastrad }
2081 1.1 riastrad
2082 1.1 riastrad void
2084 1.1 riastrad adiantum_init(struct adiantum *A, const uint8_t key[static 32])
2085 1.1 riastrad {
2086 1.1 riastrad uint8_t nonce[24] = {1};
2087 1.1 riastrad unsigned i;
2088 1.1 riastrad
2089 1.1 riastrad memcpy(A->ks, key, 32);
2090 1.1 riastrad
2091 1.1 riastrad /* Relies on ordering of struct members. */
2092 1.1 riastrad memset(A->kk, 0, 32 + 16 + 16 + 1072);
2093 1.1 riastrad xchacha_xor(A->kk, A->kk, 32 + 16 + 16 + 1072, nonce, A->ks, 12);
2094 1.1 riastrad
2095 1.1 riastrad /* Put the NH key words into host byte order. */
2096 1.1 riastrad for (i = 0; i < __arraycount(A->kn); i++)
2097 1.1 riastrad A->kn[i] = le32toh(A->kn[i]);
2098 1.1 riastrad
2099 1.1 riastrad /* Expand the AES key. */
2100 1.1 riastrad aes_setenckey256(&A->kk_enc, A->kk);
2101 1.1 riastrad aes_setdeckey256(&A->kk_dec, A->kk);
2102 1.1 riastrad }
2103 1.1 riastrad
2104 1.1 riastrad static void
2105 1.1 riastrad adiantum_hash(uint8_t h[static 16], const void *l, size_t llen,
2106 1.1 riastrad const void *t, size_t tlen,
2107 1.1 riastrad const uint8_t kt[static 16],
2108 1.1 riastrad const uint8_t kl[static 16],
2109 1.1 riastrad const uint32_t kn[static 268])
2110 1.1 riastrad {
2111 1.1 riastrad const uint8_t *t8 = t;
2112 1.1 riastrad struct poly1305 P;
2113 1.1 riastrad uint8_t llenbuf[16];
2114 1.1 riastrad uint8_t ht[16];
2115 1.1 riastrad uint8_t hl[16];
2116 1.1 riastrad
2117 1.1 riastrad KASSERT(llen % 16 == 0);
2118 1.1 riastrad
2119 1.1 riastrad memset(llenbuf, 0, sizeof llenbuf);
2120 1.1 riastrad le64enc(llenbuf, 8*llen);
2121 1.1 riastrad
2122 1.1 riastrad /* Compute H_T := Poly1305_{K_T}(le128(|l|) || tweak). */
2123 1.1 riastrad poly1305_init(&P, kt);
2124 1.1 riastrad if (tlen == 0) {
2125 1.1 riastrad poly1305_update_last(&P, llenbuf, 16);
2126 1.1 riastrad } else {
2127 1.1 riastrad poly1305_update_block(&P, llenbuf);
2128 1.1 riastrad for (; tlen > 16; t8 += 16, tlen -= 16)
2129 1.1 riastrad poly1305_update_block(&P, t8);
2130 1.1 riastrad poly1305_update_last(&P, t8, tlen);
2131 1.1 riastrad }
2132 1.1 riastrad poly1305_final(ht, &P);
2133 1.1 riastrad
2134 1.1 riastrad /* Compute H_L := Poly1305_{K_L}(NH(pad_128(l))). */
2135 1.1 riastrad nhpoly1305(hl, l, llen, kl, kn);
2136 1.1 riastrad
2137 1.1 riastrad /* Compute H := H_T + H_L (mod 2^128). */
2138 1.1 riastrad add128(h, ht, hl);
2139 1.1 riastrad }
2140 1.1 riastrad
2141 1.1 riastrad void
2143 1.1 riastrad adiantum_enc(void *c, const void *p, size_t len, const void *t, size_t tlen,
2144 1.1 riastrad const struct adiantum *A)
2145 1.1 riastrad {
2146 1.1 riastrad size_t Rlen = 16;
2147 1.1 riastrad size_t Llen = len - Rlen;
2148 1.1 riastrad uint8_t *c8 = c;
2149 1.1 riastrad uint8_t *cL = c8;
2150 1.1 riastrad uint8_t *cR = c8 + Llen;
2151 1.1 riastrad const uint8_t *p8 = p;
2152 1.1 riastrad const uint8_t *pL = p8;
2153 1.1 riastrad const uint8_t *pR = p8 + Llen;
2154 1.1 riastrad uint8_t h[16];
2155 1.1 riastrad uint8_t buf[16] __aligned(16);
2156 1.1 riastrad uint8_t nonce[24];
2157 1.1 riastrad
2158 1.1 riastrad KASSERT(len % 16 == 0);
2159 1.1 riastrad
2160 1.1 riastrad aes_enc(&A->kk_enc, p, buf, AES_256_NROUNDS);
2161 1.1 riastrad
2162 1.1 riastrad adiantum_hash(h, pL, Llen, t, tlen, A->kt, A->kl, A->kn);
2163 1.1 riastrad add128(buf, pR, h); /* buf := P_M */
2164 1.1 riastrad aes_enc(&A->kk_enc, buf, buf, AES_256_NROUNDS); /* buf := C_M */
2165 1.1 riastrad
2166 1.1 riastrad memcpy(nonce, buf, 16);
2167 1.1 riastrad le64enc(nonce + 16, 1);
2168 1.1 riastrad xchacha_xor(cL, pL, Llen, nonce, A->ks, 12);
2169 1.1 riastrad
2170 1.1 riastrad adiantum_hash(h, cL, Llen, t, tlen, A->kt, A->kl, A->kn);
2171 1.1 riastrad sub128(cR, buf, h);
2172 1.1 riastrad
2173 1.1 riastrad explicit_memset(h, 0, sizeof h);
2174 1.1 riastrad explicit_memset(buf, 0, sizeof buf);
2175 1.1 riastrad }
2176 1.1 riastrad
2177 1.1 riastrad void
2178 1.1 riastrad adiantum_dec(void *p, const void *c, size_t len, const void *t, size_t tlen,
2179 1.1 riastrad const struct adiantum *A)
2180 1.1 riastrad {
2181 1.1 riastrad size_t Rlen = 16;
2182 1.1 riastrad size_t Llen = len - Rlen;
2183 1.1 riastrad const uint8_t *c8 = c;
2184 1.1 riastrad const uint8_t *cL = c8;
2185 1.1 riastrad const uint8_t *cR = c8 + Llen;
2186 1.1 riastrad uint8_t *p8 = p;
2187 1.1 riastrad uint8_t *pL = p8;
2188 1.1 riastrad uint8_t *pR = p8 + Llen;
2189 1.1 riastrad uint8_t h[16];
2190 1.1 riastrad uint8_t buf[16] __aligned(16);
2191 1.1 riastrad uint8_t nonce[24];
2192 1.1 riastrad
2193 1.1 riastrad KASSERT(len % 16 == 0);
2194 1.1 riastrad
2195 1.1 riastrad adiantum_hash(h, cL, Llen, t, tlen, A->kt, A->kl, A->kn);
2196 1.1 riastrad add128(buf, cR, h); /* buf := P_M */
2197 1.1 riastrad
2198 1.1 riastrad memcpy(nonce, buf, 16);
2199 1.1 riastrad le64enc(nonce + 16, 1);
2200 1.1 riastrad xchacha_xor(pL, cL, Llen, nonce, A->ks, 12);
2201 1.1 riastrad
2202 1.1 riastrad aes_dec(&A->kk_dec, buf, buf, AES_256_NROUNDS); /* buf := P_M */
2203 1.1 riastrad adiantum_hash(h, pL, Llen, t, tlen, A->kt, A->kl, A->kn);
2204 1.1 riastrad sub128(pR, buf, h);
2205 1.1 riastrad
2206 1.1 riastrad explicit_memset(h, 0, sizeof h);
2207 1.1 riastrad explicit_memset(buf, 0, sizeof buf);
2208 1.1 riastrad }
2209 1.1 riastrad
2210 1.1 riastrad #ifdef _KERNEL
2212 1.1 riastrad
2213 1.1 riastrad MODULE(MODULE_CLASS_MISC, adiantum, "aes");
2214 1.1 riastrad
2215 1.1 riastrad static int
2216 1.1 riastrad adiantum_modcmd(modcmd_t cmd, void *opaque)
2217 1.1 riastrad {
2218 1.1 riastrad
2219 1.1 riastrad switch (cmd) {
2220 1.1 riastrad case MODULE_CMD_INIT: {
2221 1.1 riastrad int result = 0;
2222 1.1 riastrad result |= addsub128_selftest();
2223 1.1 riastrad result |= poly1305_selftest();
2224 1.1 riastrad result |= nh_selftest();
2225 1.1 riastrad result |= nhpoly1305_selftest();
2226 1.1 riastrad result |= chacha_core_selftest();
2227 1.1 riastrad result |= hchacha_selftest();
2228 1.1 riastrad result |= xchacha_selftest();
2229 1.1 riastrad result |= adiantum_selftest();
2230 1.1 riastrad if (result)
2231 1.1 riastrad panic("adiantum self-tests failed");
2232 1.1 riastrad return 0;
2233 1.1 riastrad }
2234 1.1 riastrad case MODULE_CMD_FINI:
2235 1.1 riastrad return 0;
2236 1.1 riastrad default:
2237 1.1 riastrad return ENOTTY;
2238 1.1 riastrad }
2239 1.1 riastrad }
2240 1.1 riastrad
2241 1.1 riastrad #else /* !defined(_KERNEL) */
2243 1.1 riastrad
2244 1.1 riastrad #include <err.h>
2245 1.1 riastrad #include <stdio.h>
2246 1.1 riastrad #include <unistd.h>
2247 1.1 riastrad
2248 1.1 riastrad static int
2249 1.1 riastrad read_block(int fd, void *buf, size_t len)
2250 1.1 riastrad {
2251 1.1 riastrad char *p = buf;
2252 1.1 riastrad size_t n = len;
2253 1.1 riastrad ssize_t nread;
2254 1.1 riastrad
2255 1.1 riastrad for (;;) {
2256 1.1 riastrad if ((nread = read(fd, p, n)) == -1)
2257 1.1 riastrad err(1, "read");
2258 1.1 riastrad if (nread == 0) {
2259 1.1 riastrad if (n < len)
2260 1.1 riastrad errx(1, "partial block");
2261 1.1 riastrad return -1; /* eof */
2262 1.1 riastrad }
2263 1.1 riastrad if ((size_t)nread >= n)
2264 1.1 riastrad break;
2265 1.1 riastrad p += (size_t)nread;
2266 1.1 riastrad n -= (size_t)nread;
2267 1.1 riastrad }
2268 1.1 riastrad
2269 1.1 riastrad return 0;
2270 1.1 riastrad }
2271 1.1 riastrad
2272 1.1 riastrad static void
2273 1.1 riastrad write_block(int fd, const void *buf, size_t len)
2274 1.1 riastrad {
2275 1.1 riastrad const char *p = buf;
2276 1.1 riastrad size_t n = len;
2277 1.1 riastrad ssize_t nwrit;
2278 1.1 riastrad
2279 1.1 riastrad for (;;) {
2280 1.1 riastrad if ((nwrit = write(fd, p, n)) == -1)
2281 1.1 riastrad err(1, "write");
2282 1.1 riastrad if ((size_t)nwrit >= n)
2283 1.1 riastrad break;
2284 1.1 riastrad p += (size_t)nwrit;
2285 1.1 riastrad n -= (size_t)nwrit;
2286 1.1 riastrad }
2287 1.1 riastrad }
2288 1.1 riastrad
2289 1.1 riastrad #define SECSIZE 512
2290 1.1 riastrad
2291 1.1 riastrad static void
2292 1.1 riastrad process(void)
2293 1.1 riastrad {
2294 1.1 riastrad static const uint8_t k[32] = {0};
2295 1.1 riastrad static uint8_t buf[65536];
2296 1.1 riastrad static struct adiantum C;
2297 1.1 riastrad uint8_t blkno[16] = {0};
2298 1.1 riastrad unsigned i;
2299 1.1 riastrad
2300 1.1 riastrad adiantum_init(&C, k);
2301 1.1 riastrad while (read_block(STDIN_FILENO, buf, sizeof buf) == 0) {
2302 1.1 riastrad for (i = 0; i < sizeof buf; i += SECSIZE) {
2303 1.1 riastrad adiantum_enc(buf + i, buf + i, SECSIZE, blkno, 16, &C);
2304 1.1 riastrad le64enc(blkno, 1 + le32dec(blkno));
2305 1.1 riastrad }
2306 1.1 riastrad write_block(STDOUT_FILENO, buf, sizeof buf);
2307 1.1 riastrad if (le64dec(blkno) == 1024*1024*1024/SECSIZE)
2308 1.1 riastrad return;
2309 1.1 riastrad }
2310 1.1 riastrad }
2311 1.1 riastrad
2312 1.1 riastrad int
2313 1.1 riastrad main(void)
2314 1.1 riastrad {
2315 1.1 riastrad int result = 0;
2316 1.1 riastrad
2317 1.1 riastrad result |= addsub128_selftest();
2318 result |= poly1305_selftest();
2319 result |= nh_selftest();
2320 result |= nhpoly1305_selftest();
2321 result |= chacha_core_selftest();
2322 result |= hchacha_selftest();
2323 result |= xchacha_selftest();
2324 result |= adiantum_selftest();
2325 if (result)
2326 return result;
2327
2328 process();
2329 return 0;
2330 }
2331
2332 #endif /* _KERNEL */
2333