/* $NetBSD: adiantum.c,v 1.7 2021/10/17 14:45:45 jmcneill Exp $ */ /*- * Copyright (c) 2020 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * The Adiantum wide-block cipher, from * * Paul Crowley and Eric Biggers, `Adiantum: length-preserving * encryption for entry-level processors', IACR Transactions on * Symmetric Cryptology 2018(4), pp. 39--61. * * https://doi.org/10.13154/tosc.v2018.i4.39-61 */ #include __KERNEL_RCSID(1, "$NetBSD: adiantum.c,v 1.7 2021/10/17 14:45:45 jmcneill Exp $"); #include #include #ifdef _KERNEL #include #include #include #include #include #include #else /* !defined(_KERNEL) */ #include #include #include #include #include #include struct aesenc { AES_KEY enckey; }; struct aesdec { AES_KEY deckey; }; #define AES_256_NROUNDS 14 #define aes_setenckey256(E, K) AES_set_encrypt_key((K), 256, &(E)->enckey) #define aes_setdeckey256(D, K) AES_set_decrypt_key((K), 256, &(D)->deckey) #define aes_enc(E, P, C, NR) AES_encrypt(P, C, &(E)->enckey) #define aes_dec(D, C, P, NR) AES_decrypt(C, P, &(D)->deckey) #include "adiantum.h" #define CTASSERT __CTASSERT #define KASSERT assert #define MIN(x,y) ((x) < (y) ? (x) : (y)) static void hexdump(int (*prf)(const char *, ...) __printflike(1,2), const char *prefix, const void *buf, size_t len) { const uint8_t *p = buf; size_t i; (*prf)("%s (%zu bytes)\n", prefix, len); for (i = 0; i < len; i++) { if (i % 16 == 8) (*prf)(" "); else (*prf)(" "); (*prf)("%02hhx", p[i]); if ((i + 1) % 16 == 0) (*prf)("\n"); } if (i % 16) (*prf)("\n"); } #endif /* _KERNEL */ /* Arithmetic modulo 2^128, represented by 16-digit strings in radix 2^8. */ /* s := a + b (mod 2^128) */ static inline void add128(uint8_t s[restrict static 16], const uint8_t a[static 16], const uint8_t b[static 16]) { unsigned i, c; c = 0; for (i = 0; i < 16; i++) { c = a[i] + b[i] + c; s[i] = c & 0xff; c >>= 8; } } /* s := a - b (mod 2^128) */ static inline void sub128(uint8_t d[restrict static 16], const uint8_t a[static 16], const uint8_t b[static 16]) { unsigned i, c; c = 0; for (i = 0; i < 16; i++) { c = a[i] - b[i] - c; d[i] = c & 0xff; c = 1 & (c >> 8); } } static int addsub128_selftest(void) { static const uint8_t zero[16] = { 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, }; static const uint8_t one[16] = { 0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, }; static const uint8_t negativeone[16] = { 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, }; static const uint8_t a[16] = { 0x03,0x80,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, }; static const uint8_t b[16] = { 0x01,0x82,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, }; static const uint8_t c[16] = { 0x02,0xfe,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, }; uint8_t r[16]; int result = 0; sub128(r, zero, one); if (memcmp(r, negativeone, 16)) { hexdump(printf, "sub128 1", r, sizeof r); result = -1; } sub128(r, a, b); if (memcmp(r, c, 16)) { hexdump(printf, "sub128 2", r, sizeof r); result = -1; } return result; } /* Poly1305 */ struct poly1305 { uint32_t r[5]; /* evaluation point */ uint32_t h[5]; /* value */ }; static void poly1305_init(struct poly1305 *P, const uint8_t key[static 16]) { /* clamp */ P->r[0] = (le32dec(key + 0) >> 0) & 0x03ffffff; P->r[1] = (le32dec(key + 3) >> 2) & 0x03ffff03; P->r[2] = (le32dec(key + 6) >> 4) & 0x03ffc0ff; P->r[3] = (le32dec(key + 9) >> 6) & 0x03f03fff; P->r[4] = (le32dec(key + 12) >> 8) & 0x000fffff; /* initialize polynomial evaluation */ P->h[0] = P->h[1] = P->h[2] = P->h[3] = P->h[4] = 0; } static void poly1305_update_blocks(struct poly1305 *P, const uint8_t *m, size_t mlen) { uint32_t r0 = P->r[0]; uint32_t r1 = P->r[1]; uint32_t r2 = P->r[2]; uint32_t r3 = P->r[3]; uint32_t r4 = P->r[4]; uint32_t h0 = P->h[0]; uint32_t h1 = P->h[1]; uint32_t h2 = P->h[2]; uint32_t h3 = P->h[3]; uint32_t h4 = P->h[4]; uint32_t m0, m1, m2, m3, m4; /* 26-bit message chunks */ uint64_t k0, k1, k2, k3, k4; /* 64-bit extension of h */ uint64_t p0, p1, p2, p3, p4; /* columns of product */ uint32_t c; /* carry */ while (mlen) { if (__predict_false(mlen < 16)) { /* Handle padding for uneven last block. */ uint8_t buf[16]; unsigned i; for (i = 0; i < mlen; i++) buf[i] = m[i]; buf[i++] = 1; for (; i < 16; i++) buf[i] = 0; m0 = le32dec(buf + 0) >> 0; m1 = le32dec(buf + 3) >> 2; m2 = le32dec(buf + 6) >> 4; m3 = le32dec(buf + 9) >> 6; m4 = le32dec(buf + 12) >> 8; mlen = 0; explicit_memset(buf, 0, sizeof buf); } else { m0 = le32dec(m + 0) >> 0; m1 = le32dec(m + 3) >> 2; m2 = le32dec(m + 6) >> 4; m3 = le32dec(m + 9) >> 6; m4 = le32dec(m + 12) >> 8; m4 |= 1u << 24; m += 16; mlen -= 16; } /* k := h + m, extended to 64 bits */ k0 = h0 + (m0 & 0x03ffffff); k1 = h1 + (m1 & 0x03ffffff); k2 = h2 + (m2 & 0x03ffffff); k3 = h3 + m3; k4 = h4 + m4; /* p := k * r = (h + m)*r mod 2^130 - 5 */ p0 = r0*k0 + 5*r4*k1 + 5*r3*k2 + 5*r2*k3 + 5*r1*k4; p1 = r1*k0 + r0*k1 + 5*r4*k2 + 5*r3*k3 + 5*r2*k4; p2 = r2*k0 + r1*k1 + r0*k2 + 5*r4*k3 + 5*r3*k4; p3 = r3*k0 + r2*k1 + r1*k2 + r0*k3 + 5*r4*k4; p4 = r4*k0 + r3*k1 + r2*k2 + r1*k3 + r0*k4; /* propagate carries and update h */ p0 += 0; c = p0 >> 26; h0 = p0 & 0x03ffffff; p1 += c; c = p1 >> 26; h1 = p1 & 0x03ffffff; p2 += c; c = p2 >> 26; h2 = p2 & 0x03ffffff; p3 += c; c = p3 >> 26; h3 = p3 & 0x03ffffff; p4 += c; c = p4 >> 26; h4 = p4 & 0x03ffffff; /* reduce 2^130 = 5 */ h0 += c*5; c = h0 >> 26; h0 &= 0x03ffffff; h1 += c; } /* update hash values */ P->h[0] = h0; P->h[1] = h1; P->h[2] = h2; P->h[3] = h3; P->h[4] = h4; } static void poly1305_final(uint8_t h[static 16], struct poly1305 *P) { uint32_t h0 = P->h[0]; uint32_t h1 = P->h[1]; uint32_t h2 = P->h[2]; uint32_t h3 = P->h[3]; uint32_t h4 = P->h[4]; uint32_t s0, s1, s2, s3, s4; /* h - (2^130 - 5) */ uint32_t m; /* mask */ uint32_t c; /* propagate carries */ h1 += 0; c = h1 >> 26; h1 &= 0x03ffffff; h2 += c; c = h2 >> 26; h2 &= 0x03ffffff; h3 += c; c = h3 >> 26; h3 &= 0x03ffffff; h4 += c; c = h4 >> 26; h4 &= 0x03ffffff; /* reduce 2^130 = 5 */ h0 += c*5; c = h0 >> 26; h0 &= 0x03ffffff; h1 += c; /* s := h - (2^130 - 5) */ c = 5; s0 = h0 + c; c = s0 >> 26; s0 &= 0x03ffffff; s1 = h1 + c; c = s1 >> 26; s1 &= 0x03ffffff; s2 = h2 + c; c = s2 >> 26; s2 &= 0x03ffffff; s3 = h3 + c; c = s3 >> 26; s3 &= 0x03ffffff; s4 = h4 + c; s4 -= 0x04000000; /* m := -1 if h < 2^130 - 5 else 0 */ m = -(s4 >> 31); /* conditional subtract */ h0 = (m & h0) | (~m & s0); h1 = (m & h1) | (~m & s1); h2 = (m & h2) | (~m & s2); h3 = (m & h3) | (~m & s3); h4 = (m & h4) | (~m & s4); /* reduce modulo 2^128 */ le32enc(h + 0, ((h1 << 26) | (h0 >> 0)) & 0xffffffff); le32enc(h + 4, ((h2 << 20) | (h1 >> 6)) & 0xffffffff); le32enc(h + 8, ((h3 << 14) | (h2 >> 12)) & 0xffffffff); le32enc(h + 12, ((h4 << 8) | (h3 >> 18)) & 0xffffffff); } static void poly1305(uint8_t h[static 16], const uint8_t *m, size_t mlen, const uint8_t k[static 16]) { struct poly1305 P; poly1305_init(&P, k); poly1305_update_blocks(&P, m, mlen); poly1305_final(h, &P); } static int poly1305_selftest(void) { /* https://tools.ietf.org/html/rfc7539#section-2.5.2 */ static const uint8_t r[16] = { 0x85,0xd6,0xbe,0x78, 0x57,0x55,0x6d,0x33, 0x7f,0x44,0x52,0xfe, 0x42,0xd5,0x06,0xa8, }; static const uint8_t s[16] = { 0x01,0x03,0x80,0x8a, 0xfb,0x0d,0xb2,0xfd, 0x4a,0xbf,0xf6,0xaf, 0x41,0x49,0xf5,0x1b, }; static const uint8_t m[] = { 0x43,0x72,0x79,0x70, 0x74,0x6f,0x67,0x72, 0x61,0x70,0x68,0x69, 0x63,0x20,0x46,0x6f, 0x72,0x75,0x6d,0x20, 0x52,0x65,0x73,0x65, 0x61,0x72,0x63,0x68, 0x20,0x47,0x72,0x6f, 0x75,0x70, }; static const uint8_t expected[16] = { 0xa8,0x06,0x1d,0xc1, 0x30,0x51,0x36,0xc6, 0xc2,0x2b,0x8b,0xaf, 0x0c,0x01,0x27,0xa9, }; uint8_t h[16], t[16]; int result = 0; poly1305(h, m, sizeof m, r); add128(t, h, s); if (memcmp(t, expected, 16)) { hexdump(printf, "poly1305 h", h, sizeof h); hexdump(printf, "poly1305 t", t, sizeof t); result = -1; } return result; } /* NHPoly1305 */ static void nh(uint8_t h[static 32], const uint8_t *m, size_t mlen, const uint32_t k[static 268 /* u/w + 2s(r - 1) */]) { enum { s = 2, /* stride */ r = 4, /* rounds */ w = 32, /* word size */ u = 8192 /* unit count (bits per msg unit) */ }; uint64_t h0 = 0, h1 = 0, h2 = 0, h3 = 0; unsigned i; CTASSERT(r*w/8 == 16); CTASSERT(u/w + 2*s*(r - 1) == 268); KASSERT(mlen <= u/8); KASSERT(mlen % 16 == 0); for (i = 0; i < mlen/16; i++) { uint32_t m0 = le32dec(m + 16*i + 4*0); uint32_t m1 = le32dec(m + 16*i + 4*1); uint32_t m2 = le32dec(m + 16*i + 4*2); uint32_t m3 = le32dec(m + 16*i + 4*3); uint32_t k00 = k[4*i + 4*0 + 0]; uint32_t k01 = k[4*i + 4*0 + 1]; uint32_t k02 = k[4*i + 4*0 + 2]; uint32_t k03 = k[4*i + 4*0 + 3]; uint32_t k10 = k[4*i + 4*1 + 0]; uint32_t k11 = k[4*i + 4*1 + 1]; uint32_t k12 = k[4*i + 4*1 + 2]; uint32_t k13 = k[4*i + 4*1 + 3]; uint32_t k20 = k[4*i + 4*2 + 0]; uint32_t k21 = k[4*i + 4*2 + 1]; uint32_t k22 = k[4*i + 4*2 + 2]; uint32_t k23 = k[4*i + 4*2 + 3]; uint32_t k30 = k[4*i + 4*3 + 0]; uint32_t k31 = k[4*i + 4*3 + 1]; uint32_t k32 = k[4*i + 4*3 + 2]; uint32_t k33 = k[4*i + 4*3 + 3]; CTASSERT(s == 2); h0 += (uint64_t)(m0 + k00) * (m2 + k02); h1 += (uint64_t)(m0 + k10) * (m2 + k12); h2 += (uint64_t)(m0 + k20) * (m2 + k22); h3 += (uint64_t)(m0 + k30) * (m2 + k32); h0 += (uint64_t)(m1 + k01) * (m3 + k03); h1 += (uint64_t)(m1 + k11) * (m3 + k13); h2 += (uint64_t)(m1 + k21) * (m3 + k23); h3 += (uint64_t)(m1 + k31) * (m3 + k33); } le64enc(h + 8*0, h0); le64enc(h + 8*1, h1); le64enc(h + 8*2, h2); le64enc(h + 8*3, h3); } static void nhpoly1305(uint8_t h[static 16], const uint8_t *m, size_t mlen, const uint8_t pk[static 16], const uint32_t nhk[static 268 /* u/w + 2s(r - 1) */]) { struct poly1305 P; uint8_t h0[32]; /* * In principle NHPoly1305 is defined on uneven message * lengths, but that's a pain in the patootie. */ KASSERT(mlen % 16 == 0); poly1305_init(&P, pk); for (; mlen; m += MIN(mlen, 1024), mlen -= MIN(mlen, 1024)) { nh(h0, m, MIN(mlen, 1024), nhk); poly1305_update_blocks(&P, h0, 32); } poly1305_final(h, &P); } /* https://github.com/google/adiantum/blob/68971e9c6684121b2203b4b05a22768b84051b58/test_vectors/ours/NH/NH.json */ static int nh_selftest(void) { static const struct { uint8_t k[1072]; unsigned mlen; uint8_t m[1024]; uint8_t h[32]; } C[] = { [0] = { /* 16-byte message */ .k = { 0x22,0x5b,0x80,0xc8, 0x18,0x05,0x37,0x09, 0x76,0x14,0x4b,0x67, 0xc4,0x50,0x7f,0x2b, 0x2c,0xff,0x56,0xc5, 0xd5,0x66,0x45,0x68, 0x35,0xe6,0xd2,0x9a, 0xe5,0xd0,0xc1,0xfb, 0xac,0x59,0x81,0x1a, 0x60,0xb0,0x3d,0x81, 0x4b,0xa3,0x5b,0xa9, 0xcc,0xb3,0xfe,0x2d, 0xc2,0x4d,0xd9,0x26, 0xad,0x36,0xcf,0x8c, 0x05,0x11,0x3b,0x8a, 0x99,0x15,0x81,0xc8, 0x23,0xf5,0x5a,0x94, 0x10,0x2f,0x92,0x80, 0x38,0xc5,0xb2,0x63, 0x80,0xd5,0xdc,0xa3, 0x6c,0x2f,0xaa,0x03, 0x96,0x4a,0x75,0x33, 0x4c,0xa8,0x60,0x05, 0x96,0xbf,0xe5,0x7a, 0xc8,0x4f,0x5c,0x22, 0xf9,0x92,0x74,0x4a, 0x75,0x5f,0xa2,0x2a, 0x8d,0x3f,0xe2,0x43, 0xfd,0xd9,0x04,0x8c, 0x8e,0xea,0x84,0xcc, 0x4d,0x3f,0x94,0x96, 0xed,0x1a,0x51,0xbb, 0x2f,0xc4,0x63,0x28, 0x31,0x0b,0xda,0x92, 0x1e,0x4d,0xe2,0x1d, 0x82,0xb5,0x65,0xb4, 0x75,0x69,0xd7,0x6f, 0x29,0xe4,0xbe,0x7e, 0xcc,0xbd,0x95,0xbd, 0x7a,0x62,0xea,0xfa, 0x33,0x34,0x80,0x58, 0xbf,0xfa,0x00,0x7e, 0xa7,0xb4,0xc9,0x32, 0x7c,0xc7,0x8f,0x8a, 0x28,0x27,0xdd,0xeb, 0xb9,0x1c,0x01,0xad, 0xec,0xf4,0x30,0x5e, 0xce,0x3b,0xaa,0x22, 0x60,0xbd,0x84,0xd9, 0x9e,0xaf,0xe8,0x4c, 0x44,0xb6,0x84,0x2d, 0x5c,0xe6,0x26,0xee, 0x8a,0xa2,0x0d,0xe3, 0x97,0xed,0xf5,0x47, 0xdb,0x50,0x72,0x4a, 0x5e,0x9a,0x8d,0x10, 0xc2,0x25,0xdd,0x5b, 0xd0,0x39,0xc4,0x5b, 0x2a,0x79,0x81,0xb7, 0x5c,0xda,0xed,0x77, 0x17,0x53,0xb5,0x8b, 0x1e,0x5f,0xf3,0x48, 0x30,0xac,0x97,0x7d, 0x29,0xe3,0xc9,0x18, 0xe1,0x2b,0x31,0xa0, 0x08,0xe9,0x15,0x59, 0x29,0xdb,0x84,0x2a, 0x33,0x98,0x8a,0xd4, 0xc3,0xfc,0xf7,0xca, 0x65,0x02,0x4d,0x9f, 0xe2,0xb1,0x5e,0xa6, 0x6a,0x01,0xf9,0xcf, 0x7e,0xa6,0x09,0xd9, 0x16,0x90,0x14,0x5f, 0x3a,0xf8,0xd8,0x34, 0x38,0xd6,0x1f,0x89, 0x0c,0x81,0xc2,0x68, 0xc4,0x65,0x78,0xf3, 0xfe,0x27,0x48,0x70, 0x38,0x43,0x48,0x5a, 0xc1,0x24,0xc5,0x6f, 0x65,0x63,0x1b,0xb0, 0x5b,0xb4,0x07,0x1e, 0x69,0x08,0x8f,0xfc, 0x93,0x29,0x04,0x16, 0x6a,0x8b,0xb3,0x3d, 0x0f,0xba,0x5f,0x46, 0xff,0xfe,0x77,0xa1, 0xb9,0xdc,0x29,0x66, 0x9a,0xd1,0x08,0xdd, 0x32,0xe3,0x21,0x7b, 0xcc,0x2e,0x5c,0xf7, 0x79,0x68,0xd4,0xc1, 0x8b,0x3c,0x5d,0x0e, 0xd4,0x26,0xa6,0x19, 0x92,0x45,0xf7,0x19, 0x0e,0xa2,0x17,0xd8, 0x1c,0x7f,0x8d,0xd6, 0x68,0x37,0x6c,0xbf, 0xb1,0x8a,0x5e,0x36, 0x4b,0xc0,0xca,0x21, 0x02,0x24,0x69,0x9b, 0x2b,0x19,0x0a,0x1b, 0xe3,0x17,0x30,0x57, 0xf6,0xfc,0xd6,0x66, 0x36,0x30,0xc2,0x11, 0x08,0x8d,0xc5,0x84, 0x67,0xa0,0x89,0xc3, 0x74,0x48,0x15,0xca, 0x6e,0x0c,0x6d,0x78, 0x66,0x15,0x73,0x85, 0xf9,0x8b,0xba,0xb2, 0x09,0xda,0x79,0xe6, 0x00,0x08,0x2a,0xda, 0x6b,0xd7,0xd1,0xa7, 0x8b,0x5f,0x11,0x87, 0x96,0x1b,0x23,0xb0, 0x6c,0x55,0xb6,0x86, 0xfb,0xff,0xe3,0x69, 0xac,0x43,0xcd,0x8f, 0x8a,0xe7,0x1c,0x3c, 0xa0,0x6a,0xd5,0x63, 0x80,0x66,0xd8,0x7f, 0xb5,0xb8,0x96,0xd4, 0xe2,0x20,0x40,0x53, 0x6d,0x0d,0x8b,0x6d, 0xd5,0x5d,0x51,0xfb, 0x4d,0x80,0x82,0x01, 0x14,0x97,0x96,0x9b, 0x13,0xb8,0x1d,0x76, 0x7a,0xa1,0xca,0x19, 0x90,0xec,0x7b,0xe0, 0x8e,0xa8,0xb4,0xf2, 0x33,0x67,0x0e,0x10, 0xb1,0xa2,0x82,0xea, 0x81,0x82,0xa2,0xc6, 0x78,0x51,0xa6,0xd3, 0x25,0xe4,0x9c,0xf2, 0x6b,0xa8,0xec,0xfb, 0xd4,0x1d,0x5b,0xa4, 0x79,0x66,0x62,0xb8, 0x2b,0x6f,0x9e,0x0f, 0xcc,0xcb,0x9e,0x92, 0x6f,0x06,0xdb,0xf0, 0x97,0xce,0x3f,0x90, 0xa2,0x1f,0xbe,0x3b, 0x7b,0x10,0xf0,0x23, 0x30,0x0c,0xc5,0x0c, 0x6c,0x78,0xfc,0xa8, 0x71,0x62,0xcf,0x98, 0xa2,0xb1,0x44,0xb5, 0xc6,0x3b,0x5c,0x63, 0x83,0x1d,0x35,0xf2, 0xc7,0x42,0x67,0x5d, 0xc1,0x26,0x36,0xc8, 0x6e,0x1d,0xf6,0xd5, 0x52,0x35,0xa4,0x9e, 0xce,0x4c,0x3b,0x92, 0x20,0x86,0xb7,0x89, 0x63,0x73,0x1a,0x8b, 0xa6,0x35,0xfe,0xb9, 0xdf,0x5e,0x0e,0x53, 0x0b,0xf2,0xb3,0x4d, 0x34,0x1d,0x66,0x33, 0x1f,0x08,0xf5,0xf5, 0x0a,0xab,0x76,0x19, 0xde,0x82,0x2f,0xcf, 0x11,0xa6,0xcb,0xb3, 0x17,0xec,0x8d,0xaf, 0xcb,0xf0,0x92,0x1e, 0xb8,0xa3,0x04,0x0a, 0xac,0x2c,0xae,0xc5, 0x0b,0xc4,0x4e,0xef, 0x0a,0xe2,0xda,0xe9, 0xd7,0x75,0x2d,0x95, 0xc7,0x1b,0xf3,0x0b, 0x43,0x19,0x16,0xd7, 0xc6,0x90,0x2d,0x6b, 0xe1,0xb2,0xce,0xbe, 0xd0,0x7d,0x15,0x99, 0x24,0x37,0xbc,0xb6, 0x8c,0x89,0x7a,0x8c, 0xcb,0xa7,0xf7,0x0b, 0x5f,0xd4,0x96,0x8d, 0xf5,0x80,0xa3,0xce, 0xf5,0x9e,0xed,0x60, 0x00,0x92,0xa5,0x67, 0xc9,0x21,0x79,0x0b, 0xfb,0xe2,0x57,0x0e, 0xdf,0xb6,0x16,0x90, 0xd3,0x75,0xf6,0xb0, 0xa3,0x4e,0x43,0x9a, 0xb7,0xf4,0x73,0xd8, 0x34,0x46,0xc6,0xbe, 0x80,0xec,0x4a,0xc0, 0x7f,0x9e,0xb6,0xb0, 0x58,0xc2,0xae,0xa1, 0xf3,0x60,0x04,0x62, 0x11,0xea,0x0f,0x90, 0xa9,0xea,0x6f,0x0c, 0x4c,0xcf,0xe8,0xd0, 0xea,0xbf,0xdb,0xf2, 0x53,0x0c,0x09,0x4d, 0xd4,0xed,0xf3,0x22, 0x10,0x99,0xc6,0x4f, 0xcf,0xcf,0x96,0xc9, 0xd9,0x6b,0x08,0x3b, 0xf0,0x62,0x2d,0xac, 0x55,0x38,0xd5,0x5c, 0x57,0xad,0x51,0xc3, 0xf5,0xd2,0x37,0x45, 0xb3,0x3f,0x6d,0xaf, 0x10,0x62,0x57,0xb9, 0x58,0x40,0xb3,0x3c, 0x6a,0x98,0x97,0x1a, 0x9c,0xeb,0x66,0xf1, 0xa5,0x93,0x0b,0xe7, 0x8b,0x29,0x0f,0xff, 0x2c,0xd0,0x90,0xf2, 0x67,0xa0,0x69,0xcd, 0xd3,0x59,0xad,0xad, 0xf1,0x1f,0xd7,0xad, 0x24,0x74,0x29,0xcd, 0x06,0xd5,0x42,0x90, 0xf9,0x96,0x4a,0xd9, 0xa0,0x37,0xe4,0x64, 0x8e,0x13,0x2a,0x2a, 0xe7,0xc2,0x1e,0xf6, 0xb2,0xd3,0xdc,0x9f, 0x33,0x32,0x0c,0x50, 0x88,0x37,0x8b,0x9b, 0xfe,0x6f,0xfd,0x05, 0x96,0x26,0x6c,0x96, 0x73,0x73,0xe1,0x09, 0x28,0xf3,0x7f,0xa6, 0x59,0xc5,0x2e,0xf4, 0xd3,0xd5,0xda,0x6b, 0xca,0x42,0x05,0xe5, 0xed,0x13,0xe2,0x4e, 0xcd,0xd5,0xd0,0xfb, 0x6e,0xf7,0x8a,0x3e, 0x91,0x9d,0x6b,0xc5, 0x33,0x05,0x07,0x86, 0xb2,0x26,0x41,0x6e, 0xf8,0x38,0x38,0x7a, 0xf0,0x6c,0x27,0x5a, 0x01,0xd8,0x03,0xe5, 0x91,0x33,0xaa,0x20, 0xcd,0xa7,0x4f,0x18, 0xa0,0x91,0x28,0x74, 0xc0,0x58,0x27,0x0f, 0x9b,0xa8,0x85,0xb0, 0xe0,0xfd,0x5b,0xdb, 0x5b,0xb8,0x86,0x79, 0x94,0x6d,0xde,0x26, 0x64,0x2d,0x6c,0xb9, 0xba,0xc7,0xf0,0xd7, 0xaa,0x68,0x68,0xd0, 0x40,0x71,0xdb,0x94, 0x54,0x62,0xa5,0x7f, 0x98,0xea,0xe3,0x4c, 0xe4,0x44,0x9a,0x03, 0xf9,0x1c,0x20,0x36, 0xeb,0x0d,0xa4,0x41, 0x24,0x06,0xcb,0x94, 0x86,0x35,0x22,0x62, 0x80,0x19,0x16,0xba, 0x2c,0x10,0x38,0x96, }, .mlen = 16, .m = { 0xd3,0x82,0xe7,0x04, 0x35,0xcc,0xf7,0xa4, 0xf9,0xb2,0xc5,0xed, 0x5a,0xd9,0x58,0xeb, }, .h = { 0x41,0xd9,0xad,0x54, 0x5a,0x0d,0xcc,0x53, 0x48,0xf6,0x4c,0x75, 0x43,0x5d,0xdd,0x77, 0xda,0xca,0x7d,0xec, 0x91,0x3b,0x53,0x16, 0x5c,0x4b,0x58,0xdc, 0x70,0x0a,0x7b,0x37, }, }, [1] = { /* 1008-byte message */ .k = { 0xd9,0x94,0x65,0xda, 0xc2,0x60,0xdd,0xa9, 0x39,0xe5,0x37,0x11, 0xf6,0x74,0xa5,0x95, 0x36,0x07,0x24,0x99, 0x64,0x6b,0xda,0xe2, 0xd5,0xd1,0xd2,0xd9, 0x25,0xd5,0xcc,0x48, 0xf8,0xa5,0x9e,0xff, 0x84,0x5a,0xd1,0x6f, 0xb7,0x6a,0x4d,0xd2, 0xc8,0x13,0x3d,0xde, 0x17,0xed,0x64,0xf1, 0x2b,0xcc,0xdd,0x65, 0x11,0x16,0xf2,0xaf, 0x34,0xd2,0xc5,0x31, 0xaa,0x69,0x33,0x0a, 0x0b,0xc1,0xb4,0x6d, 0xaa,0xcd,0x43,0xc4, 0x0b,0xef,0xf9,0x7d, 0x97,0x3c,0xa7,0x22, 0xda,0xa6,0x6a,0xf0, 0xad,0xe3,0x6f,0xde, 0xfb,0x33,0xf3,0xd8, 0x96,0x5f,0xca,0xda, 0x18,0x63,0x03,0xd0, 0x8f,0xb6,0xc4,0x62, 0x9d,0x50,0x6c,0x8f, 0x85,0xdd,0x6d,0x52, 0x2d,0x45,0x01,0x36, 0x57,0x9f,0x51,0xf0, 0x70,0xe0,0xb2,0x99, 0x3a,0x11,0x68,0xbd, 0xe5,0xfa,0x7c,0x59, 0x12,0x5a,0xbc,0xd9, 0xd6,0x9a,0x09,0xe6, 0xa2,0x80,0x1f,0xd6, 0x47,0x20,0x82,0x4e, 0xac,0xb5,0x6d,0xde, 0x5b,0xff,0x9c,0xd4, 0x2a,0xae,0x27,0x7c, 0x0f,0x5a,0x5d,0x35, 0x2d,0xff,0x07,0xf9, 0x79,0x6a,0xf9,0x3e, 0xd9,0x22,0x62,0x30, 0x40,0xce,0xe1,0xf4, 0x46,0x0a,0x24,0xca, 0x7a,0x3e,0xa1,0x92, 0x1a,0x29,0xa0,0xbf, 0x23,0x95,0x99,0x31, 0xe3,0x51,0x25,0x3d, 0xaf,0x1e,0xfc,0xb3, 0x65,0xa2,0x10,0x37, 0xe6,0xa7,0x20,0xa0, 0xe3,0x6a,0xd4,0x81, 0x2c,0x8d,0xa0,0x87, 0xec,0xae,0x9f,0x44, 0x10,0xda,0x2e,0x17, 0xba,0xb2,0xa5,0x5c, 0x89,0xc6,0xfa,0x70, 0x7e,0xc2,0xe3,0xb6, 0xa0,0x98,0x9c,0xb8, 0x14,0x33,0x27,0x3a, 0x6e,0x4d,0x94,0x72, 0x4b,0xc8,0xac,0x24, 0x2f,0x85,0xd9,0xa4, 0xda,0x22,0x95,0xc5, 0xb3,0xfc,0xbe,0xd2, 0x96,0x57,0x91,0xf9, 0xfd,0x18,0x9c,0x56, 0x70,0x15,0x5f,0xe7, 0x40,0x45,0x28,0xb3, 0x2b,0x56,0x44,0xca, 0x6a,0x2b,0x0e,0x25, 0x66,0x3e,0x32,0x04, 0xe2,0xb7,0x91,0xc8, 0xd2,0x02,0x79,0x0f, 0x7e,0xa9,0xb3,0x86, 0xb2,0x76,0x74,0x18, 0x57,0x16,0x63,0x06, 0x6e,0x16,0xfa,0xef, 0x52,0x3c,0x5e,0x0d, 0x33,0x55,0xd2,0x8d, 0x57,0x4d,0xfe,0x54, 0x65,0x7a,0x54,0x52, 0xf0,0x7b,0x2c,0xf8, 0xd5,0x43,0xba,0x92, 0xa5,0x2e,0xbe,0x1a, 0xce,0x25,0x4f,0x34, 0x31,0xe7,0xa3,0xff, 0x90,0xf6,0xbc,0x0c, 0xbc,0x98,0xdf,0x4a, 0xc3,0xeb,0xb6,0x27, 0x68,0xa9,0xb5,0x33, 0xbc,0x13,0xe8,0x13, 0x7c,0x6b,0xec,0x31, 0xd9,0x79,0x2a,0xa7, 0xe4,0x02,0x4f,0x02, 0xd4,0x5c,0x57,0x4f, 0xa4,0xbc,0xa3,0xe1, 0x7e,0x36,0x8a,0xde, 0x11,0x55,0xec,0xb3, 0x8b,0x65,0x06,0x02, 0x9a,0x68,0x06,0x64, 0x63,0xc7,0x9a,0x67, 0xdc,0x70,0xbf,0xb5, 0xf8,0x49,0x2a,0xe1, 0x59,0x4c,0xe4,0x1e, 0xb5,0x56,0xa5,0xad, 0x24,0x82,0x8c,0xd0, 0x66,0xe4,0x72,0x79, 0x02,0x5d,0x0d,0xf9, 0x19,0x44,0xe3,0x86, 0x1a,0xda,0xda,0xf0, 0x2d,0x47,0xc0,0x07, 0x47,0x0b,0xf8,0x06, 0xf6,0x45,0x8a,0x7f, 0xb9,0xf9,0x33,0x2e, 0xc2,0xf1,0xf1,0x81, 0x41,0x99,0xcd,0xf6, 0xb1,0x71,0x1b,0xfa, 0x21,0x53,0x7c,0xa1, 0xeb,0x2a,0x38,0x5b, 0x9b,0xfe,0x96,0xa5, 0xe3,0x78,0x77,0x47, 0x98,0x0f,0x7d,0xef, 0xf6,0x05,0x37,0x88, 0x79,0x0c,0x21,0x8d, 0x87,0x1f,0xae,0xce, 0x83,0xaf,0xa3,0xd6, 0x6e,0xc5,0x3c,0x47, 0xc6,0xd6,0x4a,0xdc, 0x7c,0xcc,0xdc,0x11, 0x7c,0x7d,0x0f,0x03, 0xc1,0x80,0x75,0x2a, 0x64,0x76,0xf0,0x08, 0x0c,0x11,0x4b,0xe4, 0x05,0x41,0x78,0x0f, 0x86,0xa0,0xd6,0x61, 0xb0,0xfb,0x15,0x3d, 0x3c,0xc3,0xd5,0x1b, 0x72,0x0e,0x79,0x53, 0x07,0xd2,0x2c,0x6e, 0x83,0xbd,0x72,0x88, 0x41,0x07,0x4b,0xd2, 0xe9,0xcc,0x2a,0x9d, 0x5b,0x82,0x0d,0x02, 0x29,0x6e,0xf3,0xbc, 0x34,0x31,0x62,0x8d, 0x83,0xc1,0x7e,0x94, 0x21,0xd5,0xfd,0xa6, 0x6a,0x2b,0xe8,0x86, 0x05,0x48,0x97,0x41, 0xad,0xca,0xef,0x79, 0x5e,0xd8,0x51,0xc4, 0xae,0xf7,0xfa,0xac, 0x3d,0x74,0x2e,0xf4, 0x41,0x3b,0x19,0xc2, 0x04,0xf3,0x40,0xfe, 0x77,0x7c,0x6a,0x4c, 0x8e,0x24,0x84,0xe0, 0x70,0xe4,0xb2,0x19, 0x6c,0x0c,0x85,0x9e, 0xe1,0xad,0xa4,0x73, 0x90,0xdd,0xbf,0x7d, 0x1b,0x6f,0x8b,0x4d, 0x3b,0xec,0xd7,0xb0, 0xd9,0x90,0xf1,0xf5, 0xb9,0x32,0xe3,0x79, 0x15,0x08,0x3e,0x71, 0xed,0x91,0xc4,0x5c, 0x18,0xe8,0x16,0x52, 0xae,0x9d,0xf3,0x09, 0xac,0x57,0x11,0xf8, 0x16,0x55,0xd0,0x28, 0x60,0xc1,0x7e,0x6d, 0x87,0xc1,0x7a,0xe8, 0x5d,0xc5,0x12,0x68, 0x6d,0x63,0x39,0x27, 0x49,0xb8,0x0c,0x78, 0x92,0xea,0x6f,0x52, 0xeb,0x43,0xc2,0x0b, 0xd8,0x28,0x77,0xe5, 0x43,0x5f,0xb8,0xa6, 0x32,0xb7,0xaa,0x01, 0x1e,0xa6,0xde,0xe4, 0x9b,0x0f,0xb6,0x49, 0xcc,0x6f,0x2c,0x04, 0x41,0xcb,0xd8,0x80, 0xd1,0x15,0x5e,0x57, 0x1e,0x4a,0x77,0xbf, 0xc4,0xcb,0x09,0x7c, 0x6e,0x81,0xb8,0x64, 0x51,0x6a,0xf2,0x71, 0x06,0xf6,0x00,0xac, 0x79,0x2c,0x83,0x7a, 0x6c,0xa4,0x85,0x89, 0x69,0x06,0x26,0x72, 0xe1,0x00,0x66,0xc0, 0xc5,0x8e,0xc8,0x51, 0x6e,0x25,0xdd,0xc9, 0x54,0x98,0x45,0x64, 0xaa,0x51,0x18,0x1b, 0xe4,0xbe,0x1b,0xee, 0x13,0xd6,0x34,0x50, 0x4c,0xcf,0x3c,0x31, 0x9b,0xd2,0x6f,0x07, 0x79,0xf4,0x63,0x3f, 0x09,0x01,0x64,0xf1, 0xc1,0xf1,0xae,0xa9, 0x0c,0x60,0xc9,0x62, 0x84,0xf6,0xe8,0x15, 0x55,0xdf,0xdd,0x71, 0x95,0xa9,0x0f,0x65, 0x97,0x40,0x79,0x86, 0x95,0xd9,0x57,0x23, 0x2f,0x61,0x51,0xb5, 0x16,0x18,0x62,0xd2, 0x1a,0xd9,0x8b,0x88, 0x84,0xa9,0x9b,0x47, 0xd7,0x22,0x68,0xe9, 0x9c,0x69,0x68,0x74, 0x13,0x95,0xd3,0x99, 0x33,0xdb,0x30,0x96, 0xbf,0x01,0xc6,0x68, 0xbd,0x19,0x32,0xc1, 0xf8,0xa9,0x7f,0x2b, 0xc5,0x69,0x2f,0xa2, 0xce,0x5a,0x46,0x43, 0x8d,0x36,0x9c,0xfa, 0x5c,0x7f,0x03,0xe0, 0x80,0xaa,0xc7,0x9e, 0x3b,0xa3,0x27,0x6b, 0x2e,0xc6,0x59,0x0a, 0xf6,0x36,0x37,0xa6, 0xc0,0xd1,0xa1,0xa1, 0x7e,0xc1,0xf8,0x5b, 0x0f,0x9b,0xdd,0x6d, 0x9f,0x54,0x16,0x6b, 0x6e,0x53,0xfd,0xe8, 0x72,0xd0,0x3e,0x46, 0xce,0xaf,0x94,0x36, 0x85,0xa8,0xae,0x4c, 0x8d,0xb5,0xc2,0x1b, 0x5d,0x29,0x46,0x40, 0x87,0x50,0x59,0xdd, 0x04,0xbe,0xba,0x8f, 0x0b,0x9b,0xd2,0x50, 0x67,0x19,0x83,0x80, 0x87,0x5c,0x58,0x86, 0x20,0x39,0xbf,0xdf, 0xd2,0xc8,0xbb,0xe8, 0xc8,0xd8,0xe8,0x8d, 0xcc,0x97,0xe0,0xc9, 0x6c,0x2f,0x47,0xb6, 0x75,0x8f,0x0d,0x37, 0x5a,0x83,0xb0,0xce, 0x59,0xc2,0x0b,0x84, 0xa2,0x54,0xe5,0x38, 0x59,0x29,0x0f,0xa8, 0x26,0x2d,0x11,0xa9, 0x89,0x0e,0x0b,0x75, 0xe0,0xbc,0xf0,0xf8, 0x92,0x1f,0x29,0x71, 0x91,0xc4,0x63,0xcc, 0xf8,0x52,0xb5,0xd4, 0xb8,0x94,0x6a,0x30, 0x90,0xf7,0x44,0xbe, }, .mlen = 1008, .m = { 0x05,0xe3,0x6f,0x44, 0xa4,0x40,0x35,0xf6, 0xeb,0x86,0xa9,0x6d, 0xed,0x16,0xdb,0xb6, 0x5b,0x59,0xda,0x30, 0x54,0x6c,0x59,0x35, 0x42,0x59,0x56,0x45, 0x9a,0x85,0x20,0x73, 0xcf,0x21,0xf5,0x98, 0x58,0x07,0x0e,0x7f, 0x44,0x1f,0xf1,0x53, 0x92,0xc7,0x81,0x53, 0x5e,0x97,0x8a,0x23, 0x1d,0xe8,0xad,0xca, 0x19,0x55,0x96,0x9d, 0x9b,0xfd,0x0a,0x0a, 0xad,0xa8,0x0f,0x76, 0xe2,0x6a,0x8f,0x33, 0x36,0xbf,0xcb,0x7a, 0xfd,0x61,0xc6,0xfb, 0x75,0xea,0xd4,0x09, 0x5e,0x70,0xfb,0x32, 0x54,0xe3,0x47,0x48, 0xd4,0x8c,0xa9,0x7c, 0x72,0xdb,0xdb,0xf7, 0x09,0x6d,0x58,0xa6, 0x42,0xb5,0x74,0x8c, 0x98,0x66,0x83,0x7a, 0x6d,0xeb,0x91,0xfb, 0x22,0x1c,0x78,0x3d, 0x22,0xa6,0xf8,0xb0, 0xd1,0x9f,0xc8,0x69, 0x8a,0xba,0xd3,0x78, 0x21,0xb0,0x7b,0x9f, 0xb8,0xed,0xe0,0x65, 0xff,0xa0,0x8b,0x4c, 0x17,0x9e,0xf7,0x3e, 0xa2,0x5f,0x82,0x77, 0xce,0x2a,0xda,0x41, 0x76,0x07,0x68,0xa4, 0xa1,0xbb,0xe0,0x1d, 0x7b,0xab,0x9c,0x03, 0x90,0x2c,0xd2,0x93, 0x46,0x43,0x3a,0x44, 0x29,0xe8,0xb5,0x7a, 0x23,0xbb,0xe9,0xaf, 0x2b,0x17,0x88,0x8f, 0x7a,0x81,0x7a,0x25, 0x3b,0xc7,0x1e,0x6e, 0xde,0x3e,0x54,0xbc, 0xc6,0xff,0x07,0xdc, 0xe6,0x29,0x02,0x4c, 0x95,0x57,0x0e,0x44, 0xc4,0x9c,0xc7,0x45, 0x01,0xd7,0x17,0xfd, 0x0f,0x1a,0x83,0x74, 0xa0,0xd5,0xb3,0x1a, 0xc0,0x97,0xdc,0xc3, 0x0f,0x3d,0x5d,0x8c, 0x02,0x58,0xc6,0x4d, 0x43,0x10,0xae,0xc9, 0x94,0xe2,0x9b,0xcd, 0xf9,0xcc,0xfe,0xbd, 0x9c,0x69,0xd0,0xec, 0xf8,0x67,0xde,0x98, 0xe5,0x50,0x5e,0x93, 0x6a,0x5b,0x31,0x2a, 0x62,0xee,0x03,0xbe, 0x76,0x9c,0x1d,0x13, 0x16,0x13,0xcf,0x63, 0x30,0x18,0x7d,0x1e, 0x55,0x94,0xf5,0x29, 0xb4,0x91,0xb4,0x76, 0x1c,0x31,0x9e,0xe5, 0x1b,0x0a,0xee,0x89, 0xb4,0xd9,0x45,0x19, 0xd7,0x47,0x2c,0x01, 0x20,0xe6,0x1d,0x7c, 0xb3,0x5e,0x1b,0x2a, 0x8c,0x3d,0x4d,0x1a, 0x6b,0x35,0x84,0x41, 0x6a,0xe4,0x32,0x8f, 0x9a,0x0d,0xbf,0x90, 0xff,0xcf,0x4c,0xfb, 0x9b,0x07,0x81,0x94, 0xcf,0x8e,0x1a,0x8a, 0xfc,0xbd,0x91,0xfe, 0xc3,0xe1,0x18,0xc7, 0x1f,0x0d,0x8e,0x1c, 0x2e,0xfc,0x02,0xe8, 0x39,0xbf,0x05,0x90, 0x58,0x94,0xee,0xe7, 0x15,0x31,0x5d,0x9f, 0x68,0x36,0x64,0x32, 0x25,0x49,0xdd,0x3e, 0xc8,0xb6,0x83,0x5e, 0x09,0x90,0xcd,0x48, 0xaf,0x9e,0xfe,0xd6, 0x79,0x8e,0x69,0x4b, 0x94,0xd5,0xf4,0x84, 0x7b,0xce,0xea,0x2f, 0x9b,0x79,0x7a,0x7c, 0x22,0x28,0x4d,0xa1, 0x38,0x1a,0x66,0x24, 0x79,0xa3,0xfa,0xfa, 0x8d,0x98,0x7c,0x54, 0x71,0x54,0xef,0x37, 0xa6,0xf1,0x97,0x54, 0xad,0xe7,0x67,0xa0, 0xf3,0x33,0xcf,0x4f, 0x4e,0xa3,0x47,0xee, 0x31,0xd3,0x98,0xf9, 0x7f,0x9f,0x44,0x18, 0x2f,0x13,0x1b,0x44, 0x57,0xcd,0x15,0x5b, 0xde,0x8f,0x1a,0x3c, 0xb5,0x1e,0xa7,0x2d, 0x4d,0xbe,0x85,0x08, 0x78,0xeb,0xe2,0x35, 0x3a,0xbe,0x55,0x6b, 0xc3,0xe1,0x0f,0x77, 0x43,0x41,0x11,0x5a, 0x61,0xc9,0x3b,0xbc, 0xad,0x88,0x9e,0xba, 0xc6,0xd2,0xdc,0x87, 0xd9,0x54,0xcc,0x86, 0x46,0xe6,0xa5,0x29, 0x2c,0x08,0x49,0x53, 0x2c,0xe3,0x0e,0x60, 0xc5,0x48,0xca,0x62, 0x3f,0xf6,0x93,0xc1, 0xba,0x8d,0x36,0x49, 0xe7,0x0f,0x9c,0x49, 0x7d,0xee,0x2a,0x22, 0xc3,0xe5,0x11,0x21, 0xfa,0xc7,0xeb,0x79, 0xcc,0x4d,0x75,0x4e, 0x66,0x33,0xf5,0x09, 0xa3,0xb9,0x60,0xa5, 0xd6,0xbd,0x38,0x75, 0x0c,0x2f,0x5f,0x1f, 0xea,0xa5,0x9d,0x45, 0x3c,0xe4,0x41,0xb8, 0xf6,0x4e,0x15,0x87, 0x0b,0x7f,0x42,0x4e, 0x51,0x3d,0xc4,0x9a, 0xb2,0xca,0x37,0x16, 0x0f,0xed,0x9e,0x0b, 0x93,0x86,0x12,0x93, 0x36,0x5e,0x39,0xc4, 0xf0,0xf4,0x48,0xdb, 0xeb,0x18,0x5e,0x50, 0x71,0x30,0x83,0xe5, 0x0f,0xb1,0x73,0xa7, 0xc6,0xf0,0xca,0x29, 0x0e,0xc4,0x07,0x5b, 0x8b,0x09,0x68,0x68, 0x10,0x32,0x92,0x62, 0x6a,0x6c,0x56,0x8b, 0x01,0x46,0x9a,0x20, 0x89,0xe0,0x93,0x85, 0x8c,0x53,0x87,0xf6, 0x02,0xd3,0x8d,0x72, 0x31,0x35,0xa1,0x34, 0x63,0x70,0x61,0x80, 0x06,0xf1,0x54,0xb3, 0x5d,0xdf,0xad,0x9c, 0x7e,0x3a,0xc2,0x8f, 0x76,0x8b,0x4c,0x74, 0x2c,0x8c,0x6f,0x0a, 0x60,0x13,0xa8,0xce, 0x4c,0x49,0x70,0x90, 0x59,0x57,0xf5,0x7b, 0x03,0x94,0x37,0x87, 0xfa,0xfe,0xeb,0xe7, 0x2d,0x01,0x45,0x69, 0xb4,0x10,0x80,0x6d, 0x13,0x26,0xe3,0x9b, 0x49,0x2a,0x0b,0xb1, 0x36,0xf9,0x62,0x63, 0x33,0x2a,0xee,0x51, 0x5e,0x35,0xa4,0x2e, 0x34,0xa1,0x77,0xac, 0x27,0x99,0x03,0xc6, 0xe2,0x83,0x11,0x72, 0x77,0x30,0x8b,0xb7, 0xde,0x1a,0xa1,0x4b, 0xa9,0x9c,0x07,0x02, 0xf2,0xdc,0x06,0x45, 0xf2,0xab,0x31,0x46, 0x50,0x25,0x34,0x54, 0xa8,0x06,0x88,0x6c, 0xfc,0x88,0xb5,0xae, 0x30,0xbd,0xe1,0xe7, 0xfe,0x51,0x46,0x05, 0x9a,0x29,0xd9,0x93, 0x99,0x60,0x69,0x4a, 0x5c,0xb2,0x29,0x6b, 0xa1,0xbb,0x9d,0xe4, 0x9b,0x7d,0x4a,0xe5, 0x37,0xcb,0x16,0x6f, 0x44,0x93,0xe4,0x71, 0x34,0x7b,0x54,0xec, 0x5b,0x2b,0xe0,0xf7, 0x32,0xed,0x77,0xa6, 0xb3,0x7c,0x8d,0x1a, 0xc0,0x57,0xbe,0x2b, 0x6d,0x7f,0xd7,0x35, 0xe6,0x93,0xed,0x90, 0x26,0xfe,0x41,0xf3, 0x58,0x55,0x03,0xb7, 0xb2,0x94,0xe2,0x0c, 0x34,0xc3,0x06,0xc6, 0x9e,0x4b,0x17,0xc7, 0xb9,0x58,0x23,0x58, 0xd3,0x73,0x18,0x5e, 0xcf,0x28,0xac,0x90, 0xa0,0xba,0x35,0x90, 0x96,0xb3,0xc7,0x6c, 0xe1,0x07,0xdf,0x5d, 0xaa,0x2c,0xa6,0x6b, 0x82,0x2d,0x71,0x66, 0xb7,0x76,0x37,0xdb, 0x39,0x7f,0x22,0x8f, 0x38,0x70,0xd4,0xeb, 0xf8,0xf0,0x73,0xed, 0xb6,0x67,0x75,0xaf, 0xd7,0x5d,0x01,0x01, 0xc4,0xd6,0x7c,0xbc, 0xc3,0xe6,0xad,0x9a, 0x9c,0x6a,0x43,0x9b, 0xfb,0x34,0x55,0x47, 0xcd,0xeb,0x4e,0x2c, 0x29,0x6f,0xb0,0xeb, 0xb5,0x08,0xdb,0x6b, 0x40,0x26,0x51,0x54, 0x5a,0x97,0x64,0x74, 0x95,0xe6,0xae,0x8a, 0x4c,0xe9,0x44,0x47, 0x85,0xd6,0xcf,0xe0, 0x11,0x65,0x45,0xb3, 0xe1,0xfc,0x6a,0x01, 0x38,0x40,0x8a,0x71, 0xc5,0xd6,0x64,0xa8, 0x36,0x95,0x44,0x9c, 0x10,0x41,0xa3,0x71, 0xb4,0x70,0x02,0xdf, 0xf9,0xad,0x2b,0xec, 0x75,0xf7,0x09,0x6c, 0x5d,0x2a,0xd0,0x0b, 0x2e,0xb3,0xf0,0xd3, 0xce,0xdb,0x26,0x80, }, .h = { 0x2d,0xb3,0x7e,0x73, 0xde,0x6a,0x9e,0xa9, 0x54,0x9a,0x0f,0xb3, 0x0b,0xcc,0xc9,0xde, 0x7a,0x4e,0x4a,0x71, 0x07,0x33,0xee,0x06, 0x5c,0x9a,0xa1,0x30, 0x5e,0x39,0x4e,0x10, }, }, [2] = { /* 1024-byte message */ .k = { 0x4c,0xe4,0x3c,0x6e, 0xa0,0xe3,0x0e,0x64, 0x35,0x44,0x3e,0x0b, 0x4d,0x29,0xbe,0x04, 0xa7,0xaa,0x88,0xe0, 0xe0,0x07,0x7d,0xa8, 0x2b,0x87,0x7d,0x08, 0xa6,0x59,0xd0,0xa5, 0x03,0xae,0x9b,0xee, 0xd4,0x11,0x39,0x7d, 0x9e,0x1d,0x89,0xe3, 0xc6,0x92,0x36,0x07, 0xa4,0x43,0xad,0x2f, 0xd5,0x71,0x84,0x2d, 0xc0,0x37,0xed,0x62, 0x4e,0x2b,0x8c,0xd5, 0x1d,0xf7,0x00,0xbb, 0x3d,0x5e,0xcc,0xc5, 0x6d,0xdd,0x17,0xf2, 0x89,0x25,0x30,0x16, 0x04,0xd7,0x1f,0x84, 0x7d,0x61,0xa0,0x7a, 0x49,0x88,0x44,0x46, 0xc6,0x05,0xd1,0xc9, 0xa0,0x2a,0x86,0xdd, 0xd3,0x80,0x40,0xa4, 0x28,0xb3,0xa4,0x3b, 0x71,0x0a,0x7f,0x2d, 0x3b,0xcd,0xe6,0xac, 0x59,0xda,0x43,0x56, 0x6e,0x9a,0x3f,0x1e, 0x82,0xcf,0xb3,0xa0, 0xa1,0x46,0xcf,0x2e, 0x32,0x05,0xcd,0x68, 0xbb,0x51,0x71,0x8a, 0x16,0x75,0xbe,0x49, 0x7e,0xb3,0x63,0x30, 0x95,0x34,0xe6,0x85, 0x7e,0x9a,0xdd,0xe6, 0x43,0xd6,0x59,0xf8, 0x6a,0xb8,0x8f,0x5f, 0x5d,0xd9,0x55,0x41, 0x12,0xf9,0x98,0xc6, 0x93,0x7c,0x3f,0x46, 0xab,0x7c,0x8b,0x28, 0xde,0x9a,0xb1,0xf0, 0x6c,0x43,0x2a,0xb3, 0x70,0xc5,0x9d,0xc0, 0x26,0xcf,0xad,0x9c, 0x87,0x9b,0x3f,0x7c, 0x24,0xac,0xe7,0xd4, 0xe8,0x14,0xe3,0x3e, 0xf6,0x8a,0x97,0x87, 0x63,0x2c,0x88,0xdc, 0xc5,0x23,0x68,0x6e, 0x94,0xe1,0x09,0xc4, 0x44,0xda,0x8f,0xa7, 0x9f,0xc4,0x52,0xa4, 0x18,0x1d,0x3c,0x08, 0xca,0x0a,0x3e,0xb4, 0xbf,0xbe,0xc6,0x47, 0xe2,0x89,0x2b,0x07, 0x71,0xd9,0xc8,0x6a, 0x06,0xd5,0xd0,0x47, 0x4e,0x07,0x4f,0x6b, 0xdb,0xdf,0x3d,0xf0, 0x7c,0x5f,0x49,0x70, 0x17,0x4f,0x9f,0x33, 0x7e,0x4b,0x72,0x3b, 0x8c,0x68,0x22,0xf9, 0xd2,0xad,0xe4,0xe4, 0xb2,0x61,0x9d,0xb8, 0xc2,0x5c,0xf0,0x3b, 0x08,0xb2,0x75,0x30, 0x3a,0xd0,0x7d,0xf9, 0xb2,0x00,0x40,0x56, 0x79,0xe2,0x0d,0x31, 0x72,0xe2,0xc2,0xd1, 0x2e,0x27,0xe7,0xc8, 0x96,0x1a,0xc6,0x7e, 0xb8,0xc1,0x93,0xfb, 0x1d,0xbc,0xed,0x97, 0x2f,0x2f,0xea,0xa1, 0x40,0x49,0xf6,0x1d, 0xab,0x54,0x46,0x2e, 0x73,0xf2,0x74,0xf1, 0x6d,0x5c,0xe6,0xa0, 0xd4,0x73,0x1c,0xbc, 0x07,0x81,0xf5,0x94, 0xe6,0x18,0xdc,0x42, 0x68,0xb9,0xeb,0xfb, 0xa3,0x76,0x8c,0x83, 0x98,0xe9,0x96,0xa6, 0xa6,0x5e,0x0e,0xd1, 0xfc,0xb7,0x8e,0x8b, 0x9e,0xa4,0x00,0x76, 0x0e,0x35,0x92,0x5e, 0x05,0xa1,0x92,0xc4, 0x0c,0xd1,0xec,0x8c, 0x04,0x8e,0x65,0x56, 0x43,0xae,0x16,0x18, 0x2e,0x3e,0xfe,0x47, 0x92,0xe1,0x76,0x1b, 0xb6,0xcc,0x0b,0x82, 0xe1,0x8c,0x7b,0x43, 0xe4,0x90,0xed,0x28, 0x0b,0xe6,0x05,0xea, 0x4a,0xc0,0xf1,0x12, 0x54,0x09,0x93,0xda, 0xfc,0xf4,0x86,0xff, 0x4c,0xaa,0x7d,0xbe, 0xd0,0x4a,0xa6,0x9d, 0x6b,0x27,0x8f,0xb1, 0xb5,0x3a,0x9b,0xce, 0xe2,0x5c,0x29,0x35, 0xd6,0xe7,0xf3,0xa4, 0x5e,0x70,0xf6,0xc6, 0xde,0x63,0x86,0xf7, 0xc9,0xab,0x42,0xb9, 0xe7,0x5d,0x1c,0x68, 0x73,0xa3,0xed,0xb0, 0xa0,0xb6,0x18,0x15, 0xe6,0x57,0x4c,0x21, 0xf7,0xf3,0xc6,0x32, 0x4d,0x07,0x4a,0x14, 0xde,0xb2,0xc7,0xca, 0xf0,0x78,0xc4,0x85, 0xe3,0xdc,0xfb,0x35, 0x7c,0x6b,0xc0,0xb8, 0xcd,0x7a,0x22,0xfc, 0xe4,0xe8,0xe2,0x98, 0x6c,0x8e,0xdf,0x37, 0x8e,0x0f,0x25,0x23, 0xdd,0xea,0x40,0x6f, 0xb3,0x07,0x7e,0x7a, 0x6b,0xa1,0xa1,0xcf, 0x24,0xd9,0xad,0x72, 0x7a,0x45,0x49,0xca, 0xfe,0xc7,0x2e,0x6d, 0xaa,0xc1,0x08,0x2c, 0xe6,0xde,0xde,0x73, 0x01,0x9c,0xdc,0x65, 0x3a,0xdf,0xc6,0x15, 0x37,0x62,0x0b,0x2c, 0x9a,0x36,0xed,0x37, 0xd9,0xfc,0xa9,0xb3, 0x32,0xc3,0xde,0x26, 0xe7,0xf0,0x3f,0x02, 0xed,0x35,0x74,0xea, 0xdd,0x32,0xe9,0x96, 0x75,0x66,0xb8,0xf0, 0x75,0x98,0x8f,0x3a, 0xd0,0xc2,0xa1,0x98, 0x5f,0xf9,0x32,0x31, 0x00,0x18,0x7d,0xc5, 0x9d,0x15,0x5b,0xdc, 0x13,0x37,0x69,0xfc, 0x95,0x7a,0x62,0x0e, 0x8a,0x86,0xed,0x18, 0x78,0x3c,0x49,0xf4, 0x18,0x73,0xcd,0x2e, 0x7b,0xa3,0x40,0xd7, 0x01,0xf6,0xc7,0x2a, 0xc5,0xce,0x13,0x09, 0xb1,0xe5,0x25,0x17, 0xdf,0x9d,0x7e,0x0b, 0x50,0x46,0x62,0x78, 0xb5,0x25,0xb2,0xd9, 0x65,0xfa,0x5b,0xf7, 0xfe,0xc6,0xe0,0x7b, 0x7b,0x4e,0x14,0x2e, 0x0d,0x3a,0xd0,0xe0, 0xa0,0xd2,0xeb,0x4d, 0x87,0x11,0x42,0x28, 0x02,0x7e,0xa8,0x56, 0x5b,0x53,0xbd,0x76, 0x47,0x8f,0x5f,0x8b, 0xc7,0xd9,0x72,0xf7, 0x11,0xbb,0x94,0xdb, 0x0d,0x07,0xb7,0x0a, 0xcc,0x41,0x00,0xcd, 0xd0,0x50,0x25,0x31, 0xc9,0x47,0x6b,0xdd, 0x3f,0x70,0x24,0x3e, 0xde,0x02,0x62,0x6c, 0xb4,0x44,0x92,0x8e, 0x98,0x9c,0x0e,0x30, 0x2f,0x80,0xb9,0x5e, 0x75,0x90,0xa6,0x02, 0xf0,0xed,0xb0,0x8b, 0x44,0xa3,0x59,0x2d, 0xc3,0x08,0xe5,0xd9, 0x89,0x6a,0x71,0x44, 0x04,0xc4,0xb2,0x61, 0x5b,0xf5,0x46,0x44, 0xdc,0x36,0x2e,0xfd, 0x41,0xf5,0xa1,0x3a, 0xb3,0x93,0x74,0x7d, 0x54,0x5e,0x64,0xdc, 0xbc,0xd7,0x07,0x48, 0x3e,0x73,0x81,0x22, 0x9c,0x5a,0xf6,0xde, 0x94,0x42,0xe1,0x6c, 0x92,0xe7,0x6d,0xa0, 0x5e,0xc3,0xd6,0xe9, 0x84,0xd9,0xba,0x57, 0xef,0x85,0x6a,0x9b, 0xe6,0x9a,0x2b,0xf8, 0x8d,0xfe,0x9d,0xad, 0x70,0x26,0x05,0x14, 0x45,0x07,0xcb,0x72, 0xd4,0x8b,0x14,0x44, 0x74,0x40,0x9c,0x29, 0x8b,0xba,0x40,0x09, 0x52,0xfc,0xc5,0x40, 0xb1,0x25,0x69,0xaa, 0x8f,0x12,0xc4,0xc6, 0x2b,0x3f,0x73,0x9d, 0xff,0x52,0xd4,0xac, 0x77,0x43,0xdc,0xd2, 0x06,0x9a,0x1b,0xfc, 0x0c,0x8f,0x6b,0x59, 0xa5,0xd4,0xde,0x06, 0x16,0x34,0xef,0x75, 0x22,0x54,0x9c,0x53, 0x38,0x0b,0x57,0xc7, 0xaa,0x78,0x2d,0x3a, 0x9b,0xdd,0xed,0xb5, 0x0b,0xb0,0x08,0x5f, 0x57,0xdb,0xfc,0xbe, 0x44,0xfd,0x71,0x5f, 0x71,0x14,0xd5,0x14, 0x70,0xb6,0xee,0xd0, 0xf3,0x37,0x6f,0x57, 0x55,0x3c,0x7c,0x23, 0x6f,0xbe,0x83,0x5c, 0xb5,0x64,0xfd,0x6d, 0x7c,0xe4,0x05,0x2b, 0xdb,0xc4,0xf5,0xa0, 0xd3,0xa6,0x15,0x48, 0xc2,0x50,0xf8,0xf7, 0xc2,0xab,0xb5,0x6a, 0x0d,0x1a,0xb5,0x30, 0x33,0xf8,0x12,0x2d, 0xfb,0xa6,0x2e,0xe5, 0xbe,0x40,0xba,0x48, 0xef,0x05,0xc8,0x37, 0x3a,0x36,0xad,0x99, 0x77,0x87,0x84,0xac, 0xd8,0xcb,0x7a,0x88, 0x3e,0x2d,0x8b,0xbe, 0x9a,0x35,0x88,0x26, 0xe9,0x20,0xd4,0x66, 0x80,0x8b,0xf8,0x54, 0xba,0xcd,0xa8,0x47, 0x35,0x1b,0xc4,0x09, 0x6d,0xff,0x0e,0x60, 0x7c,0xf3,0x68,0xbf, 0xe3,0xe9,0x73,0x07, 0x84,0xf0,0x08,0x45, 0x97,0x65,0x94,0xd1, 0x35,0x4e,0x67,0x0c, 0xe3,0xb7,0x61,0x7b, 0x09,0x22,0xed,0x18, 0xee,0x0b,0x54,0xc0, 0xab,0x8b,0xaa,0x71, 0x4c,0x40,0xbf,0xf7, 0xe0,0x7e,0x08,0xaa, }, .mlen = 1024, .m = { 0x1d,0xea,0xe5,0x2b, 0x4c,0x22,0x4d,0xf3, 0x15,0x53,0xcb,0x41, 0xf5,0xcf,0x0b,0x7b, 0xc9,0x80,0xc0,0x95, 0xd2,0x7b,0x08,0x4b, 0x3d,0xcd,0xd8,0x3b, 0x2f,0x18,0xd4,0x70, 0x38,0xb2,0xa7,0x2f, 0x7f,0xba,0xd8,0xed, 0xbc,0x8f,0xac,0xe4, 0xe2,0x11,0x2d,0x6d, 0xe6,0xa4,0x36,0x90, 0xc2,0x7f,0xdf,0xe3, 0xdc,0x50,0xdb,0x6c, 0x56,0xcf,0x7d,0xd6, 0xd0,0xcb,0xd6,0x9b, 0x01,0xbb,0xef,0x1c, 0x0a,0x6c,0x92,0x23, 0xeb,0x77,0xf9,0xd1, 0x25,0xdc,0x94,0x30, 0x30,0xa4,0x96,0x3e, 0xdf,0x52,0x4c,0xe7, 0xdf,0x27,0x9f,0x73, 0x78,0x0c,0x8c,0x7f, 0x9d,0xae,0x79,0x5d, 0x91,0x5e,0x4b,0x02, 0xa9,0x31,0x9c,0xff, 0x46,0x73,0xec,0x0d, 0x5a,0xb8,0xeb,0x48, 0x19,0x9c,0x44,0xe0, 0xc8,0x81,0x96,0x4c, 0x47,0x0c,0xe7,0x1d, 0x2a,0x9c,0xd5,0xe0, 0xe7,0xd6,0xa0,0x88, 0xf0,0xf6,0xda,0xa7, 0x6a,0xdd,0xfd,0x4f, 0x00,0x6e,0x25,0x7d, 0xb9,0x81,0x19,0x2f, 0x4e,0xcc,0x8d,0x6e, 0xa6,0x92,0xcf,0xd8, 0x6e,0x78,0x0a,0xf6, 0x8a,0x43,0xeb,0x60, 0x0c,0x8b,0x93,0x50, 0x88,0xd1,0x67,0x05, 0x0c,0xdc,0x43,0x85, 0x50,0x91,0x63,0xa4, 0x32,0x14,0x66,0x84, 0xdb,0x04,0x9f,0x77, 0x95,0x60,0x19,0xc6, 0x98,0x60,0x62,0xe4, 0xc6,0xee,0x70,0x76, 0xb0,0x59,0x80,0x59, 0x46,0xae,0x99,0x26, 0x62,0x4a,0xf0,0x45, 0x8f,0xf0,0x70,0x5b, 0x52,0xfc,0xee,0x4d, 0x30,0x47,0xc8,0xae, 0xe2,0xbc,0x2c,0x73, 0x78,0x67,0xf1,0x00, 0xb4,0xda,0x01,0xad, 0x3b,0xc4,0x5c,0x6c, 0x65,0xca,0x84,0x22, 0x95,0x32,0x95,0x20, 0x4d,0xdc,0x96,0x2e, 0x61,0xe4,0xc8,0xec, 0x2d,0xbf,0xc1,0x5d, 0x70,0xf9,0x75,0xf2, 0xad,0x0a,0xc9,0xd7, 0x0a,0x81,0x3c,0xa1, 0x13,0xec,0x63,0xd4, 0xd0,0x67,0xf4,0xcc, 0x6e,0xb8,0x52,0x08, 0x46,0xc9,0x2a,0x92, 0x59,0xd9,0x14,0x17, 0xde,0x2f,0xc7,0x36, 0xd5,0xd5,0xfc,0x8a, 0x63,0xd5,0x5f,0xe3, 0xdd,0x55,0x00,0x8e, 0x5e,0xc9,0xed,0x04, 0x1d,0xeb,0xae,0xc5, 0xd0,0xf9,0x73,0x28, 0xf3,0x81,0xd5,0xb4, 0x60,0xb2,0x42,0x81, 0x68,0xf3,0xb9,0x73, 0x07,0x2e,0x34,0x8e, 0x47,0x12,0xae,0x7c, 0xa8,0xc2,0xce,0xad, 0x0f,0x6e,0x44,0xa5, 0x35,0x5e,0x61,0x6b, 0xfc,0x67,0x9c,0x82, 0xa1,0xd2,0xff,0xfe, 0x60,0x7c,0x40,0x02, 0x24,0x9e,0x8b,0x90, 0xa0,0x89,0xd9,0x83, 0x04,0xd8,0xef,0x9c, 0x96,0x28,0x77,0x3e, 0xe3,0xb0,0xf8,0x3d, 0xfb,0x91,0x8f,0x6f, 0x83,0x58,0x1e,0x4b, 0x64,0xc7,0xf6,0xe0, 0x85,0x03,0xe3,0xf9, 0x6b,0xc9,0x9e,0x9d, 0x57,0x25,0xe4,0x69, 0x08,0x59,0x28,0x4a, 0x52,0x9c,0x49,0x19, 0x24,0x49,0xba,0xb1, 0x82,0xd4,0xcf,0xd0, 0x1e,0x1d,0xc2,0x02, 0x42,0x4e,0xdf,0xf7, 0x2b,0x3d,0x99,0xf6, 0x99,0xa4,0x3a,0xe1, 0x9d,0x68,0xc8,0x08, 0xec,0xec,0x1c,0xa8, 0x41,0x4a,0x27,0x84, 0xe9,0x0d,0x95,0x54, 0x1a,0xca,0x5f,0x5d, 0x5a,0x96,0xb9,0x5b, 0x6e,0xbc,0x39,0x7f, 0x7a,0x20,0xc5,0xb2, 0x60,0x0c,0xa3,0x78, 0xc3,0x2b,0x87,0xcc, 0xea,0xb0,0x4d,0x27, 0xfb,0x6c,0x58,0x51, 0xce,0x90,0xca,0xd6, 0x86,0x91,0x4d,0x2c, 0x8c,0x82,0xf0,0xc9, 0x9a,0x0a,0x73,0xb3, 0xcb,0xa9,0xd4,0x26, 0x4d,0x74,0xbe,0x0e, 0x4a,0x6e,0x10,0xeb, 0x4e,0xba,0x4e,0xba, 0x0d,0x26,0x69,0x87, 0x5e,0x08,0x2b,0x43, 0xbe,0x97,0x4e,0x2a, 0x63,0xbc,0x52,0xb7, 0xda,0x23,0x23,0x11, 0xfa,0xcf,0x89,0xac, 0x90,0x5f,0x60,0x7a, 0x50,0xb7,0xbe,0x79, 0x0b,0x2c,0xf0,0x27, 0xf0,0xfb,0xaf,0x64, 0xc8,0x57,0x7c,0xeb, 0x1c,0xf7,0x36,0xec, 0x09,0x97,0x66,0x31, 0x54,0xe4,0x00,0xcf, 0x68,0x24,0x77,0x1a, 0xbc,0x27,0x3a,0xad, 0x8a,0x01,0x7e,0x45, 0xe7,0xe4,0xa4,0xeb, 0x38,0x62,0x9d,0x90, 0xea,0x00,0x9c,0x03, 0x5e,0xb2,0x7d,0xd8, 0x2f,0xe9,0xc9,0x3c, 0x1a,0x5c,0x21,0x1a, 0x59,0x45,0x62,0x47, 0x93,0x1b,0xdc,0xd8, 0x3e,0x07,0x8b,0x75, 0xd0,0x6d,0xcc,0x8d, 0xec,0x79,0xa8,0x9a, 0x51,0xa5,0x50,0x18, 0xae,0x44,0x93,0x75, 0xc1,0xc8,0x1e,0x10, 0x59,0x1e,0x0b,0xb3, 0x06,0x30,0xa8,0x66, 0x8d,0x8e,0xd6,0x4d, 0x0d,0x8a,0xb4,0x28, 0xdc,0xfb,0x5d,0x59, 0xe0,0x92,0x77,0x38, 0xfa,0xad,0x46,0x46, 0x25,0x15,0x4c,0xca, 0x09,0x2b,0x31,0xe9, 0x36,0xe8,0xc2,0x67, 0x34,0x4d,0x5e,0xa0, 0x8f,0x9a,0xe8,0x7f, 0xf2,0x2a,0x92,0x78, 0xde,0x09,0x75,0xe7, 0xe5,0x50,0x0a,0x2e, 0x88,0x63,0xc0,0x8f, 0xa8,0x73,0x0f,0xe5, 0x1e,0x9d,0xdb,0xce, 0x53,0xe0,0x42,0x94, 0x7b,0x5c,0xa1,0x5e, 0x1e,0x8f,0x0a,0x6e, 0x8b,0x1a,0xad,0x93, 0x70,0x86,0xf1,0x69, 0x70,0x93,0x24,0xe3, 0x83,0x2f,0xa8,0x04, 0xba,0x27,0x0a,0x2e, 0x03,0xeb,0x69,0xd9, 0x56,0x0e,0xc4,0x10, 0x55,0x31,0x2c,0x3f, 0xd1,0xb2,0x94,0x0f, 0x28,0x15,0x3c,0x02, 0x15,0x5e,0xec,0x26, 0x9c,0xc3,0xfc,0xa7, 0x5c,0xb0,0xfa,0xc0, 0x02,0xf9,0x01,0x3f, 0x01,0x73,0x24,0x22, 0x50,0x28,0x2a,0xca, 0xb1,0xf2,0x03,0x00, 0x2f,0xc6,0x6f,0x28, 0x4f,0x4b,0x4f,0x1a, 0x9a,0xb8,0x16,0x93, 0x31,0x60,0x7c,0x3d, 0x35,0xc8,0xd6,0x90, 0xde,0x8c,0x89,0x39, 0xbd,0x21,0x11,0x05, 0xe8,0xc4,0x04,0x3b, 0x65,0xa5,0x15,0xcf, 0xcf,0x15,0x14,0xf6, 0xe7,0x2e,0x3c,0x47, 0x59,0x0b,0xaa,0xc0, 0xd4,0xab,0x04,0x14, 0x9c,0xd7,0xe2,0x43, 0xc7,0x87,0x09,0x03, 0x27,0xd2,0x0a,0xff, 0x8d,0xd5,0x80,0x34, 0x93,0xa2,0x2c,0xb1, 0x4e,0x16,0x2d,0x82, 0x51,0x5c,0x3c,0xe5, 0x75,0x51,0x7b,0xb4, 0xd8,0x1e,0x59,0x98, 0x0f,0x75,0xed,0x02, 0x1c,0x13,0xf6,0x02, 0xda,0xf9,0x47,0xf7, 0x45,0x25,0x0f,0x58, 0x22,0x5d,0xef,0xf0, 0x1b,0xdb,0xae,0xaf, 0xbe,0xc6,0xe1,0xcd, 0x70,0x46,0x6e,0x03, 0x9a,0x20,0x77,0x00, 0x3c,0x32,0xb5,0x8f, 0x04,0xb6,0x6f,0xa2, 0x31,0xc9,0x7c,0xf9, 0x84,0x67,0x87,0xfb, 0x7b,0x13,0xb0,0x4d, 0x35,0xfd,0x37,0x5b, 0xf4,0x25,0xf0,0x02, 0x74,0xa0,0x69,0xd4, 0x53,0x61,0x4b,0x54, 0x68,0x94,0x0e,0x08, 0x25,0x82,0x90,0xfc, 0x25,0xb6,0x63,0xe2, 0x07,0x9f,0x42,0xf1, 0xbb,0x33,0xea,0xab, 0x92,0x54,0x2b,0x9f, 0x88,0xc0,0x31,0x2b, 0xfd,0x36,0x50,0x80, 0xfc,0x1a,0xff,0xab, 0xe8,0xc4,0x7f,0xb6, 0x98,0xb9,0x2e,0x17, 0xca,0x28,0x3d,0xdf, 0x0f,0x07,0x43,0x20, 0xf0,0x07,0xea,0xe5, 0xcd,0x4e,0x81,0x34, }, .h = { 0x9d,0x22,0x88,0xfd, 0x41,0x43,0x88,0x45, 0x34,0xfe,0x85,0xc4, 0xb9,0xff,0xe1,0x55, 0x40,0x1d,0x25,0x37, 0xd1,0xf8,0xfc,0x2b, 0x3a,0xf5,0x3b,0x69, 0xbf,0xa6,0x9d,0xed, }, }, }; static uint32_t k[268]; uint8_t h[32]; unsigned i, j; int result = 0; for (i = 0; i < __arraycount(C); i++) { for (j = 0; j < 268; j++) k[j] = le32dec(C[i].k + 4*j); nh(h, C[i].m, C[i].mlen, k); if (memcmp(h, C[i].h, 32)) { char prefix[10]; snprintf(prefix, sizeof prefix, "nh %u", i); hexdump(printf, prefix, h, 32); result = -1; } } return result; } /* https://github.com/google/adiantum/blob/a5ad5134ab11b10a3ee982c52385953fac88fedc/test_vectors/ours/NHPoly1305/NHPoly1305.json */ static int nhpoly1305_selftest(void) { static const struct { uint8_t k[1088]; unsigned mlen; uint8_t m[1024]; uint8_t h[16]; } C[] = { [0] = { /* 0-byte message */ .k = { /* Poly1305 key */ 0xd2,0x5d,0x4c,0xdd, 0x8d,0x2b,0x7f,0x7a, 0xd9,0xbe,0x71,0xec, 0xd1,0x83,0x52,0xe3, /* NH key */ 0xe1,0xad,0xd7,0x5c, 0x0a,0x75,0x9d,0xec, 0x1d,0x13,0x7e,0x5d, 0x71,0x07,0xc9,0xe4, 0x57,0x2d,0x44,0x68, 0xcf,0xd8,0xd6,0xc5, 0x39,0x69,0x7d,0x32, 0x75,0x51,0x4f,0x7e, 0xb2,0x4c,0xc6,0x90, 0x51,0x6e,0xd9,0xd6, 0xa5,0x8b,0x2d,0xf1, 0x94,0xf9,0xf7,0x5e, 0x2c,0x84,0x7b,0x41, 0x0f,0x88,0x50,0x89, 0x30,0xd9,0xa1,0x38, 0x46,0x6c,0xc0,0x4f, 0xe8,0xdf,0xdc,0x66, 0xab,0x24,0x43,0x41, 0x91,0x55,0x29,0x65, 0x86,0x28,0x5e,0x45, 0xd5,0x2d,0xb7,0x80, 0x08,0x9a,0xc3,0xd4, 0x9a,0x77,0x0a,0xd4, 0xef,0x3e,0xe6,0x3f, 0x6f,0x2f,0x9b,0x3a, 0x7d,0x12,0x1e,0x80, 0x6c,0x44,0xa2,0x25, 0xe1,0xf6,0x60,0xe9, 0x0d,0xaf,0xc5,0x3c, 0xa5,0x79,0xae,0x64, 0xbc,0xa0,0x39,0xa3, 0x4d,0x10,0xe5,0x4d, 0xd5,0xe7,0x89,0x7a, 0x13,0xee,0x06,0x78, 0xdc,0xa4,0xdc,0x14, 0x27,0xe6,0x49,0x38, 0xd0,0xe0,0x45,0x25, 0x36,0xc5,0xf4,0x79, 0x2e,0x9a,0x98,0x04, 0xe4,0x2b,0x46,0x52, 0x7c,0x33,0xca,0xe2, 0x56,0x51,0x50,0xe2, 0xa5,0x9a,0xae,0x18, 0x6a,0x13,0xf8,0xd2, 0x21,0x31,0x66,0x02, 0xe2,0xda,0x8d,0x7e, 0x41,0x19,0xb2,0x61, 0xee,0x48,0x8f,0xf1, 0x65,0x24,0x2e,0x1e, 0x68,0xce,0x05,0xd9, 0x2a,0xcf,0xa5,0x3a, 0x57,0xdd,0x35,0x91, 0x93,0x01,0xca,0x95, 0xfc,0x2b,0x36,0x04, 0xe6,0x96,0x97,0x28, 0xf6,0x31,0xfe,0xa3, 0x9d,0xf6,0x6a,0x1e, 0x80,0x8d,0xdc,0xec, 0xaf,0x66,0x11,0x13, 0x02,0x88,0xd5,0x27, 0x33,0xb4,0x1a,0xcd, 0xa3,0xf6,0xde,0x31, 0x8e,0xc0,0x0e,0x6c, 0xd8,0x5a,0x97,0x5e, 0xdd,0xfd,0x60,0x69, 0x38,0x46,0x3f,0x90, 0x5e,0x97,0xd3,0x32, 0x76,0xc7,0x82,0x49, 0xfe,0xba,0x06,0x5f, 0x2f,0xa2,0xfd,0xff, 0x80,0x05,0x40,0xe4, 0x33,0x03,0xfb,0x10, 0xc0,0xde,0x65,0x8c, 0xc9,0x8d,0x3a,0x9d, 0xb5,0x7b,0x36,0x4b, 0xb5,0x0c,0xcf,0x00, 0x9c,0x87,0xe4,0x49, 0xad,0x90,0xda,0x4a, 0xdd,0xbd,0xff,0xe2, 0x32,0x57,0xd6,0x78, 0x36,0x39,0x6c,0xd3, 0x5b,0x9b,0x88,0x59, 0x2d,0xf0,0x46,0xe4, 0x13,0x0e,0x2b,0x35, 0x0d,0x0f,0x73,0x8a, 0x4f,0x26,0x84,0x75, 0x88,0x3c,0xc5,0x58, 0x66,0x18,0x1a,0xb4, 0x64,0x51,0x34,0x27, 0x1b,0xa4,0x11,0xc9, 0x6d,0x91,0x8a,0xfa, 0x32,0x60,0x9d,0xd7, 0x87,0xe5,0xaa,0x43, 0x72,0xf8,0xda,0xd1, 0x48,0x44,0x13,0x61, 0xdc,0x8c,0x76,0x17, 0x0c,0x85,0x4e,0xf3, 0xdd,0xa2,0x42,0xd2, 0x74,0xc1,0x30,0x1b, 0xeb,0x35,0x31,0x29, 0x5b,0xd7,0x4c,0x94, 0x46,0x35,0xa1,0x23, 0x50,0xf2,0xa2,0x8e, 0x7e,0x4f,0x23,0x4f, 0x51,0xff,0xe2,0xc9, 0xa3,0x7d,0x56,0x8b, 0x41,0xf2,0xd0,0xc5, 0x57,0x7e,0x59,0xac, 0xbb,0x65,0xf3,0xfe, 0xf7,0x17,0xef,0x63, 0x7c,0x6f,0x23,0xdd, 0x22,0x8e,0xed,0x84, 0x0e,0x3b,0x09,0xb3, 0xf3,0xf4,0x8f,0xcd, 0x37,0xa8,0xe1,0xa7, 0x30,0xdb,0xb1,0xa2, 0x9c,0xa2,0xdf,0x34, 0x17,0x3e,0x68,0x44, 0xd0,0xde,0x03,0x50, 0xd1,0x48,0x6b,0x20, 0xe2,0x63,0x45,0xa5, 0xea,0x87,0xc2,0x42, 0x95,0x03,0x49,0x05, 0xed,0xe0,0x90,0x29, 0x1a,0xb8,0xcf,0x9b, 0x43,0xcf,0x29,0x7a, 0x63,0x17,0x41,0x9f, 0xe0,0xc9,0x10,0xfd, 0x2c,0x56,0x8c,0x08, 0x55,0xb4,0xa9,0x27, 0x0f,0x23,0xb1,0x05, 0x6a,0x12,0x46,0xc7, 0xe1,0xfe,0x28,0x93, 0x93,0xd7,0x2f,0xdc, 0x98,0x30,0xdb,0x75, 0x8a,0xbe,0x97,0x7a, 0x02,0xfb,0x8c,0xba, 0xbe,0x25,0x09,0xbe, 0xce,0xcb,0xa2,0xef, 0x79,0x4d,0x0e,0x9d, 0x1b,0x9d,0xb6,0x39, 0x34,0x38,0xfa,0x07, 0xec,0xe8,0xfc,0x32, 0x85,0x1d,0xf7,0x85, 0x63,0xc3,0x3c,0xc0, 0x02,0x75,0xd7,0x3f, 0xb2,0x68,0x60,0x66, 0x65,0x81,0xc6,0xb1, 0x42,0x65,0x4b,0x4b, 0x28,0xd7,0xc7,0xaa, 0x9b,0xd2,0xdc,0x1b, 0x01,0xe0,0x26,0x39, 0x01,0xc1,0x52,0x14, 0xd1,0x3f,0xb7,0xe6, 0x61,0x41,0xc7,0x93, 0xd2,0xa2,0x67,0xc6, 0xf7,0x11,0xb5,0xf5, 0xea,0xdd,0x19,0xfb, 0x4d,0x21,0x12,0xd6, 0x7d,0xf1,0x10,0xb0, 0x89,0x07,0xc7,0x5a, 0x52,0x73,0x70,0x2f, 0x32,0xef,0x65,0x2b, 0x12,0xb2,0xf0,0xf5, 0x20,0xe0,0x90,0x59, 0x7e,0x64,0xf1,0x4c, 0x41,0xb3,0xa5,0x91, 0x08,0xe6,0x5e,0x5f, 0x05,0x56,0x76,0xb4, 0xb0,0xcd,0x70,0x53, 0x10,0x48,0x9c,0xff, 0xc2,0x69,0x55,0x24, 0x87,0xef,0x84,0xea, 0xfb,0xa7,0xbf,0xa0, 0x91,0x04,0xad,0x4f, 0x8b,0x57,0x54,0x4b, 0xb6,0xe9,0xd1,0xac, 0x37,0x2f,0x1d,0x2e, 0xab,0xa5,0xa4,0xe8, 0xff,0xfb,0xd9,0x39, 0x2f,0xb7,0xac,0xd1, 0xfe,0x0b,0x9a,0x80, 0x0f,0xb6,0xf4,0x36, 0x39,0x90,0x51,0xe3, 0x0a,0x2f,0xb6,0x45, 0x76,0x89,0xcd,0x61, 0xfe,0x48,0x5f,0x75, 0x1d,0x13,0x00,0x62, 0x80,0x24,0x47,0xe7, 0xbc,0x37,0xd7,0xe3, 0x15,0xe8,0x68,0x22, 0xaf,0x80,0x6f,0x4b, 0xa8,0x9f,0x01,0x10, 0x48,0x14,0xc3,0x02, 0x52,0xd2,0xc7,0x75, 0x9b,0x52,0x6d,0x30, 0xac,0x13,0x85,0xc8, 0xf7,0xa3,0x58,0x4b, 0x49,0xf7,0x1c,0x45, 0x55,0x8c,0x39,0x9a, 0x99,0x6d,0x97,0x27, 0x27,0xe6,0xab,0xdd, 0x2c,0x42,0x1b,0x35, 0xdd,0x9d,0x73,0xbb, 0x6c,0xf3,0x64,0xf1, 0xfb,0xb9,0xf7,0xe6, 0x4a,0x3c,0xc0,0x92, 0xc0,0x2e,0xb7,0x1a, 0xbe,0xab,0xb3,0x5a, 0xe5,0xea,0xb1,0x48, 0x58,0x13,0x53,0x90, 0xfd,0xc3,0x8e,0x54, 0xf9,0x18,0x16,0x73, 0xe8,0xcb,0x6d,0x39, 0x0e,0xd7,0xe0,0xfe, 0xb6,0x9f,0x43,0x97, 0xe8,0xd0,0x85,0x56, 0x83,0x3e,0x98,0x68, 0x7f,0xbd,0x95,0xa8, 0x9a,0x61,0x21,0x8f, 0x06,0x98,0x34,0xa6, 0xc8,0xd6,0x1d,0xf3, 0x3d,0x43,0xa4,0x9a, 0x8c,0xe5,0xd3,0x5a, 0x32,0xa2,0x04,0x22, 0xa4,0x19,0x1a,0x46, 0x42,0x7e,0x4d,0xe5, 0xe0,0xe6,0x0e,0xca, 0xd5,0x58,0x9d,0x2c, 0xaf,0xda,0x33,0x5c, 0xb0,0x79,0x9e,0xc9, 0xfc,0xca,0xf0,0x2f, 0xa8,0xb2,0x77,0xeb, 0x7a,0xa2,0xdd,0x37, 0x35,0x83,0x07,0xd6, 0x02,0x1a,0xb6,0x6c, 0x24,0xe2,0x59,0x08, 0x0e,0xfd,0x3e,0x46, 0xec,0x40,0x93,0xf4, 0x00,0x26,0x4f,0x2a, 0xff,0x47,0x2f,0xeb, 0x02,0x92,0x26,0x5b, 0x53,0x17,0xc2,0x8d, 0x2a,0xc7,0xa3,0x1b, 0xcd,0xbc,0xa7,0xe8, 0xd1,0x76,0xe3,0x80, 0x21,0xca,0x5d,0x3b, 0xe4,0x9c,0x8f,0xa9, 0x5b,0x7f,0x29,0x7f, 0x7c,0xd8,0xed,0x6d, 0x8c,0xb2,0x86,0x85, 0xe7,0x77,0xf2,0x85, 0xab,0x38,0xa9,0x9d, 0xc1,0x4e,0xc5,0x64, 0x33,0x73,0x8b,0x59, 0x03,0xad,0x05,0xdf, 0x25,0x98,0x31,0xde, 0xef,0x13,0xf1,0x9b, 0x3c,0x91,0x9d,0x7b, 0xb1,0xfa,0xe6,0xbf, 0x5b,0xed,0xa5,0x55, 0xe6,0xea,0x6c,0x74, 0xf4,0xb9,0xe4,0x45, 0x64,0x72,0x81,0xc2, 0x4c,0x28,0xd4,0xcd, 0xac,0xe2,0xde,0xf9, 0xeb,0x5c,0xeb,0x61, 0x60,0x5a,0xe5,0x28, }, .mlen = 0, .h = {0}, }, [1] = { /* 16-byte message */ .k = { /* Poly1305 key */ 0x29,0x21,0x43,0xcb, 0xcb,0x13,0x07,0xde, 0xbf,0x48,0xdf,0x8a, 0x7f,0xa2,0x84,0xde, /* NH key */ 0x72,0x23,0x9d,0xf5, 0xf0,0x07,0xf2,0x4c, 0x20,0x3a,0x93,0xb9, 0xcd,0x5d,0xfe,0xcb, 0x99,0x2c,0x2b,0x58, 0xc6,0x50,0x5f,0x94, 0x56,0xc3,0x7c,0x0d, 0x02,0x3f,0xb8,0x5e, 0x7b,0xc0,0x6c,0x51, 0x34,0x76,0xc0,0x0e, 0xc6,0x22,0xc8,0x9e, 0x92,0xa0,0x21,0xc9, 0x85,0x5c,0x7c,0xf8, 0xe2,0x64,0x47,0xc9, 0xe4,0xa2,0x57,0x93, 0xf8,0xa2,0x69,0xcd, 0x62,0x98,0x99,0xf4, 0xd7,0x7b,0x14,0xb1, 0xd8,0x05,0xff,0x04, 0x15,0xc9,0xe1,0x6e, 0x9b,0xe6,0x50,0x6b, 0x0b,0x3f,0x22,0x1f, 0x08,0xde,0x0c,0x5b, 0x08,0x7e,0xc6,0x2f, 0x6c,0xed,0xd6,0xb2, 0x15,0xa4,0xb3,0xf9, 0xa7,0x46,0x38,0x2a, 0xea,0x69,0xa5,0xde, 0x02,0xc3,0x96,0x89, 0x4d,0x55,0x3b,0xed, 0x3d,0x3a,0x85,0x77, 0xbf,0x97,0x45,0x5c, 0x9e,0x02,0x69,0xe2, 0x1b,0x68,0xbe,0x96, 0xfb,0x64,0x6f,0x0f, 0xf6,0x06,0x40,0x67, 0xfa,0x04,0xe3,0x55, 0xfa,0xbe,0xa4,0x60, 0xef,0x21,0x66,0x97, 0xe6,0x9d,0x5c,0x1f, 0x62,0x37,0xaa,0x31, 0xde,0xe4,0x9c,0x28, 0x95,0xe0,0x22,0x86, 0xf4,0x4d,0xf3,0x07, 0xfd,0x5f,0x3a,0x54, 0x2c,0x51,0x80,0x71, 0xba,0x78,0x69,0x5b, 0x65,0xab,0x1f,0x81, 0xed,0x3b,0xff,0x34, 0xa3,0xfb,0xbc,0x73, 0x66,0x7d,0x13,0x7f, 0xdf,0x6e,0xe2,0xe2, 0xeb,0x4f,0x6c,0xda, 0x7d,0x33,0x57,0xd0, 0xd3,0x7c,0x95,0x4f, 0x33,0x58,0x21,0xc7, 0xc0,0xe5,0x6f,0x42, 0x26,0xc6,0x1f,0x5e, 0x85,0x1b,0x98,0x9a, 0xa2,0x1e,0x55,0x77, 0x23,0xdf,0x81,0x5e, 0x79,0x55,0x05,0xfc, 0xfb,0xda,0xee,0xba, 0x5a,0xba,0xf7,0x77, 0x7f,0x0e,0xd3,0xe1, 0x37,0xfe,0x8d,0x2b, 0xd5,0x3f,0xfb,0xd0, 0xc0,0x3c,0x0b,0x3f, 0xcf,0x3c,0x14,0xcf, 0xfb,0x46,0x72,0x4c, 0x1f,0x39,0xe2,0xda, 0x03,0x71,0x6d,0x23, 0xef,0x93,0xcd,0x39, 0xd9,0x37,0x80,0x4d, 0x65,0x61,0xd1,0x2c, 0x03,0xa9,0x47,0x72, 0x4d,0x1e,0x0e,0x16, 0x33,0x0f,0x21,0x17, 0xec,0x92,0xea,0x6f, 0x37,0x22,0xa4,0xd8, 0x03,0x33,0x9e,0xd8, 0x03,0x69,0x9a,0xe8, 0xb2,0x57,0xaf,0x78, 0x99,0x05,0x12,0xab, 0x48,0x90,0x80,0xf0, 0x12,0x9b,0x20,0x64, 0x7a,0x1d,0x47,0x5f, 0xba,0x3c,0xf9,0xc3, 0x0a,0x0d,0x8d,0xa1, 0xf9,0x1b,0x82,0x13, 0x3e,0x0d,0xec,0x0a, 0x83,0xc0,0x65,0xe1, 0xe9,0x95,0xff,0x97, 0xd6,0xf2,0xe4,0xd5, 0x86,0xc0,0x1f,0x29, 0x27,0x63,0xd7,0xde, 0xb7,0x0a,0x07,0x99, 0x04,0x2d,0xa3,0x89, 0xa2,0x43,0xcf,0xf3, 0xe1,0x43,0xac,0x4a, 0x06,0x97,0xd0,0x05, 0x4f,0x87,0xfa,0xf9, 0x9b,0xbf,0x52,0x70, 0xbd,0xbc,0x6c,0xf3, 0x03,0x13,0x60,0x41, 0x28,0x09,0xec,0xcc, 0xb1,0x1a,0xec,0xd6, 0xfb,0x6f,0x2a,0x89, 0x5d,0x0b,0x53,0x9c, 0x59,0xc1,0x84,0x21, 0x33,0x51,0x47,0x19, 0x31,0x9c,0xd4,0x0a, 0x4d,0x04,0xec,0x50, 0x90,0x61,0xbd,0xbc, 0x7e,0xc8,0xd9,0x6c, 0x98,0x1d,0x45,0x41, 0x17,0x5e,0x97,0x1c, 0xc5,0xa8,0xe8,0xea, 0x46,0x58,0x53,0xf7, 0x17,0xd5,0xad,0x11, 0xc8,0x54,0xf5,0x7a, 0x33,0x90,0xf5,0x19, 0xba,0x36,0xb4,0xfc, 0x52,0xa5,0x72,0x3d, 0x14,0xbb,0x55,0xa7, 0xe9,0xe3,0x12,0xf7, 0x1c,0x30,0xa2,0x82, 0x03,0xbf,0x53,0x91, 0x2e,0x60,0x41,0x9f, 0x5b,0x69,0x39,0xf6, 0x4d,0xc8,0xf8,0x46, 0x7a,0x7f,0xa4,0x98, 0x36,0xff,0x06,0xcb, 0xca,0xe7,0x33,0xf2, 0xc0,0x4a,0xf4,0x3c, 0x14,0x44,0x5f,0x6b, 0x75,0xef,0x02,0x36, 0x75,0x08,0x14,0xfd, 0x10,0x8e,0xa5,0x58, 0xd0,0x30,0x46,0x49, 0xaf,0x3a,0xf8,0x40, 0x3d,0x35,0xdb,0x84, 0x11,0x2e,0x97,0x6a, 0xb7,0x87,0x7f,0xad, 0xf1,0xfa,0xa5,0x63, 0x60,0xd8,0x5e,0xbf, 0x41,0x78,0x49,0xcf, 0x77,0xbb,0x56,0xbb, 0x7d,0x01,0x67,0x05, 0x22,0xc8,0x8f,0x41, 0xba,0x81,0xd2,0xca, 0x2c,0x38,0xac,0x76, 0x06,0xc1,0x1a,0xc2, 0xce,0xac,0x90,0x67, 0x57,0x3e,0x20,0x12, 0x5b,0xd9,0x97,0x58, 0x65,0x05,0xb7,0x04, 0x61,0x7e,0xd8,0x3a, 0xbf,0x55,0x3b,0x13, 0xe9,0x34,0x5a,0x37, 0x36,0xcb,0x94,0x45, 0xc5,0x32,0xb3,0xa0, 0x0c,0x3e,0x49,0xc5, 0xd3,0xed,0xa7,0xf0, 0x1c,0x69,0xcc,0xea, 0xcc,0x83,0xc9,0x16, 0x95,0x72,0x4b,0xf4, 0x89,0xd5,0xb9,0x10, 0xf6,0x2d,0x60,0x15, 0xea,0x3c,0x06,0x66, 0x9f,0x82,0xad,0x17, 0xce,0xd2,0xa4,0x48, 0x7c,0x65,0xd9,0xf8, 0x02,0x4d,0x9b,0x4c, 0x89,0x06,0x3a,0x34, 0x85,0x48,0x89,0x86, 0xf9,0x24,0xa9,0x54, 0x72,0xdb,0x44,0x95, 0xc7,0x44,0x1c,0x19, 0x11,0x4c,0x04,0xdc, 0x13,0xb9,0x67,0xc8, 0xc3,0x3a,0x6a,0x50, 0xfa,0xd1,0xfb,0xe1, 0x88,0xb6,0xf1,0xa3, 0xc5,0x3b,0xdc,0x38, 0x45,0x16,0x26,0x02, 0x3b,0xb8,0x8f,0x8b, 0x58,0x7d,0x23,0x04, 0x50,0x6b,0x81,0x9f, 0xae,0x66,0xac,0x6f, 0xcf,0x2a,0x9d,0xf1, 0xfd,0x1d,0x57,0x07, 0xbe,0x58,0xeb,0x77, 0x0c,0xe3,0xc2,0x19, 0x14,0x74,0x1b,0x51, 0x1c,0x4f,0x41,0xf3, 0x32,0x89,0xb3,0xe7, 0xde,0x62,0xf6,0x5f, 0xc7,0x6a,0x4a,0x2a, 0x5b,0x0f,0x5f,0x87, 0x9c,0x08,0xb9,0x02, 0x88,0xc8,0x29,0xb7, 0x94,0x52,0xfa,0x52, 0xfe,0xaa,0x50,0x10, 0xba,0x48,0x75,0x5e, 0x11,0x1b,0xe6,0x39, 0xd7,0x82,0x2c,0x87, 0xf1,0x1e,0xa4,0x38, 0x72,0x3e,0x51,0xe7, 0xd8,0x3e,0x5b,0x7b, 0x31,0x16,0x89,0xba, 0xd6,0xad,0x18,0x5e, 0xba,0xf8,0x12,0xb3, 0xf4,0x6c,0x47,0x30, 0xc0,0x38,0x58,0xb3, 0x10,0x8d,0x58,0x5d, 0xb4,0xfb,0x19,0x7e, 0x41,0xc3,0x66,0xb8, 0xd6,0x72,0x84,0xe1, 0x1a,0xc2,0x71,0x4c, 0x0d,0x4a,0x21,0x7a, 0xab,0xa2,0xc0,0x36, 0x15,0xc5,0xe9,0x46, 0xd7,0x29,0x17,0x76, 0x5e,0x47,0x36,0x7f, 0x72,0x05,0xa7,0xcc, 0x36,0x63,0xf9,0x47, 0x7d,0xe6,0x07,0x3c, 0x8b,0x79,0x1d,0x96, 0x61,0x8d,0x90,0x65, 0x7c,0xf5,0xeb,0x4e, 0x6e,0x09,0x59,0x6d, 0x62,0x50,0x1b,0x0f, 0xe0,0xdc,0x78,0xf2, 0x5b,0x83,0x1a,0xa1, 0x11,0x75,0xfd,0x18, 0xd7,0xe2,0x8d,0x65, 0x14,0x21,0xce,0xbe, 0xb5,0x87,0xe3,0x0a, 0xda,0x24,0x0a,0x64, 0xa9,0x9f,0x03,0x8d, 0x46,0x5d,0x24,0x1a, 0x8a,0x0c,0x42,0x01, 0xca,0xb1,0x5f,0x7c, 0xa5,0xac,0x32,0x4a, 0xb8,0x07,0x91,0x18, 0x6f,0xb0,0x71,0x3c, 0xc9,0xb1,0xa8,0xf8, 0x5f,0x69,0xa5,0xa1, 0xca,0x9e,0x7a,0xaa, 0xac,0xe9,0xc7,0x47, 0x41,0x75,0x25,0xc3, 0x73,0xe2,0x0b,0xdd, 0x6d,0x52,0x71,0xbe, 0xc5,0xdc,0xb4,0xe7, 0x01,0x26,0x53,0x77, 0x86,0x90,0x85,0x68, 0x6b,0x7b,0x03,0x53, 0xda,0x52,0x52,0x51, 0x68,0xc8,0xf3,0xec, 0x6c,0xd5,0x03,0x7a, 0xa3,0x0e,0xb4,0x02, 0x5f,0x1a,0xab,0xee, 0xca,0x67,0x29,0x7b, 0xbd,0x96,0x59,0xb3, 0x8b,0x32,0x7a,0x92, 0x9f,0xd8,0x25,0x2b, 0xdf,0xc0,0x4c,0xda, }, .mlen = 16, .m = { 0xbc,0xda,0x81,0xa8, 0x78,0x79,0x1c,0xbf, 0x77,0x53,0xba,0x4c, 0x30,0x5b,0xb8,0x33, }, .h = { 0x04,0xbf,0x7f,0x6a, 0xce,0x72,0xea,0x6a, 0x79,0xdb,0xb0,0xc9, 0x60,0xf6,0x12,0xcc, }, }, [2] = { /* 1024-byte message */ .k = { 0x65,0x4d,0xe3,0xf8, 0xd2,0x4c,0xac,0x28, 0x68,0xf5,0xb3,0x81, 0x71,0x4b,0xa1,0xfa, 0x04,0x0e,0xd3,0x81, 0x36,0xbe,0x0c,0x81, 0x5e,0xaf,0xbc,0x3a, 0xa4,0xc0,0x8e,0x8b, 0x55,0x63,0xd3,0x52, 0x97,0x88,0xd6,0x19, 0xbc,0x96,0xdf,0x49, 0xff,0x04,0x63,0xf5, 0x0c,0x11,0x13,0xaa, 0x9e,0x1f,0x5a,0xf7, 0xdd,0xbd,0x37,0x80, 0xc3,0xd0,0xbe,0xa7, 0x05,0xc8,0x3c,0x98, 0x1e,0x05,0x3c,0x84, 0x39,0x61,0xc4,0xed, 0xed,0x71,0x1b,0xc4, 0x74,0x45,0x2c,0xa1, 0x56,0x70,0x97,0xfd, 0x44,0x18,0x07,0x7d, 0xca,0x60,0x1f,0x73, 0x3b,0x6d,0x21,0xcb, 0x61,0x87,0x70,0x25, 0x46,0x21,0xf1,0x1f, 0x21,0x91,0x31,0x2d, 0x5d,0xcc,0xb7,0xd1, 0x84,0x3e,0x3d,0xdb, 0x03,0x53,0x2a,0x82, 0xa6,0x9a,0x95,0xbc, 0x1a,0x1e,0x0a,0x5e, 0x07,0x43,0xab,0x43, 0xaf,0x92,0x82,0x06, 0x91,0x04,0x09,0xf4, 0x17,0x0a,0x9a,0x2c, 0x54,0xdb,0xb8,0xf4, 0xd0,0xf0,0x10,0x66, 0x24,0x8d,0xcd,0xda, 0xfe,0x0e,0x45,0x9d, 0x6f,0xc4,0x4e,0xf4, 0x96,0xaf,0x13,0xdc, 0xa9,0xd4,0x8c,0xc4, 0xc8,0x57,0x39,0x3c, 0xc2,0xd3,0x0a,0x76, 0x4a,0x1f,0x75,0x83, 0x44,0xc7,0xd1,0x39, 0xd8,0xb5,0x41,0xba, 0x73,0x87,0xfa,0x96, 0xc7,0x18,0x53,0xfb, 0x9b,0xda,0xa0,0x97, 0x1d,0xee,0x60,0x85, 0x9e,0x14,0xc3,0xce, 0xc4,0x05,0x29,0x3b, 0x95,0x30,0xa3,0xd1, 0x9f,0x82,0x6a,0x04, 0xf5,0xa7,0x75,0x57, 0x82,0x04,0xfe,0x71, 0x51,0x71,0xb1,0x49, 0x50,0xf8,0xe0,0x96, 0xf1,0xfa,0xa8,0x88, 0x3f,0xa0,0x86,0x20, 0xd4,0x60,0x79,0x59, 0x17,0x2d,0xd1,0x09, 0xf4,0xec,0x05,0x57, 0xcf,0x62,0x7e,0x0e, 0x7e,0x60,0x78,0xe6, 0x08,0x60,0x29,0xd8, 0xd5,0x08,0x1a,0x24, 0xc4,0x6c,0x24,0xe7, 0x92,0x08,0x3d,0x8a, 0x98,0x7a,0xcf,0x99, 0x0a,0x65,0x0e,0xdc, 0x8c,0x8a,0xbe,0x92, 0x82,0x91,0xcc,0x62, 0x30,0xb6,0xf4,0x3f, 0xc6,0x8a,0x7f,0x12, 0x4a,0x8a,0x49,0xfa, 0x3f,0x5c,0xd4,0x5a, 0xa6,0x82,0xa3,0xe6, 0xaa,0x34,0x76,0xb2, 0xab,0x0a,0x30,0xef, 0x6c,0x77,0x58,0x3f, 0x05,0x6b,0xcc,0x5c, 0xae,0xdc,0xd7,0xb9, 0x51,0x7e,0x8d,0x32, 0x5b,0x24,0x25,0xbe, 0x2b,0x24,0x01,0xcf, 0x80,0xda,0x16,0xd8, 0x90,0x72,0x2c,0xad, 0x34,0x8d,0x0c,0x74, 0x02,0xcb,0xfd,0xcf, 0x6e,0xef,0x97,0xb5, 0x4c,0xf2,0x68,0xca, 0xde,0x43,0x9e,0x8a, 0xc5,0x5f,0x31,0x7f, 0x14,0x71,0x38,0xec, 0xbd,0x98,0xe5,0x71, 0xc4,0xb5,0xdb,0xef, 0x59,0xd2,0xca,0xc0, 0xc1,0x86,0x75,0x01, 0xd4,0x15,0x0d,0x6f, 0xa4,0xf7,0x7b,0x37, 0x47,0xda,0x18,0x93, 0x63,0xda,0xbe,0x9e, 0x07,0xfb,0xb2,0x83, 0xd5,0xc4,0x34,0x55, 0xee,0x73,0xa1,0x42, 0x96,0xf9,0x66,0x41, 0xa4,0xcc,0xd2,0x93, 0x6e,0xe1,0x0a,0xbb, 0xd2,0xdd,0x18,0x23, 0xe6,0x6b,0x98,0x0b, 0x8a,0x83,0x59,0x2c, 0xc3,0xa6,0x59,0x5b, 0x01,0x22,0x59,0xf7, 0xdc,0xb0,0x87,0x7e, 0xdb,0x7d,0xf4,0x71, 0x41,0xab,0xbd,0xee, 0x79,0xbe,0x3c,0x01, 0x76,0x0b,0x2d,0x0a, 0x42,0xc9,0x77,0x8c, 0xbb,0x54,0x95,0x60, 0x43,0x2e,0xe0,0x17, 0x52,0xbd,0x90,0xc9, 0xc2,0x2c,0xdd,0x90, 0x24,0x22,0x76,0x40, 0x5c,0xb9,0x41,0xc9, 0xa1,0xd5,0xbd,0xe3, 0x44,0xe0,0xa4,0xab, 0xcc,0xb8,0xe2,0x32, 0x02,0x15,0x04,0x1f, 0x8c,0xec,0x5d,0x14, 0xac,0x18,0xaa,0xef, 0x6e,0x33,0x19,0x6e, 0xde,0xfe,0x19,0xdb, 0xeb,0x61,0xca,0x18, 0xad,0xd8,0x3d,0xbf, 0x09,0x11,0xc7,0xa5, 0x86,0x0b,0x0f,0xe5, 0x3e,0xde,0xe8,0xd9, 0x0a,0x69,0x9e,0x4c, 0x20,0xff,0xf9,0xc5, 0xfa,0xf8,0xf3,0x7f, 0xa5,0x01,0x4b,0x5e, 0x0f,0xf0,0x3b,0x68, 0xf0,0x46,0x8c,0x2a, 0x7a,0xc1,0x8f,0xa0, 0xfe,0x6a,0x5b,0x44, 0x70,0x5c,0xcc,0x92, 0x2c,0x6f,0x0f,0xbd, 0x25,0x3e,0xb7,0x8e, 0x73,0x58,0xda,0xc9, 0xa5,0xaa,0x9e,0xf3, 0x9b,0xfd,0x37,0x3e, 0xe2,0x88,0xa4,0x7b, 0xc8,0x5c,0xa8,0x93, 0x0e,0xe7,0x9a,0x9c, 0x2e,0x95,0x18,0x9f, 0xc8,0x45,0x0c,0x88, 0x9e,0x53,0x4f,0x3a, 0x76,0xc1,0x35,0xfa, 0x17,0xd8,0xac,0xa0, 0x0c,0x2d,0x47,0x2e, 0x4f,0x69,0x9b,0xf7, 0xd0,0xb6,0x96,0x0c, 0x19,0xb3,0x08,0x01, 0x65,0x7a,0x1f,0xc7, 0x31,0x86,0xdb,0xc8, 0xc1,0x99,0x8f,0xf8, 0x08,0x4a,0x9d,0x23, 0x22,0xa8,0xcf,0x27, 0x01,0x01,0x88,0x93, 0x9c,0x86,0x45,0xbd, 0xe0,0x51,0xca,0x52, 0x84,0xba,0xfe,0x03, 0xf7,0xda,0xc5,0xce, 0x3e,0x77,0x75,0x86, 0xaf,0x84,0xc8,0x05, 0x44,0x01,0x0f,0x02, 0xf3,0x58,0xb0,0x06, 0x5a,0xd7,0x12,0x30, 0x8d,0xdf,0x1f,0x1f, 0x0a,0xe6,0xd2,0xea, 0xf6,0x3a,0x7a,0x99, 0x63,0xe8,0xd2,0xc1, 0x4a,0x45,0x8b,0x40, 0x4d,0x0a,0xa9,0x76, 0x92,0xb3,0xda,0x87, 0x36,0x33,0xf0,0x78, 0xc3,0x2f,0x5f,0x02, 0x1a,0x6a,0x2c,0x32, 0xcd,0x76,0xbf,0xbd, 0x5a,0x26,0x20,0x28, 0x8c,0x8c,0xbc,0x52, 0x3d,0x0a,0xc9,0xcb, 0xab,0xa4,0x21,0xb0, 0x54,0x40,0x81,0x44, 0xc7,0xd6,0x1c,0x11, 0x44,0xc6,0x02,0x92, 0x14,0x5a,0xbf,0x1a, 0x09,0x8a,0x18,0xad, 0xcd,0x64,0x3d,0x53, 0x4a,0xb6,0xa5,0x1b, 0x57,0x0e,0xef,0xe0, 0x8c,0x44,0x5f,0x7d, 0xbd,0x6c,0xfd,0x60, 0xae,0x02,0x24,0xb6, 0x99,0xdd,0x8c,0xaf, 0x59,0x39,0x75,0x3c, 0xd1,0x54,0x7b,0x86, 0xcc,0x99,0xd9,0x28, 0x0c,0xb0,0x94,0x62, 0xf9,0x51,0xd1,0x19, 0x96,0x2d,0x66,0xf5, 0x55,0xcf,0x9e,0x59, 0xe2,0x6b,0x2c,0x08, 0xc0,0x54,0x48,0x24, 0x45,0xc3,0x8c,0x73, 0xea,0x27,0x6e,0x66, 0x7d,0x1d,0x0e,0x6e, 0x13,0xe8,0x56,0x65, 0x3a,0xb0,0x81,0x5c, 0xf0,0xe8,0xd8,0x00, 0x6b,0xcd,0x8f,0xad, 0xdd,0x53,0xf3,0xa4, 0x6c,0x43,0xd6,0x31, 0xaf,0xd2,0x76,0x1e, 0x91,0x12,0xdb,0x3c, 0x8c,0xc2,0x81,0xf0, 0x49,0xdb,0xe2,0x6b, 0x76,0x62,0x0a,0x04, 0xe4,0xaa,0x8a,0x7c, 0x08,0x0b,0x5d,0xd0, 0xee,0x1d,0xfb,0xc4, 0x02,0x75,0x42,0xd6, 0xba,0xa7,0x22,0xa8, 0x47,0x29,0xb7,0x85, 0x6d,0x93,0x3a,0xdb, 0x00,0x53,0x0b,0xa2, 0xeb,0xf8,0xfe,0x01, 0x6f,0x8a,0x31,0xd6, 0x17,0x05,0x6f,0x67, 0x88,0x95,0x32,0xfe, 0x4f,0xa6,0x4b,0xf8, 0x03,0xe4,0xcd,0x9a, 0x18,0xe8,0x4e,0x2d, 0xf7,0x97,0x9a,0x0c, 0x7d,0x9f,0x7e,0x44, 0x69,0x51,0xe0,0x32, 0x6b,0x62,0x86,0x8f, 0xa6,0x8e,0x0b,0x21, 0x96,0xe5,0xaf,0x77, 0xc0,0x83,0xdf,0xa5, 0x0e,0xd0,0xa1,0x04, 0xaf,0xc1,0x10,0xcb, 0x5a,0x40,0xe4,0xe3, 0x38,0x7e,0x07,0xe8, 0x4d,0xfa,0xed,0xc5, 0xf0,0x37,0xdf,0xbb, 0x8a,0xcf,0x3d,0xdc, 0x61,0xd2,0xc6,0x2b, 0xff,0x07,0xc9,0x2f, 0x0c,0x2d,0x5c,0x07, 0xa8,0x35,0x6a,0xfc, 0xae,0x09,0x03,0x45, 0x74,0x51,0x4d,0xc4, 0xb8,0x23,0x87,0x4a, 0x99,0x27,0x20,0x87, 0x62,0x44,0x0a,0x4a, 0xce,0x78,0x47,0x22, }, .mlen = 1024, .m = { 0x8e,0xb0,0x4c,0xde, 0x9c,0x4a,0x04,0x5a, 0xf6,0xa9,0x7f,0x45, 0x25,0xa5,0x7b,0x3a, 0xbc,0x4d,0x73,0x39, 0x81,0xb5,0xbd,0x3d, 0x21,0x6f,0xd7,0x37, 0x50,0x3c,0x7b,0x28, 0xd1,0x03,0x3a,0x17, 0xed,0x7b,0x7c,0x2a, 0x16,0xbc,0xdf,0x19, 0x89,0x52,0x71,0x31, 0xb6,0xc0,0xfd,0xb5, 0xd3,0xba,0x96,0x99, 0xb6,0x34,0x0b,0xd0, 0x99,0x93,0xfc,0x1a, 0x01,0x3c,0x85,0xc6, 0x9b,0x78,0x5c,0x8b, 0xfe,0xae,0xd2,0xbf, 0xb2,0x6f,0xf9,0xed, 0xc8,0x25,0x17,0xfe, 0x10,0x3b,0x7d,0xda, 0xf4,0x8d,0x35,0x4b, 0x7c,0x7b,0x82,0xe7, 0xc2,0xb3,0xee,0x60, 0x4a,0x03,0x86,0xc9, 0x4e,0xb5,0xc4,0xbe, 0xd2,0xbd,0x66,0xf1, 0x13,0xf1,0x09,0xab, 0x5d,0xca,0x63,0x1f, 0xfc,0xfb,0x57,0x2a, 0xfc,0xca,0x66,0xd8, 0x77,0x84,0x38,0x23, 0x1d,0xac,0xd3,0xb3, 0x7a,0xad,0x4c,0x70, 0xfa,0x9c,0xc9,0x61, 0xa6,0x1b,0xba,0x33, 0x4b,0x4e,0x33,0xec, 0xa0,0xa1,0x64,0x39, 0x40,0x05,0x1c,0xc2, 0x3f,0x49,0x9d,0xae, 0xf2,0xc5,0xf2,0xc5, 0xfe,0xe8,0xf4,0xc2, 0xf9,0x96,0x2d,0x28, 0x92,0x30,0x44,0xbc, 0xd2,0x7f,0xe1,0x6e, 0x62,0x02,0x8f,0x3d, 0x1c,0x80,0xda,0x0e, 0x6a,0x90,0x7e,0x75, 0xff,0xec,0x3e,0xc4, 0xcd,0x16,0x34,0x3b, 0x05,0x6d,0x4d,0x20, 0x1c,0x7b,0xf5,0x57, 0x4f,0xfa,0x3d,0xac, 0xd0,0x13,0x55,0xe8, 0xb3,0xe1,0x1b,0x78, 0x30,0xe6,0x9f,0x84, 0xd4,0x69,0xd1,0x08, 0x12,0x77,0xa7,0x4a, 0xbd,0xc0,0xf2,0xd2, 0x78,0xdd,0xa3,0x81, 0x12,0xcb,0x6c,0x14, 0x90,0x61,0xe2,0x84, 0xc6,0x2b,0x16,0xcc, 0x40,0x99,0x50,0x88, 0x01,0x09,0x64,0x4f, 0x0a,0x80,0xbe,0x61, 0xae,0x46,0xc9,0x0a, 0x5d,0xe0,0xfb,0x72, 0x7a,0x1a,0xdd,0x61, 0x63,0x20,0x05,0xa0, 0x4a,0xf0,0x60,0x69, 0x7f,0x92,0xbc,0xbf, 0x4e,0x39,0x4d,0xdd, 0x74,0xd1,0xb7,0xc0, 0x5a,0x34,0xb7,0xae, 0x76,0x65,0x2e,0xbc, 0x36,0xb9,0x04,0x95, 0x42,0xe9,0x6f,0xca, 0x78,0xb3,0x72,0x07, 0xa3,0xba,0x02,0x94, 0x67,0x4c,0xb1,0xd7, 0xe9,0x30,0x0d,0xf0, 0x3b,0xb8,0x10,0x6d, 0xea,0x2b,0x21,0xbf, 0x74,0x59,0x82,0x97, 0x85,0xaa,0xf1,0xd7, 0x54,0x39,0xeb,0x05, 0xbd,0xf3,0x40,0xa0, 0x97,0xe6,0x74,0xfe, 0xb4,0x82,0x5b,0xb1, 0x36,0xcb,0xe8,0x0d, 0xce,0x14,0xd9,0xdf, 0xf1,0x94,0x22,0xcd, 0xd6,0x00,0xba,0x04, 0x4c,0x05,0x0c,0xc0, 0xd1,0x5a,0xeb,0x52, 0xd5,0xa8,0x8e,0xc8, 0x97,0xa1,0xaa,0xc1, 0xea,0xc1,0xbe,0x7c, 0x36,0xb3,0x36,0xa0, 0xc6,0x76,0x66,0xc5, 0xe2,0xaf,0xd6,0x5c, 0xe2,0xdb,0x2c,0xb3, 0x6c,0xb9,0x99,0x7f, 0xff,0x9f,0x03,0x24, 0xe1,0x51,0x44,0x66, 0xd8,0x0c,0x5d,0x7f, 0x5c,0x85,0x22,0x2a, 0xcf,0x6d,0x79,0x28, 0xab,0x98,0x01,0x72, 0xfe,0x80,0x87,0x5f, 0x46,0xba,0xef,0x81, 0x24,0xee,0xbf,0xb0, 0x24,0x74,0xa3,0x65, 0x97,0x12,0xc4,0xaf, 0x8b,0xa0,0x39,0xda, 0x8a,0x7e,0x74,0x6e, 0x1b,0x42,0xb4,0x44, 0x37,0xfc,0x59,0xfd, 0x86,0xed,0xfb,0x8c, 0x66,0x33,0xda,0x63, 0x75,0xeb,0xe1,0xa4, 0x85,0x4f,0x50,0x8f, 0x83,0x66,0x0d,0xd3, 0x37,0xfa,0xe6,0x9c, 0x4f,0x30,0x87,0x35, 0x18,0xe3,0x0b,0xb7, 0x6e,0x64,0x54,0xcd, 0x70,0xb3,0xde,0x54, 0xb7,0x1d,0xe6,0x4c, 0x4d,0x55,0x12,0x12, 0xaf,0x5f,0x7f,0x5e, 0xee,0x9d,0xe8,0x8e, 0x32,0x9d,0x4e,0x75, 0xeb,0xc6,0xdd,0xaa, 0x48,0x82,0xa4,0x3f, 0x3c,0xd7,0xd3,0xa8, 0x63,0x9e,0x64,0xfe, 0xe3,0x97,0x00,0x62, 0xe5,0x40,0x5d,0xc3, 0xad,0x72,0xe1,0x28, 0x18,0x50,0xb7,0x75, 0xef,0xcd,0x23,0xbf, 0x3f,0xc0,0x51,0x36, 0xf8,0x41,0xc3,0x08, 0xcb,0xf1,0x8d,0x38, 0x34,0xbd,0x48,0x45, 0x75,0xed,0xbc,0x65, 0x7b,0xb5,0x0c,0x9b, 0xd7,0x67,0x7d,0x27, 0xb4,0xc4,0x80,0xd7, 0xa9,0xb9,0xc7,0x4a, 0x97,0xaa,0xda,0xc8, 0x3c,0x74,0xcf,0x36, 0x8f,0xe4,0x41,0xe3, 0xd4,0xd3,0x26,0xa7, 0xf3,0x23,0x9d,0x8f, 0x6c,0x20,0x05,0x32, 0x3e,0xe0,0xc3,0xc8, 0x56,0x3f,0xa7,0x09, 0xb7,0xfb,0xc7,0xf7, 0xbe,0x2a,0xdd,0x0f, 0x06,0x7b,0x0d,0xdd, 0xb0,0xb4,0x86,0x17, 0xfd,0xb9,0x04,0xe5, 0xc0,0x64,0x5d,0xad, 0x2a,0x36,0x38,0xdb, 0x24,0xaf,0x5b,0xff, 0xca,0xf9,0x41,0xe8, 0xf9,0x2f,0x1e,0x5e, 0xf9,0xf5,0xd5,0xf2, 0xb2,0x88,0xca,0xc9, 0xa1,0x31,0xe2,0xe8, 0x10,0x95,0x65,0xbf, 0xf1,0x11,0x61,0x7a, 0x30,0x1a,0x54,0x90, 0xea,0xd2,0x30,0xf6, 0xa5,0xad,0x60,0xf9, 0x4d,0x84,0x21,0x1b, 0xe4,0x42,0x22,0xc8, 0x12,0x4b,0xb0,0x58, 0x3e,0x9c,0x2d,0x32, 0x95,0x0a,0x8e,0xb0, 0x0a,0x7e,0x77,0x2f, 0xe8,0x97,0x31,0x6a, 0xf5,0x59,0xb4,0x26, 0xe6,0x37,0x12,0xc9, 0xcb,0xa0,0x58,0x33, 0x6f,0xd5,0x55,0x55, 0x3c,0xa1,0x33,0xb1, 0x0b,0x7e,0x2e,0xb4, 0x43,0x2a,0x84,0x39, 0xf0,0x9c,0xf4,0x69, 0x4f,0x1e,0x79,0xa6, 0x15,0x1b,0x87,0xbb, 0xdb,0x9b,0xe0,0xf1, 0x0b,0xba,0xe3,0x6e, 0xcc,0x2f,0x49,0x19, 0x22,0x29,0xfc,0x71, 0xbb,0x77,0x38,0x18, 0x61,0xaf,0x85,0x76, 0xeb,0xd1,0x09,0xcc, 0x86,0x04,0x20,0x9a, 0x66,0x53,0x2f,0x44, 0x8b,0xc6,0xa3,0xd2, 0x5f,0xc7,0x79,0x82, 0x66,0xa8,0x6e,0x75, 0x7d,0x94,0xd1,0x86, 0x75,0x0f,0xa5,0x4f, 0x3c,0x7a,0x33,0xce, 0xd1,0x6e,0x9d,0x7b, 0x1f,0x91,0x37,0xb8, 0x37,0x80,0xfb,0xe0, 0x52,0x26,0xd0,0x9a, 0xd4,0x48,0x02,0x41, 0x05,0xe3,0x5a,0x94, 0xf1,0x65,0x61,0x19, 0xb8,0x88,0x4e,0x2b, 0xea,0xba,0x8b,0x58, 0x8b,0x42,0x01,0x00, 0xa8,0xfe,0x00,0x5c, 0xfe,0x1c,0xee,0x31, 0x15,0x69,0xfa,0xb3, 0x9b,0x5f,0x22,0x8e, 0x0d,0x2c,0xe3,0xa5, 0x21,0xb9,0x99,0x8a, 0x8e,0x94,0x5a,0xef, 0x13,0x3e,0x99,0x96, 0x79,0x6e,0xd5,0x42, 0x36,0x03,0xa9,0xe2, 0xca,0x65,0x4e,0x8a, 0x8a,0x30,0xd2,0x7d, 0x74,0xe7,0xf0,0xaa, 0x23,0x26,0xdd,0xcb, 0x82,0x39,0xfc,0x9d, 0x51,0x76,0x21,0x80, 0xa2,0xbe,0x93,0x03, 0x47,0xb0,0xc1,0xb6, 0xdc,0x63,0xfd,0x9f, 0xca,0x9d,0xa5,0xca, 0x27,0x85,0xe2,0xd8, 0x15,0x5b,0x7e,0x14, 0x7a,0xc4,0x89,0xcc, 0x74,0x14,0x4b,0x46, 0xd2,0xce,0xac,0x39, 0x6b,0x6a,0x5a,0xa4, 0x0e,0xe3,0x7b,0x15, 0x94,0x4b,0x0f,0x74, 0xcb,0x0c,0x7f,0xa9, 0xbe,0x09,0x39,0xa3, 0xdd,0x56,0x5c,0xc7, 0x99,0x56,0x65,0x39, 0xf4,0x0b,0x7d,0x87, 0xec,0xaa,0xe3,0x4d, 0x22,0x65,0x39,0x4e, }, .h = { 0x64,0x3a,0xbc,0xc3, 0x3f,0x74,0x40,0x51, 0x6e,0x56,0x01,0x1a, 0x51,0xec,0x36,0xde, }, }, }; const uint8_t *pk; const uint8_t *nhk; static uint32_t nhk32[268]; uint8_t h[16]; unsigned i, j; int result = 0; for (i = 0; i < __arraycount(C); i++) { pk = C[i].k; nhk = C[i].k + 16; for (j = 0; j < 268; j++) nhk32[j] = le32dec(nhk + 4*j); nhpoly1305(h, C[i].m, C[i].mlen, pk, nhk32); if (memcmp(h, C[i].h, 16)) { char prefix[16]; snprintf(prefix, sizeof prefix, "nhpoly1305 %u", i); hexdump(printf, prefix, h, 32); result = -1; } } return result; } void adiantum_init(struct adiantum *A, const uint8_t key[static 32]) { uint8_t nonce[24] = {1}; unsigned i; memcpy(A->ks, key, 32); /* Relies on ordering of struct members. */ memset(A->kk, 0, 32 + 16 + 16 + 1072); xchacha_stream_xor(A->kk, A->kk, 32 + 16 + 16 + 1072, 0, nonce, A->ks, 12); /* Put the NH key words into host byte order. */ for (i = 0; i < __arraycount(A->kn); i++) A->kn[i] = le32toh(A->kn[i]); /* Expand the AES key. */ aes_setenckey256(&A->kk_enc, A->kk); aes_setdeckey256(&A->kk_dec, A->kk); } static void adiantum_hash(uint8_t h[static 16], const void *l, size_t llen, const void *t, size_t tlen, const uint8_t kt[static 16], const uint8_t kl[static 16], const uint32_t kn[static 268]) { struct poly1305 P; uint8_t llenbuf[16]; uint8_t ht[16]; uint8_t hl[16]; KASSERT(llen % 16 == 0); memset(llenbuf, 0, sizeof llenbuf); le64enc(llenbuf, 8*llen); /* Compute H_T := Poly1305_{K_T}(le128(|l|) || tweak). */ poly1305_init(&P, kt); poly1305_update_blocks(&P, llenbuf, 16); poly1305_update_blocks(&P, t, tlen); poly1305_final(ht, &P); /* Compute H_L := Poly1305_{K_L}(NH(pad_128(l))). */ nhpoly1305(hl, l, llen, kl, kn); /* Compute H := H_T + H_L (mod 2^128). */ add128(h, ht, hl); } void adiantum_enc(void *c, const void *p, size_t len, const void *t, size_t tlen, const struct adiantum *A) { size_t Rlen = 16; size_t Llen = len - Rlen; uint8_t *c8 = c; uint8_t *cL = c8; uint8_t *cR = c8 + Llen; const uint8_t *p8 = p; const uint8_t *pL = p8; const uint8_t *pR = p8 + Llen; uint8_t h[16]; uint8_t buf[16] __aligned(16); uint8_t nonce[24]; KASSERT(len % 16 == 0); adiantum_hash(h, pL, Llen, t, tlen, A->kt, A->kl, A->kn); add128(buf, pR, h); /* buf := P_M */ aes_enc(&A->kk_enc, buf, buf, AES_256_NROUNDS); /* buf := C_M */ memcpy(nonce, buf, 16); le64enc(nonce + 16, 1); xchacha_stream_xor(cL, pL, Llen, 0, nonce, A->ks, 12); adiantum_hash(h, cL, Llen, t, tlen, A->kt, A->kl, A->kn); sub128(cR, buf, h); explicit_memset(h, 0, sizeof h); explicit_memset(buf, 0, sizeof buf); } void adiantum_dec(void *p, const void *c, size_t len, const void *t, size_t tlen, const struct adiantum *A) { size_t Rlen = 16; size_t Llen = len - Rlen; const uint8_t *c8 = c; const uint8_t *cL = c8; const uint8_t *cR = c8 + Llen; uint8_t *p8 = p; uint8_t *pL = p8; uint8_t *pR = p8 + Llen; uint8_t h[16]; uint8_t buf[16] __aligned(16); uint8_t nonce[24]; KASSERT(len % 16 == 0); adiantum_hash(h, cL, Llen, t, tlen, A->kt, A->kl, A->kn); add128(buf, cR, h); /* buf := C_M */ memcpy(nonce, buf, 16); le64enc(nonce + 16, 1); xchacha_stream_xor(pL, cL, Llen, 0, nonce, A->ks, 12); aes_dec(&A->kk_dec, buf, buf, AES_256_NROUNDS); /* buf := P_M */ adiantum_hash(h, pL, Llen, t, tlen, A->kt, A->kl, A->kn); sub128(pR, buf, h); explicit_memset(h, 0, sizeof h); explicit_memset(buf, 0, sizeof buf); } #ifdef _KERNEL MODULE(MODULE_CLASS_MISC, adiantum, "aes,chacha"); static int adiantum_modcmd(modcmd_t cmd, void *opaque) { switch (cmd) { case MODULE_CMD_INIT: { int result = 0; result |= addsub128_selftest(); result |= poly1305_selftest(); result |= nh_selftest(); result |= nhpoly1305_selftest(); result |= adiantum_selftest(); if (result) panic("adiantum self-test failed"); aprint_debug("adiantum: self-test passed\n"); return 0; } case MODULE_CMD_FINI: return 0; default: return ENOTTY; } } #else /* !defined(_KERNEL) */ #include #include #include static int read_block(int fd, void *buf, size_t len) { char *p = buf; size_t n = len; ssize_t nread; for (;;) { if ((nread = read(fd, p, n)) == -1) err(1, "read"); if (nread == 0) { if (n < len) errx(1, "partial block"); return -1; /* eof */ } if ((size_t)nread >= n) break; p += (size_t)nread; n -= (size_t)nread; } return 0; } static void write_block(int fd, const void *buf, size_t len) { const char *p = buf; size_t n = len; ssize_t nwrit; for (;;) { if ((nwrit = write(fd, p, n)) == -1) err(1, "write"); if ((size_t)nwrit >= n) break; p += (size_t)nwrit; n -= (size_t)nwrit; } } #define SECSIZE 512 static void process(void) { static const uint8_t k[32] = {0}; static uint8_t buf[65536]; static struct adiantum C; uint8_t blkno[16] = {0}; unsigned i; adiantum_init(&C, k); while (read_block(STDIN_FILENO, buf, sizeof buf) == 0) { for (i = 0; i < sizeof buf; i += SECSIZE) { adiantum_enc(buf + i, buf + i, SECSIZE, blkno, 16, &C); le64enc(blkno, 1 + le32dec(blkno)); } write_block(STDOUT_FILENO, buf, sizeof buf); if (le64dec(blkno) == 1024*1024*1024/SECSIZE) return; } } int main(void) { int result = 0; result |= addsub128_selftest(); result |= poly1305_selftest(); result |= nh_selftest(); result |= nhpoly1305_selftest(); result |= adiantum_selftest(); if (result) return result; process(); return 0; } #endif /* _KERNEL */