1 From 41138d5e49eedc77ff1c4985891b78baba02a874 Mon Sep 17 00:00:00 2001
2 From: "Jason A. Donenfeld" <Jason@zx2c4.com>
3 Date: Fri, 8 Nov 2019 13:22:28 +0100
4 Subject: [PATCH 021/124] crypto: blake2s - generic C library implementation
7 commit 66d7fb94e4ffe5acc589e0b2b4710aecc1f07a28 upstream.
9 The C implementation was originally based on Samuel Neves' public
10 domain reference implementation but has since been heavily modified
11 for the kernel. We're able to do compile-time optimizations by moving
12 some scaffolding around the final function into the header file.
14 Information: https://blake2.net/
16 Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
17 Signed-off-by: Samuel Neves <sneves@dei.uc.pt>
18 Co-developed-by: Samuel Neves <sneves@dei.uc.pt>
19 [ardb: - move from lib/zinc to lib/crypto
20 - remove simd handling
21 - rewrote selftest for better coverage
22 - use fixed digest length for blake2s_hmac() and rename to
24 Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
25 Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
26 Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
28 include/crypto/blake2s.h | 106 +++++
29 include/crypto/internal/blake2s.h | 19 +
30 lib/crypto/Kconfig | 25 ++
31 lib/crypto/Makefile | 10 +
32 lib/crypto/blake2s-generic.c | 111 ++++++
33 lib/crypto/blake2s-selftest.c | 622 ++++++++++++++++++++++++++++++
34 lib/crypto/blake2s.c | 126 ++++++
35 7 files changed, 1019 insertions(+)
36 create mode 100644 include/crypto/blake2s.h
37 create mode 100644 include/crypto/internal/blake2s.h
38 create mode 100644 lib/crypto/blake2s-generic.c
39 create mode 100644 lib/crypto/blake2s-selftest.c
40 create mode 100644 lib/crypto/blake2s.c
43 +++ b/include/crypto/blake2s.h
45 +/* SPDX-License-Identifier: GPL-2.0 OR MIT */
47 + * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
53 +#include <linux/types.h>
54 +#include <linux/kernel.h>
55 +#include <linux/string.h>
59 +enum blake2s_lengths {
60 + BLAKE2S_BLOCK_SIZE = 64,
61 + BLAKE2S_HASH_SIZE = 32,
62 + BLAKE2S_KEY_SIZE = 32,
64 + BLAKE2S_128_HASH_SIZE = 16,
65 + BLAKE2S_160_HASH_SIZE = 20,
66 + BLAKE2S_224_HASH_SIZE = 28,
67 + BLAKE2S_256_HASH_SIZE = 32,
70 +struct blake2s_state {
74 + u8 buf[BLAKE2S_BLOCK_SIZE];
75 + unsigned int buflen;
76 + unsigned int outlen;
80 + BLAKE2S_IV0 = 0x6A09E667UL,
81 + BLAKE2S_IV1 = 0xBB67AE85UL,
82 + BLAKE2S_IV2 = 0x3C6EF372UL,
83 + BLAKE2S_IV3 = 0xA54FF53AUL,
84 + BLAKE2S_IV4 = 0x510E527FUL,
85 + BLAKE2S_IV5 = 0x9B05688CUL,
86 + BLAKE2S_IV6 = 0x1F83D9ABUL,
87 + BLAKE2S_IV7 = 0x5BE0CD19UL,
90 +void blake2s_update(struct blake2s_state *state, const u8 *in, size_t inlen);
91 +void blake2s_final(struct blake2s_state *state, u8 *out);
93 +static inline void blake2s_init_param(struct blake2s_state *state,
96 + *state = (struct blake2s_state){{
97 + BLAKE2S_IV0 ^ param,
108 +static inline void blake2s_init(struct blake2s_state *state,
109 + const size_t outlen)
111 + blake2s_init_param(state, 0x01010000 | outlen);
112 + state->outlen = outlen;
115 +static inline void blake2s_init_key(struct blake2s_state *state,
116 + const size_t outlen, const void *key,
117 + const size_t keylen)
119 + WARN_ON(IS_ENABLED(DEBUG) && (!outlen || outlen > BLAKE2S_HASH_SIZE ||
120 + !key || !keylen || keylen > BLAKE2S_KEY_SIZE));
122 + blake2s_init_param(state, 0x01010000 | keylen << 8 | outlen);
123 + memcpy(state->buf, key, keylen);
124 + state->buflen = BLAKE2S_BLOCK_SIZE;
125 + state->outlen = outlen;
128 +static inline void blake2s(u8 *out, const u8 *in, const u8 *key,
129 + const size_t outlen, const size_t inlen,
130 + const size_t keylen)
132 + struct blake2s_state state;
134 + WARN_ON(IS_ENABLED(DEBUG) && ((!in && inlen > 0) || !out || !outlen ||
135 + outlen > BLAKE2S_HASH_SIZE || keylen > BLAKE2S_KEY_SIZE ||
136 + (!key && keylen)));
139 + blake2s_init_key(&state, outlen, key, keylen);
141 + blake2s_init(&state, outlen);
143 + blake2s_update(&state, in, inlen);
144 + blake2s_final(&state, out);
147 +void blake2s256_hmac(u8 *out, const u8 *in, const u8 *key, const size_t inlen,
148 + const size_t keylen);
150 +#endif /* BLAKE2S_H */
152 +++ b/include/crypto/internal/blake2s.h
154 +/* SPDX-License-Identifier: GPL-2.0 OR MIT */
156 +#ifndef BLAKE2S_INTERNAL_H
157 +#define BLAKE2S_INTERNAL_H
159 +#include <crypto/blake2s.h>
161 +void blake2s_compress_generic(struct blake2s_state *state,const u8 *block,
162 + size_t nblocks, const u32 inc);
164 +void blake2s_compress_arch(struct blake2s_state *state,const u8 *block,
165 + size_t nblocks, const u32 inc);
167 +static inline void blake2s_set_lastblock(struct blake2s_state *state)
172 +#endif /* BLAKE2S_INTERNAL_H */
173 --- a/lib/crypto/Kconfig
174 +++ b/lib/crypto/Kconfig
175 @@ -8,6 +8,31 @@ config CRYPTO_LIB_AES
176 config CRYPTO_LIB_ARC4
179 +config CRYPTO_ARCH_HAVE_LIB_BLAKE2S
182 + Declares whether the architecture provides an arch-specific
183 + accelerated implementation of the Blake2s library interface,
184 + either builtin or as a module.
186 +config CRYPTO_LIB_BLAKE2S_GENERIC
189 + This symbol can be depended upon by arch implementations of the
190 + Blake2s library interface that require the generic code as a
191 + fallback, e.g., for SIMD implementations. If no arch specific
192 + implementation is enabled, this implementation serves the users
193 + of CRYPTO_LIB_BLAKE2S.
195 +config CRYPTO_LIB_BLAKE2S
196 + tristate "BLAKE2s hash function library"
197 + depends on CRYPTO_ARCH_HAVE_LIB_BLAKE2S || !CRYPTO_ARCH_HAVE_LIB_BLAKE2S
198 + select CRYPTO_LIB_BLAKE2S_GENERIC if CRYPTO_ARCH_HAVE_LIB_BLAKE2S=n
200 + Enable the Blake2s library interface. This interface may be fulfilled
201 + by either the generic implementation or an arch-specific one, if one
202 + is available and enabled.
204 config CRYPTO_ARCH_HAVE_LIB_CHACHA
207 --- a/lib/crypto/Makefile
208 +++ b/lib/crypto/Makefile
209 @@ -10,6 +10,12 @@ libaes-y := aes.o
210 obj-$(CONFIG_CRYPTO_LIB_ARC4) += libarc4.o
213 +obj-$(CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC) += libblake2s-generic.o
214 +libblake2s-generic-y += blake2s-generic.o
216 +obj-$(CONFIG_CRYPTO_LIB_BLAKE2S) += libblake2s.o
217 +libblake2s-y += blake2s.o
219 obj-$(CONFIG_CRYPTO_LIB_DES) += libdes.o
222 @@ -18,3 +24,7 @@ libpoly1305-y := poly1305.o
224 obj-$(CONFIG_CRYPTO_LIB_SHA256) += libsha256.o
225 libsha256-y := sha256.o
227 +ifneq ($(CONFIG_CRYPTO_MANAGER_DISABLE_TESTS),y)
228 +libblake2s-y += blake2s-selftest.o
231 +++ b/lib/crypto/blake2s-generic.c
233 +// SPDX-License-Identifier: GPL-2.0 OR MIT
235 + * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
237 + * This is an implementation of the BLAKE2s hash and PRF functions.
239 + * Information: https://blake2.net/
243 +#include <crypto/internal/blake2s.h>
244 +#include <linux/types.h>
245 +#include <linux/string.h>
246 +#include <linux/kernel.h>
247 +#include <linux/module.h>
248 +#include <linux/init.h>
249 +#include <linux/bug.h>
250 +#include <asm/unaligned.h>
252 +static const u8 blake2s_sigma[10][16] = {
253 + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
254 + { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 },
255 + { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 },
256 + { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 },
257 + { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 },
258 + { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 },
259 + { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 },
260 + { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 },
261 + { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 },
262 + { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0 },
265 +static inline void blake2s_increment_counter(struct blake2s_state *state,
268 + state->t[0] += inc;
269 + state->t[1] += (state->t[0] < inc);
272 +void blake2s_compress_generic(struct blake2s_state *state,const u8 *block,
273 + size_t nblocks, const u32 inc)
279 + WARN_ON(IS_ENABLED(DEBUG) &&
280 + (nblocks > 1 && inc != BLAKE2S_BLOCK_SIZE));
282 + while (nblocks > 0) {
283 + blake2s_increment_counter(state, inc);
284 + memcpy(m, block, BLAKE2S_BLOCK_SIZE);
285 + le32_to_cpu_array(m, ARRAY_SIZE(m));
286 + memcpy(v, state->h, 32);
287 + v[ 8] = BLAKE2S_IV0;
288 + v[ 9] = BLAKE2S_IV1;
289 + v[10] = BLAKE2S_IV2;
290 + v[11] = BLAKE2S_IV3;
291 + v[12] = BLAKE2S_IV4 ^ state->t[0];
292 + v[13] = BLAKE2S_IV5 ^ state->t[1];
293 + v[14] = BLAKE2S_IV6 ^ state->f[0];
294 + v[15] = BLAKE2S_IV7 ^ state->f[1];
296 +#define G(r, i, a, b, c, d) do { \
297 + a += b + m[blake2s_sigma[r][2 * i + 0]]; \
298 + d = ror32(d ^ a, 16); \
300 + b = ror32(b ^ c, 12); \
301 + a += b + m[blake2s_sigma[r][2 * i + 1]]; \
302 + d = ror32(d ^ a, 8); \
304 + b = ror32(b ^ c, 7); \
307 +#define ROUND(r) do { \
308 + G(r, 0, v[0], v[ 4], v[ 8], v[12]); \
309 + G(r, 1, v[1], v[ 5], v[ 9], v[13]); \
310 + G(r, 2, v[2], v[ 6], v[10], v[14]); \
311 + G(r, 3, v[3], v[ 7], v[11], v[15]); \
312 + G(r, 4, v[0], v[ 5], v[10], v[15]); \
313 + G(r, 5, v[1], v[ 6], v[11], v[12]); \
314 + G(r, 6, v[2], v[ 7], v[ 8], v[13]); \
315 + G(r, 7, v[3], v[ 4], v[ 9], v[14]); \
331 + for (i = 0; i < 8; ++i)
332 + state->h[i] ^= v[i] ^ v[i + 8];
334 + block += BLAKE2S_BLOCK_SIZE;
339 +EXPORT_SYMBOL(blake2s_compress_generic);
341 +MODULE_LICENSE("GPL v2");
342 +MODULE_DESCRIPTION("BLAKE2s hash function");
343 +MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>");
345 +++ b/lib/crypto/blake2s-selftest.c
347 +// SPDX-License-Identifier: GPL-2.0 OR MIT
349 + * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
352 +#include <crypto/blake2s.h>
353 +#include <linux/string.h>
356 + * blake2s_testvecs[] generated with the program below (using libb2-dev and
357 + * libssl-dev [OpenSSL])
359 + * #include <blake2.h>
360 + * #include <stdint.h>
361 + * #include <stdio.h>
363 + * #include <openssl/evp.h>
364 + * #include <openssl/hmac.h>
366 + * #define BLAKE2S_TESTVEC_COUNT 256
368 + * static void print_vec(const uint8_t vec[], int len)
373 + * for (i = 0; i < len; i++) {
374 + * if (i && (i % 12) == 0)
376 + * printf("0x%02x, ", vec[i]);
383 + * uint8_t key[BLAKE2S_KEYBYTES];
384 + * uint8_t buf[BLAKE2S_TESTVEC_COUNT];
385 + * uint8_t hash[BLAKE2S_OUTBYTES];
388 + * key[0] = key[1] = 1;
389 + * for (i = 2; i < BLAKE2S_KEYBYTES; ++i)
390 + * key[i] = key[i - 2] + key[i - 1];
392 + * for (i = 0; i < BLAKE2S_TESTVEC_COUNT; ++i)
393 + * buf[i] = (uint8_t)i;
395 + * printf("static const u8 blake2s_testvecs[][BLAKE2S_HASH_SIZE] __initconst = {\n");
397 + * for (i = 0; i < BLAKE2S_TESTVEC_COUNT; ++i) {
398 + * int outlen = 1 + i % BLAKE2S_OUTBYTES;
399 + * int keylen = (13 * i) % (BLAKE2S_KEYBYTES + 1);
401 + * blake2s(hash, buf, key + BLAKE2S_KEYBYTES - keylen, outlen, i,
403 + * print_vec(hash, outlen);
405 + * printf("};\n\n");
407 + * printf("static const u8 blake2s_hmac_testvecs[][BLAKE2S_HASH_SIZE] __initconst = {\n");
409 + * HMAC(EVP_blake2s256(), key, sizeof(key), buf, sizeof(buf), hash, NULL);
410 + * print_vec(hash, BLAKE2S_OUTBYTES);
412 + * HMAC(EVP_blake2s256(), buf, sizeof(buf), key, sizeof(key), hash, NULL);
413 + * print_vec(hash, BLAKE2S_OUTBYTES);
420 +static const u8 blake2s_testvecs[][BLAKE2S_HASH_SIZE] __initconst = {
423 + { 0x74, 0x0e, 0xd4, },
424 + { 0x47, 0x0c, 0x21, 0x15, },
425 + { 0x18, 0xd6, 0x9c, 0xa6, 0xc4, },
426 + { 0x13, 0x5d, 0x16, 0x63, 0x2e, 0xf9, },
427 + { 0x2c, 0xb5, 0x04, 0xb7, 0x99, 0xe2, 0x73, },
428 + { 0x9a, 0x0f, 0xd2, 0x39, 0xd6, 0x68, 0x1b, 0x92, },
429 + { 0xc8, 0xde, 0x7a, 0xea, 0x2f, 0xf4, 0xd2, 0xe3, 0x2b, },
430 + { 0x5b, 0xf9, 0x43, 0x52, 0x0c, 0x12, 0xba, 0xb5, 0x93, 0x9f, },
431 + { 0xc6, 0x2c, 0x4e, 0x80, 0xfc, 0x32, 0x5b, 0x33, 0xb8, 0xb8, 0x0a, },
432 + { 0xa7, 0x5c, 0xfd, 0x3a, 0xcc, 0xbf, 0x90, 0xca, 0xb7, 0x97, 0xde, 0xd8, },
433 + { 0x66, 0xca, 0x3c, 0xc4, 0x19, 0xef, 0x92, 0x66, 0x3f, 0x21, 0x8f, 0xda,
435 + { 0xba, 0xe5, 0xbb, 0x30, 0x25, 0x94, 0x6d, 0xc3, 0x89, 0x09, 0xc4, 0x25,
437 + { 0xa2, 0xef, 0x0e, 0x52, 0x0b, 0x5f, 0xa2, 0x01, 0x6d, 0x0a, 0x25, 0xbc,
438 + 0x57, 0xe2, 0x27, },
439 + { 0x4f, 0xe0, 0xf9, 0x52, 0x12, 0xda, 0x84, 0xb7, 0xab, 0xae, 0xb0, 0xa6,
440 + 0x47, 0x2a, 0xc7, 0xf5, },
441 + { 0x56, 0xe7, 0xa8, 0x1c, 0x4c, 0xca, 0xed, 0x90, 0x31, 0xec, 0x87, 0x43,
442 + 0xe7, 0x72, 0x08, 0xec, 0xbe, },
443 + { 0x7e, 0xdf, 0x80, 0x1c, 0x93, 0x33, 0xfd, 0x53, 0x44, 0xba, 0xfd, 0x96,
444 + 0xe1, 0xbb, 0xb5, 0x65, 0xa5, 0x00, },
445 + { 0xec, 0x6b, 0xed, 0xf7, 0x7b, 0x62, 0x1d, 0x7d, 0xf4, 0x82, 0xf3, 0x1e,
446 + 0x18, 0xff, 0x2b, 0xc4, 0x06, 0x20, 0x2a, },
447 + { 0x74, 0x98, 0xd7, 0x68, 0x63, 0xed, 0x87, 0xe4, 0x5d, 0x8d, 0x9e, 0x1d,
448 + 0xfd, 0x2a, 0xbb, 0x86, 0xac, 0xe9, 0x2a, 0x89, },
449 + { 0x89, 0xc3, 0x88, 0xce, 0x2b, 0x33, 0x1e, 0x10, 0xd1, 0x37, 0x20, 0x86,
450 + 0x28, 0x43, 0x70, 0xd9, 0xfb, 0x96, 0xd9, 0xb5, 0xd3, },
451 + { 0xcb, 0x56, 0x74, 0x41, 0x8d, 0x80, 0x01, 0x9a, 0x6b, 0x38, 0xe1, 0x41,
452 + 0xad, 0x9c, 0x62, 0x74, 0xce, 0x35, 0xd5, 0x6c, 0x89, 0x6e, },
453 + { 0x79, 0xaf, 0x94, 0x59, 0x99, 0x26, 0xe1, 0xc9, 0x34, 0xfe, 0x7c, 0x22,
454 + 0xf7, 0x43, 0xd7, 0x65, 0xd4, 0x48, 0x18, 0xac, 0x3d, 0xfd, 0x93, },
455 + { 0x85, 0x0d, 0xff, 0xb8, 0x3e, 0x87, 0x41, 0xb0, 0x95, 0xd3, 0x3d, 0x00,
456 + 0x47, 0x55, 0x9e, 0xd2, 0x69, 0xea, 0xbf, 0xe9, 0x7a, 0x2d, 0x61, 0x45, },
457 + { 0x03, 0xe0, 0x85, 0xec, 0x54, 0xb5, 0x16, 0x53, 0xa8, 0xc4, 0x71, 0xe9,
458 + 0x6a, 0xe7, 0xcb, 0xc4, 0x15, 0x02, 0xfc, 0x34, 0xa4, 0xa4, 0x28, 0x13,
460 + { 0xe3, 0x34, 0x4b, 0xe1, 0xd0, 0x4b, 0x55, 0x61, 0x8f, 0xc0, 0x24, 0x05,
461 + 0xe6, 0xe0, 0x3d, 0x70, 0x24, 0x4d, 0xda, 0xb8, 0x91, 0x05, 0x29, 0x07,
463 + { 0x61, 0xff, 0x01, 0x72, 0xb1, 0x4d, 0xf6, 0xfe, 0xd1, 0xd1, 0x08, 0x74,
464 + 0xe6, 0x91, 0x44, 0xeb, 0x61, 0xda, 0x40, 0xaf, 0xfc, 0x8c, 0x91, 0x6b,
465 + 0xec, 0x13, 0xed, },
466 + { 0xd4, 0x40, 0xd2, 0xa0, 0x7f, 0xc1, 0x58, 0x0c, 0x85, 0xa0, 0x86, 0xc7,
467 + 0x86, 0xb9, 0x61, 0xc9, 0xea, 0x19, 0x86, 0x1f, 0xab, 0x07, 0xce, 0x37,
468 + 0x72, 0x67, 0x09, 0xfc, },
469 + { 0x9e, 0xf8, 0x18, 0x67, 0x93, 0x10, 0x9b, 0x39, 0x75, 0xe8, 0x8b, 0x38,
470 + 0x82, 0x7d, 0xb8, 0xb7, 0xa5, 0xaf, 0xe6, 0x6a, 0x22, 0x5e, 0x1f, 0x9c,
471 + 0x95, 0x29, 0x19, 0xf2, 0x4b, },
472 + { 0xc8, 0x62, 0x25, 0xf5, 0x98, 0xc9, 0xea, 0xe5, 0x29, 0x3a, 0xd3, 0x22,
473 + 0xeb, 0xeb, 0x07, 0x7c, 0x15, 0x07, 0xee, 0x15, 0x61, 0xbb, 0x05, 0x30,
474 + 0x99, 0x7f, 0x11, 0xf6, 0x0a, 0x1d, },
475 + { 0x68, 0x70, 0xf7, 0x90, 0xa1, 0x8b, 0x1f, 0x0f, 0xbb, 0xce, 0xd2, 0x0e,
476 + 0x33, 0x1f, 0x7f, 0xa9, 0x78, 0xa8, 0xa6, 0x81, 0x66, 0xab, 0x8d, 0xcd,
477 + 0x58, 0x55, 0x3a, 0x0b, 0x7a, 0xdb, 0xb5, },
478 + { 0xdd, 0x35, 0xd2, 0xb4, 0xf6, 0xc7, 0xea, 0xab, 0x64, 0x24, 0x4e, 0xfe,
479 + 0xe5, 0x3d, 0x4e, 0x95, 0x8b, 0x6d, 0x6c, 0xbc, 0xb0, 0xf8, 0x88, 0x61,
480 + 0x09, 0xb7, 0x78, 0xa3, 0x31, 0xfe, 0xd9, 0x2f, },
483 + { 0x64, 0xe9, 0xd1, },
484 + { 0x30, 0xdd, 0x71, 0xef, },
485 + { 0x11, 0xb5, 0x0c, 0x87, 0xc9, },
486 + { 0x06, 0x1c, 0x6d, 0x04, 0x82, 0xd0, },
487 + { 0x5c, 0x42, 0x0b, 0xee, 0xc5, 0x9c, 0xb2, },
488 + { 0xe8, 0x29, 0xd6, 0xb4, 0x5d, 0xf7, 0x2b, 0x93, },
489 + { 0x18, 0xca, 0x27, 0x72, 0x43, 0x39, 0x16, 0xbc, 0x6a, },
490 + { 0x39, 0x8f, 0xfd, 0x64, 0xf5, 0x57, 0x23, 0xb0, 0x45, 0xf8, },
491 + { 0xbb, 0x3a, 0x78, 0x6b, 0x02, 0x1d, 0x0b, 0x16, 0xe3, 0xb2, 0x9a, },
492 + { 0xb8, 0xb4, 0x0b, 0xe5, 0xd4, 0x1d, 0x0d, 0x85, 0x49, 0x91, 0x35, 0xfa, },
493 + { 0x6d, 0x48, 0x2a, 0x0c, 0x42, 0x08, 0xbd, 0xa9, 0x78, 0x6f, 0x18, 0xaf,
495 + { 0x10, 0x45, 0xd4, 0x58, 0x88, 0xec, 0x4e, 0x1e, 0xf6, 0x14, 0x92, 0x64,
497 + { 0x8b, 0x0b, 0x95, 0xee, 0x92, 0xc6, 0x3b, 0x91, 0xf1, 0x1e, 0xeb, 0x51,
498 + 0x98, 0x0a, 0x8d, },
499 + { 0xa3, 0x50, 0x4d, 0xa5, 0x1d, 0x03, 0x68, 0xe9, 0x57, 0x78, 0xd6, 0x04,
500 + 0xf1, 0xc3, 0x94, 0xd8, },
501 + { 0xb8, 0x66, 0x6e, 0xdd, 0x46, 0x15, 0xae, 0x3d, 0x83, 0x7e, 0xcf, 0xe7,
502 + 0x2c, 0xe8, 0x8f, 0xc7, 0x34, },
503 + { 0x2e, 0xc0, 0x1f, 0x29, 0xea, 0xf6, 0xb9, 0xe2, 0xc2, 0x93, 0xeb, 0x41,
504 + 0x0d, 0xf0, 0x0a, 0x13, 0x0e, 0xa2, },
505 + { 0x71, 0xb8, 0x33, 0xa9, 0x1b, 0xac, 0xf1, 0xb5, 0x42, 0x8f, 0x5e, 0x81,
506 + 0x34, 0x43, 0xb7, 0xa4, 0x18, 0x5c, 0x47, },
507 + { 0xda, 0x45, 0xb8, 0x2e, 0x82, 0x1e, 0xc0, 0x59, 0x77, 0x9d, 0xfa, 0xb4,
508 + 0x1c, 0x5e, 0xa0, 0x2b, 0x33, 0x96, 0x5a, 0x58, },
509 + { 0xe3, 0x09, 0x05, 0xa9, 0xeb, 0x48, 0x13, 0xad, 0x71, 0x88, 0x81, 0x9a,
510 + 0x3e, 0x2c, 0xe1, 0x23, 0x99, 0x13, 0x35, 0x9f, 0xb5, },
511 + { 0xb7, 0x86, 0x2d, 0x16, 0xe1, 0x04, 0x00, 0x47, 0x47, 0x61, 0x31, 0xfb,
512 + 0x14, 0xac, 0xd8, 0xe9, 0xe3, 0x49, 0xbd, 0xf7, 0x9c, 0x3f, },
513 + { 0x7f, 0xd9, 0x95, 0xa8, 0xa7, 0xa0, 0xcc, 0xba, 0xef, 0xb1, 0x0a, 0xa9,
514 + 0x21, 0x62, 0x08, 0x0f, 0x1b, 0xff, 0x7b, 0x9d, 0xae, 0xb2, 0x95, },
515 + { 0x85, 0x99, 0xea, 0x33, 0xe0, 0x56, 0xff, 0x13, 0xc6, 0x61, 0x8c, 0xf9,
516 + 0x57, 0x05, 0x03, 0x11, 0xf9, 0xfb, 0x3a, 0xf7, 0xce, 0xbb, 0x52, 0x30, },
517 + { 0xb2, 0x72, 0x9c, 0xf8, 0x77, 0x4e, 0x8f, 0x6b, 0x01, 0x6c, 0xff, 0x4e,
518 + 0x4f, 0x02, 0xd2, 0xbc, 0xeb, 0x51, 0x28, 0x99, 0x50, 0xab, 0xc4, 0x42,
520 + { 0x8b, 0x0a, 0xb5, 0x90, 0x8f, 0xf5, 0x7b, 0xdd, 0xba, 0x47, 0x37, 0xc9,
521 + 0x2a, 0xd5, 0x4b, 0x25, 0x08, 0x8b, 0x02, 0x17, 0xa7, 0x9e, 0x6b, 0x6e,
523 + { 0x90, 0xdd, 0xf7, 0x75, 0xa7, 0xa3, 0x99, 0x5e, 0x5b, 0x7d, 0x75, 0xc3,
524 + 0x39, 0x6b, 0xa0, 0xe2, 0x44, 0x53, 0xb1, 0x9e, 0xc8, 0xf1, 0x77, 0x10,
525 + 0x58, 0x06, 0x9a, },
526 + { 0x99, 0x52, 0xf0, 0x49, 0xa8, 0x8c, 0xec, 0xa6, 0x97, 0x32, 0x13, 0xb5,
527 + 0xf7, 0xa3, 0x8e, 0xfb, 0x4b, 0x59, 0x31, 0x3d, 0x01, 0x59, 0x98, 0x5d,
528 + 0x53, 0x03, 0x1a, 0x39, },
529 + { 0x9f, 0xe0, 0xc2, 0xe5, 0x5d, 0x93, 0xd6, 0x9b, 0x47, 0x8f, 0x9b, 0xe0,
530 + 0x26, 0x35, 0x84, 0x20, 0x1d, 0xc5, 0x53, 0x10, 0x0f, 0x22, 0xb9, 0xb5,
531 + 0xd4, 0x36, 0xb1, 0xac, 0x73, },
532 + { 0x30, 0x32, 0x20, 0x3b, 0x10, 0x28, 0xec, 0x1f, 0x4f, 0x9b, 0x47, 0x59,
533 + 0xeb, 0x7b, 0xee, 0x45, 0xfb, 0x0c, 0x49, 0xd8, 0x3d, 0x69, 0xbd, 0x90,
534 + 0x2c, 0xf0, 0x9e, 0x8d, 0xbf, 0xd5, },
535 + { 0x2a, 0x37, 0x73, 0x7f, 0xf9, 0x96, 0x19, 0xaa, 0x25, 0xd8, 0x13, 0x28,
536 + 0x01, 0x29, 0x89, 0xdf, 0x6e, 0x0c, 0x9b, 0x43, 0x44, 0x51, 0xe9, 0x75,
537 + 0x26, 0x0c, 0xb7, 0x87, 0x66, 0x0b, 0x5f, },
538 + { 0x23, 0xdf, 0x96, 0x68, 0x91, 0x86, 0xd0, 0x93, 0x55, 0x33, 0x24, 0xf6,
539 + 0xba, 0x08, 0x75, 0x5b, 0x59, 0x11, 0x69, 0xb8, 0xb9, 0xe5, 0x2c, 0x77,
540 + 0x02, 0xf6, 0x47, 0xee, 0x81, 0xdd, 0xb9, 0x06, },
543 + { 0xfd, 0xc3, 0xda, },
544 + { 0xe8, 0x82, 0xcd, 0x21, },
545 + { 0xc3, 0x1d, 0x42, 0x4c, 0x74, },
546 + { 0xe9, 0xda, 0xf1, 0xa2, 0xe5, 0x7c, },
547 + { 0x52, 0xb8, 0x6f, 0x81, 0x5c, 0x3a, 0x4c, },
548 + { 0x5b, 0x39, 0x26, 0xfc, 0x92, 0x5e, 0xe0, 0x49, },
549 + { 0x59, 0xe4, 0x7c, 0x93, 0x1c, 0xf9, 0x28, 0x93, 0xde, },
550 + { 0xde, 0xdf, 0xb2, 0x43, 0x61, 0x0b, 0x86, 0x16, 0x4c, 0x2e, },
551 + { 0x14, 0x8f, 0x75, 0x51, 0xaf, 0xb9, 0xee, 0x51, 0x5a, 0xae, 0x23, },
552 + { 0x43, 0x5f, 0x50, 0xd5, 0x70, 0xb0, 0x5b, 0x87, 0xf5, 0xd9, 0xb3, 0x6d, },
553 + { 0x66, 0x0a, 0x64, 0x93, 0x79, 0x71, 0x94, 0x40, 0xb7, 0x68, 0x2d, 0xd3,
555 + { 0x15, 0x00, 0xc4, 0x0c, 0x7d, 0x1b, 0x10, 0xa9, 0x73, 0x1b, 0x90, 0x6f,
557 + { 0x34, 0x75, 0xf3, 0x86, 0x8f, 0x56, 0xcf, 0x2a, 0x0a, 0xf2, 0x62, 0x0a,
558 + 0xf6, 0x0e, 0x20, },
559 + { 0xb1, 0xde, 0xc9, 0xf5, 0xdb, 0xf3, 0x2f, 0x4c, 0xd6, 0x41, 0x7d, 0x39,
560 + 0x18, 0x3e, 0xc7, 0xc3, },
561 + { 0xc5, 0x89, 0xb2, 0xf8, 0xb8, 0xc0, 0xa3, 0xb9, 0x3b, 0x10, 0x6d, 0x7c,
562 + 0x92, 0xfc, 0x7f, 0x34, 0x41, },
563 + { 0xc4, 0xd8, 0xef, 0xba, 0xef, 0xd2, 0xaa, 0xc5, 0x6c, 0x8e, 0x3e, 0xbb,
564 + 0x12, 0xfc, 0x0f, 0x72, 0xbf, 0x0f, },
565 + { 0xdd, 0x91, 0xd1, 0x15, 0x9e, 0x7d, 0xf8, 0xc1, 0xb9, 0x14, 0x63, 0x96,
566 + 0xb5, 0xcb, 0x83, 0x1d, 0x35, 0x1c, 0xec, },
567 + { 0xa9, 0xf8, 0x52, 0xc9, 0x67, 0x76, 0x2b, 0xad, 0xfb, 0xd8, 0x3a, 0xa6,
568 + 0x74, 0x02, 0xae, 0xb8, 0x25, 0x2c, 0x63, 0x49, },
569 + { 0x77, 0x1f, 0x66, 0x70, 0xfd, 0x50, 0x29, 0xaa, 0xeb, 0xdc, 0xee, 0xba,
570 + 0x75, 0x98, 0xdc, 0x93, 0x12, 0x3f, 0xdc, 0x7c, 0x38, },
571 + { 0xe2, 0xe1, 0x89, 0x5c, 0x37, 0x38, 0x6a, 0xa3, 0x40, 0xac, 0x3f, 0xb0,
572 + 0xca, 0xfc, 0xa7, 0xf3, 0xea, 0xf9, 0x0f, 0x5d, 0x8e, 0x39, },
573 + { 0x0f, 0x67, 0xc8, 0x38, 0x01, 0xb1, 0xb7, 0xb8, 0xa2, 0xe7, 0x0a, 0x6d,
574 + 0xd2, 0x63, 0x69, 0x9e, 0xcc, 0xf0, 0xf2, 0xbe, 0x9b, 0x98, 0xdd, },
575 + { 0x13, 0xe1, 0x36, 0x30, 0xfe, 0xc6, 0x01, 0x8a, 0xa1, 0x63, 0x96, 0x59,
576 + 0xc2, 0xa9, 0x68, 0x3f, 0x58, 0xd4, 0x19, 0x0c, 0x40, 0xf3, 0xde, 0x02, },
577 + { 0xa3, 0x9e, 0xce, 0xda, 0x42, 0xee, 0x8c, 0x6c, 0x5a, 0x7d, 0xdc, 0x89,
578 + 0x02, 0x77, 0xdd, 0xe7, 0x95, 0xbb, 0xff, 0x0d, 0xa4, 0xb5, 0x38, 0x1e,
580 + { 0x9a, 0xf6, 0xb5, 0x9a, 0x4f, 0xa9, 0x4f, 0x2c, 0x35, 0x3c, 0x24, 0xdc,
581 + 0x97, 0x6f, 0xd9, 0xa1, 0x7d, 0x1a, 0x85, 0x0b, 0xf5, 0xda, 0x2e, 0xe7,
583 + { 0x84, 0x1e, 0x8e, 0x3d, 0x45, 0xa5, 0xf2, 0x27, 0xf3, 0x31, 0xfe, 0xb9,
584 + 0xfb, 0xc5, 0x45, 0x99, 0x99, 0xdd, 0x93, 0x43, 0x02, 0xee, 0x58, 0xaf,
585 + 0xee, 0x6a, 0xbe, },
586 + { 0x07, 0x2f, 0xc0, 0xa2, 0x04, 0xc4, 0xab, 0x7c, 0x26, 0xbb, 0xa8, 0xd8,
587 + 0xe3, 0x1c, 0x75, 0x15, 0x64, 0x5d, 0x02, 0x6a, 0xf0, 0x86, 0xe9, 0xcd,
588 + 0x5c, 0xef, 0xa3, 0x25, },
589 + { 0x2f, 0x3b, 0x1f, 0xb5, 0x91, 0x8f, 0x86, 0xe0, 0xdc, 0x31, 0x48, 0xb6,
590 + 0xa1, 0x8c, 0xfd, 0x75, 0xbb, 0x7d, 0x3d, 0xc1, 0xf0, 0x10, 0x9a, 0xd8,
591 + 0x4b, 0x0e, 0xe3, 0x94, 0x9f, },
592 + { 0x29, 0xbb, 0x8f, 0x6c, 0xd1, 0xf2, 0xb6, 0xaf, 0xe5, 0xe3, 0x2d, 0xdc,
593 + 0x6f, 0xa4, 0x53, 0x88, 0xd8, 0xcf, 0x4d, 0x45, 0x42, 0x62, 0xdb, 0xdf,
594 + 0xf8, 0x45, 0xc2, 0x13, 0xec, 0x35, },
595 + { 0x06, 0x3c, 0xe3, 0x2c, 0x15, 0xc6, 0x43, 0x03, 0x81, 0xfb, 0x08, 0x76,
596 + 0x33, 0xcb, 0x02, 0xc1, 0xba, 0x33, 0xe5, 0xe0, 0xd1, 0x92, 0xa8, 0x46,
597 + 0x28, 0x3f, 0x3e, 0x9d, 0x2c, 0x44, 0x54, },
598 + { 0xea, 0xbb, 0x96, 0xf8, 0xd1, 0x8b, 0x04, 0x11, 0x40, 0x78, 0x42, 0x02,
599 + 0x19, 0xd1, 0xbc, 0x65, 0x92, 0xd3, 0xc3, 0xd6, 0xd9, 0x19, 0xe7, 0xc3,
600 + 0x40, 0x97, 0xbd, 0xd4, 0xed, 0xfa, 0x5e, 0x28, },
603 + { 0x38, 0x25, 0x0d, },
604 + { 0xe3, 0x04, 0xd4, 0x92, },
605 + { 0x97, 0xdb, 0xf7, 0x81, 0xca, },
606 + { 0x8a, 0x56, 0x9d, 0x62, 0x56, 0xcc, },
607 + { 0xa1, 0x8e, 0x3c, 0x72, 0x8f, 0x63, 0x03, },
608 + { 0xf7, 0xf3, 0x39, 0x09, 0x0a, 0xa1, 0xbb, 0x23, },
609 + { 0x6b, 0x03, 0xc0, 0xe9, 0xd9, 0x83, 0x05, 0x22, 0x01, },
610 + { 0x1b, 0x4b, 0xf5, 0xd6, 0x4f, 0x05, 0x75, 0x91, 0x4c, 0x7f, },
611 + { 0x4c, 0x8c, 0x25, 0x20, 0x21, 0xcb, 0xc2, 0x4b, 0x3a, 0x5b, 0x8d, },
612 + { 0x56, 0xe2, 0x77, 0xa0, 0xb6, 0x9f, 0x81, 0xec, 0x83, 0x75, 0xc4, 0xf9, },
613 + { 0x71, 0x70, 0x0f, 0xad, 0x4d, 0x35, 0x81, 0x9d, 0x88, 0x69, 0xf9, 0xaa,
615 + { 0x50, 0x6e, 0x86, 0x6e, 0x43, 0xc0, 0xc2, 0x44, 0xc2, 0xe2, 0xa0, 0x1c,
617 + { 0xe4, 0x7e, 0x72, 0xc6, 0x12, 0x8e, 0x7c, 0xfc, 0xbd, 0xe2, 0x08, 0x31,
618 + 0x3d, 0x47, 0x3d, },
619 + { 0x08, 0x97, 0x5b, 0x80, 0xae, 0xc4, 0x1d, 0x50, 0x77, 0xdf, 0x1f, 0xd0,
620 + 0x24, 0xf0, 0x17, 0xc0, },
621 + { 0x01, 0xb6, 0x29, 0xf4, 0xaf, 0x78, 0x5f, 0xb6, 0x91, 0xdd, 0x76, 0x76,
622 + 0xd2, 0xfd, 0x0c, 0x47, 0x40, },
623 + { 0xa1, 0xd8, 0x09, 0x97, 0x7a, 0xa6, 0xc8, 0x94, 0xf6, 0x91, 0x7b, 0xae,
624 + 0x2b, 0x9f, 0x0d, 0x83, 0x48, 0xf7, },
625 + { 0x12, 0xd5, 0x53, 0x7d, 0x9a, 0xb0, 0xbe, 0xd9, 0xed, 0xe9, 0x9e, 0xee,
626 + 0x61, 0x5b, 0x42, 0xf2, 0xc0, 0x73, 0xc0, },
627 + { 0xd5, 0x77, 0xd6, 0x5c, 0x6e, 0xa5, 0x69, 0x2b, 0x3b, 0x8c, 0xd6, 0x7d,
628 + 0x1d, 0xbe, 0x2c, 0xa1, 0x02, 0x21, 0xcd, 0x29, },
629 + { 0xa4, 0x98, 0x80, 0xca, 0x22, 0xcf, 0x6a, 0xab, 0x5e, 0x40, 0x0d, 0x61,
630 + 0x08, 0x21, 0xef, 0xc0, 0x6c, 0x52, 0xb4, 0xb0, 0x53, },
631 + { 0xbf, 0xaf, 0x8f, 0x3b, 0x7a, 0x97, 0x33, 0xe5, 0xca, 0x07, 0x37, 0xfd,
632 + 0x15, 0xdf, 0xce, 0x26, 0x2a, 0xb1, 0xa7, 0x0b, 0xb3, 0xac, },
633 + { 0x16, 0x22, 0xe1, 0xbc, 0x99, 0x4e, 0x01, 0xf0, 0xfa, 0xff, 0x8f, 0xa5,
634 + 0x0c, 0x61, 0xb0, 0xad, 0xcc, 0xb1, 0xe1, 0x21, 0x46, 0xfa, 0x2e, },
635 + { 0x11, 0x5b, 0x0b, 0x2b, 0xe6, 0x14, 0xc1, 0xd5, 0x4d, 0x71, 0x5e, 0x17,
636 + 0xea, 0x23, 0xdd, 0x6c, 0xbd, 0x1d, 0xbe, 0x12, 0x1b, 0xee, 0x4c, 0x1a, },
637 + { 0x40, 0x88, 0x22, 0xf3, 0x20, 0x6c, 0xed, 0xe1, 0x36, 0x34, 0x62, 0x2c,
638 + 0x98, 0x83, 0x52, 0xe2, 0x25, 0xee, 0xe9, 0xf5, 0xe1, 0x17, 0xf0, 0x5c,
640 + { 0xc3, 0x76, 0x37, 0xde, 0x95, 0x8c, 0xca, 0x2b, 0x0c, 0x23, 0xe7, 0xb5,
641 + 0x38, 0x70, 0x61, 0xcc, 0xff, 0xd3, 0x95, 0x7b, 0xf3, 0xff, 0x1f, 0x9d,
643 + { 0x0c, 0x19, 0x52, 0x05, 0x22, 0x53, 0xcb, 0x48, 0xd7, 0x10, 0x0e, 0x7e,
644 + 0x14, 0x69, 0xb5, 0xa2, 0x92, 0x43, 0xa3, 0x9e, 0x4b, 0x8f, 0x51, 0x2c,
645 + 0x5a, 0x2c, 0x3b, },
646 + { 0xe1, 0x9d, 0x70, 0x70, 0x28, 0xec, 0x86, 0x40, 0x55, 0x33, 0x56, 0xda,
647 + 0x88, 0xca, 0xee, 0xc8, 0x6a, 0x20, 0xb1, 0xe5, 0x3d, 0x57, 0xf8, 0x3c,
648 + 0x10, 0x07, 0x2a, 0xc4, },
649 + { 0x0b, 0xae, 0xf1, 0xc4, 0x79, 0xee, 0x1b, 0x3d, 0x27, 0x35, 0x8d, 0x14,
650 + 0xd6, 0xae, 0x4e, 0x3c, 0xe9, 0x53, 0x50, 0xb5, 0xcc, 0x0c, 0xf7, 0xdf,
651 + 0xee, 0xa1, 0x74, 0xd6, 0x71, },
652 + { 0xe6, 0xa4, 0xf4, 0x99, 0x98, 0xb9, 0x80, 0xea, 0x96, 0x7f, 0x4f, 0x33,
653 + 0xcf, 0x74, 0x25, 0x6f, 0x17, 0x6c, 0xbf, 0xf5, 0x5c, 0x38, 0xd0, 0xff,
654 + 0x96, 0xcb, 0x13, 0xf9, 0xdf, 0xfd, },
655 + { 0xbe, 0x92, 0xeb, 0xba, 0x44, 0x2c, 0x24, 0x74, 0xd4, 0x03, 0x27, 0x3c,
656 + 0x5d, 0x5b, 0x03, 0x30, 0x87, 0x63, 0x69, 0xe0, 0xb8, 0x94, 0xf4, 0x44,
657 + 0x7e, 0xad, 0xcd, 0x20, 0x12, 0x16, 0x79, },
658 + { 0x30, 0xf1, 0xc4, 0x8e, 0x05, 0x90, 0x2a, 0x97, 0x63, 0x94, 0x46, 0xff,
659 + 0xce, 0xd8, 0x67, 0xa7, 0xac, 0x33, 0x8c, 0x95, 0xb7, 0xcd, 0xa3, 0x23,
660 + 0x98, 0x9d, 0x76, 0x6c, 0x9d, 0xa8, 0xd6, 0x8a, },
663 + { 0x1a, 0x42, 0x4f, },
664 + { 0xba, 0xaf, 0xb7, 0x65, },
665 + { 0xc2, 0x63, 0x43, 0x6a, 0xea, },
666 + { 0xe4, 0x4d, 0xad, 0xf2, 0x0b, 0x02, },
667 + { 0x04, 0xc7, 0xc4, 0x7f, 0xa9, 0x2b, 0xce, },
668 + { 0x66, 0xf6, 0x67, 0xcb, 0x03, 0x53, 0xc8, 0xf1, },
669 + { 0x56, 0xa3, 0x60, 0x78, 0xc9, 0x5f, 0x70, 0x1b, 0x5e, },
670 + { 0x99, 0xff, 0x81, 0x7c, 0x13, 0x3c, 0x29, 0x79, 0x4b, 0x65, },
671 + { 0x51, 0x10, 0x50, 0x93, 0x01, 0x93, 0xb7, 0x01, 0xc9, 0x18, 0xb7, },
672 + { 0x8e, 0x3c, 0x42, 0x1e, 0x5e, 0x7d, 0xc1, 0x50, 0x70, 0x1f, 0x00, 0x98, },
673 + { 0x5f, 0xd9, 0x9b, 0xc8, 0xd7, 0xb2, 0x72, 0x62, 0x1a, 0x1e, 0xba, 0x92,
675 + { 0x70, 0x2b, 0xba, 0xfe, 0xad, 0x5d, 0x96, 0x3f, 0x27, 0xc2, 0x41, 0x6d,
677 + { 0xae, 0xe0, 0xd5, 0xd4, 0xc7, 0xae, 0x15, 0x5e, 0xdc, 0xdd, 0x33, 0x60,
678 + 0xd7, 0xd3, 0x5e, },
679 + { 0x79, 0x8e, 0xbc, 0x9e, 0x20, 0xb9, 0x19, 0x4b, 0x63, 0x80, 0xf3, 0x16,
680 + 0xaf, 0x39, 0xbd, 0x92, },
681 + { 0xc2, 0x0e, 0x85, 0xa0, 0x0b, 0x9a, 0xb0, 0xec, 0xde, 0x38, 0xd3, 0x10,
682 + 0xd9, 0xa7, 0x66, 0x27, 0xcf, },
683 + { 0x0e, 0x3b, 0x75, 0x80, 0x67, 0x14, 0x0c, 0x02, 0x90, 0xd6, 0xb3, 0x02,
684 + 0x81, 0xf6, 0xa6, 0x87, 0xce, 0x58, },
685 + { 0x79, 0xb5, 0xe9, 0x5d, 0x52, 0x4d, 0xf7, 0x59, 0xf4, 0x2e, 0x27, 0xdd,
686 + 0xb3, 0xed, 0x57, 0x5b, 0x82, 0xea, 0x6f, },
687 + { 0xa2, 0x97, 0xf5, 0x80, 0x02, 0x3d, 0xde, 0xa3, 0xf9, 0xf6, 0xab, 0xe3,
688 + 0x57, 0x63, 0x7b, 0x9b, 0x10, 0x42, 0x6f, 0xf2, },
689 + { 0x12, 0x7a, 0xfc, 0xb7, 0x67, 0x06, 0x0c, 0x78, 0x1a, 0xfe, 0x88, 0x4f,
690 + 0xc6, 0xac, 0x52, 0x96, 0x64, 0x28, 0x97, 0x84, 0x06, },
691 + { 0xc5, 0x04, 0x44, 0x6b, 0xb2, 0xa5, 0xa4, 0x66, 0xe1, 0x76, 0xa2, 0x51,
692 + 0xf9, 0x59, 0x69, 0x97, 0x56, 0x0b, 0xbf, 0x50, 0xb3, 0x34, },
693 + { 0x21, 0x32, 0x6b, 0x42, 0xb5, 0xed, 0x71, 0x8d, 0xf7, 0x5a, 0x35, 0xe3,
694 + 0x90, 0xe2, 0xee, 0xaa, 0x89, 0xf6, 0xc9, 0x9c, 0x4d, 0x73, 0xf4, },
695 + { 0x4c, 0xa6, 0x09, 0xf4, 0x48, 0xe7, 0x46, 0xbc, 0x49, 0xfc, 0xe5, 0xda,
696 + 0xd1, 0x87, 0x13, 0x17, 0x4c, 0x59, 0x71, 0x26, 0x5b, 0x2c, 0x42, 0xb7, },
697 + { 0x13, 0x63, 0xf3, 0x40, 0x02, 0xe5, 0xa3, 0x3a, 0x5e, 0x8e, 0xf8, 0xb6,
698 + 0x8a, 0x49, 0x60, 0x76, 0x34, 0x72, 0x94, 0x73, 0xf6, 0xd9, 0x21, 0x6a,
700 + { 0xdf, 0x75, 0x16, 0x10, 0x1b, 0x5e, 0x81, 0xc3, 0xc8, 0xde, 0x34, 0x24,
701 + 0xb0, 0x98, 0xeb, 0x1b, 0x8f, 0xa1, 0x9b, 0x05, 0xee, 0xa5, 0xe9, 0x35,
703 + { 0xcd, 0x21, 0x93, 0x6e, 0x5b, 0xa0, 0x26, 0x2b, 0x21, 0x0e, 0xa0, 0xb9,
704 + 0x1c, 0xb5, 0xbb, 0xb8, 0xf8, 0x1e, 0xff, 0x5c, 0xa8, 0xf9, 0x39, 0x46,
705 + 0x4e, 0x29, 0x26, },
706 + { 0x73, 0x7f, 0x0e, 0x3b, 0x0b, 0x5c, 0xf9, 0x60, 0xaa, 0x88, 0xa1, 0x09,
707 + 0xb1, 0x5d, 0x38, 0x7b, 0x86, 0x8f, 0x13, 0x7a, 0x8d, 0x72, 0x7a, 0x98,
708 + 0x1a, 0x5b, 0xff, 0xc9, },
709 + { 0xd3, 0x3c, 0x61, 0x71, 0x44, 0x7e, 0x31, 0x74, 0x98, 0x9d, 0x9a, 0xd2,
710 + 0x27, 0xf3, 0x46, 0x43, 0x42, 0x51, 0xd0, 0x5f, 0xe9, 0x1c, 0x5c, 0x69,
711 + 0xbf, 0xf6, 0xbe, 0x3c, 0x40, },
712 + { 0x31, 0x99, 0x31, 0x9f, 0xaa, 0x43, 0x2e, 0x77, 0x3e, 0x74, 0x26, 0x31,
713 + 0x5e, 0x61, 0xf1, 0x87, 0xe2, 0xeb, 0x9b, 0xcd, 0xd0, 0x3a, 0xee, 0x20,
714 + 0x7e, 0x10, 0x0a, 0x0b, 0x7e, 0xfa, },
715 + { 0xa4, 0x27, 0x80, 0x67, 0x81, 0x2a, 0xa7, 0x62, 0xf7, 0x6e, 0xda, 0xd4,
716 + 0x5c, 0x39, 0x74, 0xad, 0x7e, 0xbe, 0xad, 0xa5, 0x84, 0x7f, 0xa9, 0x30,
717 + 0x5d, 0xdb, 0xe2, 0x05, 0x43, 0xf7, 0x1b, },
718 + { 0x0b, 0x37, 0xd8, 0x02, 0xe1, 0x83, 0xd6, 0x80, 0xf2, 0x35, 0xc2, 0xb0,
719 + 0x37, 0xef, 0xef, 0x5e, 0x43, 0x93, 0xf0, 0x49, 0x45, 0x0a, 0xef, 0xb5,
720 + 0x76, 0x70, 0x12, 0x44, 0xc4, 0xdb, 0xf5, 0x7a, },
723 + { 0xcc, 0xe3, 0x08, },
724 + { 0x56, 0x17, 0xe4, 0x59, },
725 + { 0xe2, 0xd7, 0x9e, 0xc4, 0x4c, },
726 + { 0xb2, 0xad, 0xd3, 0x78, 0x58, 0x5a, },
727 + { 0xce, 0x43, 0xb4, 0x02, 0x96, 0xab, 0x3c, },
728 + { 0xe6, 0x05, 0x1a, 0x73, 0x22, 0x32, 0xbb, 0x77, },
729 + { 0x23, 0xe7, 0xda, 0xfe, 0x2c, 0xef, 0x8c, 0x22, 0xec, },
730 + { 0xe9, 0x8e, 0x55, 0x38, 0xd1, 0xd7, 0x35, 0x23, 0x98, 0xc7, },
731 + { 0xb5, 0x81, 0x1a, 0xe5, 0xb5, 0xa5, 0xd9, 0x4d, 0xca, 0x41, 0xe7, },
732 + { 0x41, 0x16, 0x16, 0x95, 0x8d, 0x9e, 0x0c, 0xea, 0x8c, 0x71, 0x9a, 0xc1, },
733 + { 0x7c, 0x33, 0xc0, 0xa4, 0x00, 0x62, 0xea, 0x60, 0x67, 0xe4, 0x20, 0xbc,
735 + { 0xdb, 0xb1, 0xdc, 0xfd, 0x08, 0xc0, 0xde, 0x82, 0xd1, 0xde, 0x38, 0xc0,
737 + { 0x37, 0x18, 0x2e, 0x0d, 0x61, 0xaa, 0x61, 0xd7, 0x86, 0x20, 0x16, 0x60,
738 + 0x04, 0xd9, 0xd5, },
739 + { 0xb0, 0xcf, 0x2c, 0x4c, 0x5e, 0x5b, 0x4f, 0x2a, 0x23, 0x25, 0x58, 0x47,
740 + 0xe5, 0x31, 0x06, 0x70, },
741 + { 0x91, 0xa0, 0xa3, 0x86, 0x4e, 0xe0, 0x72, 0x38, 0x06, 0x67, 0x59, 0x5c,
742 + 0x70, 0x25, 0xdb, 0x33, 0x27, },
743 + { 0x44, 0x58, 0x66, 0xb8, 0x58, 0xc7, 0x13, 0xed, 0x4c, 0xc0, 0xf4, 0x9a,
744 + 0x1e, 0x67, 0x75, 0x33, 0xb6, 0xb8, },
745 + { 0x7f, 0x98, 0x4a, 0x8e, 0x50, 0xa2, 0x5c, 0xcd, 0x59, 0xde, 0x72, 0xb3,
746 + 0x9d, 0xc3, 0x09, 0x8a, 0xab, 0x56, 0xf1, },
747 + { 0x80, 0x96, 0x49, 0x1a, 0x59, 0xa2, 0xc5, 0xd5, 0xa7, 0x20, 0x8a, 0xb7,
748 + 0x27, 0x62, 0x84, 0x43, 0xc6, 0xe1, 0x1b, 0x5d, },
749 + { 0x6b, 0xb7, 0x2b, 0x26, 0x62, 0x14, 0x70, 0x19, 0x3d, 0x4d, 0xac, 0xac,
750 + 0x63, 0x58, 0x5e, 0x94, 0xb5, 0xb7, 0xe8, 0xe8, 0xa2, },
751 + { 0x20, 0xa8, 0xc0, 0xfd, 0x63, 0x3d, 0x6e, 0x98, 0xcf, 0x0c, 0x49, 0x98,
752 + 0xe4, 0x5a, 0xfe, 0x8c, 0xaa, 0x70, 0x82, 0x1c, 0x7b, 0x74, },
753 + { 0xc8, 0xe8, 0xdd, 0xdf, 0x69, 0x30, 0x01, 0xc2, 0x0f, 0x7e, 0x2f, 0x11,
754 + 0xcc, 0x3e, 0x17, 0xa5, 0x69, 0x40, 0x3f, 0x0e, 0x79, 0x7f, 0xcf, },
755 + { 0xdb, 0x61, 0xc0, 0xe2, 0x2e, 0x49, 0x07, 0x31, 0x1d, 0x91, 0x42, 0x8a,
756 + 0xfc, 0x5e, 0xd3, 0xf8, 0x56, 0x1f, 0x2b, 0x73, 0xfd, 0x9f, 0xb2, 0x8e, },
757 + { 0x0c, 0x89, 0x55, 0x0c, 0x1f, 0x59, 0x2c, 0x9d, 0x1b, 0x29, 0x1d, 0x41,
758 + 0x1d, 0xe6, 0x47, 0x8f, 0x8c, 0x2b, 0xea, 0x8f, 0xf0, 0xff, 0x21, 0x70,
760 + { 0x12, 0x18, 0x95, 0xa6, 0x59, 0xb1, 0x31, 0x24, 0x45, 0x67, 0x55, 0xa4,
761 + 0x1a, 0x2d, 0x48, 0x67, 0x1b, 0x43, 0x88, 0x2d, 0x8e, 0xa0, 0x70, 0xb3,
763 + { 0xe7, 0xb1, 0x1d, 0xb2, 0x76, 0x4d, 0x68, 0x68, 0x68, 0x23, 0x02, 0x55,
764 + 0x3a, 0xe2, 0xe5, 0xd5, 0x4b, 0x43, 0xf9, 0x34, 0x77, 0x5c, 0xa1, 0xf5,
765 + 0x55, 0xfd, 0x4f, },
766 + { 0x8c, 0x87, 0x5a, 0x08, 0x3a, 0x73, 0xad, 0x61, 0xe1, 0xe7, 0x99, 0x7e,
767 + 0xf0, 0x5d, 0xe9, 0x5d, 0x16, 0x43, 0x80, 0x2f, 0xd0, 0x66, 0x34, 0xe2,
768 + 0x42, 0x64, 0x3b, 0x1a, },
769 + { 0x39, 0xc1, 0x99, 0xcf, 0x22, 0xbf, 0x16, 0x8f, 0x9f, 0x80, 0x7f, 0x95,
770 + 0x0a, 0x05, 0x67, 0x27, 0xe7, 0x15, 0xdf, 0x9d, 0xb2, 0xfe, 0x1c, 0xb5,
771 + 0x1d, 0x60, 0x8f, 0x8a, 0x1d, },
772 + { 0x9b, 0x6e, 0x08, 0x09, 0x06, 0x73, 0xab, 0x68, 0x02, 0x62, 0x1a, 0xe4,
773 + 0xd4, 0xdf, 0xc7, 0x02, 0x4c, 0x6a, 0x5f, 0xfd, 0x23, 0xac, 0xae, 0x6d,
774 + 0x43, 0xa4, 0x7a, 0x50, 0x60, 0x3c, },
775 + { 0x1d, 0xb4, 0xc6, 0xe1, 0xb1, 0x4b, 0xe3, 0xf2, 0xe2, 0x1a, 0x73, 0x1b,
776 + 0xa0, 0x92, 0xa7, 0xf5, 0xff, 0x8f, 0x8b, 0x5d, 0xdf, 0xa8, 0x04, 0xb3,
777 + 0xb0, 0xf7, 0xcc, 0x12, 0xfa, 0x35, 0x46, },
778 + { 0x49, 0x45, 0x97, 0x11, 0x0f, 0x1c, 0x60, 0x8e, 0xe8, 0x47, 0x30, 0xcf,
779 + 0x60, 0xa8, 0x71, 0xc5, 0x1b, 0xe9, 0x39, 0x4d, 0x49, 0xb6, 0x12, 0x1f,
780 + 0x24, 0xab, 0x37, 0xff, 0x83, 0xc2, 0xe1, 0x3a, },
783 + { 0x47, 0xeb, 0xc9, },
784 + { 0x4a, 0xd0, 0xbc, 0xf0, },
785 + { 0x8e, 0x2b, 0xc9, 0x85, 0x3c, },
786 + { 0xa2, 0x07, 0x15, 0xb8, 0x12, 0x74, },
787 + { 0x0f, 0xdb, 0x5b, 0x33, 0x69, 0xfe, 0x4b, },
788 + { 0xa2, 0x86, 0x54, 0xf4, 0xfd, 0xb2, 0xd4, 0xe6, },
789 + { 0xbb, 0x84, 0x78, 0x49, 0x27, 0x8e, 0x61, 0xda, 0x60, },
790 + { 0x04, 0xc3, 0xcd, 0xaa, 0x8f, 0xa7, 0x03, 0xc9, 0xf9, 0xb6, },
791 + { 0xf8, 0x27, 0x1d, 0x61, 0xdc, 0x21, 0x42, 0xdd, 0xad, 0x92, 0x40, },
792 + { 0x12, 0x87, 0xdf, 0xc2, 0x41, 0x45, 0x5a, 0x36, 0x48, 0x5b, 0x51, 0x2b, },
793 + { 0xbb, 0x37, 0x5d, 0x1f, 0xf1, 0x68, 0x7a, 0xc4, 0xa5, 0xd2, 0xa4, 0x91,
795 + { 0x5b, 0x27, 0xd1, 0x04, 0x54, 0x52, 0x9f, 0xa3, 0x47, 0x86, 0x33, 0x33,
797 + { 0xcf, 0x04, 0xea, 0xf8, 0x03, 0x2a, 0x43, 0xff, 0xa6, 0x68, 0x21, 0x4c,
798 + 0xd5, 0x4b, 0xed, },
799 + { 0xaf, 0xb8, 0xbc, 0x63, 0x0f, 0x18, 0x4d, 0xe2, 0x7a, 0xdd, 0x46, 0x44,
800 + 0xc8, 0x24, 0x0a, 0xb7, },
801 + { 0x3e, 0xdc, 0x36, 0xe4, 0x89, 0xb1, 0xfa, 0xc6, 0x40, 0x93, 0x2e, 0x75,
802 + 0xb2, 0x15, 0xd1, 0xb1, 0x10, },
803 + { 0x6c, 0xd8, 0x20, 0x3b, 0x82, 0x79, 0xf9, 0xc8, 0xbc, 0x9d, 0xe0, 0x35,
804 + 0xbe, 0x1b, 0x49, 0x1a, 0xbc, 0x3a, },
805 + { 0x78, 0x65, 0x2c, 0xbe, 0x35, 0x67, 0xdc, 0x78, 0xd4, 0x41, 0xf6, 0xc9,
806 + 0xde, 0xde, 0x1f, 0x18, 0x13, 0x31, 0x11, },
807 + { 0x8a, 0x7f, 0xb1, 0x33, 0x8f, 0x0c, 0x3c, 0x0a, 0x06, 0x61, 0xf0, 0x47,
808 + 0x29, 0x1b, 0x29, 0xbc, 0x1c, 0x47, 0xef, 0x7a, },
809 + { 0x65, 0x91, 0xf1, 0xe6, 0xb3, 0x96, 0xd3, 0x8c, 0xc2, 0x4a, 0x59, 0x35,
810 + 0x72, 0x8e, 0x0b, 0x9a, 0x87, 0xca, 0x34, 0x7b, 0x63, },
811 + { 0x5f, 0x08, 0x87, 0x80, 0x56, 0x25, 0x89, 0x77, 0x61, 0x8c, 0x64, 0xa1,
812 + 0x59, 0x6d, 0x59, 0x62, 0xe8, 0x4a, 0xc8, 0x58, 0x99, 0xd1, },
813 + { 0x23, 0x87, 0x1d, 0xed, 0x6f, 0xf2, 0x91, 0x90, 0xe2, 0xfe, 0x43, 0x21,
814 + 0xaf, 0x97, 0xc6, 0xbc, 0xd7, 0x15, 0xc7, 0x2d, 0x08, 0x77, 0x91, },
815 + { 0x90, 0x47, 0x9a, 0x9e, 0x3a, 0xdf, 0xf3, 0xc9, 0x4c, 0x1e, 0xa7, 0xd4,
816 + 0x6a, 0x32, 0x90, 0xfe, 0xb7, 0xb6, 0x7b, 0xfa, 0x96, 0x61, 0xfb, 0xa4, },
817 + { 0xb1, 0x67, 0x60, 0x45, 0xb0, 0x96, 0xc5, 0x15, 0x9f, 0x4d, 0x26, 0xd7,
818 + 0x9d, 0xf1, 0xf5, 0x6d, 0x21, 0x00, 0x94, 0x31, 0x64, 0x94, 0xd3, 0xa7,
820 + { 0x02, 0x3e, 0xaf, 0xf3, 0x79, 0x73, 0xa5, 0xf5, 0xcc, 0x7a, 0x7f, 0xfb,
821 + 0x79, 0x2b, 0x85, 0x8c, 0x88, 0x72, 0x06, 0xbe, 0xfe, 0xaf, 0xc1, 0x16,
823 + { 0x2a, 0xb0, 0x1a, 0xe5, 0xaa, 0x6e, 0xb3, 0xae, 0x53, 0x85, 0x33, 0x80,
824 + 0x75, 0xae, 0x30, 0xe6, 0xb8, 0x72, 0x42, 0xf6, 0x25, 0x4f, 0x38, 0x88,
825 + 0x55, 0xd1, 0xa9, },
826 + { 0x90, 0xd8, 0x0c, 0xc0, 0x93, 0x4b, 0x4f, 0x9e, 0x65, 0x6c, 0xa1, 0x54,
827 + 0xa6, 0xf6, 0x6e, 0xca, 0xd2, 0xbb, 0x7e, 0x6a, 0x1c, 0xd3, 0xce, 0x46,
828 + 0xef, 0xb0, 0x00, 0x8d, },
829 + { 0xed, 0x9c, 0x49, 0xcd, 0xc2, 0xde, 0x38, 0x0e, 0xe9, 0x98, 0x6c, 0xc8,
830 + 0x90, 0x9e, 0x3c, 0xd4, 0xd3, 0xeb, 0x88, 0x32, 0xc7, 0x28, 0xe3, 0x94,
831 + 0x1c, 0x9f, 0x8b, 0xf3, 0xcb, },
832 + { 0xac, 0xe7, 0x92, 0x16, 0xb4, 0x14, 0xa0, 0xe4, 0x04, 0x79, 0xa2, 0xf4,
833 + 0x31, 0xe6, 0x0c, 0x26, 0xdc, 0xbf, 0x2f, 0x69, 0x1b, 0x55, 0x94, 0x67,
834 + 0xda, 0x0c, 0xd7, 0x32, 0x1f, 0xef, },
835 + { 0x68, 0x63, 0x85, 0x57, 0x95, 0x9e, 0x42, 0x27, 0x41, 0x43, 0x42, 0x02,
836 + 0xa5, 0x78, 0xa7, 0xc6, 0x43, 0xc1, 0x6a, 0xba, 0x70, 0x80, 0xcd, 0x04,
837 + 0xb6, 0x78, 0x76, 0x29, 0xf3, 0xe8, 0xa0, },
838 + { 0xe6, 0xac, 0x8d, 0x9d, 0xf0, 0xc0, 0xf7, 0xf7, 0xe3, 0x3e, 0x4e, 0x28,
839 + 0x0f, 0x59, 0xb2, 0x67, 0x9e, 0x84, 0x34, 0x42, 0x96, 0x30, 0x2b, 0xca,
840 + 0x49, 0xb6, 0xc5, 0x9a, 0x84, 0x59, 0xa7, 0x81, },
843 + { 0x26, 0xd3, 0xdd, },
844 + { 0x2c, 0xd4, 0xb3, 0x3d, },
845 + { 0x86, 0x7b, 0x76, 0x3c, 0xf0, },
846 + { 0x12, 0xc3, 0x70, 0x1d, 0x55, 0x18, },
847 + { 0x96, 0xc2, 0xbd, 0x61, 0x55, 0xf4, 0x24, },
848 + { 0x20, 0x51, 0xf7, 0x86, 0x58, 0x8f, 0x07, 0x2a, },
849 + { 0x93, 0x15, 0xa8, 0x1d, 0xda, 0x97, 0xee, 0x0e, 0x6c, },
850 + { 0x39, 0x93, 0xdf, 0xd5, 0x0e, 0xca, 0xdc, 0x7a, 0x92, 0xce, },
851 + { 0x60, 0xd5, 0xfd, 0xf5, 0x1b, 0x26, 0x82, 0x26, 0x73, 0x02, 0xbc, },
852 + { 0x98, 0xf2, 0x34, 0xe1, 0xf5, 0xfb, 0x00, 0xac, 0x10, 0x4a, 0x38, 0x9f, },
853 + { 0xda, 0x3a, 0x92, 0x8a, 0xd0, 0xcd, 0x12, 0xcd, 0x15, 0xbb, 0xab, 0x77,
855 + { 0xa2, 0x92, 0x1a, 0xe5, 0xca, 0x0c, 0x30, 0x75, 0xeb, 0xaf, 0x00, 0x31,
857 + { 0x06, 0xea, 0xfd, 0x3e, 0x86, 0x38, 0x62, 0x4e, 0xa9, 0x12, 0xa4, 0x12,
858 + 0x43, 0xbf, 0xa1, },
859 + { 0xe4, 0x71, 0x7b, 0x94, 0xdb, 0xa0, 0xd2, 0xff, 0x9b, 0xeb, 0xad, 0x8e,
860 + 0x95, 0x8a, 0xc5, 0xed, },
861 + { 0x25, 0x5a, 0x77, 0x71, 0x41, 0x0e, 0x7a, 0xe9, 0xed, 0x0c, 0x10, 0xef,
862 + 0xf6, 0x2b, 0x3a, 0xba, 0x60, },
863 + { 0xee, 0xe2, 0xa3, 0x67, 0x64, 0x1d, 0xc6, 0x04, 0xc4, 0xe1, 0x68, 0xd2,
864 + 0x6e, 0xd2, 0x91, 0x75, 0x53, 0x07, },
865 + { 0xe0, 0xf6, 0x4d, 0x8f, 0x68, 0xfc, 0x06, 0x7e, 0x18, 0x79, 0x7f, 0x2b,
866 + 0x6d, 0xef, 0x46, 0x7f, 0xab, 0xb2, 0xad, },
867 + { 0x3d, 0x35, 0x88, 0x9f, 0x2e, 0xcf, 0x96, 0x45, 0x07, 0x60, 0x71, 0x94,
868 + 0x00, 0x8d, 0xbf, 0xf4, 0xef, 0x46, 0x2e, 0x3c, },
869 + { 0x43, 0xcf, 0x98, 0xf7, 0x2d, 0xf4, 0x17, 0xe7, 0x8c, 0x05, 0x2d, 0x9b,
870 + 0x24, 0xfb, 0x4d, 0xea, 0x4a, 0xec, 0x01, 0x25, 0x29, },
871 + { 0x8e, 0x73, 0x9a, 0x78, 0x11, 0xfe, 0x48, 0xa0, 0x3b, 0x1a, 0x26, 0xdf,
872 + 0x25, 0xe9, 0x59, 0x1c, 0x70, 0x07, 0x9f, 0xdc, 0xa0, 0xa6, },
873 + { 0xe8, 0x47, 0x71, 0xc7, 0x3e, 0xdf, 0xb5, 0x13, 0xb9, 0x85, 0x13, 0xa8,
874 + 0x54, 0x47, 0x6e, 0x59, 0x96, 0x09, 0x13, 0x5f, 0x82, 0x16, 0x0b, },
875 + { 0xfb, 0xc0, 0x8c, 0x03, 0x21, 0xb3, 0xc4, 0xb5, 0x43, 0x32, 0x6c, 0xea,
876 + 0x7f, 0xa8, 0x43, 0x91, 0xe8, 0x4e, 0x3f, 0xbf, 0x45, 0x58, 0x6a, 0xa3, },
877 + { 0x55, 0xf8, 0xf3, 0x00, 0x76, 0x09, 0xef, 0x69, 0x5d, 0xd2, 0x8a, 0xf2,
878 + 0x65, 0xc3, 0xcb, 0x9b, 0x43, 0xfd, 0xb1, 0x7e, 0x7f, 0xa1, 0x94, 0xb0,
880 + { 0xaa, 0x13, 0xc1, 0x51, 0x40, 0x6d, 0x8d, 0x4c, 0x0a, 0x95, 0x64, 0x7b,
881 + 0xd1, 0x96, 0xb6, 0x56, 0xb4, 0x5b, 0xcf, 0xd6, 0xd9, 0x15, 0x97, 0xdd,
883 + { 0xaf, 0xb7, 0x36, 0xb0, 0x04, 0xdb, 0xd7, 0x9c, 0x9a, 0x44, 0xc4, 0xf6,
884 + 0x1f, 0x12, 0x21, 0x2d, 0x59, 0x30, 0x54, 0xab, 0x27, 0x61, 0xa3, 0x57,
885 + 0xef, 0xf8, 0x53, },
886 + { 0x97, 0x34, 0x45, 0x3e, 0xce, 0x7c, 0x35, 0xa2, 0xda, 0x9f, 0x4b, 0x46,
887 + 0x6c, 0x11, 0x67, 0xff, 0x2f, 0x76, 0x58, 0x15, 0x71, 0xfa, 0x44, 0x89,
888 + 0x89, 0xfd, 0xf7, 0x99, },
889 + { 0x1f, 0xb1, 0x62, 0xeb, 0x83, 0xc5, 0x9c, 0x89, 0xf9, 0x2c, 0xd2, 0x03,
890 + 0x61, 0xbc, 0xbb, 0xa5, 0x74, 0x0e, 0x9b, 0x7e, 0x82, 0x3e, 0x70, 0x0a,
891 + 0xa9, 0x8f, 0x2b, 0x59, 0xfb, },
892 + { 0xf8, 0xca, 0x5e, 0x3a, 0x4f, 0x9e, 0x10, 0x69, 0x10, 0xd5, 0x4c, 0xeb,
893 + 0x1a, 0x0f, 0x3c, 0x6a, 0x98, 0xf5, 0xb0, 0x97, 0x5b, 0x37, 0x2f, 0x0d,
894 + 0xbd, 0x42, 0x4b, 0x69, 0xa1, 0x82, },
895 + { 0x12, 0x8c, 0x6d, 0x52, 0x08, 0xef, 0x74, 0xb2, 0xe6, 0xaa, 0xd3, 0xb0,
896 + 0x26, 0xb0, 0xd9, 0x94, 0xb6, 0x11, 0x45, 0x0e, 0x36, 0x71, 0x14, 0x2d,
897 + 0x41, 0x8c, 0x21, 0x53, 0x31, 0xe9, 0x68, },
898 + { 0xee, 0xea, 0x0d, 0x89, 0x47, 0x7e, 0x72, 0xd1, 0xd8, 0xce, 0x58, 0x4c,
899 + 0x94, 0x1f, 0x0d, 0x51, 0x08, 0xa3, 0xb6, 0x3d, 0xe7, 0x82, 0x46, 0x92,
900 + 0xd6, 0x98, 0x6b, 0x07, 0x10, 0x65, 0x52, 0x65, },
903 +static const u8 blake2s_hmac_testvecs[][BLAKE2S_HASH_SIZE] __initconst = {
904 + { 0xce, 0xe1, 0x57, 0x69, 0x82, 0xdc, 0xbf, 0x43, 0xad, 0x56, 0x4c, 0x70,
905 + 0xed, 0x68, 0x16, 0x96, 0xcf, 0xa4, 0x73, 0xe8, 0xe8, 0xfc, 0x32, 0x79,
906 + 0x08, 0x0a, 0x75, 0x82, 0xda, 0x3f, 0x05, 0x11, },
907 + { 0x77, 0x2f, 0x0c, 0x71, 0x41, 0xf4, 0x4b, 0x2b, 0xb3, 0xc6, 0xb6, 0xf9,
908 + 0x60, 0xde, 0xe4, 0x52, 0x38, 0x66, 0xe8, 0xbf, 0x9b, 0x96, 0xc4, 0x9f,
909 + 0x60, 0xd9, 0x24, 0x37, 0x99, 0xd6, 0xec, 0x31, },
912 +bool __init blake2s_selftest(void)
914 + u8 key[BLAKE2S_KEY_SIZE];
915 + u8 buf[ARRAY_SIZE(blake2s_testvecs)];
916 + u8 hash[BLAKE2S_HASH_SIZE];
917 + struct blake2s_state state;
918 + bool success = true;
921 + key[0] = key[1] = 1;
922 + for (i = 2; i < sizeof(key); ++i)
923 + key[i] = key[i - 2] + key[i - 1];
925 + for (i = 0; i < sizeof(buf); ++i)
928 + for (i = l = 0; i < ARRAY_SIZE(blake2s_testvecs); l = (l + 37) % ++i) {
929 + int outlen = 1 + i % BLAKE2S_HASH_SIZE;
930 + int keylen = (13 * i) % (BLAKE2S_KEY_SIZE + 1);
932 + blake2s(hash, buf, key + BLAKE2S_KEY_SIZE - keylen, outlen, i,
934 + if (memcmp(hash, blake2s_testvecs[i], outlen)) {
935 + pr_err("blake2s self-test %d: FAIL\n", i + 1);
940 + blake2s_init(&state, outlen);
942 + blake2s_init_key(&state, outlen,
943 + key + BLAKE2S_KEY_SIZE - keylen,
946 + blake2s_update(&state, buf, l);
947 + blake2s_update(&state, buf + l, i - l);
948 + blake2s_final(&state, hash);
949 + if (memcmp(hash, blake2s_testvecs[i], outlen)) {
950 + pr_err("blake2s init/update/final self-test %d: FAIL\n",
957 + blake2s256_hmac(hash, buf, key, sizeof(buf), sizeof(key));
958 + success &= !memcmp(hash, blake2s_hmac_testvecs[0], BLAKE2S_HASH_SIZE);
960 + blake2s256_hmac(hash, key, buf, sizeof(key), sizeof(buf));
961 + success &= !memcmp(hash, blake2s_hmac_testvecs[1], BLAKE2S_HASH_SIZE);
964 + pr_err("blake2s256_hmac self-test: FAIL\n");
970 +++ b/lib/crypto/blake2s.c
972 +// SPDX-License-Identifier: GPL-2.0 OR MIT
974 + * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
976 + * This is an implementation of the BLAKE2s hash and PRF functions.
978 + * Information: https://blake2.net/
982 +#include <crypto/internal/blake2s.h>
983 +#include <linux/types.h>
984 +#include <linux/string.h>
985 +#include <linux/kernel.h>
986 +#include <linux/module.h>
987 +#include <linux/init.h>
988 +#include <linux/bug.h>
989 +#include <asm/unaligned.h>
991 +bool blake2s_selftest(void);
993 +void blake2s_update(struct blake2s_state *state, const u8 *in, size_t inlen)
995 + const size_t fill = BLAKE2S_BLOCK_SIZE - state->buflen;
997 + if (unlikely(!inlen))
999 + if (inlen > fill) {
1000 + memcpy(state->buf + state->buflen, in, fill);
1001 + if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S))
1002 + blake2s_compress_arch(state, state->buf, 1,
1003 + BLAKE2S_BLOCK_SIZE);
1005 + blake2s_compress_generic(state, state->buf, 1,
1006 + BLAKE2S_BLOCK_SIZE);
1007 + state->buflen = 0;
1011 + if (inlen > BLAKE2S_BLOCK_SIZE) {
1012 + const size_t nblocks = DIV_ROUND_UP(inlen, BLAKE2S_BLOCK_SIZE);
1013 + /* Hash one less (full) block than strictly possible */
1014 + if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S))
1015 + blake2s_compress_arch(state, in, nblocks - 1,
1016 + BLAKE2S_BLOCK_SIZE);
1018 + blake2s_compress_generic(state, in, nblocks - 1,
1019 + BLAKE2S_BLOCK_SIZE);
1020 + in += BLAKE2S_BLOCK_SIZE * (nblocks - 1);
1021 + inlen -= BLAKE2S_BLOCK_SIZE * (nblocks - 1);
1023 + memcpy(state->buf + state->buflen, in, inlen);
1024 + state->buflen += inlen;
1026 +EXPORT_SYMBOL(blake2s_update);
1028 +void blake2s_final(struct blake2s_state *state, u8 *out)
1030 + WARN_ON(IS_ENABLED(DEBUG) && !out);
1031 + blake2s_set_lastblock(state);
1032 + memset(state->buf + state->buflen, 0,
1033 + BLAKE2S_BLOCK_SIZE - state->buflen); /* Padding */
1034 + if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S))
1035 + blake2s_compress_arch(state, state->buf, 1, state->buflen);
1037 + blake2s_compress_generic(state, state->buf, 1, state->buflen);
1038 + cpu_to_le32_array(state->h, ARRAY_SIZE(state->h));
1039 + memcpy(out, state->h, state->outlen);
1040 + memzero_explicit(state, sizeof(*state));
1042 +EXPORT_SYMBOL(blake2s_final);
1044 +void blake2s256_hmac(u8 *out, const u8 *in, const u8 *key, const size_t inlen,
1045 + const size_t keylen)
1047 + struct blake2s_state state;
1048 + u8 x_key[BLAKE2S_BLOCK_SIZE] __aligned(__alignof__(u32)) = { 0 };
1049 + u8 i_hash[BLAKE2S_HASH_SIZE] __aligned(__alignof__(u32));
1052 + if (keylen > BLAKE2S_BLOCK_SIZE) {
1053 + blake2s_init(&state, BLAKE2S_HASH_SIZE);
1054 + blake2s_update(&state, key, keylen);
1055 + blake2s_final(&state, x_key);
1057 + memcpy(x_key, key, keylen);
1059 + for (i = 0; i < BLAKE2S_BLOCK_SIZE; ++i)
1062 + blake2s_init(&state, BLAKE2S_HASH_SIZE);
1063 + blake2s_update(&state, x_key, BLAKE2S_BLOCK_SIZE);
1064 + blake2s_update(&state, in, inlen);
1065 + blake2s_final(&state, i_hash);
1067 + for (i = 0; i < BLAKE2S_BLOCK_SIZE; ++i)
1068 + x_key[i] ^= 0x5c ^ 0x36;
1070 + blake2s_init(&state, BLAKE2S_HASH_SIZE);
1071 + blake2s_update(&state, x_key, BLAKE2S_BLOCK_SIZE);
1072 + blake2s_update(&state, i_hash, BLAKE2S_HASH_SIZE);
1073 + blake2s_final(&state, i_hash);
1075 + memcpy(out, i_hash, BLAKE2S_HASH_SIZE);
1076 + memzero_explicit(x_key, BLAKE2S_BLOCK_SIZE);
1077 + memzero_explicit(i_hash, BLAKE2S_HASH_SIZE);
1079 +EXPORT_SYMBOL(blake2s256_hmac);
1081 +static int __init mod_init(void)
1083 + if (!IS_ENABLED(CONFIG_CRYPTO_MANAGER_DISABLE_TESTS) &&
1084 + WARN_ON(!blake2s_selftest()))
1089 +static void __exit mod_exit(void)
1093 +module_init(mod_init);
1094 +module_exit(mod_exit);
1095 +MODULE_LICENSE("GPL v2");
1096 +MODULE_DESCRIPTION("BLAKE2s hash function");
1097 +MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>");