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