Home | History | Annotate | Line # | Download | only in adiantum
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