Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

crypto: blake2s - generic C library implementation and selftest

The C implementation was originally based on Samuel Neves' public
domain reference implementation but has since been heavily modified
for the kernel. We're able to do compile-time optimizations by moving
some scaffolding around the final function into the header file.

Information: https://blake2.net/

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: Samuel Neves <sneves@dei.uc.pt>
Co-developed-by: Samuel Neves <sneves@dei.uc.pt>
[ardb: - move from lib/zinc to lib/crypto
- remove simd handling
- rewrote selftest for better coverage
- use fixed digest length for blake2s_hmac() and rename to
blake2s256_hmac() ]
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Jason A. Donenfeld and committed by
Herbert Xu
66d7fb94 c12d3362

+1019
+106
include/crypto/blake2s.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 OR MIT */ 2 + /* 3 + * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. 4 + */ 5 + 6 + #ifndef BLAKE2S_H 7 + #define BLAKE2S_H 8 + 9 + #include <linux/types.h> 10 + #include <linux/kernel.h> 11 + #include <linux/string.h> 12 + 13 + #include <asm/bug.h> 14 + 15 + enum blake2s_lengths { 16 + BLAKE2S_BLOCK_SIZE = 64, 17 + BLAKE2S_HASH_SIZE = 32, 18 + BLAKE2S_KEY_SIZE = 32, 19 + 20 + BLAKE2S_128_HASH_SIZE = 16, 21 + BLAKE2S_160_HASH_SIZE = 20, 22 + BLAKE2S_224_HASH_SIZE = 28, 23 + BLAKE2S_256_HASH_SIZE = 32, 24 + }; 25 + 26 + struct blake2s_state { 27 + u32 h[8]; 28 + u32 t[2]; 29 + u32 f[2]; 30 + u8 buf[BLAKE2S_BLOCK_SIZE]; 31 + unsigned int buflen; 32 + unsigned int outlen; 33 + }; 34 + 35 + enum blake2s_iv { 36 + BLAKE2S_IV0 = 0x6A09E667UL, 37 + BLAKE2S_IV1 = 0xBB67AE85UL, 38 + BLAKE2S_IV2 = 0x3C6EF372UL, 39 + BLAKE2S_IV3 = 0xA54FF53AUL, 40 + BLAKE2S_IV4 = 0x510E527FUL, 41 + BLAKE2S_IV5 = 0x9B05688CUL, 42 + BLAKE2S_IV6 = 0x1F83D9ABUL, 43 + BLAKE2S_IV7 = 0x5BE0CD19UL, 44 + }; 45 + 46 + void blake2s_update(struct blake2s_state *state, const u8 *in, size_t inlen); 47 + void blake2s_final(struct blake2s_state *state, u8 *out); 48 + 49 + static inline void blake2s_init_param(struct blake2s_state *state, 50 + const u32 param) 51 + { 52 + *state = (struct blake2s_state){{ 53 + BLAKE2S_IV0 ^ param, 54 + BLAKE2S_IV1, 55 + BLAKE2S_IV2, 56 + BLAKE2S_IV3, 57 + BLAKE2S_IV4, 58 + BLAKE2S_IV5, 59 + BLAKE2S_IV6, 60 + BLAKE2S_IV7, 61 + }}; 62 + } 63 + 64 + static inline void blake2s_init(struct blake2s_state *state, 65 + const size_t outlen) 66 + { 67 + blake2s_init_param(state, 0x01010000 | outlen); 68 + state->outlen = outlen; 69 + } 70 + 71 + static inline void blake2s_init_key(struct blake2s_state *state, 72 + const size_t outlen, const void *key, 73 + const size_t keylen) 74 + { 75 + WARN_ON(IS_ENABLED(DEBUG) && (!outlen || outlen > BLAKE2S_HASH_SIZE || 76 + !key || !keylen || keylen > BLAKE2S_KEY_SIZE)); 77 + 78 + blake2s_init_param(state, 0x01010000 | keylen << 8 | outlen); 79 + memcpy(state->buf, key, keylen); 80 + state->buflen = BLAKE2S_BLOCK_SIZE; 81 + state->outlen = outlen; 82 + } 83 + 84 + static inline void blake2s(u8 *out, const u8 *in, const u8 *key, 85 + const size_t outlen, const size_t inlen, 86 + const size_t keylen) 87 + { 88 + struct blake2s_state state; 89 + 90 + WARN_ON(IS_ENABLED(DEBUG) && ((!in && inlen > 0) || !out || !outlen || 91 + outlen > BLAKE2S_HASH_SIZE || keylen > BLAKE2S_KEY_SIZE || 92 + (!key && keylen))); 93 + 94 + if (keylen) 95 + blake2s_init_key(&state, outlen, key, keylen); 96 + else 97 + blake2s_init(&state, outlen); 98 + 99 + blake2s_update(&state, in, inlen); 100 + blake2s_final(&state, out); 101 + } 102 + 103 + void blake2s256_hmac(u8 *out, const u8 *in, const u8 *key, const size_t inlen, 104 + const size_t keylen); 105 + 106 + #endif /* BLAKE2S_H */
+19
include/crypto/internal/blake2s.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 OR MIT */ 2 + 3 + #ifndef BLAKE2S_INTERNAL_H 4 + #define BLAKE2S_INTERNAL_H 5 + 6 + #include <crypto/blake2s.h> 7 + 8 + void blake2s_compress_generic(struct blake2s_state *state,const u8 *block, 9 + size_t nblocks, const u32 inc); 10 + 11 + void blake2s_compress_arch(struct blake2s_state *state,const u8 *block, 12 + size_t nblocks, const u32 inc); 13 + 14 + static inline void blake2s_set_lastblock(struct blake2s_state *state) 15 + { 16 + state->f[0] = -1; 17 + } 18 + 19 + #endif /* BLAKE2S_INTERNAL_H */
+25
lib/crypto/Kconfig
··· 8 8 config CRYPTO_LIB_ARC4 9 9 tristate 10 10 11 + config CRYPTO_ARCH_HAVE_LIB_BLAKE2S 12 + tristate 13 + help 14 + Declares whether the architecture provides an arch-specific 15 + accelerated implementation of the Blake2s library interface, 16 + either builtin or as a module. 17 + 18 + config CRYPTO_LIB_BLAKE2S_GENERIC 19 + tristate 20 + help 21 + This symbol can be depended upon by arch implementations of the 22 + Blake2s library interface that require the generic code as a 23 + fallback, e.g., for SIMD implementations. If no arch specific 24 + implementation is enabled, this implementation serves the users 25 + of CRYPTO_LIB_BLAKE2S. 26 + 27 + config CRYPTO_LIB_BLAKE2S 28 + tristate "BLAKE2s hash function library" 29 + depends on CRYPTO_ARCH_HAVE_LIB_BLAKE2S || !CRYPTO_ARCH_HAVE_LIB_BLAKE2S 30 + select CRYPTO_LIB_BLAKE2S_GENERIC if CRYPTO_ARCH_HAVE_LIB_BLAKE2S=n 31 + help 32 + Enable the Blake2s library interface. This interface may be fulfilled 33 + by either the generic implementation or an arch-specific one, if one 34 + is available and enabled. 35 + 11 36 config CRYPTO_ARCH_HAVE_LIB_CHACHA 12 37 tristate 13 38 help
+10
lib/crypto/Makefile
··· 10 10 obj-$(CONFIG_CRYPTO_LIB_ARC4) += libarc4.o 11 11 libarc4-y := arc4.o 12 12 13 + obj-$(CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC) += libblake2s-generic.o 14 + libblake2s-generic-y += blake2s-generic.o 15 + 16 + obj-$(CONFIG_CRYPTO_LIB_BLAKE2S) += libblake2s.o 17 + libblake2s-y += blake2s.o 18 + 13 19 obj-$(CONFIG_CRYPTO_LIB_DES) += libdes.o 14 20 libdes-y := des.o 15 21 ··· 24 18 25 19 obj-$(CONFIG_CRYPTO_LIB_SHA256) += libsha256.o 26 20 libsha256-y := sha256.o 21 + 22 + ifneq ($(CONFIG_CRYPTO_MANAGER_DISABLE_TESTS),y) 23 + libblake2s-y += blake2s-selftest.o 24 + endif
+111
lib/crypto/blake2s-generic.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 OR MIT 2 + /* 3 + * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. 4 + * 5 + * This is an implementation of the BLAKE2s hash and PRF functions. 6 + * 7 + * Information: https://blake2.net/ 8 + * 9 + */ 10 + 11 + #include <crypto/internal/blake2s.h> 12 + #include <linux/types.h> 13 + #include <linux/string.h> 14 + #include <linux/kernel.h> 15 + #include <linux/module.h> 16 + #include <linux/init.h> 17 + #include <linux/bug.h> 18 + #include <asm/unaligned.h> 19 + 20 + static const u8 blake2s_sigma[10][16] = { 21 + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, 22 + { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 }, 23 + { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 }, 24 + { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 }, 25 + { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 }, 26 + { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 }, 27 + { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 }, 28 + { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 }, 29 + { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 }, 30 + { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0 }, 31 + }; 32 + 33 + static inline void blake2s_increment_counter(struct blake2s_state *state, 34 + const u32 inc) 35 + { 36 + state->t[0] += inc; 37 + state->t[1] += (state->t[0] < inc); 38 + } 39 + 40 + void blake2s_compress_generic(struct blake2s_state *state,const u8 *block, 41 + size_t nblocks, const u32 inc) 42 + { 43 + u32 m[16]; 44 + u32 v[16]; 45 + int i; 46 + 47 + WARN_ON(IS_ENABLED(DEBUG) && 48 + (nblocks > 1 && inc != BLAKE2S_BLOCK_SIZE)); 49 + 50 + while (nblocks > 0) { 51 + blake2s_increment_counter(state, inc); 52 + memcpy(m, block, BLAKE2S_BLOCK_SIZE); 53 + le32_to_cpu_array(m, ARRAY_SIZE(m)); 54 + memcpy(v, state->h, 32); 55 + v[ 8] = BLAKE2S_IV0; 56 + v[ 9] = BLAKE2S_IV1; 57 + v[10] = BLAKE2S_IV2; 58 + v[11] = BLAKE2S_IV3; 59 + v[12] = BLAKE2S_IV4 ^ state->t[0]; 60 + v[13] = BLAKE2S_IV5 ^ state->t[1]; 61 + v[14] = BLAKE2S_IV6 ^ state->f[0]; 62 + v[15] = BLAKE2S_IV7 ^ state->f[1]; 63 + 64 + #define G(r, i, a, b, c, d) do { \ 65 + a += b + m[blake2s_sigma[r][2 * i + 0]]; \ 66 + d = ror32(d ^ a, 16); \ 67 + c += d; \ 68 + b = ror32(b ^ c, 12); \ 69 + a += b + m[blake2s_sigma[r][2 * i + 1]]; \ 70 + d = ror32(d ^ a, 8); \ 71 + c += d; \ 72 + b = ror32(b ^ c, 7); \ 73 + } while (0) 74 + 75 + #define ROUND(r) do { \ 76 + G(r, 0, v[0], v[ 4], v[ 8], v[12]); \ 77 + G(r, 1, v[1], v[ 5], v[ 9], v[13]); \ 78 + G(r, 2, v[2], v[ 6], v[10], v[14]); \ 79 + G(r, 3, v[3], v[ 7], v[11], v[15]); \ 80 + G(r, 4, v[0], v[ 5], v[10], v[15]); \ 81 + G(r, 5, v[1], v[ 6], v[11], v[12]); \ 82 + G(r, 6, v[2], v[ 7], v[ 8], v[13]); \ 83 + G(r, 7, v[3], v[ 4], v[ 9], v[14]); \ 84 + } while (0) 85 + ROUND(0); 86 + ROUND(1); 87 + ROUND(2); 88 + ROUND(3); 89 + ROUND(4); 90 + ROUND(5); 91 + ROUND(6); 92 + ROUND(7); 93 + ROUND(8); 94 + ROUND(9); 95 + 96 + #undef G 97 + #undef ROUND 98 + 99 + for (i = 0; i < 8; ++i) 100 + state->h[i] ^= v[i] ^ v[i + 8]; 101 + 102 + block += BLAKE2S_BLOCK_SIZE; 103 + --nblocks; 104 + } 105 + } 106 + 107 + EXPORT_SYMBOL(blake2s_compress_generic); 108 + 109 + MODULE_LICENSE("GPL v2"); 110 + MODULE_DESCRIPTION("BLAKE2s hash function"); 111 + MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>");
+622
lib/crypto/blake2s-selftest.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 OR MIT 2 + /* 3 + * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. 4 + */ 5 + 6 + #include <crypto/blake2s.h> 7 + #include <linux/string.h> 8 + 9 + /* 10 + * blake2s_testvecs[] generated with the program below (using libb2-dev and 11 + * libssl-dev [OpenSSL]) 12 + * 13 + * #include <blake2.h> 14 + * #include <stdint.h> 15 + * #include <stdio.h> 16 + * 17 + * #include <openssl/evp.h> 18 + * #include <openssl/hmac.h> 19 + * 20 + * #define BLAKE2S_TESTVEC_COUNT 256 21 + * 22 + * static void print_vec(const uint8_t vec[], int len) 23 + * { 24 + * int i; 25 + * 26 + * printf(" { "); 27 + * for (i = 0; i < len; i++) { 28 + * if (i && (i % 12) == 0) 29 + * printf("\n "); 30 + * printf("0x%02x, ", vec[i]); 31 + * } 32 + * printf("},\n"); 33 + * } 34 + * 35 + * int main(void) 36 + * { 37 + * uint8_t key[BLAKE2S_KEYBYTES]; 38 + * uint8_t buf[BLAKE2S_TESTVEC_COUNT]; 39 + * uint8_t hash[BLAKE2S_OUTBYTES]; 40 + * int i, j; 41 + * 42 + * key[0] = key[1] = 1; 43 + * for (i = 2; i < BLAKE2S_KEYBYTES; ++i) 44 + * key[i] = key[i - 2] + key[i - 1]; 45 + * 46 + * for (i = 0; i < BLAKE2S_TESTVEC_COUNT; ++i) 47 + * buf[i] = (uint8_t)i; 48 + * 49 + * printf("static const u8 blake2s_testvecs[][BLAKE2S_HASH_SIZE] __initconst = {\n"); 50 + * 51 + * for (i = 0; i < BLAKE2S_TESTVEC_COUNT; ++i) { 52 + * int outlen = 1 + i % BLAKE2S_OUTBYTES; 53 + * int keylen = (13 * i) % (BLAKE2S_KEYBYTES + 1); 54 + * 55 + * blake2s(hash, buf, key + BLAKE2S_KEYBYTES - keylen, outlen, i, 56 + * keylen); 57 + * print_vec(hash, outlen); 58 + * } 59 + * printf("};\n\n"); 60 + * 61 + * printf("static const u8 blake2s_hmac_testvecs[][BLAKE2S_HASH_SIZE] __initconst = {\n"); 62 + * 63 + * HMAC(EVP_blake2s256(), key, sizeof(key), buf, sizeof(buf), hash, NULL); 64 + * print_vec(hash, BLAKE2S_OUTBYTES); 65 + * 66 + * HMAC(EVP_blake2s256(), buf, sizeof(buf), key, sizeof(key), hash, NULL); 67 + * print_vec(hash, BLAKE2S_OUTBYTES); 68 + * 69 + * printf("};\n"); 70 + * 71 + * return 0; 72 + *} 73 + */ 74 + static const u8 blake2s_testvecs[][BLAKE2S_HASH_SIZE] __initconst = { 75 + { 0xa1, }, 76 + { 0x7c, 0x89, }, 77 + { 0x74, 0x0e, 0xd4, }, 78 + { 0x47, 0x0c, 0x21, 0x15, }, 79 + { 0x18, 0xd6, 0x9c, 0xa6, 0xc4, }, 80 + { 0x13, 0x5d, 0x16, 0x63, 0x2e, 0xf9, }, 81 + { 0x2c, 0xb5, 0x04, 0xb7, 0x99, 0xe2, 0x73, }, 82 + { 0x9a, 0x0f, 0xd2, 0x39, 0xd6, 0x68, 0x1b, 0x92, }, 83 + { 0xc8, 0xde, 0x7a, 0xea, 0x2f, 0xf4, 0xd2, 0xe3, 0x2b, }, 84 + { 0x5b, 0xf9, 0x43, 0x52, 0x0c, 0x12, 0xba, 0xb5, 0x93, 0x9f, }, 85 + { 0xc6, 0x2c, 0x4e, 0x80, 0xfc, 0x32, 0x5b, 0x33, 0xb8, 0xb8, 0x0a, }, 86 + { 0xa7, 0x5c, 0xfd, 0x3a, 0xcc, 0xbf, 0x90, 0xca, 0xb7, 0x97, 0xde, 0xd8, }, 87 + { 0x66, 0xca, 0x3c, 0xc4, 0x19, 0xef, 0x92, 0x66, 0x3f, 0x21, 0x8f, 0xda, 88 + 0xb7, }, 89 + { 0xba, 0xe5, 0xbb, 0x30, 0x25, 0x94, 0x6d, 0xc3, 0x89, 0x09, 0xc4, 0x25, 90 + 0x52, 0x3e, }, 91 + { 0xa2, 0xef, 0x0e, 0x52, 0x0b, 0x5f, 0xa2, 0x01, 0x6d, 0x0a, 0x25, 0xbc, 92 + 0x57, 0xe2, 0x27, }, 93 + { 0x4f, 0xe0, 0xf9, 0x52, 0x12, 0xda, 0x84, 0xb7, 0xab, 0xae, 0xb0, 0xa6, 94 + 0x47, 0x2a, 0xc7, 0xf5, }, 95 + { 0x56, 0xe7, 0xa8, 0x1c, 0x4c, 0xca, 0xed, 0x90, 0x31, 0xec, 0x87, 0x43, 96 + 0xe7, 0x72, 0x08, 0xec, 0xbe, }, 97 + { 0x7e, 0xdf, 0x80, 0x1c, 0x93, 0x33, 0xfd, 0x53, 0x44, 0xba, 0xfd, 0x96, 98 + 0xe1, 0xbb, 0xb5, 0x65, 0xa5, 0x00, }, 99 + { 0xec, 0x6b, 0xed, 0xf7, 0x7b, 0x62, 0x1d, 0x7d, 0xf4, 0x82, 0xf3, 0x1e, 100 + 0x18, 0xff, 0x2b, 0xc4, 0x06, 0x20, 0x2a, }, 101 + { 0x74, 0x98, 0xd7, 0x68, 0x63, 0xed, 0x87, 0xe4, 0x5d, 0x8d, 0x9e, 0x1d, 102 + 0xfd, 0x2a, 0xbb, 0x86, 0xac, 0xe9, 0x2a, 0x89, }, 103 + { 0x89, 0xc3, 0x88, 0xce, 0x2b, 0x33, 0x1e, 0x10, 0xd1, 0x37, 0x20, 0x86, 104 + 0x28, 0x43, 0x70, 0xd9, 0xfb, 0x96, 0xd9, 0xb5, 0xd3, }, 105 + { 0xcb, 0x56, 0x74, 0x41, 0x8d, 0x80, 0x01, 0x9a, 0x6b, 0x38, 0xe1, 0x41, 106 + 0xad, 0x9c, 0x62, 0x74, 0xce, 0x35, 0xd5, 0x6c, 0x89, 0x6e, }, 107 + { 0x79, 0xaf, 0x94, 0x59, 0x99, 0x26, 0xe1, 0xc9, 0x34, 0xfe, 0x7c, 0x22, 108 + 0xf7, 0x43, 0xd7, 0x65, 0xd4, 0x48, 0x18, 0xac, 0x3d, 0xfd, 0x93, }, 109 + { 0x85, 0x0d, 0xff, 0xb8, 0x3e, 0x87, 0x41, 0xb0, 0x95, 0xd3, 0x3d, 0x00, 110 + 0x47, 0x55, 0x9e, 0xd2, 0x69, 0xea, 0xbf, 0xe9, 0x7a, 0x2d, 0x61, 0x45, }, 111 + { 0x03, 0xe0, 0x85, 0xec, 0x54, 0xb5, 0x16, 0x53, 0xa8, 0xc4, 0x71, 0xe9, 112 + 0x6a, 0xe7, 0xcb, 0xc4, 0x15, 0x02, 0xfc, 0x34, 0xa4, 0xa4, 0x28, 0x13, 113 + 0xd1, }, 114 + { 0xe3, 0x34, 0x4b, 0xe1, 0xd0, 0x4b, 0x55, 0x61, 0x8f, 0xc0, 0x24, 0x05, 115 + 0xe6, 0xe0, 0x3d, 0x70, 0x24, 0x4d, 0xda, 0xb8, 0x91, 0x05, 0x29, 0x07, 116 + 0x01, 0x3e, }, 117 + { 0x61, 0xff, 0x01, 0x72, 0xb1, 0x4d, 0xf6, 0xfe, 0xd1, 0xd1, 0x08, 0x74, 118 + 0xe6, 0x91, 0x44, 0xeb, 0x61, 0xda, 0x40, 0xaf, 0xfc, 0x8c, 0x91, 0x6b, 119 + 0xec, 0x13, 0xed, }, 120 + { 0xd4, 0x40, 0xd2, 0xa0, 0x7f, 0xc1, 0x58, 0x0c, 0x85, 0xa0, 0x86, 0xc7, 121 + 0x86, 0xb9, 0x61, 0xc9, 0xea, 0x19, 0x86, 0x1f, 0xab, 0x07, 0xce, 0x37, 122 + 0x72, 0x67, 0x09, 0xfc, }, 123 + { 0x9e, 0xf8, 0x18, 0x67, 0x93, 0x10, 0x9b, 0x39, 0x75, 0xe8, 0x8b, 0x38, 124 + 0x82, 0x7d, 0xb8, 0xb7, 0xa5, 0xaf, 0xe6, 0x6a, 0x22, 0x5e, 0x1f, 0x9c, 125 + 0x95, 0x29, 0x19, 0xf2, 0x4b, }, 126 + { 0xc8, 0x62, 0x25, 0xf5, 0x98, 0xc9, 0xea, 0xe5, 0x29, 0x3a, 0xd3, 0x22, 127 + 0xeb, 0xeb, 0x07, 0x7c, 0x15, 0x07, 0xee, 0x15, 0x61, 0xbb, 0x05, 0x30, 128 + 0x99, 0x7f, 0x11, 0xf6, 0x0a, 0x1d, }, 129 + { 0x68, 0x70, 0xf7, 0x90, 0xa1, 0x8b, 0x1f, 0x0f, 0xbb, 0xce, 0xd2, 0x0e, 130 + 0x33, 0x1f, 0x7f, 0xa9, 0x78, 0xa8, 0xa6, 0x81, 0x66, 0xab, 0x8d, 0xcd, 131 + 0x58, 0x55, 0x3a, 0x0b, 0x7a, 0xdb, 0xb5, }, 132 + { 0xdd, 0x35, 0xd2, 0xb4, 0xf6, 0xc7, 0xea, 0xab, 0x64, 0x24, 0x4e, 0xfe, 133 + 0xe5, 0x3d, 0x4e, 0x95, 0x8b, 0x6d, 0x6c, 0xbc, 0xb0, 0xf8, 0x88, 0x61, 134 + 0x09, 0xb7, 0x78, 0xa3, 0x31, 0xfe, 0xd9, 0x2f, }, 135 + { 0x0a, }, 136 + { 0x6e, 0xd4, }, 137 + { 0x64, 0xe9, 0xd1, }, 138 + { 0x30, 0xdd, 0x71, 0xef, }, 139 + { 0x11, 0xb5, 0x0c, 0x87, 0xc9, }, 140 + { 0x06, 0x1c, 0x6d, 0x04, 0x82, 0xd0, }, 141 + { 0x5c, 0x42, 0x0b, 0xee, 0xc5, 0x9c, 0xb2, }, 142 + { 0xe8, 0x29, 0xd6, 0xb4, 0x5d, 0xf7, 0x2b, 0x93, }, 143 + { 0x18, 0xca, 0x27, 0x72, 0x43, 0x39, 0x16, 0xbc, 0x6a, }, 144 + { 0x39, 0x8f, 0xfd, 0x64, 0xf5, 0x57, 0x23, 0xb0, 0x45, 0xf8, }, 145 + { 0xbb, 0x3a, 0x78, 0x6b, 0x02, 0x1d, 0x0b, 0x16, 0xe3, 0xb2, 0x9a, }, 146 + { 0xb8, 0xb4, 0x0b, 0xe5, 0xd4, 0x1d, 0x0d, 0x85, 0x49, 0x91, 0x35, 0xfa, }, 147 + { 0x6d, 0x48, 0x2a, 0x0c, 0x42, 0x08, 0xbd, 0xa9, 0x78, 0x6f, 0x18, 0xaf, 148 + 0xe2, }, 149 + { 0x10, 0x45, 0xd4, 0x58, 0x88, 0xec, 0x4e, 0x1e, 0xf6, 0x14, 0x92, 0x64, 150 + 0x7e, 0xb0, }, 151 + { 0x8b, 0x0b, 0x95, 0xee, 0x92, 0xc6, 0x3b, 0x91, 0xf1, 0x1e, 0xeb, 0x51, 152 + 0x98, 0x0a, 0x8d, }, 153 + { 0xa3, 0x50, 0x4d, 0xa5, 0x1d, 0x03, 0x68, 0xe9, 0x57, 0x78, 0xd6, 0x04, 154 + 0xf1, 0xc3, 0x94, 0xd8, }, 155 + { 0xb8, 0x66, 0x6e, 0xdd, 0x46, 0x15, 0xae, 0x3d, 0x83, 0x7e, 0xcf, 0xe7, 156 + 0x2c, 0xe8, 0x8f, 0xc7, 0x34, }, 157 + { 0x2e, 0xc0, 0x1f, 0x29, 0xea, 0xf6, 0xb9, 0xe2, 0xc2, 0x93, 0xeb, 0x41, 158 + 0x0d, 0xf0, 0x0a, 0x13, 0x0e, 0xa2, }, 159 + { 0x71, 0xb8, 0x33, 0xa9, 0x1b, 0xac, 0xf1, 0xb5, 0x42, 0x8f, 0x5e, 0x81, 160 + 0x34, 0x43, 0xb7, 0xa4, 0x18, 0x5c, 0x47, }, 161 + { 0xda, 0x45, 0xb8, 0x2e, 0x82, 0x1e, 0xc0, 0x59, 0x77, 0x9d, 0xfa, 0xb4, 162 + 0x1c, 0x5e, 0xa0, 0x2b, 0x33, 0x96, 0x5a, 0x58, }, 163 + { 0xe3, 0x09, 0x05, 0xa9, 0xeb, 0x48, 0x13, 0xad, 0x71, 0x88, 0x81, 0x9a, 164 + 0x3e, 0x2c, 0xe1, 0x23, 0x99, 0x13, 0x35, 0x9f, 0xb5, }, 165 + { 0xb7, 0x86, 0x2d, 0x16, 0xe1, 0x04, 0x00, 0x47, 0x47, 0x61, 0x31, 0xfb, 166 + 0x14, 0xac, 0xd8, 0xe9, 0xe3, 0x49, 0xbd, 0xf7, 0x9c, 0x3f, }, 167 + { 0x7f, 0xd9, 0x95, 0xa8, 0xa7, 0xa0, 0xcc, 0xba, 0xef, 0xb1, 0x0a, 0xa9, 168 + 0x21, 0x62, 0x08, 0x0f, 0x1b, 0xff, 0x7b, 0x9d, 0xae, 0xb2, 0x95, }, 169 + { 0x85, 0x99, 0xea, 0x33, 0xe0, 0x56, 0xff, 0x13, 0xc6, 0x61, 0x8c, 0xf9, 170 + 0x57, 0x05, 0x03, 0x11, 0xf9, 0xfb, 0x3a, 0xf7, 0xce, 0xbb, 0x52, 0x30, }, 171 + { 0xb2, 0x72, 0x9c, 0xf8, 0x77, 0x4e, 0x8f, 0x6b, 0x01, 0x6c, 0xff, 0x4e, 172 + 0x4f, 0x02, 0xd2, 0xbc, 0xeb, 0x51, 0x28, 0x99, 0x50, 0xab, 0xc4, 0x42, 173 + 0xe3, }, 174 + { 0x8b, 0x0a, 0xb5, 0x90, 0x8f, 0xf5, 0x7b, 0xdd, 0xba, 0x47, 0x37, 0xc9, 175 + 0x2a, 0xd5, 0x4b, 0x25, 0x08, 0x8b, 0x02, 0x17, 0xa7, 0x9e, 0x6b, 0x6e, 176 + 0xe3, 0x90, }, 177 + { 0x90, 0xdd, 0xf7, 0x75, 0xa7, 0xa3, 0x99, 0x5e, 0x5b, 0x7d, 0x75, 0xc3, 178 + 0x39, 0x6b, 0xa0, 0xe2, 0x44, 0x53, 0xb1, 0x9e, 0xc8, 0xf1, 0x77, 0x10, 179 + 0x58, 0x06, 0x9a, }, 180 + { 0x99, 0x52, 0xf0, 0x49, 0xa8, 0x8c, 0xec, 0xa6, 0x97, 0x32, 0x13, 0xb5, 181 + 0xf7, 0xa3, 0x8e, 0xfb, 0x4b, 0x59, 0x31, 0x3d, 0x01, 0x59, 0x98, 0x5d, 182 + 0x53, 0x03, 0x1a, 0x39, }, 183 + { 0x9f, 0xe0, 0xc2, 0xe5, 0x5d, 0x93, 0xd6, 0x9b, 0x47, 0x8f, 0x9b, 0xe0, 184 + 0x26, 0x35, 0x84, 0x20, 0x1d, 0xc5, 0x53, 0x10, 0x0f, 0x22, 0xb9, 0xb5, 185 + 0xd4, 0x36, 0xb1, 0xac, 0x73, }, 186 + { 0x30, 0x32, 0x20, 0x3b, 0x10, 0x28, 0xec, 0x1f, 0x4f, 0x9b, 0x47, 0x59, 187 + 0xeb, 0x7b, 0xee, 0x45, 0xfb, 0x0c, 0x49, 0xd8, 0x3d, 0x69, 0xbd, 0x90, 188 + 0x2c, 0xf0, 0x9e, 0x8d, 0xbf, 0xd5, }, 189 + { 0x2a, 0x37, 0x73, 0x7f, 0xf9, 0x96, 0x19, 0xaa, 0x25, 0xd8, 0x13, 0x28, 190 + 0x01, 0x29, 0x89, 0xdf, 0x6e, 0x0c, 0x9b, 0x43, 0x44, 0x51, 0xe9, 0x75, 191 + 0x26, 0x0c, 0xb7, 0x87, 0x66, 0x0b, 0x5f, }, 192 + { 0x23, 0xdf, 0x96, 0x68, 0x91, 0x86, 0xd0, 0x93, 0x55, 0x33, 0x24, 0xf6, 193 + 0xba, 0x08, 0x75, 0x5b, 0x59, 0x11, 0x69, 0xb8, 0xb9, 0xe5, 0x2c, 0x77, 194 + 0x02, 0xf6, 0x47, 0xee, 0x81, 0xdd, 0xb9, 0x06, }, 195 + { 0x9d, }, 196 + { 0x9d, 0x7d, }, 197 + { 0xfd, 0xc3, 0xda, }, 198 + { 0xe8, 0x82, 0xcd, 0x21, }, 199 + { 0xc3, 0x1d, 0x42, 0x4c, 0x74, }, 200 + { 0xe9, 0xda, 0xf1, 0xa2, 0xe5, 0x7c, }, 201 + { 0x52, 0xb8, 0x6f, 0x81, 0x5c, 0x3a, 0x4c, }, 202 + { 0x5b, 0x39, 0x26, 0xfc, 0x92, 0x5e, 0xe0, 0x49, }, 203 + { 0x59, 0xe4, 0x7c, 0x93, 0x1c, 0xf9, 0x28, 0x93, 0xde, }, 204 + { 0xde, 0xdf, 0xb2, 0x43, 0x61, 0x0b, 0x86, 0x16, 0x4c, 0x2e, }, 205 + { 0x14, 0x8f, 0x75, 0x51, 0xaf, 0xb9, 0xee, 0x51, 0x5a, 0xae, 0x23, }, 206 + { 0x43, 0x5f, 0x50, 0xd5, 0x70, 0xb0, 0x5b, 0x87, 0xf5, 0xd9, 0xb3, 0x6d, }, 207 + { 0x66, 0x0a, 0x64, 0x93, 0x79, 0x71, 0x94, 0x40, 0xb7, 0x68, 0x2d, 0xd3, 208 + 0x63, }, 209 + { 0x15, 0x00, 0xc4, 0x0c, 0x7d, 0x1b, 0x10, 0xa9, 0x73, 0x1b, 0x90, 0x6f, 210 + 0xe6, 0xa9, }, 211 + { 0x34, 0x75, 0xf3, 0x86, 0x8f, 0x56, 0xcf, 0x2a, 0x0a, 0xf2, 0x62, 0x0a, 212 + 0xf6, 0x0e, 0x20, }, 213 + { 0xb1, 0xde, 0xc9, 0xf5, 0xdb, 0xf3, 0x2f, 0x4c, 0xd6, 0x41, 0x7d, 0x39, 214 + 0x18, 0x3e, 0xc7, 0xc3, }, 215 + { 0xc5, 0x89, 0xb2, 0xf8, 0xb8, 0xc0, 0xa3, 0xb9, 0x3b, 0x10, 0x6d, 0x7c, 216 + 0x92, 0xfc, 0x7f, 0x34, 0x41, }, 217 + { 0xc4, 0xd8, 0xef, 0xba, 0xef, 0xd2, 0xaa, 0xc5, 0x6c, 0x8e, 0x3e, 0xbb, 218 + 0x12, 0xfc, 0x0f, 0x72, 0xbf, 0x0f, }, 219 + { 0xdd, 0x91, 0xd1, 0x15, 0x9e, 0x7d, 0xf8, 0xc1, 0xb9, 0x14, 0x63, 0x96, 220 + 0xb5, 0xcb, 0x83, 0x1d, 0x35, 0x1c, 0xec, }, 221 + { 0xa9, 0xf8, 0x52, 0xc9, 0x67, 0x76, 0x2b, 0xad, 0xfb, 0xd8, 0x3a, 0xa6, 222 + 0x74, 0x02, 0xae, 0xb8, 0x25, 0x2c, 0x63, 0x49, }, 223 + { 0x77, 0x1f, 0x66, 0x70, 0xfd, 0x50, 0x29, 0xaa, 0xeb, 0xdc, 0xee, 0xba, 224 + 0x75, 0x98, 0xdc, 0x93, 0x12, 0x3f, 0xdc, 0x7c, 0x38, }, 225 + { 0xe2, 0xe1, 0x89, 0x5c, 0x37, 0x38, 0x6a, 0xa3, 0x40, 0xac, 0x3f, 0xb0, 226 + 0xca, 0xfc, 0xa7, 0xf3, 0xea, 0xf9, 0x0f, 0x5d, 0x8e, 0x39, }, 227 + { 0x0f, 0x67, 0xc8, 0x38, 0x01, 0xb1, 0xb7, 0xb8, 0xa2, 0xe7, 0x0a, 0x6d, 228 + 0xd2, 0x63, 0x69, 0x9e, 0xcc, 0xf0, 0xf2, 0xbe, 0x9b, 0x98, 0xdd, }, 229 + { 0x13, 0xe1, 0x36, 0x30, 0xfe, 0xc6, 0x01, 0x8a, 0xa1, 0x63, 0x96, 0x59, 230 + 0xc2, 0xa9, 0x68, 0x3f, 0x58, 0xd4, 0x19, 0x0c, 0x40, 0xf3, 0xde, 0x02, }, 231 + { 0xa3, 0x9e, 0xce, 0xda, 0x42, 0xee, 0x8c, 0x6c, 0x5a, 0x7d, 0xdc, 0x89, 232 + 0x02, 0x77, 0xdd, 0xe7, 0x95, 0xbb, 0xff, 0x0d, 0xa4, 0xb5, 0x38, 0x1e, 233 + 0xaf, }, 234 + { 0x9a, 0xf6, 0xb5, 0x9a, 0x4f, 0xa9, 0x4f, 0x2c, 0x35, 0x3c, 0x24, 0xdc, 235 + 0x97, 0x6f, 0xd9, 0xa1, 0x7d, 0x1a, 0x85, 0x0b, 0xf5, 0xda, 0x2e, 0xe7, 236 + 0xb1, 0x1d, }, 237 + { 0x84, 0x1e, 0x8e, 0x3d, 0x45, 0xa5, 0xf2, 0x27, 0xf3, 0x31, 0xfe, 0xb9, 238 + 0xfb, 0xc5, 0x45, 0x99, 0x99, 0xdd, 0x93, 0x43, 0x02, 0xee, 0x58, 0xaf, 239 + 0xee, 0x6a, 0xbe, }, 240 + { 0x07, 0x2f, 0xc0, 0xa2, 0x04, 0xc4, 0xab, 0x7c, 0x26, 0xbb, 0xa8, 0xd8, 241 + 0xe3, 0x1c, 0x75, 0x15, 0x64, 0x5d, 0x02, 0x6a, 0xf0, 0x86, 0xe9, 0xcd, 242 + 0x5c, 0xef, 0xa3, 0x25, }, 243 + { 0x2f, 0x3b, 0x1f, 0xb5, 0x91, 0x8f, 0x86, 0xe0, 0xdc, 0x31, 0x48, 0xb6, 244 + 0xa1, 0x8c, 0xfd, 0x75, 0xbb, 0x7d, 0x3d, 0xc1, 0xf0, 0x10, 0x9a, 0xd8, 245 + 0x4b, 0x0e, 0xe3, 0x94, 0x9f, }, 246 + { 0x29, 0xbb, 0x8f, 0x6c, 0xd1, 0xf2, 0xb6, 0xaf, 0xe5, 0xe3, 0x2d, 0xdc, 247 + 0x6f, 0xa4, 0x53, 0x88, 0xd8, 0xcf, 0x4d, 0x45, 0x42, 0x62, 0xdb, 0xdf, 248 + 0xf8, 0x45, 0xc2, 0x13, 0xec, 0x35, }, 249 + { 0x06, 0x3c, 0xe3, 0x2c, 0x15, 0xc6, 0x43, 0x03, 0x81, 0xfb, 0x08, 0x76, 250 + 0x33, 0xcb, 0x02, 0xc1, 0xba, 0x33, 0xe5, 0xe0, 0xd1, 0x92, 0xa8, 0x46, 251 + 0x28, 0x3f, 0x3e, 0x9d, 0x2c, 0x44, 0x54, }, 252 + { 0xea, 0xbb, 0x96, 0xf8, 0xd1, 0x8b, 0x04, 0x11, 0x40, 0x78, 0x42, 0x02, 253 + 0x19, 0xd1, 0xbc, 0x65, 0x92, 0xd3, 0xc3, 0xd6, 0xd9, 0x19, 0xe7, 0xc3, 254 + 0x40, 0x97, 0xbd, 0xd4, 0xed, 0xfa, 0x5e, 0x28, }, 255 + { 0x02, }, 256 + { 0x52, 0xa8, }, 257 + { 0x38, 0x25, 0x0d, }, 258 + { 0xe3, 0x04, 0xd4, 0x92, }, 259 + { 0x97, 0xdb, 0xf7, 0x81, 0xca, }, 260 + { 0x8a, 0x56, 0x9d, 0x62, 0x56, 0xcc, }, 261 + { 0xa1, 0x8e, 0x3c, 0x72, 0x8f, 0x63, 0x03, }, 262 + { 0xf7, 0xf3, 0x39, 0x09, 0x0a, 0xa1, 0xbb, 0x23, }, 263 + { 0x6b, 0x03, 0xc0, 0xe9, 0xd9, 0x83, 0x05, 0x22, 0x01, }, 264 + { 0x1b, 0x4b, 0xf5, 0xd6, 0x4f, 0x05, 0x75, 0x91, 0x4c, 0x7f, }, 265 + { 0x4c, 0x8c, 0x25, 0x20, 0x21, 0xcb, 0xc2, 0x4b, 0x3a, 0x5b, 0x8d, }, 266 + { 0x56, 0xe2, 0x77, 0xa0, 0xb6, 0x9f, 0x81, 0xec, 0x83, 0x75, 0xc4, 0xf9, }, 267 + { 0x71, 0x70, 0x0f, 0xad, 0x4d, 0x35, 0x81, 0x9d, 0x88, 0x69, 0xf9, 0xaa, 268 + 0xd3, }, 269 + { 0x50, 0x6e, 0x86, 0x6e, 0x43, 0xc0, 0xc2, 0x44, 0xc2, 0xe2, 0xa0, 0x1c, 270 + 0xb7, 0x9a, }, 271 + { 0xe4, 0x7e, 0x72, 0xc6, 0x12, 0x8e, 0x7c, 0xfc, 0xbd, 0xe2, 0x08, 0x31, 272 + 0x3d, 0x47, 0x3d, }, 273 + { 0x08, 0x97, 0x5b, 0x80, 0xae, 0xc4, 0x1d, 0x50, 0x77, 0xdf, 0x1f, 0xd0, 274 + 0x24, 0xf0, 0x17, 0xc0, }, 275 + { 0x01, 0xb6, 0x29, 0xf4, 0xaf, 0x78, 0x5f, 0xb6, 0x91, 0xdd, 0x76, 0x76, 276 + 0xd2, 0xfd, 0x0c, 0x47, 0x40, }, 277 + { 0xa1, 0xd8, 0x09, 0x97, 0x7a, 0xa6, 0xc8, 0x94, 0xf6, 0x91, 0x7b, 0xae, 278 + 0x2b, 0x9f, 0x0d, 0x83, 0x48, 0xf7, }, 279 + { 0x12, 0xd5, 0x53, 0x7d, 0x9a, 0xb0, 0xbe, 0xd9, 0xed, 0xe9, 0x9e, 0xee, 280 + 0x61, 0x5b, 0x42, 0xf2, 0xc0, 0x73, 0xc0, }, 281 + { 0xd5, 0x77, 0xd6, 0x5c, 0x6e, 0xa5, 0x69, 0x2b, 0x3b, 0x8c, 0xd6, 0x7d, 282 + 0x1d, 0xbe, 0x2c, 0xa1, 0x02, 0x21, 0xcd, 0x29, }, 283 + { 0xa4, 0x98, 0x80, 0xca, 0x22, 0xcf, 0x6a, 0xab, 0x5e, 0x40, 0x0d, 0x61, 284 + 0x08, 0x21, 0xef, 0xc0, 0x6c, 0x52, 0xb4, 0xb0, 0x53, }, 285 + { 0xbf, 0xaf, 0x8f, 0x3b, 0x7a, 0x97, 0x33, 0xe5, 0xca, 0x07, 0x37, 0xfd, 286 + 0x15, 0xdf, 0xce, 0x26, 0x2a, 0xb1, 0xa7, 0x0b, 0xb3, 0xac, }, 287 + { 0x16, 0x22, 0xe1, 0xbc, 0x99, 0x4e, 0x01, 0xf0, 0xfa, 0xff, 0x8f, 0xa5, 288 + 0x0c, 0x61, 0xb0, 0xad, 0xcc, 0xb1, 0xe1, 0x21, 0x46, 0xfa, 0x2e, }, 289 + { 0x11, 0x5b, 0x0b, 0x2b, 0xe6, 0x14, 0xc1, 0xd5, 0x4d, 0x71, 0x5e, 0x17, 290 + 0xea, 0x23, 0xdd, 0x6c, 0xbd, 0x1d, 0xbe, 0x12, 0x1b, 0xee, 0x4c, 0x1a, }, 291 + { 0x40, 0x88, 0x22, 0xf3, 0x20, 0x6c, 0xed, 0xe1, 0x36, 0x34, 0x62, 0x2c, 292 + 0x98, 0x83, 0x52, 0xe2, 0x25, 0xee, 0xe9, 0xf5, 0xe1, 0x17, 0xf0, 0x5c, 293 + 0xae, }, 294 + { 0xc3, 0x76, 0x37, 0xde, 0x95, 0x8c, 0xca, 0x2b, 0x0c, 0x23, 0xe7, 0xb5, 295 + 0x38, 0x70, 0x61, 0xcc, 0xff, 0xd3, 0x95, 0x7b, 0xf3, 0xff, 0x1f, 0x9d, 296 + 0x59, 0x00, }, 297 + { 0x0c, 0x19, 0x52, 0x05, 0x22, 0x53, 0xcb, 0x48, 0xd7, 0x10, 0x0e, 0x7e, 298 + 0x14, 0x69, 0xb5, 0xa2, 0x92, 0x43, 0xa3, 0x9e, 0x4b, 0x8f, 0x51, 0x2c, 299 + 0x5a, 0x2c, 0x3b, }, 300 + { 0xe1, 0x9d, 0x70, 0x70, 0x28, 0xec, 0x86, 0x40, 0x55, 0x33, 0x56, 0xda, 301 + 0x88, 0xca, 0xee, 0xc8, 0x6a, 0x20, 0xb1, 0xe5, 0x3d, 0x57, 0xf8, 0x3c, 302 + 0x10, 0x07, 0x2a, 0xc4, }, 303 + { 0x0b, 0xae, 0xf1, 0xc4, 0x79, 0xee, 0x1b, 0x3d, 0x27, 0x35, 0x8d, 0x14, 304 + 0xd6, 0xae, 0x4e, 0x3c, 0xe9, 0x53, 0x50, 0xb5, 0xcc, 0x0c, 0xf7, 0xdf, 305 + 0xee, 0xa1, 0x74, 0xd6, 0x71, }, 306 + { 0xe6, 0xa4, 0xf4, 0x99, 0x98, 0xb9, 0x80, 0xea, 0x96, 0x7f, 0x4f, 0x33, 307 + 0xcf, 0x74, 0x25, 0x6f, 0x17, 0x6c, 0xbf, 0xf5, 0x5c, 0x38, 0xd0, 0xff, 308 + 0x96, 0xcb, 0x13, 0xf9, 0xdf, 0xfd, }, 309 + { 0xbe, 0x92, 0xeb, 0xba, 0x44, 0x2c, 0x24, 0x74, 0xd4, 0x03, 0x27, 0x3c, 310 + 0x5d, 0x5b, 0x03, 0x30, 0x87, 0x63, 0x69, 0xe0, 0xb8, 0x94, 0xf4, 0x44, 311 + 0x7e, 0xad, 0xcd, 0x20, 0x12, 0x16, 0x79, }, 312 + { 0x30, 0xf1, 0xc4, 0x8e, 0x05, 0x90, 0x2a, 0x97, 0x63, 0x94, 0x46, 0xff, 313 + 0xce, 0xd8, 0x67, 0xa7, 0xac, 0x33, 0x8c, 0x95, 0xb7, 0xcd, 0xa3, 0x23, 314 + 0x98, 0x9d, 0x76, 0x6c, 0x9d, 0xa8, 0xd6, 0x8a, }, 315 + { 0xbe, }, 316 + { 0x17, 0x6c, }, 317 + { 0x1a, 0x42, 0x4f, }, 318 + { 0xba, 0xaf, 0xb7, 0x65, }, 319 + { 0xc2, 0x63, 0x43, 0x6a, 0xea, }, 320 + { 0xe4, 0x4d, 0xad, 0xf2, 0x0b, 0x02, }, 321 + { 0x04, 0xc7, 0xc4, 0x7f, 0xa9, 0x2b, 0xce, }, 322 + { 0x66, 0xf6, 0x67, 0xcb, 0x03, 0x53, 0xc8, 0xf1, }, 323 + { 0x56, 0xa3, 0x60, 0x78, 0xc9, 0x5f, 0x70, 0x1b, 0x5e, }, 324 + { 0x99, 0xff, 0x81, 0x7c, 0x13, 0x3c, 0x29, 0x79, 0x4b, 0x65, }, 325 + { 0x51, 0x10, 0x50, 0x93, 0x01, 0x93, 0xb7, 0x01, 0xc9, 0x18, 0xb7, }, 326 + { 0x8e, 0x3c, 0x42, 0x1e, 0x5e, 0x7d, 0xc1, 0x50, 0x70, 0x1f, 0x00, 0x98, }, 327 + { 0x5f, 0xd9, 0x9b, 0xc8, 0xd7, 0xb2, 0x72, 0x62, 0x1a, 0x1e, 0xba, 0x92, 328 + 0xe9, }, 329 + { 0x70, 0x2b, 0xba, 0xfe, 0xad, 0x5d, 0x96, 0x3f, 0x27, 0xc2, 0x41, 0x6d, 330 + 0xc4, 0xb3, }, 331 + { 0xae, 0xe0, 0xd5, 0xd4, 0xc7, 0xae, 0x15, 0x5e, 0xdc, 0xdd, 0x33, 0x60, 332 + 0xd7, 0xd3, 0x5e, }, 333 + { 0x79, 0x8e, 0xbc, 0x9e, 0x20, 0xb9, 0x19, 0x4b, 0x63, 0x80, 0xf3, 0x16, 334 + 0xaf, 0x39, 0xbd, 0x92, }, 335 + { 0xc2, 0x0e, 0x85, 0xa0, 0x0b, 0x9a, 0xb0, 0xec, 0xde, 0x38, 0xd3, 0x10, 336 + 0xd9, 0xa7, 0x66, 0x27, 0xcf, }, 337 + { 0x0e, 0x3b, 0x75, 0x80, 0x67, 0x14, 0x0c, 0x02, 0x90, 0xd6, 0xb3, 0x02, 338 + 0x81, 0xf6, 0xa6, 0x87, 0xce, 0x58, }, 339 + { 0x79, 0xb5, 0xe9, 0x5d, 0x52, 0x4d, 0xf7, 0x59, 0xf4, 0x2e, 0x27, 0xdd, 340 + 0xb3, 0xed, 0x57, 0x5b, 0x82, 0xea, 0x6f, }, 341 + { 0xa2, 0x97, 0xf5, 0x80, 0x02, 0x3d, 0xde, 0xa3, 0xf9, 0xf6, 0xab, 0xe3, 342 + 0x57, 0x63, 0x7b, 0x9b, 0x10, 0x42, 0x6f, 0xf2, }, 343 + { 0x12, 0x7a, 0xfc, 0xb7, 0x67, 0x06, 0x0c, 0x78, 0x1a, 0xfe, 0x88, 0x4f, 344 + 0xc6, 0xac, 0x52, 0x96, 0x64, 0x28, 0x97, 0x84, 0x06, }, 345 + { 0xc5, 0x04, 0x44, 0x6b, 0xb2, 0xa5, 0xa4, 0x66, 0xe1, 0x76, 0xa2, 0x51, 346 + 0xf9, 0x59, 0x69, 0x97, 0x56, 0x0b, 0xbf, 0x50, 0xb3, 0x34, }, 347 + { 0x21, 0x32, 0x6b, 0x42, 0xb5, 0xed, 0x71, 0x8d, 0xf7, 0x5a, 0x35, 0xe3, 348 + 0x90, 0xe2, 0xee, 0xaa, 0x89, 0xf6, 0xc9, 0x9c, 0x4d, 0x73, 0xf4, }, 349 + { 0x4c, 0xa6, 0x09, 0xf4, 0x48, 0xe7, 0x46, 0xbc, 0x49, 0xfc, 0xe5, 0xda, 350 + 0xd1, 0x87, 0x13, 0x17, 0x4c, 0x59, 0x71, 0x26, 0x5b, 0x2c, 0x42, 0xb7, }, 351 + { 0x13, 0x63, 0xf3, 0x40, 0x02, 0xe5, 0xa3, 0x3a, 0x5e, 0x8e, 0xf8, 0xb6, 352 + 0x8a, 0x49, 0x60, 0x76, 0x34, 0x72, 0x94, 0x73, 0xf6, 0xd9, 0x21, 0x6a, 353 + 0x26, }, 354 + { 0xdf, 0x75, 0x16, 0x10, 0x1b, 0x5e, 0x81, 0xc3, 0xc8, 0xde, 0x34, 0x24, 355 + 0xb0, 0x98, 0xeb, 0x1b, 0x8f, 0xa1, 0x9b, 0x05, 0xee, 0xa5, 0xe9, 0x35, 356 + 0xf4, 0x1d, }, 357 + { 0xcd, 0x21, 0x93, 0x6e, 0x5b, 0xa0, 0x26, 0x2b, 0x21, 0x0e, 0xa0, 0xb9, 358 + 0x1c, 0xb5, 0xbb, 0xb8, 0xf8, 0x1e, 0xff, 0x5c, 0xa8, 0xf9, 0x39, 0x46, 359 + 0x4e, 0x29, 0x26, }, 360 + { 0x73, 0x7f, 0x0e, 0x3b, 0x0b, 0x5c, 0xf9, 0x60, 0xaa, 0x88, 0xa1, 0x09, 361 + 0xb1, 0x5d, 0x38, 0x7b, 0x86, 0x8f, 0x13, 0x7a, 0x8d, 0x72, 0x7a, 0x98, 362 + 0x1a, 0x5b, 0xff, 0xc9, }, 363 + { 0xd3, 0x3c, 0x61, 0x71, 0x44, 0x7e, 0x31, 0x74, 0x98, 0x9d, 0x9a, 0xd2, 364 + 0x27, 0xf3, 0x46, 0x43, 0x42, 0x51, 0xd0, 0x5f, 0xe9, 0x1c, 0x5c, 0x69, 365 + 0xbf, 0xf6, 0xbe, 0x3c, 0x40, }, 366 + { 0x31, 0x99, 0x31, 0x9f, 0xaa, 0x43, 0x2e, 0x77, 0x3e, 0x74, 0x26, 0x31, 367 + 0x5e, 0x61, 0xf1, 0x87, 0xe2, 0xeb, 0x9b, 0xcd, 0xd0, 0x3a, 0xee, 0x20, 368 + 0x7e, 0x10, 0x0a, 0x0b, 0x7e, 0xfa, }, 369 + { 0xa4, 0x27, 0x80, 0x67, 0x81, 0x2a, 0xa7, 0x62, 0xf7, 0x6e, 0xda, 0xd4, 370 + 0x5c, 0x39, 0x74, 0xad, 0x7e, 0xbe, 0xad, 0xa5, 0x84, 0x7f, 0xa9, 0x30, 371 + 0x5d, 0xdb, 0xe2, 0x05, 0x43, 0xf7, 0x1b, }, 372 + { 0x0b, 0x37, 0xd8, 0x02, 0xe1, 0x83, 0xd6, 0x80, 0xf2, 0x35, 0xc2, 0xb0, 373 + 0x37, 0xef, 0xef, 0x5e, 0x43, 0x93, 0xf0, 0x49, 0x45, 0x0a, 0xef, 0xb5, 374 + 0x76, 0x70, 0x12, 0x44, 0xc4, 0xdb, 0xf5, 0x7a, }, 375 + { 0x1f, }, 376 + { 0x82, 0x60, }, 377 + { 0xcc, 0xe3, 0x08, }, 378 + { 0x56, 0x17, 0xe4, 0x59, }, 379 + { 0xe2, 0xd7, 0x9e, 0xc4, 0x4c, }, 380 + { 0xb2, 0xad, 0xd3, 0x78, 0x58, 0x5a, }, 381 + { 0xce, 0x43, 0xb4, 0x02, 0x96, 0xab, 0x3c, }, 382 + { 0xe6, 0x05, 0x1a, 0x73, 0x22, 0x32, 0xbb, 0x77, }, 383 + { 0x23, 0xe7, 0xda, 0xfe, 0x2c, 0xef, 0x8c, 0x22, 0xec, }, 384 + { 0xe9, 0x8e, 0x55, 0x38, 0xd1, 0xd7, 0x35, 0x23, 0x98, 0xc7, }, 385 + { 0xb5, 0x81, 0x1a, 0xe5, 0xb5, 0xa5, 0xd9, 0x4d, 0xca, 0x41, 0xe7, }, 386 + { 0x41, 0x16, 0x16, 0x95, 0x8d, 0x9e, 0x0c, 0xea, 0x8c, 0x71, 0x9a, 0xc1, }, 387 + { 0x7c, 0x33, 0xc0, 0xa4, 0x00, 0x62, 0xea, 0x60, 0x67, 0xe4, 0x20, 0xbc, 388 + 0x5b, }, 389 + { 0xdb, 0xb1, 0xdc, 0xfd, 0x08, 0xc0, 0xde, 0x82, 0xd1, 0xde, 0x38, 0xc0, 390 + 0x90, 0x48, }, 391 + { 0x37, 0x18, 0x2e, 0x0d, 0x61, 0xaa, 0x61, 0xd7, 0x86, 0x20, 0x16, 0x60, 392 + 0x04, 0xd9, 0xd5, }, 393 + { 0xb0, 0xcf, 0x2c, 0x4c, 0x5e, 0x5b, 0x4f, 0x2a, 0x23, 0x25, 0x58, 0x47, 394 + 0xe5, 0x31, 0x06, 0x70, }, 395 + { 0x91, 0xa0, 0xa3, 0x86, 0x4e, 0xe0, 0x72, 0x38, 0x06, 0x67, 0x59, 0x5c, 396 + 0x70, 0x25, 0xdb, 0x33, 0x27, }, 397 + { 0x44, 0x58, 0x66, 0xb8, 0x58, 0xc7, 0x13, 0xed, 0x4c, 0xc0, 0xf4, 0x9a, 398 + 0x1e, 0x67, 0x75, 0x33, 0xb6, 0xb8, }, 399 + { 0x7f, 0x98, 0x4a, 0x8e, 0x50, 0xa2, 0x5c, 0xcd, 0x59, 0xde, 0x72, 0xb3, 400 + 0x9d, 0xc3, 0x09, 0x8a, 0xab, 0x56, 0xf1, }, 401 + { 0x80, 0x96, 0x49, 0x1a, 0x59, 0xa2, 0xc5, 0xd5, 0xa7, 0x20, 0x8a, 0xb7, 402 + 0x27, 0x62, 0x84, 0x43, 0xc6, 0xe1, 0x1b, 0x5d, }, 403 + { 0x6b, 0xb7, 0x2b, 0x26, 0x62, 0x14, 0x70, 0x19, 0x3d, 0x4d, 0xac, 0xac, 404 + 0x63, 0x58, 0x5e, 0x94, 0xb5, 0xb7, 0xe8, 0xe8, 0xa2, }, 405 + { 0x20, 0xa8, 0xc0, 0xfd, 0x63, 0x3d, 0x6e, 0x98, 0xcf, 0x0c, 0x49, 0x98, 406 + 0xe4, 0x5a, 0xfe, 0x8c, 0xaa, 0x70, 0x82, 0x1c, 0x7b, 0x74, }, 407 + { 0xc8, 0xe8, 0xdd, 0xdf, 0x69, 0x30, 0x01, 0xc2, 0x0f, 0x7e, 0x2f, 0x11, 408 + 0xcc, 0x3e, 0x17, 0xa5, 0x69, 0x40, 0x3f, 0x0e, 0x79, 0x7f, 0xcf, }, 409 + { 0xdb, 0x61, 0xc0, 0xe2, 0x2e, 0x49, 0x07, 0x31, 0x1d, 0x91, 0x42, 0x8a, 410 + 0xfc, 0x5e, 0xd3, 0xf8, 0x56, 0x1f, 0x2b, 0x73, 0xfd, 0x9f, 0xb2, 0x8e, }, 411 + { 0x0c, 0x89, 0x55, 0x0c, 0x1f, 0x59, 0x2c, 0x9d, 0x1b, 0x29, 0x1d, 0x41, 412 + 0x1d, 0xe6, 0x47, 0x8f, 0x8c, 0x2b, 0xea, 0x8f, 0xf0, 0xff, 0x21, 0x70, 413 + 0x88, }, 414 + { 0x12, 0x18, 0x95, 0xa6, 0x59, 0xb1, 0x31, 0x24, 0x45, 0x67, 0x55, 0xa4, 415 + 0x1a, 0x2d, 0x48, 0x67, 0x1b, 0x43, 0x88, 0x2d, 0x8e, 0xa0, 0x70, 0xb3, 416 + 0xc6, 0xbb, }, 417 + { 0xe7, 0xb1, 0x1d, 0xb2, 0x76, 0x4d, 0x68, 0x68, 0x68, 0x23, 0x02, 0x55, 418 + 0x3a, 0xe2, 0xe5, 0xd5, 0x4b, 0x43, 0xf9, 0x34, 0x77, 0x5c, 0xa1, 0xf5, 419 + 0x55, 0xfd, 0x4f, }, 420 + { 0x8c, 0x87, 0x5a, 0x08, 0x3a, 0x73, 0xad, 0x61, 0xe1, 0xe7, 0x99, 0x7e, 421 + 0xf0, 0x5d, 0xe9, 0x5d, 0x16, 0x43, 0x80, 0x2f, 0xd0, 0x66, 0x34, 0xe2, 422 + 0x42, 0x64, 0x3b, 0x1a, }, 423 + { 0x39, 0xc1, 0x99, 0xcf, 0x22, 0xbf, 0x16, 0x8f, 0x9f, 0x80, 0x7f, 0x95, 424 + 0x0a, 0x05, 0x67, 0x27, 0xe7, 0x15, 0xdf, 0x9d, 0xb2, 0xfe, 0x1c, 0xb5, 425 + 0x1d, 0x60, 0x8f, 0x8a, 0x1d, }, 426 + { 0x9b, 0x6e, 0x08, 0x09, 0x06, 0x73, 0xab, 0x68, 0x02, 0x62, 0x1a, 0xe4, 427 + 0xd4, 0xdf, 0xc7, 0x02, 0x4c, 0x6a, 0x5f, 0xfd, 0x23, 0xac, 0xae, 0x6d, 428 + 0x43, 0xa4, 0x7a, 0x50, 0x60, 0x3c, }, 429 + { 0x1d, 0xb4, 0xc6, 0xe1, 0xb1, 0x4b, 0xe3, 0xf2, 0xe2, 0x1a, 0x73, 0x1b, 430 + 0xa0, 0x92, 0xa7, 0xf5, 0xff, 0x8f, 0x8b, 0x5d, 0xdf, 0xa8, 0x04, 0xb3, 431 + 0xb0, 0xf7, 0xcc, 0x12, 0xfa, 0x35, 0x46, }, 432 + { 0x49, 0x45, 0x97, 0x11, 0x0f, 0x1c, 0x60, 0x8e, 0xe8, 0x47, 0x30, 0xcf, 433 + 0x60, 0xa8, 0x71, 0xc5, 0x1b, 0xe9, 0x39, 0x4d, 0x49, 0xb6, 0x12, 0x1f, 434 + 0x24, 0xab, 0x37, 0xff, 0x83, 0xc2, 0xe1, 0x3a, }, 435 + { 0x60, }, 436 + { 0x24, 0x26, }, 437 + { 0x47, 0xeb, 0xc9, }, 438 + { 0x4a, 0xd0, 0xbc, 0xf0, }, 439 + { 0x8e, 0x2b, 0xc9, 0x85, 0x3c, }, 440 + { 0xa2, 0x07, 0x15, 0xb8, 0x12, 0x74, }, 441 + { 0x0f, 0xdb, 0x5b, 0x33, 0x69, 0xfe, 0x4b, }, 442 + { 0xa2, 0x86, 0x54, 0xf4, 0xfd, 0xb2, 0xd4, 0xe6, }, 443 + { 0xbb, 0x84, 0x78, 0x49, 0x27, 0x8e, 0x61, 0xda, 0x60, }, 444 + { 0x04, 0xc3, 0xcd, 0xaa, 0x8f, 0xa7, 0x03, 0xc9, 0xf9, 0xb6, }, 445 + { 0xf8, 0x27, 0x1d, 0x61, 0xdc, 0x21, 0x42, 0xdd, 0xad, 0x92, 0x40, }, 446 + { 0x12, 0x87, 0xdf, 0xc2, 0x41, 0x45, 0x5a, 0x36, 0x48, 0x5b, 0x51, 0x2b, }, 447 + { 0xbb, 0x37, 0x5d, 0x1f, 0xf1, 0x68, 0x7a, 0xc4, 0xa5, 0xd2, 0xa4, 0x91, 448 + 0x8d, }, 449 + { 0x5b, 0x27, 0xd1, 0x04, 0x54, 0x52, 0x9f, 0xa3, 0x47, 0x86, 0x33, 0x33, 450 + 0xbf, 0xa0, }, 451 + { 0xcf, 0x04, 0xea, 0xf8, 0x03, 0x2a, 0x43, 0xff, 0xa6, 0x68, 0x21, 0x4c, 452 + 0xd5, 0x4b, 0xed, }, 453 + { 0xaf, 0xb8, 0xbc, 0x63, 0x0f, 0x18, 0x4d, 0xe2, 0x7a, 0xdd, 0x46, 0x44, 454 + 0xc8, 0x24, 0x0a, 0xb7, }, 455 + { 0x3e, 0xdc, 0x36, 0xe4, 0x89, 0xb1, 0xfa, 0xc6, 0x40, 0x93, 0x2e, 0x75, 456 + 0xb2, 0x15, 0xd1, 0xb1, 0x10, }, 457 + { 0x6c, 0xd8, 0x20, 0x3b, 0x82, 0x79, 0xf9, 0xc8, 0xbc, 0x9d, 0xe0, 0x35, 458 + 0xbe, 0x1b, 0x49, 0x1a, 0xbc, 0x3a, }, 459 + { 0x78, 0x65, 0x2c, 0xbe, 0x35, 0x67, 0xdc, 0x78, 0xd4, 0x41, 0xf6, 0xc9, 460 + 0xde, 0xde, 0x1f, 0x18, 0x13, 0x31, 0x11, }, 461 + { 0x8a, 0x7f, 0xb1, 0x33, 0x8f, 0x0c, 0x3c, 0x0a, 0x06, 0x61, 0xf0, 0x47, 462 + 0x29, 0x1b, 0x29, 0xbc, 0x1c, 0x47, 0xef, 0x7a, }, 463 + { 0x65, 0x91, 0xf1, 0xe6, 0xb3, 0x96, 0xd3, 0x8c, 0xc2, 0x4a, 0x59, 0x35, 464 + 0x72, 0x8e, 0x0b, 0x9a, 0x87, 0xca, 0x34, 0x7b, 0x63, }, 465 + { 0x5f, 0x08, 0x87, 0x80, 0x56, 0x25, 0x89, 0x77, 0x61, 0x8c, 0x64, 0xa1, 466 + 0x59, 0x6d, 0x59, 0x62, 0xe8, 0x4a, 0xc8, 0x58, 0x99, 0xd1, }, 467 + { 0x23, 0x87, 0x1d, 0xed, 0x6f, 0xf2, 0x91, 0x90, 0xe2, 0xfe, 0x43, 0x21, 468 + 0xaf, 0x97, 0xc6, 0xbc, 0xd7, 0x15, 0xc7, 0x2d, 0x08, 0x77, 0x91, }, 469 + { 0x90, 0x47, 0x9a, 0x9e, 0x3a, 0xdf, 0xf3, 0xc9, 0x4c, 0x1e, 0xa7, 0xd4, 470 + 0x6a, 0x32, 0x90, 0xfe, 0xb7, 0xb6, 0x7b, 0xfa, 0x96, 0x61, 0xfb, 0xa4, }, 471 + { 0xb1, 0x67, 0x60, 0x45, 0xb0, 0x96, 0xc5, 0x15, 0x9f, 0x4d, 0x26, 0xd7, 472 + 0x9d, 0xf1, 0xf5, 0x6d, 0x21, 0x00, 0x94, 0x31, 0x64, 0x94, 0xd3, 0xa7, 473 + 0xd3, }, 474 + { 0x02, 0x3e, 0xaf, 0xf3, 0x79, 0x73, 0xa5, 0xf5, 0xcc, 0x7a, 0x7f, 0xfb, 475 + 0x79, 0x2b, 0x85, 0x8c, 0x88, 0x72, 0x06, 0xbe, 0xfe, 0xaf, 0xc1, 0x16, 476 + 0xa6, 0xd6, }, 477 + { 0x2a, 0xb0, 0x1a, 0xe5, 0xaa, 0x6e, 0xb3, 0xae, 0x53, 0x85, 0x33, 0x80, 478 + 0x75, 0xae, 0x30, 0xe6, 0xb8, 0x72, 0x42, 0xf6, 0x25, 0x4f, 0x38, 0x88, 479 + 0x55, 0xd1, 0xa9, }, 480 + { 0x90, 0xd8, 0x0c, 0xc0, 0x93, 0x4b, 0x4f, 0x9e, 0x65, 0x6c, 0xa1, 0x54, 481 + 0xa6, 0xf6, 0x6e, 0xca, 0xd2, 0xbb, 0x7e, 0x6a, 0x1c, 0xd3, 0xce, 0x46, 482 + 0xef, 0xb0, 0x00, 0x8d, }, 483 + { 0xed, 0x9c, 0x49, 0xcd, 0xc2, 0xde, 0x38, 0x0e, 0xe9, 0x98, 0x6c, 0xc8, 484 + 0x90, 0x9e, 0x3c, 0xd4, 0xd3, 0xeb, 0x88, 0x32, 0xc7, 0x28, 0xe3, 0x94, 485 + 0x1c, 0x9f, 0x8b, 0xf3, 0xcb, }, 486 + { 0xac, 0xe7, 0x92, 0x16, 0xb4, 0x14, 0xa0, 0xe4, 0x04, 0x79, 0xa2, 0xf4, 487 + 0x31, 0xe6, 0x0c, 0x26, 0xdc, 0xbf, 0x2f, 0x69, 0x1b, 0x55, 0x94, 0x67, 488 + 0xda, 0x0c, 0xd7, 0x32, 0x1f, 0xef, }, 489 + { 0x68, 0x63, 0x85, 0x57, 0x95, 0x9e, 0x42, 0x27, 0x41, 0x43, 0x42, 0x02, 490 + 0xa5, 0x78, 0xa7, 0xc6, 0x43, 0xc1, 0x6a, 0xba, 0x70, 0x80, 0xcd, 0x04, 491 + 0xb6, 0x78, 0x76, 0x29, 0xf3, 0xe8, 0xa0, }, 492 + { 0xe6, 0xac, 0x8d, 0x9d, 0xf0, 0xc0, 0xf7, 0xf7, 0xe3, 0x3e, 0x4e, 0x28, 493 + 0x0f, 0x59, 0xb2, 0x67, 0x9e, 0x84, 0x34, 0x42, 0x96, 0x30, 0x2b, 0xca, 494 + 0x49, 0xb6, 0xc5, 0x9a, 0x84, 0x59, 0xa7, 0x81, }, 495 + { 0x7e, }, 496 + { 0x1e, 0x21, }, 497 + { 0x26, 0xd3, 0xdd, }, 498 + { 0x2c, 0xd4, 0xb3, 0x3d, }, 499 + { 0x86, 0x7b, 0x76, 0x3c, 0xf0, }, 500 + { 0x12, 0xc3, 0x70, 0x1d, 0x55, 0x18, }, 501 + { 0x96, 0xc2, 0xbd, 0x61, 0x55, 0xf4, 0x24, }, 502 + { 0x20, 0x51, 0xf7, 0x86, 0x58, 0x8f, 0x07, 0x2a, }, 503 + { 0x93, 0x15, 0xa8, 0x1d, 0xda, 0x97, 0xee, 0x0e, 0x6c, }, 504 + { 0x39, 0x93, 0xdf, 0xd5, 0x0e, 0xca, 0xdc, 0x7a, 0x92, 0xce, }, 505 + { 0x60, 0xd5, 0xfd, 0xf5, 0x1b, 0x26, 0x82, 0x26, 0x73, 0x02, 0xbc, }, 506 + { 0x98, 0xf2, 0x34, 0xe1, 0xf5, 0xfb, 0x00, 0xac, 0x10, 0x4a, 0x38, 0x9f, }, 507 + { 0xda, 0x3a, 0x92, 0x8a, 0xd0, 0xcd, 0x12, 0xcd, 0x15, 0xbb, 0xab, 0x77, 508 + 0x66, }, 509 + { 0xa2, 0x92, 0x1a, 0xe5, 0xca, 0x0c, 0x30, 0x75, 0xeb, 0xaf, 0x00, 0x31, 510 + 0x55, 0x66, }, 511 + { 0x06, 0xea, 0xfd, 0x3e, 0x86, 0x38, 0x62, 0x4e, 0xa9, 0x12, 0xa4, 0x12, 512 + 0x43, 0xbf, 0xa1, }, 513 + { 0xe4, 0x71, 0x7b, 0x94, 0xdb, 0xa0, 0xd2, 0xff, 0x9b, 0xeb, 0xad, 0x8e, 514 + 0x95, 0x8a, 0xc5, 0xed, }, 515 + { 0x25, 0x5a, 0x77, 0x71, 0x41, 0x0e, 0x7a, 0xe9, 0xed, 0x0c, 0x10, 0xef, 516 + 0xf6, 0x2b, 0x3a, 0xba, 0x60, }, 517 + { 0xee, 0xe2, 0xa3, 0x67, 0x64, 0x1d, 0xc6, 0x04, 0xc4, 0xe1, 0x68, 0xd2, 518 + 0x6e, 0xd2, 0x91, 0x75, 0x53, 0x07, }, 519 + { 0xe0, 0xf6, 0x4d, 0x8f, 0x68, 0xfc, 0x06, 0x7e, 0x18, 0x79, 0x7f, 0x2b, 520 + 0x6d, 0xef, 0x46, 0x7f, 0xab, 0xb2, 0xad, }, 521 + { 0x3d, 0x35, 0x88, 0x9f, 0x2e, 0xcf, 0x96, 0x45, 0x07, 0x60, 0x71, 0x94, 522 + 0x00, 0x8d, 0xbf, 0xf4, 0xef, 0x46, 0x2e, 0x3c, }, 523 + { 0x43, 0xcf, 0x98, 0xf7, 0x2d, 0xf4, 0x17, 0xe7, 0x8c, 0x05, 0x2d, 0x9b, 524 + 0x24, 0xfb, 0x4d, 0xea, 0x4a, 0xec, 0x01, 0x25, 0x29, }, 525 + { 0x8e, 0x73, 0x9a, 0x78, 0x11, 0xfe, 0x48, 0xa0, 0x3b, 0x1a, 0x26, 0xdf, 526 + 0x25, 0xe9, 0x59, 0x1c, 0x70, 0x07, 0x9f, 0xdc, 0xa0, 0xa6, }, 527 + { 0xe8, 0x47, 0x71, 0xc7, 0x3e, 0xdf, 0xb5, 0x13, 0xb9, 0x85, 0x13, 0xa8, 528 + 0x54, 0x47, 0x6e, 0x59, 0x96, 0x09, 0x13, 0x5f, 0x82, 0x16, 0x0b, }, 529 + { 0xfb, 0xc0, 0x8c, 0x03, 0x21, 0xb3, 0xc4, 0xb5, 0x43, 0x32, 0x6c, 0xea, 530 + 0x7f, 0xa8, 0x43, 0x91, 0xe8, 0x4e, 0x3f, 0xbf, 0x45, 0x58, 0x6a, 0xa3, }, 531 + { 0x55, 0xf8, 0xf3, 0x00, 0x76, 0x09, 0xef, 0x69, 0x5d, 0xd2, 0x8a, 0xf2, 532 + 0x65, 0xc3, 0xcb, 0x9b, 0x43, 0xfd, 0xb1, 0x7e, 0x7f, 0xa1, 0x94, 0xb0, 533 + 0xd7, }, 534 + { 0xaa, 0x13, 0xc1, 0x51, 0x40, 0x6d, 0x8d, 0x4c, 0x0a, 0x95, 0x64, 0x7b, 535 + 0xd1, 0x96, 0xb6, 0x56, 0xb4, 0x5b, 0xcf, 0xd6, 0xd9, 0x15, 0x97, 0xdd, 536 + 0xb6, 0xef, }, 537 + { 0xaf, 0xb7, 0x36, 0xb0, 0x04, 0xdb, 0xd7, 0x9c, 0x9a, 0x44, 0xc4, 0xf6, 538 + 0x1f, 0x12, 0x21, 0x2d, 0x59, 0x30, 0x54, 0xab, 0x27, 0x61, 0xa3, 0x57, 539 + 0xef, 0xf8, 0x53, }, 540 + { 0x97, 0x34, 0x45, 0x3e, 0xce, 0x7c, 0x35, 0xa2, 0xda, 0x9f, 0x4b, 0x46, 541 + 0x6c, 0x11, 0x67, 0xff, 0x2f, 0x76, 0x58, 0x15, 0x71, 0xfa, 0x44, 0x89, 542 + 0x89, 0xfd, 0xf7, 0x99, }, 543 + { 0x1f, 0xb1, 0x62, 0xeb, 0x83, 0xc5, 0x9c, 0x89, 0xf9, 0x2c, 0xd2, 0x03, 544 + 0x61, 0xbc, 0xbb, 0xa5, 0x74, 0x0e, 0x9b, 0x7e, 0x82, 0x3e, 0x70, 0x0a, 545 + 0xa9, 0x8f, 0x2b, 0x59, 0xfb, }, 546 + { 0xf8, 0xca, 0x5e, 0x3a, 0x4f, 0x9e, 0x10, 0x69, 0x10, 0xd5, 0x4c, 0xeb, 547 + 0x1a, 0x0f, 0x3c, 0x6a, 0x98, 0xf5, 0xb0, 0x97, 0x5b, 0x37, 0x2f, 0x0d, 548 + 0xbd, 0x42, 0x4b, 0x69, 0xa1, 0x82, }, 549 + { 0x12, 0x8c, 0x6d, 0x52, 0x08, 0xef, 0x74, 0xb2, 0xe6, 0xaa, 0xd3, 0xb0, 550 + 0x26, 0xb0, 0xd9, 0x94, 0xb6, 0x11, 0x45, 0x0e, 0x36, 0x71, 0x14, 0x2d, 551 + 0x41, 0x8c, 0x21, 0x53, 0x31, 0xe9, 0x68, }, 552 + { 0xee, 0xea, 0x0d, 0x89, 0x47, 0x7e, 0x72, 0xd1, 0xd8, 0xce, 0x58, 0x4c, 553 + 0x94, 0x1f, 0x0d, 0x51, 0x08, 0xa3, 0xb6, 0x3d, 0xe7, 0x82, 0x46, 0x92, 554 + 0xd6, 0x98, 0x6b, 0x07, 0x10, 0x65, 0x52, 0x65, }, 555 + }; 556 + 557 + static const u8 blake2s_hmac_testvecs[][BLAKE2S_HASH_SIZE] __initconst = { 558 + { 0xce, 0xe1, 0x57, 0x69, 0x82, 0xdc, 0xbf, 0x43, 0xad, 0x56, 0x4c, 0x70, 559 + 0xed, 0x68, 0x16, 0x96, 0xcf, 0xa4, 0x73, 0xe8, 0xe8, 0xfc, 0x32, 0x79, 560 + 0x08, 0x0a, 0x75, 0x82, 0xda, 0x3f, 0x05, 0x11, }, 561 + { 0x77, 0x2f, 0x0c, 0x71, 0x41, 0xf4, 0x4b, 0x2b, 0xb3, 0xc6, 0xb6, 0xf9, 562 + 0x60, 0xde, 0xe4, 0x52, 0x38, 0x66, 0xe8, 0xbf, 0x9b, 0x96, 0xc4, 0x9f, 563 + 0x60, 0xd9, 0x24, 0x37, 0x99, 0xd6, 0xec, 0x31, }, 564 + }; 565 + 566 + bool __init blake2s_selftest(void) 567 + { 568 + u8 key[BLAKE2S_KEY_SIZE]; 569 + u8 buf[ARRAY_SIZE(blake2s_testvecs)]; 570 + u8 hash[BLAKE2S_HASH_SIZE]; 571 + struct blake2s_state state; 572 + bool success = true; 573 + int i, l; 574 + 575 + key[0] = key[1] = 1; 576 + for (i = 2; i < sizeof(key); ++i) 577 + key[i] = key[i - 2] + key[i - 1]; 578 + 579 + for (i = 0; i < sizeof(buf); ++i) 580 + buf[i] = (u8)i; 581 + 582 + for (i = l = 0; i < ARRAY_SIZE(blake2s_testvecs); l = (l + 37) % ++i) { 583 + int outlen = 1 + i % BLAKE2S_HASH_SIZE; 584 + int keylen = (13 * i) % (BLAKE2S_KEY_SIZE + 1); 585 + 586 + blake2s(hash, buf, key + BLAKE2S_KEY_SIZE - keylen, outlen, i, 587 + keylen); 588 + if (memcmp(hash, blake2s_testvecs[i], outlen)) { 589 + pr_err("blake2s self-test %d: FAIL\n", i + 1); 590 + success = false; 591 + } 592 + 593 + if (!keylen) 594 + blake2s_init(&state, outlen); 595 + else 596 + blake2s_init_key(&state, outlen, 597 + key + BLAKE2S_KEY_SIZE - keylen, 598 + keylen); 599 + 600 + blake2s_update(&state, buf, l); 601 + blake2s_update(&state, buf + l, i - l); 602 + blake2s_final(&state, hash); 603 + if (memcmp(hash, blake2s_testvecs[i], outlen)) { 604 + pr_err("blake2s init/update/final self-test %d: FAIL\n", 605 + i + 1); 606 + success = false; 607 + } 608 + } 609 + 610 + if (success) { 611 + blake2s256_hmac(hash, buf, key, sizeof(buf), sizeof(key)); 612 + success &= !memcmp(hash, blake2s_hmac_testvecs[0], BLAKE2S_HASH_SIZE); 613 + 614 + blake2s256_hmac(hash, key, buf, sizeof(key), sizeof(buf)); 615 + success &= !memcmp(hash, blake2s_hmac_testvecs[1], BLAKE2S_HASH_SIZE); 616 + 617 + if (!success) 618 + pr_err("blake2s256_hmac self-test: FAIL\n"); 619 + } 620 + 621 + return success; 622 + }
+126
lib/crypto/blake2s.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 OR MIT 2 + /* 3 + * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. 4 + * 5 + * This is an implementation of the BLAKE2s hash and PRF functions. 6 + * 7 + * Information: https://blake2.net/ 8 + * 9 + */ 10 + 11 + #include <crypto/internal/blake2s.h> 12 + #include <linux/types.h> 13 + #include <linux/string.h> 14 + #include <linux/kernel.h> 15 + #include <linux/module.h> 16 + #include <linux/init.h> 17 + #include <linux/bug.h> 18 + #include <asm/unaligned.h> 19 + 20 + bool blake2s_selftest(void); 21 + 22 + void blake2s_update(struct blake2s_state *state, const u8 *in, size_t inlen) 23 + { 24 + const size_t fill = BLAKE2S_BLOCK_SIZE - state->buflen; 25 + 26 + if (unlikely(!inlen)) 27 + return; 28 + if (inlen > fill) { 29 + memcpy(state->buf + state->buflen, in, fill); 30 + if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S)) 31 + blake2s_compress_arch(state, state->buf, 1, 32 + BLAKE2S_BLOCK_SIZE); 33 + else 34 + blake2s_compress_generic(state, state->buf, 1, 35 + BLAKE2S_BLOCK_SIZE); 36 + state->buflen = 0; 37 + in += fill; 38 + inlen -= fill; 39 + } 40 + if (inlen > BLAKE2S_BLOCK_SIZE) { 41 + const size_t nblocks = DIV_ROUND_UP(inlen, BLAKE2S_BLOCK_SIZE); 42 + /* Hash one less (full) block than strictly possible */ 43 + if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S)) 44 + blake2s_compress_arch(state, in, nblocks - 1, 45 + BLAKE2S_BLOCK_SIZE); 46 + else 47 + blake2s_compress_generic(state, in, nblocks - 1, 48 + BLAKE2S_BLOCK_SIZE); 49 + in += BLAKE2S_BLOCK_SIZE * (nblocks - 1); 50 + inlen -= BLAKE2S_BLOCK_SIZE * (nblocks - 1); 51 + } 52 + memcpy(state->buf + state->buflen, in, inlen); 53 + state->buflen += inlen; 54 + } 55 + EXPORT_SYMBOL(blake2s_update); 56 + 57 + void blake2s_final(struct blake2s_state *state, u8 *out) 58 + { 59 + WARN_ON(IS_ENABLED(DEBUG) && !out); 60 + blake2s_set_lastblock(state); 61 + memset(state->buf + state->buflen, 0, 62 + BLAKE2S_BLOCK_SIZE - state->buflen); /* Padding */ 63 + if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S)) 64 + blake2s_compress_arch(state, state->buf, 1, state->buflen); 65 + else 66 + blake2s_compress_generic(state, state->buf, 1, state->buflen); 67 + cpu_to_le32_array(state->h, ARRAY_SIZE(state->h)); 68 + memcpy(out, state->h, state->outlen); 69 + memzero_explicit(state, sizeof(*state)); 70 + } 71 + EXPORT_SYMBOL(blake2s_final); 72 + 73 + void blake2s256_hmac(u8 *out, const u8 *in, const u8 *key, const size_t inlen, 74 + const size_t keylen) 75 + { 76 + struct blake2s_state state; 77 + u8 x_key[BLAKE2S_BLOCK_SIZE] __aligned(__alignof__(u32)) = { 0 }; 78 + u8 i_hash[BLAKE2S_HASH_SIZE] __aligned(__alignof__(u32)); 79 + int i; 80 + 81 + if (keylen > BLAKE2S_BLOCK_SIZE) { 82 + blake2s_init(&state, BLAKE2S_HASH_SIZE); 83 + blake2s_update(&state, key, keylen); 84 + blake2s_final(&state, x_key); 85 + } else 86 + memcpy(x_key, key, keylen); 87 + 88 + for (i = 0; i < BLAKE2S_BLOCK_SIZE; ++i) 89 + x_key[i] ^= 0x36; 90 + 91 + blake2s_init(&state, BLAKE2S_HASH_SIZE); 92 + blake2s_update(&state, x_key, BLAKE2S_BLOCK_SIZE); 93 + blake2s_update(&state, in, inlen); 94 + blake2s_final(&state, i_hash); 95 + 96 + for (i = 0; i < BLAKE2S_BLOCK_SIZE; ++i) 97 + x_key[i] ^= 0x5c ^ 0x36; 98 + 99 + blake2s_init(&state, BLAKE2S_HASH_SIZE); 100 + blake2s_update(&state, x_key, BLAKE2S_BLOCK_SIZE); 101 + blake2s_update(&state, i_hash, BLAKE2S_HASH_SIZE); 102 + blake2s_final(&state, i_hash); 103 + 104 + memcpy(out, i_hash, BLAKE2S_HASH_SIZE); 105 + memzero_explicit(x_key, BLAKE2S_BLOCK_SIZE); 106 + memzero_explicit(i_hash, BLAKE2S_HASH_SIZE); 107 + } 108 + EXPORT_SYMBOL(blake2s256_hmac); 109 + 110 + static int __init mod_init(void) 111 + { 112 + if (!IS_ENABLED(CONFIG_CRYPTO_MANAGER_DISABLE_TESTS) && 113 + WARN_ON(!blake2s_selftest())) 114 + return -ENODEV; 115 + return 0; 116 + } 117 + 118 + static void __exit mod_exit(void) 119 + { 120 + } 121 + 122 + module_init(mod_init); 123 + module_exit(mod_exit); 124 + MODULE_LICENSE("GPL v2"); 125 + MODULE_DESCRIPTION("BLAKE2s hash function"); 126 + MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>");