From f6b7365dc8759d6df5d340e4a68fb75537c07be4 Mon Sep 17 00:00:00 2001 From: aqua Date: Sat, 31 Dec 2022 16:03:20 +0200 Subject: blake2: use makefiles instead of meson.build --- com/BLAKE2/README.md | 7 - com/BLAKE2/blake2s.c | 126 --- com/BLAKE2/blake2s.h | 59 -- com/BLAKE2/meson.build | 17 - com/BLAKE2/rfc7693.txt | 1683 ------------------------------------ com/BLAKE2/test/blake2s_kat.c | 31 - com/BLAKE2/test/blake2s_kat.py | 40 - com/BLAKE2/test/blake2s_selftest.c | 102 --- lib/Makefile | 13 +- lib/blake2/README.md | 7 + lib/blake2/blake2s.c | 123 +++ lib/blake2/blake2s.h | 56 ++ lib/blake2/rfc7693.txt | 1683 ++++++++++++++++++++++++++++++++++++ lib/endian.h | 17 + lib/endian/little.c | 43 + lib/tst/blake2s_genkat.py | 40 + lib/tst/blake2s_kat.h | 1032 ++++++++++++++++++++++ lib/tst/blake2s_selftest.cc | 117 +++ lib/tst/endian_little.cc | 38 + rules.mk | 6 +- 20 files changed, 3169 insertions(+), 2071 deletions(-) delete mode 100644 com/BLAKE2/README.md delete mode 100644 com/BLAKE2/blake2s.c delete mode 100644 com/BLAKE2/blake2s.h delete mode 100644 com/BLAKE2/meson.build delete mode 100644 com/BLAKE2/rfc7693.txt delete mode 100644 com/BLAKE2/test/blake2s_kat.c delete mode 100755 com/BLAKE2/test/blake2s_kat.py delete mode 100644 com/BLAKE2/test/blake2s_selftest.c create mode 100644 lib/blake2/README.md create mode 100644 lib/blake2/blake2s.c create mode 100644 lib/blake2/blake2s.h create mode 100644 lib/blake2/rfc7693.txt create mode 100644 lib/endian.h create mode 100644 lib/endian/little.c create mode 100755 lib/tst/blake2s_genkat.py create mode 100644 lib/tst/blake2s_kat.h create mode 100644 lib/tst/blake2s_selftest.cc create mode 100644 lib/tst/endian_little.cc diff --git a/com/BLAKE2/README.md b/com/BLAKE2/README.md deleted file mode 100644 index 223324e..0000000 --- a/com/BLAKE2/README.md +++ /dev/null @@ -1,7 +0,0 @@ -## BLAKE2 -BLAKE2 is a cryptographic hash function faster than MD5, SHA-1, SHA-2, and SHA-3, yet is at least as secure as the -latest standard SHA-3. - -## BLAKE2s -BLAKE2s is optimized for 8 to 32-bit platforms and produces digests of any size between 1 and 32 bytes. - diff --git a/com/BLAKE2/blake2s.c b/com/BLAKE2/blake2s.c deleted file mode 100644 index 5b03b88..0000000 --- a/com/BLAKE2/blake2s.c +++ /dev/null @@ -1,126 +0,0 @@ -#include "blake2s.h" -#include -#include // TODO remove -#include - -static const uint32_t IV[8] = {0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, - 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19}; - -const uint8_t SIGMA[10][16] = { - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, {14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3}, - {11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4}, {7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8}, - {9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13}, {2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9}, - {12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11}, {13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10}, - {6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5}, {10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0}}; - -uint32_t -rotr_u32(uint32_t word, uint8_t c) -{ - return (word >> c) | (word << (32 - c)); -} - -void -G(uint32_t v[16], unsigned a, unsigned b, unsigned c, unsigned d, uint32_t x, uint32_t y) -{ - v[a] = v[a] + v[b] + x; - v[d] = rotr_u32(v[d] ^ v[a], 16); - v[c] = v[c] + v[d]; - v[b] = rotr_u32(v[b] ^ v[c], 12); - v[a] = v[a] + v[b] + y; - v[d] = rotr_u32(v[d] ^ v[a], 8); - v[c] = v[c] + v[d]; - v[b] = rotr_u32(v[b] ^ v[c], 7); -} - -void -F(struct BLAKE2s_ctx *ctx, uint32_t m[16], uint32_t f) -{ - // Initialize local work vector v - uint32_t v[16] = {ctx->h[0], ctx->h[1], ctx->h[2], ctx->h[3], ctx->h[4], ctx->h[5], - ctx->h[6], ctx->h[7], IV[0], IV[1], IV[2], IV[3], - IV[4] ^ ctx->t[0], IV[5] ^ ctx->t[1], IV[6], IV[7]}; - if (f) v[14] = ~v[14]; // if last block flag, invert all bits - - // cryptographic mixing - for (unsigned i = 0; i < 10; ++i) { - G(v, 0, 4, 8, 12, m[SIGMA[i][0]], m[SIGMA[i][1]]); - G(v, 1, 5, 9, 13, m[SIGMA[i][2]], m[SIGMA[i][3]]); - G(v, 2, 6, 10, 14, m[SIGMA[i][4]], m[SIGMA[i][5]]); - G(v, 3, 7, 11, 15, m[SIGMA[i][6]], m[SIGMA[i][7]]); - - G(v, 0, 5, 10, 15, m[SIGMA[i][8]], m[SIGMA[i][9]]); - G(v, 1, 6, 11, 12, m[SIGMA[i][10]], m[SIGMA[i][11]]); - G(v, 2, 7, 8, 13, m[SIGMA[i][12]], m[SIGMA[i][13]]); - G(v, 3, 4, 9, 14, m[SIGMA[i][14]], m[SIGMA[i][15]]); - } - - // xor the two halves - for (unsigned i = 0; i < 8; ++i) ctx->h[i] ^= (v[i] ^ v[i + 8]); -} - -int -BLAKE2s_init(struct BLAKE2s_ctx *ctx, size_t outlen, const void *key, size_t keylen) -{ - if (outlen == 0 || outlen > 32 || keylen > 32) { - printf("invalid outlen=%lu or keylen=%lu\n", outlen, keylen); // TODO remove - return -1; - } - - memset(ctx, 0, sizeof(struct BLAKE2s_ctx)); - ctx->param.outlen = outlen; - ctx->param.keylen = keylen; - ctx->param.fanout = 1; - ctx->param.depth = 1; - ctx->outlen = outlen; - - // copy IV into state vector h - for (unsigned i = 0; i < 8; ++i) ctx->h[i] = IV[i]; - // copy param block 0 onto h[0] - ctx->h[0] ^= (ctx->param.depth << 24) ^ (ctx->param.fanout << 16) ^ (keylen << 8) ^ outlen; - - if (keylen > 0) { - BLAKE2s_update(ctx, key, keylen); - ctx->c = 64; // at the end - } - - return 0; -} - -#define MIN(a, b) ((a < b) ? a : b) - -void -BLAKE2s_update(struct BLAKE2s_ctx *ctx, const void *d, size_t dd) -{ - for (unsigned i = 0; i < dd;) { - - if (ctx->c == 64) { // if block is full, consume block - ctx->t[0] += ctx->c; - if (ctx->t[0] < ctx->c) ctx->t[1] += 1; - ctx->c = 0; // reset counter - - uint32_t *m = (uint32_t *)ctx->b; - for (unsigned i = 0; i < 16; ++i) m[i] = htole32(m[i]); - F(ctx, m, 0); - } - - // TODO memcpy - ctx->b[ctx->c] = ((uint8_t *)d)[i]; - ++(ctx->c); - ++i; - } -} - -void -BLAKE2s_final(struct BLAKE2s_ctx *ctx, void *out) -{ - ctx->t[0] += ctx->c; - if (ctx->t[0] < ctx->c) ctx->t[1] += 1; - for (; ctx->c < 64; ++(ctx->c)) ctx->b[ctx->c] = 0; // fill up block with zeroes - - uint32_t *m = (uint32_t *)ctx->b; - for (unsigned i = 0; i < 16; ++i) m[i] = htole32(m[i]); - F(ctx, m, 1); - - for (unsigned i = 0; i < ctx->outlen; ++i) ((uint8_t *)out)[i] = (ctx->h[i >> 2] >> (8 * (i & 3))) & 0xff; -} - diff --git a/com/BLAKE2/blake2s.h b/com/BLAKE2/blake2s.h deleted file mode 100644 index fd68168..0000000 --- a/com/BLAKE2/blake2s.h +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once - -#include -#include - -struct BLAKE2s_param { - uint8_t outlen; // digest length - uint8_t keylen; // key length - uint8_t fanout; - uint8_t depth; - uint32_t leaf_length; - uint32_t node_offset; - uint16_t node_offset_ex; - uint8_t node_depth; - uint8_t inner_length; - uint64_t salt; - uint64_t personalization; -}; - -struct BLAKE2s_ctx { - uint8_t b[64]; // input buffer - size_t c; // pointer for b[] - size_t outlen; // digest size TODO remove - uint32_t h[8]; // chained state vector h - uint32_t t[2]; // total number of bytes - struct BLAKE2s_param param; // parameter block -}; - -uint32_t rotr_u32(uint32_t word, uint8_t c); - -/** - * 3.1 Mixing Function G - */ -void G(uint32_t V[16], unsigned a, unsigned b, unsigned c, unsigned d, uint32_t x, uint32_t y); - -/** - * 3.2 Compression Function F - * @param t: 2w-bit offset counter t - * @param f: final block indicator flag f - */ -void F(struct BLAKE2s_ctx *context, uint32_t m[16], uint32_t f); - -[[nodiscard]] int BLAKE2s_init(struct BLAKE2s_ctx *ctx, size_t outlen, const void *key, size_t keylen); -void BLAKE2s_update(struct BLAKE2s_ctx *ctx, const void *d, size_t dd); -void BLAKE2s_final(struct BLAKE2s_ctx *ctx, void *out); - -// All-in-one convenience function. -[[maybe_unused]] static int -BLAKE2s(void *out, size_t outlen, // return buffer for digest - const void *key, size_t keylen, // optional secret key - const void *in, size_t inlen) // data to be hashed -{ - struct BLAKE2s_ctx ctx; - if (BLAKE2s_init(&ctx, outlen, key, keylen)) return -1; - BLAKE2s_update(&ctx, in, inlen); - BLAKE2s_final(&ctx, out); - - return 0; -} diff --git a/com/BLAKE2/meson.build b/com/BLAKE2/meson.build deleted file mode 100644 index 7d180e3..0000000 --- a/com/BLAKE2/meson.build +++ /dev/null @@ -1,17 +0,0 @@ -#BLAKE2s = static_library('BLAKE2s', 'blake2s.c') -BLAKE2s_native = shared_library('BLAKE2s_native', 'blake2s.c', native: true) - -kat = generator(python3, - arguments: '@INPUT@', - capture: true, output: '@BASENAME@.h' -) - -test('BLAKE2s selftest', - executable('b2s_selftest', 'test/blake2s_selftest.c', link_with: BLAKE2s_native, native: true), - suite: 'BLAKE2' -) -test('BLAKE2s KAT', - executable('b2s_kat', ['test/blake2s_kat.c', kat.process('test/blake2s_kat.py')], - link_with: BLAKE2s_native, native: true), - suite: 'BLAKE2' -) diff --git a/com/BLAKE2/rfc7693.txt b/com/BLAKE2/rfc7693.txt deleted file mode 100644 index d9d3b97..0000000 --- a/com/BLAKE2/rfc7693.txt +++ /dev/null @@ -1,1683 +0,0 @@ - - - - - - -Independent Submission M-J. Saarinen, Ed. -Request for Comments: 7693 Queen's University Belfast -Category: Informational J-P. Aumasson -ISSN: 2070-1721 Kudelski Security - November 2015 - - - The BLAKE2 Cryptographic Hash and Message Authentication Code (MAC) - -Abstract - - This document describes the cryptographic hash function BLAKE2 and - makes the algorithm specification and C source code conveniently - available to the Internet community. BLAKE2 comes in two main - flavors: BLAKE2b is optimized for 64-bit platforms and BLAKE2s for - smaller architectures. BLAKE2 can be directly keyed, making it - functionally equivalent to a Message Authentication Code (MAC). - -Status of This Memo - - This document is not an Internet Standards Track specification; it is - published for informational purposes. - - This is a contribution to the RFC Series, independently of any other - RFC stream. The RFC Editor has chosen to publish this document at - its discretion and makes no statement about its value for - implementation or deployment. Documents approved for publication by - the RFC Editor are not a candidate for any level of Internet - Standard; see Section 2 of RFC 5741. - - Information about the current status of this document, any errata, - and how to provide feedback on it may be obtained at - http://www.rfc-editor.org/info/rfc7693. - -Copyright Notice - - Copyright (c) 2015 IETF Trust and the persons identified as the - document authors. All rights reserved. - - This document is subject to BCP 78 and the IETF Trust's Legal - Provisions Relating to IETF Documents - (http://trustee.ietf.org/license-info) in effect on the date of - publication of this document. Please review these documents - carefully, as they describe your rights and restrictions with respect - to this document. - - - - - - -Saarinen & Aumasson Informational [Page 1] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - -Table of Contents - - 1. Introduction and Terminology . . . . . . . . . . . . . . . . 3 - 2. Conventions, Variables, and Constants . . . . . . . . . . . . 4 - 2.1. Parameters . . . . . . . . . . . . . . . . . . . . . . . 4 - 2.2. Other Constants and Variables . . . . . . . . . . . . . . 4 - 2.3. Arithmetic Notation . . . . . . . . . . . . . . . . . . . 4 - 2.4. Little-Endian Interpretation of Words as Bytes . . . . . 5 - 2.5. Parameter Block . . . . . . . . . . . . . . . . . . . . . 5 - 2.6. Initialization Vector . . . . . . . . . . . . . . . . . . 6 - 2.7. Message Schedule SIGMA . . . . . . . . . . . . . . . . . 6 - 3. BLAKE2 Processing . . . . . . . . . . . . . . . . . . . . . . 7 - 3.1. Mixing Function G . . . . . . . . . . . . . . . . . . . . 7 - 3.2. Compression Function F . . . . . . . . . . . . . . . . . 8 - 3.3. Padding Data and Computing a BLAKE2 Digest . . . . . . . 9 - 4. Standard Parameter Sets and Algorithm Identifiers . . . . . . 10 - 5. Security Considerations . . . . . . . . . . . . . . . . . . . 11 - 6. References . . . . . . . . . . . . . . . . . . . . . . . . . 11 - 6.1. Normative References . . . . . . . . . . . . . . . . . . 11 - 6.2. Informative References . . . . . . . . . . . . . . . . . 11 - Appendix A. Example of BLAKE2b Computation . . . . . . . . . . . 13 - Appendix B. Example of BLAKE2s Computation . . . . . . . . . . . 15 - Appendix C. BLAKE2b Implementation C Source . . . . . . . . . . 16 - C.1. blake2b.h . . . . . . . . . . . . . . . . . . . . . . . . 16 - C.2. blake2b.c . . . . . . . . . . . . . . . . . . . . . . . . 17 - Appendix D. BLAKE2s Implementation C Source . . . . . . . . . . 21 - D.1. blake2s.h . . . . . . . . . . . . . . . . . . . . . . . . 21 - D.2. blake2s.c . . . . . . . . . . . . . . . . . . . . . . . . 22 - Appendix E. BLAKE2b and BLAKE2s Self-Test Module C Source . . . 26 - Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 29 - Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 30 - - - - - - - - - - - - - - - - - - - - -Saarinen & Aumasson Informational [Page 2] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - -1. Introduction and Terminology - - The BLAKE2 cryptographic hash function [BLAKE2] was designed by Jean- - Philippe Aumasson, Samuel Neves, Zooko Wilcox-O'Hearn, and Christian - Winnerlein. - - BLAKE2 comes in two basic flavors: - - o BLAKE2b (or just BLAKE2) is optimized for 64-bit platforms and - produces digests of any size between 1 and 64 bytes. - - o BLAKE2s is optimized for 8- to 32-bit platforms and produces - digests of any size between 1 and 32 bytes. - - Both BLAKE2b and BLAKE2s are believed to be highly secure and perform - well on any platform, software, or hardware. BLAKE2 does not require - a special "HMAC" (Hashed Message Authentication Code) construction - for keyed message authentication as it has a built-in keying - mechanism. - - The BLAKE2 hash function may be used by digital signature algorithms - and message authentication and integrity protection mechanisms in - applications such as Public Key Infrastructure (PKI), secure - communication protocols, cloud storage, intrusion detection, forensic - suites, and version control systems. - - The BLAKE2 suite provides a more efficient alternative to US Secure - Hash Algorithms SHA and HMAC-SHA [RFC6234]. BLAKE2s-128 is - especially suited as a fast and more secure drop-in replacement to - MD5 and HMAC-MD5 in legacy applications [RFC6151]. - - To aid implementation, we provide a trace of BLAKE2b-512 hash - computation in Appendix A and a trace of BLAKE2s-256 hash computation - in Appendix B. Due to space constraints, this document does not - contain a full set of test vectors for BLAKE2. - - A reference implementation in C programming language for BLAKE2b can - be found in Appendix C and for BLAKE2s in Appendix D of this - document. These implementations MAY be validated with the more - exhaustive Test Module contained in Appendix E. - - The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", - "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this - document are to be interpreted as described in [RFC2119]. - - - - - - - -Saarinen & Aumasson Informational [Page 3] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - -2. Conventions, Variables, and Constants - -2.1. Parameters - - The following table summarizes various parameters and their ranges: - - | BLAKE2b | BLAKE2s | - --------------+------------------+------------------+ - Bits in word | w = 64 | w = 32 | - Rounds in F | r = 12 | r = 10 | - Block bytes | bb = 128 | bb = 64 | - Hash bytes | 1 <= nn <= 64 | 1 <= nn <= 32 | - Key bytes | 0 <= kk <= 64 | 0 <= kk <= 32 | - Input bytes | 0 <= ll < 2**128 | 0 <= ll < 2**64 | - --------------+------------------+------------------+ - G Rotation | (R1, R2, R3, R4) | (R1, R2, R3, R4) | - constants = | (32, 24, 16, 63) | (16, 12, 8, 7) | - --------------+------------------+------------------+ - -2.2. Other Constants and Variables - - These variables are used in the algorithm description: - - IV[0..7] Initialization Vector (constant). - - SIGMA[0..9] Message word permutations (constant). - - p[0..7] Parameter block (defines hash and key sizes). - - m[0..15] Sixteen words of a single message block. - - h[0..7] Internal state of the hash. - - d[0..dd-1] Padded input blocks. Each has "bb" bytes. - - t Message byte offset at the end of the current block. - - f Flag indicating the last block. - -2.3. Arithmetic Notation - - For real-valued x, we define the following functions: - - floor(x) Floor, the largest integer <= x. - - ceil(x) Ceiling, the smallest integer >= x. - - frac(x) Positive fractional part of x, frac(x) = x - floor(x). - - - -Saarinen & Aumasson Informational [Page 4] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - - Operator notation in pseudocode: - - 2**n = 2 to the power "n". 2**0=1, 2**1=2, 2**2=4, 2**3=8, etc. - - a ^ b = Bitwise exclusive-or operation between "a" and "b". - - a mod b = Remainder "a" modulo "b", always in range [0, b-1]. - - x >> n = floor(x / 2**n). Logical shift "x" right by "n" bits. - - x << n = (x * 2**n) mod (2**w). Logical shift "x" left by "n". - - x >>> n = (x >> n) ^ (x << (w - n)). Rotate "x" right by "n". - -2.4. Little-Endian Interpretation of Words as Bytes - - All mathematical operations are on 64-bit words in BLAKE2b and on - 32-bit words in BLAKE2s. - - We may also perform operations on vectors of words. Vector indexing - is zero based; the first element of an n-element vector "v" is v[0] - and the last one is v[n - 1]. All elements are denoted by v[0..n-1]. - - Byte (octet) streams are interpreted as words in little-endian order, - with the least-significant byte first. Consider this sequence of - eight hexadecimal bytes: - - x[0..7] = 0x01 0x23 0x45 0x67 0x89 0xAB 0xCD 0xEF - - When interpreted as a 32-bit word from the beginning memory address, - x[0..3] has a numerical value of 0x67452301 or 1732584193. - - When interpreted as a 64-bit word, bytes x[0..7] have a numerical - value of 0xEFCDAB8967452301 or 17279655951921914625. - -2.5. Parameter Block - - We specify the parameter block words p[0..7] as follows: - - byte offset: 3 2 1 0 (otherwise zero) - p[0] = 0x0101kknn p[1..7] = 0 - - Here the "nn" byte specifies the hash size in bytes. The second - (little-endian) byte of the parameter block, "kk", specifies the key - size in bytes. Set kk = 00 for unkeyed hashing. Bytes 2 and 3 are - set as 01. All other bytes in the parameter block are set as zero. - - - - - -Saarinen & Aumasson Informational [Page 5] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - - Note: [BLAKE2] defines additional variants of BLAKE2 with features - such as salting, personalized hashes, and tree hashing. These - OPTIONAL features use fields in the parameter block that are not - defined in this document. - -2.6. Initialization Vector - - We define the Initialization Vector constant IV mathematically as: - - IV[i] = floor(2**w * frac(sqrt(prime(i+1)))), where prime(i) - is the i:th prime number ( 2, 3, 5, 7, 11, 13, 17, 19 ) - and sqrt(x) is the square root of x. - - The numerical values of IV can also be found in implementations in - Appendices C and D for BLAKE2b and BLAKE2s, respectively. - - Note: BLAKE2b IV is the same as SHA-512 IV, and BLAKE2s IV is the - same as SHA-256 IV; see [RFC6234]. - -2.7. Message Schedule SIGMA - - Message word schedule permutations for each round of both BLAKE2b and - BLAKE2s are defined by SIGMA. For BLAKE2b, the two extra - permutations for rounds 10 and 11 are SIGMA[10..11] = SIGMA[0..1]. - - Round | 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | - ----------+-------------------------------------------------+ - SIGMA[0] | 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | - SIGMA[1] | 14 10 4 8 9 15 13 6 1 12 0 2 11 7 5 3 | - SIGMA[2] | 11 8 12 0 5 2 15 13 10 14 3 6 7 1 9 4 | - SIGMA[3] | 7 9 3 1 13 12 11 14 2 6 5 10 4 0 15 8 | - SIGMA[4] | 9 0 5 7 2 4 10 15 14 1 11 12 6 8 3 13 | - SIGMA[5] | 2 12 6 10 0 11 8 3 4 13 7 5 15 14 1 9 | - SIGMA[6] | 12 5 1 15 14 13 4 10 0 7 6 3 9 2 8 11 | - SIGMA[7] | 13 11 7 14 12 1 3 9 5 0 15 4 8 6 2 10 | - SIGMA[8] | 6 15 14 9 11 3 0 8 12 2 13 7 1 4 10 5 | - SIGMA[9] | 10 2 8 4 7 6 1 5 15 11 9 14 3 12 13 0 | - ----------+-------------------------------------------------+ - - - - - - - - - - - - - -Saarinen & Aumasson Informational [Page 6] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - -3. BLAKE2 Processing - -3.1. Mixing Function G - - The G primitive function mixes two input words, "x" and "y", into - four words indexed by "a", "b", "c", and "d" in the working vector - v[0..15]. The full modified vector is returned. The rotation - constants (R1, R2, R3, R4) are given in Section 2.1. - - FUNCTION G( v[0..15], a, b, c, d, x, y ) - | - | v[a] := (v[a] + v[b] + x) mod 2**w - | v[d] := (v[d] ^ v[a]) >>> R1 - | v[c] := (v[c] + v[d]) mod 2**w - | v[b] := (v[b] ^ v[c]) >>> R2 - | v[a] := (v[a] + v[b] + y) mod 2**w - | v[d] := (v[d] ^ v[a]) >>> R3 - | v[c] := (v[c] + v[d]) mod 2**w - | v[b] := (v[b] ^ v[c]) >>> R4 - | - | RETURN v[0..15] - | - END FUNCTION. - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Saarinen & Aumasson Informational [Page 7] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - -3.2. Compression Function F - - Compression function F takes as an argument the state vector "h", - message block vector "m" (last block is padded with zeros to full - block size, if required), 2w-bit offset counter "t", and final block - indicator flag "f". Local vector v[0..15] is used in processing. F - returns a new state vector. The number of rounds, "r", is 12 for - BLAKE2b and 10 for BLAKE2s. Rounds are numbered from 0 to r - 1. - - FUNCTION F( h[0..7], m[0..15], t, f ) - | - | // Initialize local work vector v[0..15] - | v[0..7] := h[0..7] // First half from state. - | v[8..15] := IV[0..7] // Second half from IV. - | - | v[12] := v[12] ^ (t mod 2**w) // Low word of the offset. - | v[13] := v[13] ^ (t >> w) // High word. - | - | IF f = TRUE THEN // last block flag? - | | v[14] := v[14] ^ 0xFF..FF // Invert all bits. - | END IF. - | - | // Cryptographic mixing - | FOR i = 0 TO r - 1 DO // Ten or twelve rounds. - | | - | | // Message word selection permutation for this round. - | | s[0..15] := SIGMA[i mod 10][0..15] - | | - | | v := G( v, 0, 4, 8, 12, m[s[ 0]], m[s[ 1]] ) - | | v := G( v, 1, 5, 9, 13, m[s[ 2]], m[s[ 3]] ) - | | v := G( v, 2, 6, 10, 14, m[s[ 4]], m[s[ 5]] ) - | | v := G( v, 3, 7, 11, 15, m[s[ 6]], m[s[ 7]] ) - | | - | | v := G( v, 0, 5, 10, 15, m[s[ 8]], m[s[ 9]] ) - | | v := G( v, 1, 6, 11, 12, m[s[10]], m[s[11]] ) - | | v := G( v, 2, 7, 8, 13, m[s[12]], m[s[13]] ) - | | v := G( v, 3, 4, 9, 14, m[s[14]], m[s[15]] ) - | | - | END FOR - | - | FOR i = 0 TO 7 DO // XOR the two halves. - | | h[i] := h[i] ^ v[i] ^ v[i + 8] - | END FOR. - | - | RETURN h[0..7] // New state. - | - END FUNCTION. - - - - -Saarinen & Aumasson Informational [Page 8] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - -3.3. Padding Data and Computing a BLAKE2 Digest - - We refer the reader to Appendices C and D for reference C language - implementations of BLAKE2b and BLAKE2s, respectively. - - Key and data input are split and padded into "dd" message blocks - d[0..dd-1], each consisting of 16 words (or "bb" bytes). - - If a secret key is used (kk > 0), it is padded with zero bytes and - set as d[0]. Otherwise, d[0] is the first data block. The final - data block d[dd-1] is also padded with zero to "bb" bytes (16 words). - - The number of blocks is therefore dd = ceil(kk / bb) + ceil(ll / bb). - However, in the special case of an unkeyed empty message (kk = 0 and - ll = 0), we still set dd = 1 and d[0] consists of all zeros. - - The following procedure processes the padded data blocks into an - "nn"-byte final hash value. See Section 2 for a description of - various variables and constants used. - - FUNCTION BLAKE2( d[0..dd-1], ll, kk, nn ) - | - | h[0..7] := IV[0..7] // Initialization Vector. - | - | // Parameter block p[0] - | h[0] := h[0] ^ 0x01010000 ^ (kk << 8) ^ nn - | - | // Process padded key and data blocks - | IF dd > 1 THEN - | | FOR i = 0 TO dd - 2 DO - | | | h := F( h, d[i], (i + 1) * bb, FALSE ) - | | END FOR. - | END IF. - | - | // Final block. - | IF kk = 0 THEN - | | h := F( h, d[dd - 1], ll, TRUE ) - | ELSE - | | h := F( h, d[dd - 1], ll + bb, TRUE ) - | END IF. - | - | RETURN first "nn" bytes from little-endian word array h[]. - | - END FUNCTION. - - - - - - - -Saarinen & Aumasson Informational [Page 9] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - -4. Standard Parameter Sets and Algorithm Identifiers - - An implementation of BLAKE2b and/or BLAKE2s MAY support the following - digest size parameters for interoperability (e.g., digital - signatures), as long as a sufficient level of security is attained by - the parameter selections. These parameters and identifiers are - intended to be suitable as drop-in replacements to MD5 and - corresponding SHA algorithms. - - Developers adapting BLAKE2 to ASN.1-based message formats SHOULD use - the OID tree at x = 1.3.6.1.4.1.1722.12.2. The same OID can be used - for both keyed and unkeyed hashing since in the latter case the key - simply has zero length. - - Algorithm | Target | Collision | Hash | Hash ASN.1 | - Identifier | Arch | Security | nn | OID Suffix | - ---------------+--------+-----------+------+------------+ - id-blake2b160 | 64-bit | 2**80 | 20 | x.1.5 | - id-blake2b256 | 64-bit | 2**128 | 32 | x.1.8 | - id-blake2b384 | 64-bit | 2**192 | 48 | x.1.12 | - id-blake2b512 | 64-bit | 2**256 | 64 | x.1.16 | - ---------------+--------+-----------+------+------------+ - id-blake2s128 | 32-bit | 2**64 | 16 | x.2.4 | - id-blake2s160 | 32-bit | 2**80 | 20 | x.2.5 | - id-blake2s224 | 32-bit | 2**112 | 28 | x.2.7 | - id-blake2s256 | 32-bit | 2**128 | 32 | x.2.8 | - ---------------+--------+-----------+------+------------+ - - hashAlgs OBJECT IDENTIFIER ::= { - iso(1) identified-organization(3) dod(6) internet(1) - private(4) enterprise(1) kudelski(1722) cryptography(12) 2 - } - macAlgs OBJECT IDENTIFIER ::= { - iso(1) identified-organization(3) dod(6) internet(1) - private(4) enterprise(1) kudelski(1722) cryptography(12) 3 - } - - -- the two BLAKE2 variants -- - blake2b OBJECT IDENTIFIER ::= { hashAlgs 1 } - blake2s OBJECT IDENTIFIER ::= { hashAlgs 2 } - - -- BLAKE2b Identifiers -- - id-blake2b160 OBJECT IDENTIFIER ::= { blake2b 5 } - id-blake2b256 OBJECT IDENTIFIER ::= { blake2b 8 } - id-blake2b384 OBJECT IDENTIFIER ::= { blake2b 12 } - id-blake2b512 OBJECT IDENTIFIER ::= { blake2b 16 } - - - - - -Saarinen & Aumasson Informational [Page 10] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - - -- BLAKE2s Identifiers -- - id-blake2s128 OBJECT IDENTIFIER ::= { blake2s 4 } - id-blake2s160 OBJECT IDENTIFIER ::= { blake2s 5 } - id-blake2s224 OBJECT IDENTIFIER ::= { blake2s 7 } - id-blake2s256 OBJECT IDENTIFIER ::= { blake2s 8 } - -5. Security Considerations - - This document is intended to provide convenient open-source access by - the Internet community to the BLAKE2 cryptographic hash algorithm. - We wish to make no independent assertion to its security in this - document. We refer the reader to [BLAKE] and [BLAKE2] for detailed - cryptanalytic rationale behind its design. - - In order to avoid bloat, the reference implementations in Appendices - C and D may not erase all sensitive data (such as secret keys) - immediately from process memory after use. Such cleanup can be added - if needed. - -6. References - -6.1. Normative References - - [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate - Requirement Levels", BCP 14, RFC 2119, - DOI 10.17487/RFC2119, March 1997, - . - -6.2. Informative References - - [BLAKE] Aumasson, J-P., Meier, W., Phan, R., and L. Henzen, "The - Hash Function BLAKE", January 2015, - . - - [BLAKE2] Aumasson, J-P., Neves, S., Wilcox-O'Hearn, Z., and C. - Winnerlein, "BLAKE2: simpler, smaller, fast as MD5", - January 2013, . - - [FIPS140-2IG] - NIST, "Implementation Guidance for FIPS PUB 140-2 and the - Cryptographic Module Validation Program", September 2015, - . - - [RFC6151] Turner, S. and L. Chen, "Updated Security Considerations - for the MD5 Message-Digest and the HMAC-MD5 Algorithms", - RFC 6151, DOI 10.17487/RFC6151, March 2011, - . - - - -Saarinen & Aumasson Informational [Page 11] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - - [RFC6234] Eastlake 3rd, D. and T. Hansen, "US Secure Hash Algorithms - (SHA and SHA-based HMAC and HKDF)", RFC 6234, - DOI 10.17487/RFC6234, May 2011, - . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Saarinen & Aumasson Informational [Page 12] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - -Appendix A. Example of BLAKE2b Computation - - We compute the unkeyed hash of three ASCII bytes "abc" with - BLAKE2b-512 and show internal values during computation. - - m[16] = 0000000000636261 0000000000000000 0000000000000000 - 0000000000000000 0000000000000000 0000000000000000 - 0000000000000000 0000000000000000 0000000000000000 - 0000000000000000 0000000000000000 0000000000000000 - 0000000000000000 0000000000000000 0000000000000000 - 0000000000000000 - - (i= 0) v[16] = 6A09E667F2BDC948 BB67AE8584CAA73B 3C6EF372FE94F82B - A54FF53A5F1D36F1 510E527FADE682D1 9B05688C2B3E6C1F - 1F83D9ABFB41BD6B 5BE0CD19137E2179 6A09E667F3BCC908 - BB67AE8584CAA73B 3C6EF372FE94F82B A54FF53A5F1D36F1 - 510E527FADE682D2 9B05688C2B3E6C1F E07C265404BE4294 - 5BE0CD19137E2179 - - (i= 1) v[16] = 86B7C1568029BB79 C12CBCC809FF59F3 C6A5214CC0EACA8E - 0C87CD524C14CC5D 44EE6039BD86A9F7 A447C850AA694A7E - DE080F1BB1C0F84B 595CB8A9A1ACA66C BEC3AE837EAC4887 - 6267FC79DF9D6AD1 FA87B01273FA6DBE 521A715C63E08D8A - E02D0975B8D37A83 1C7B754F08B7D193 8F885A76B6E578FE - 2318A24E2140FC64 - - (i= 2) v[16] = 53281E83806010F2 3594B403F81B4393 8CD63C7462DE0DFF - 85F693F3DA53F974 BAABDBB2F386D9AE CA5425AEC65A10A8 - C6A22E2FF0F7AA48 C6A56A51CB89C595 224E6A3369224F96 - 500E125E58A92923 E9E4AD0D0E1A0D48 85DF9DC143C59A74 - 92A3AAAA6D952B7F C5FDF71090FAE853 2A8A40F15A462DD0 - 572D17EFFDD37358 - - (i= 3) v[16] = 60ED96AA7AD41725 E46A743C71800B9D 1A04B543A01F156B - A2F8716E775C4877 DA0A61BCDE4267EA B1DD230754D7BDEE - 25A1422779E06D14 E6823AE4C3FF58A5 A1677E19F37FD5DA - 22BDCE6976B08C51 F1DE8696BEC11BF1 A0EBD586A4A1D2C8 - C804EBAB11C99FA9 8E0CEC959C715793 7C45557FAE0D4D89 - 716343F52FDD265E - - (i= 4) v[16] = BB2A77D3A8382351 45EB47971F23B103 98BE297F6E45C684 - A36077DEE3370B89 8A03C4CB7E97590A 24192E49EBF54EA0 - 4F82C9401CB32D7A 8CCD013726420DC4 A9C9A8F17B1FC614 - 55908187977514A0 5B44273E66B19D27 B6D5C9FCA2579327 - 086092CFB858437E 5C4BE2156DBEECF9 2EFEDE99ED4EFF16 - 3E7B5F234CD1F804 - - - - - -Saarinen & Aumasson Informational [Page 13] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - - (i= 5) v[16] = C79C15B3D423B099 2DA2224E8DA97556 77D2B26DF1C45C55 - 8934EB09A3456052 0F6D9EEED157DA2A 6FE66467AF88C0A9 - 4EB0B76284C7AAFB 299C8E725D954697 B2240B59E6D567D3 - 2643C2370E49EBFD 79E02EEF20CDB1AE 64B3EED7BB602F39 - B97D2D439E4DF63D C718E755294C9111 1F0893F2772BB373 - 1205EA4A7859807D - - (i= 6) v[16] = E58F97D6385BAEE4 7640AA9764DA137A DEB4C7C23EFE287E - 70F6F41C8783C9F6 7127CD48C76A7708 9E472AF0BE3DB3F6 - 0F244C62DDF71788 219828AA83880842 41CCA9073C8C4D0D - 5C7912BC10DF3B4B A2C3ABBD37510EE2 CB5668CC2A9F7859 - 8733794F07AC1500 C67A6BE42335AA6F ACB22B28681E4C82 - DB2161604CBC9828 - - (i= 7) v[16] = 6E2D286EEADEDC81 BCF02C0787E86358 57D56A56DD015EDF - 55D899D40A5D0D0A 819415B56220C459 B63C479A6A769F02 - 258E55E0EC1F362A 3A3B4EC60E19DFDC 04D769B3FCB048DB - B78A9A33E9BFF4DD 5777272AE1E930C0 5A387849E578DBF6 - 92AAC307CF2C0AFC 30AACCC4F06DAFAA 483893CC094F8863 - E03C6CC89C26BF92 - - (i= 8) v[16] = FFC83ECE76024D01 1BE7BFFB8C5CC5F9 A35A18CBAC4C65B7 - B7C2C7E6D88C285F 81937DA314A50838 E1179523A2541963 - 3A1FAD7106232B8F 1C7EDE92AB8B9C46 A3C2D35E4F685C10 - A53D3F73AA619624 30BBCC0285A22F65 BCEFBB6A81539E5D - 3841DEF6F4C9848A 98662C85FBA726D4 7762439BD5A851BD - B0B9F0D443D1A889 - - (i= 9) v[16] = 753A70A1E8FAEADD 6B0D43CA2C25D629 F8343BA8B94F8C0B - BC7D062B0DB5CF35 58540EE1B1AEBC47 63C5B9B80D294CB9 - 490870ECAD27DEBD B2A90DDF667287FE 316CC9EBEEFAD8FC - 4A466BCD021526A4 5DA7F7638CEC5669 D9C8826727D306FC - 88ED6C4F3BD7A537 19AE688DDF67F026 4D8707AAB40F7E6D - FD3F572687FEA4F1 - - (i=10) v[16] = E630C747CCD59C4F BC713D41127571CA 46DB183025025078 - 6727E81260610140 2D04185EAC2A8CBA 5F311B88904056EC - 40BD313009201AAB 0099D4F82A2A1EAB 6DD4FBC1DE60165D - B3B0B51DE3C86270 900AEE2F233B08E5 A07199D87AD058D8 - 2C6B25593D717852 37E8CA471BEAA5F8 2CFC1BAC10EF4457 - 01369EC18746E775 - - (i=11) v[16] = E801F73B9768C760 35C6D22320BE511D 306F27584F65495E - B51776ADF569A77B F4F1BE86690B3C34 3CC88735D1475E4B - 5DAC67921FF76949 1CDB9D31AD70CC4E 35BA354A9C7DF448 - 4929CBE45679D73E 733D1A17248F39DB 92D57B736F5F170A - 61B5C0A41D491399 B5C333457E12844A BD696BE010D0D889 - 02231E1A917FE0BD - - - -Saarinen & Aumasson Informational [Page 14] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - - (i=12) v[16] = 12EF8A641EC4F6D6 BCED5DE977C9FAF5 733CA476C5148639 - 97DF596B0610F6FC F42C16519AD5AFA7 AA5AC1888E10467E - 217D930AA51787F3 906A6FF19E573942 75AB709BD3DCBF24 - EE7CE1F345947AA4 F8960D6C2FAF5F5E E332538A36B6D246 - 885BEF040EF6AA0B A4939A417BFB78A3 646CBB7AF6DCE980 - E813A23C60AF3B82 - - h[8] = 0D4D1C983FA580BA E9F6129FB697276A B7C45A68142F214C - D1A2FFDB6FBB124B 2D79AB2A39C5877D 95CC3345DED552C2 - 5A92F1DBA88AD318 239900D4ED8623B9 - - BLAKE2b-512("abc") = BA 80 A5 3F 98 1C 4D 0D 6A 27 97 B6 9F 12 F6 E9 - 4C 21 2F 14 68 5A C4 B7 4B 12 BB 6F DB FF A2 D1 - 7D 87 C5 39 2A AB 79 2D C2 52 D5 DE 45 33 CC 95 - 18 D3 8A A8 DB F1 92 5A B9 23 86 ED D4 00 99 23 - -Appendix B. Example of BLAKE2s Computation - - We compute the unkeyed hash of three ASCII bytes "abc" with - BLAKE2s-256 and show internal values during computation. - - m[16] = 00636261 00000000 00000000 00000000 00000000 00000000 - 00000000 00000000 00000000 00000000 00000000 00000000 - 00000000 00000000 00000000 00000000 - - (i=0) v[16] = 6B08E647 BB67AE85 3C6EF372 A54FF53A 510E527F 9B05688C - 1F83D9AB 5BE0CD19 6A09E667 BB67AE85 3C6EF372 A54FF53A - 510E527C 9B05688C E07C2654 5BE0CD19 - - (i=1) v[16] = 16A3242E D7B5E238 CE8CE24B 927AEDE1 A7B430D9 93A4A14E - A44E7C31 41D4759B 95BF33D3 9A99C181 608A3A6B B666383E - 7A8DD50F BE378ED7 353D1EE6 3BB44C6B - - (i=2) v[16] = 3AE30FE3 0982A96B E88185B4 3E339B16 F24338CD 0E66D326 - E005ED0C D591A277 180B1F3A FCF43914 30DB62D6 4847831C - 7F00C58E FB847886 C544E836 524AB0E2 - - (i=3) v[16] = 7A3BE783 997546C1 D45246DF EDB5F821 7F98A742 10E864E2 - D4AB70D0 C63CB1AB 6038DA9E 414594B0 F2C218B5 8DA0DCB7 - D7CD7AF5 AB4909DF 85031A52 C4EDFC98 - - (i=4) v[16] = 2A8B8CB7 1ACA82B2 14045D7F CC7258ED 383CF67C E090E7F9 - 3025D276 57D04DE4 994BACF0 F0982759 F17EE300 D48FC2D5 - DC854C10 523898A9 C03A0F89 47D6CD88 - - (i=5) v[16] = C4AA2DDB 111343A3 D54A700A 574A00A9 857D5A48 B1E11989 - 6F5C52DF DD2C53A3 678E5F8E 9718D4E9 622CB684 92976076 - 0E41A517 359DC2BE 87A87DDD 643F9CEC - - - -Saarinen & Aumasson Informational [Page 15] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - - (i=6) v[16] = 3453921C D7595EE1 592E776D 3ED6A974 4D997CB3 DE9212C3 - 35ADF5C9 9916FD65 96562E89 4EAD0792 EBFC2712 2385F5B2 - F34600FB D7BC20FB EB452A7B ECE1AA40 - - (i=7) v[16] = BE851B2D A85F6358 81E6FC3B 0BB28000 FA55A33A 87BE1FAD - 4119370F 1E2261AA A1318FD3 F4329816 071783C2 6E536A8D - 9A81A601 E7EC80F1 ACC09948 F849A584 - - (i=8) v[16] = 07E5B85A 069CC164 F9DE3141 A56F4680 9E440AD2 9AB659EA - 3C84B971 21DBD9CF 46699F8C 765257EC AF1D998C 75E4C3B6 - 523878DC 30715015 397FEE81 4F1FA799 - - (i=9) v[16] = 435148C4 A5AA2D11 4B354173 D543BC9E BDA2591C BF1D2569 - 4FCB3120 707ADA48 565B3FDE 32C9C916 EAF4A1AB B1018F28 - 8078D978 68ADE4B5 9778FDA3 2863B92E - - (i=10) v[16] = D9C994AA CFEC3AA6 700D0AB2 2C38670E AF6A1F66 1D023EF3 - 1D9EC27D 945357A5 3E9FFEBD 969FE811 EF485E21 A632797A - DEEF082E AF3D80E1 4E86829B 4DEAFD3A - - h[8] = 8C5E8C50 E2147C32 A32BA7E1 2F45EB4E 208B4537 293AD69E - 4C9B994D 82596786 - - BLAKE2s-256("abc") = 50 8C 5E 8C 32 7C 14 E2 E1 A7 2B A3 4E EB 45 2F - 37 45 8B 20 9E D6 3A 29 4D 99 9B 4C 86 67 59 82 - -Appendix C. BLAKE2b Implementation C Source - -C.1. blake2b.h - - - // blake2b.h - // BLAKE2b Hashing Context and API Prototypes - - #ifndef BLAKE2B_H - #define BLAKE2B_H - - #include - #include - - // state context - typedef struct { - uint8_t b[128]; // input buffer - uint64_t h[8]; // chained state - uint64_t t[2]; // total number of bytes - size_t c; // pointer for b[] - size_t outlen; // digest size - } blake2b_ctx; - - - -Saarinen & Aumasson Informational [Page 16] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - - // Initialize the hashing context "ctx" with optional key "key". - // 1 <= outlen <= 64 gives the digest size in bytes. - // Secret key (also <= 64 bytes) is optional (keylen = 0). - int blake2b_init(blake2b_ctx *ctx, size_t outlen, - const void *key, size_t keylen); // secret key - - // Add "inlen" bytes from "in" into the hash. - void blake2b_update(blake2b_ctx *ctx, // context - const void *in, size_t inlen); // data to be hashed - - // Generate the message digest (size given in init). - // Result placed in "out". - void blake2b_final(blake2b_ctx *ctx, void *out); - - // All-in-one convenience function. - int blake2b(void *out, size_t outlen, // return buffer for digest - const void *key, size_t keylen, // optional secret key - const void *in, size_t inlen); // data to be hashed - - #endif - - -C.2. blake2b.c - - - // blake2b.c - // A simple BLAKE2b Reference Implementation. - - #include "blake2b.h" - - // Cyclic right rotation. - - #ifndef ROTR64 - #define ROTR64(x, y) (((x) >> (y)) ^ ((x) << (64 - (y)))) - #endif - - // Little-endian byte access. - - #define B2B_GET64(p) \ - (((uint64_t) ((uint8_t *) (p))[0]) ^ \ - (((uint64_t) ((uint8_t *) (p))[1]) << 8) ^ \ - (((uint64_t) ((uint8_t *) (p))[2]) << 16) ^ \ - (((uint64_t) ((uint8_t *) (p))[3]) << 24) ^ \ - (((uint64_t) ((uint8_t *) (p))[4]) << 32) ^ \ - (((uint64_t) ((uint8_t *) (p))[5]) << 40) ^ \ - (((uint64_t) ((uint8_t *) (p))[6]) << 48) ^ \ - (((uint64_t) ((uint8_t *) (p))[7]) << 56)) - - - - -Saarinen & Aumasson Informational [Page 17] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - - // G Mixing function. - - #define B2B_G(a, b, c, d, x, y) { \ - v[a] = v[a] + v[b] + x; \ - v[d] = ROTR64(v[d] ^ v[a], 32); \ - v[c] = v[c] + v[d]; \ - v[b] = ROTR64(v[b] ^ v[c], 24); \ - v[a] = v[a] + v[b] + y; \ - v[d] = ROTR64(v[d] ^ v[a], 16); \ - v[c] = v[c] + v[d]; \ - v[b] = ROTR64(v[b] ^ v[c], 63); } - - // Initialization Vector. - - static const uint64_t blake2b_iv[8] = { - 0x6A09E667F3BCC908, 0xBB67AE8584CAA73B, - 0x3C6EF372FE94F82B, 0xA54FF53A5F1D36F1, - 0x510E527FADE682D1, 0x9B05688C2B3E6C1F, - 0x1F83D9ABFB41BD6B, 0x5BE0CD19137E2179 - }; - - // Compression function. "last" flag indicates last block. - - static void blake2b_compress(blake2b_ctx *ctx, int last) - { - const uint8_t sigma[12][16] = { - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, - { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 }, - { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 }, - { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 }, - { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 }, - { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 }, - { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 }, - { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 }, - { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 }, - { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0 }, - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, - { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } - }; - int i; - uint64_t v[16], m[16]; - - for (i = 0; i < 8; i++) { // init work variables - v[i] = ctx->h[i]; - v[i + 8] = blake2b_iv[i]; - } - - - - - -Saarinen & Aumasson Informational [Page 18] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - - v[12] ^= ctx->t[0]; // low 64 bits of offset - v[13] ^= ctx->t[1]; // high 64 bits - if (last) // last block flag set ? - v[14] = ~v[14]; - - for (i = 0; i < 16; i++) // get little-endian words - m[i] = B2B_GET64(&ctx->b[8 * i]); - - for (i = 0; i < 12; i++) { // twelve rounds - B2B_G( 0, 4, 8, 12, m[sigma[i][ 0]], m[sigma[i][ 1]]); - B2B_G( 1, 5, 9, 13, m[sigma[i][ 2]], m[sigma[i][ 3]]); - B2B_G( 2, 6, 10, 14, m[sigma[i][ 4]], m[sigma[i][ 5]]); - B2B_G( 3, 7, 11, 15, m[sigma[i][ 6]], m[sigma[i][ 7]]); - B2B_G( 0, 5, 10, 15, m[sigma[i][ 8]], m[sigma[i][ 9]]); - B2B_G( 1, 6, 11, 12, m[sigma[i][10]], m[sigma[i][11]]); - B2B_G( 2, 7, 8, 13, m[sigma[i][12]], m[sigma[i][13]]); - B2B_G( 3, 4, 9, 14, m[sigma[i][14]], m[sigma[i][15]]); - } - - for( i = 0; i < 8; ++i ) - ctx->h[i] ^= v[i] ^ v[i + 8]; - } - - // Initialize the hashing context "ctx" with optional key "key". - // 1 <= outlen <= 64 gives the digest size in bytes. - // Secret key (also <= 64 bytes) is optional (keylen = 0). - - int blake2b_init(blake2b_ctx *ctx, size_t outlen, - const void *key, size_t keylen) // (keylen=0: no key) - { - size_t i; - - if (outlen == 0 || outlen > 64 || keylen > 64) - return -1; // illegal parameters - - for (i = 0; i < 8; i++) // state, "param block" - ctx->h[i] = blake2b_iv[i]; - ctx->h[0] ^= 0x01010000 ^ (keylen << 8) ^ outlen; - - ctx->t[0] = 0; // input count low word - ctx->t[1] = 0; // input count high word - ctx->c = 0; // pointer within buffer - ctx->outlen = outlen; - - - - - - - - -Saarinen & Aumasson Informational [Page 19] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - - for (i = keylen; i < 128; i++) // zero input block - ctx->b[i] = 0; - if (keylen > 0) { - blake2b_update(ctx, key, keylen); - ctx->c = 128; // at the end - } - - return 0; - } - - // Add "inlen" bytes from "in" into the hash. - - void blake2b_update(blake2b_ctx *ctx, - const void *in, size_t inlen) // data bytes - { - size_t i; - - for (i = 0; i < inlen; i++) { - if (ctx->c == 128) { // buffer full ? - ctx->t[0] += ctx->c; // add counters - if (ctx->t[0] < ctx->c) // carry overflow ? - ctx->t[1]++; // high word - blake2b_compress(ctx, 0); // compress (not last) - ctx->c = 0; // counter to zero - } - ctx->b[ctx->c++] = ((const uint8_t *) in)[i]; - } - } - - // Generate the message digest (size given in init). - // Result placed in "out". - - void blake2b_final(blake2b_ctx *ctx, void *out) - { - size_t i; - - ctx->t[0] += ctx->c; // mark last block offset - if (ctx->t[0] < ctx->c) // carry overflow - ctx->t[1]++; // high word - - while (ctx->c < 128) // fill up with zeros - ctx->b[ctx->c++] = 0; - blake2b_compress(ctx, 1); // final block flag = 1 - - - - - - - - -Saarinen & Aumasson Informational [Page 20] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - - // little endian convert and store - for (i = 0; i < ctx->outlen; i++) { - ((uint8_t *) out)[i] = - (ctx->h[i >> 3] >> (8 * (i & 7))) & 0xFF; - } - } - - // Convenience function for all-in-one computation. - - int blake2b(void *out, size_t outlen, - const void *key, size_t keylen, - const void *in, size_t inlen) - { - blake2b_ctx ctx; - - if (blake2b_init(&ctx, outlen, key, keylen)) - return -1; - blake2b_update(&ctx, in, inlen); - blake2b_final(&ctx, out); - - return 0; - } - - -Appendix D. BLAKE2s Implementation C Source - -D.1. blake2s.h - - - // blake2s.h - // BLAKE2s Hashing Context and API Prototypes - - #ifndef BLAKE2S_H - #define BLAKE2S_H - - #include - #include - - // state context - typedef struct { - uint8_t b[64]; // input buffer - uint32_t h[8]; // chained state - uint32_t t[2]; // total number of bytes - size_t c; // pointer for b[] - size_t outlen; // digest size - } blake2s_ctx; - - - - - -Saarinen & Aumasson Informational [Page 21] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - - // Initialize the hashing context "ctx" with optional key "key". - // 1 <= outlen <= 32 gives the digest size in bytes. - // Secret key (also <= 32 bytes) is optional (keylen = 0). - int blake2s_init(blake2s_ctx *ctx, size_t outlen, - const void *key, size_t keylen); // secret key - - // Add "inlen" bytes from "in" into the hash. - void blake2s_update(blake2s_ctx *ctx, // context - const void *in, size_t inlen); // data to be hashed - - // Generate the message digest (size given in init). - // Result placed in "out". - void blake2s_final(blake2s_ctx *ctx, void *out); - - // All-in-one convenience function. - int blake2s(void *out, size_t outlen, // return buffer for digest - const void *key, size_t keylen, // optional secret key - const void *in, size_t inlen); // data to be hashed - - #endif - - -D.2. blake2s.c - - - // blake2s.c - // A simple blake2s Reference Implementation. - - #include "blake2s.h" - - // Cyclic right rotation. - - #ifndef ROTR32 - #define ROTR32(x, y) (((x) >> (y)) ^ ((x) << (32 - (y)))) - #endif - - // Little-endian byte access. - - #define B2S_GET32(p) \ - (((uint32_t) ((uint8_t *) (p))[0]) ^ \ - (((uint32_t) ((uint8_t *) (p))[1]) << 8) ^ \ - (((uint32_t) ((uint8_t *) (p))[2]) << 16) ^ \ - (((uint32_t) ((uint8_t *) (p))[3]) << 24)) - - - - - - - - -Saarinen & Aumasson Informational [Page 22] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - - // Mixing function G. - - #define B2S_G(a, b, c, d, x, y) { \ - v[a] = v[a] + v[b] + x; \ - v[d] = ROTR32(v[d] ^ v[a], 16); \ - v[c] = v[c] + v[d]; \ - v[b] = ROTR32(v[b] ^ v[c], 12); \ - v[a] = v[a] + v[b] + y; \ - v[d] = ROTR32(v[d] ^ v[a], 8); \ - v[c] = v[c] + v[d]; \ - v[b] = ROTR32(v[b] ^ v[c], 7); } - - // Initialization Vector. - - static const uint32_t blake2s_iv[8] = - { - 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, - 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19 - }; - - // Compression function. "last" flag indicates last block. - - static void blake2s_compress(blake2s_ctx *ctx, int last) - { - const uint8_t sigma[10][16] = { - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, - { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 }, - { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 }, - { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 }, - { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 }, - { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 }, - { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 }, - { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 }, - { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 }, - { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0 } - }; - int i; - uint32_t v[16], m[16]; - - for (i = 0; i < 8; i++) { // init work variables - v[i] = ctx->h[i]; - v[i + 8] = blake2s_iv[i]; - } - - v[12] ^= ctx->t[0]; // low 32 bits of offset - v[13] ^= ctx->t[1]; // high 32 bits - if (last) // last block flag set ? - v[14] = ~v[14]; - - - -Saarinen & Aumasson Informational [Page 23] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - - for (i = 0; i < 16; i++) // get little-endian words - m[i] = B2S_GET32(&ctx->b[4 * i]); - - for (i = 0; i < 10; i++) { // ten rounds - B2S_G( 0, 4, 8, 12, m[sigma[i][ 0]], m[sigma[i][ 1]]); - B2S_G( 1, 5, 9, 13, m[sigma[i][ 2]], m[sigma[i][ 3]]); - B2S_G( 2, 6, 10, 14, m[sigma[i][ 4]], m[sigma[i][ 5]]); - B2S_G( 3, 7, 11, 15, m[sigma[i][ 6]], m[sigma[i][ 7]]); - B2S_G( 0, 5, 10, 15, m[sigma[i][ 8]], m[sigma[i][ 9]]); - B2S_G( 1, 6, 11, 12, m[sigma[i][10]], m[sigma[i][11]]); - B2S_G( 2, 7, 8, 13, m[sigma[i][12]], m[sigma[i][13]]); - B2S_G( 3, 4, 9, 14, m[sigma[i][14]], m[sigma[i][15]]); - } - - for( i = 0; i < 8; ++i ) - ctx->h[i] ^= v[i] ^ v[i + 8]; - } - - // Initialize the hashing context "ctx" with optional key "key". - // 1 <= outlen <= 32 gives the digest size in bytes. - // Secret key (also <= 32 bytes) is optional (keylen = 0). - - int blake2s_init(blake2s_ctx *ctx, size_t outlen, - const void *key, size_t keylen) // (keylen=0: no key) - { - size_t i; - - if (outlen == 0 || outlen > 32 || keylen > 32) - return -1; // illegal parameters - - for (i = 0; i < 8; i++) // state, "param block" - ctx->h[i] = blake2s_iv[i]; - ctx->h[0] ^= 0x01010000 ^ (keylen << 8) ^ outlen; - - ctx->t[0] = 0; // input count low word - ctx->t[1] = 0; // input count high word - ctx->c = 0; // pointer within buffer - ctx->outlen = outlen; - - for (i = keylen; i < 64; i++) // zero input block - ctx->b[i] = 0; - if (keylen > 0) { - blake2s_update(ctx, key, keylen); - ctx->c = 64; // at the end - } - - return 0; - } - - - -Saarinen & Aumasson Informational [Page 24] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - - // Add "inlen" bytes from "in" into the hash. - - void blake2s_update(blake2s_ctx *ctx, - const void *in, size_t inlen) // data bytes - { - size_t i; - - for (i = 0; i < inlen; i++) { - if (ctx->c == 64) { // buffer full ? - ctx->t[0] += ctx->c; // add counters - if (ctx->t[0] < ctx->c) // carry overflow ? - ctx->t[1]++; // high word - blake2s_compress(ctx, 0); // compress (not last) - ctx->c = 0; // counter to zero - } - ctx->b[ctx->c++] = ((const uint8_t *) in)[i]; - } - } - - // Generate the message digest (size given in init). - // Result placed in "out". - - void blake2s_final(blake2s_ctx *ctx, void *out) - { - size_t i; - - ctx->t[0] += ctx->c; // mark last block offset - if (ctx->t[0] < ctx->c) // carry overflow - ctx->t[1]++; // high word - - while (ctx->c < 64) // fill up with zeros - ctx->b[ctx->c++] = 0; - blake2s_compress(ctx, 1); // final block flag = 1 - - // little endian convert and store - for (i = 0; i < ctx->outlen; i++) { - ((uint8_t *) out)[i] = - (ctx->h[i >> 2] >> (8 * (i & 3))) & 0xFF; - } - } - - // Convenience function for all-in-one computation. - - int blake2s(void *out, size_t outlen, - const void *key, size_t keylen, - const void *in, size_t inlen) - { - blake2s_ctx ctx; - - - -Saarinen & Aumasson Informational [Page 25] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - - if (blake2s_init(&ctx, outlen, key, keylen)) - return -1; - blake2s_update(&ctx, in, inlen); - blake2s_final(&ctx, out); - - return 0; - } - - -Appendix E. BLAKE2b and BLAKE2s Self-Test Module C Source - - This module computes a series of keyed and unkeyed hashes from - deterministically generated pseudorandom data and computes a hash - over those results. This is a fairly exhaustive, yet compact and - fast method for verifying that the hashing module is functioning - correctly. - - Such testing is RECOMMENDED, especially when compiling the - implementation for a new a target platform configuration. - Furthermore, some security standards, such as FIPS-140, may require a - Power-On Self Test (POST) to be performed every time the - cryptographic module is loaded [FIPS140-2IG]. - - - // test_main.c - // Self test Modules for BLAKE2b and BLAKE2s -- and a stub main(). - - #include - - #include "blake2b.h" - #include "blake2s.h" - - // Deterministic sequences (Fibonacci generator). - - static void selftest_seq(uint8_t *out, size_t len, uint32_t seed) - { - size_t i; - uint32_t t, a , b; - - a = 0xDEAD4BAD * seed; // prime - b = 1; - - for (i = 0; i < len; i++) { // fill the buf - t = a + b; - a = b; - b = t; - out[i] = (t >> 24) & 0xFF; - } - - - -Saarinen & Aumasson Informational [Page 26] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - - } - - // BLAKE2b self-test validation. Return 0 when OK. - - int blake2b_selftest() - { - // grand hash of hash results - const uint8_t blake2b_res[32] = { - 0xC2, 0x3A, 0x78, 0x00, 0xD9, 0x81, 0x23, 0xBD, - 0x10, 0xF5, 0x06, 0xC6, 0x1E, 0x29, 0xDA, 0x56, - 0x03, 0xD7, 0x63, 0xB8, 0xBB, 0xAD, 0x2E, 0x73, - 0x7F, 0x5E, 0x76, 0x5A, 0x7B, 0xCC, 0xD4, 0x75 - }; - // parameter sets - const size_t b2b_md_len[4] = { 20, 32, 48, 64 }; - const size_t b2b_in_len[6] = { 0, 3, 128, 129, 255, 1024 }; - - size_t i, j, outlen, inlen; - uint8_t in[1024], md[64], key[64]; - blake2b_ctx ctx; - - // 256-bit hash for testing - if (blake2b_init(&ctx, 32, NULL, 0)) - return -1; - - for (i = 0; i < 4; i++) { - outlen = b2b_md_len[i]; - for (j = 0; j < 6; j++) { - inlen = b2b_in_len[j]; - - selftest_seq(in, inlen, inlen); // unkeyed hash - blake2b(md, outlen, NULL, 0, in, inlen); - blake2b_update(&ctx, md, outlen); // hash the hash - - selftest_seq(key, outlen, outlen); // keyed hash - blake2b(md, outlen, key, outlen, in, inlen); - blake2b_update(&ctx, md, outlen); // hash the hash - } - } - - // compute and compare the hash of hashes - blake2b_final(&ctx, md); - for (i = 0; i < 32; i++) { - if (md[i] != blake2b_res[i]) - return -1; - } - - return 0; - - - -Saarinen & Aumasson Informational [Page 27] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - - } - - // BLAKE2s self-test validation. Return 0 when OK. - - int blake2s_selftest() - { - // Grand hash of hash results. - const uint8_t blake2s_res[32] = { - 0x6A, 0x41, 0x1F, 0x08, 0xCE, 0x25, 0xAD, 0xCD, - 0xFB, 0x02, 0xAB, 0xA6, 0x41, 0x45, 0x1C, 0xEC, - 0x53, 0xC5, 0x98, 0xB2, 0x4F, 0x4F, 0xC7, 0x87, - 0xFB, 0xDC, 0x88, 0x79, 0x7F, 0x4C, 0x1D, 0xFE - }; - // Parameter sets. - const size_t b2s_md_len[4] = { 16, 20, 28, 32 }; - const size_t b2s_in_len[6] = { 0, 3, 64, 65, 255, 1024 }; - - size_t i, j, outlen, inlen; - uint8_t in[1024], md[32], key[32]; - blake2s_ctx ctx; - - // 256-bit hash for testing. - if (blake2s_init(&ctx, 32, NULL, 0)) - return -1; - - for (i = 0; i < 4; i++) { - outlen = b2s_md_len[i]; - for (j = 0; j < 6; j++) { - inlen = b2s_in_len[j]; - - selftest_seq(in, inlen, inlen); // unkeyed hash - blake2s(md, outlen, NULL, 0, in, inlen); - blake2s_update(&ctx, md, outlen); // hash the hash - - selftest_seq(key, outlen, outlen); // keyed hash - blake2s(md, outlen, key, outlen, in, inlen); - blake2s_update(&ctx, md, outlen); // hash the hash - } - } - - // Compute and compare the hash of hashes. - blake2s_final(&ctx, md); - for (i = 0; i < 32; i++) { - if (md[i] != blake2s_res[i]) - return -1; - } - - return 0; - - - -Saarinen & Aumasson Informational [Page 28] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - - } - - // Test driver. - - int main(int argc, char **argv) - { - printf("blake2b_selftest() = %s\n", - blake2b_selftest() ? "FAIL" : "OK"); - printf("blake2s_selftest() = %s\n", - blake2s_selftest() ? "FAIL" : "OK"); - - return 0; - } - - -Acknowledgements - - The editor wishes to thank the [BLAKE2] team for their encouragement: - Jean-Philippe Aumasson, Samuel Neves, Zooko Wilcox-O'Hearn, and - Christian Winnerlein. We have borrowed passages from [BLAKE] and - [BLAKE2] with permission. - - [BLAKE2] is based on the SHA-3 proposal [BLAKE], designed by Jean- - Philippe Aumasson, Luca Henzen, Willi Meier, and Raphael C.-W. Phan. - BLAKE2, like BLAKE, relies on a core algorithm borrowed from the - ChaCha stream cipher, designed by Daniel J. Bernstein. - - - - - - - - - - - - - - - - - - - - - - - - - -Saarinen & Aumasson Informational [Page 29] - -RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 - - -Authors' Addresses - - Markku-Juhani O. Saarinen (editor) - Queen's University Belfast - Centre for Secure Information Technologies, ECIT - Northern Ireland Science Park - Queen's Road, Queen's Island - Belfast BT3 9DT - United Kingdom - - Email: m.saarinen@qub.ac.uk - URI: http://www.csit.qub.ac.uk - - - Jean-Philippe Aumasson - Kudelski Security - 22-24, Route de Geneve - Case Postale 134 - Cheseaux 1033 - Switzerland - - Email: jean-philippe.aumasson@nagra.com - URI: https://www.kudelskisecurity.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Saarinen & Aumasson Informational [Page 30] - diff --git a/com/BLAKE2/test/blake2s_kat.c b/com/BLAKE2/test/blake2s_kat.c deleted file mode 100644 index 0581c18..0000000 --- a/com/BLAKE2/test/blake2s_kat.c +++ /dev/null @@ -1,31 +0,0 @@ -#include -#include -#include -#include - -#include "blake2s_kat.h" - -int -main(void) -{ - uint8_t in[256]; - for (int i = 0; i < 256; ++i) in[i] = i; - uint8_t out[32]; - - for (unsigned i = 0; i < KATs_len; ++i) { - assert(BLAKE2s(out, 32, NULL, 0, in, i) == 0); - assert(memcmp(out, KATs[i], 32) == 0); - } - - for (unsigned i = 0; i < 1; ++i) { - _Static_assert(sizeof(KAT_secret) == 32, "sizeof KAT_secret"); - assert(BLAKE2s(out, 32, KAT_secret, 32, in, i) == 0); - - for (unsigned j = 0; j < 32; ++j) printf("%02x ", out[j]); - printf("\n"); - for (unsigned j = 0; j < 32; ++j) printf("%02x ", secret_KATs[i][j]); - printf("\n"); - - assert(memcmp(out, secret_KATs[i], 32) == 0); - } -} diff --git a/com/BLAKE2/test/blake2s_kat.py b/com/BLAKE2/test/blake2s_kat.py deleted file mode 100755 index 2dd5370..0000000 --- a/com/BLAKE2/test/blake2s_kat.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python3 -# Known Answer Test generator - -import json -import hashlib -import secrets - -def blake2s(w, key): - ctx = hashlib.blake2s(key=key) - ctx.update(w) - return ctx.digest().hex() - -def out(s): - o = [s[i:i+2] for i in range(0, len(s), 2)] # split into pairs - o = [f'0x{i}' for i in o] # prepend 0x and join - return ', '.join(o) - -if __name__ == '__main__': - w = b'' - for i in range(0, 256): - w += i.to_bytes(1, 'little') - k = secrets.token_bytes(32) - - print('#pragma once\n') - print(f'static const unsigned KATs_len = 256;') - print(f'static const uint8_t KAT_secret[32] = {{ {", ".join([hex(i) for i in k])} }};') - - print(f'static const uint8_t KATs[256][32] = {{') - for i in range(0, 256): - o = blake2s(w[0:i], b'') - print(f' // {i}') - print(f' {{ {out(o)} }},') - print(f'}};') - - print(f'static const uint8_t secret_KATs[256][32] = {{') - for i in range(0, 256): - o = blake2s(w[0:i], k) - print(f' // {i}') - print(f' {{ {out(o)} }},') - print(f'}};') diff --git a/com/BLAKE2/test/blake2s_selftest.c b/com/BLAKE2/test/blake2s_selftest.c deleted file mode 100644 index 3ada150..0000000 --- a/com/BLAKE2/test/blake2s_selftest.c +++ /dev/null @@ -1,102 +0,0 @@ -// test_main.c -// Self test Modules for BLAKE2b and BLAKE2s -- and a stub main(). - -#include "blake2s.h" -#include -#include - -_Static_assert(sizeof(struct BLAKE2s_param) == (8 * sizeof(uint32_t)), "sizeof struct BLAKE2s_param"); - -// Deterministic sequences (Fibonacci generator). -static void -selftest_seq(uint8_t *out, size_t len, uint32_t seed) -{ - size_t i; - uint32_t t, a, b; - - a = 0xDEAD4BAD * seed; // prime - b = 1; - - for (i = 0; i < len; i++) { // fill the buf - t = a + b; - a = b; - b = t; - out[i] = (t >> 24) & 0xFF; - } -} - -// BLAKE2s self-test validation. Return 0 when OK. -int -blake2s_selftest() -{ - // Grand hash of hash results. - const uint8_t blake2s_res[32] = {0x6A, 0x41, 0x1F, 0x08, 0xCE, 0x25, 0xAD, 0xCD, 0xFB, 0x02, 0xAB, - 0xA6, 0x41, 0x45, 0x1C, 0xEC, 0x53, 0xC5, 0x98, 0xB2, 0x4F, 0x4F, - 0xC7, 0x87, 0xFB, 0xDC, 0x88, 0x79, 0x7F, 0x4C, 0x1D, 0xFE}; - // Parameter sets. - const size_t b2s_md_len[4] = {16, 20, 28, 32}; - const size_t b2s_in_len[6] = {0, 3, 64, 65, 255, 1024}; - - size_t i, j, outlen, inlen; - uint8_t in[1024], md[32], key[32]; - struct BLAKE2s_ctx ctx; - - // 256-bit hash for testing. - if (BLAKE2s_init(&ctx, 32, NULL, 0)) return -1; - - for (i = 0; i < 4; i++) { - outlen = b2s_md_len[i]; - for (j = 0; j < 6; j++) { - inlen = b2s_in_len[j]; - - selftest_seq(in, inlen, inlen); // unkeyed hash - BLAKE2s(md, outlen, NULL, 0, in, inlen); - BLAKE2s_update(&ctx, md, outlen); // hash the hash - - selftest_seq(key, outlen, outlen); // keyed hash - BLAKE2s(md, outlen, key, outlen, in, inlen); - BLAKE2s_update(&ctx, md, outlen); // hash the hash - } - } - - // Compute and compare the hash of hashes. - BLAKE2s_final(&ctx, md); - for (i = 0; i < 32; i++) { - if (md[i] != blake2s_res[i]) return -1; - } - - return 0; -} - -int -main(void) -{ - // functions - assert(rotr_u32(0xdecafade, 16) == 0xfadedeca); - assert(rotr_u32(0xdecafade, 8) == 0xdedecafa); - - const int good = blake2s_selftest(); - printf("blake2s_selftest() = %s\n", good ? "FAIL" : "OK"); - - char *in = "abc"; - size_t inlen = 3; - - uint8_t out[32]; - BLAKE2s(out, 32, NULL, 0, in, inlen); - - const uint8_t blake2s_res[32] = {0x50, 0x8C, 0x5E, 0x8C, 0x32, 0x7C, 0x14, 0xE2, 0xE1, 0xA7, 0x2B, - 0xA3, 0x4E, 0xEB, 0x45, 0x2F, 0x37, 0x45, 0x8B, 0x20, 0x9E, 0xD6, - 0x3A, 0x29, 0x4D, 0x99, 0x9B, 0x4C, 0x86, 0x67, 0x59, 0x82}; - - for (unsigned i = 0; i < 32; i++) { - if (out[i] != blake2s_res[i]) { - printf("digest failed"); - printf("\nout: "); - for (unsigned n = 0; n < 32; ++n) printf(" %02x", out[n]); - printf("\nres: "); - for (unsigned n = 0; n < 32; ++n) printf(" %02x", blake2s_res[n]); - return -1; - } - } - return good; -} diff --git a/lib/Makefile b/lib/Makefile index 9b34c20..385e5ba 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -1,10 +1,15 @@ include ../Makefile.config -libk.SRCS = stdio/printf.c stdio/fprintf.c stdio/vfprintf.cpp \ - stdlib/memcpy.c stdlib/memset.c stdlib/linked_list_allocator.c \ - string/itoa.c +libk.SRCS = \ + endian/little.c \ + stdio/printf.c stdio/fprintf.c stdio/vfprintf.cpp \ + stdlib/memcpy.c stdlib/memset.c stdlib/linked_list_allocator.c \ + string/itoa.c -TESTS += tst/test_mem tst/test_string tst/test_linked_list_allocator +TESTS += tst/test_endian_little tst/test_mem tst/test_string tst/test_linked_list_allocator + +blake2.SRCS = blake2/blake2s.c +TESTS += tst/test_blake2s_selftest include ../rules.mk diff --git a/lib/blake2/README.md b/lib/blake2/README.md new file mode 100644 index 0000000..223324e --- /dev/null +++ b/lib/blake2/README.md @@ -0,0 +1,7 @@ +## BLAKE2 +BLAKE2 is a cryptographic hash function faster than MD5, SHA-1, SHA-2, and SHA-3, yet is at least as secure as the +latest standard SHA-3. + +## BLAKE2s +BLAKE2s is optimized for 8 to 32-bit platforms and produces digests of any size between 1 and 32 bytes. + diff --git a/lib/blake2/blake2s.c b/lib/blake2/blake2s.c new file mode 100644 index 0000000..b924a1e --- /dev/null +++ b/lib/blake2/blake2s.c @@ -0,0 +1,123 @@ +#include "blake2s.h" +#include +#include +#include + +const uint32_t IV[8] = {0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19}; + +const uint8_t SIGMA[10][16] = { + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, {14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3}, + {11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4}, {7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8}, + {9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13}, {2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9}, + {12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11}, {13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10}, + {6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5}, {10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0}}; + +uint32_t +rotr_u32(uint32_t word, uint8_t c) +{ + return (word >> c) | (word << (32 - c)); +} + +void +G(uint32_t v[16], unsigned a, unsigned b, unsigned c, unsigned d, uint32_t x, uint32_t y) +{ + v[a] = v[a] + v[b] + x; + v[d] = rotr_u32(v[d] ^ v[a], 16); + v[c] = v[c] + v[d]; + v[b] = rotr_u32(v[b] ^ v[c], 12); + v[a] = v[a] + v[b] + y; + v[d] = rotr_u32(v[d] ^ v[a], 8); + v[c] = v[c] + v[d]; + v[b] = rotr_u32(v[b] ^ v[c], 7); +} + +void +F(struct BLAKE2s_ctx *ctx, uint32_t m[16], uint32_t f) +{ + // Initialize local work vector v + uint32_t v[16] = {ctx->h[0], ctx->h[1], ctx->h[2], ctx->h[3], ctx->h[4], ctx->h[5], + ctx->h[6], ctx->h[7], IV[0], IV[1], IV[2], IV[3], + IV[4] ^ ctx->t[0], IV[5] ^ ctx->t[1], IV[6], IV[7]}; + if (f) v[14] = ~v[14]; // if last block flag, invert all bits + + // cryptographic mixing + for (unsigned i = 0; i < 10; ++i) { + G(v, 0, 4, 8, 12, m[SIGMA[i][0]], m[SIGMA[i][1]]); + G(v, 1, 5, 9, 13, m[SIGMA[i][2]], m[SIGMA[i][3]]); + G(v, 2, 6, 10, 14, m[SIGMA[i][4]], m[SIGMA[i][5]]); + G(v, 3, 7, 11, 15, m[SIGMA[i][6]], m[SIGMA[i][7]]); + + G(v, 0, 5, 10, 15, m[SIGMA[i][8]], m[SIGMA[i][9]]); + G(v, 1, 6, 11, 12, m[SIGMA[i][10]], m[SIGMA[i][11]]); + G(v, 2, 7, 8, 13, m[SIGMA[i][12]], m[SIGMA[i][13]]); + G(v, 3, 4, 9, 14, m[SIGMA[i][14]], m[SIGMA[i][15]]); + } + + // xor the two halves + for (unsigned i = 0; i < 8; ++i) ctx->h[i] ^= (v[i] ^ v[i + 8]); +} + +int +BLAKE2s_init(struct BLAKE2s_ctx *ctx, uint8_t outlen, const void *key, uint8_t keylen) +{ + if (outlen == 0 || outlen > 32 || keylen > 32) { + return -1; + } + + memset(ctx, 0, sizeof(struct BLAKE2s_ctx)); + ctx->param.outlen = outlen; + ctx->param.keylen = keylen; + ctx->param.fanout = 1; + ctx->param.depth = 1; + + // copy IV into state vector h + memcpy(ctx->h, IV, 32); + // copy param block 0 onto h[0] + ctx->h[0] ^= (ctx->param.depth << 24) ^ (ctx->param.fanout << 16) ^ (keylen << 8) ^ outlen; + + if (keylen > 0) { + BLAKE2s_update(ctx, key, keylen); + ctx->c = 64; // at the end + } + + return 0; +} + +#define MIN(a, b) ((a < b) ? a : b) + +void +BLAKE2s_update(struct BLAKE2s_ctx *ctx, const void *d, size_t dd) +{ + for (unsigned i = 0; i < dd;) { + + if (ctx->c == 64) { // if block is full, consume block + ctx->t[0] += ctx->c; + if (ctx->t[0] < ctx->c) ctx->t[1] += 1; + ctx->c = 0; // reset counter + + uint32_t *m = (uint32_t *)ctx->b; + for (unsigned j = 0; j < 16; ++j) m[j] = htole32(m[j]); + F(ctx, m, 0); + } + + const uint8_t len = MIN(64 - ctx->c, dd - i); + memcpy(&ctx->b[ctx->c], &((uint8_t *)d)[i], len); + ctx->c += len; + i += len; + } +} + +void +BLAKE2s_final(struct BLAKE2s_ctx *ctx, void *out) +{ + ctx->t[0] += ctx->c; + if (ctx->t[0] < ctx->c) ctx->t[1] += 1; + for (; ctx->c < 64; ++(ctx->c)) ctx->b[ctx->c] = 0; // fill up block with zeroes + + uint32_t *m = (uint32_t *)ctx->b; + for (unsigned i = 0; i < 16; ++i) m[i] = htole32(m[i]); + F(ctx, m, 1); + + for (unsigned i = 0; i < ctx->param.outlen; ++i) ((uint8_t *)out)[i] = (ctx->h[i >> 2] >> (8 * (i & 3))) & 0xff; +} + diff --git a/lib/blake2/blake2s.h b/lib/blake2/blake2s.h new file mode 100644 index 0000000..64b4156 --- /dev/null +++ b/lib/blake2/blake2s.h @@ -0,0 +1,56 @@ +#pragma once + +#include +#include + +struct BLAKE2s_param { + uint8_t outlen; // digest length + uint8_t keylen; // key length + uint8_t fanout; + uint8_t depth; + uint32_t leaf_length; + uint32_t node_offset; + uint16_t node_offset_ex; + uint8_t node_depth; + uint8_t inner_length; + uint64_t salt; + uint64_t personalization; +}; + +struct BLAKE2s_ctx { + uint8_t b[64]; // input buffer + size_t c; // pointer for b[] + uint32_t h[8]; // chained state vector h + uint32_t t[2]; // total number of bytes + struct BLAKE2s_param param; // parameter block +}; + +/** + * 3.1 Mixing Function G + */ +void G(uint32_t V[16], unsigned a, unsigned b, unsigned c, unsigned d, uint32_t x, uint32_t y); + +/** + * 3.2 Compression Function F + * @param t: 2w-bit offset counter t + * @param f: final block indicator flag f + */ +void F(struct BLAKE2s_ctx *context, uint32_t m[16], uint32_t f); + +int BLAKE2s_init(struct BLAKE2s_ctx *ctx, uint8_t outlen, const void *key, uint8_t keylen); +void BLAKE2s_update(struct BLAKE2s_ctx *ctx, const void *d, size_t dd); +void BLAKE2s_final(struct BLAKE2s_ctx *ctx, void *out); + +// All-in-one convenience function. +static inline int +BLAKE2s(void *out, uint8_t outlen, // return buffer for digest + const void *key, uint8_t keylen, // optional secret key + const void *in, size_t inlen) // data to be hashed +{ + struct BLAKE2s_ctx ctx; + if (BLAKE2s_init(&ctx, outlen, key, keylen)) return -1; + BLAKE2s_update(&ctx, in, inlen); + BLAKE2s_final(&ctx, out); + + return 0; +} diff --git a/lib/blake2/rfc7693.txt b/lib/blake2/rfc7693.txt new file mode 100644 index 0000000..d9d3b97 --- /dev/null +++ b/lib/blake2/rfc7693.txt @@ -0,0 +1,1683 @@ + + + + + + +Independent Submission M-J. Saarinen, Ed. +Request for Comments: 7693 Queen's University Belfast +Category: Informational J-P. Aumasson +ISSN: 2070-1721 Kudelski Security + November 2015 + + + The BLAKE2 Cryptographic Hash and Message Authentication Code (MAC) + +Abstract + + This document describes the cryptographic hash function BLAKE2 and + makes the algorithm specification and C source code conveniently + available to the Internet community. BLAKE2 comes in two main + flavors: BLAKE2b is optimized for 64-bit platforms and BLAKE2s for + smaller architectures. BLAKE2 can be directly keyed, making it + functionally equivalent to a Message Authentication Code (MAC). + +Status of This Memo + + This document is not an Internet Standards Track specification; it is + published for informational purposes. + + This is a contribution to the RFC Series, independently of any other + RFC stream. The RFC Editor has chosen to publish this document at + its discretion and makes no statement about its value for + implementation or deployment. Documents approved for publication by + the RFC Editor are not a candidate for any level of Internet + Standard; see Section 2 of RFC 5741. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + http://www.rfc-editor.org/info/rfc7693. + +Copyright Notice + + Copyright (c) 2015 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (http://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. + + + + + + +Saarinen & Aumasson Informational [Page 1] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + +Table of Contents + + 1. Introduction and Terminology . . . . . . . . . . . . . . . . 3 + 2. Conventions, Variables, and Constants . . . . . . . . . . . . 4 + 2.1. Parameters . . . . . . . . . . . . . . . . . . . . . . . 4 + 2.2. Other Constants and Variables . . . . . . . . . . . . . . 4 + 2.3. Arithmetic Notation . . . . . . . . . . . . . . . . . . . 4 + 2.4. Little-Endian Interpretation of Words as Bytes . . . . . 5 + 2.5. Parameter Block . . . . . . . . . . . . . . . . . . . . . 5 + 2.6. Initialization Vector . . . . . . . . . . . . . . . . . . 6 + 2.7. Message Schedule SIGMA . . . . . . . . . . . . . . . . . 6 + 3. BLAKE2 Processing . . . . . . . . . . . . . . . . . . . . . . 7 + 3.1. Mixing Function G . . . . . . . . . . . . . . . . . . . . 7 + 3.2. Compression Function F . . . . . . . . . . . . . . . . . 8 + 3.3. Padding Data and Computing a BLAKE2 Digest . . . . . . . 9 + 4. Standard Parameter Sets and Algorithm Identifiers . . . . . . 10 + 5. Security Considerations . . . . . . . . . . . . . . . . . . . 11 + 6. References . . . . . . . . . . . . . . . . . . . . . . . . . 11 + 6.1. Normative References . . . . . . . . . . . . . . . . . . 11 + 6.2. Informative References . . . . . . . . . . . . . . . . . 11 + Appendix A. Example of BLAKE2b Computation . . . . . . . . . . . 13 + Appendix B. Example of BLAKE2s Computation . . . . . . . . . . . 15 + Appendix C. BLAKE2b Implementation C Source . . . . . . . . . . 16 + C.1. blake2b.h . . . . . . . . . . . . . . . . . . . . . . . . 16 + C.2. blake2b.c . . . . . . . . . . . . . . . . . . . . . . . . 17 + Appendix D. BLAKE2s Implementation C Source . . . . . . . . . . 21 + D.1. blake2s.h . . . . . . . . . . . . . . . . . . . . . . . . 21 + D.2. blake2s.c . . . . . . . . . . . . . . . . . . . . . . . . 22 + Appendix E. BLAKE2b and BLAKE2s Self-Test Module C Source . . . 26 + Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 29 + Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 30 + + + + + + + + + + + + + + + + + + + + +Saarinen & Aumasson Informational [Page 2] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + +1. Introduction and Terminology + + The BLAKE2 cryptographic hash function [BLAKE2] was designed by Jean- + Philippe Aumasson, Samuel Neves, Zooko Wilcox-O'Hearn, and Christian + Winnerlein. + + BLAKE2 comes in two basic flavors: + + o BLAKE2b (or just BLAKE2) is optimized for 64-bit platforms and + produces digests of any size between 1 and 64 bytes. + + o BLAKE2s is optimized for 8- to 32-bit platforms and produces + digests of any size between 1 and 32 bytes. + + Both BLAKE2b and BLAKE2s are believed to be highly secure and perform + well on any platform, software, or hardware. BLAKE2 does not require + a special "HMAC" (Hashed Message Authentication Code) construction + for keyed message authentication as it has a built-in keying + mechanism. + + The BLAKE2 hash function may be used by digital signature algorithms + and message authentication and integrity protection mechanisms in + applications such as Public Key Infrastructure (PKI), secure + communication protocols, cloud storage, intrusion detection, forensic + suites, and version control systems. + + The BLAKE2 suite provides a more efficient alternative to US Secure + Hash Algorithms SHA and HMAC-SHA [RFC6234]. BLAKE2s-128 is + especially suited as a fast and more secure drop-in replacement to + MD5 and HMAC-MD5 in legacy applications [RFC6151]. + + To aid implementation, we provide a trace of BLAKE2b-512 hash + computation in Appendix A and a trace of BLAKE2s-256 hash computation + in Appendix B. Due to space constraints, this document does not + contain a full set of test vectors for BLAKE2. + + A reference implementation in C programming language for BLAKE2b can + be found in Appendix C and for BLAKE2s in Appendix D of this + document. These implementations MAY be validated with the more + exhaustive Test Module contained in Appendix E. + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in [RFC2119]. + + + + + + + +Saarinen & Aumasson Informational [Page 3] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + +2. Conventions, Variables, and Constants + +2.1. Parameters + + The following table summarizes various parameters and their ranges: + + | BLAKE2b | BLAKE2s | + --------------+------------------+------------------+ + Bits in word | w = 64 | w = 32 | + Rounds in F | r = 12 | r = 10 | + Block bytes | bb = 128 | bb = 64 | + Hash bytes | 1 <= nn <= 64 | 1 <= nn <= 32 | + Key bytes | 0 <= kk <= 64 | 0 <= kk <= 32 | + Input bytes | 0 <= ll < 2**128 | 0 <= ll < 2**64 | + --------------+------------------+------------------+ + G Rotation | (R1, R2, R3, R4) | (R1, R2, R3, R4) | + constants = | (32, 24, 16, 63) | (16, 12, 8, 7) | + --------------+------------------+------------------+ + +2.2. Other Constants and Variables + + These variables are used in the algorithm description: + + IV[0..7] Initialization Vector (constant). + + SIGMA[0..9] Message word permutations (constant). + + p[0..7] Parameter block (defines hash and key sizes). + + m[0..15] Sixteen words of a single message block. + + h[0..7] Internal state of the hash. + + d[0..dd-1] Padded input blocks. Each has "bb" bytes. + + t Message byte offset at the end of the current block. + + f Flag indicating the last block. + +2.3. Arithmetic Notation + + For real-valued x, we define the following functions: + + floor(x) Floor, the largest integer <= x. + + ceil(x) Ceiling, the smallest integer >= x. + + frac(x) Positive fractional part of x, frac(x) = x - floor(x). + + + +Saarinen & Aumasson Informational [Page 4] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + + Operator notation in pseudocode: + + 2**n = 2 to the power "n". 2**0=1, 2**1=2, 2**2=4, 2**3=8, etc. + + a ^ b = Bitwise exclusive-or operation between "a" and "b". + + a mod b = Remainder "a" modulo "b", always in range [0, b-1]. + + x >> n = floor(x / 2**n). Logical shift "x" right by "n" bits. + + x << n = (x * 2**n) mod (2**w). Logical shift "x" left by "n". + + x >>> n = (x >> n) ^ (x << (w - n)). Rotate "x" right by "n". + +2.4. Little-Endian Interpretation of Words as Bytes + + All mathematical operations are on 64-bit words in BLAKE2b and on + 32-bit words in BLAKE2s. + + We may also perform operations on vectors of words. Vector indexing + is zero based; the first element of an n-element vector "v" is v[0] + and the last one is v[n - 1]. All elements are denoted by v[0..n-1]. + + Byte (octet) streams are interpreted as words in little-endian order, + with the least-significant byte first. Consider this sequence of + eight hexadecimal bytes: + + x[0..7] = 0x01 0x23 0x45 0x67 0x89 0xAB 0xCD 0xEF + + When interpreted as a 32-bit word from the beginning memory address, + x[0..3] has a numerical value of 0x67452301 or 1732584193. + + When interpreted as a 64-bit word, bytes x[0..7] have a numerical + value of 0xEFCDAB8967452301 or 17279655951921914625. + +2.5. Parameter Block + + We specify the parameter block words p[0..7] as follows: + + byte offset: 3 2 1 0 (otherwise zero) + p[0] = 0x0101kknn p[1..7] = 0 + + Here the "nn" byte specifies the hash size in bytes. The second + (little-endian) byte of the parameter block, "kk", specifies the key + size in bytes. Set kk = 00 for unkeyed hashing. Bytes 2 and 3 are + set as 01. All other bytes in the parameter block are set as zero. + + + + + +Saarinen & Aumasson Informational [Page 5] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + + Note: [BLAKE2] defines additional variants of BLAKE2 with features + such as salting, personalized hashes, and tree hashing. These + OPTIONAL features use fields in the parameter block that are not + defined in this document. + +2.6. Initialization Vector + + We define the Initialization Vector constant IV mathematically as: + + IV[i] = floor(2**w * frac(sqrt(prime(i+1)))), where prime(i) + is the i:th prime number ( 2, 3, 5, 7, 11, 13, 17, 19 ) + and sqrt(x) is the square root of x. + + The numerical values of IV can also be found in implementations in + Appendices C and D for BLAKE2b and BLAKE2s, respectively. + + Note: BLAKE2b IV is the same as SHA-512 IV, and BLAKE2s IV is the + same as SHA-256 IV; see [RFC6234]. + +2.7. Message Schedule SIGMA + + Message word schedule permutations for each round of both BLAKE2b and + BLAKE2s are defined by SIGMA. For BLAKE2b, the two extra + permutations for rounds 10 and 11 are SIGMA[10..11] = SIGMA[0..1]. + + Round | 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | + ----------+-------------------------------------------------+ + SIGMA[0] | 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | + SIGMA[1] | 14 10 4 8 9 15 13 6 1 12 0 2 11 7 5 3 | + SIGMA[2] | 11 8 12 0 5 2 15 13 10 14 3 6 7 1 9 4 | + SIGMA[3] | 7 9 3 1 13 12 11 14 2 6 5 10 4 0 15 8 | + SIGMA[4] | 9 0 5 7 2 4 10 15 14 1 11 12 6 8 3 13 | + SIGMA[5] | 2 12 6 10 0 11 8 3 4 13 7 5 15 14 1 9 | + SIGMA[6] | 12 5 1 15 14 13 4 10 0 7 6 3 9 2 8 11 | + SIGMA[7] | 13 11 7 14 12 1 3 9 5 0 15 4 8 6 2 10 | + SIGMA[8] | 6 15 14 9 11 3 0 8 12 2 13 7 1 4 10 5 | + SIGMA[9] | 10 2 8 4 7 6 1 5 15 11 9 14 3 12 13 0 | + ----------+-------------------------------------------------+ + + + + + + + + + + + + + +Saarinen & Aumasson Informational [Page 6] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + +3. BLAKE2 Processing + +3.1. Mixing Function G + + The G primitive function mixes two input words, "x" and "y", into + four words indexed by "a", "b", "c", and "d" in the working vector + v[0..15]. The full modified vector is returned. The rotation + constants (R1, R2, R3, R4) are given in Section 2.1. + + FUNCTION G( v[0..15], a, b, c, d, x, y ) + | + | v[a] := (v[a] + v[b] + x) mod 2**w + | v[d] := (v[d] ^ v[a]) >>> R1 + | v[c] := (v[c] + v[d]) mod 2**w + | v[b] := (v[b] ^ v[c]) >>> R2 + | v[a] := (v[a] + v[b] + y) mod 2**w + | v[d] := (v[d] ^ v[a]) >>> R3 + | v[c] := (v[c] + v[d]) mod 2**w + | v[b] := (v[b] ^ v[c]) >>> R4 + | + | RETURN v[0..15] + | + END FUNCTION. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Saarinen & Aumasson Informational [Page 7] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + +3.2. Compression Function F + + Compression function F takes as an argument the state vector "h", + message block vector "m" (last block is padded with zeros to full + block size, if required), 2w-bit offset counter "t", and final block + indicator flag "f". Local vector v[0..15] is used in processing. F + returns a new state vector. The number of rounds, "r", is 12 for + BLAKE2b and 10 for BLAKE2s. Rounds are numbered from 0 to r - 1. + + FUNCTION F( h[0..7], m[0..15], t, f ) + | + | // Initialize local work vector v[0..15] + | v[0..7] := h[0..7] // First half from state. + | v[8..15] := IV[0..7] // Second half from IV. + | + | v[12] := v[12] ^ (t mod 2**w) // Low word of the offset. + | v[13] := v[13] ^ (t >> w) // High word. + | + | IF f = TRUE THEN // last block flag? + | | v[14] := v[14] ^ 0xFF..FF // Invert all bits. + | END IF. + | + | // Cryptographic mixing + | FOR i = 0 TO r - 1 DO // Ten or twelve rounds. + | | + | | // Message word selection permutation for this round. + | | s[0..15] := SIGMA[i mod 10][0..15] + | | + | | v := G( v, 0, 4, 8, 12, m[s[ 0]], m[s[ 1]] ) + | | v := G( v, 1, 5, 9, 13, m[s[ 2]], m[s[ 3]] ) + | | v := G( v, 2, 6, 10, 14, m[s[ 4]], m[s[ 5]] ) + | | v := G( v, 3, 7, 11, 15, m[s[ 6]], m[s[ 7]] ) + | | + | | v := G( v, 0, 5, 10, 15, m[s[ 8]], m[s[ 9]] ) + | | v := G( v, 1, 6, 11, 12, m[s[10]], m[s[11]] ) + | | v := G( v, 2, 7, 8, 13, m[s[12]], m[s[13]] ) + | | v := G( v, 3, 4, 9, 14, m[s[14]], m[s[15]] ) + | | + | END FOR + | + | FOR i = 0 TO 7 DO // XOR the two halves. + | | h[i] := h[i] ^ v[i] ^ v[i + 8] + | END FOR. + | + | RETURN h[0..7] // New state. + | + END FUNCTION. + + + + +Saarinen & Aumasson Informational [Page 8] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + +3.3. Padding Data and Computing a BLAKE2 Digest + + We refer the reader to Appendices C and D for reference C language + implementations of BLAKE2b and BLAKE2s, respectively. + + Key and data input are split and padded into "dd" message blocks + d[0..dd-1], each consisting of 16 words (or "bb" bytes). + + If a secret key is used (kk > 0), it is padded with zero bytes and + set as d[0]. Otherwise, d[0] is the first data block. The final + data block d[dd-1] is also padded with zero to "bb" bytes (16 words). + + The number of blocks is therefore dd = ceil(kk / bb) + ceil(ll / bb). + However, in the special case of an unkeyed empty message (kk = 0 and + ll = 0), we still set dd = 1 and d[0] consists of all zeros. + + The following procedure processes the padded data blocks into an + "nn"-byte final hash value. See Section 2 for a description of + various variables and constants used. + + FUNCTION BLAKE2( d[0..dd-1], ll, kk, nn ) + | + | h[0..7] := IV[0..7] // Initialization Vector. + | + | // Parameter block p[0] + | h[0] := h[0] ^ 0x01010000 ^ (kk << 8) ^ nn + | + | // Process padded key and data blocks + | IF dd > 1 THEN + | | FOR i = 0 TO dd - 2 DO + | | | h := F( h, d[i], (i + 1) * bb, FALSE ) + | | END FOR. + | END IF. + | + | // Final block. + | IF kk = 0 THEN + | | h := F( h, d[dd - 1], ll, TRUE ) + | ELSE + | | h := F( h, d[dd - 1], ll + bb, TRUE ) + | END IF. + | + | RETURN first "nn" bytes from little-endian word array h[]. + | + END FUNCTION. + + + + + + + +Saarinen & Aumasson Informational [Page 9] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + +4. Standard Parameter Sets and Algorithm Identifiers + + An implementation of BLAKE2b and/or BLAKE2s MAY support the following + digest size parameters for interoperability (e.g., digital + signatures), as long as a sufficient level of security is attained by + the parameter selections. These parameters and identifiers are + intended to be suitable as drop-in replacements to MD5 and + corresponding SHA algorithms. + + Developers adapting BLAKE2 to ASN.1-based message formats SHOULD use + the OID tree at x = 1.3.6.1.4.1.1722.12.2. The same OID can be used + for both keyed and unkeyed hashing since in the latter case the key + simply has zero length. + + Algorithm | Target | Collision | Hash | Hash ASN.1 | + Identifier | Arch | Security | nn | OID Suffix | + ---------------+--------+-----------+------+------------+ + id-blake2b160 | 64-bit | 2**80 | 20 | x.1.5 | + id-blake2b256 | 64-bit | 2**128 | 32 | x.1.8 | + id-blake2b384 | 64-bit | 2**192 | 48 | x.1.12 | + id-blake2b512 | 64-bit | 2**256 | 64 | x.1.16 | + ---------------+--------+-----------+------+------------+ + id-blake2s128 | 32-bit | 2**64 | 16 | x.2.4 | + id-blake2s160 | 32-bit | 2**80 | 20 | x.2.5 | + id-blake2s224 | 32-bit | 2**112 | 28 | x.2.7 | + id-blake2s256 | 32-bit | 2**128 | 32 | x.2.8 | + ---------------+--------+-----------+------+------------+ + + hashAlgs OBJECT IDENTIFIER ::= { + iso(1) identified-organization(3) dod(6) internet(1) + private(4) enterprise(1) kudelski(1722) cryptography(12) 2 + } + macAlgs OBJECT IDENTIFIER ::= { + iso(1) identified-organization(3) dod(6) internet(1) + private(4) enterprise(1) kudelski(1722) cryptography(12) 3 + } + + -- the two BLAKE2 variants -- + blake2b OBJECT IDENTIFIER ::= { hashAlgs 1 } + blake2s OBJECT IDENTIFIER ::= { hashAlgs 2 } + + -- BLAKE2b Identifiers -- + id-blake2b160 OBJECT IDENTIFIER ::= { blake2b 5 } + id-blake2b256 OBJECT IDENTIFIER ::= { blake2b 8 } + id-blake2b384 OBJECT IDENTIFIER ::= { blake2b 12 } + id-blake2b512 OBJECT IDENTIFIER ::= { blake2b 16 } + + + + + +Saarinen & Aumasson Informational [Page 10] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + + -- BLAKE2s Identifiers -- + id-blake2s128 OBJECT IDENTIFIER ::= { blake2s 4 } + id-blake2s160 OBJECT IDENTIFIER ::= { blake2s 5 } + id-blake2s224 OBJECT IDENTIFIER ::= { blake2s 7 } + id-blake2s256 OBJECT IDENTIFIER ::= { blake2s 8 } + +5. Security Considerations + + This document is intended to provide convenient open-source access by + the Internet community to the BLAKE2 cryptographic hash algorithm. + We wish to make no independent assertion to its security in this + document. We refer the reader to [BLAKE] and [BLAKE2] for detailed + cryptanalytic rationale behind its design. + + In order to avoid bloat, the reference implementations in Appendices + C and D may not erase all sensitive data (such as secret keys) + immediately from process memory after use. Such cleanup can be added + if needed. + +6. References + +6.1. Normative References + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + . + +6.2. Informative References + + [BLAKE] Aumasson, J-P., Meier, W., Phan, R., and L. Henzen, "The + Hash Function BLAKE", January 2015, + . + + [BLAKE2] Aumasson, J-P., Neves, S., Wilcox-O'Hearn, Z., and C. + Winnerlein, "BLAKE2: simpler, smaller, fast as MD5", + January 2013, . + + [FIPS140-2IG] + NIST, "Implementation Guidance for FIPS PUB 140-2 and the + Cryptographic Module Validation Program", September 2015, + . + + [RFC6151] Turner, S. and L. Chen, "Updated Security Considerations + for the MD5 Message-Digest and the HMAC-MD5 Algorithms", + RFC 6151, DOI 10.17487/RFC6151, March 2011, + . + + + +Saarinen & Aumasson Informational [Page 11] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + + [RFC6234] Eastlake 3rd, D. and T. Hansen, "US Secure Hash Algorithms + (SHA and SHA-based HMAC and HKDF)", RFC 6234, + DOI 10.17487/RFC6234, May 2011, + . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Saarinen & Aumasson Informational [Page 12] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + +Appendix A. Example of BLAKE2b Computation + + We compute the unkeyed hash of three ASCII bytes "abc" with + BLAKE2b-512 and show internal values during computation. + + m[16] = 0000000000636261 0000000000000000 0000000000000000 + 0000000000000000 0000000000000000 0000000000000000 + 0000000000000000 0000000000000000 0000000000000000 + 0000000000000000 0000000000000000 0000000000000000 + 0000000000000000 0000000000000000 0000000000000000 + 0000000000000000 + + (i= 0) v[16] = 6A09E667F2BDC948 BB67AE8584CAA73B 3C6EF372FE94F82B + A54FF53A5F1D36F1 510E527FADE682D1 9B05688C2B3E6C1F + 1F83D9ABFB41BD6B 5BE0CD19137E2179 6A09E667F3BCC908 + BB67AE8584CAA73B 3C6EF372FE94F82B A54FF53A5F1D36F1 + 510E527FADE682D2 9B05688C2B3E6C1F E07C265404BE4294 + 5BE0CD19137E2179 + + (i= 1) v[16] = 86B7C1568029BB79 C12CBCC809FF59F3 C6A5214CC0EACA8E + 0C87CD524C14CC5D 44EE6039BD86A9F7 A447C850AA694A7E + DE080F1BB1C0F84B 595CB8A9A1ACA66C BEC3AE837EAC4887 + 6267FC79DF9D6AD1 FA87B01273FA6DBE 521A715C63E08D8A + E02D0975B8D37A83 1C7B754F08B7D193 8F885A76B6E578FE + 2318A24E2140FC64 + + (i= 2) v[16] = 53281E83806010F2 3594B403F81B4393 8CD63C7462DE0DFF + 85F693F3DA53F974 BAABDBB2F386D9AE CA5425AEC65A10A8 + C6A22E2FF0F7AA48 C6A56A51CB89C595 224E6A3369224F96 + 500E125E58A92923 E9E4AD0D0E1A0D48 85DF9DC143C59A74 + 92A3AAAA6D952B7F C5FDF71090FAE853 2A8A40F15A462DD0 + 572D17EFFDD37358 + + (i= 3) v[16] = 60ED96AA7AD41725 E46A743C71800B9D 1A04B543A01F156B + A2F8716E775C4877 DA0A61BCDE4267EA B1DD230754D7BDEE + 25A1422779E06D14 E6823AE4C3FF58A5 A1677E19F37FD5DA + 22BDCE6976B08C51 F1DE8696BEC11BF1 A0EBD586A4A1D2C8 + C804EBAB11C99FA9 8E0CEC959C715793 7C45557FAE0D4D89 + 716343F52FDD265E + + (i= 4) v[16] = BB2A77D3A8382351 45EB47971F23B103 98BE297F6E45C684 + A36077DEE3370B89 8A03C4CB7E97590A 24192E49EBF54EA0 + 4F82C9401CB32D7A 8CCD013726420DC4 A9C9A8F17B1FC614 + 55908187977514A0 5B44273E66B19D27 B6D5C9FCA2579327 + 086092CFB858437E 5C4BE2156DBEECF9 2EFEDE99ED4EFF16 + 3E7B5F234CD1F804 + + + + + +Saarinen & Aumasson Informational [Page 13] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + + (i= 5) v[16] = C79C15B3D423B099 2DA2224E8DA97556 77D2B26DF1C45C55 + 8934EB09A3456052 0F6D9EEED157DA2A 6FE66467AF88C0A9 + 4EB0B76284C7AAFB 299C8E725D954697 B2240B59E6D567D3 + 2643C2370E49EBFD 79E02EEF20CDB1AE 64B3EED7BB602F39 + B97D2D439E4DF63D C718E755294C9111 1F0893F2772BB373 + 1205EA4A7859807D + + (i= 6) v[16] = E58F97D6385BAEE4 7640AA9764DA137A DEB4C7C23EFE287E + 70F6F41C8783C9F6 7127CD48C76A7708 9E472AF0BE3DB3F6 + 0F244C62DDF71788 219828AA83880842 41CCA9073C8C4D0D + 5C7912BC10DF3B4B A2C3ABBD37510EE2 CB5668CC2A9F7859 + 8733794F07AC1500 C67A6BE42335AA6F ACB22B28681E4C82 + DB2161604CBC9828 + + (i= 7) v[16] = 6E2D286EEADEDC81 BCF02C0787E86358 57D56A56DD015EDF + 55D899D40A5D0D0A 819415B56220C459 B63C479A6A769F02 + 258E55E0EC1F362A 3A3B4EC60E19DFDC 04D769B3FCB048DB + B78A9A33E9BFF4DD 5777272AE1E930C0 5A387849E578DBF6 + 92AAC307CF2C0AFC 30AACCC4F06DAFAA 483893CC094F8863 + E03C6CC89C26BF92 + + (i= 8) v[16] = FFC83ECE76024D01 1BE7BFFB8C5CC5F9 A35A18CBAC4C65B7 + B7C2C7E6D88C285F 81937DA314A50838 E1179523A2541963 + 3A1FAD7106232B8F 1C7EDE92AB8B9C46 A3C2D35E4F685C10 + A53D3F73AA619624 30BBCC0285A22F65 BCEFBB6A81539E5D + 3841DEF6F4C9848A 98662C85FBA726D4 7762439BD5A851BD + B0B9F0D443D1A889 + + (i= 9) v[16] = 753A70A1E8FAEADD 6B0D43CA2C25D629 F8343BA8B94F8C0B + BC7D062B0DB5CF35 58540EE1B1AEBC47 63C5B9B80D294CB9 + 490870ECAD27DEBD B2A90DDF667287FE 316CC9EBEEFAD8FC + 4A466BCD021526A4 5DA7F7638CEC5669 D9C8826727D306FC + 88ED6C4F3BD7A537 19AE688DDF67F026 4D8707AAB40F7E6D + FD3F572687FEA4F1 + + (i=10) v[16] = E630C747CCD59C4F BC713D41127571CA 46DB183025025078 + 6727E81260610140 2D04185EAC2A8CBA 5F311B88904056EC + 40BD313009201AAB 0099D4F82A2A1EAB 6DD4FBC1DE60165D + B3B0B51DE3C86270 900AEE2F233B08E5 A07199D87AD058D8 + 2C6B25593D717852 37E8CA471BEAA5F8 2CFC1BAC10EF4457 + 01369EC18746E775 + + (i=11) v[16] = E801F73B9768C760 35C6D22320BE511D 306F27584F65495E + B51776ADF569A77B F4F1BE86690B3C34 3CC88735D1475E4B + 5DAC67921FF76949 1CDB9D31AD70CC4E 35BA354A9C7DF448 + 4929CBE45679D73E 733D1A17248F39DB 92D57B736F5F170A + 61B5C0A41D491399 B5C333457E12844A BD696BE010D0D889 + 02231E1A917FE0BD + + + +Saarinen & Aumasson Informational [Page 14] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + + (i=12) v[16] = 12EF8A641EC4F6D6 BCED5DE977C9FAF5 733CA476C5148639 + 97DF596B0610F6FC F42C16519AD5AFA7 AA5AC1888E10467E + 217D930AA51787F3 906A6FF19E573942 75AB709BD3DCBF24 + EE7CE1F345947AA4 F8960D6C2FAF5F5E E332538A36B6D246 + 885BEF040EF6AA0B A4939A417BFB78A3 646CBB7AF6DCE980 + E813A23C60AF3B82 + + h[8] = 0D4D1C983FA580BA E9F6129FB697276A B7C45A68142F214C + D1A2FFDB6FBB124B 2D79AB2A39C5877D 95CC3345DED552C2 + 5A92F1DBA88AD318 239900D4ED8623B9 + + BLAKE2b-512("abc") = BA 80 A5 3F 98 1C 4D 0D 6A 27 97 B6 9F 12 F6 E9 + 4C 21 2F 14 68 5A C4 B7 4B 12 BB 6F DB FF A2 D1 + 7D 87 C5 39 2A AB 79 2D C2 52 D5 DE 45 33 CC 95 + 18 D3 8A A8 DB F1 92 5A B9 23 86 ED D4 00 99 23 + +Appendix B. Example of BLAKE2s Computation + + We compute the unkeyed hash of three ASCII bytes "abc" with + BLAKE2s-256 and show internal values during computation. + + m[16] = 00636261 00000000 00000000 00000000 00000000 00000000 + 00000000 00000000 00000000 00000000 00000000 00000000 + 00000000 00000000 00000000 00000000 + + (i=0) v[16] = 6B08E647 BB67AE85 3C6EF372 A54FF53A 510E527F 9B05688C + 1F83D9AB 5BE0CD19 6A09E667 BB67AE85 3C6EF372 A54FF53A + 510E527C 9B05688C E07C2654 5BE0CD19 + + (i=1) v[16] = 16A3242E D7B5E238 CE8CE24B 927AEDE1 A7B430D9 93A4A14E + A44E7C31 41D4759B 95BF33D3 9A99C181 608A3A6B B666383E + 7A8DD50F BE378ED7 353D1EE6 3BB44C6B + + (i=2) v[16] = 3AE30FE3 0982A96B E88185B4 3E339B16 F24338CD 0E66D326 + E005ED0C D591A277 180B1F3A FCF43914 30DB62D6 4847831C + 7F00C58E FB847886 C544E836 524AB0E2 + + (i=3) v[16] = 7A3BE783 997546C1 D45246DF EDB5F821 7F98A742 10E864E2 + D4AB70D0 C63CB1AB 6038DA9E 414594B0 F2C218B5 8DA0DCB7 + D7CD7AF5 AB4909DF 85031A52 C4EDFC98 + + (i=4) v[16] = 2A8B8CB7 1ACA82B2 14045D7F CC7258ED 383CF67C E090E7F9 + 3025D276 57D04DE4 994BACF0 F0982759 F17EE300 D48FC2D5 + DC854C10 523898A9 C03A0F89 47D6CD88 + + (i=5) v[16] = C4AA2DDB 111343A3 D54A700A 574A00A9 857D5A48 B1E11989 + 6F5C52DF DD2C53A3 678E5F8E 9718D4E9 622CB684 92976076 + 0E41A517 359DC2BE 87A87DDD 643F9CEC + + + +Saarinen & Aumasson Informational [Page 15] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + + (i=6) v[16] = 3453921C D7595EE1 592E776D 3ED6A974 4D997CB3 DE9212C3 + 35ADF5C9 9916FD65 96562E89 4EAD0792 EBFC2712 2385F5B2 + F34600FB D7BC20FB EB452A7B ECE1AA40 + + (i=7) v[16] = BE851B2D A85F6358 81E6FC3B 0BB28000 FA55A33A 87BE1FAD + 4119370F 1E2261AA A1318FD3 F4329816 071783C2 6E536A8D + 9A81A601 E7EC80F1 ACC09948 F849A584 + + (i=8) v[16] = 07E5B85A 069CC164 F9DE3141 A56F4680 9E440AD2 9AB659EA + 3C84B971 21DBD9CF 46699F8C 765257EC AF1D998C 75E4C3B6 + 523878DC 30715015 397FEE81 4F1FA799 + + (i=9) v[16] = 435148C4 A5AA2D11 4B354173 D543BC9E BDA2591C BF1D2569 + 4FCB3120 707ADA48 565B3FDE 32C9C916 EAF4A1AB B1018F28 + 8078D978 68ADE4B5 9778FDA3 2863B92E + + (i=10) v[16] = D9C994AA CFEC3AA6 700D0AB2 2C38670E AF6A1F66 1D023EF3 + 1D9EC27D 945357A5 3E9FFEBD 969FE811 EF485E21 A632797A + DEEF082E AF3D80E1 4E86829B 4DEAFD3A + + h[8] = 8C5E8C50 E2147C32 A32BA7E1 2F45EB4E 208B4537 293AD69E + 4C9B994D 82596786 + + BLAKE2s-256("abc") = 50 8C 5E 8C 32 7C 14 E2 E1 A7 2B A3 4E EB 45 2F + 37 45 8B 20 9E D6 3A 29 4D 99 9B 4C 86 67 59 82 + +Appendix C. BLAKE2b Implementation C Source + +C.1. blake2b.h + + + // blake2b.h + // BLAKE2b Hashing Context and API Prototypes + + #ifndef BLAKE2B_H + #define BLAKE2B_H + + #include + #include + + // state context + typedef struct { + uint8_t b[128]; // input buffer + uint64_t h[8]; // chained state + uint64_t t[2]; // total number of bytes + size_t c; // pointer for b[] + size_t outlen; // digest size + } blake2b_ctx; + + + +Saarinen & Aumasson Informational [Page 16] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + + // Initialize the hashing context "ctx" with optional key "key". + // 1 <= outlen <= 64 gives the digest size in bytes. + // Secret key (also <= 64 bytes) is optional (keylen = 0). + int blake2b_init(blake2b_ctx *ctx, size_t outlen, + const void *key, size_t keylen); // secret key + + // Add "inlen" bytes from "in" into the hash. + void blake2b_update(blake2b_ctx *ctx, // context + const void *in, size_t inlen); // data to be hashed + + // Generate the message digest (size given in init). + // Result placed in "out". + void blake2b_final(blake2b_ctx *ctx, void *out); + + // All-in-one convenience function. + int blake2b(void *out, size_t outlen, // return buffer for digest + const void *key, size_t keylen, // optional secret key + const void *in, size_t inlen); // data to be hashed + + #endif + + +C.2. blake2b.c + + + // blake2b.c + // A simple BLAKE2b Reference Implementation. + + #include "blake2b.h" + + // Cyclic right rotation. + + #ifndef ROTR64 + #define ROTR64(x, y) (((x) >> (y)) ^ ((x) << (64 - (y)))) + #endif + + // Little-endian byte access. + + #define B2B_GET64(p) \ + (((uint64_t) ((uint8_t *) (p))[0]) ^ \ + (((uint64_t) ((uint8_t *) (p))[1]) << 8) ^ \ + (((uint64_t) ((uint8_t *) (p))[2]) << 16) ^ \ + (((uint64_t) ((uint8_t *) (p))[3]) << 24) ^ \ + (((uint64_t) ((uint8_t *) (p))[4]) << 32) ^ \ + (((uint64_t) ((uint8_t *) (p))[5]) << 40) ^ \ + (((uint64_t) ((uint8_t *) (p))[6]) << 48) ^ \ + (((uint64_t) ((uint8_t *) (p))[7]) << 56)) + + + + +Saarinen & Aumasson Informational [Page 17] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + + // G Mixing function. + + #define B2B_G(a, b, c, d, x, y) { \ + v[a] = v[a] + v[b] + x; \ + v[d] = ROTR64(v[d] ^ v[a], 32); \ + v[c] = v[c] + v[d]; \ + v[b] = ROTR64(v[b] ^ v[c], 24); \ + v[a] = v[a] + v[b] + y; \ + v[d] = ROTR64(v[d] ^ v[a], 16); \ + v[c] = v[c] + v[d]; \ + v[b] = ROTR64(v[b] ^ v[c], 63); } + + // Initialization Vector. + + static const uint64_t blake2b_iv[8] = { + 0x6A09E667F3BCC908, 0xBB67AE8584CAA73B, + 0x3C6EF372FE94F82B, 0xA54FF53A5F1D36F1, + 0x510E527FADE682D1, 0x9B05688C2B3E6C1F, + 0x1F83D9ABFB41BD6B, 0x5BE0CD19137E2179 + }; + + // Compression function. "last" flag indicates last block. + + static void blake2b_compress(blake2b_ctx *ctx, int last) + { + const uint8_t sigma[12][16] = { + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, + { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 }, + { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 }, + { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 }, + { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 }, + { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 }, + { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 }, + { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 }, + { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 }, + { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0 }, + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, + { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } + }; + int i; + uint64_t v[16], m[16]; + + for (i = 0; i < 8; i++) { // init work variables + v[i] = ctx->h[i]; + v[i + 8] = blake2b_iv[i]; + } + + + + + +Saarinen & Aumasson Informational [Page 18] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + + v[12] ^= ctx->t[0]; // low 64 bits of offset + v[13] ^= ctx->t[1]; // high 64 bits + if (last) // last block flag set ? + v[14] = ~v[14]; + + for (i = 0; i < 16; i++) // get little-endian words + m[i] = B2B_GET64(&ctx->b[8 * i]); + + for (i = 0; i < 12; i++) { // twelve rounds + B2B_G( 0, 4, 8, 12, m[sigma[i][ 0]], m[sigma[i][ 1]]); + B2B_G( 1, 5, 9, 13, m[sigma[i][ 2]], m[sigma[i][ 3]]); + B2B_G( 2, 6, 10, 14, m[sigma[i][ 4]], m[sigma[i][ 5]]); + B2B_G( 3, 7, 11, 15, m[sigma[i][ 6]], m[sigma[i][ 7]]); + B2B_G( 0, 5, 10, 15, m[sigma[i][ 8]], m[sigma[i][ 9]]); + B2B_G( 1, 6, 11, 12, m[sigma[i][10]], m[sigma[i][11]]); + B2B_G( 2, 7, 8, 13, m[sigma[i][12]], m[sigma[i][13]]); + B2B_G( 3, 4, 9, 14, m[sigma[i][14]], m[sigma[i][15]]); + } + + for( i = 0; i < 8; ++i ) + ctx->h[i] ^= v[i] ^ v[i + 8]; + } + + // Initialize the hashing context "ctx" with optional key "key". + // 1 <= outlen <= 64 gives the digest size in bytes. + // Secret key (also <= 64 bytes) is optional (keylen = 0). + + int blake2b_init(blake2b_ctx *ctx, size_t outlen, + const void *key, size_t keylen) // (keylen=0: no key) + { + size_t i; + + if (outlen == 0 || outlen > 64 || keylen > 64) + return -1; // illegal parameters + + for (i = 0; i < 8; i++) // state, "param block" + ctx->h[i] = blake2b_iv[i]; + ctx->h[0] ^= 0x01010000 ^ (keylen << 8) ^ outlen; + + ctx->t[0] = 0; // input count low word + ctx->t[1] = 0; // input count high word + ctx->c = 0; // pointer within buffer + ctx->outlen = outlen; + + + + + + + + +Saarinen & Aumasson Informational [Page 19] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + + for (i = keylen; i < 128; i++) // zero input block + ctx->b[i] = 0; + if (keylen > 0) { + blake2b_update(ctx, key, keylen); + ctx->c = 128; // at the end + } + + return 0; + } + + // Add "inlen" bytes from "in" into the hash. + + void blake2b_update(blake2b_ctx *ctx, + const void *in, size_t inlen) // data bytes + { + size_t i; + + for (i = 0; i < inlen; i++) { + if (ctx->c == 128) { // buffer full ? + ctx->t[0] += ctx->c; // add counters + if (ctx->t[0] < ctx->c) // carry overflow ? + ctx->t[1]++; // high word + blake2b_compress(ctx, 0); // compress (not last) + ctx->c = 0; // counter to zero + } + ctx->b[ctx->c++] = ((const uint8_t *) in)[i]; + } + } + + // Generate the message digest (size given in init). + // Result placed in "out". + + void blake2b_final(blake2b_ctx *ctx, void *out) + { + size_t i; + + ctx->t[0] += ctx->c; // mark last block offset + if (ctx->t[0] < ctx->c) // carry overflow + ctx->t[1]++; // high word + + while (ctx->c < 128) // fill up with zeros + ctx->b[ctx->c++] = 0; + blake2b_compress(ctx, 1); // final block flag = 1 + + + + + + + + +Saarinen & Aumasson Informational [Page 20] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + + // little endian convert and store + for (i = 0; i < ctx->outlen; i++) { + ((uint8_t *) out)[i] = + (ctx->h[i >> 3] >> (8 * (i & 7))) & 0xFF; + } + } + + // Convenience function for all-in-one computation. + + int blake2b(void *out, size_t outlen, + const void *key, size_t keylen, + const void *in, size_t inlen) + { + blake2b_ctx ctx; + + if (blake2b_init(&ctx, outlen, key, keylen)) + return -1; + blake2b_update(&ctx, in, inlen); + blake2b_final(&ctx, out); + + return 0; + } + + +Appendix D. BLAKE2s Implementation C Source + +D.1. blake2s.h + + + // blake2s.h + // BLAKE2s Hashing Context and API Prototypes + + #ifndef BLAKE2S_H + #define BLAKE2S_H + + #include + #include + + // state context + typedef struct { + uint8_t b[64]; // input buffer + uint32_t h[8]; // chained state + uint32_t t[2]; // total number of bytes + size_t c; // pointer for b[] + size_t outlen; // digest size + } blake2s_ctx; + + + + + +Saarinen & Aumasson Informational [Page 21] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + + // Initialize the hashing context "ctx" with optional key "key". + // 1 <= outlen <= 32 gives the digest size in bytes. + // Secret key (also <= 32 bytes) is optional (keylen = 0). + int blake2s_init(blake2s_ctx *ctx, size_t outlen, + const void *key, size_t keylen); // secret key + + // Add "inlen" bytes from "in" into the hash. + void blake2s_update(blake2s_ctx *ctx, // context + const void *in, size_t inlen); // data to be hashed + + // Generate the message digest (size given in init). + // Result placed in "out". + void blake2s_final(blake2s_ctx *ctx, void *out); + + // All-in-one convenience function. + int blake2s(void *out, size_t outlen, // return buffer for digest + const void *key, size_t keylen, // optional secret key + const void *in, size_t inlen); // data to be hashed + + #endif + + +D.2. blake2s.c + + + // blake2s.c + // A simple blake2s Reference Implementation. + + #include "blake2s.h" + + // Cyclic right rotation. + + #ifndef ROTR32 + #define ROTR32(x, y) (((x) >> (y)) ^ ((x) << (32 - (y)))) + #endif + + // Little-endian byte access. + + #define B2S_GET32(p) \ + (((uint32_t) ((uint8_t *) (p))[0]) ^ \ + (((uint32_t) ((uint8_t *) (p))[1]) << 8) ^ \ + (((uint32_t) ((uint8_t *) (p))[2]) << 16) ^ \ + (((uint32_t) ((uint8_t *) (p))[3]) << 24)) + + + + + + + + +Saarinen & Aumasson Informational [Page 22] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + + // Mixing function G. + + #define B2S_G(a, b, c, d, x, y) { \ + v[a] = v[a] + v[b] + x; \ + v[d] = ROTR32(v[d] ^ v[a], 16); \ + v[c] = v[c] + v[d]; \ + v[b] = ROTR32(v[b] ^ v[c], 12); \ + v[a] = v[a] + v[b] + y; \ + v[d] = ROTR32(v[d] ^ v[a], 8); \ + v[c] = v[c] + v[d]; \ + v[b] = ROTR32(v[b] ^ v[c], 7); } + + // Initialization Vector. + + static const uint32_t blake2s_iv[8] = + { + 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, + 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19 + }; + + // Compression function. "last" flag indicates last block. + + static void blake2s_compress(blake2s_ctx *ctx, int last) + { + const uint8_t sigma[10][16] = { + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, + { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 }, + { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 }, + { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 }, + { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 }, + { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 }, + { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 }, + { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 }, + { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 }, + { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0 } + }; + int i; + uint32_t v[16], m[16]; + + for (i = 0; i < 8; i++) { // init work variables + v[i] = ctx->h[i]; + v[i + 8] = blake2s_iv[i]; + } + + v[12] ^= ctx->t[0]; // low 32 bits of offset + v[13] ^= ctx->t[1]; // high 32 bits + if (last) // last block flag set ? + v[14] = ~v[14]; + + + +Saarinen & Aumasson Informational [Page 23] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + + for (i = 0; i < 16; i++) // get little-endian words + m[i] = B2S_GET32(&ctx->b[4 * i]); + + for (i = 0; i < 10; i++) { // ten rounds + B2S_G( 0, 4, 8, 12, m[sigma[i][ 0]], m[sigma[i][ 1]]); + B2S_G( 1, 5, 9, 13, m[sigma[i][ 2]], m[sigma[i][ 3]]); + B2S_G( 2, 6, 10, 14, m[sigma[i][ 4]], m[sigma[i][ 5]]); + B2S_G( 3, 7, 11, 15, m[sigma[i][ 6]], m[sigma[i][ 7]]); + B2S_G( 0, 5, 10, 15, m[sigma[i][ 8]], m[sigma[i][ 9]]); + B2S_G( 1, 6, 11, 12, m[sigma[i][10]], m[sigma[i][11]]); + B2S_G( 2, 7, 8, 13, m[sigma[i][12]], m[sigma[i][13]]); + B2S_G( 3, 4, 9, 14, m[sigma[i][14]], m[sigma[i][15]]); + } + + for( i = 0; i < 8; ++i ) + ctx->h[i] ^= v[i] ^ v[i + 8]; + } + + // Initialize the hashing context "ctx" with optional key "key". + // 1 <= outlen <= 32 gives the digest size in bytes. + // Secret key (also <= 32 bytes) is optional (keylen = 0). + + int blake2s_init(blake2s_ctx *ctx, size_t outlen, + const void *key, size_t keylen) // (keylen=0: no key) + { + size_t i; + + if (outlen == 0 || outlen > 32 || keylen > 32) + return -1; // illegal parameters + + for (i = 0; i < 8; i++) // state, "param block" + ctx->h[i] = blake2s_iv[i]; + ctx->h[0] ^= 0x01010000 ^ (keylen << 8) ^ outlen; + + ctx->t[0] = 0; // input count low word + ctx->t[1] = 0; // input count high word + ctx->c = 0; // pointer within buffer + ctx->outlen = outlen; + + for (i = keylen; i < 64; i++) // zero input block + ctx->b[i] = 0; + if (keylen > 0) { + blake2s_update(ctx, key, keylen); + ctx->c = 64; // at the end + } + + return 0; + } + + + +Saarinen & Aumasson Informational [Page 24] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + + // Add "inlen" bytes from "in" into the hash. + + void blake2s_update(blake2s_ctx *ctx, + const void *in, size_t inlen) // data bytes + { + size_t i; + + for (i = 0; i < inlen; i++) { + if (ctx->c == 64) { // buffer full ? + ctx->t[0] += ctx->c; // add counters + if (ctx->t[0] < ctx->c) // carry overflow ? + ctx->t[1]++; // high word + blake2s_compress(ctx, 0); // compress (not last) + ctx->c = 0; // counter to zero + } + ctx->b[ctx->c++] = ((const uint8_t *) in)[i]; + } + } + + // Generate the message digest (size given in init). + // Result placed in "out". + + void blake2s_final(blake2s_ctx *ctx, void *out) + { + size_t i; + + ctx->t[0] += ctx->c; // mark last block offset + if (ctx->t[0] < ctx->c) // carry overflow + ctx->t[1]++; // high word + + while (ctx->c < 64) // fill up with zeros + ctx->b[ctx->c++] = 0; + blake2s_compress(ctx, 1); // final block flag = 1 + + // little endian convert and store + for (i = 0; i < ctx->outlen; i++) { + ((uint8_t *) out)[i] = + (ctx->h[i >> 2] >> (8 * (i & 3))) & 0xFF; + } + } + + // Convenience function for all-in-one computation. + + int blake2s(void *out, size_t outlen, + const void *key, size_t keylen, + const void *in, size_t inlen) + { + blake2s_ctx ctx; + + + +Saarinen & Aumasson Informational [Page 25] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + + if (blake2s_init(&ctx, outlen, key, keylen)) + return -1; + blake2s_update(&ctx, in, inlen); + blake2s_final(&ctx, out); + + return 0; + } + + +Appendix E. BLAKE2b and BLAKE2s Self-Test Module C Source + + This module computes a series of keyed and unkeyed hashes from + deterministically generated pseudorandom data and computes a hash + over those results. This is a fairly exhaustive, yet compact and + fast method for verifying that the hashing module is functioning + correctly. + + Such testing is RECOMMENDED, especially when compiling the + implementation for a new a target platform configuration. + Furthermore, some security standards, such as FIPS-140, may require a + Power-On Self Test (POST) to be performed every time the + cryptographic module is loaded [FIPS140-2IG]. + + + // test_main.c + // Self test Modules for BLAKE2b and BLAKE2s -- and a stub main(). + + #include + + #include "blake2b.h" + #include "blake2s.h" + + // Deterministic sequences (Fibonacci generator). + + static void selftest_seq(uint8_t *out, size_t len, uint32_t seed) + { + size_t i; + uint32_t t, a , b; + + a = 0xDEAD4BAD * seed; // prime + b = 1; + + for (i = 0; i < len; i++) { // fill the buf + t = a + b; + a = b; + b = t; + out[i] = (t >> 24) & 0xFF; + } + + + +Saarinen & Aumasson Informational [Page 26] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + + } + + // BLAKE2b self-test validation. Return 0 when OK. + + int blake2b_selftest() + { + // grand hash of hash results + const uint8_t blake2b_res[32] = { + 0xC2, 0x3A, 0x78, 0x00, 0xD9, 0x81, 0x23, 0xBD, + 0x10, 0xF5, 0x06, 0xC6, 0x1E, 0x29, 0xDA, 0x56, + 0x03, 0xD7, 0x63, 0xB8, 0xBB, 0xAD, 0x2E, 0x73, + 0x7F, 0x5E, 0x76, 0x5A, 0x7B, 0xCC, 0xD4, 0x75 + }; + // parameter sets + const size_t b2b_md_len[4] = { 20, 32, 48, 64 }; + const size_t b2b_in_len[6] = { 0, 3, 128, 129, 255, 1024 }; + + size_t i, j, outlen, inlen; + uint8_t in[1024], md[64], key[64]; + blake2b_ctx ctx; + + // 256-bit hash for testing + if (blake2b_init(&ctx, 32, NULL, 0)) + return -1; + + for (i = 0; i < 4; i++) { + outlen = b2b_md_len[i]; + for (j = 0; j < 6; j++) { + inlen = b2b_in_len[j]; + + selftest_seq(in, inlen, inlen); // unkeyed hash + blake2b(md, outlen, NULL, 0, in, inlen); + blake2b_update(&ctx, md, outlen); // hash the hash + + selftest_seq(key, outlen, outlen); // keyed hash + blake2b(md, outlen, key, outlen, in, inlen); + blake2b_update(&ctx, md, outlen); // hash the hash + } + } + + // compute and compare the hash of hashes + blake2b_final(&ctx, md); + for (i = 0; i < 32; i++) { + if (md[i] != blake2b_res[i]) + return -1; + } + + return 0; + + + +Saarinen & Aumasson Informational [Page 27] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + + } + + // BLAKE2s self-test validation. Return 0 when OK. + + int blake2s_selftest() + { + // Grand hash of hash results. + const uint8_t blake2s_res[32] = { + 0x6A, 0x41, 0x1F, 0x08, 0xCE, 0x25, 0xAD, 0xCD, + 0xFB, 0x02, 0xAB, 0xA6, 0x41, 0x45, 0x1C, 0xEC, + 0x53, 0xC5, 0x98, 0xB2, 0x4F, 0x4F, 0xC7, 0x87, + 0xFB, 0xDC, 0x88, 0x79, 0x7F, 0x4C, 0x1D, 0xFE + }; + // Parameter sets. + const size_t b2s_md_len[4] = { 16, 20, 28, 32 }; + const size_t b2s_in_len[6] = { 0, 3, 64, 65, 255, 1024 }; + + size_t i, j, outlen, inlen; + uint8_t in[1024], md[32], key[32]; + blake2s_ctx ctx; + + // 256-bit hash for testing. + if (blake2s_init(&ctx, 32, NULL, 0)) + return -1; + + for (i = 0; i < 4; i++) { + outlen = b2s_md_len[i]; + for (j = 0; j < 6; j++) { + inlen = b2s_in_len[j]; + + selftest_seq(in, inlen, inlen); // unkeyed hash + blake2s(md, outlen, NULL, 0, in, inlen); + blake2s_update(&ctx, md, outlen); // hash the hash + + selftest_seq(key, outlen, outlen); // keyed hash + blake2s(md, outlen, key, outlen, in, inlen); + blake2s_update(&ctx, md, outlen); // hash the hash + } + } + + // Compute and compare the hash of hashes. + blake2s_final(&ctx, md); + for (i = 0; i < 32; i++) { + if (md[i] != blake2s_res[i]) + return -1; + } + + return 0; + + + +Saarinen & Aumasson Informational [Page 28] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + + } + + // Test driver. + + int main(int argc, char **argv) + { + printf("blake2b_selftest() = %s\n", + blake2b_selftest() ? "FAIL" : "OK"); + printf("blake2s_selftest() = %s\n", + blake2s_selftest() ? "FAIL" : "OK"); + + return 0; + } + + +Acknowledgements + + The editor wishes to thank the [BLAKE2] team for their encouragement: + Jean-Philippe Aumasson, Samuel Neves, Zooko Wilcox-O'Hearn, and + Christian Winnerlein. We have borrowed passages from [BLAKE] and + [BLAKE2] with permission. + + [BLAKE2] is based on the SHA-3 proposal [BLAKE], designed by Jean- + Philippe Aumasson, Luca Henzen, Willi Meier, and Raphael C.-W. Phan. + BLAKE2, like BLAKE, relies on a core algorithm borrowed from the + ChaCha stream cipher, designed by Daniel J. Bernstein. + + + + + + + + + + + + + + + + + + + + + + + + + +Saarinen & Aumasson Informational [Page 29] + +RFC 7693 BLAKE2 Crypto Hash and MAC November 2015 + + +Authors' Addresses + + Markku-Juhani O. Saarinen (editor) + Queen's University Belfast + Centre for Secure Information Technologies, ECIT + Northern Ireland Science Park + Queen's Road, Queen's Island + Belfast BT3 9DT + United Kingdom + + Email: m.saarinen@qub.ac.uk + URI: http://www.csit.qub.ac.uk + + + Jean-Philippe Aumasson + Kudelski Security + 22-24, Route de Geneve + Case Postale 134 + Cheseaux 1033 + Switzerland + + Email: jean-philippe.aumasson@nagra.com + URI: https://www.kudelskisecurity.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Saarinen & Aumasson Informational [Page 30] + diff --git a/lib/endian.h b/lib/endian.h new file mode 100644 index 0000000..70bc5f7 --- /dev/null +++ b/lib/endian.h @@ -0,0 +1,17 @@ +//===================================================================== +// spdx-license-identifier: ISC +//===================================================================== + +#pragma once + +#include + +// These functions convert the byte encoding of integer values from host byte order to and from little-endian and +// big-endian byte order +uint16_t htole16(uint16_t host_16b); +uint32_t htole32(uint32_t host_32b); +uint64_t htole64(uint64_t host_64b); + +uint16_t htobe16(uint16_t host_16b); +uint32_t htobe32(uint32_t host_32b); +uint64_t htobe64(uint64_t host_64b); diff --git a/lib/endian/little.c b/lib/endian/little.c new file mode 100644 index 0000000..042bb55 --- /dev/null +++ b/lib/endian/little.c @@ -0,0 +1,43 @@ +//===================================================================== +// spdx-license-identifier: ISC +//===================================================================== + +#include "endian.h" + +#if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__ +#error little.c included in build on big endian target +#endif + +uint16_t +htole16(uint16_t host_16b) +{ + return host_16b; +} + +uint32_t +htole32(uint32_t host_32b) +{ + return host_32b; +} + +uint64_t +htole64(uint64_t host_64b) +{ + return host_64b; +} + +uint16_t +htobe16(uint16_t host_16b) +{ + return __builtin_bswap16(host_16b); +} +uint32_t +htobe32(uint32_t host_32b) +{ + return __builtin_bswap32(host_32b); +} +uint64_t +htobe64(uint64_t host_64b) +{ + return __builtin_bswap64(host_64b); +} diff --git a/lib/tst/blake2s_genkat.py b/lib/tst/blake2s_genkat.py new file mode 100755 index 0000000..2dd5370 --- /dev/null +++ b/lib/tst/blake2s_genkat.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 +# Known Answer Test generator + +import json +import hashlib +import secrets + +def blake2s(w, key): + ctx = hashlib.blake2s(key=key) + ctx.update(w) + return ctx.digest().hex() + +def out(s): + o = [s[i:i+2] for i in range(0, len(s), 2)] # split into pairs + o = [f'0x{i}' for i in o] # prepend 0x and join + return ', '.join(o) + +if __name__ == '__main__': + w = b'' + for i in range(0, 256): + w += i.to_bytes(1, 'little') + k = secrets.token_bytes(32) + + print('#pragma once\n') + print(f'static const unsigned KATs_len = 256;') + print(f'static const uint8_t KAT_secret[32] = {{ {", ".join([hex(i) for i in k])} }};') + + print(f'static const uint8_t KATs[256][32] = {{') + for i in range(0, 256): + o = blake2s(w[0:i], b'') + print(f' // {i}') + print(f' {{ {out(o)} }},') + print(f'}};') + + print(f'static const uint8_t secret_KATs[256][32] = {{') + for i in range(0, 256): + o = blake2s(w[0:i], k) + print(f' // {i}') + print(f' {{ {out(o)} }},') + print(f'}};') diff --git a/lib/tst/blake2s_kat.h b/lib/tst/blake2s_kat.h new file mode 100644 index 0000000..aa42ef5 --- /dev/null +++ b/lib/tst/blake2s_kat.h @@ -0,0 +1,1032 @@ +#pragma once + +static const unsigned KATs_len = 256; +static const uint8_t KAT_secret[32] = { 0xba, 0x80, 0xfb, 0x8f, 0x1b, 0x7b, 0xa1, 0x49, 0x3c, 0x6a, 0xe8, 0x8f, 0xd, 0x66, 0xa1, 0xae, 0xff, 0xa2, 0x5c, 0x8a, 0x7d, 0x4c, 0x1f, 0xb6, 0x81, 0x1, 0xb5, 0xe4, 0xc2, 0x8e, 0x37, 0x3 }; +static const uint8_t KATs[256][32] = { + // 0 + { 0x69, 0x21, 0x7a, 0x30, 0x79, 0x90, 0x80, 0x94, 0xe1, 0x11, 0x21, 0xd0, 0x42, 0x35, 0x4a, 0x7c, 0x1f, 0x55, 0xb6, 0x48, 0x2c, 0xa1, 0xa5, 0x1e, 0x1b, 0x25, 0x0d, 0xfd, 0x1e, 0xd0, 0xee, 0xf9 }, + // 1 + { 0xe3, 0x4d, 0x74, 0xdb, 0xaf, 0x4f, 0xf4, 0xc6, 0xab, 0xd8, 0x71, 0xcc, 0x22, 0x04, 0x51, 0xd2, 0xea, 0x26, 0x48, 0x84, 0x6c, 0x77, 0x57, 0xfb, 0xaa, 0xc8, 0x2f, 0xe5, 0x1a, 0xd6, 0x4b, 0xea }, + // 2 + { 0xdd, 0xad, 0x9a, 0xb1, 0x5d, 0xac, 0x45, 0x49, 0xba, 0x42, 0xf4, 0x9d, 0x26, 0x24, 0x96, 0xbe, 0xf6, 0xc0, 0xba, 0xe1, 0xdd, 0x34, 0x2a, 0x88, 0x08, 0xf8, 0xea, 0x26, 0x7c, 0x6e, 0x21, 0x0c }, + // 3 + { 0xe8, 0xf9, 0x1c, 0x6e, 0xf2, 0x32, 0xa0, 0x41, 0x45, 0x2a, 0xb0, 0xe1, 0x49, 0x07, 0x0c, 0xdd, 0x7d, 0xd1, 0x76, 0x9e, 0x75, 0xb3, 0xa5, 0x92, 0x1b, 0xe3, 0x78, 0x76, 0xc4, 0x5c, 0x99, 0x00 }, + // 4 + { 0x0c, 0xc7, 0x0e, 0x00, 0x34, 0x8b, 0x86, 0xba, 0x29, 0x44, 0xd0, 0xc3, 0x20, 0x38, 0xb2, 0x5c, 0x55, 0x58, 0x4f, 0x90, 0xdf, 0x23, 0x04, 0xf5, 0x5f, 0xa3, 0x32, 0xaf, 0x5f, 0xb0, 0x1e, 0x20 }, + // 5 + { 0xec, 0x19, 0x64, 0x19, 0x10, 0x87, 0xa4, 0xfe, 0x9d, 0xf1, 0xc7, 0x95, 0x34, 0x2a, 0x02, 0xff, 0xc1, 0x91, 0xa5, 0xb2, 0x51, 0x76, 0x48, 0x56, 0xae, 0x5b, 0x8b, 0x57, 0x69, 0xf0, 0xc6, 0xcd }, + // 6 + { 0xe1, 0xfa, 0x51, 0x61, 0x8d, 0x7d, 0xf4, 0xeb, 0x70, 0xcf, 0x0d, 0x5a, 0x9e, 0x90, 0x6f, 0x80, 0x6e, 0x9d, 0x19, 0xf7, 0xf4, 0xf0, 0x1e, 0x3b, 0x62, 0x12, 0x88, 0xe4, 0x12, 0x04, 0x05, 0xd6 }, + // 7 + { 0x59, 0x80, 0x01, 0xfa, 0xfb, 0xe8, 0xf9, 0x4e, 0xc6, 0x6d, 0xc8, 0x27, 0xd0, 0x12, 0xcf, 0xcb, 0xba, 0x22, 0x28, 0x56, 0x9f, 0x44, 0x8e, 0x89, 0xea, 0x22, 0x08, 0xc8, 0xbf, 0x76, 0x92, 0x93 }, + // 8 + { 0xc7, 0xe8, 0x87, 0xb5, 0x46, 0x62, 0x36, 0x35, 0xe9, 0x3e, 0x04, 0x95, 0x59, 0x8f, 0x17, 0x26, 0x82, 0x19, 0x96, 0xc2, 0x37, 0x77, 0x05, 0xb9, 0x3a, 0x1f, 0x63, 0x6f, 0x87, 0x2b, 0xfa, 0x2d }, + // 9 + { 0xc3, 0x15, 0xa4, 0x37, 0xdd, 0x28, 0x06, 0x2a, 0x77, 0x0d, 0x48, 0x19, 0x67, 0x13, 0x6b, 0x1b, 0x5e, 0xb8, 0x8b, 0x21, 0xee, 0x53, 0xd0, 0x32, 0x9c, 0x58, 0x97, 0x12, 0x6e, 0x9d, 0xb0, 0x2c }, + // 10 + { 0xbb, 0x47, 0x3d, 0xed, 0xdc, 0x05, 0x5f, 0xea, 0x62, 0x28, 0xf2, 0x07, 0xda, 0x57, 0x53, 0x47, 0xbb, 0x00, 0x40, 0x4c, 0xd3, 0x49, 0xd3, 0x8c, 0x18, 0x02, 0x63, 0x07, 0xa2, 0x24, 0xcb, 0xff }, + // 11 + { 0x68, 0x7e, 0x18, 0x73, 0xa8, 0x27, 0x75, 0x91, 0xbb, 0x33, 0xd9, 0xad, 0xf9, 0xa1, 0x39, 0x12, 0xef, 0xef, 0xe5, 0x57, 0xca, 0xfc, 0x39, 0xa7, 0x95, 0x26, 0x23, 0xe4, 0x72, 0x55, 0xf1, 0x6d }, + // 12 + { 0x1a, 0xc7, 0xba, 0x75, 0x4d, 0x6e, 0x2f, 0x94, 0xe0, 0xe8, 0x6c, 0x46, 0xbf, 0xb2, 0x62, 0xab, 0xbb, 0x74, 0xf4, 0x50, 0xef, 0x45, 0x6d, 0x6b, 0x4d, 0x97, 0xaa, 0x80, 0xce, 0x6d, 0xa7, 0x67 }, + // 13 + { 0x01, 0x2c, 0x97, 0x80, 0x96, 0x14, 0x81, 0x6b, 0x5d, 0x94, 0x94, 0x47, 0x7d, 0x4b, 0x68, 0x7d, 0x15, 0xb9, 0x6e, 0xb6, 0x9c, 0x0e, 0x80, 0x74, 0xa8, 0x51, 0x6f, 0x31, 0x22, 0x4b, 0x5c, 0x98 }, + // 14 + { 0x91, 0xff, 0xd2, 0x6c, 0xfa, 0x4d, 0xa5, 0x13, 0x4c, 0x7e, 0xa2, 0x62, 0xf7, 0x88, 0x9c, 0x32, 0x9f, 0x61, 0xf6, 0xa6, 0x57, 0x22, 0x5c, 0xc2, 0x12, 0xf4, 0x00, 0x56, 0xd9, 0x86, 0xb3, 0xf4 }, + // 15 + { 0xd9, 0x7c, 0x82, 0x8d, 0x81, 0x82, 0xa7, 0x21, 0x80, 0xa0, 0x6a, 0x78, 0x26, 0x83, 0x30, 0x67, 0x3f, 0x7c, 0x4e, 0x06, 0x35, 0x94, 0x7c, 0x04, 0xc0, 0x23, 0x23, 0xfd, 0x45, 0xc0, 0xa5, 0x2d }, + // 16 + { 0xef, 0xc0, 0x4c, 0xdc, 0x39, 0x1c, 0x7e, 0x91, 0x19, 0xbd, 0x38, 0x66, 0x8a, 0x53, 0x4e, 0x65, 0xfe, 0x31, 0x03, 0x6d, 0x6a, 0x62, 0x11, 0x2e, 0x44, 0xeb, 0xeb, 0x11, 0xf9, 0xc5, 0x70, 0x80 }, + // 17 + { 0x99, 0x2c, 0xf5, 0xc0, 0x53, 0x44, 0x2a, 0x5f, 0xbc, 0x4f, 0xaf, 0x58, 0x3e, 0x04, 0xe5, 0x0b, 0xb7, 0x0d, 0x2f, 0x39, 0xfb, 0xb6, 0xa5, 0x03, 0xf8, 0x9e, 0x56, 0xa6, 0x3e, 0x18, 0x57, 0x8a }, + // 18 + { 0x38, 0x64, 0x0e, 0x9f, 0x21, 0x98, 0x3e, 0x67, 0xb5, 0x39, 0xca, 0xcc, 0xae, 0x5e, 0xcf, 0x61, 0x5a, 0xe2, 0x76, 0x4f, 0x75, 0xa0, 0x9c, 0x9c, 0x59, 0xb7, 0x64, 0x83, 0xc1, 0xfb, 0xc7, 0x35 }, + // 19 + { 0x21, 0x3d, 0xd3, 0x4c, 0x7e, 0xfe, 0x4f, 0xb2, 0x7a, 0x6b, 0x35, 0xf6, 0xb4, 0x00, 0x0d, 0x1f, 0xe0, 0x32, 0x81, 0xaf, 0x3c, 0x72, 0x3e, 0x5c, 0x9f, 0x94, 0x74, 0x7a, 0x5f, 0x31, 0xcd, 0x3b }, + // 20 + { 0xec, 0x24, 0x6e, 0xee, 0xb9, 0xce, 0xd3, 0xf7, 0xad, 0x33, 0xed, 0x28, 0x66, 0x0d, 0xd9, 0xbb, 0x07, 0x32, 0x51, 0x3d, 0xb4, 0xe2, 0xfa, 0x27, 0x8b, 0x60, 0xcd, 0xe3, 0x68, 0x2a, 0x4c, 0xcd }, + // 21 + { 0xac, 0x9b, 0x61, 0xd4, 0x46, 0x64, 0x8c, 0x30, 0x05, 0xd7, 0x89, 0x2b, 0xf3, 0xa8, 0x71, 0x9f, 0x4c, 0x81, 0x81, 0xcf, 0xdc, 0xbc, 0x2b, 0x79, 0xfe, 0xf1, 0x0a, 0x27, 0x9b, 0x91, 0x10, 0x95 }, + // 22 + { 0x7b, 0xf8, 0xb2, 0x29, 0x59, 0xe3, 0x4e, 0x3a, 0x43, 0xf7, 0x07, 0x92, 0x23, 0xe8, 0x3a, 0x97, 0x54, 0x61, 0x7d, 0x39, 0x1e, 0x21, 0x3d, 0xfd, 0x80, 0x8e, 0x41, 0xb9, 0xbe, 0xad, 0x4c, 0xe7 }, + // 23 + { 0x68, 0xd4, 0xb5, 0xd4, 0xfa, 0x0e, 0x30, 0x2b, 0x64, 0xcc, 0xc5, 0xaf, 0x79, 0x29, 0x13, 0xac, 0x4c, 0x88, 0xec, 0x95, 0xc0, 0x7d, 0xdf, 0x40, 0x69, 0x42, 0x56, 0xeb, 0x88, 0xce, 0x9f, 0x3d }, + // 24 + { 0xb2, 0xc2, 0x42, 0x0f, 0x05, 0xf9, 0xab, 0xe3, 0x63, 0x15, 0x91, 0x93, 0x36, 0xb3, 0x7e, 0x4e, 0x0f, 0xa3, 0x3f, 0xf7, 0xe7, 0x6a, 0x49, 0x27, 0x67, 0x00, 0x6f, 0xdb, 0x5d, 0x93, 0x54, 0x62 }, + // 25 + { 0x13, 0x4f, 0x61, 0xbb, 0xd0, 0xbb, 0xb6, 0x9a, 0xed, 0x53, 0x43, 0x90, 0x45, 0x51, 0xa3, 0xe6, 0xc1, 0xaa, 0x7d, 0xcd, 0xd7, 0x7e, 0x90, 0x3e, 0x70, 0x23, 0xeb, 0x7c, 0x60, 0x32, 0x0a, 0xa7 }, + // 26 + { 0x46, 0x93, 0xf9, 0xbf, 0xf7, 0xd4, 0xf3, 0x98, 0x6a, 0x7d, 0x17, 0x6e, 0x6e, 0x06, 0xf7, 0x2a, 0xd1, 0x49, 0x0d, 0x80, 0x5c, 0x99, 0xe2, 0x53, 0x47, 0xb8, 0xde, 0x77, 0xb4, 0xdb, 0x6d, 0x9b }, + // 27 + { 0x85, 0x3e, 0x26, 0xf7, 0x41, 0x95, 0x3b, 0x0f, 0xd5, 0xbd, 0xb4, 0x24, 0xe8, 0xab, 0x9e, 0x8b, 0x37, 0x50, 0xea, 0xa8, 0xef, 0x61, 0xe4, 0x79, 0x02, 0xc9, 0x1e, 0x55, 0x4e, 0x9c, 0x73, 0xb9 }, + // 28 + { 0xf7, 0xde, 0x53, 0x63, 0x61, 0xab, 0xaa, 0x0e, 0x15, 0x81, 0x56, 0xcf, 0x0e, 0xa4, 0xf6, 0x3a, 0x99, 0xb5, 0xe4, 0x05, 0x4f, 0x8f, 0xa4, 0xc9, 0xd4, 0x5f, 0x62, 0x85, 0xca, 0xd5, 0x56, 0x94 }, + // 29 + { 0x4c, 0x23, 0x06, 0x08, 0x86, 0x0a, 0x99, 0xae, 0x8d, 0x7b, 0xd5, 0xc2, 0xcc, 0x17, 0xfa, 0x52, 0x09, 0x6b, 0x9a, 0x61, 0xbe, 0xdb, 0x17, 0xcb, 0x76, 0x17, 0x86, 0x4a, 0xd2, 0x9c, 0xa7, 0xa6 }, + // 30 + { 0xae, 0xb9, 0x20, 0xea, 0x87, 0x95, 0x2d, 0xad, 0xb1, 0xfb, 0x75, 0x92, 0x91, 0xe3, 0x38, 0x81, 0x39, 0xa8, 0x72, 0x86, 0x50, 0x01, 0x88, 0x6e, 0xd8, 0x47, 0x52, 0xe9, 0x3c, 0x25, 0x0c, 0x2a }, + // 31 + { 0xab, 0xa4, 0xad, 0x9b, 0x48, 0x0b, 0x9d, 0xf3, 0xd0, 0x8c, 0xa5, 0xe8, 0x7b, 0x0c, 0x24, 0x40, 0xd4, 0xe4, 0xea, 0x21, 0x22, 0x4c, 0x2e, 0xb4, 0x2c, 0xba, 0xe4, 0x69, 0xd0, 0x89, 0xb9, 0x31 }, + // 32 + { 0x05, 0x82, 0x56, 0x07, 0xd7, 0xfd, 0xf2, 0xd8, 0x2e, 0xf4, 0xc3, 0xc8, 0xc2, 0xae, 0xa9, 0x61, 0xad, 0x98, 0xd6, 0x0e, 0xdf, 0xf7, 0xd0, 0x18, 0x98, 0x3e, 0x21, 0x20, 0x4c, 0x0d, 0x93, 0xd1 }, + // 33 + { 0xa7, 0x42, 0xf8, 0xb6, 0xaf, 0x82, 0xd8, 0xa6, 0xca, 0x23, 0x57, 0xc5, 0xf1, 0xcf, 0x91, 0xde, 0xfb, 0xd0, 0x66, 0x26, 0x7d, 0x75, 0xc0, 0x48, 0xb3, 0x52, 0x36, 0x65, 0x85, 0x02, 0x59, 0x62 }, + // 34 + { 0x2b, 0xca, 0xc8, 0x95, 0x99, 0x00, 0x0b, 0x42, 0xc9, 0x5a, 0xe2, 0x38, 0x35, 0xa7, 0x13, 0x70, 0x4e, 0xd7, 0x97, 0x89, 0xc8, 0x4f, 0xef, 0x14, 0x9a, 0x87, 0x4f, 0xf7, 0x33, 0xf0, 0x17, 0xa2 }, + // 35 + { 0xac, 0x1e, 0xd0, 0x7d, 0x04, 0x8f, 0x10, 0x5a, 0x9e, 0x5b, 0x7a, 0xb8, 0x5b, 0x09, 0xa4, 0x92, 0xd5, 0xba, 0xff, 0x14, 0xb8, 0xbf, 0xb0, 0xe9, 0xfd, 0x78, 0x94, 0x86, 0xee, 0xa2, 0xb9, 0x74 }, + // 36 + { 0xe4, 0x8d, 0x0e, 0xcf, 0xaf, 0x49, 0x7d, 0x5b, 0x27, 0xc2, 0x5d, 0x99, 0xe1, 0x56, 0xcb, 0x05, 0x79, 0xd4, 0x40, 0xd6, 0xe3, 0x1f, 0xb6, 0x24, 0x73, 0x69, 0x6d, 0xbf, 0x95, 0xe0, 0x10, 0xe4 }, + // 37 + { 0x12, 0xa9, 0x1f, 0xad, 0xf8, 0xb2, 0x16, 0x44, 0xfd, 0x0f, 0x93, 0x4f, 0x3c, 0x4a, 0x8f, 0x62, 0xba, 0x86, 0x2f, 0xfd, 0x20, 0xe8, 0xe9, 0x61, 0x15, 0x4c, 0x15, 0xc1, 0x38, 0x84, 0xed, 0x3d }, + // 38 + { 0x7c, 0xbe, 0xe9, 0x6e, 0x13, 0x98, 0x97, 0xdc, 0x98, 0xfb, 0xef, 0x3b, 0xe8, 0x1a, 0xd4, 0xd9, 0x64, 0xd2, 0x35, 0xcb, 0x12, 0x14, 0x1f, 0xb6, 0x67, 0x27, 0xe6, 0xe5, 0xdf, 0x73, 0xa8, 0x78 }, + // 39 + { 0xeb, 0xf6, 0x6a, 0xbb, 0x59, 0x7a, 0xe5, 0x72, 0xa7, 0x29, 0x7c, 0xb0, 0x87, 0x1e, 0x35, 0x5a, 0xcc, 0xaf, 0xad, 0x83, 0x77, 0xb8, 0xe7, 0x8b, 0xf1, 0x64, 0xce, 0x2a, 0x18, 0xde, 0x4b, 0xaf }, + // 40 + { 0x71, 0xb9, 0x33, 0xb0, 0x7e, 0x4f, 0xf7, 0x81, 0x8c, 0xe0, 0x59, 0xd0, 0x08, 0x82, 0x9e, 0x45, 0x3c, 0x6f, 0xf0, 0x2e, 0xc0, 0xa7, 0xdb, 0x39, 0x3f, 0xc2, 0xd8, 0x70, 0xf3, 0x7a, 0x72, 0x86 }, + // 41 + { 0x7c, 0xf7, 0xc5, 0x13, 0x31, 0x22, 0x0b, 0x8d, 0x3e, 0xba, 0xed, 0x9c, 0x29, 0x39, 0x8a, 0x16, 0xd9, 0x81, 0x56, 0xe2, 0x61, 0x3c, 0xb0, 0x88, 0xf2, 0xb0, 0xe0, 0x8a, 0x1b, 0xe4, 0xcf, 0x4f }, + // 42 + { 0x3e, 0x41, 0xa1, 0x08, 0xe0, 0xf6, 0x4a, 0xd2, 0x76, 0xb9, 0x79, 0xe1, 0xce, 0x06, 0x82, 0x79, 0xe1, 0x6f, 0x7b, 0xc7, 0xe4, 0xaa, 0x1d, 0x21, 0x1e, 0x17, 0xb8, 0x11, 0x61, 0xdf, 0x16, 0x02 }, + // 43 + { 0x88, 0x65, 0x02, 0xa8, 0x2a, 0xb4, 0x7b, 0xa8, 0xd8, 0x67, 0x10, 0xaa, 0x9d, 0xe3, 0xd4, 0x6e, 0xa6, 0x5c, 0x47, 0xaf, 0x6e, 0xe8, 0xde, 0x45, 0x0c, 0xce, 0xb8, 0xb1, 0x1b, 0x04, 0x5f, 0x50 }, + // 44 + { 0xc0, 0x21, 0xbc, 0x5f, 0x09, 0x54, 0xfe, 0xe9, 0x4f, 0x46, 0xea, 0x09, 0x48, 0x7e, 0x10, 0xa8, 0x48, 0x40, 0xd0, 0x2f, 0x64, 0x81, 0x0b, 0xc0, 0x8d, 0x9e, 0x55, 0x1f, 0x7d, 0x41, 0x68, 0x14 }, + // 45 + { 0x20, 0x30, 0x51, 0x6e, 0x8a, 0x5f, 0xe1, 0x9a, 0xe7, 0x9c, 0x33, 0x6f, 0xce, 0x26, 0x38, 0x2a, 0x74, 0x9d, 0x3f, 0xd0, 0xec, 0x91, 0xe5, 0x37, 0xd4, 0xbd, 0x23, 0x58, 0xc1, 0x2d, 0xfb, 0x22 }, + // 46 + { 0x55, 0x66, 0x98, 0xda, 0xc8, 0x31, 0x7f, 0xd3, 0x6d, 0xfb, 0xdf, 0x25, 0xa7, 0x9c, 0xb1, 0x12, 0xd5, 0x42, 0x58, 0x60, 0x60, 0x5c, 0xba, 0xf5, 0x07, 0xf2, 0x3b, 0xf7, 0xe9, 0xf4, 0x2a, 0xfe }, + // 47 + { 0x2f, 0x86, 0x7b, 0xa6, 0x77, 0x73, 0xfd, 0xc3, 0xe9, 0x2f, 0xce, 0xd9, 0x9a, 0x64, 0x09, 0xad, 0x39, 0xd0, 0xb8, 0x80, 0xfd, 0xe8, 0xf1, 0x09, 0xa8, 0x17, 0x30, 0xc4, 0x45, 0x1d, 0x01, 0x78 }, + // 48 + { 0x17, 0x2e, 0xc2, 0x18, 0xf1, 0x19, 0xdf, 0xae, 0x98, 0x89, 0x6d, 0xff, 0x29, 0xdd, 0x98, 0x76, 0xc9, 0x4a, 0xf8, 0x74, 0x17, 0xf9, 0xae, 0x4c, 0x70, 0x14, 0xbb, 0x4e, 0x4b, 0x96, 0xaf, 0xc7 }, + // 49 + { 0x3f, 0x85, 0x81, 0x4a, 0x18, 0x19, 0x5f, 0x87, 0x9a, 0xa9, 0x62, 0xf9, 0x5d, 0x26, 0xbd, 0x82, 0xa2, 0x78, 0xf2, 0xb8, 0x23, 0x20, 0x21, 0x8f, 0x6b, 0x3b, 0xd6, 0xf7, 0xf6, 0x67, 0xa6, 0xd9 }, + // 50 + { 0x1b, 0x61, 0x8f, 0xba, 0xa5, 0x66, 0xb3, 0xd4, 0x98, 0xc1, 0x2e, 0x98, 0x2c, 0x9e, 0xc5, 0x2e, 0x4d, 0xa8, 0x5a, 0x8c, 0x54, 0xf3, 0x8f, 0x34, 0xc0, 0x90, 0x39, 0x4f, 0x23, 0xc1, 0x84, 0xc1 }, + // 51 + { 0x0c, 0x75, 0x8f, 0xb5, 0x69, 0x2f, 0xfd, 0x41, 0xa3, 0x57, 0x5d, 0x0a, 0xf0, 0x0c, 0xc7, 0xfb, 0xf2, 0xcb, 0xe5, 0x90, 0x5a, 0x58, 0x32, 0x3a, 0x88, 0xae, 0x42, 0x44, 0xf6, 0xe4, 0xc9, 0x93 }, + // 52 + { 0xa9, 0x31, 0x36, 0x0c, 0xad, 0x62, 0x8c, 0x7f, 0x12, 0xa6, 0xc1, 0xc4, 0xb7, 0x53, 0xb0, 0xf4, 0x06, 0x2a, 0xef, 0x3c, 0xe6, 0x5a, 0x1a, 0xe3, 0xf1, 0x93, 0x69, 0xda, 0xdf, 0x3a, 0xe2, 0x3d }, + // 53 + { 0xcb, 0xac, 0x7d, 0x77, 0x3b, 0x1e, 0x3b, 0x3c, 0x66, 0x91, 0xd7, 0xab, 0xb7, 0xe9, 0xdf, 0x04, 0x5c, 0x8b, 0xa1, 0x92, 0x68, 0xde, 0xd1, 0x53, 0x20, 0x7f, 0x5e, 0x80, 0x43, 0x52, 0xec, 0x5d }, + // 54 + { 0x23, 0xa1, 0x96, 0xd3, 0x80, 0x2e, 0xd3, 0xc1, 0xb3, 0x84, 0x01, 0x9a, 0x82, 0x32, 0x58, 0x40, 0xd3, 0x2f, 0x71, 0x95, 0x0c, 0x45, 0x80, 0xb0, 0x34, 0x45, 0xe0, 0x89, 0x8e, 0x14, 0x05, 0x3c }, + // 55 + { 0xf4, 0x49, 0x54, 0x70, 0xf2, 0x26, 0xc8, 0xc2, 0x14, 0xbe, 0x08, 0xfd, 0xfa, 0xd4, 0xbc, 0x4a, 0x2a, 0x9d, 0xbe, 0xa9, 0x13, 0x6a, 0x21, 0x0d, 0xf0, 0xd4, 0xb6, 0x49, 0x29, 0xe6, 0xfc, 0x14 }, + // 56 + { 0xe2, 0x90, 0xdd, 0x27, 0x0b, 0x46, 0x7f, 0x34, 0xab, 0x1c, 0x00, 0x2d, 0x34, 0x0f, 0xa0, 0x16, 0x25, 0x7f, 0xf1, 0x9e, 0x58, 0x33, 0xfd, 0xbb, 0xf2, 0xcb, 0x40, 0x1c, 0x3b, 0x28, 0x17, 0xde }, + // 57 + { 0x9f, 0xc7, 0xb5, 0xde, 0xd3, 0xc1, 0x50, 0x42, 0xb2, 0xa6, 0x58, 0x2d, 0xc3, 0x9b, 0xe0, 0x16, 0xd2, 0x4a, 0x68, 0x2d, 0x5e, 0x61, 0xad, 0x1e, 0xff, 0x9c, 0x63, 0x30, 0x98, 0x48, 0xf7, 0x06 }, + // 58 + { 0x8c, 0xca, 0x67, 0xa3, 0x6d, 0x17, 0xd5, 0xe6, 0x34, 0x1c, 0xb5, 0x92, 0xfd, 0x7b, 0xef, 0x99, 0x26, 0xc9, 0xe3, 0xaa, 0x10, 0x27, 0xea, 0x11, 0xa7, 0xd8, 0xbd, 0x26, 0x0b, 0x57, 0x6e, 0x04 }, + // 59 + { 0x40, 0x93, 0x92, 0xf5, 0x60, 0xf8, 0x68, 0x31, 0xda, 0x43, 0x73, 0xee, 0x5e, 0x00, 0x74, 0x26, 0x05, 0x95, 0xd7, 0xbc, 0x24, 0x18, 0x3b, 0x60, 0xed, 0x70, 0x0d, 0x45, 0x83, 0xd3, 0xf6, 0xf0 }, + // 60 + { 0x28, 0x02, 0x16, 0x5d, 0xe0, 0x90, 0x91, 0x55, 0x46, 0xf3, 0x39, 0x8c, 0xd8, 0x49, 0x16, 0x4a, 0x19, 0xf9, 0x2a, 0xdb, 0xc3, 0x61, 0xad, 0xc9, 0x9b, 0x0f, 0x20, 0xc8, 0xea, 0x07, 0x10, 0x54 }, + // 61 + { 0xad, 0x83, 0x91, 0x68, 0xd9, 0xf8, 0xa4, 0xbe, 0x95, 0xba, 0x9e, 0xf9, 0xa6, 0x92, 0xf0, 0x72, 0x56, 0xae, 0x43, 0xfe, 0x6f, 0x98, 0x64, 0xe2, 0x90, 0x69, 0x1b, 0x02, 0x56, 0xce, 0x50, 0xa9 }, + // 62 + { 0x75, 0xfd, 0xaa, 0x50, 0x38, 0xc2, 0x84, 0xb8, 0x6d, 0x6e, 0x8a, 0xff, 0xe8, 0xb2, 0x80, 0x7e, 0x46, 0x7b, 0x86, 0x60, 0x0e, 0x79, 0xaf, 0x36, 0x89, 0xfb, 0xc0, 0x63, 0x28, 0xcb, 0xf8, 0x94 }, + // 63 + { 0xe5, 0x7c, 0xb7, 0x94, 0x87, 0xdd, 0x57, 0x90, 0x24, 0x32, 0xb2, 0x50, 0x73, 0x38, 0x13, 0xbd, 0x96, 0xa8, 0x4e, 0xfc, 0xe5, 0x9f, 0x65, 0x0f, 0xac, 0x26, 0xe6, 0x69, 0x6a, 0xef, 0xaf, 0xc3 }, + // 64 + { 0x56, 0xf3, 0x4e, 0x8b, 0x96, 0x55, 0x7e, 0x90, 0xc1, 0xf2, 0x4b, 0x52, 0xd0, 0xc8, 0x9d, 0x51, 0x08, 0x6a, 0xcf, 0x1b, 0x00, 0xf6, 0x34, 0xcf, 0x1d, 0xde, 0x92, 0x33, 0xb8, 0xea, 0xaa, 0x3e }, + // 65 + { 0x1b, 0x53, 0xee, 0x94, 0xaa, 0xf3, 0x4e, 0x4b, 0x15, 0x9d, 0x48, 0xde, 0x35, 0x2c, 0x7f, 0x06, 0x61, 0xd0, 0xa4, 0x0e, 0xdf, 0xf9, 0x5a, 0x0b, 0x16, 0x39, 0xb4, 0x09, 0x0e, 0x97, 0x44, 0x72 }, + // 66 + { 0x05, 0x70, 0x5e, 0x2a, 0x81, 0x75, 0x7c, 0x14, 0xbd, 0x38, 0x3e, 0xa9, 0x8d, 0xda, 0x54, 0x4e, 0xb1, 0x0e, 0x6b, 0xc0, 0x7b, 0xae, 0x43, 0x5e, 0x25, 0x18, 0xdb, 0xe1, 0x33, 0x52, 0x53, 0x75 }, + // 67 + { 0xd8, 0xb2, 0x86, 0x6e, 0x8a, 0x30, 0x9d, 0xb5, 0x3e, 0x52, 0x9e, 0xc3, 0x29, 0x11, 0xd8, 0x2f, 0x5c, 0xa1, 0x6c, 0xff, 0x76, 0x21, 0x68, 0x91, 0xa9, 0x67, 0x6a, 0xa3, 0x1a, 0xaa, 0x6c, 0x42 }, + // 68 + { 0xf5, 0x04, 0x1c, 0x24, 0x12, 0x70, 0xeb, 0x04, 0xc7, 0x1e, 0xc2, 0xc9, 0x5d, 0x4c, 0x38, 0xd8, 0x03, 0xb1, 0x23, 0x7b, 0x0f, 0x29, 0xfd, 0x4d, 0xb3, 0xeb, 0x39, 0x76, 0x69, 0xe8, 0x86, 0x99 }, + // 69 + { 0x9a, 0x4c, 0xe0, 0x77, 0xc3, 0x49, 0x32, 0x2f, 0x59, 0x5e, 0x0e, 0xe7, 0x9e, 0xd0, 0xda, 0x5f, 0xab, 0x66, 0x75, 0x2c, 0xbf, 0xef, 0x8f, 0x87, 0xd0, 0xe9, 0xd0, 0x72, 0x3c, 0x75, 0x30, 0xdd }, + // 70 + { 0x65, 0x7b, 0x09, 0xf3, 0xd0, 0xf5, 0x2b, 0x5b, 0x8f, 0x2f, 0x97, 0x16, 0x3a, 0x0e, 0xdf, 0x0c, 0x04, 0xf0, 0x75, 0x40, 0x8a, 0x07, 0xbb, 0xeb, 0x3a, 0x41, 0x01, 0xa8, 0x91, 0x99, 0x0d, 0x62 }, + // 71 + { 0x1e, 0x3f, 0x7b, 0xd5, 0xa5, 0x8f, 0xa5, 0x33, 0x34, 0x4a, 0xa8, 0xed, 0x3a, 0xc1, 0x22, 0xbb, 0x9e, 0x70, 0xd4, 0xef, 0x50, 0xd0, 0x04, 0x53, 0x08, 0x21, 0x94, 0x8f, 0x5f, 0xe6, 0x31, 0x5a }, + // 72 + { 0x80, 0xdc, 0xcf, 0x3f, 0xd8, 0x3d, 0xfd, 0x0d, 0x35, 0xaa, 0x28, 0x58, 0x59, 0x22, 0xab, 0x89, 0xd5, 0x31, 0x39, 0x97, 0x67, 0x3e, 0xaf, 0x90, 0x5c, 0xea, 0x9c, 0x0b, 0x22, 0x5c, 0x7b, 0x5f }, + // 73 + { 0x8a, 0x0d, 0x0f, 0xbf, 0x63, 0x77, 0xd8, 0x3b, 0xb0, 0x8b, 0x51, 0x4b, 0x4b, 0x1c, 0x43, 0xac, 0xc9, 0x5d, 0x75, 0x17, 0x14, 0xf8, 0x92, 0x56, 0x45, 0xcb, 0x6b, 0xc8, 0x56, 0xca, 0x15, 0x0a }, + // 74 + { 0x9f, 0xa5, 0xb4, 0x87, 0x73, 0x8a, 0xd2, 0x84, 0x4c, 0xc6, 0x34, 0x8a, 0x90, 0x19, 0x18, 0xf6, 0x59, 0xa3, 0xb8, 0x9e, 0x9c, 0x0d, 0xfe, 0xea, 0xd3, 0x0d, 0xd9, 0x4b, 0xcf, 0x42, 0xef, 0x8e }, + // 75 + { 0x80, 0x83, 0x2c, 0x4a, 0x16, 0x77, 0xf5, 0xea, 0x25, 0x60, 0xf6, 0x68, 0xe9, 0x35, 0x4d, 0xd3, 0x69, 0x97, 0xf0, 0x37, 0x28, 0xcf, 0xa5, 0x5e, 0x1b, 0x38, 0x33, 0x7c, 0x0c, 0x9e, 0xf8, 0x18 }, + // 76 + { 0xab, 0x37, 0xdd, 0xb6, 0x83, 0x13, 0x7e, 0x74, 0x08, 0x0d, 0x02, 0x6b, 0x59, 0x0b, 0x96, 0xae, 0x9b, 0xb4, 0x47, 0x72, 0x2f, 0x30, 0x5a, 0x5a, 0xc5, 0x70, 0xec, 0x1d, 0xf9, 0xb1, 0x74, 0x3c }, + // 77 + { 0x3e, 0xe7, 0x35, 0xa6, 0x94, 0xc2, 0x55, 0x9b, 0x69, 0x3a, 0xa6, 0x86, 0x29, 0x36, 0x1e, 0x15, 0xd1, 0x22, 0x65, 0xad, 0x6a, 0x3d, 0xed, 0xf4, 0x88, 0xb0, 0xb0, 0x0f, 0xac, 0x97, 0x54, 0xba }, + // 78 + { 0xd6, 0xfc, 0xd2, 0x32, 0x19, 0xb6, 0x47, 0xe4, 0xcb, 0xd5, 0xeb, 0x2d, 0x0a, 0xd0, 0x1e, 0xc8, 0x83, 0x8a, 0x4b, 0x29, 0x01, 0xfc, 0x32, 0x5c, 0xc3, 0x70, 0x19, 0x81, 0xca, 0x6c, 0x88, 0x8b }, + // 79 + { 0x05, 0x20, 0xec, 0x2f, 0x5b, 0xf7, 0xa7, 0x55, 0xda, 0xcb, 0x50, 0xc6, 0xbf, 0x23, 0x3e, 0x35, 0x15, 0x43, 0x47, 0x63, 0xdb, 0x01, 0x39, 0xcc, 0xd9, 0xfa, 0xef, 0xbb, 0x82, 0x07, 0x61, 0x2d }, + // 80 + { 0xaf, 0xf3, 0xb7, 0x5f, 0x3f, 0x58, 0x12, 0x64, 0xd7, 0x66, 0x16, 0x62, 0xb9, 0x2f, 0x5a, 0xd3, 0x7c, 0x1d, 0x32, 0xbd, 0x45, 0xff, 0x81, 0xa4, 0xed, 0x8a, 0xdc, 0x9e, 0xf3, 0x0d, 0xd9, 0x89 }, + // 81 + { 0xd0, 0xdd, 0x65, 0x0b, 0xef, 0xd3, 0xba, 0x63, 0xdc, 0x25, 0x10, 0x2c, 0x62, 0x7c, 0x92, 0x1b, 0x9c, 0xbe, 0xb0, 0xb1, 0x30, 0x68, 0x69, 0x35, 0xb5, 0xc9, 0x27, 0xcb, 0x7c, 0xcd, 0x5e, 0x3b }, + // 82 + { 0xe1, 0x14, 0x98, 0x16, 0xb1, 0x0a, 0x85, 0x14, 0xfb, 0x3e, 0x2c, 0xab, 0x2c, 0x08, 0xbe, 0xe9, 0xf7, 0x3c, 0xe7, 0x62, 0x21, 0x70, 0x12, 0x46, 0xa5, 0x89, 0xbb, 0xb6, 0x73, 0x02, 0xd8, 0xa9 }, + // 83 + { 0x7d, 0xa3, 0xf4, 0x41, 0xde, 0x90, 0x54, 0x31, 0x7e, 0x72, 0xb5, 0xdb, 0xf9, 0x79, 0xda, 0x01, 0xe6, 0xbc, 0xee, 0xbb, 0x84, 0x78, 0xea, 0xe6, 0xa2, 0x28, 0x49, 0xd9, 0x02, 0x92, 0x63, 0x5c }, + // 84 + { 0x12, 0x30, 0xb1, 0xfc, 0x8a, 0x7d, 0x92, 0x15, 0xed, 0xc2, 0xd4, 0xa2, 0xde, 0xcb, 0xdd, 0x0a, 0x6e, 0x21, 0x6c, 0x92, 0x42, 0x78, 0xc9, 0x1f, 0xc5, 0xd1, 0x0e, 0x7d, 0x60, 0x19, 0x2d, 0x94 }, + // 85 + { 0x57, 0x50, 0xd7, 0x16, 0xb4, 0x80, 0x8f, 0x75, 0x1f, 0xeb, 0xc3, 0x88, 0x06, 0xba, 0x17, 0x0b, 0xf6, 0xd5, 0x19, 0x9a, 0x78, 0x16, 0xbe, 0x51, 0x4e, 0x3f, 0x93, 0x2f, 0xbe, 0x0c, 0xb8, 0x71 }, + // 86 + { 0x6f, 0xc5, 0x9b, 0x2f, 0x10, 0xfe, 0xba, 0x95, 0x4a, 0xa6, 0x82, 0x0b, 0x3c, 0xa9, 0x87, 0xee, 0x81, 0xd5, 0xcc, 0x1d, 0xa3, 0xc6, 0x3c, 0xe8, 0x27, 0x30, 0x1c, 0x56, 0x9d, 0xfb, 0x39, 0xce }, + // 87 + { 0xc7, 0xc3, 0xfe, 0x1e, 0xeb, 0xdc, 0x7b, 0x5a, 0x93, 0x93, 0x26, 0xe8, 0xdd, 0xb8, 0x3e, 0x8b, 0xf2, 0xb7, 0x80, 0xb6, 0x56, 0x78, 0xcb, 0x62, 0xf2, 0x08, 0xb0, 0x40, 0xab, 0xdd, 0x35, 0xe2 }, + // 88 + { 0x0c, 0x75, 0xc1, 0xa1, 0x5c, 0xf3, 0x4a, 0x31, 0x4e, 0xe4, 0x78, 0xf4, 0xa5, 0xce, 0x0b, 0x8a, 0x6b, 0x36, 0x52, 0x8e, 0xf7, 0xa8, 0x20, 0x69, 0x6c, 0x3e, 0x42, 0x46, 0xc5, 0xa1, 0x58, 0x64 }, + // 89 + { 0x21, 0x6d, 0xc1, 0x2a, 0x10, 0x85, 0x69, 0xa3, 0xc7, 0xcd, 0xde, 0x4a, 0xed, 0x43, 0xa6, 0xc3, 0x30, 0x13, 0x9d, 0xda, 0x3c, 0xcc, 0x4a, 0x10, 0x89, 0x05, 0xdb, 0x38, 0x61, 0x89, 0x90, 0x50 }, + // 90 + { 0xa5, 0x7b, 0xe6, 0xae, 0x67, 0x56, 0xf2, 0x8b, 0x02, 0xf5, 0x9d, 0xad, 0xf7, 0xe0, 0xd7, 0xd8, 0x80, 0x7f, 0x10, 0xfa, 0x15, 0xce, 0xd1, 0xad, 0x35, 0x85, 0x52, 0x1a, 0x1d, 0x99, 0x5a, 0x89 }, + // 91 + { 0x81, 0x6a, 0xef, 0x87, 0x59, 0x53, 0x71, 0x6c, 0xd7, 0xa5, 0x81, 0xf7, 0x32, 0xf5, 0x3d, 0xd4, 0x35, 0xda, 0xb6, 0x6d, 0x09, 0xc3, 0x61, 0xd2, 0xd6, 0x59, 0x2d, 0xe1, 0x77, 0x55, 0xd8, 0xa8 }, + // 92 + { 0x9a, 0x76, 0x89, 0x32, 0x26, 0x69, 0x3b, 0x6e, 0xa9, 0x7e, 0x6a, 0x73, 0x8f, 0x9d, 0x10, 0xfb, 0x3d, 0x0b, 0x43, 0xae, 0x0e, 0x8b, 0x7d, 0x81, 0x23, 0xea, 0x76, 0xce, 0x97, 0x98, 0x9c, 0x7e }, + // 93 + { 0x8d, 0xae, 0xdb, 0x9a, 0x27, 0x15, 0x29, 0xdb, 0xb7, 0xdc, 0x3b, 0x60, 0x7f, 0xe5, 0xeb, 0x2d, 0x32, 0x11, 0x77, 0x07, 0x58, 0xdd, 0x3b, 0x0a, 0x35, 0x93, 0xd2, 0xd7, 0x95, 0x4e, 0x2d, 0x5b }, + // 94 + { 0x16, 0xdb, 0xc0, 0xaa, 0x5d, 0xd2, 0xc7, 0x74, 0xf5, 0x05, 0x10, 0x0f, 0x73, 0x37, 0x86, 0xd8, 0xa1, 0x75, 0xfc, 0xbb, 0xb5, 0x9c, 0x43, 0xe1, 0xfb, 0xff, 0x3e, 0x1e, 0xaf, 0x31, 0xcb, 0x4a }, + // 95 + { 0x86, 0x06, 0xcb, 0x89, 0x9c, 0x6a, 0xea, 0xf5, 0x1b, 0x9d, 0xb0, 0xfe, 0x49, 0x24, 0xa9, 0xfd, 0x5d, 0xab, 0xc1, 0x9f, 0x88, 0x26, 0xf2, 0xbc, 0x1c, 0x1d, 0x7d, 0xa1, 0x4d, 0x2c, 0x2c, 0x99 }, + // 96 + { 0x84, 0x79, 0x73, 0x1a, 0xed, 0xa5, 0x7b, 0xd3, 0x7e, 0xad, 0xb5, 0x1a, 0x50, 0x7e, 0x30, 0x7f, 0x3b, 0xd9, 0x5e, 0x69, 0xdb, 0xca, 0x94, 0xf3, 0xbc, 0x21, 0x72, 0x60, 0x66, 0xad, 0x6d, 0xfd }, + // 97 + { 0x58, 0x47, 0x3a, 0x9e, 0xa8, 0x2e, 0xfa, 0x3f, 0x3b, 0x3d, 0x8f, 0xc8, 0x3e, 0xd8, 0x86, 0x31, 0x27, 0xb3, 0x3a, 0xe8, 0xde, 0xae, 0x63, 0x07, 0x20, 0x1e, 0xdb, 0x6d, 0xde, 0x61, 0xde, 0x29 }, + // 98 + { 0x9a, 0x92, 0x55, 0xd5, 0x3a, 0xf1, 0x16, 0xde, 0x8b, 0xa2, 0x7c, 0xe3, 0x5b, 0x4c, 0x7e, 0x15, 0x64, 0x06, 0x57, 0xa0, 0xfc, 0xb8, 0x88, 0xc7, 0x0d, 0x95, 0x43, 0x1d, 0xac, 0xd8, 0xf8, 0x30 }, + // 99 + { 0x9e, 0xb0, 0x5f, 0xfb, 0xa3, 0x9f, 0xd8, 0x59, 0x6a, 0x45, 0x49, 0x3e, 0x18, 0xd2, 0x51, 0x0b, 0xf3, 0xef, 0x06, 0x5c, 0x51, 0xd6, 0xe1, 0x3a, 0xbe, 0x66, 0xaa, 0x57, 0xe0, 0x5c, 0xfd, 0xb7 }, + // 100 + { 0x81, 0xdc, 0xc3, 0xa5, 0x05, 0xea, 0xce, 0x3f, 0x87, 0x9d, 0x8f, 0x70, 0x27, 0x76, 0x77, 0x0f, 0x9d, 0xf5, 0x0e, 0x52, 0x1d, 0x14, 0x28, 0xa8, 0x5d, 0xaf, 0x04, 0xf9, 0xad, 0x21, 0x50, 0xe0 }, + // 101 + { 0xe3, 0xe3, 0xc4, 0xaa, 0x3a, 0xcb, 0xbc, 0x85, 0x33, 0x2a, 0xf9, 0xd5, 0x64, 0xbc, 0x24, 0x16, 0x5e, 0x16, 0x87, 0xf6, 0xb1, 0xad, 0xcb, 0xfa, 0xe7, 0x7a, 0x8f, 0x03, 0xc7, 0x2a, 0xc2, 0x8c }, + // 102 + { 0x67, 0x46, 0xc8, 0x0b, 0x4e, 0xb5, 0x6a, 0xea, 0x45, 0xe6, 0x4e, 0x72, 0x89, 0xbb, 0xa3, 0xed, 0xbf, 0x45, 0xec, 0xf8, 0x20, 0x64, 0x81, 0xff, 0x63, 0x02, 0x12, 0x29, 0x84, 0xcd, 0x52, 0x6a }, + // 103 + { 0x2b, 0x62, 0x8e, 0x52, 0x76, 0x4d, 0x7d, 0x62, 0xc0, 0x86, 0x8b, 0x21, 0x23, 0x57, 0xcd, 0xd1, 0x2d, 0x91, 0x49, 0x82, 0x2f, 0x4e, 0x98, 0x45, 0xd9, 0x18, 0xa0, 0x8d, 0x1a, 0xe9, 0x90, 0xc0 }, + // 104 + { 0xe4, 0xbf, 0xe8, 0x0d, 0x58, 0xc9, 0x19, 0x94, 0x61, 0x39, 0x09, 0xdc, 0x4b, 0x1a, 0x12, 0x49, 0x68, 0x96, 0xc0, 0x04, 0xaf, 0x7b, 0x57, 0x01, 0x48, 0x3d, 0xe4, 0x5d, 0x28, 0x23, 0xd7, 0x8e }, + // 105 + { 0xeb, 0xb4, 0xba, 0x15, 0x0c, 0xef, 0x27, 0x34, 0x34, 0x5b, 0x5d, 0x64, 0x1b, 0xbe, 0xd0, 0x3a, 0x21, 0xea, 0xfa, 0xe9, 0x33, 0xc9, 0x9e, 0x00, 0x92, 0x12, 0xef, 0x04, 0x57, 0x4a, 0x85, 0x30 }, + // 106 + { 0x39, 0x66, 0xec, 0x73, 0xb1, 0x54, 0xac, 0xc6, 0x97, 0xac, 0x5c, 0xf5, 0xb2, 0x4b, 0x40, 0xbd, 0xb0, 0xdb, 0x9e, 0x39, 0x88, 0x36, 0xd7, 0x6d, 0x4b, 0x88, 0x0e, 0x3b, 0x2a, 0xf1, 0xaa, 0x27 }, + // 107 + { 0xef, 0x7e, 0x48, 0x31, 0xb3, 0xa8, 0x46, 0x36, 0x51, 0x8d, 0x6e, 0x4b, 0xfc, 0xe6, 0x4a, 0x43, 0xdb, 0x2a, 0x5d, 0xda, 0x9c, 0xca, 0x2b, 0x44, 0xf3, 0x90, 0x33, 0xbd, 0xc4, 0x0d, 0x62, 0x43 }, + // 108 + { 0x7a, 0xbf, 0x6a, 0xcf, 0x5c, 0x8e, 0x54, 0x9d, 0xdb, 0xb1, 0x5a, 0xe8, 0xd8, 0xb3, 0x88, 0xc1, 0xc1, 0x97, 0xe6, 0x98, 0x73, 0x7c, 0x97, 0x85, 0x50, 0x1e, 0xd1, 0xf9, 0x49, 0x30, 0xb7, 0xd9 }, + // 109 + { 0x88, 0x01, 0x8d, 0xed, 0x66, 0x81, 0x3f, 0x0c, 0xa9, 0x5d, 0xef, 0x47, 0x4c, 0x63, 0x06, 0x92, 0x01, 0x99, 0x67, 0xb9, 0xe3, 0x68, 0x88, 0xda, 0xdd, 0x94, 0x12, 0x47, 0x19, 0xb6, 0x82, 0xf6 }, + // 110 + { 0x39, 0x30, 0x87, 0x6b, 0x9f, 0xc7, 0x52, 0x90, 0x36, 0xb0, 0x08, 0xb1, 0xb8, 0xbb, 0x99, 0x75, 0x22, 0xa4, 0x41, 0x63, 0x5a, 0x0c, 0x25, 0xec, 0x02, 0xfb, 0x6d, 0x90, 0x26, 0xe5, 0x5a, 0x97 }, + // 111 + { 0x0a, 0x40, 0x49, 0xd5, 0x7e, 0x83, 0x3b, 0x56, 0x95, 0xfa, 0xc9, 0x3d, 0xd1, 0xfb, 0xef, 0x31, 0x66, 0xb4, 0x4b, 0x12, 0xad, 0x11, 0x24, 0x86, 0x62, 0x38, 0x3a, 0xe0, 0x51, 0xe1, 0x58, 0x27 }, + // 112 + { 0x81, 0xdc, 0xc0, 0x67, 0x8b, 0xb6, 0xa7, 0x65, 0xe4, 0x8c, 0x32, 0x09, 0x65, 0x4f, 0xe9, 0x00, 0x89, 0xce, 0x44, 0xff, 0x56, 0x18, 0x47, 0x7e, 0x39, 0xab, 0x28, 0x64, 0x76, 0xdf, 0x05, 0x2b }, + // 113 + { 0xe6, 0x9b, 0x3a, 0x36, 0xa4, 0x46, 0x19, 0x12, 0xdc, 0x08, 0x34, 0x6b, 0x11, 0xdd, 0xcb, 0x9d, 0xb7, 0x96, 0xf8, 0x85, 0xfd, 0x01, 0x93, 0x6e, 0x66, 0x2f, 0xe2, 0x92, 0x97, 0xb0, 0x99, 0xa4 }, + // 114 + { 0x5a, 0xc6, 0x50, 0x3b, 0x0d, 0x8d, 0xa6, 0x91, 0x76, 0x46, 0xe6, 0xdc, 0xc8, 0x7e, 0xdc, 0x58, 0xe9, 0x42, 0x45, 0x32, 0x4c, 0xc2, 0x04, 0xf4, 0xdd, 0x4a, 0xf0, 0x15, 0x63, 0xac, 0xd4, 0x27 }, + // 115 + { 0xdf, 0x6d, 0xda, 0x21, 0x35, 0x9a, 0x30, 0xbc, 0x27, 0x17, 0x80, 0x97, 0x1c, 0x1a, 0xbd, 0x56, 0xa6, 0xef, 0x16, 0x7e, 0x48, 0x08, 0x87, 0x88, 0x8e, 0x73, 0xa8, 0x6d, 0x3b, 0xf6, 0x05, 0xe9 }, + // 116 + { 0xe8, 0xe6, 0xe4, 0x70, 0x71, 0xe7, 0xb7, 0xdf, 0x25, 0x80, 0xf2, 0x25, 0xcf, 0xbb, 0xed, 0xf8, 0x4c, 0xe6, 0x77, 0x46, 0x62, 0x66, 0x28, 0xd3, 0x30, 0x97, 0xe4, 0xb7, 0xdc, 0x57, 0x11, 0x07 }, + // 117 + { 0x53, 0xe4, 0x0e, 0xad, 0x62, 0x05, 0x1e, 0x19, 0xcb, 0x9b, 0xa8, 0x13, 0x3e, 0x3e, 0x5c, 0x1c, 0xe0, 0x0d, 0xdc, 0xad, 0x8a, 0xcf, 0x34, 0x2a, 0x22, 0x43, 0x60, 0xb0, 0xac, 0xc1, 0x47, 0x77 }, + // 118 + { 0x9c, 0xcd, 0x53, 0xfe, 0x80, 0xbe, 0x78, 0x6a, 0xa9, 0x84, 0x63, 0x84, 0x62, 0xfb, 0x28, 0xaf, 0xdf, 0x12, 0x2b, 0x34, 0xd7, 0x8f, 0x46, 0x87, 0xec, 0x63, 0x2b, 0xb1, 0x9d, 0xe2, 0x37, 0x1a }, + // 119 + { 0xcb, 0xd4, 0x80, 0x52, 0xc4, 0x8d, 0x78, 0x84, 0x66, 0xa3, 0xe8, 0x11, 0x8c, 0x56, 0xc9, 0x7f, 0xe1, 0x46, 0xe5, 0x54, 0x6f, 0xaa, 0xf9, 0x3e, 0x2b, 0xc3, 0xc4, 0x7e, 0x45, 0x93, 0x97, 0x53 }, + // 120 + { 0x25, 0x68, 0x83, 0xb1, 0x4e, 0x2a, 0xf4, 0x4d, 0xad, 0xb2, 0x8e, 0x1b, 0x34, 0xb2, 0xac, 0x0f, 0x0f, 0x4c, 0x91, 0xc3, 0x4e, 0xc9, 0x16, 0x9e, 0x29, 0x03, 0x61, 0x58, 0xac, 0xaa, 0x95, 0xb9 }, + // 121 + { 0x44, 0x71, 0xb9, 0x1a, 0xb4, 0x2d, 0xb7, 0xc4, 0xdd, 0x84, 0x90, 0xab, 0x95, 0xa2, 0xee, 0x8d, 0x04, 0xe3, 0xef, 0x5c, 0x3d, 0x6f, 0xc7, 0x1a, 0xc7, 0x4b, 0x2b, 0x26, 0x91, 0x4d, 0x16, 0x41 }, + // 122 + { 0xa5, 0xeb, 0x08, 0x03, 0x8f, 0x8f, 0x11, 0x55, 0xed, 0x86, 0xe6, 0x31, 0x90, 0x6f, 0xc1, 0x30, 0x95, 0xf6, 0xbb, 0xa4, 0x1d, 0xe5, 0xd4, 0xe7, 0x95, 0x75, 0x8e, 0xc8, 0xc8, 0xdf, 0x8a, 0xf1 }, + // 123 + { 0xdc, 0x1d, 0xb6, 0x4e, 0xd8, 0xb4, 0x8a, 0x91, 0x0e, 0x06, 0x0a, 0x6b, 0x86, 0x63, 0x74, 0xc5, 0x78, 0x78, 0x4e, 0x9a, 0xc4, 0x9a, 0xb2, 0x77, 0x40, 0x92, 0xac, 0x71, 0x50, 0x19, 0x34, 0xac }, + // 124 + { 0x28, 0x54, 0x13, 0xb2, 0xf2, 0xee, 0x87, 0x3d, 0x34, 0x31, 0x9e, 0xe0, 0xbb, 0xfb, 0xb9, 0x0f, 0x32, 0xda, 0x43, 0x4c, 0xc8, 0x7e, 0x3d, 0xb5, 0xed, 0x12, 0x1b, 0xb3, 0x98, 0xed, 0x96, 0x4b }, + // 125 + { 0x02, 0x16, 0xe0, 0xf8, 0x1f, 0x75, 0x0f, 0x26, 0xf1, 0x99, 0x8b, 0xc3, 0x93, 0x4e, 0x3e, 0x12, 0x4c, 0x99, 0x45, 0xe6, 0x85, 0xa6, 0x0b, 0x25, 0xe8, 0xfb, 0xd9, 0x62, 0x5a, 0xb6, 0xb5, 0x99 }, + // 126 + { 0x38, 0xc4, 0x10, 0xf5, 0xb9, 0xd4, 0x07, 0x20, 0x50, 0x75, 0x5b, 0x31, 0xdc, 0xa8, 0x9f, 0xd5, 0x39, 0x5c, 0x67, 0x85, 0xee, 0xb3, 0xd7, 0x90, 0xf3, 0x20, 0xff, 0x94, 0x1c, 0x5a, 0x93, 0xbf }, + // 127 + { 0xf1, 0x84, 0x17, 0xb3, 0x9d, 0x61, 0x7a, 0xb1, 0xc1, 0x8f, 0xdf, 0x91, 0xeb, 0xd0, 0xfc, 0x6d, 0x55, 0x16, 0xbb, 0x34, 0xcf, 0x39, 0x36, 0x40, 0x37, 0xbc, 0xe8, 0x1f, 0xa0, 0x4c, 0xec, 0xb1 }, + // 128 + { 0x1f, 0xa8, 0x77, 0xde, 0x67, 0x25, 0x9d, 0x19, 0x86, 0x3a, 0x2a, 0x34, 0xbc, 0xc6, 0x96, 0x2a, 0x2b, 0x25, 0xfc, 0xbf, 0x5c, 0xbe, 0xcd, 0x7e, 0xde, 0x8f, 0x1f, 0xa3, 0x66, 0x88, 0xa7, 0x96 }, + // 129 + { 0x5b, 0xd1, 0x69, 0xe6, 0x7c, 0x82, 0xc2, 0xc2, 0xe9, 0x8e, 0xf7, 0x00, 0x8b, 0xdf, 0x26, 0x1f, 0x2d, 0xdf, 0x30, 0xb1, 0xc0, 0x0f, 0x9e, 0x7f, 0x27, 0x5b, 0xb3, 0xe8, 0xa2, 0x8d, 0xc9, 0xa2 }, + // 130 + { 0xc8, 0x0a, 0xbe, 0xeb, 0xb6, 0x69, 0xad, 0x5d, 0xee, 0xb5, 0xf5, 0xec, 0x8e, 0xa6, 0xb7, 0xa0, 0x5d, 0xdf, 0x7d, 0x31, 0xec, 0x4c, 0x0a, 0x2e, 0xe2, 0x0b, 0x0b, 0x98, 0xca, 0xec, 0x67, 0x46 }, + // 131 + { 0xe7, 0x6d, 0x3f, 0xbd, 0xa5, 0xba, 0x37, 0x4e, 0x6b, 0xf8, 0xe5, 0x0f, 0xad, 0xc3, 0xbb, 0xb9, 0xba, 0x5c, 0x20, 0x6e, 0xbd, 0xec, 0x89, 0xa3, 0xa5, 0x4c, 0xf3, 0xdd, 0x84, 0xa0, 0x70, 0x16 }, + // 132 + { 0x7b, 0xba, 0x9d, 0xc5, 0xb5, 0xdb, 0x20, 0x71, 0xd1, 0x77, 0x52, 0xb1, 0x04, 0x4c, 0x1e, 0xce, 0xd9, 0x6a, 0xaf, 0x2d, 0xd4, 0x6e, 0x9b, 0x43, 0x37, 0x50, 0xe8, 0xea, 0x0d, 0xcc, 0x18, 0x70 }, + // 133 + { 0xf2, 0x9b, 0x1b, 0x1a, 0xb9, 0xba, 0xb1, 0x63, 0x01, 0x8e, 0xe3, 0xda, 0x15, 0x23, 0x2c, 0xca, 0x78, 0xec, 0x52, 0xdb, 0xc3, 0x4e, 0xda, 0x5b, 0x82, 0x2e, 0xc1, 0xd8, 0x0f, 0xc2, 0x1b, 0xd0 }, + // 134 + { 0x9e, 0xe3, 0xe3, 0xe7, 0xe9, 0x00, 0xf1, 0xe1, 0x1d, 0x30, 0x8c, 0x4b, 0x2b, 0x30, 0x76, 0xd2, 0x72, 0xcf, 0x70, 0x12, 0x4f, 0x9f, 0x51, 0xe1, 0xda, 0x60, 0xf3, 0x78, 0x46, 0xcd, 0xd2, 0xf4 }, + // 135 + { 0x70, 0xea, 0x3b, 0x01, 0x76, 0x92, 0x7d, 0x90, 0x96, 0xa1, 0x85, 0x08, 0xcd, 0x12, 0x3a, 0x29, 0x03, 0x25, 0x92, 0x0a, 0x9d, 0x00, 0xa8, 0x9b, 0x5d, 0xe0, 0x42, 0x73, 0xfb, 0xc7, 0x6b, 0x85 }, + // 136 + { 0x67, 0xde, 0x25, 0xc0, 0x2a, 0x4a, 0xab, 0xa2, 0x3b, 0xdc, 0x97, 0x3c, 0x8b, 0xb0, 0xb5, 0x79, 0x6d, 0x47, 0xcc, 0x06, 0x59, 0xd4, 0x3d, 0xff, 0x1f, 0x97, 0xde, 0x17, 0x49, 0x63, 0xb6, 0x8e }, + // 137 + { 0xb2, 0x16, 0x8e, 0x4e, 0x0f, 0x18, 0xb0, 0xe6, 0x41, 0x00, 0xb5, 0x17, 0xed, 0x95, 0x25, 0x7d, 0x73, 0xf0, 0x62, 0x0d, 0xf8, 0x85, 0xc1, 0x3d, 0x2e, 0xcf, 0x79, 0x36, 0x7b, 0x38, 0x4c, 0xee }, + // 138 + { 0x2e, 0x7d, 0xec, 0x24, 0x28, 0x85, 0x3b, 0x2c, 0x71, 0x76, 0x07, 0x45, 0x54, 0x1f, 0x7a, 0xfe, 0x98, 0x25, 0xb5, 0xdd, 0x77, 0xdf, 0x06, 0x51, 0x1d, 0x84, 0x41, 0xa9, 0x4b, 0xac, 0xc9, 0x27 }, + // 139 + { 0xca, 0x9f, 0xfa, 0xc4, 0xc4, 0x3f, 0x0b, 0x48, 0x46, 0x1d, 0xc5, 0xc2, 0x63, 0xbe, 0xa3, 0xf6, 0xf0, 0x06, 0x11, 0xce, 0xac, 0xab, 0xf6, 0xf8, 0x95, 0xba, 0x2b, 0x01, 0x01, 0xdb, 0xb6, 0x8d }, + // 140 + { 0x74, 0x10, 0xd4, 0x2d, 0x8f, 0xd1, 0xd5, 0xe9, 0xd2, 0xf5, 0x81, 0x5c, 0xb9, 0x34, 0x17, 0x99, 0x88, 0x28, 0xef, 0x3c, 0x42, 0x30, 0xbf, 0xbd, 0x41, 0x2d, 0xf0, 0xa4, 0xa7, 0xa2, 0x50, 0x7a }, + // 141 + { 0x50, 0x10, 0xf6, 0x84, 0x51, 0x6d, 0xcc, 0xd0, 0xb6, 0xee, 0x08, 0x52, 0xc2, 0x51, 0x2b, 0x4d, 0xc0, 0x06, 0x6c, 0xf0, 0xd5, 0x6f, 0x35, 0x30, 0x29, 0x78, 0xdb, 0x8a, 0xe3, 0x2c, 0x6a, 0x81 }, + // 142 + { 0xac, 0xaa, 0xb5, 0x85, 0xf7, 0xb7, 0x9b, 0x71, 0x99, 0x35, 0xce, 0xb8, 0x95, 0x23, 0xdd, 0xc5, 0x48, 0x27, 0xf7, 0x5c, 0x56, 0x88, 0x38, 0x56, 0x15, 0x4a, 0x56, 0xcd, 0xcd, 0x5e, 0xe9, 0x88 }, + // 143 + { 0x66, 0x6d, 0xe5, 0xd1, 0x44, 0x0f, 0xee, 0x73, 0x31, 0xaa, 0xf0, 0x12, 0x3a, 0x62, 0xef, 0x2d, 0x8b, 0xa5, 0x74, 0x53, 0xa0, 0x76, 0x96, 0x35, 0xac, 0x6c, 0xd0, 0x1e, 0x63, 0x3f, 0x77, 0x12 }, + // 144 + { 0xa6, 0xf9, 0x86, 0x58, 0xf6, 0xea, 0xba, 0xf9, 0x02, 0xd8, 0xb3, 0x87, 0x1a, 0x4b, 0x10, 0x1d, 0x16, 0x19, 0x6e, 0x8a, 0x4b, 0x24, 0x1e, 0x15, 0x58, 0xfe, 0x29, 0x96, 0x6e, 0x10, 0x3e, 0x8d }, + // 145 + { 0x89, 0x15, 0x46, 0xa8, 0xb2, 0x9f, 0x30, 0x47, 0xdd, 0xcf, 0xe5, 0xb0, 0x0e, 0x45, 0xfd, 0x55, 0x75, 0x63, 0x73, 0x10, 0x5e, 0xa8, 0x63, 0x7d, 0xfc, 0xff, 0x54, 0x7b, 0x6e, 0xa9, 0x53, 0x5f }, + // 146 + { 0x18, 0xdf, 0xbc, 0x1a, 0xc5, 0xd2, 0x5b, 0x07, 0x61, 0x13, 0x7d, 0xbd, 0x22, 0xc1, 0x7c, 0x82, 0x9d, 0x0f, 0x0e, 0xf1, 0xd8, 0x23, 0x44, 0xe9, 0xc8, 0x9c, 0x28, 0x66, 0x94, 0xda, 0x24, 0xe8 }, + // 147 + { 0xb5, 0x4b, 0x9b, 0x67, 0xf8, 0xfe, 0xd5, 0x4b, 0xbf, 0x5a, 0x26, 0x66, 0xdb, 0xdf, 0x4b, 0x23, 0xcf, 0xf1, 0xd1, 0xb6, 0xf4, 0xaf, 0xc9, 0x85, 0xb2, 0xe6, 0xd3, 0x30, 0x5a, 0x9f, 0xf8, 0x0f }, + // 148 + { 0x7d, 0xb4, 0x42, 0xe1, 0x32, 0xba, 0x59, 0xbc, 0x12, 0x89, 0xaa, 0x98, 0xb0, 0xd3, 0xe8, 0x06, 0x00, 0x4f, 0x8e, 0xc1, 0x28, 0x11, 0xaf, 0x1e, 0x2e, 0x33, 0xc6, 0x9b, 0xfd, 0xe7, 0x29, 0xe1 }, + // 149 + { 0x25, 0x0f, 0x37, 0xcd, 0xc1, 0x5e, 0x81, 0x7d, 0x2f, 0x16, 0x0d, 0x99, 0x56, 0xc7, 0x1f, 0xe3, 0xeb, 0x5d, 0xb7, 0x45, 0x56, 0xe4, 0xad, 0xf9, 0xa4, 0xff, 0xaf, 0xba, 0x74, 0x01, 0x03, 0x96 }, + // 150 + { 0x4a, 0xb8, 0xa3, 0xdd, 0x1d, 0xdf, 0x8a, 0xd4, 0x3d, 0xab, 0x13, 0xa2, 0x7f, 0x66, 0xa6, 0x54, 0x4f, 0x29, 0x05, 0x97, 0xfa, 0x96, 0x04, 0x0e, 0x0e, 0x1d, 0xb9, 0x26, 0x3a, 0xa4, 0x79, 0xf8 }, + // 151 + { 0xee, 0x61, 0x72, 0x7a, 0x07, 0x66, 0xdf, 0x93, 0x9c, 0xcd, 0xc8, 0x60, 0x33, 0x40, 0x44, 0xc7, 0x9a, 0x3c, 0x9b, 0x15, 0x62, 0x00, 0xbc, 0x3a, 0xa3, 0x29, 0x73, 0x48, 0x3d, 0x83, 0x41, 0xae }, + // 152 + { 0x3f, 0x68, 0xc7, 0xec, 0x63, 0xac, 0x11, 0xeb, 0xb9, 0x8f, 0x94, 0xb3, 0x39, 0xb0, 0x5c, 0x10, 0x49, 0x84, 0xfd, 0xa5, 0x01, 0x03, 0x06, 0x01, 0x44, 0xe5, 0xa2, 0xbf, 0xcc, 0xc9, 0xda, 0x95 }, + // 153 + { 0x05, 0x6f, 0x29, 0x81, 0x6b, 0x8a, 0xf8, 0xf5, 0x66, 0x82, 0xbc, 0x4d, 0x7c, 0xf0, 0x94, 0x11, 0x1d, 0xa7, 0x73, 0x3e, 0x72, 0x6c, 0xd1, 0x3d, 0x6b, 0x3e, 0x8e, 0xa0, 0x3e, 0x92, 0xa0, 0xd5 }, + // 154 + { 0xf5, 0xec, 0x43, 0xa2, 0x8a, 0xcb, 0xef, 0xf1, 0xf3, 0x31, 0x8a, 0x5b, 0xca, 0xc7, 0xc6, 0x6d, 0xdb, 0x52, 0x30, 0xb7, 0x9d, 0xb2, 0xd1, 0x05, 0xbc, 0xbe, 0x15, 0xf3, 0xc1, 0x14, 0x8d, 0x69 }, + // 155 + { 0x2a, 0x69, 0x60, 0xad, 0x1d, 0x8d, 0xd5, 0x47, 0x55, 0x5c, 0xfb, 0xd5, 0xe4, 0x60, 0x0f, 0x1e, 0xaa, 0x1c, 0x8e, 0xda, 0x34, 0xde, 0x03, 0x74, 0xec, 0x4a, 0x26, 0xea, 0xaa, 0xa3, 0x3b, 0x4e }, + // 156 + { 0xdc, 0xc1, 0xea, 0x7b, 0xaa, 0xb9, 0x33, 0x84, 0xf7, 0x6b, 0x79, 0x68, 0x66, 0x19, 0x97, 0x54, 0x74, 0x2f, 0x7b, 0x96, 0xd6, 0xb4, 0xc1, 0x20, 0x16, 0x5c, 0x04, 0xa6, 0xc4, 0xf5, 0xce, 0x10 }, + // 157 + { 0x13, 0xd5, 0xdf, 0x17, 0x92, 0x21, 0x37, 0x9c, 0x6a, 0x78, 0xc0, 0x7c, 0x79, 0x3f, 0xf5, 0x34, 0x87, 0xca, 0xe6, 0xbf, 0x9f, 0xe8, 0x82, 0x54, 0x1a, 0xb0, 0xe7, 0x35, 0xe3, 0xea, 0xda, 0x3b }, + // 158 + { 0x8c, 0x59, 0xe4, 0x40, 0x76, 0x41, 0xa0, 0x1e, 0x8f, 0xf9, 0x1f, 0x99, 0x80, 0xdc, 0x23, 0x6f, 0x4e, 0xcd, 0x6f, 0xcf, 0x52, 0x58, 0x9a, 0x09, 0x9a, 0x96, 0x16, 0x33, 0x96, 0x77, 0x14, 0xe1 }, + // 159 + { 0x83, 0x3b, 0x1a, 0xc6, 0xa2, 0x51, 0xfd, 0x08, 0xfd, 0x6d, 0x90, 0x8f, 0xea, 0x2a, 0x4e, 0xe1, 0xe0, 0x40, 0xbc, 0xa9, 0x3f, 0xc1, 0xa3, 0x8e, 0xc3, 0x82, 0x0e, 0x0c, 0x10, 0xbd, 0x82, 0xea }, + // 160 + { 0xa2, 0x44, 0xf9, 0x27, 0xf3, 0xb4, 0x0b, 0x8f, 0x6c, 0x39, 0x15, 0x70, 0xc7, 0x65, 0x41, 0x8f, 0x2f, 0x6e, 0x70, 0x8e, 0xac, 0x90, 0x06, 0xc5, 0x1a, 0x7f, 0xef, 0xf4, 0xaf, 0x3b, 0x2b, 0x9e }, + // 161 + { 0x3d, 0x99, 0xed, 0x95, 0x50, 0xcf, 0x11, 0x96, 0xe6, 0xc4, 0xd2, 0x0c, 0x25, 0x96, 0x20, 0xf8, 0x58, 0xc3, 0xd7, 0x03, 0x37, 0x4c, 0x12, 0x8c, 0xe7, 0xb5, 0x90, 0x31, 0x0c, 0x83, 0x04, 0x6d }, + // 162 + { 0x2b, 0x35, 0xc4, 0x7d, 0x7b, 0x87, 0x76, 0x1f, 0x0a, 0xe4, 0x3a, 0xc5, 0x6a, 0xc2, 0x7b, 0x9f, 0x25, 0x83, 0x03, 0x67, 0xb5, 0x95, 0xbe, 0x8c, 0x24, 0x0e, 0x94, 0x60, 0x0c, 0x6e, 0x33, 0x12 }, + // 163 + { 0x5d, 0x11, 0xed, 0x37, 0xd2, 0x4d, 0xc7, 0x67, 0x30, 0x5c, 0xb7, 0xe1, 0x46, 0x7d, 0x87, 0xc0, 0x65, 0xac, 0x4b, 0xc8, 0xa4, 0x26, 0xde, 0x38, 0x99, 0x1f, 0xf5, 0x9a, 0xa8, 0x73, 0x5d, 0x02 }, + // 164 + { 0xb8, 0x36, 0x47, 0x8e, 0x1c, 0xa0, 0x64, 0x0d, 0xce, 0x6f, 0xd9, 0x10, 0xa5, 0x09, 0x62, 0x72, 0xc8, 0x33, 0x09, 0x90, 0xcd, 0x97, 0x86, 0x4a, 0xc2, 0xbf, 0x14, 0xef, 0x6b, 0x23, 0x91, 0x4a }, + // 165 + { 0x91, 0x00, 0xf9, 0x46, 0xd6, 0xcc, 0xde, 0x3a, 0x59, 0x7f, 0x90, 0xd3, 0x9f, 0xc1, 0x21, 0x5b, 0xad, 0xdc, 0x74, 0x13, 0x64, 0x3d, 0x85, 0xc2, 0x1c, 0x3e, 0xee, 0x5d, 0x2d, 0xd3, 0x28, 0x94 }, + // 166 + { 0xda, 0x70, 0xee, 0xdd, 0x23, 0xe6, 0x63, 0xaa, 0x1a, 0x74, 0xb9, 0x76, 0x69, 0x35, 0xb4, 0x79, 0x22, 0x2a, 0x72, 0xaf, 0xba, 0x5c, 0x79, 0x51, 0x58, 0xda, 0xd4, 0x1a, 0x3b, 0xd7, 0x7e, 0x40 }, + // 167 + { 0xf0, 0x67, 0xed, 0x6a, 0x0d, 0xbd, 0x43, 0xaa, 0x0a, 0x92, 0x54, 0xe6, 0x9f, 0xd6, 0x6b, 0xdd, 0x8a, 0xcb, 0x87, 0xde, 0x93, 0x6c, 0x25, 0x8c, 0xfb, 0x02, 0x28, 0x5f, 0x2c, 0x11, 0xfa, 0x79 }, + // 168 + { 0x71, 0x5c, 0x99, 0xc7, 0xd5, 0x75, 0x80, 0xcf, 0x97, 0x53, 0xb4, 0xc1, 0xd7, 0x95, 0xe4, 0x5a, 0x83, 0xfb, 0xb2, 0x28, 0xc0, 0xd3, 0x6f, 0xbe, 0x20, 0xfa, 0xf3, 0x9b, 0xdd, 0x6d, 0x4e, 0x85 }, + // 169 + { 0xe4, 0x57, 0xd6, 0xad, 0x1e, 0x67, 0xcb, 0x9b, 0xbd, 0x17, 0xcb, 0xd6, 0x98, 0xfa, 0x6d, 0x7d, 0xae, 0x0c, 0x9b, 0x7a, 0xd6, 0xcb, 0xd6, 0x53, 0x96, 0x34, 0xe3, 0x2a, 0x71, 0x9c, 0x84, 0x92 }, + // 170 + { 0xec, 0xe3, 0xea, 0x81, 0x03, 0xe0, 0x24, 0x83, 0xc6, 0x4a, 0x70, 0xa4, 0xbd, 0xce, 0xe8, 0xce, 0xb6, 0x27, 0x8f, 0x25, 0x33, 0xf3, 0xf4, 0x8d, 0xbe, 0xed, 0xfb, 0xa9, 0x45, 0x31, 0xd4, 0xae }, + // 171 + { 0x38, 0x8a, 0xa5, 0xd3, 0x66, 0x7a, 0x97, 0xc6, 0x8d, 0x3d, 0x56, 0xf8, 0xf3, 0xee, 0x8d, 0x3d, 0x36, 0x09, 0x1f, 0x17, 0xfe, 0x5d, 0x1b, 0x0d, 0x5d, 0x84, 0xc9, 0x3b, 0x2f, 0xfe, 0x40, 0xbd }, + // 172 + { 0x8b, 0x6b, 0x31, 0xb9, 0xad, 0x7c, 0x3d, 0x5c, 0xd8, 0x4b, 0xf9, 0x89, 0x47, 0xb9, 0xcd, 0xb5, 0x9d, 0xf8, 0xa2, 0x5f, 0xf7, 0x38, 0x10, 0x10, 0x13, 0xbe, 0x4f, 0xd6, 0x5e, 0x1d, 0xd1, 0xa3 }, + // 173 + { 0x06, 0x62, 0x91, 0xf6, 0xbb, 0xd2, 0x5f, 0x3c, 0x85, 0x3d, 0xb7, 0xd8, 0xb9, 0x5c, 0x9a, 0x1c, 0xfb, 0x9b, 0xf1, 0xc1, 0xc9, 0x9f, 0xb9, 0x5a, 0x9b, 0x78, 0x69, 0xd9, 0x0f, 0x1c, 0x29, 0x03 }, + // 174 + { 0xa7, 0x07, 0xef, 0xbc, 0xcd, 0xce, 0xed, 0x42, 0x96, 0x7a, 0x66, 0xf5, 0x53, 0x9b, 0x93, 0xed, 0x75, 0x60, 0xd4, 0x67, 0x30, 0x40, 0x16, 0xc4, 0x78, 0x0d, 0x77, 0x55, 0xa5, 0x65, 0xd4, 0xc4 }, + // 175 + { 0x38, 0xc5, 0x3d, 0xfb, 0x70, 0xbe, 0x7e, 0x79, 0x2b, 0x07, 0xa6, 0xa3, 0x5b, 0x8a, 0x6a, 0x0a, 0xba, 0x02, 0xc5, 0xc5, 0xf3, 0x8b, 0xaf, 0x5c, 0x82, 0x3f, 0xdf, 0xd9, 0xe4, 0x2d, 0x65, 0x7e }, + // 176 + { 0xf2, 0x91, 0x13, 0x86, 0x50, 0x1d, 0x9a, 0xb9, 0xd7, 0x20, 0xcf, 0x8a, 0xd1, 0x05, 0x03, 0xd5, 0x63, 0x4b, 0xf4, 0xb7, 0xd1, 0x2b, 0x56, 0xdf, 0xb7, 0x4f, 0xec, 0xc6, 0xe4, 0x09, 0x3f, 0x68 }, + // 177 + { 0xc6, 0xf2, 0xbd, 0xd5, 0x2b, 0x81, 0xe6, 0xe4, 0xf6, 0x59, 0x5a, 0xbd, 0x4d, 0x7f, 0xb3, 0x1f, 0x65, 0x11, 0x69, 0xd0, 0x0f, 0xf3, 0x26, 0x92, 0x6b, 0x34, 0x94, 0x7b, 0x28, 0xa8, 0x39, 0x59 }, + // 178 + { 0x29, 0x3d, 0x94, 0xb1, 0x8c, 0x98, 0xbb, 0x32, 0x23, 0x36, 0x6b, 0x8c, 0xe7, 0x4c, 0x28, 0xfb, 0xdf, 0x28, 0xe1, 0xf8, 0x4a, 0x33, 0x50, 0xb0, 0xeb, 0x2d, 0x18, 0x04, 0xa5, 0x77, 0x57, 0x9b }, + // 179 + { 0x2c, 0x2f, 0xa5, 0xc0, 0xb5, 0x15, 0x33, 0x16, 0x5b, 0xc3, 0x75, 0xc2, 0x2e, 0x27, 0x81, 0x76, 0x82, 0x70, 0xa3, 0x83, 0x98, 0x5d, 0x13, 0xbd, 0x6b, 0x67, 0xb6, 0xfd, 0x67, 0xf8, 0x89, 0xeb }, + // 180 + { 0xca, 0xa0, 0x9b, 0x82, 0xb7, 0x25, 0x62, 0xe4, 0x3f, 0x4b, 0x22, 0x75, 0xc0, 0x91, 0x91, 0x8e, 0x62, 0x4d, 0x91, 0x16, 0x61, 0xcc, 0x81, 0x1b, 0xb5, 0xfa, 0xec, 0x51, 0xf6, 0x08, 0x8e, 0xf7 }, + // 181 + { 0x24, 0x76, 0x1e, 0x45, 0xe6, 0x74, 0x39, 0x53, 0x79, 0xfb, 0x17, 0x72, 0x9c, 0x78, 0xcb, 0x93, 0x9e, 0x6f, 0x74, 0xc5, 0xdf, 0xfb, 0x9c, 0x96, 0x1f, 0x49, 0x59, 0x82, 0xc3, 0xed, 0x1f, 0xe3 }, + // 182 + { 0x55, 0xb7, 0x0a, 0x82, 0x13, 0x1e, 0xc9, 0x48, 0x88, 0xd7, 0xab, 0x54, 0xa7, 0xc5, 0x15, 0x25, 0x5c, 0x39, 0x38, 0xbb, 0x10, 0xbc, 0x78, 0x4d, 0xc9, 0xb6, 0x7f, 0x07, 0x6e, 0x34, 0x1a, 0x73 }, + // 183 + { 0x6a, 0xb9, 0x05, 0x7b, 0x97, 0x7e, 0xbc, 0x3c, 0xa4, 0xd4, 0xce, 0x74, 0x50, 0x6c, 0x25, 0xcc, 0xcd, 0xc5, 0x66, 0x49, 0x7c, 0x45, 0x0b, 0x54, 0x15, 0xa3, 0x94, 0x86, 0xf8, 0x65, 0x7a, 0x03 }, + // 184 + { 0x24, 0x06, 0x6d, 0xee, 0xe0, 0xec, 0xee, 0x15, 0xa4, 0x5f, 0x0a, 0x32, 0x6d, 0x0f, 0x8d, 0xbc, 0x79, 0x76, 0x1e, 0xbb, 0x93, 0xcf, 0x8c, 0x03, 0x77, 0xaf, 0x44, 0x09, 0x78, 0xfc, 0xf9, 0x94 }, + // 185 + { 0x20, 0x00, 0x0d, 0x3f, 0x66, 0xba, 0x76, 0x86, 0x0d, 0x5a, 0x95, 0x06, 0x88, 0xb9, 0xaa, 0x0d, 0x76, 0xcf, 0xea, 0x59, 0xb0, 0x05, 0xd8, 0x59, 0x91, 0x4b, 0x1a, 0x46, 0x65, 0x3a, 0x93, 0x9b }, + // 186 + { 0xb9, 0x2d, 0xaa, 0x79, 0x60, 0x3e, 0x3b, 0xdb, 0xc3, 0xbf, 0xe0, 0xf4, 0x19, 0xe4, 0x09, 0xb2, 0xea, 0x10, 0xdc, 0x43, 0x5b, 0xee, 0xfe, 0x29, 0x59, 0xda, 0x16, 0x89, 0x5d, 0x5d, 0xca, 0x1c }, + // 187 + { 0xe9, 0x47, 0x94, 0x87, 0x05, 0xb2, 0x06, 0xd5, 0x72, 0xb0, 0xe8, 0xf6, 0x2f, 0x66, 0xa6, 0x55, 0x1c, 0xbd, 0x6b, 0xc3, 0x05, 0xd2, 0x6c, 0xe7, 0x53, 0x9a, 0x12, 0xf9, 0xaa, 0xdf, 0x75, 0x71 }, + // 188 + { 0x3d, 0x67, 0xc1, 0xb3, 0xf9, 0xb2, 0x39, 0x10, 0xe3, 0xd3, 0x5e, 0x6b, 0x0f, 0x2c, 0xcf, 0x44, 0xa0, 0xb5, 0x40, 0xa4, 0x5c, 0x18, 0xba, 0x3c, 0x36, 0x26, 0x4d, 0xd4, 0x8e, 0x96, 0xaf, 0x6a }, + // 189 + { 0xc7, 0x55, 0x8b, 0xab, 0xda, 0x04, 0xbc, 0xcb, 0x76, 0x4d, 0x0b, 0xbf, 0x33, 0x58, 0x42, 0x51, 0x41, 0x90, 0x2d, 0x22, 0x39, 0x1d, 0x9f, 0x8c, 0x59, 0x15, 0x9f, 0xec, 0x9e, 0x49, 0xb1, 0x51 }, + // 190 + { 0x0b, 0x73, 0x2b, 0xb0, 0x35, 0x67, 0x5a, 0x50, 0xff, 0x58, 0xf2, 0xc2, 0x42, 0xe4, 0x71, 0x0a, 0xec, 0xe6, 0x46, 0x70, 0x07, 0x9c, 0x13, 0x04, 0x4c, 0x79, 0xc9, 0xb7, 0x49, 0x1f, 0x70, 0x00 }, + // 191 + { 0xd1, 0x20, 0xb5, 0xef, 0x6d, 0x57, 0xeb, 0xf0, 0x6e, 0xaf, 0x96, 0xbc, 0x93, 0x3c, 0x96, 0x7b, 0x16, 0xcb, 0xe6, 0xe2, 0xbf, 0x00, 0x74, 0x1c, 0x30, 0xaa, 0x1c, 0x54, 0xba, 0x64, 0x80, 0x1f }, + // 192 + { 0x58, 0xd2, 0x12, 0xad, 0x6f, 0x58, 0xae, 0xf0, 0xf8, 0x01, 0x16, 0xb4, 0x41, 0xe5, 0x7f, 0x61, 0x95, 0xbf, 0xef, 0x26, 0xb6, 0x14, 0x63, 0xed, 0xec, 0x11, 0x83, 0xcd, 0xb0, 0x4f, 0xe7, 0x6d }, + // 193 + { 0xb8, 0x83, 0x6f, 0x51, 0xd1, 0xe2, 0x9b, 0xdf, 0xdb, 0xa3, 0x25, 0x56, 0x53, 0x60, 0x26, 0x8b, 0x8f, 0xad, 0x62, 0x74, 0x73, 0xed, 0xec, 0xef, 0x7e, 0xae, 0xfe, 0xe8, 0x37, 0xc7, 0x40, 0x03 }, + // 194 + { 0xc5, 0x47, 0xa3, 0xc1, 0x24, 0xae, 0x56, 0x85, 0xff, 0xa7, 0xb8, 0xed, 0xaf, 0x96, 0xec, 0x86, 0xf8, 0xb2, 0xd0, 0xd5, 0x0c, 0xee, 0x8b, 0xe3, 0xb1, 0xf0, 0xc7, 0x67, 0x63, 0x06, 0x9d, 0x9c }, + // 195 + { 0x5d, 0x16, 0x8b, 0x76, 0x9a, 0x2f, 0x67, 0x85, 0x3d, 0x62, 0x95, 0xf7, 0x56, 0x8b, 0xe4, 0x0b, 0xb7, 0xa1, 0x6b, 0x8d, 0x65, 0xba, 0x87, 0x63, 0x5d, 0x19, 0x78, 0xd2, 0xab, 0x11, 0xba, 0x2a }, + // 196 + { 0xa2, 0xf6, 0x75, 0xdc, 0x73, 0x02, 0x63, 0x8c, 0xb6, 0x02, 0x01, 0x06, 0x4c, 0xa5, 0x50, 0x77, 0x71, 0x4d, 0x71, 0xfe, 0x09, 0x6a, 0x31, 0x5f, 0x2f, 0xe7, 0x40, 0x12, 0x77, 0xca, 0xa5, 0xaf }, + // 197 + { 0xc8, 0xaa, 0xb5, 0xcd, 0x01, 0x60, 0xae, 0x78, 0xcd, 0x2e, 0x8a, 0xc5, 0xfb, 0x0e, 0x09, 0x3c, 0xdb, 0x5c, 0x4b, 0x60, 0x52, 0xa0, 0xa9, 0x7b, 0xb0, 0x42, 0x16, 0x82, 0x6f, 0xa7, 0xa4, 0x37 }, + // 198 + { 0xff, 0x68, 0xca, 0x40, 0x35, 0xbf, 0xeb, 0x43, 0xfb, 0xf1, 0x45, 0xfd, 0xdd, 0x5e, 0x43, 0xf1, 0xce, 0xa5, 0x4f, 0x11, 0xf7, 0xbe, 0xe1, 0x30, 0x58, 0xf0, 0x27, 0x32, 0x9a, 0x4a, 0x5f, 0xa4 }, + // 199 + { 0x1d, 0x4e, 0x54, 0x87, 0xae, 0x3c, 0x74, 0x0f, 0x2b, 0xa6, 0xe5, 0x41, 0xac, 0x91, 0xbc, 0x2b, 0xfc, 0xd2, 0x99, 0x9c, 0x51, 0x8d, 0x80, 0x7b, 0x42, 0x67, 0x48, 0x80, 0x3a, 0x35, 0x0f, 0xd4 }, + // 200 + { 0x6d, 0x24, 0x4e, 0x1a, 0x06, 0xce, 0x4e, 0xf5, 0x78, 0xdd, 0x0f, 0x63, 0xaf, 0xf0, 0x93, 0x67, 0x06, 0x73, 0x51, 0x19, 0xca, 0x9c, 0x8d, 0x22, 0xd8, 0x6c, 0x80, 0x14, 0x14, 0xab, 0x97, 0x41 }, + // 201 + { 0xde, 0xcf, 0x73, 0x29, 0xdb, 0xcc, 0x82, 0x7b, 0x8f, 0xc5, 0x24, 0xc9, 0x43, 0x1e, 0x89, 0x98, 0x02, 0x9e, 0xce, 0x12, 0xce, 0x93, 0xb7, 0xb2, 0xf3, 0xe7, 0x69, 0xa9, 0x41, 0xfb, 0x8c, 0xea }, + // 202 + { 0x2f, 0xaf, 0xcc, 0x0f, 0x2e, 0x63, 0xcb, 0xd0, 0x77, 0x55, 0xbe, 0x7b, 0x75, 0xec, 0xea, 0x0a, 0xdf, 0xf9, 0xaa, 0x5e, 0xde, 0x2a, 0x52, 0xfd, 0xab, 0x4d, 0xfd, 0x03, 0x74, 0xcd, 0x48, 0x3f }, + // 203 + { 0xaa, 0x85, 0x01, 0x0d, 0xd4, 0x6a, 0x54, 0x6b, 0x53, 0x5e, 0xf4, 0xcf, 0x5f, 0x07, 0xd6, 0x51, 0x61, 0xe8, 0x98, 0x28, 0xf3, 0xa7, 0x7d, 0xb7, 0xb9, 0xb5, 0x6f, 0x0d, 0xf5, 0x9a, 0xae, 0x45 }, + // 204 + { 0x07, 0xe8, 0xe1, 0xee, 0x73, 0x2c, 0xb0, 0xd3, 0x56, 0xc9, 0xc0, 0xd1, 0x06, 0x9c, 0x89, 0xd1, 0x7a, 0xdf, 0x6a, 0x9a, 0x33, 0x4f, 0x74, 0x5e, 0xc7, 0x86, 0x73, 0x32, 0x54, 0x8c, 0xa8, 0xe9 }, + // 205 + { 0x0e, 0x01, 0xe8, 0x1c, 0xad, 0xa8, 0x16, 0x2b, 0xfd, 0x5f, 0x8a, 0x8c, 0x81, 0x8a, 0x6c, 0x69, 0xfe, 0xdf, 0x02, 0xce, 0xb5, 0x20, 0x85, 0x23, 0xcb, 0xe5, 0x31, 0x3b, 0x89, 0xca, 0x10, 0x53 }, + // 206 + { 0x6b, 0xb6, 0xc6, 0x47, 0x26, 0x55, 0x08, 0x43, 0x99, 0x85, 0x2e, 0x00, 0x24, 0x9f, 0x8c, 0xb2, 0x47, 0x89, 0x6d, 0x39, 0x2b, 0x02, 0xd7, 0x3b, 0x7f, 0x0d, 0xd8, 0x18, 0xe1, 0xe2, 0x9b, 0x07 }, + // 207 + { 0x42, 0xd4, 0x63, 0x6e, 0x20, 0x60, 0xf0, 0x8f, 0x41, 0xc8, 0x82, 0xe7, 0x6b, 0x39, 0x6b, 0x11, 0x2e, 0xf6, 0x27, 0xcc, 0x24, 0xc4, 0x3d, 0xd5, 0xf8, 0x3a, 0x1d, 0x1a, 0x7e, 0xad, 0x71, 0x1a }, + // 208 + { 0x48, 0x58, 0xc9, 0xa1, 0x88, 0xb0, 0x23, 0x4f, 0xb9, 0xa8, 0xd4, 0x7d, 0x0b, 0x41, 0x33, 0x65, 0x0a, 0x03, 0x0b, 0xd0, 0x61, 0x1b, 0x87, 0xc3, 0x89, 0x2e, 0x94, 0x95, 0x1f, 0x8d, 0xf8, 0x52 }, + // 209 + { 0x3f, 0xab, 0x3e, 0x36, 0x98, 0x8d, 0x44, 0x5a, 0x51, 0xc8, 0x78, 0x3e, 0x53, 0x1b, 0xe3, 0xa0, 0x2b, 0xe4, 0x0c, 0xd0, 0x47, 0x96, 0xcf, 0xb6, 0x1d, 0x40, 0x34, 0x74, 0x42, 0xd3, 0xf7, 0x94 }, + // 210 + { 0xeb, 0xab, 0xc4, 0x96, 0x36, 0xbd, 0x43, 0x3d, 0x2e, 0xc8, 0xf0, 0xe5, 0x18, 0x73, 0x2e, 0xf8, 0xfa, 0x21, 0xd4, 0xd0, 0x71, 0xcc, 0x3b, 0xc4, 0x6c, 0xd7, 0x9f, 0xa3, 0x8a, 0x28, 0xb8, 0x10 }, + // 211 + { 0xa1, 0xd0, 0x34, 0x35, 0x23, 0xb8, 0x93, 0xfc, 0xa8, 0x4f, 0x47, 0xfe, 0xb4, 0xa6, 0x4d, 0x35, 0x0a, 0x17, 0xd8, 0xee, 0xf5, 0x49, 0x7e, 0xce, 0x69, 0x7d, 0x02, 0xd7, 0x91, 0x78, 0xb5, 0x91 }, + // 212 + { 0x26, 0x2e, 0xbf, 0xd9, 0x13, 0x0b, 0x7d, 0x28, 0x76, 0x0d, 0x08, 0xef, 0x8b, 0xfd, 0x3b, 0x86, 0xcd, 0xd3, 0xb2, 0x11, 0x3d, 0x2c, 0xae, 0xf7, 0xea, 0x95, 0x1a, 0x30, 0x3d, 0xfa, 0x38, 0x46 }, + // 213 + { 0xf7, 0x61, 0x58, 0xed, 0xd5, 0x0a, 0x15, 0x4f, 0xa7, 0x82, 0x03, 0xed, 0x23, 0x62, 0x93, 0x2f, 0xcb, 0x82, 0x53, 0xaa, 0xe3, 0x78, 0x90, 0x3e, 0xde, 0xd1, 0xe0, 0x3f, 0x70, 0x21, 0xa2, 0x57 }, + // 214 + { 0x26, 0x17, 0x8e, 0x95, 0x0a, 0xc7, 0x22, 0xf6, 0x7a, 0xe5, 0x6e, 0x57, 0x1b, 0x28, 0x4c, 0x02, 0x07, 0x68, 0x4a, 0x63, 0x34, 0xa1, 0x77, 0x48, 0xa9, 0x4d, 0x26, 0x0b, 0xc5, 0xf5, 0x52, 0x74 }, + // 215 + { 0xc3, 0x78, 0xd1, 0xe4, 0x93, 0xb4, 0x0e, 0xf1, 0x1f, 0xe6, 0xa1, 0x5d, 0x9c, 0x27, 0x37, 0xa3, 0x78, 0x09, 0x63, 0x4c, 0x5a, 0xba, 0xd5, 0xb3, 0x3d, 0x7e, 0x39, 0x3b, 0x4a, 0xe0, 0x5d, 0x03 }, + // 216 + { 0x98, 0x4b, 0xd8, 0x37, 0x91, 0x01, 0xbe, 0x8f, 0xd8, 0x06, 0x12, 0xd8, 0xea, 0x29, 0x59, 0xa7, 0x86, 0x5e, 0xc9, 0x71, 0x85, 0x23, 0x55, 0x01, 0x07, 0xae, 0x39, 0x38, 0xdf, 0x32, 0x01, 0x1b }, + // 217 + { 0xc6, 0xf2, 0x5a, 0x81, 0x2a, 0x14, 0x48, 0x58, 0xac, 0x5c, 0xed, 0x37, 0xa9, 0x3a, 0x9f, 0x47, 0x59, 0xba, 0x0b, 0x1c, 0x0f, 0xdc, 0x43, 0x1d, 0xce, 0x35, 0xf9, 0xec, 0x1f, 0x1f, 0x4a, 0x99 }, + // 218 + { 0x92, 0x4c, 0x75, 0xc9, 0x44, 0x24, 0xff, 0x75, 0xe7, 0x4b, 0x8b, 0x4e, 0x94, 0x35, 0x89, 0x58, 0xb0, 0x27, 0xb1, 0x71, 0xdf, 0x5e, 0x57, 0x89, 0x9a, 0xd0, 0xd4, 0xda, 0xc3, 0x73, 0x53, 0xb6 }, + // 219 + { 0x0a, 0xf3, 0x58, 0x92, 0xa6, 0x3f, 0x45, 0x93, 0x1f, 0x68, 0x46, 0xed, 0x19, 0x03, 0x61, 0xcd, 0x07, 0x30, 0x89, 0xe0, 0x77, 0x16, 0x57, 0x14, 0xb5, 0x0b, 0x81, 0xa2, 0xe3, 0xdd, 0x9b, 0xa1 }, + // 220 + { 0xcc, 0x80, 0xce, 0xfb, 0x26, 0xc3, 0xb2, 0xb0, 0xda, 0xef, 0x23, 0x3e, 0x60, 0x6d, 0x5f, 0xfc, 0x80, 0xfa, 0x17, 0x42, 0x7d, 0x18, 0xe3, 0x04, 0x89, 0x67, 0x3e, 0x06, 0xef, 0x4b, 0x87, 0xf7 }, + // 221 + { 0xc2, 0xf8, 0xc8, 0x11, 0x74, 0x47, 0xf3, 0x97, 0x8b, 0x08, 0x18, 0xdc, 0xf6, 0xf7, 0x01, 0x16, 0xac, 0x56, 0xfd, 0x18, 0x4d, 0xd1, 0x27, 0x84, 0x94, 0xe1, 0x03, 0xfc, 0x6d, 0x74, 0xa8, 0x87 }, + // 222 + { 0xbd, 0xec, 0xf6, 0xbf, 0xc1, 0xba, 0x0d, 0xf6, 0xe8, 0x62, 0xc8, 0x31, 0x99, 0x22, 0x07, 0x79, 0x6a, 0xcc, 0x79, 0x79, 0x68, 0x35, 0x88, 0x28, 0xc0, 0x6e, 0x7a, 0x51, 0xe0, 0x90, 0x09, 0x8f }, + // 223 + { 0x24, 0xd1, 0xa2, 0x6e, 0x3d, 0xab, 0x02, 0xfe, 0x45, 0x72, 0xd2, 0xaa, 0x7d, 0xbd, 0x3e, 0xc3, 0x0f, 0x06, 0x93, 0xdb, 0x26, 0xf2, 0x73, 0xd0, 0xab, 0x2c, 0xb0, 0xc1, 0x3b, 0x5e, 0x64, 0x51 }, + // 224 + { 0xec, 0x56, 0xf5, 0x8b, 0x09, 0x29, 0x9a, 0x30, 0x0b, 0x14, 0x05, 0x65, 0xd7, 0xd3, 0xe6, 0x87, 0x82, 0xb6, 0xe2, 0xfb, 0xeb, 0x4b, 0x7e, 0xa9, 0x7a, 0xc0, 0x57, 0x98, 0x90, 0x61, 0xdd, 0x3f }, + // 225 + { 0x11, 0xa4, 0x37, 0xc1, 0xab, 0xa3, 0xc1, 0x19, 0xdd, 0xfa, 0xb3, 0x1b, 0x3e, 0x8c, 0x84, 0x1d, 0xee, 0xeb, 0x91, 0x3e, 0xf5, 0x7f, 0x7e, 0x48, 0xf2, 0xc9, 0xcf, 0x5a, 0x28, 0xfa, 0x42, 0xbc }, + // 226 + { 0x53, 0xc7, 0xe6, 0x11, 0x4b, 0x85, 0x0a, 0x2c, 0xb4, 0x96, 0xc9, 0xb3, 0xc6, 0x9a, 0x62, 0x3e, 0xae, 0xa2, 0xcb, 0x1d, 0x33, 0xdd, 0x81, 0x7e, 0x47, 0x65, 0xed, 0xaa, 0x68, 0x23, 0xc2, 0x28 }, + // 227 + { 0x15, 0x4c, 0x3e, 0x96, 0xfe, 0xe5, 0xdb, 0x14, 0xf8, 0x77, 0x3e, 0x18, 0xaf, 0x14, 0x85, 0x79, 0x13, 0x50, 0x9d, 0xa9, 0x99, 0xb4, 0x6c, 0xdd, 0x3d, 0x4c, 0x16, 0x97, 0x60, 0xc8, 0x3a, 0xd2 }, + // 228 + { 0x40, 0xb9, 0x91, 0x6f, 0x09, 0x3e, 0x02, 0x7a, 0x87, 0x86, 0x64, 0x18, 0x18, 0x92, 0x06, 0x20, 0x47, 0x2f, 0xbc, 0xf6, 0x8f, 0x70, 0x1d, 0x1b, 0x68, 0x06, 0x32, 0xe6, 0x99, 0x6b, 0xde, 0xd3 }, + // 229 + { 0x24, 0xc4, 0xcb, 0xba, 0x07, 0x11, 0x98, 0x31, 0xa7, 0x26, 0xb0, 0x53, 0x05, 0xd9, 0x6d, 0xa0, 0x2f, 0xf8, 0xb1, 0x48, 0xf0, 0xda, 0x44, 0x0f, 0xe2, 0x33, 0xbc, 0xaa, 0x32, 0xc7, 0x2f, 0x6f }, + // 230 + { 0x5d, 0x20, 0x15, 0x10, 0x25, 0x00, 0x20, 0xb7, 0x83, 0x68, 0x96, 0x88, 0xab, 0xbf, 0x8e, 0xcf, 0x25, 0x94, 0xa9, 0x6a, 0x08, 0xf2, 0xbf, 0xec, 0x6c, 0xe0, 0x57, 0x44, 0x65, 0xdd, 0xed, 0x71 }, + // 231 + { 0x04, 0x3b, 0x97, 0xe3, 0x36, 0xee, 0x6f, 0xdb, 0xbe, 0x2b, 0x50, 0xf2, 0x2a, 0xf8, 0x32, 0x75, 0xa4, 0x08, 0x48, 0x05, 0xd2, 0xd5, 0x64, 0x59, 0x62, 0x45, 0x4b, 0x6c, 0x9b, 0x80, 0x53, 0xa0 }, + // 232 + { 0x56, 0x48, 0x35, 0xcb, 0xae, 0xa7, 0x74, 0x94, 0x85, 0x68, 0xbe, 0x36, 0xcf, 0x52, 0xfc, 0xdd, 0x83, 0x93, 0x4e, 0xb0, 0xa2, 0x75, 0x12, 0xdb, 0xe3, 0xe2, 0xdb, 0x47, 0xb9, 0xe6, 0x63, 0x5a }, + // 233 + { 0xf2, 0x1c, 0x33, 0xf4, 0x7b, 0xde, 0x40, 0xa2, 0xa1, 0x01, 0xc9, 0xcd, 0xe8, 0x02, 0x7a, 0xaf, 0x61, 0xa3, 0x13, 0x7d, 0xe2, 0x42, 0x2b, 0x30, 0x03, 0x5a, 0x04, 0xc2, 0x70, 0x89, 0x41, 0x83 }, + // 234 + { 0x9d, 0xb0, 0xef, 0x74, 0xe6, 0x6c, 0xbb, 0x84, 0x2e, 0xb0, 0xe0, 0x73, 0x43, 0xa0, 0x3c, 0x5c, 0x56, 0x7e, 0x37, 0x2b, 0x3f, 0x23, 0xb9, 0x43, 0xc7, 0x88, 0xa4, 0xf2, 0x50, 0xf6, 0x78, 0x91 }, + // 235 + { 0xab, 0x8d, 0x08, 0x65, 0x5f, 0xf1, 0xd3, 0xfe, 0x87, 0x58, 0xd5, 0x62, 0x23, 0x5f, 0xd2, 0x3e, 0x7c, 0xf9, 0xdc, 0xaa, 0xd6, 0x58, 0x87, 0x2a, 0x49, 0xe5, 0xd3, 0x18, 0x3b, 0x6c, 0xce, 0xbd }, + // 236 + { 0x6f, 0x27, 0xf7, 0x7e, 0x7b, 0xcf, 0x46, 0xa1, 0xe9, 0x63, 0xad, 0xe0, 0x30, 0x97, 0x33, 0x54, 0x30, 0x31, 0xdc, 0xcd, 0xd4, 0x7c, 0xaa, 0xc1, 0x74, 0xd7, 0xd2, 0x7c, 0xe8, 0x07, 0x7e, 0x8b }, + // 237 + { 0xe3, 0xcd, 0x54, 0xda, 0x7e, 0x44, 0x4c, 0xaa, 0x62, 0x07, 0x56, 0x95, 0x25, 0xa6, 0x70, 0xeb, 0xae, 0x12, 0x78, 0xde, 0x4e, 0x3f, 0xe2, 0x68, 0x4b, 0x3e, 0x33, 0xf5, 0xef, 0x90, 0xcc, 0x1b }, + // 238 + { 0xb2, 0xc3, 0xe3, 0x3a, 0x51, 0xd2, 0x2c, 0x4c, 0x08, 0xfc, 0x09, 0x89, 0xc8, 0x73, 0xc9, 0xcc, 0x41, 0x50, 0x57, 0x9b, 0x1e, 0x61, 0x63, 0xfa, 0x69, 0x4a, 0xd5, 0x1d, 0x53, 0xd7, 0x12, 0xdc }, + // 239 + { 0xbe, 0x7f, 0xda, 0x98, 0x3e, 0x13, 0x18, 0x9b, 0x4c, 0x77, 0xe0, 0xa8, 0x09, 0x20, 0xb6, 0xe0, 0xe0, 0xea, 0x80, 0xc3, 0xb8, 0x4d, 0xbe, 0x7e, 0x71, 0x17, 0xd2, 0x53, 0xf4, 0x81, 0x12, 0xf4 }, + // 240 + { 0xb6, 0x00, 0x8c, 0x28, 0xfa, 0xe0, 0x8a, 0xa4, 0x27, 0xe5, 0xbd, 0x3a, 0xad, 0x36, 0xf1, 0x00, 0x21, 0xf1, 0x6c, 0x77, 0xcf, 0xea, 0xbe, 0xd0, 0x7f, 0x97, 0xcc, 0x7d, 0xc1, 0xf1, 0x28, 0x4a }, + // 241 + { 0x6e, 0x4e, 0x67, 0x60, 0xc5, 0x38, 0xf2, 0xe9, 0x7b, 0x3a, 0xdb, 0xfb, 0xbc, 0xde, 0x57, 0xf8, 0x96, 0x6b, 0x7e, 0xa8, 0xfc, 0xb5, 0xbf, 0x7e, 0xfe, 0xc9, 0x13, 0xfd, 0x2a, 0x2b, 0x0c, 0x55 }, + // 242 + { 0x4a, 0xe5, 0x1f, 0xd1, 0x83, 0x4a, 0xa5, 0xbd, 0x9a, 0x6f, 0x7e, 0xc3, 0x9f, 0xc6, 0x63, 0x33, 0x8d, 0xc5, 0xd2, 0xe2, 0x07, 0x61, 0x56, 0x6d, 0x90, 0xcc, 0x68, 0xb1, 0xcb, 0x87, 0x5e, 0xd8 }, + // 243 + { 0xb6, 0x73, 0xaa, 0xd7, 0x5a, 0xb1, 0xfd, 0xb5, 0x40, 0x1a, 0xbf, 0xa1, 0xbf, 0x89, 0xf3, 0xad, 0xd2, 0xeb, 0xc4, 0x68, 0xdf, 0x36, 0x24, 0xa4, 0x78, 0xf4, 0xfe, 0x85, 0x9d, 0x8d, 0x55, 0xe2 }, + // 244 + { 0x13, 0xc9, 0x47, 0x1a, 0x98, 0x55, 0x91, 0x35, 0x39, 0x83, 0x66, 0x60, 0x39, 0x8d, 0xa0, 0xf3, 0xf9, 0x9a, 0xda, 0x08, 0x47, 0x9c, 0x69, 0xd1, 0xb7, 0xfc, 0xaa, 0x34, 0x61, 0xdd, 0x7e, 0x59 }, + // 245 + { 0x2c, 0x11, 0xf4, 0xa7, 0xf9, 0x9a, 0x1d, 0x23, 0xa5, 0x8b, 0xb6, 0x36, 0x35, 0x0f, 0xe8, 0x49, 0xf2, 0x9c, 0xba, 0xc1, 0xb2, 0xa1, 0x11, 0x2d, 0x9f, 0x1e, 0xd5, 0xbc, 0x5b, 0x31, 0x3c, 0xcd }, + // 246 + { 0xc7, 0xd3, 0xc0, 0x70, 0x6b, 0x11, 0xae, 0x74, 0x1c, 0x05, 0xa1, 0xef, 0x15, 0x0d, 0xd6, 0x5b, 0x54, 0x94, 0xd6, 0xd5, 0x4c, 0x9a, 0x86, 0xe2, 0x61, 0x78, 0x54, 0xe6, 0xae, 0xee, 0xbb, 0xd9 }, + // 247 + { 0x19, 0x4e, 0x10, 0xc9, 0x38, 0x93, 0xaf, 0xa0, 0x64, 0xc3, 0xac, 0x04, 0xc0, 0xdd, 0x80, 0x8d, 0x79, 0x1c, 0x3d, 0x4b, 0x75, 0x56, 0xe8, 0x9d, 0x8d, 0x9c, 0xb2, 0x25, 0xc4, 0xb3, 0x33, 0x39 }, + // 248 + { 0x6f, 0xc4, 0x98, 0x8b, 0x8f, 0x78, 0x54, 0x6b, 0x16, 0x88, 0x99, 0x18, 0x45, 0x90, 0x8f, 0x13, 0x4b, 0x6a, 0x48, 0x2e, 0x69, 0x94, 0xb3, 0xd4, 0x83, 0x17, 0xbf, 0x08, 0xdb, 0x29, 0x21, 0x85 }, + // 249 + { 0x56, 0x65, 0xbe, 0xb8, 0xb0, 0x95, 0x55, 0x25, 0x81, 0x3b, 0x59, 0x81, 0xcd, 0x14, 0x2e, 0xd4, 0xd0, 0x3f, 0xba, 0x38, 0xa6, 0xf3, 0xe5, 0xad, 0x26, 0x8e, 0x0c, 0xc2, 0x70, 0xd1, 0xcd, 0x11 }, + // 250 + { 0xb8, 0x83, 0xd6, 0x8f, 0x5f, 0xe5, 0x19, 0x36, 0x43, 0x1b, 0xa4, 0x25, 0x67, 0x38, 0x05, 0x3b, 0x1d, 0x04, 0x26, 0xd4, 0xcb, 0x64, 0xb1, 0x6e, 0x83, 0xba, 0xdc, 0x5e, 0x9f, 0xbe, 0x3b, 0x81 }, + // 251 + { 0x53, 0xe7, 0xb2, 0x7e, 0xa5, 0x9c, 0x2f, 0x6d, 0xbb, 0x50, 0x76, 0x9e, 0x43, 0x55, 0x4d, 0xf3, 0x5a, 0xf8, 0x9f, 0x48, 0x22, 0xd0, 0x46, 0x6b, 0x00, 0x7d, 0xd6, 0xf6, 0xde, 0xaf, 0xff, 0x02 }, + // 252 + { 0x1f, 0x1a, 0x02, 0x29, 0xd4, 0x64, 0x0f, 0x01, 0x90, 0x15, 0x88, 0xd9, 0xde, 0xc2, 0x2d, 0x13, 0xfc, 0x3e, 0xb3, 0x4a, 0x61, 0xb3, 0x29, 0x38, 0xef, 0xbf, 0x53, 0x34, 0xb2, 0x80, 0x0a, 0xfa }, + // 253 + { 0xc2, 0xb4, 0x05, 0xaf, 0xa0, 0xfa, 0x66, 0x68, 0x85, 0x2a, 0xee, 0x4d, 0x88, 0x04, 0x08, 0x53, 0xfa, 0xb8, 0x00, 0xe7, 0x2b, 0x57, 0x58, 0x14, 0x18, 0xe5, 0x50, 0x6f, 0x21, 0x4c, 0x7d, 0x1f }, + // 254 + { 0xc0, 0x8a, 0xa1, 0xc2, 0x86, 0xd7, 0x09, 0xfd, 0xc7, 0x47, 0x37, 0x44, 0x97, 0x71, 0x88, 0xc8, 0x95, 0xba, 0x01, 0x10, 0x14, 0x24, 0x7e, 0x4e, 0xfa, 0x8d, 0x07, 0xe7, 0x8f, 0xec, 0x69, 0x5c }, + // 255 + { 0xf0, 0x3f, 0x57, 0x89, 0xd3, 0x33, 0x6b, 0x80, 0xd0, 0x02, 0xd5, 0x9f, 0xdf, 0x91, 0x8b, 0xdb, 0x77, 0x5b, 0x00, 0x95, 0x6e, 0xd5, 0x52, 0x8e, 0x86, 0xaa, 0x99, 0x4a, 0xcb, 0x38, 0xfe, 0x2d }, +}; +static const uint8_t secret_KATs[256][32] = { + // 0 + { 0xc2, 0x46, 0x11, 0x1b, 0x7f, 0xd2, 0xad, 0x01, 0x78, 0xfa, 0x71, 0xa3, 0x2d, 0xd6, 0xc3, 0x85, 0x3f, 0x0b, 0xb5, 0x27, 0xbb, 0x7e, 0x7f, 0x43, 0x11, 0x31, 0xe5, 0xea, 0xd8, 0x44, 0x98, 0x09 }, + // 1 + { 0xea, 0x7d, 0x63, 0x3f, 0xd6, 0x97, 0x31, 0xbd, 0x1c, 0xff, 0x95, 0x42, 0xe9, 0x11, 0xdf, 0x43, 0xa2, 0x2a, 0x32, 0x8c, 0x59, 0x25, 0x73, 0x23, 0xd0, 0x62, 0x9a, 0xa2, 0xb7, 0x25, 0x61, 0x85 }, + // 2 + { 0x2b, 0x12, 0x3b, 0x56, 0x40, 0x76, 0xc9, 0xbd, 0xfe, 0xd5, 0x16, 0x21, 0x38, 0xe3, 0xd5, 0xfa, 0x9e, 0x7b, 0x79, 0xc6, 0xd2, 0xfc, 0x1c, 0xf0, 0x14, 0x31, 0x1e, 0xbb, 0xd3, 0x8d, 0x32, 0x32 }, + // 3 + { 0x0d, 0x93, 0xb5, 0xb5, 0x26, 0xc7, 0x2b, 0xd9, 0x8e, 0xc1, 0x20, 0xe9, 0xd8, 0x50, 0x18, 0x00, 0x86, 0x7a, 0x60, 0x98, 0x5a, 0x91, 0xeb, 0x53, 0x92, 0x02, 0x5b, 0x3e, 0x57, 0xe4, 0x30, 0x8b }, + // 4 + { 0x24, 0x6c, 0x1e, 0x43, 0x3f, 0xfc, 0x88, 0x36, 0x05, 0x6d, 0x86, 0xa5, 0xef, 0xa4, 0x83, 0x10, 0x7a, 0x5f, 0xb7, 0x6b, 0x15, 0xcd, 0xdd, 0x41, 0x75, 0x49, 0x8e, 0xb5, 0x52, 0x8f, 0x09, 0x7a }, + // 5 + { 0x9a, 0x3d, 0xbe, 0xcc, 0x68, 0x23, 0x3c, 0x75, 0x33, 0x7f, 0x13, 0xe7, 0xce, 0x2a, 0x67, 0x61, 0x8d, 0xcd, 0x9e, 0x12, 0xf6, 0x17, 0xaa, 0xb1, 0xae, 0x0d, 0xaa, 0xac, 0xa7, 0xdf, 0x16, 0xaa }, + // 6 + { 0xd9, 0x97, 0xf9, 0x97, 0x8a, 0x46, 0x52, 0x67, 0xc5, 0xef, 0x9f, 0xad, 0x38, 0x62, 0xca, 0x5a, 0x40, 0x59, 0xa6, 0xd7, 0xf1, 0x41, 0x92, 0x34, 0xa8, 0xf3, 0xd2, 0x2b, 0xa2, 0xaa, 0x96, 0x79 }, + // 7 + { 0x1d, 0xcc, 0xda, 0x90, 0x6c, 0xa9, 0x1e, 0xcd, 0xbb, 0x17, 0x55, 0x70, 0xd9, 0xcb, 0xe3, 0x4c, 0x32, 0xd5, 0x68, 0xb0, 0x98, 0x23, 0x25, 0xb9, 0x54, 0xa0, 0x2a, 0x77, 0x37, 0x13, 0xd6, 0x9a }, + // 8 + { 0x92, 0x33, 0x0f, 0x59, 0x33, 0x77, 0xd1, 0x7a, 0x93, 0x4f, 0x14, 0x7e, 0x7e, 0x7d, 0xff, 0x42, 0xf4, 0x23, 0xf7, 0x6c, 0xc3, 0x3c, 0xd0, 0xb6, 0x93, 0xe6, 0xa7, 0x8d, 0xea, 0x25, 0xb3, 0x67 }, + // 9 + { 0xa3, 0xc6, 0xe0, 0x9c, 0x34, 0xd7, 0x15, 0x50, 0x22, 0xd9, 0xd8, 0xc7, 0xe8, 0x83, 0x81, 0x08, 0xf5, 0xd8, 0xf8, 0xc9, 0x48, 0xc3, 0xa3, 0x91, 0xe9, 0x75, 0x3f, 0x17, 0xf8, 0x37, 0x32, 0x0a }, + // 10 + { 0x35, 0x50, 0xd0, 0xbe, 0x66, 0xa1, 0x17, 0x48, 0x7a, 0x6b, 0x09, 0x2e, 0x85, 0x29, 0xce, 0x85, 0x4c, 0x03, 0x83, 0xc5, 0xfb, 0xc5, 0xcc, 0x8f, 0x25, 0x9b, 0xc7, 0x35, 0x24, 0xde, 0x8e, 0x95 }, + // 11 + { 0x39, 0xe9, 0xfc, 0x92, 0x42, 0x33, 0x42, 0xa4, 0xf9, 0xbf, 0x07, 0xbb, 0x19, 0x4c, 0x5f, 0x82, 0x60, 0x6c, 0xe0, 0x54, 0x05, 0x2e, 0xf9, 0xff, 0xc2, 0x66, 0xe1, 0x7e, 0xf2, 0xbd, 0x7f, 0x7f }, + // 12 + { 0x13, 0xc0, 0xc0, 0x24, 0xf3, 0x58, 0x81, 0xc8, 0x38, 0xa3, 0x30, 0x4f, 0x9d, 0x5c, 0x84, 0xce, 0x29, 0x95, 0xfa, 0xe3, 0x78, 0x86, 0x47, 0x33, 0xd1, 0x2e, 0x36, 0x95, 0x9f, 0xa4, 0x19, 0xcd }, + // 13 + { 0xc0, 0xf4, 0x98, 0x5d, 0xd9, 0x82, 0xae, 0xde, 0xb4, 0xcb, 0x4e, 0x1c, 0x8e, 0x21, 0x6d, 0x30, 0xd2, 0x46, 0xdf, 0x5d, 0xd3, 0x46, 0xe3, 0xb9, 0xbe, 0xaa, 0x39, 0x99, 0xd9, 0x1c, 0xa9, 0xaf }, + // 14 + { 0xc7, 0x42, 0x6a, 0x25, 0x9f, 0xf5, 0x0c, 0x43, 0xba, 0x85, 0xe8, 0x49, 0x1d, 0x99, 0x7c, 0xc2, 0xbf, 0x69, 0x79, 0xe9, 0x45, 0xd5, 0x6d, 0xcb, 0xf8, 0x5f, 0x57, 0xfe, 0x23, 0x48, 0x97, 0x9e }, + // 15 + { 0xa0, 0x23, 0x5d, 0x3c, 0xc3, 0x69, 0x6f, 0x61, 0xc0, 0xf0, 0xea, 0xe1, 0xe9, 0x74, 0x05, 0xcb, 0xd8, 0x41, 0x01, 0x31, 0xe7, 0x35, 0xac, 0xf4, 0x8f, 0xf2, 0x40, 0x3b, 0x16, 0xa5, 0x37, 0xaa }, + // 16 + { 0xb4, 0xfc, 0xec, 0x34, 0x89, 0x1f, 0x0a, 0xd4, 0xf2, 0xce, 0x4d, 0xd3, 0xc2, 0x5e, 0x09, 0x1f, 0xe9, 0x80, 0xd0, 0xfc, 0xb1, 0x00, 0xcd, 0xdf, 0xc8, 0x63, 0x4c, 0xa1, 0x6f, 0x9b, 0x15, 0x5f }, + // 17 + { 0x7d, 0xb4, 0xe5, 0xfa, 0x52, 0xa6, 0xd9, 0x19, 0xa8, 0xd5, 0x18, 0x0e, 0xfb, 0xea, 0xe4, 0x9c, 0xf4, 0xd7, 0xbb, 0xad, 0xd3, 0x79, 0xa7, 0x0d, 0x26, 0xc9, 0x4f, 0xc9, 0xff, 0xc6, 0xd2, 0xd3 }, + // 18 + { 0xa6, 0x09, 0xee, 0x20, 0xcb, 0xda, 0xe8, 0x5d, 0xc3, 0x7c, 0x14, 0xca, 0x68, 0x15, 0x88, 0x8e, 0x97, 0xe6, 0x91, 0xb5, 0x5b, 0x2f, 0xe9, 0x5f, 0x61, 0x4d, 0x89, 0x24, 0x75, 0x94, 0xb6, 0xb9 }, + // 19 + { 0x56, 0x5e, 0xeb, 0xd2, 0xda, 0x80, 0x11, 0x43, 0x6d, 0xfd, 0xf3, 0xa4, 0x92, 0xa7, 0x76, 0xdf, 0x67, 0xef, 0x6f, 0x4c, 0xf5, 0xfa, 0x0c, 0xf4, 0x63, 0xee, 0x2e, 0x56, 0x4d, 0x71, 0x41, 0xa4 }, + // 20 + { 0x5f, 0x28, 0x99, 0x4b, 0xb2, 0x30, 0x63, 0xe6, 0x48, 0x1b, 0xf4, 0x09, 0x64, 0x77, 0x6a, 0x03, 0x0d, 0x74, 0xe8, 0xc9, 0xb0, 0x91, 0xc3, 0xd9, 0x3a, 0x06, 0xd3, 0x74, 0x00, 0x95, 0x79, 0x86 }, + // 21 + { 0xc9, 0x94, 0x5f, 0x3f, 0x70, 0xee, 0x67, 0x5f, 0x1c, 0x9a, 0xc6, 0x93, 0x7e, 0x21, 0x0a, 0x50, 0x30, 0xaa, 0x56, 0x76, 0xdd, 0x72, 0x12, 0xe9, 0x57, 0x02, 0x19, 0x01, 0x8a, 0x85, 0xd5, 0x67 }, + // 22 + { 0xca, 0xd4, 0xa9, 0x7f, 0xff, 0xcb, 0x34, 0x4d, 0xfa, 0x85, 0x95, 0x23, 0x0e, 0x12, 0xc2, 0x04, 0x66, 0x63, 0x38, 0x7b, 0xa9, 0x83, 0xd5, 0x60, 0x52, 0x16, 0xe7, 0xf4, 0xff, 0xc6, 0xe9, 0xeb }, + // 23 + { 0xb1, 0xa4, 0x50, 0xec, 0xee, 0xe0, 0x71, 0x04, 0xd8, 0x2b, 0x16, 0x29, 0x6a, 0xf5, 0xa3, 0x99, 0x8f, 0xd7, 0x33, 0x76, 0x8e, 0x63, 0xa6, 0x80, 0x69, 0x60, 0xa1, 0x8c, 0x6c, 0x52, 0x81, 0xc1 }, + // 24 + { 0x06, 0x17, 0xc8, 0x44, 0xcd, 0x2c, 0xa8, 0xe7, 0x5d, 0xfb, 0xcc, 0x79, 0x26, 0x52, 0xfc, 0x73, 0x4e, 0x7e, 0x9c, 0x5e, 0x3d, 0x45, 0x65, 0xea, 0x2d, 0xe9, 0x83, 0xcb, 0x15, 0xe5, 0x95, 0x73 }, + // 25 + { 0xac, 0xef, 0x33, 0xd2, 0x25, 0x0e, 0xfc, 0x67, 0x28, 0x29, 0x7a, 0xda, 0xba, 0xa1, 0x1f, 0xc1, 0xb8, 0xab, 0x16, 0x4c, 0x3a, 0xa6, 0xa7, 0x9b, 0xd4, 0xe5, 0x3a, 0x1a, 0x0a, 0x89, 0x2a, 0xb9 }, + // 26 + { 0x16, 0x20, 0x23, 0x53, 0xf1, 0xc9, 0x17, 0xac, 0x67, 0x69, 0x73, 0xdc, 0x20, 0x55, 0x1d, 0xe2, 0x80, 0x9f, 0x4e, 0x63, 0xe3, 0x2a, 0x98, 0xf9, 0xe5, 0xa7, 0x90, 0xde, 0x79, 0x64, 0x9c, 0xef }, + // 27 + { 0x96, 0xab, 0xbc, 0x8b, 0x77, 0xfa, 0x09, 0x07, 0x69, 0xcc, 0x11, 0x75, 0x86, 0xd9, 0x9e, 0xdc, 0x6d, 0xeb, 0xc1, 0x12, 0x21, 0x73, 0x4d, 0x61, 0xfe, 0x87, 0xdc, 0xf2, 0x30, 0xf3, 0x93, 0xef }, + // 28 + { 0xc6, 0x18, 0x1d, 0xe0, 0x78, 0x94, 0xa3, 0xba, 0x37, 0x19, 0x1f, 0x7d, 0xd9, 0xb3, 0x17, 0xf7, 0xc0, 0xbe, 0x5b, 0xb3, 0x95, 0xab, 0x34, 0xb8, 0xb1, 0x53, 0xfa, 0xd8, 0x08, 0xc6, 0x8b, 0x3f }, + // 29 + { 0x9a, 0xfa, 0x47, 0x90, 0xd6, 0x75, 0x6f, 0x5a, 0x48, 0xa0, 0xd5, 0x7f, 0x20, 0x1a, 0x18, 0x44, 0xd6, 0x8b, 0x31, 0xa6, 0x44, 0xa2, 0x5b, 0x9f, 0x18, 0x53, 0xea, 0xa9, 0xd8, 0xb3, 0xcb, 0x73 }, + // 30 + { 0x78, 0x3f, 0x50, 0x46, 0x64, 0x8c, 0x0f, 0x5b, 0x8b, 0xc1, 0xfe, 0x09, 0xa8, 0xa0, 0x11, 0x71, 0xd4, 0xad, 0x60, 0x40, 0x69, 0x70, 0xf0, 0xd8, 0xbd, 0x29, 0x7d, 0x36, 0x0c, 0xfb, 0xe7, 0x40 }, + // 31 + { 0x32, 0x5a, 0x19, 0x6e, 0xc9, 0x08, 0xa9, 0x4b, 0x54, 0x10, 0x52, 0x3c, 0x03, 0x0d, 0xf7, 0xb2, 0xed, 0x5b, 0x69, 0x3d, 0xb3, 0x8f, 0x32, 0x6c, 0x82, 0xd7, 0x00, 0x01, 0xeb, 0x14, 0xd0, 0x41 }, + // 32 + { 0x64, 0xdb, 0x7e, 0xf8, 0x98, 0x4a, 0xf4, 0x77, 0x0e, 0xaf, 0xc2, 0x01, 0xfc, 0x7b, 0xc6, 0x11, 0x06, 0xe5, 0x09, 0xc7, 0xd8, 0xc7, 0x64, 0x8b, 0x13, 0x76, 0x1a, 0x15, 0xd9, 0x73, 0x07, 0xc7 }, + // 33 + { 0xbc, 0x20, 0x71, 0x1f, 0x33, 0x8c, 0x9a, 0xb8, 0x0d, 0x3e, 0x80, 0x36, 0x6b, 0x1b, 0x96, 0xf0, 0xd2, 0x72, 0x27, 0x03, 0xc3, 0x47, 0xe1, 0xbc, 0x6a, 0x0a, 0xeb, 0xc3, 0x5b, 0x5d, 0xda, 0x05 }, + // 34 + { 0x4a, 0xc6, 0xf4, 0x2f, 0xf0, 0x92, 0xfd, 0x36, 0xa9, 0x23, 0x95, 0xa4, 0xf8, 0x8a, 0xd0, 0xb2, 0xcd, 0xd6, 0x0c, 0x94, 0x9d, 0x15, 0x27, 0xa3, 0x12, 0x28, 0xc2, 0x06, 0x85, 0xdb, 0x71, 0x70 }, + // 35 + { 0x3d, 0x7e, 0x4a, 0xc9, 0x98, 0x0d, 0x55, 0x6e, 0x31, 0x18, 0x78, 0x0e, 0xc9, 0xcc, 0x69, 0x96, 0xa1, 0xc4, 0xbd, 0x84, 0x43, 0x8b, 0xea, 0x42, 0x2b, 0x05, 0x1e, 0x8f, 0xda, 0xd3, 0x13, 0xc4 }, + // 36 + { 0x36, 0x87, 0x8f, 0xd5, 0x4d, 0x00, 0x43, 0x24, 0x1a, 0xfc, 0xa0, 0x88, 0x85, 0xe5, 0xf0, 0x89, 0x23, 0x92, 0xed, 0x26, 0xaf, 0xf1, 0xe9, 0x90, 0x13, 0x25, 0x75, 0xc0, 0x54, 0x3b, 0x2b, 0x5d }, + // 37 + { 0xb2, 0x53, 0xa4, 0x7f, 0x48, 0x01, 0xdd, 0x13, 0xd8, 0x09, 0xd0, 0xd4, 0x40, 0x34, 0xf0, 0x02, 0xac, 0xd1, 0x5a, 0x51, 0x97, 0xe7, 0x0c, 0x38, 0xc0, 0x51, 0xe6, 0xc3, 0xbb, 0xd7, 0xab, 0xa5 }, + // 38 + { 0x62, 0x29, 0x7a, 0x40, 0x4a, 0x20, 0x15, 0x80, 0x6f, 0xa5, 0x2e, 0xd4, 0x16, 0xe9, 0x5a, 0x50, 0xbf, 0x78, 0x2e, 0x39, 0x09, 0x5c, 0x2e, 0x0d, 0x6c, 0x1c, 0xb9, 0x28, 0x23, 0xdb, 0xf9, 0x0c }, + // 39 + { 0xfb, 0x2e, 0x9d, 0x06, 0xf2, 0xe7, 0x04, 0x4f, 0xf8, 0xd4, 0x6e, 0x78, 0xe2, 0xdc, 0x86, 0xee, 0x38, 0xc0, 0xd5, 0x51, 0x48, 0x03, 0xbb, 0x00, 0xfe, 0x9c, 0xc0, 0x82, 0x55, 0xcf, 0x90, 0x8f }, + // 40 + { 0x78, 0xab, 0x0d, 0x99, 0x08, 0x57, 0xec, 0xad, 0x91, 0xb9, 0x34, 0x5f, 0xe3, 0x1a, 0x74, 0x3b, 0x16, 0x26, 0x3f, 0xab, 0x7f, 0x16, 0x83, 0xfb, 0xbc, 0xae, 0x7a, 0x03, 0xc6, 0x46, 0xd3, 0x83 }, + // 41 + { 0x18, 0xfd, 0x18, 0xa5, 0xf4, 0xda, 0x12, 0xb5, 0x01, 0x6c, 0xed, 0xd2, 0x81, 0x66, 0xf9, 0x58, 0x16, 0x64, 0x02, 0x83, 0xdc, 0xa0, 0x08, 0x6e, 0x86, 0x61, 0x31, 0x2e, 0x18, 0xd4, 0xed, 0xa2 }, + // 42 + { 0xa4, 0xa2, 0x49, 0x3b, 0x02, 0x9e, 0x2f, 0x07, 0x2b, 0xa5, 0xc1, 0x2e, 0xf3, 0x1a, 0x30, 0xe1, 0xbd, 0xb3, 0x83, 0x5b, 0xf1, 0x98, 0x3f, 0xd9, 0x5d, 0x80, 0x5c, 0xa3, 0xd0, 0xf1, 0x5b, 0x54 }, + // 43 + { 0x5e, 0x31, 0x5c, 0x0d, 0x8a, 0x87, 0x55, 0x76, 0xfb, 0xe7, 0x6a, 0x9d, 0xf1, 0x5a, 0x54, 0x0b, 0xde, 0x24, 0x08, 0x9b, 0x41, 0x87, 0x58, 0xfd, 0x5a, 0x15, 0xb8, 0x3f, 0x3d, 0x87, 0x7d, 0xa9 }, + // 44 + { 0x07, 0xc8, 0x70, 0x54, 0xcb, 0x5c, 0x60, 0x13, 0x41, 0x3f, 0xe7, 0x2d, 0xfc, 0x96, 0xfc, 0x54, 0x6b, 0x2a, 0x8f, 0xba, 0x01, 0x85, 0x55, 0x6d, 0x56, 0xd6, 0xad, 0xb4, 0x14, 0x35, 0x19, 0x76 }, + // 45 + { 0x32, 0x0e, 0xcc, 0x42, 0x8f, 0xc7, 0xb3, 0xb5, 0x6c, 0x1f, 0x9f, 0x7b, 0xb2, 0x7a, 0x15, 0x0c, 0xd4, 0x04, 0x64, 0xd4, 0x3f, 0x77, 0x49, 0x06, 0x2c, 0x7e, 0xcc, 0x29, 0x2e, 0xaf, 0x5c, 0x3d }, + // 46 + { 0xcb, 0xed, 0xbd, 0xd2, 0x04, 0xb7, 0x9e, 0x23, 0x36, 0x88, 0xaf, 0x8f, 0x7e, 0xa8, 0x64, 0xd2, 0x31, 0x0a, 0x6c, 0x25, 0xcc, 0x07, 0xb9, 0x6d, 0xb3, 0x21, 0xc3, 0x24, 0xa7, 0x89, 0x78, 0x20 }, + // 47 + { 0x34, 0x33, 0x98, 0x96, 0x32, 0x42, 0x65, 0xf4, 0xfc, 0xf0, 0x5a, 0x4f, 0x46, 0xb8, 0x3f, 0x81, 0xb6, 0x81, 0xcd, 0xa2, 0xf4, 0xbc, 0x3e, 0xf7, 0x90, 0xcc, 0x00, 0x7e, 0x39, 0x3a, 0x05, 0xce }, + // 48 + { 0x8d, 0x8f, 0xaa, 0x4d, 0xd2, 0xe3, 0x83, 0x1f, 0x1d, 0x86, 0x58, 0xe7, 0xc9, 0x77, 0x2e, 0x61, 0x44, 0x3c, 0x0d, 0xde, 0x83, 0x34, 0xae, 0xba, 0xab, 0x1d, 0xd7, 0x44, 0xe5, 0xbb, 0xe1, 0x97 }, + // 49 + { 0xe3, 0x93, 0xa9, 0xd5, 0xbf, 0xd1, 0x7f, 0x71, 0x0a, 0x08, 0x5b, 0x66, 0x5f, 0x39, 0x0c, 0x75, 0xd2, 0xc5, 0x3c, 0xe6, 0xa8, 0xbe, 0xfa, 0x75, 0x82, 0xf0, 0xbd, 0xbc, 0x33, 0x9f, 0x4e, 0x19 }, + // 50 + { 0x3c, 0xb1, 0xaf, 0xca, 0x1b, 0x82, 0xe9, 0xe0, 0x38, 0x3a, 0x55, 0x2b, 0x18, 0x2f, 0xdf, 0x73, 0x27, 0xa1, 0xf8, 0x1b, 0x11, 0x57, 0x20, 0x85, 0xb5, 0x22, 0x09, 0x75, 0x67, 0x9a, 0x60, 0xb3 }, + // 51 + { 0xa6, 0xae, 0x0f, 0x6b, 0x88, 0xc9, 0x6d, 0x39, 0xce, 0x38, 0x46, 0xfa, 0x49, 0xb1, 0xfb, 0x86, 0xb5, 0x81, 0xba, 0xae, 0x82, 0xfa, 0x5f, 0x07, 0x69, 0xd0, 0x6a, 0x9c, 0x87, 0x40, 0xc7, 0x14 }, + // 52 + { 0xd7, 0x50, 0xa2, 0x22, 0x98, 0xd7, 0x4e, 0xdf, 0xe7, 0xb9, 0x79, 0x93, 0x19, 0x4d, 0x77, 0xc2, 0x7c, 0x9c, 0x08, 0xb3, 0xb4, 0x72, 0xef, 0xec, 0xa4, 0xf8, 0xa9, 0xa4, 0xad, 0xf9, 0xce, 0xe5 }, + // 53 + { 0x9b, 0xc8, 0xdb, 0x4a, 0x2a, 0x43, 0x22, 0xfe, 0x50, 0x52, 0xf5, 0x07, 0x55, 0xd2, 0xce, 0x18, 0x30, 0xef, 0xbd, 0x9a, 0xdc, 0xba, 0x37, 0xe2, 0x68, 0x0a, 0x37, 0x4e, 0x7f, 0xf2, 0xfb, 0x4e }, + // 54 + { 0x68, 0x88, 0x0c, 0x43, 0x40, 0xea, 0x93, 0xbd, 0x3e, 0x7d, 0x67, 0x33, 0x9d, 0x61, 0xfe, 0xa4, 0x82, 0x0d, 0x9a, 0x46, 0xa9, 0x4e, 0xc0, 0x40, 0x65, 0x48, 0x91, 0xa0, 0x98, 0x17, 0x1b, 0x95 }, + // 55 + { 0x8a, 0xaf, 0x20, 0xa8, 0x6a, 0x94, 0xda, 0xc0, 0x54, 0x74, 0x1f, 0x68, 0x1f, 0x60, 0xee, 0x47, 0xe3, 0xda, 0x8f, 0x67, 0x23, 0xea, 0x07, 0x4f, 0x51, 0x59, 0x46, 0xa6, 0x89, 0x31, 0x4d, 0x4d }, + // 56 + { 0x7b, 0xe0, 0xd2, 0x2f, 0xd6, 0xbc, 0xcd, 0x54, 0x10, 0xd4, 0xcb, 0xc9, 0xeb, 0x55, 0x4f, 0x73, 0xcd, 0xbd, 0x83, 0xd1, 0x53, 0xfb, 0x2b, 0x82, 0x38, 0x3f, 0x38, 0x49, 0xfe, 0xdd, 0x3f, 0x07 }, + // 57 + { 0x56, 0xcd, 0x01, 0x32, 0x3c, 0x7e, 0x07, 0x3c, 0x40, 0xcb, 0x7e, 0x8a, 0x80, 0xf1, 0xdf, 0x15, 0xdf, 0x79, 0xc8, 0x59, 0xc1, 0x91, 0x37, 0xb3, 0xf0, 0xc8, 0xa4, 0x01, 0xe2, 0x6a, 0x97, 0x91 }, + // 58 + { 0x17, 0x2e, 0x6e, 0x3b, 0xc8, 0x1e, 0x5f, 0x15, 0xdd, 0x56, 0xa8, 0xc1, 0x2c, 0xed, 0xb7, 0xd3, 0x8e, 0x1e, 0xbb, 0x84, 0x32, 0xef, 0xee, 0x0f, 0x31, 0xba, 0xbb, 0xc8, 0xc6, 0xc1, 0xcc, 0xad }, + // 59 + { 0xbf, 0xca, 0xef, 0x58, 0x3f, 0xfe, 0x4d, 0x1f, 0x12, 0x84, 0xda, 0xb9, 0x93, 0xcb, 0xfd, 0x23, 0xba, 0x55, 0x9c, 0x9c, 0x9b, 0x4c, 0xf7, 0x01, 0xde, 0x05, 0xf6, 0x60, 0xaa, 0xef, 0xb9, 0x03 }, + // 60 + { 0xf1, 0xaf, 0x7b, 0x0a, 0xd9, 0xfa, 0x3b, 0x04, 0xb5, 0x09, 0x56, 0x2e, 0x59, 0x6b, 0x47, 0x73, 0x72, 0x09, 0xf5, 0x72, 0x9d, 0x89, 0xfa, 0xa9, 0xe9, 0x9f, 0xbd, 0xe1, 0x73, 0xd6, 0xaa, 0xb7 }, + // 61 + { 0x8b, 0xf0, 0xeb, 0xa2, 0xf2, 0x58, 0x0e, 0xfc, 0xaa, 0xdc, 0x2b, 0x02, 0xc0, 0x3a, 0x95, 0x7e, 0x03, 0x19, 0x1a, 0x82, 0xed, 0x68, 0x0c, 0xce, 0x87, 0x5e, 0x57, 0x5a, 0xa9, 0x24, 0x34, 0x60 }, + // 62 + { 0x16, 0xcd, 0xc9, 0x38, 0x54, 0x7e, 0x66, 0x1f, 0x9d, 0xde, 0xb5, 0xea, 0x29, 0x16, 0x86, 0x9c, 0x12, 0xc2, 0x04, 0xe7, 0x70, 0x87, 0x77, 0x90, 0x8b, 0x17, 0x23, 0x33, 0x72, 0x3a, 0x10, 0x38 }, + // 63 + { 0xc8, 0xb5, 0xca, 0x98, 0x82, 0x11, 0x71, 0x05, 0xe2, 0x40, 0x41, 0xa3, 0xd5, 0xce, 0x90, 0xa6, 0xb4, 0x5c, 0xe4, 0xdc, 0x5d, 0x1a, 0x5e, 0x60, 0x70, 0xb4, 0x75, 0x89, 0xa9, 0x5e, 0x88, 0x8a }, + // 64 + { 0xbd, 0x37, 0x91, 0xa7, 0x43, 0xee, 0x8e, 0x71, 0x66, 0x7f, 0xa7, 0xa1, 0x7f, 0x9a, 0xde, 0x86, 0x45, 0xd8, 0x8e, 0xd1, 0xa2, 0x45, 0x31, 0x17, 0xc9, 0x48, 0x69, 0x40, 0xa8, 0x28, 0x48, 0x67 }, + // 65 + { 0xdc, 0x08, 0x75, 0xd9, 0xb1, 0xb8, 0xe8, 0xa3, 0x9a, 0x94, 0x00, 0xf3, 0x07, 0x8a, 0x34, 0xdd, 0xa1, 0xcb, 0xf5, 0x06, 0x3e, 0x14, 0xf6, 0x05, 0xaf, 0xa1, 0xb7, 0x3b, 0x19, 0xc2, 0x19, 0x68 }, + // 66 + { 0x09, 0x5b, 0x03, 0xf6, 0x90, 0x1b, 0x78, 0x2a, 0x01, 0x1c, 0x92, 0x63, 0xfc, 0x5b, 0x48, 0x9b, 0x5b, 0x16, 0xba, 0xc7, 0x73, 0xe6, 0x8c, 0x80, 0x78, 0x3d, 0x12, 0x86, 0x25, 0xb7, 0xd6, 0x3b }, + // 67 + { 0xa1, 0x77, 0x95, 0x5d, 0x67, 0x98, 0x26, 0x12, 0xae, 0x67, 0xc8, 0x7a, 0xe0, 0x8f, 0x42, 0x6a, 0x23, 0xef, 0x69, 0x26, 0x8e, 0xb1, 0x29, 0x44, 0x83, 0xdd, 0xa0, 0x64, 0xe6, 0x9c, 0xda, 0x18 }, + // 68 + { 0xb3, 0x81, 0xae, 0xf4, 0x11, 0xf8, 0x22, 0x25, 0xa8, 0xa9, 0x6f, 0xf1, 0xdf, 0x49, 0xf2, 0xa5, 0xd0, 0x84, 0xfd, 0xe5, 0x8b, 0x87, 0x7f, 0x04, 0x4e, 0xf4, 0x69, 0x6f, 0x90, 0xac, 0x0c, 0x9e }, + // 69 + { 0x2f, 0x86, 0x5e, 0xd6, 0x08, 0xd4, 0x27, 0x18, 0xfb, 0x9f, 0xe6, 0x8e, 0xaa, 0x13, 0x68, 0x28, 0x3b, 0x62, 0x2c, 0x1a, 0xeb, 0x5b, 0x03, 0x78, 0x16, 0x7a, 0x87, 0xa1, 0xd0, 0x73, 0x3d, 0xf7 }, + // 70 + { 0x35, 0x3b, 0xe9, 0x81, 0xf8, 0xc7, 0x7a, 0x2a, 0x78, 0x91, 0xef, 0xad, 0x34, 0xf7, 0x93, 0x91, 0xd1, 0x96, 0x3b, 0xfb, 0xb0, 0x37, 0x56, 0x0f, 0x51, 0x0b, 0x74, 0xea, 0x7e, 0xc3, 0x12, 0xcd }, + // 71 + { 0x6f, 0x17, 0x2f, 0x10, 0x31, 0x9d, 0xa2, 0xeb, 0x79, 0xd9, 0x89, 0xc6, 0x16, 0x9a, 0x69, 0xfd, 0x24, 0xbd, 0xd0, 0x03, 0x25, 0x90, 0x8f, 0x16, 0x83, 0x0f, 0x2f, 0x25, 0x23, 0x2f, 0xcc, 0x0e }, + // 72 + { 0x17, 0x89, 0x4b, 0x34, 0x63, 0x88, 0x1a, 0xfa, 0x90, 0x85, 0x21, 0x74, 0xfe, 0x41, 0x1d, 0x3b, 0x10, 0xf6, 0xf1, 0x6a, 0x15, 0x3a, 0x85, 0x35, 0x0d, 0x94, 0xe7, 0xf8, 0xb9, 0x9d, 0xd0, 0xe6 }, + // 73 + { 0xfa, 0xe5, 0x95, 0x85, 0x72, 0x0a, 0x79, 0x83, 0x5b, 0x25, 0x52, 0x66, 0x47, 0xcb, 0x9c, 0x31, 0x5b, 0x62, 0xe8, 0x1d, 0x75, 0x62, 0xf9, 0xfd, 0xc8, 0x2a, 0x77, 0x92, 0xad, 0x35, 0x6d, 0x6c }, + // 74 + { 0x14, 0x39, 0x47, 0x13, 0x4d, 0x14, 0x01, 0x85, 0x39, 0xaf, 0xde, 0xf3, 0x3e, 0x51, 0xc4, 0x19, 0x6b, 0x29, 0x5f, 0xa7, 0xda, 0x46, 0x0a, 0x81, 0xa6, 0x31, 0xd8, 0x29, 0xdc, 0xd7, 0x86, 0xca }, + // 75 + { 0x4e, 0x99, 0xa0, 0x4b, 0x08, 0xaa, 0x14, 0x60, 0x2f, 0x39, 0xdf, 0x6c, 0x6f, 0x68, 0xa2, 0x95, 0xee, 0x5c, 0x84, 0x51, 0x7b, 0x06, 0x76, 0xdc, 0xda, 0xa7, 0x3e, 0x0b, 0x17, 0xaf, 0x34, 0x4d }, + // 76 + { 0xa7, 0x0e, 0x23, 0xb3, 0x00, 0x6d, 0x50, 0x2f, 0x0a, 0x3f, 0x4b, 0xcb, 0x93, 0x30, 0xc4, 0x9b, 0x7e, 0xb3, 0x05, 0x2a, 0xae, 0x31, 0x9d, 0xcf, 0xad, 0x92, 0x22, 0xa9, 0xd5, 0xc7, 0x94, 0xad }, + // 77 + { 0x4e, 0x45, 0x02, 0xfb, 0xf8, 0x95, 0x67, 0x23, 0x82, 0x58, 0x79, 0x52, 0x08, 0x2e, 0x5d, 0xb8, 0x8b, 0x17, 0x62, 0xc3, 0x9d, 0x18, 0xd0, 0xec, 0xfc, 0x46, 0x1d, 0xbb, 0x64, 0x13, 0xba, 0xfd }, + // 78 + { 0x74, 0xd5, 0x5f, 0x5f, 0xe6, 0xc5, 0x60, 0x7e, 0x74, 0xbb, 0x7e, 0xbb, 0xdc, 0x47, 0x94, 0xe6, 0x30, 0x31, 0x80, 0x55, 0x14, 0x6c, 0x2b, 0x71, 0xc7, 0x53, 0x4c, 0x5f, 0x76, 0x7e, 0x3f, 0x76 }, + // 79 + { 0xa0, 0x09, 0x98, 0xf4, 0x5e, 0xf1, 0x0e, 0xc8, 0x9f, 0x84, 0xa6, 0xbe, 0xfe, 0x15, 0xba, 0x5a, 0x2f, 0x40, 0x35, 0xcf, 0x13, 0x1f, 0x6c, 0xbb, 0xbb, 0xd2, 0xdb, 0x53, 0xf2, 0x95, 0x13, 0x9a }, + // 80 + { 0x24, 0x94, 0xf9, 0xfb, 0xd5, 0x6f, 0x25, 0x1d, 0x5b, 0xff, 0xf1, 0x07, 0xed, 0x9f, 0x37, 0x08, 0x60, 0xd9, 0x8d, 0x70, 0x7b, 0xfd, 0xab, 0x92, 0xfc, 0x15, 0x67, 0x3f, 0xd1, 0x4c, 0x0a, 0x94 }, + // 81 + { 0x94, 0xca, 0xc7, 0xbc, 0x48, 0x18, 0x29, 0xf8, 0x7d, 0x47, 0xd3, 0x01, 0x4b, 0x21, 0xce, 0xed, 0xbb, 0x58, 0x1d, 0x74, 0x68, 0x87, 0x94, 0xf6, 0x12, 0x93, 0x1a, 0x0d, 0xd9, 0xd5, 0x22, 0xc9 }, + // 82 + { 0xb4, 0x3e, 0xa1, 0xf6, 0xd7, 0x76, 0xaf, 0x3b, 0x84, 0xe3, 0x81, 0x6e, 0x29, 0x26, 0x44, 0xcf, 0x2b, 0xdd, 0x37, 0x0d, 0x21, 0x41, 0x27, 0x82, 0x98, 0x81, 0x55, 0x70, 0x1f, 0x35, 0x09, 0x98 }, + // 83 + { 0xa2, 0x20, 0xe3, 0xdd, 0xcb, 0xed, 0xec, 0xf3, 0xb5, 0xf0, 0xe7, 0x97, 0x85, 0x9e, 0x14, 0x21, 0xd1, 0xde, 0x9b, 0x51, 0xea, 0xb4, 0xd1, 0x5c, 0xbd, 0xd4, 0xd7, 0xe4, 0xe7, 0x18, 0xef, 0x5b }, + // 84 + { 0x67, 0xb9, 0xc9, 0x28, 0x22, 0x9a, 0x1c, 0x57, 0x29, 0x7e, 0x81, 0xcb, 0xb8, 0x7b, 0x0c, 0xe0, 0x1e, 0x2d, 0xe7, 0xa1, 0x86, 0x92, 0xc1, 0x94, 0x8d, 0x9f, 0x12, 0xed, 0xbe, 0x3e, 0xb2, 0xc5 }, + // 85 + { 0x45, 0xc6, 0xdf, 0xf3, 0xd2, 0x17, 0x5a, 0x48, 0xce, 0x25, 0x85, 0x7d, 0x29, 0x7e, 0x9c, 0xc0, 0x39, 0x8a, 0x23, 0xcb, 0x4b, 0x8e, 0x81, 0x15, 0x4b, 0x6a, 0x59, 0xcb, 0x62, 0x5c, 0x64, 0xa9 }, + // 86 + { 0xdb, 0x3c, 0x05, 0x9f, 0xef, 0x5f, 0x16, 0x61, 0x2f, 0x73, 0xfe, 0x9e, 0xe1, 0xb7, 0x49, 0x74, 0x9d, 0x93, 0xf5, 0x50, 0x9f, 0xd5, 0xc4, 0xfc, 0xbb, 0xc8, 0x8c, 0x1f, 0x74, 0x41, 0x9d, 0x79 }, + // 87 + { 0x76, 0xe3, 0xf9, 0x6a, 0x0d, 0x6d, 0x95, 0x79, 0xf6, 0xf8, 0x34, 0x6e, 0x55, 0xcd, 0x2d, 0x84, 0x26, 0xc8, 0xc4, 0xfb, 0x83, 0x1e, 0x3b, 0xd5, 0x51, 0x44, 0x11, 0x41, 0x36, 0xd4, 0x4c, 0x93 }, + // 88 + { 0x79, 0xfa, 0x5f, 0xf0, 0x47, 0x87, 0xda, 0xef, 0x23, 0x89, 0x46, 0x08, 0x90, 0xba, 0xfd, 0x2a, 0x62, 0x13, 0x36, 0xc6, 0xc8, 0x38, 0xd4, 0xc8, 0x7f, 0xdd, 0x91, 0x7a, 0x20, 0x32, 0x2c, 0x16 }, + // 89 + { 0xda, 0xfe, 0x80, 0x2f, 0x02, 0x95, 0x2d, 0xca, 0x70, 0x4a, 0x85, 0x51, 0x64, 0xfa, 0x7e, 0xfd, 0xb5, 0xcb, 0xce, 0x48, 0xe9, 0xe0, 0xb4, 0x53, 0xd0, 0xb0, 0x18, 0xc5, 0x5d, 0x3a, 0x3f, 0xe2 }, + // 90 + { 0x34, 0x48, 0xa3, 0x40, 0xba, 0x2a, 0x13, 0x57, 0xcc, 0xe2, 0xdf, 0x8d, 0xb0, 0x0f, 0x60, 0x1c, 0x70, 0x00, 0xaf, 0xc1, 0xb9, 0x99, 0xc9, 0xc5, 0xab, 0x23, 0xf2, 0x86, 0x24, 0xf6, 0xe7, 0xfe }, + // 91 + { 0x0e, 0x21, 0x66, 0xcc, 0x61, 0x82, 0x08, 0xf4, 0x70, 0x6c, 0x02, 0xcf, 0x73, 0x09, 0xab, 0x2f, 0xd5, 0x97, 0xbf, 0x42, 0x01, 0x91, 0xab, 0xb2, 0x67, 0x4d, 0xd5, 0xd3, 0xaf, 0xc9, 0x14, 0x30 }, + // 92 + { 0x77, 0x7e, 0xa2, 0xac, 0xc9, 0x7b, 0x5a, 0x08, 0xa5, 0x06, 0x69, 0x8f, 0xdd, 0xf2, 0xfb, 0x42, 0xda, 0x37, 0xd5, 0x03, 0x62, 0x1e, 0x5e, 0x90, 0xee, 0xf3, 0xed, 0x62, 0x7a, 0xb5, 0x2e, 0x50 }, + // 93 + { 0x4c, 0x2e, 0x2a, 0x25, 0xb7, 0x17, 0xcc, 0xfd, 0xda, 0xf1, 0xe6, 0x0e, 0xb1, 0x87, 0x45, 0x1b, 0xf7, 0x67, 0xe6, 0x7c, 0xe4, 0x6c, 0x59, 0xf0, 0x64, 0x98, 0x8b, 0xd4, 0xf7, 0x6d, 0x46, 0x6b }, + // 94 + { 0xda, 0x42, 0xbd, 0x90, 0xad, 0xb6, 0x5e, 0x14, 0x3d, 0x48, 0x09, 0x65, 0xdb, 0x72, 0x38, 0x46, 0x35, 0x06, 0xc6, 0xd1, 0x42, 0xf5, 0xca, 0xa3, 0x13, 0x6b, 0xad, 0x11, 0xb3, 0x6f, 0x5e, 0x9f }, + // 95 + { 0x45, 0xc6, 0xb8, 0x9a, 0x0e, 0x4b, 0x8a, 0xcb, 0x18, 0x69, 0x57, 0x43, 0x90, 0x30, 0x54, 0x54, 0x1d, 0x4f, 0xfe, 0x13, 0x31, 0x97, 0x94, 0x45, 0xf0, 0xff, 0xc8, 0xe9, 0x52, 0x2f, 0x25, 0x0c }, + // 96 + { 0x4c, 0x85, 0x95, 0xe0, 0x0b, 0x57, 0xa5, 0x9e, 0x57, 0xd8, 0x85, 0x15, 0xe8, 0xcf, 0xe5, 0x52, 0xab, 0x7d, 0xd7, 0xe8, 0x71, 0x9c, 0x1b, 0x71, 0x1b, 0x8f, 0xa3, 0x92, 0xcc, 0x36, 0x37, 0x90 }, + // 97 + { 0xc3, 0xdc, 0xdb, 0x87, 0xad, 0xee, 0xc1, 0x5b, 0xd1, 0x90, 0xa8, 0x8b, 0x21, 0xf6, 0x2f, 0xe5, 0x2e, 0xbf, 0x18, 0xed, 0xc0, 0x6e, 0x5a, 0xe9, 0xb6, 0x02, 0xf9, 0xbe, 0x56, 0x49, 0x20, 0x10 }, + // 98 + { 0xed, 0x58, 0xcb, 0x0a, 0x82, 0xc2, 0xb3, 0xf1, 0xc1, 0xff, 0xf0, 0x9a, 0x22, 0xa1, 0x2b, 0x74, 0x80, 0xe6, 0x1f, 0xac, 0x5a, 0xa3, 0x90, 0xeb, 0x33, 0xdd, 0x73, 0x63, 0x12, 0x9d, 0x09, 0xdc }, + // 99 + { 0xcf, 0x7d, 0xdb, 0x1b, 0x76, 0xe7, 0xa6, 0x27, 0xf9, 0x5e, 0x32, 0x59, 0x74, 0x16, 0x06, 0xb2, 0xfb, 0x9d, 0x88, 0x72, 0x0d, 0x6e, 0xf0, 0xe5, 0xe5, 0xad, 0xbf, 0x26, 0xe5, 0xde, 0x88, 0xc5 }, + // 100 + { 0x3e, 0xef, 0xd3, 0x0f, 0xc5, 0x20, 0xa2, 0xd0, 0xae, 0x28, 0xca, 0x37, 0x14, 0xfb, 0x5e, 0xfd, 0x62, 0xc2, 0xec, 0xea, 0x47, 0x59, 0xfb, 0x4c, 0x25, 0xbf, 0x28, 0x2b, 0xd4, 0x2f, 0x60, 0x65 }, + // 101 + { 0x88, 0x52, 0x26, 0x4d, 0x4d, 0x34, 0x95, 0xca, 0xd7, 0x83, 0x30, 0xb3, 0x4e, 0x4e, 0xfa, 0x1a, 0x5d, 0x28, 0x22, 0xb5, 0x8b, 0x45, 0x0f, 0x47, 0x50, 0xb8, 0x90, 0xbf, 0xe5, 0x83, 0xbe, 0x41 }, + // 102 + { 0x09, 0x6f, 0x8d, 0x55, 0x5d, 0x5e, 0x3a, 0x7f, 0x07, 0x3e, 0x96, 0xa1, 0x34, 0xb4, 0xc8, 0xde, 0x08, 0x71, 0x30, 0x03, 0x73, 0x5d, 0x11, 0x90, 0x74, 0x51, 0x06, 0x78, 0x44, 0x5d, 0xb9, 0x28 }, + // 103 + { 0x97, 0x27, 0xe4, 0x65, 0xc3, 0x47, 0x4f, 0xfa, 0x85, 0x02, 0x99, 0xf8, 0x18, 0x05, 0x8d, 0x96, 0xc4, 0xf5, 0xd0, 0x56, 0x5c, 0x4d, 0xf0, 0x66, 0xba, 0x60, 0x19, 0x78, 0x54, 0xa1, 0x7b, 0x96 }, + // 104 + { 0x58, 0x7b, 0x5b, 0x7c, 0xaa, 0x11, 0x68, 0xbd, 0xe4, 0x74, 0x0a, 0x2d, 0xec, 0x64, 0x20, 0xe3, 0x9e, 0xa7, 0x60, 0x5c, 0x02, 0xcd, 0x76, 0x68, 0xe4, 0x6a, 0x56, 0x92, 0xcb, 0x25, 0xfc, 0xbe }, + // 105 + { 0xda, 0x78, 0x04, 0x16, 0x5a, 0x91, 0x5e, 0x9e, 0xf5, 0x4b, 0xd6, 0x59, 0x32, 0xf5, 0xea, 0xba, 0xf9, 0x77, 0x5c, 0xe0, 0xa3, 0x3e, 0xf4, 0xaa, 0x12, 0xa5, 0xf4, 0xf3, 0x80, 0x2d, 0xac, 0x4a }, + // 106 + { 0x80, 0xda, 0x72, 0x59, 0x5b, 0x0b, 0xc0, 0x13, 0x62, 0x11, 0xab, 0x44, 0xf4, 0xa3, 0xeb, 0xff, 0xac, 0xf6, 0x9c, 0x5d, 0x75, 0xe2, 0x6c, 0xde, 0xf8, 0x6a, 0x06, 0xb5, 0x24, 0xf8, 0xec, 0xd8 }, + // 107 + { 0xa3, 0x2c, 0xf1, 0x24, 0xe0, 0x1a, 0x55, 0x97, 0x5c, 0x95, 0x30, 0x6c, 0xdd, 0x5a, 0xf6, 0x44, 0x16, 0x50, 0x9a, 0x14, 0x18, 0xba, 0x27, 0x95, 0x9c, 0xdb, 0x5a, 0xd5, 0xb7, 0xf7, 0x51, 0x3d }, + // 108 + { 0x5b, 0x69, 0xf8, 0x14, 0xb7, 0xe6, 0x4a, 0xf1, 0xaf, 0x79, 0xa8, 0xe5, 0x1a, 0x4f, 0x0f, 0x72, 0x90, 0x0a, 0xb2, 0x60, 0xa2, 0xaf, 0xda, 0x69, 0xa9, 0x98, 0x32, 0x61, 0x38, 0xce, 0xb0, 0x23 }, + // 109 + { 0xf5, 0x30, 0x48, 0x01, 0x51, 0x4f, 0x7b, 0x60, 0x7e, 0x9d, 0x91, 0x60, 0x88, 0x84, 0xb0, 0x48, 0x31, 0x7e, 0x37, 0xe0, 0x5b, 0xe9, 0xde, 0x01, 0x17, 0x91, 0x50, 0x65, 0x66, 0x72, 0xb4, 0x6d }, + // 110 + { 0xc8, 0x0f, 0x51, 0x38, 0xc2, 0x1c, 0x99, 0x45, 0x96, 0xf9, 0x60, 0xa8, 0x25, 0x67, 0x2a, 0x69, 0x20, 0x75, 0x1f, 0x85, 0xb8, 0xd5, 0xd5, 0x4b, 0x74, 0x4c, 0x07, 0x0a, 0x16, 0x16, 0xb8, 0xf4 }, + // 111 + { 0xb4, 0xd1, 0x09, 0x9d, 0xcc, 0x5b, 0x62, 0x96, 0xad, 0x9e, 0x20, 0x34, 0x6c, 0x25, 0x78, 0xaf, 0x80, 0x70, 0xb3, 0x90, 0x1d, 0xda, 0x78, 0x4c, 0x9d, 0xf7, 0xdb, 0xb7, 0xe6, 0xcb, 0x15, 0x64 }, + // 112 + { 0x00, 0xc8, 0x89, 0x72, 0xb7, 0x30, 0xf5, 0xdd, 0xaf, 0x3a, 0x78, 0x0e, 0x9d, 0x57, 0x8a, 0xf1, 0x0a, 0xcc, 0x14, 0x48, 0xc8, 0xb2, 0x59, 0x84, 0x8a, 0xf9, 0x37, 0xa2, 0x08, 0x4a, 0x53, 0x27 }, + // 113 + { 0xc8, 0x04, 0x8c, 0xaf, 0x2b, 0xa6, 0x01, 0x91, 0x9e, 0xe4, 0x42, 0x01, 0x87, 0x0b, 0xbf, 0xec, 0x2b, 0x18, 0xfa, 0xf3, 0xb4, 0x03, 0x73, 0x29, 0x96, 0x82, 0xcf, 0xae, 0xf6, 0x90, 0xee, 0x9e }, + // 114 + { 0x44, 0x2d, 0xc9, 0x0e, 0x4e, 0xe3, 0x68, 0x07, 0x95, 0x1e, 0x4e, 0x5e, 0x66, 0x80, 0xab, 0x35, 0x43, 0x54, 0x53, 0x33, 0x0a, 0x04, 0xdc, 0x22, 0x3c, 0xbb, 0x03, 0x6c, 0x13, 0x27, 0x68, 0xd7 }, + // 115 + { 0x68, 0xdd, 0x32, 0xa3, 0x6a, 0xb1, 0x95, 0x91, 0x52, 0xb0, 0xb1, 0x90, 0x78, 0xca, 0x5d, 0x63, 0x7d, 0x4d, 0xe9, 0xa0, 0xa9, 0x7f, 0x2c, 0xeb, 0x9c, 0x05, 0xcd, 0xa0, 0xe3, 0xe5, 0xd5, 0x7f }, + // 116 + { 0x9c, 0xd4, 0xf4, 0x15, 0x01, 0xdc, 0x7a, 0xe4, 0x26, 0x13, 0x39, 0xa9, 0x72, 0x83, 0x5a, 0x80, 0xa4, 0x08, 0xf1, 0x60, 0x5c, 0x77, 0x70, 0xba, 0xfe, 0x04, 0xc5, 0xdf, 0x13, 0x92, 0x27, 0x3d }, + // 117 + { 0x62, 0x82, 0xbf, 0xb6, 0x95, 0x87, 0xeb, 0xde, 0x24, 0x7e, 0x10, 0x58, 0x27, 0x74, 0xea, 0x30, 0x23, 0x8b, 0x2f, 0xd5, 0x85, 0x44, 0xa0, 0xb3, 0xf4, 0xac, 0x86, 0x18, 0x03, 0x8f, 0x8b, 0x5f }, + // 118 + { 0xbb, 0x34, 0x47, 0x38, 0x29, 0x24, 0x46, 0xe2, 0xba, 0x2f, 0x62, 0x03, 0x13, 0x29, 0xc3, 0xec, 0xce, 0x3b, 0xc6, 0x08, 0xca, 0xeb, 0xc8, 0xac, 0x13, 0x64, 0x1f, 0xe7, 0x02, 0x25, 0x33, 0x58 }, + // 119 + { 0x2e, 0xd0, 0x98, 0xff, 0x9e, 0xd5, 0x34, 0x8e, 0xeb, 0xbb, 0x17, 0x33, 0xd5, 0x0a, 0x0e, 0xeb, 0x32, 0x77, 0xa3, 0x0a, 0xce, 0x12, 0x00, 0x6e, 0x94, 0x7b, 0x40, 0x58, 0xb1, 0x7b, 0x73, 0x4f }, + // 120 + { 0xc9, 0x5a, 0xe5, 0xdd, 0x38, 0x1c, 0xa8, 0x6b, 0xec, 0xb3, 0x87, 0x8a, 0xbf, 0xfc, 0xec, 0x4c, 0xfc, 0xd9, 0xf3, 0xa9, 0xed, 0xb5, 0x23, 0xba, 0xfc, 0xea, 0xd7, 0xb6, 0xcc, 0x9f, 0xc2, 0xcf }, + // 121 + { 0xa9, 0xf8, 0xe1, 0x65, 0xc1, 0xd0, 0x63, 0x90, 0x8b, 0x9f, 0xe4, 0xae, 0x37, 0x45, 0x0c, 0xba, 0x5f, 0x3c, 0x82, 0x61, 0x61, 0x80, 0x52, 0x93, 0x78, 0x66, 0xbf, 0x7e, 0x0e, 0xda, 0x55, 0xed }, + // 122 + { 0x1a, 0x55, 0x54, 0x55, 0x4e, 0x31, 0x4c, 0x95, 0x36, 0xec, 0x11, 0x2c, 0xb4, 0xd2, 0x66, 0x78, 0xe7, 0x4a, 0xdd, 0xd0, 0xbf, 0x91, 0xe1, 0x3b, 0xba, 0x8d, 0x92, 0x90, 0x8c, 0x62, 0x16, 0x1c }, + // 123 + { 0xe8, 0x36, 0xfb, 0x83, 0xd4, 0x80, 0x83, 0xd5, 0xc1, 0x3f, 0x13, 0x2b, 0x03, 0x37, 0x12, 0x4e, 0x83, 0x9f, 0xf1, 0xfd, 0x38, 0xde, 0xc0, 0x9d, 0xce, 0x2f, 0xba, 0xdc, 0x52, 0x93, 0x9b, 0x35 }, + // 124 + { 0x04, 0x68, 0xed, 0x5f, 0xe3, 0x58, 0x17, 0x35, 0x77, 0x4a, 0x96, 0x2c, 0x27, 0xc2, 0x26, 0x7f, 0xb8, 0xee, 0x59, 0xa9, 0x5d, 0x00, 0xc0, 0x8c, 0x92, 0x4b, 0x52, 0xa4, 0xc7, 0x68, 0x80, 0x50 }, + // 125 + { 0x03, 0xc9, 0xfc, 0xce, 0x9c, 0x7c, 0x07, 0x6a, 0x84, 0xfd, 0xeb, 0x51, 0x3c, 0x02, 0xf4, 0x88, 0x13, 0xeb, 0x06, 0x6e, 0x08, 0xc6, 0x0f, 0x8f, 0xca, 0xf6, 0x2f, 0x38, 0xfb, 0xf3, 0x92, 0x68 }, + // 126 + { 0xf8, 0x47, 0xa7, 0x26, 0x89, 0x06, 0xd8, 0x6b, 0x4d, 0xbb, 0x29, 0xfb, 0xcd, 0x2e, 0x30, 0x1a, 0xbb, 0xf1, 0x38, 0x3e, 0x54, 0xbd, 0xf6, 0x04, 0x82, 0x77, 0x9f, 0x0e, 0xec, 0x93, 0xae, 0x01 }, + // 127 + { 0xa6, 0xd5, 0x1c, 0x7e, 0xd9, 0x58, 0x2c, 0xfe, 0x77, 0x5d, 0x7f, 0x24, 0x2a, 0x7b, 0x47, 0x09, 0x07, 0x12, 0xd6, 0x83, 0x08, 0xa2, 0x5d, 0x1e, 0xda, 0x51, 0xa2, 0x30, 0x41, 0xce, 0x33, 0x30 }, + // 128 + { 0x78, 0x01, 0x38, 0xa5, 0xbd, 0x9e, 0xd6, 0x7e, 0x12, 0x46, 0x4b, 0x52, 0xa7, 0xfb, 0xea, 0xe5, 0xf0, 0xcc, 0xce, 0xba, 0x83, 0xcb, 0xb9, 0xb0, 0xc0, 0xcf, 0x28, 0xba, 0x1b, 0xde, 0x47, 0x43 }, + // 129 + { 0xe1, 0x1a, 0x06, 0x8e, 0x7b, 0x9d, 0xd1, 0xa1, 0xb7, 0xea, 0x91, 0x12, 0xf8, 0x90, 0x89, 0x23, 0x50, 0xec, 0xe6, 0xd9, 0xbe, 0x35, 0xfe, 0x30, 0x5e, 0x74, 0x00, 0x1a, 0x19, 0xd1, 0xa4, 0x81 }, + // 130 + { 0xb5, 0x98, 0x40, 0x7d, 0x03, 0xb1, 0x23, 0x47, 0x44, 0x86, 0x06, 0x16, 0xb1, 0xbe, 0xa4, 0x9b, 0x89, 0x11, 0xb3, 0x5c, 0x16, 0xac, 0x69, 0x17, 0x39, 0x35, 0xca, 0x8a, 0xda, 0x26, 0x90, 0x88 }, + // 131 + { 0xf4, 0x9c, 0x65, 0x98, 0xc9, 0xbc, 0x44, 0xd5, 0xd3, 0xb5, 0x18, 0x4d, 0xeb, 0x99, 0xfd, 0xee, 0x0e, 0x86, 0x78, 0x2d, 0x80, 0x0b, 0x4e, 0x69, 0x05, 0x71, 0x4c, 0x51, 0x15, 0x24, 0x26, 0xec }, + // 132 + { 0x0c, 0xcf, 0xcf, 0x4a, 0x6b, 0xe2, 0x03, 0x1b, 0xf6, 0x04, 0xd4, 0x92, 0x95, 0x20, 0xd6, 0xf7, 0x51, 0xc6, 0x44, 0x4c, 0x05, 0xdd, 0x2b, 0x68, 0x9e, 0x66, 0x01, 0x47, 0xed, 0xc4, 0xa7, 0x0d }, + // 133 + { 0x8b, 0x91, 0xbc, 0x5f, 0xae, 0xc9, 0x02, 0x81, 0xde, 0x18, 0x54, 0xcb, 0x58, 0x86, 0xdd, 0x30, 0x72, 0x15, 0x97, 0xac, 0x38, 0x91, 0x0e, 0xec, 0x1d, 0x20, 0x49, 0x41, 0xb2, 0x7e, 0xa7, 0xef }, + // 134 + { 0x5d, 0xff, 0xb0, 0xdf, 0x96, 0xc5, 0x3e, 0xd1, 0xb9, 0x40, 0x04, 0xe2, 0xa6, 0xb5, 0x4f, 0x09, 0x00, 0x9b, 0xa2, 0x93, 0x03, 0xa7, 0xe8, 0x36, 0x72, 0x2c, 0xc9, 0x74, 0x70, 0x2b, 0xc0, 0xed }, + // 135 + { 0xc5, 0x57, 0x03, 0xe3, 0xf4, 0xc2, 0xef, 0x3b, 0xfe, 0x97, 0x85, 0xe1, 0x47, 0xe1, 0x13, 0x98, 0x3b, 0x25, 0x15, 0x1b, 0x97, 0x86, 0x9a, 0x0f, 0xd5, 0x52, 0xfa, 0xb9, 0x90, 0x5d, 0x1d, 0x46 }, + // 136 + { 0xb2, 0x36, 0x80, 0x94, 0xb0, 0xf2, 0x20, 0xff, 0x7d, 0xd4, 0x4d, 0xf3, 0xd1, 0x50, 0x03, 0xcf, 0x36, 0x79, 0xb1, 0x73, 0x43, 0xeb, 0x7f, 0x0e, 0x21, 0x6c, 0x55, 0xc9, 0x26, 0xbe, 0x91, 0x6f }, + // 137 + { 0x5d, 0x54, 0x4b, 0x39, 0xc5, 0xfe, 0x1f, 0x38, 0xcd, 0xac, 0xc8, 0xaf, 0xc8, 0x25, 0x23, 0x35, 0x71, 0x58, 0x04, 0x72, 0x86, 0xcf, 0xeb, 0xca, 0x2a, 0x77, 0xac, 0x8f, 0x1f, 0xf7, 0x86, 0x9c }, + // 138 + { 0xf3, 0x03, 0x24, 0x9d, 0xfc, 0xdd, 0x40, 0x55, 0xa8, 0x77, 0x22, 0xbe, 0x63, 0xda, 0x44, 0x6e, 0xff, 0x0d, 0x1e, 0xa3, 0x7e, 0x6f, 0xbe, 0x68, 0x84, 0x0b, 0xc0, 0x67, 0x4e, 0x80, 0x3b, 0xf2 }, + // 139 + { 0x3f, 0xf7, 0xa7, 0xb0, 0x41, 0x2f, 0xa6, 0xee, 0x33, 0xd0, 0x64, 0x27, 0xf7, 0x7d, 0xb2, 0xd1, 0xf7, 0x60, 0xb6, 0xe8, 0xe7, 0x73, 0x88, 0x64, 0xa5, 0x52, 0x04, 0xfc, 0xd4, 0x19, 0x71, 0x22 }, + // 140 + { 0x30, 0x08, 0x27, 0x60, 0xae, 0x65, 0x90, 0x74, 0xb6, 0x42, 0x40, 0xf4, 0xcb, 0x75, 0x33, 0xf3, 0x9d, 0x62, 0x79, 0x81, 0x09, 0xfd, 0xcf, 0xdd, 0x0d, 0xe5, 0xbc, 0xdd, 0x42, 0x8d, 0xc7, 0xf6 }, + // 141 + { 0xa3, 0x4b, 0xb2, 0x62, 0x84, 0x36, 0x51, 0xb2, 0x9d, 0xe0, 0xff, 0xd3, 0x96, 0xb7, 0x81, 0x52, 0x00, 0x28, 0x5c, 0x91, 0x40, 0x48, 0x69, 0xf5, 0x5f, 0x89, 0x8c, 0xe2, 0x91, 0x23, 0xf3, 0xf9 }, + // 142 + { 0x15, 0x23, 0x64, 0x72, 0x47, 0xaa, 0x95, 0x48, 0x54, 0xc6, 0x93, 0x84, 0x96, 0xa8, 0x97, 0x6f, 0x2a, 0xe7, 0x0b, 0x70, 0xc6, 0x33, 0x77, 0x6a, 0x07, 0x51, 0x23, 0x24, 0x4d, 0x01, 0x53, 0xff }, + // 143 + { 0x54, 0x63, 0x03, 0x6b, 0x1a, 0xd8, 0x85, 0x19, 0x72, 0x2e, 0x63, 0x65, 0x98, 0x4e, 0x30, 0xa3, 0xb7, 0x58, 0xfe, 0x18, 0x98, 0x08, 0xd6, 0x7b, 0xed, 0xd8, 0xc4, 0xc4, 0xc9, 0x8f, 0x23, 0x7a }, + // 144 + { 0x60, 0x09, 0x8e, 0xd2, 0xa3, 0x10, 0x8a, 0xcd, 0x5b, 0xaa, 0x0e, 0x91, 0xb3, 0x18, 0xea, 0x08, 0x0f, 0x28, 0x26, 0x2f, 0xce, 0xfb, 0x5a, 0x36, 0x3f, 0x00, 0xe0, 0x23, 0xb2, 0xc9, 0x6e, 0x95 }, + // 145 + { 0x3e, 0x71, 0xfc, 0xbf, 0x19, 0xd9, 0xab, 0x2a, 0x6a, 0xf9, 0xe4, 0xcc, 0xdb, 0x1c, 0x5f, 0xdd, 0xe5, 0x19, 0x2d, 0x6a, 0xc9, 0xd1, 0x5e, 0x2d, 0x62, 0xad, 0x98, 0xca, 0x8c, 0x29, 0x13, 0x10 }, + // 146 + { 0x7f, 0x0a, 0x34, 0xda, 0xe7, 0x17, 0xcb, 0x8a, 0xb1, 0x69, 0xb9, 0xf0, 0x7e, 0xea, 0x05, 0x2a, 0x4a, 0x78, 0xe6, 0xc2, 0x60, 0x4d, 0x8b, 0x8d, 0xaf, 0x88, 0x9a, 0x5d, 0x64, 0x42, 0x8a, 0x1d }, + // 147 + { 0x16, 0xaa, 0xa8, 0x4d, 0x80, 0xe0, 0x5e, 0x60, 0xec, 0x08, 0x6d, 0x39, 0x8e, 0xb8, 0x5c, 0x24, 0x55, 0x4c, 0xac, 0x8d, 0x18, 0x6a, 0x5d, 0xcc, 0x98, 0xef, 0xe6, 0x77, 0x2f, 0xc7, 0x3a, 0x7a }, + // 148 + { 0x46, 0x6c, 0xfc, 0x50, 0x85, 0x6b, 0xbd, 0xd8, 0xb8, 0x65, 0xec, 0xd0, 0xcc, 0x49, 0x3e, 0x97, 0x5c, 0xd6, 0x39, 0x74, 0x6a, 0xe3, 0x14, 0x87, 0x8e, 0x84, 0x31, 0xa0, 0x72, 0x27, 0x67, 0x5a }, + // 149 + { 0xfa, 0x14, 0xaf, 0x2f, 0xc8, 0x74, 0xea, 0x85, 0xe7, 0x54, 0xee, 0x0d, 0xb0, 0x59, 0x0c, 0x61, 0xc2, 0xa5, 0x1a, 0xe0, 0x9f, 0xde, 0x55, 0xa9, 0x9b, 0xe4, 0x1a, 0x88, 0x3b, 0x18, 0x6d, 0x68 }, + // 150 + { 0xfb, 0xa2, 0x63, 0x2a, 0xe8, 0x5d, 0xf4, 0xf0, 0xa3, 0x7e, 0xb0, 0x5c, 0xeb, 0xf0, 0x20, 0xad, 0x9d, 0x8e, 0x17, 0x2b, 0x4d, 0x01, 0xaf, 0xea, 0xaf, 0xc6, 0xcc, 0x65, 0x42, 0x25, 0xef, 0x2f }, + // 151 + { 0x05, 0xb9, 0x29, 0x91, 0xd4, 0x95, 0xb0, 0xea, 0x99, 0xf0, 0x29, 0xa2, 0xc6, 0xbf, 0x2a, 0x2a, 0x38, 0x47, 0x79, 0xd5, 0x10, 0xf3, 0x4a, 0xd8, 0x32, 0x15, 0x32, 0x04, 0x1e, 0xef, 0x49, 0x01 }, + // 152 + { 0xf9, 0x5f, 0x06, 0xe3, 0x92, 0x6f, 0xb6, 0x52, 0x35, 0xf2, 0xdf, 0xbc, 0x2d, 0x7b, 0x2c, 0xae, 0x37, 0x4c, 0x33, 0x00, 0x7a, 0xf3, 0xa6, 0xf3, 0x0a, 0xd9, 0xb9, 0x59, 0xf6, 0x0b, 0xa5, 0x9c }, + // 153 + { 0x41, 0xe5, 0xcc, 0x0f, 0x82, 0x70, 0x2f, 0xa8, 0xc0, 0x72, 0xb7, 0xf5, 0xfe, 0x45, 0xa1, 0x7b, 0xae, 0x17, 0x63, 0x12, 0xee, 0x83, 0x1d, 0xbe, 0x24, 0x69, 0xa2, 0x3e, 0x16, 0xa2, 0x2d, 0xe0 }, + // 154 + { 0xfe, 0xc5, 0x29, 0x21, 0x63, 0x7b, 0x16, 0x81, 0xb9, 0x09, 0x5d, 0x0e, 0xa5, 0xa7, 0x51, 0x9b, 0x11, 0xf8, 0x71, 0x81, 0xb5, 0x9e, 0x0c, 0x03, 0xa0, 0xd1, 0x98, 0x0a, 0x97, 0xb7, 0x1e, 0xef }, + // 155 + { 0x1f, 0xcb, 0x5c, 0xbd, 0x45, 0xc1, 0xd7, 0xea, 0x77, 0x5d, 0x0d, 0xf9, 0x3d, 0x2d, 0xf2, 0xe8, 0x43, 0x35, 0x56, 0x3c, 0x9a, 0x5c, 0x42, 0x17, 0x2f, 0x17, 0x89, 0xde, 0x02, 0x53, 0x2e, 0xb9 }, + // 156 + { 0xdb, 0x14, 0x4d, 0xd9, 0x9b, 0xdb, 0x52, 0x3b, 0xcc, 0xf0, 0x3e, 0x19, 0xb0, 0x8b, 0x3c, 0x18, 0xa1, 0xe7, 0x5f, 0x44, 0x45, 0xda, 0x7b, 0xeb, 0x19, 0xde, 0x29, 0xaa, 0x78, 0xa8, 0x40, 0xcb }, + // 157 + { 0x94, 0x57, 0x65, 0x8b, 0x6d, 0xaf, 0x3f, 0x0c, 0xf8, 0x31, 0x66, 0x0f, 0xfb, 0x49, 0x85, 0x13, 0xa7, 0x70, 0x61, 0x80, 0x6a, 0xfe, 0x18, 0x7e, 0x59, 0xdf, 0x9d, 0x0c, 0x46, 0xc6, 0x73, 0xcd }, + // 158 + { 0xa0, 0xc2, 0x22, 0x51, 0x09, 0x52, 0xaa, 0x1d, 0x5c, 0x2e, 0x05, 0xb9, 0x8c, 0x24, 0xa9, 0x40, 0x4f, 0x57, 0xc7, 0xf5, 0xab, 0x24, 0xbd, 0x50, 0xf9, 0x2d, 0x1b, 0xd8, 0x7b, 0x47, 0x7e, 0xf6 }, + // 159 + { 0x6d, 0xd0, 0xba, 0xde, 0x12, 0x9a, 0x01, 0x01, 0xb5, 0x7f, 0x11, 0xa3, 0x9e, 0x59, 0x29, 0x96, 0x4e, 0xd8, 0x64, 0x15, 0x86, 0xbb, 0x81, 0xfb, 0x8c, 0x37, 0x63, 0x8c, 0x6f, 0x0d, 0x94, 0x0c }, + // 160 + { 0x27, 0x52, 0x31, 0x20, 0x50, 0x27, 0x8d, 0xdd, 0x74, 0xe8, 0x6c, 0x7d, 0xf7, 0x0e, 0xd1, 0x12, 0x3d, 0x89, 0x9f, 0x2d, 0x2e, 0xbe, 0x03, 0x45, 0x20, 0x10, 0xc4, 0x45, 0x90, 0xf9, 0xc9, 0x60 }, + // 161 + { 0xbf, 0x7e, 0xc7, 0xdf, 0xf4, 0xa6, 0x6e, 0x96, 0xf4, 0x55, 0xb7, 0x08, 0x2a, 0x41, 0xfb, 0x58, 0xae, 0x29, 0xa9, 0x06, 0x99, 0xdf, 0x02, 0x8e, 0x2a, 0x4f, 0x36, 0xb5, 0xeb, 0x9a, 0xa4, 0xbf }, + // 162 + { 0xc8, 0xad, 0x0c, 0xa3, 0xf5, 0x9a, 0x57, 0x32, 0xf7, 0xad, 0x4f, 0xd4, 0xdf, 0x4e, 0xec, 0x58, 0xdb, 0xc2, 0x8c, 0x14, 0x79, 0x3a, 0xb3, 0x08, 0xce, 0x3b, 0xaf, 0x01, 0xdf, 0x9f, 0xe4, 0x21 }, + // 163 + { 0xe7, 0xa2, 0x92, 0x35, 0xb6, 0x86, 0xe9, 0x34, 0x82, 0x7d, 0x54, 0xbe, 0x48, 0xc8, 0x40, 0xfb, 0x33, 0xff, 0x58, 0x3c, 0x8b, 0x6a, 0xcd, 0x68, 0xc7, 0x46, 0x56, 0xdb, 0xad, 0xfb, 0x9a, 0x9f }, + // 164 + { 0x21, 0x1d, 0xbe, 0x8a, 0x12, 0xe3, 0x93, 0x19, 0x7d, 0x25, 0x75, 0x7b, 0x44, 0x45, 0x94, 0x56, 0xf6, 0x3e, 0xfc, 0x4c, 0x82, 0xf5, 0x7e, 0x1f, 0x66, 0x9d, 0x28, 0x3c, 0x78, 0x12, 0x41, 0x80 }, + // 165 + { 0x50, 0x54, 0x8b, 0x91, 0x59, 0xf9, 0x98, 0x2a, 0x9c, 0x8b, 0x50, 0x64, 0x1e, 0x58, 0x03, 0x45, 0x14, 0x0f, 0x7c, 0xa6, 0xbb, 0x37, 0x91, 0x75, 0x03, 0x90, 0xb7, 0x7f, 0x40, 0x49, 0x3a, 0x15 }, + // 166 + { 0x65, 0xda, 0x83, 0x93, 0xa1, 0xb7, 0x58, 0x1c, 0xc5, 0x98, 0x76, 0x50, 0x2f, 0x55, 0x96, 0x90, 0xbc, 0x90, 0xc8, 0x6c, 0x0c, 0x7d, 0xd9, 0xaa, 0xdb, 0xa0, 0xb0, 0xd3, 0xe4, 0x3d, 0x31, 0xc7 }, + // 167 + { 0xf2, 0x80, 0xad, 0x5c, 0xac, 0x65, 0x52, 0x7d, 0xef, 0xee, 0x90, 0xe4, 0xe9, 0xe5, 0x48, 0x83, 0x37, 0x58, 0xe1, 0x6e, 0xa3, 0x79, 0x2a, 0x31, 0x09, 0x79, 0x80, 0xeb, 0xbf, 0x2d, 0xce, 0xfa }, + // 168 + { 0x19, 0xe4, 0x21, 0x35, 0x0f, 0x81, 0xc1, 0xba, 0x14, 0xd2, 0xd3, 0x6b, 0xe8, 0x31, 0x8c, 0x74, 0xde, 0x61, 0xe6, 0x25, 0x9b, 0xa5, 0x8e, 0x9a, 0x3f, 0xf2, 0xed, 0xc9, 0x27, 0xe5, 0xbb, 0xfc }, + // 169 + { 0x16, 0x5a, 0x59, 0x15, 0x6e, 0x5e, 0xa1, 0xc9, 0xe5, 0x5a, 0x95, 0xc0, 0x8c, 0x7c, 0x2f, 0x54, 0xcd, 0x2b, 0xc5, 0x3d, 0x32, 0xbe, 0x9d, 0x51, 0x07, 0x8c, 0x8d, 0x6e, 0xcd, 0x73, 0x39, 0x96 }, + // 170 + { 0x4f, 0x55, 0x4e, 0xed, 0xfa, 0x74, 0x27, 0x0f, 0xd3, 0xd9, 0xe7, 0xaa, 0xc5, 0xa6, 0x47, 0xc5, 0x97, 0xd2, 0x63, 0x63, 0x80, 0xf3, 0x40, 0xa1, 0x0d, 0xd1, 0x18, 0xfa, 0x40, 0x3b, 0xdc, 0x92 }, + // 171 + { 0xb0, 0xd6, 0x7f, 0x9a, 0x90, 0xc4, 0x77, 0xf5, 0x0c, 0xbc, 0x78, 0x9a, 0x11, 0x94, 0x9e, 0xdf, 0x29, 0x50, 0x86, 0x1a, 0xaa, 0x7e, 0x01, 0xcd, 0xc0, 0x85, 0xba, 0x8d, 0x22, 0xf0, 0x00, 0xbb }, + // 172 + { 0x67, 0x4b, 0x05, 0x21, 0xd5, 0x63, 0x37, 0xee, 0x8b, 0x69, 0xba, 0x1f, 0xb8, 0xa1, 0xe3, 0x6e, 0x47, 0xf0, 0x2d, 0x4d, 0x58, 0x54, 0xaa, 0x4d, 0xf8, 0x7f, 0xf3, 0xec, 0x45, 0x38, 0x87, 0x72 }, + // 173 + { 0xde, 0x81, 0x0a, 0xea, 0xf7, 0xa6, 0x63, 0x93, 0x54, 0x31, 0xb8, 0x1f, 0x57, 0x6a, 0x74, 0x6a, 0xb3, 0xbc, 0x49, 0xd0, 0x22, 0x53, 0xe0, 0x8d, 0x8d, 0x36, 0x2e, 0x40, 0x4e, 0x1f, 0x42, 0xbe }, + // 174 + { 0xdc, 0xb0, 0x28, 0x4e, 0x8c, 0xc6, 0xf1, 0x59, 0x41, 0xff, 0xc3, 0x6d, 0xf7, 0x7d, 0x1e, 0xfa, 0x90, 0xea, 0x8f, 0x8a, 0x6c, 0x5a, 0x37, 0x9e, 0xe6, 0x87, 0x65, 0x36, 0x1a, 0x9a, 0xb4, 0xbe }, + // 175 + { 0x40, 0xf8, 0xbe, 0x21, 0x39, 0xf0, 0xaf, 0xf0, 0x57, 0x1f, 0x68, 0x09, 0xfb, 0x48, 0x1b, 0xf3, 0x2e, 0x5f, 0x03, 0x8f, 0xc5, 0x4c, 0x82, 0x2b, 0x4b, 0x21, 0x29, 0x32, 0xab, 0xbd, 0x6e, 0xc5 }, + // 176 + { 0xf0, 0xed, 0xa1, 0xc5, 0xce, 0xd8, 0x11, 0xaf, 0x5a, 0x0d, 0x84, 0xec, 0x62, 0xb3, 0xb5, 0xa8, 0x6d, 0xb0, 0xaa, 0x94, 0x2f, 0x17, 0x58, 0xd8, 0xe4, 0x87, 0x6b, 0x1c, 0x38, 0xf0, 0x2e, 0x9a }, + // 177 + { 0xf5, 0xc5, 0xc5, 0x22, 0xd1, 0x4a, 0x4c, 0xee, 0xa3, 0xa2, 0x76, 0x4a, 0x88, 0x3e, 0xdb, 0x75, 0xf8, 0x9b, 0x2c, 0xe8, 0xb6, 0xf4, 0xd9, 0x71, 0x95, 0x1d, 0xd2, 0xae, 0x9d, 0x5a, 0x4d, 0x6f }, + // 178 + { 0x0a, 0x73, 0xc7, 0x11, 0x0a, 0x6d, 0xa1, 0x0e, 0x38, 0x70, 0xe5, 0x17, 0x3c, 0x9b, 0x62, 0xe3, 0x49, 0xcf, 0x36, 0xc4, 0xf6, 0x83, 0x3b, 0xab, 0x56, 0xb4, 0xb4, 0x06, 0x49, 0x59, 0x27, 0x85 }, + // 179 + { 0x8c, 0x27, 0xeb, 0xbb, 0xee, 0x4b, 0x48, 0x17, 0x98, 0x5c, 0x0c, 0xd1, 0xf8, 0xc3, 0xaf, 0x72, 0x9a, 0xd0, 0x4d, 0x0e, 0xea, 0xa3, 0x0b, 0xb0, 0x53, 0x3c, 0x5e, 0x41, 0x96, 0x86, 0xde, 0x17 }, + // 180 + { 0x19, 0x4a, 0x23, 0x38, 0x93, 0x23, 0x86, 0x43, 0x5e, 0x45, 0x77, 0x35, 0x0b, 0x1e, 0x8b, 0x7f, 0xe5, 0xfb, 0x4a, 0xa4, 0x2c, 0xf0, 0x59, 0x75, 0x7e, 0x81, 0xd4, 0x90, 0xc7, 0x93, 0x73, 0xbc }, + // 181 + { 0x95, 0xa6, 0xb2, 0x20, 0x6e, 0xa8, 0x75, 0xbd, 0xd5, 0x7c, 0xe0, 0xa6, 0xae, 0x0a, 0x7b, 0x77, 0x24, 0xef, 0xe2, 0x63, 0x5b, 0xdb, 0x21, 0xa3, 0xdf, 0xca, 0x0f, 0xde, 0x23, 0x9c, 0x46, 0x9b }, + // 182 + { 0xbf, 0x80, 0x60, 0xc7, 0x1a, 0xaa, 0xd7, 0x74, 0xd3, 0x56, 0xd5, 0x0f, 0x48, 0x9a, 0x51, 0x84, 0xd3, 0xd2, 0xf7, 0x45, 0x10, 0x53, 0x40, 0xd3, 0x86, 0xe0, 0x9a, 0x25, 0xcf, 0x59, 0xb8, 0xf3 }, + // 183 + { 0x67, 0xbe, 0xcd, 0x70, 0x10, 0x9e, 0x2b, 0x70, 0xee, 0xfd, 0x86, 0xdf, 0x9a, 0x30, 0x72, 0xfd, 0xaa, 0x9b, 0x30, 0xd6, 0x02, 0x7c, 0xdd, 0x84, 0x6f, 0x44, 0x63, 0x28, 0x63, 0xb1, 0xbb, 0x02 }, + // 184 + { 0x07, 0x4a, 0x1b, 0xb9, 0xf3, 0x09, 0x02, 0xeb, 0x65, 0xed, 0xa7, 0x06, 0x62, 0x85, 0x38, 0x1f, 0x92, 0x95, 0x27, 0x3a, 0x17, 0xbc, 0xab, 0xb0, 0x57, 0x8c, 0xc4, 0xca, 0x40, 0x4c, 0xc8, 0x5e }, + // 185 + { 0x0c, 0x52, 0x02, 0x72, 0xc2, 0x5c, 0xa8, 0x70, 0xac, 0x1e, 0x96, 0xe8, 0xc8, 0x0c, 0x2b, 0xc8, 0xa9, 0x59, 0x35, 0x8c, 0xad, 0x72, 0x38, 0xc6, 0xf0, 0xf1, 0x48, 0x92, 0x8e, 0x5a, 0xd3, 0xea }, + // 186 + { 0x86, 0xc8, 0x8c, 0x18, 0x4f, 0xb6, 0x6f, 0xf7, 0xfa, 0x38, 0x9e, 0xa8, 0x1f, 0xfd, 0x15, 0xf4, 0x39, 0x27, 0x6a, 0x3e, 0x46, 0x37, 0x0c, 0x43, 0x94, 0x6a, 0x2d, 0x1d, 0x36, 0xe9, 0x3c, 0xb5 }, + // 187 + { 0x4a, 0xe6, 0x3d, 0x00, 0xe6, 0xda, 0x51, 0xb9, 0xba, 0x7b, 0xdb, 0xf7, 0x09, 0x6b, 0xbc, 0xd2, 0x91, 0xae, 0x94, 0xbd, 0x86, 0xed, 0x69, 0x8d, 0x25, 0x01, 0x33, 0xde, 0x41, 0xa5, 0xd2, 0x1f }, + // 188 + { 0x2d, 0x13, 0x87, 0xa3, 0x00, 0xd7, 0x03, 0x97, 0x77, 0x59, 0x47, 0xe7, 0x1b, 0x76, 0x3d, 0x4a, 0x5d, 0x36, 0x3d, 0x1a, 0xf2, 0x67, 0x61, 0x31, 0x3f, 0x8a, 0xf8, 0x58, 0x25, 0xb4, 0x6b, 0x40 }, + // 189 + { 0xbd, 0x75, 0x4e, 0x74, 0x38, 0xf2, 0xfd, 0x8a, 0xc1, 0x53, 0x70, 0xe7, 0x3f, 0xaf, 0xd5, 0x5c, 0xa3, 0xc7, 0xdc, 0x40, 0xc7, 0x80, 0xe4, 0x58, 0x1f, 0x17, 0x18, 0xb1, 0x30, 0x1b, 0xf6, 0x26 }, + // 190 + { 0xb3, 0x51, 0xfd, 0x0d, 0xc1, 0x44, 0xb7, 0xa2, 0x03, 0xdc, 0xea, 0x73, 0x2b, 0xac, 0xfe, 0xc6, 0xc3, 0x42, 0x53, 0x3f, 0x72, 0x84, 0xf6, 0xbd, 0x49, 0x19, 0xa7, 0x83, 0xb3, 0xe6, 0xdd, 0xbc }, + // 191 + { 0xe3, 0x7b, 0x56, 0xeb, 0x7a, 0x35, 0x87, 0x8c, 0x86, 0xaa, 0x1e, 0x31, 0x5c, 0xe1, 0x6f, 0x13, 0xe6, 0x34, 0xc8, 0xf5, 0x77, 0xd4, 0x96, 0x85, 0xec, 0x5a, 0x2c, 0x91, 0x0f, 0xcd, 0x4a, 0x66 }, + // 192 + { 0xf3, 0xef, 0xf1, 0x7e, 0x9d, 0xc2, 0xdc, 0x16, 0xd7, 0xd9, 0x66, 0xf7, 0x55, 0xfa, 0x24, 0x0f, 0xde, 0x18, 0x98, 0x4e, 0xe5, 0x58, 0x5a, 0x44, 0xa5, 0x86, 0xa4, 0x08, 0xff, 0x2c, 0xd9, 0x26 }, + // 193 + { 0xd2, 0x56, 0x88, 0x56, 0x0a, 0x17, 0x19, 0xe2, 0x1d, 0x0f, 0xad, 0xd5, 0x70, 0xf0, 0xf9, 0x38, 0xca, 0xb5, 0x49, 0x88, 0xdb, 0xff, 0x9f, 0xc8, 0x31, 0xbc, 0xe5, 0x80, 0xbb, 0x8a, 0xb0, 0x3f }, + // 194 + { 0x14, 0xb9, 0x6c, 0x51, 0xb1, 0x55, 0x8b, 0xb1, 0x4b, 0x01, 0x0c, 0x63, 0x66, 0xf0, 0x77, 0x07, 0x07, 0xd1, 0xcd, 0x1f, 0xdb, 0xf0, 0xa1, 0x97, 0x03, 0x8a, 0xe3, 0x6f, 0x22, 0x15, 0x36, 0x3d }, + // 195 + { 0x08, 0x7e, 0x0f, 0xe6, 0xb3, 0x9f, 0x40, 0xcd, 0x85, 0x2d, 0xff, 0x0d, 0xc4, 0xf4, 0x8b, 0x2a, 0xf0, 0x35, 0x23, 0xd1, 0x5e, 0x5b, 0xa0, 0xec, 0xd4, 0x03, 0x9e, 0x20, 0x07, 0x47, 0x9d, 0x5e }, + // 196 + { 0x95, 0x45, 0x53, 0xd2, 0x73, 0x38, 0xae, 0xc7, 0x34, 0xd3, 0x87, 0xe7, 0xba, 0xeb, 0xa5, 0xe7, 0x0d, 0xbd, 0x62, 0xa8, 0xed, 0x5e, 0x91, 0x67, 0x3c, 0x23, 0x42, 0xd5, 0x7c, 0x43, 0x44, 0x1c }, + // 197 + { 0x84, 0xfc, 0x7f, 0x19, 0xd8, 0x72, 0xf9, 0x89, 0xbf, 0xa0, 0x9d, 0x9e, 0x85, 0x03, 0x5e, 0xdb, 0x82, 0x23, 0xfc, 0x13, 0xfd, 0x66, 0x35, 0xcb, 0x7c, 0x47, 0xbb, 0xdd, 0x10, 0xa8, 0x5d, 0x13 }, + // 198 + { 0x23, 0x08, 0x9f, 0x31, 0xc4, 0xaf, 0x0e, 0xe5, 0xc6, 0x98, 0xc3, 0x55, 0x1c, 0x77, 0x59, 0x10, 0x66, 0xc2, 0x3c, 0x27, 0xdd, 0xae, 0xd3, 0x60, 0x0a, 0x3a, 0x92, 0x19, 0xea, 0x93, 0x03, 0x2a }, + // 199 + { 0x31, 0x62, 0x66, 0xb9, 0xc0, 0xf4, 0x5a, 0x25, 0xf5, 0x2d, 0x36, 0x2b, 0x7a, 0xdf, 0xdb, 0x1a, 0xec, 0xd1, 0x04, 0xc2, 0x96, 0xf9, 0x38, 0x04, 0x05, 0x80, 0xff, 0xf7, 0x4a, 0x33, 0xdf, 0x02 }, + // 200 + { 0xae, 0x62, 0x4c, 0x17, 0xfb, 0xd9, 0x62, 0x0b, 0x88, 0x11, 0xf0, 0x2e, 0x1e, 0x4d, 0x00, 0x6c, 0xb8, 0xf0, 0xdc, 0xa5, 0xf9, 0x6a, 0x14, 0xbe, 0xb5, 0xea, 0x13, 0x5d, 0x1d, 0xf5, 0xc9, 0xef }, + // 201 + { 0x3f, 0xa4, 0xe6, 0x42, 0xb7, 0xf6, 0xaa, 0x9f, 0x63, 0x57, 0x16, 0x8d, 0xd7, 0x5f, 0x5e, 0x3e, 0x11, 0x4e, 0x02, 0x6b, 0x46, 0xa3, 0xd7, 0x5d, 0xe2, 0xf3, 0xd5, 0xa0, 0xe2, 0x31, 0x7e, 0x54 }, + // 202 + { 0x68, 0xd3, 0xe6, 0xea, 0x92, 0x83, 0xc6, 0xe4, 0x77, 0x97, 0x9d, 0x32, 0x22, 0xfb, 0x15, 0x31, 0x18, 0x55, 0x33, 0xa8, 0x9f, 0x43, 0x3e, 0xd4, 0x1a, 0x0f, 0xa0, 0xbc, 0xec, 0x9e, 0x0d, 0x15 }, + // 203 + { 0x39, 0xee, 0x8d, 0x4e, 0xab, 0x74, 0x22, 0x24, 0x71, 0x6b, 0x2e, 0x66, 0xc9, 0xf9, 0x85, 0x32, 0xb4, 0x39, 0xb0, 0x27, 0x3c, 0xfd, 0xbe, 0x02, 0x0b, 0xe6, 0x4c, 0x04, 0x87, 0x9e, 0x67, 0x87 }, + // 204 + { 0xda, 0x77, 0x3c, 0x43, 0x56, 0x15, 0xf0, 0x51, 0xa1, 0x37, 0xc2, 0xb1, 0x56, 0x0f, 0x15, 0xc3, 0x63, 0xe8, 0xbc, 0x5a, 0x9b, 0x7b, 0x96, 0x30, 0xb8, 0xad, 0x81, 0x4a, 0x0b, 0x13, 0x24, 0x80 }, + // 205 + { 0xcc, 0xf5, 0x94, 0x15, 0x5a, 0xff, 0x2f, 0xb0, 0xfe, 0x76, 0xf7, 0x15, 0xe6, 0xaa, 0x76, 0x1b, 0x6d, 0xe3, 0x19, 0xd3, 0xcc, 0x52, 0xf9, 0xb3, 0x4a, 0xad, 0x04, 0xdc, 0x41, 0xeb, 0x2f, 0xeb }, + // 206 + { 0x24, 0xcb, 0x9a, 0xda, 0x6c, 0x3b, 0xff, 0x8e, 0x91, 0xc3, 0x98, 0x3b, 0xc5, 0x9d, 0x66, 0xf0, 0x59, 0xb6, 0xe2, 0x4f, 0xe2, 0x5e, 0x57, 0x72, 0xb8, 0x92, 0x90, 0xb5, 0x25, 0x0f, 0x23, 0x2d }, + // 207 + { 0x6d, 0x02, 0xcd, 0x3d, 0x1f, 0xe2, 0xd2, 0xfb, 0xa9, 0x23, 0x27, 0xb3, 0x6b, 0x53, 0x8f, 0x49, 0xa4, 0xb0, 0x47, 0x37, 0x5e, 0xc4, 0x44, 0x77, 0x02, 0x3f, 0xea, 0xdd, 0x40, 0x59, 0xd5, 0x6e }, + // 208 + { 0x4e, 0xf1, 0x9b, 0x67, 0x70, 0x3e, 0xc8, 0xae, 0xa4, 0xbb, 0x73, 0x94, 0xee, 0xca, 0x0d, 0xa2, 0x81, 0x50, 0xad, 0x9b, 0xb3, 0x00, 0x36, 0x38, 0x73, 0x40, 0x63, 0xb5, 0xae, 0x93, 0x21, 0x86 }, + // 209 + { 0x9f, 0x76, 0x1e, 0xce, 0xd1, 0x3c, 0xa4, 0x5a, 0xdd, 0x32, 0x70, 0x3f, 0x76, 0xd9, 0x2a, 0x75, 0xc2, 0x72, 0x2e, 0x5a, 0x4e, 0x87, 0x68, 0xa8, 0x54, 0xcf, 0x87, 0x61, 0xc9, 0x51, 0xc6, 0xc6 }, + // 210 + { 0xef, 0x97, 0x1b, 0x56, 0xa9, 0x79, 0x3c, 0x99, 0x62, 0x17, 0x8c, 0x8d, 0x73, 0x51, 0x9d, 0x2c, 0x98, 0xba, 0x4f, 0x4e, 0x3a, 0x6e, 0xab, 0xc8, 0x6a, 0xc1, 0x71, 0xee, 0xbe, 0x71, 0xc5, 0xd5 }, + // 211 + { 0x58, 0x08, 0x1a, 0x13, 0xe6, 0xe0, 0xc4, 0x97, 0x57, 0x2f, 0xf7, 0xeb, 0x1f, 0xa6, 0x5c, 0x80, 0x32, 0x19, 0x8c, 0x83, 0x44, 0xeb, 0x68, 0x60, 0x6e, 0x3a, 0x61, 0x83, 0xcb, 0x43, 0x63, 0xe0 }, + // 212 + { 0x18, 0xd7, 0x2c, 0xaa, 0x3e, 0xe3, 0x7b, 0x0a, 0x36, 0xaa, 0xd8, 0x35, 0x22, 0x8d, 0x98, 0xa0, 0x3d, 0xcb, 0xf4, 0x82, 0x94, 0xff, 0x65, 0xae, 0x9c, 0xb2, 0xb5, 0xaa, 0x1e, 0x93, 0x53, 0xa8 }, + // 213 + { 0xc3, 0x48, 0x5b, 0xa6, 0xe1, 0x47, 0x01, 0x0d, 0xc3, 0x2c, 0x00, 0xfc, 0x83, 0xf5, 0xd3, 0xa3, 0xdd, 0x0b, 0xc2, 0xea, 0x72, 0x9b, 0xb1, 0x5a, 0x8f, 0x09, 0x6f, 0x48, 0xd9, 0xe6, 0x0c, 0x21 }, + // 214 + { 0x78, 0xdb, 0x66, 0xcd, 0x0c, 0x43, 0x9e, 0xf8, 0xfd, 0x1f, 0xf5, 0x38, 0x33, 0xec, 0x74, 0xf9, 0xf2, 0x79, 0x5c, 0x63, 0xba, 0x73, 0x6b, 0xee, 0xc6, 0xae, 0x2d, 0xa9, 0xf6, 0x3a, 0x18, 0x3f }, + // 215 + { 0xfe, 0x5a, 0xf5, 0xe1, 0x2b, 0xe3, 0xf4, 0x51, 0xab, 0x5d, 0x20, 0x6b, 0xee, 0xbc, 0x83, 0xaf, 0x1a, 0xe7, 0xc9, 0xc1, 0x2f, 0xac, 0xc3, 0x73, 0xc8, 0x49, 0x99, 0x69, 0xc2, 0x34, 0x1e, 0xa1 }, + // 216 + { 0xcc, 0x01, 0x0f, 0xc7, 0xd8, 0x55, 0x19, 0x22, 0x18, 0x90, 0x64, 0xc5, 0x80, 0x5c, 0x4b, 0xd7, 0xee, 0xf0, 0xe1, 0x24, 0xe0, 0x04, 0xf9, 0x09, 0x91, 0x9d, 0xb3, 0x85, 0xd8, 0xbb, 0xa2, 0x83 }, + // 217 + { 0x54, 0xe7, 0x92, 0xcb, 0x3d, 0x39, 0x35, 0xa9, 0x1b, 0x5d, 0xb6, 0xf8, 0x85, 0xf1, 0xc3, 0x4e, 0x3f, 0x71, 0xdf, 0xa4, 0xc6, 0xb6, 0x68, 0xe2, 0xe5, 0x38, 0xc4, 0x0c, 0x0e, 0x1d, 0xa2, 0xe2 }, + // 218 + { 0x96, 0x63, 0x15, 0x3b, 0xe2, 0x52, 0x03, 0xa7, 0xf2, 0xc1, 0x17, 0x9a, 0x38, 0x74, 0xc7, 0x62, 0x42, 0x77, 0x4e, 0xf4, 0x4b, 0xce, 0x90, 0x51, 0x1d, 0x1d, 0x78, 0x42, 0xf7, 0xde, 0x58, 0xab }, + // 219 + { 0xfa, 0x78, 0x6d, 0x04, 0x8c, 0x43, 0xde, 0xbc, 0xf5, 0x54, 0xb8, 0x53, 0xce, 0x5d, 0xc7, 0x97, 0xb0, 0x20, 0xa2, 0x4b, 0x88, 0x8c, 0xa9, 0x79, 0x33, 0x7e, 0xfa, 0xb4, 0x73, 0xef, 0x86, 0xdf }, + // 220 + { 0xe9, 0x83, 0x25, 0x91, 0xbc, 0x85, 0x0d, 0xe9, 0x9a, 0xc1, 0x24, 0x9f, 0xd7, 0xc8, 0x93, 0x63, 0xcf, 0x44, 0x4e, 0xce, 0xe7, 0xcb, 0xf3, 0xa8, 0x91, 0x92, 0xd9, 0xa1, 0xb4, 0xae, 0xa0, 0xbd }, + // 221 + { 0x10, 0xa9, 0x4e, 0x35, 0x03, 0xcc, 0xe7, 0x67, 0x75, 0x74, 0x1c, 0x2a, 0x82, 0xaf, 0x43, 0xee, 0x06, 0x42, 0x20, 0x75, 0xc5, 0xb3, 0xb6, 0x51, 0xe4, 0x2d, 0xe8, 0xd8, 0x2f, 0xc5, 0xc9, 0x38 }, + // 222 + { 0xc9, 0x7a, 0x23, 0x5d, 0xe0, 0xb6, 0x21, 0x5c, 0xdf, 0xd9, 0xb5, 0xff, 0xe7, 0xad, 0x45, 0x77, 0x55, 0x30, 0xb7, 0x18, 0xcb, 0x54, 0x89, 0xa3, 0x61, 0x88, 0x83, 0x26, 0x83, 0x3c, 0xac, 0x13 }, + // 223 + { 0xe5, 0x6f, 0x66, 0x7d, 0xb8, 0xc7, 0xd2, 0x71, 0xda, 0x7c, 0x0f, 0x11, 0xd2, 0xc7, 0x5b, 0xc7, 0x06, 0xbe, 0xd2, 0xb2, 0xf8, 0x66, 0x1a, 0x1f, 0xb6, 0xf2, 0x9d, 0xeb, 0x78, 0xc2, 0xcd, 0x5f }, + // 224 + { 0xe0, 0xdc, 0xa7, 0xc4, 0x48, 0xe4, 0x6a, 0x50, 0x6b, 0x16, 0x75, 0x06, 0x41, 0x46, 0x89, 0xef, 0x2d, 0xc8, 0x50, 0xd2, 0xee, 0x0b, 0x57, 0x67, 0xdb, 0x7a, 0xeb, 0xa6, 0xcf, 0xb9, 0xe8, 0x50 }, + // 225 + { 0x81, 0xef, 0x43, 0x64, 0x2d, 0xf9, 0x2f, 0x91, 0xa0, 0x51, 0xf0, 0xa4, 0x9d, 0xe5, 0x65, 0x31, 0x9a, 0xaa, 0x03, 0x50, 0x13, 0x44, 0xaf, 0x3c, 0xd0, 0x51, 0x83, 0x40, 0xa4, 0x76, 0x99, 0x75 }, + // 226 + { 0xb1, 0x1c, 0x25, 0xc1, 0x85, 0x08, 0xdb, 0x61, 0x7e, 0x00, 0x7f, 0xd6, 0xda, 0x1f, 0x52, 0x6a, 0x8a, 0x4c, 0x35, 0x1b, 0xa7, 0x8a, 0x09, 0xcf, 0xc0, 0xbf, 0xd1, 0x75, 0xc2, 0x4d, 0xbb, 0xc9 }, + // 227 + { 0x65, 0x7d, 0xc9, 0x98, 0x1d, 0xc1, 0x6f, 0xca, 0x11, 0x70, 0xed, 0x35, 0xa5, 0xb2, 0x7e, 0x96, 0x0c, 0x53, 0x95, 0x52, 0x1d, 0x7d, 0x9d, 0xf3, 0x25, 0x57, 0x63, 0xe2, 0xfb, 0xf2, 0x2a, 0xd7 }, + // 228 + { 0x29, 0x34, 0xc5, 0xf6, 0xe7, 0x1f, 0x6e, 0x39, 0x04, 0x81, 0x88, 0x39, 0x27, 0xa0, 0xd9, 0xd6, 0xeb, 0x93, 0xc5, 0xba, 0xd4, 0xf1, 0xa5, 0xff, 0x5b, 0x09, 0x7c, 0xff, 0x5e, 0x08, 0x1d, 0x67 }, + // 229 + { 0x1b, 0xc4, 0x7f, 0xac, 0xbd, 0x45, 0xfd, 0x59, 0xc7, 0x00, 0x31, 0x94, 0x96, 0xa0, 0x23, 0x14, 0xf3, 0x8a, 0xef, 0x86, 0xb9, 0x1c, 0x37, 0xac, 0x47, 0xbc, 0x7d, 0x2a, 0x17, 0xcc, 0x2a, 0x0f }, + // 230 + { 0x7c, 0x04, 0x49, 0xae, 0xe6, 0x69, 0x06, 0x44, 0xeb, 0x9a, 0x67, 0x3e, 0xda, 0x8d, 0xfa, 0xd6, 0x5d, 0x1f, 0xef, 0x8d, 0xab, 0x2c, 0xc4, 0x1d, 0x8e, 0x52, 0xe6, 0xf7, 0xaa, 0xbd, 0xda, 0x36 }, + // 231 + { 0x19, 0x75, 0x61, 0xfb, 0x26, 0x0b, 0x09, 0xfd, 0x29, 0xe7, 0x74, 0x44, 0x42, 0x27, 0x40, 0xa5, 0xfa, 0x8d, 0x17, 0xbc, 0xf6, 0x0a, 0x34, 0xd7, 0x4b, 0x63, 0x49, 0x2d, 0xc3, 0xd4, 0x54, 0x14 }, + // 232 + { 0xc9, 0xf0, 0xed, 0x80, 0x1e, 0xfc, 0xd0, 0x01, 0xf0, 0x0b, 0xcc, 0x4e, 0xd2, 0xff, 0x2e, 0x76, 0xfb, 0xd6, 0xac, 0x91, 0xd3, 0x89, 0x92, 0x0d, 0xab, 0x9e, 0x12, 0xd5, 0xeb, 0x63, 0x60, 0x18 }, + // 233 + { 0x46, 0x5e, 0x55, 0x03, 0x02, 0x92, 0xd0, 0x21, 0x53, 0xbf, 0xe3, 0xc5, 0x2f, 0x67, 0x36, 0x91, 0x27, 0xd8, 0xae, 0xc5, 0xb5, 0x77, 0x8a, 0x0b, 0x06, 0x43, 0x00, 0x08, 0xbb, 0xa0, 0xc5, 0xda }, + // 234 + { 0x0e, 0x44, 0x3f, 0x10, 0x30, 0xdc, 0xbc, 0x18, 0xd8, 0xf2, 0x99, 0x7a, 0xe2, 0x1d, 0x29, 0xe8, 0x91, 0xd0, 0x48, 0x7a, 0x79, 0x09, 0x89, 0x67, 0x72, 0x9e, 0xd3, 0xe5, 0xef, 0x61, 0x93, 0xfe }, + // 235 + { 0x61, 0xda, 0xf8, 0x42, 0x13, 0xc2, 0xe7, 0xa5, 0x5f, 0x8d, 0xbb, 0xcd, 0x3c, 0x87, 0x23, 0xf6, 0xef, 0xdc, 0x7e, 0x81, 0xfc, 0x8b, 0x79, 0x8a, 0xcc, 0x4c, 0xa5, 0xc8, 0x25, 0xf9, 0x1c, 0x6d }, + // 236 + { 0x2c, 0x1b, 0x5b, 0x64, 0xe9, 0x9a, 0x37, 0xee, 0x1c, 0xa8, 0xdc, 0xd4, 0x49, 0xa4, 0x77, 0x88, 0x29, 0x60, 0x88, 0x74, 0xaf, 0xae, 0x35, 0x2a, 0xe9, 0xa3, 0xb0, 0xaa, 0xfb, 0xab, 0x2b, 0x65 }, + // 237 + { 0x68, 0x4f, 0xca, 0x80, 0x09, 0x53, 0x1a, 0x9d, 0xa1, 0xed, 0x81, 0xb3, 0xda, 0x96, 0xa3, 0x9e, 0x86, 0x2f, 0x1a, 0xd7, 0x31, 0x0e, 0x18, 0xf5, 0xf9, 0x60, 0xc5, 0xb0, 0xff, 0xd6, 0x36, 0x5d }, + // 238 + { 0xda, 0x78, 0x5f, 0x50, 0x37, 0xe5, 0x91, 0x89, 0x72, 0x90, 0xec, 0x30, 0x6e, 0x5b, 0x5c, 0x3a, 0xd7, 0x1a, 0x68, 0x7f, 0x58, 0xd7, 0x2e, 0xe9, 0xb0, 0xa1, 0xfb, 0x92, 0xe8, 0xf6, 0xfa, 0xb6 }, + // 239 + { 0xa9, 0xc5, 0xc7, 0x66, 0x49, 0x0a, 0xaf, 0xd6, 0x2e, 0x4d, 0x28, 0x14, 0x82, 0x85, 0xcf, 0x91, 0x41, 0x82, 0xbc, 0x78, 0x33, 0x13, 0x90, 0xf8, 0xd1, 0x2a, 0xa2, 0xe2, 0xcd, 0xcf, 0xe2, 0x85 }, + // 240 + { 0x24, 0x91, 0xdd, 0xa5, 0xef, 0x34, 0x97, 0xf3, 0x17, 0x2d, 0x9a, 0xd6, 0xb9, 0x43, 0x38, 0xdd, 0x9b, 0x00, 0x33, 0x30, 0xeb, 0xdc, 0xf3, 0xd2, 0xd2, 0xef, 0x93, 0x4b, 0x56, 0x87, 0x2a, 0xc2 }, + // 241 + { 0x77, 0x5a, 0xc5, 0x10, 0x4a, 0x23, 0x49, 0x57, 0xa5, 0xd9, 0x5b, 0x3f, 0x6a, 0x66, 0xc9, 0x55, 0x4c, 0x72, 0xeb, 0xb8, 0x1d, 0x79, 0x05, 0xe0, 0x22, 0x97, 0x5d, 0x1c, 0xea, 0x4b, 0xfb, 0x1b }, + // 242 + { 0x5d, 0x53, 0x12, 0x8c, 0xa0, 0x64, 0x60, 0x6e, 0xb9, 0x5a, 0x49, 0x6d, 0x67, 0x4b, 0x20, 0x5c, 0x23, 0xa3, 0x07, 0xcc, 0x0d, 0x49, 0xf0, 0x2e, 0xfc, 0xc3, 0x00, 0xcd, 0x5c, 0x74, 0xac, 0x38 }, + // 243 + { 0x30, 0x4f, 0xa6, 0xbc, 0x45, 0x5d, 0xee, 0x95, 0x77, 0xca, 0x55, 0x5d, 0xe5, 0x5c, 0xf0, 0xeb, 0xd9, 0x38, 0xaf, 0xbe, 0xed, 0x8e, 0x7e, 0xd8, 0x57, 0x2a, 0xb7, 0x07, 0xff, 0x4e, 0x56, 0x23 }, + // 244 + { 0xa8, 0x7c, 0xca, 0x54, 0x3b, 0xcc, 0xe9, 0x80, 0xac, 0xce, 0x17, 0x62, 0x00, 0xd2, 0xc1, 0x71, 0x95, 0xc0, 0xc9, 0x0c, 0xd5, 0x0b, 0xaf, 0x0a, 0x46, 0x99, 0xc8, 0xc4, 0x5a, 0xb1, 0x18, 0x20 }, + // 245 + { 0x5c, 0xd2, 0x7f, 0x0e, 0x3b, 0x80, 0xeb, 0x1a, 0xcd, 0x65, 0x14, 0xd5, 0x4e, 0x03, 0x95, 0x40, 0x99, 0x52, 0xd2, 0xe1, 0xed, 0xf9, 0xb1, 0x88, 0x11, 0x37, 0xed, 0x01, 0x47, 0xa9, 0xa1, 0xc1 }, + // 246 + { 0xc2, 0x44, 0xcd, 0xe0, 0x2f, 0x02, 0x12, 0xf0, 0xb6, 0x37, 0x9a, 0x91, 0x23, 0x16, 0x77, 0x36, 0x7d, 0x6c, 0xfd, 0xaf, 0x25, 0x60, 0xd5, 0x98, 0x63, 0xa1, 0x85, 0xf8, 0xaf, 0x3d, 0x56, 0x7b }, + // 247 + { 0xa7, 0x87, 0x64, 0x76, 0x7e, 0xda, 0x2b, 0xd4, 0xac, 0x8c, 0xd5, 0x91, 0xa0, 0xf9, 0xf2, 0xf2, 0x41, 0x83, 0x38, 0xda, 0xa9, 0x63, 0xe3, 0x91, 0xe0, 0x34, 0xfd, 0x87, 0xbe, 0xf5, 0x39, 0x58 }, + // 248 + { 0x4f, 0x8f, 0x58, 0xd9, 0xa4, 0xe8, 0xbf, 0x0a, 0x23, 0x48, 0x0c, 0xc0, 0x06, 0x0a, 0x54, 0x82, 0x2d, 0x04, 0x78, 0xd2, 0x63, 0x13, 0x9b, 0x75, 0x3d, 0x47, 0x41, 0xd1, 0xe6, 0x65, 0xfe, 0xb7 }, + // 249 + { 0xb8, 0x5f, 0xd3, 0x4e, 0x1c, 0x1a, 0x8c, 0x06, 0x9b, 0x47, 0x4d, 0x67, 0x06, 0xbe, 0x56, 0xe5, 0xfd, 0x66, 0xe4, 0x7a, 0x31, 0x6d, 0x4f, 0x05, 0x20, 0xf4, 0x4a, 0x6a, 0xc4, 0xf8, 0x69, 0x88 }, + // 250 + { 0x03, 0xe6, 0x91, 0x51, 0x38, 0xa2, 0x2f, 0x5a, 0x97, 0x0b, 0x2c, 0xdb, 0xa5, 0x0a, 0x55, 0x17, 0x19, 0xf9, 0x13, 0x6f, 0x1c, 0x18, 0xc4, 0xce, 0x2b, 0x73, 0x8e, 0x2a, 0xe1, 0x86, 0x8b, 0xee }, + // 251 + { 0xd3, 0xed, 0xa9, 0xd6, 0xdc, 0x8b, 0xe0, 0xad, 0xb5, 0x13, 0x43, 0xb8, 0xb3, 0x00, 0x3d, 0xb5, 0x9c, 0xb0, 0x28, 0x4b, 0xbc, 0x50, 0x4e, 0x74, 0xbf, 0xf3, 0xc0, 0x49, 0x63, 0x6a, 0x0b, 0xb7 }, + // 252 + { 0x21, 0x13, 0x71, 0x98, 0xb5, 0x06, 0x06, 0x03, 0x22, 0x4a, 0x74, 0x94, 0x9b, 0x1d, 0x42, 0x91, 0x32, 0x13, 0xb2, 0xb6, 0x49, 0xb2, 0x8a, 0xaf, 0xb8, 0xc0, 0xca, 0x18, 0xe2, 0x7f, 0x94, 0xf0 }, + // 253 + { 0xd5, 0x25, 0x71, 0x5b, 0x56, 0xa6, 0xc3, 0xb6, 0x8d, 0xd6, 0xb9, 0xf3, 0x13, 0x1e, 0x41, 0x2d, 0xfb, 0x1f, 0x83, 0x20, 0xd1, 0x3f, 0x47, 0x30, 0x72, 0xc7, 0xa2, 0xf7, 0x23, 0xc3, 0xad, 0x08 }, + // 254 + { 0x87, 0x1a, 0x9e, 0x83, 0x8a, 0xbd, 0x11, 0x24, 0x22, 0xa5, 0x20, 0x1f, 0x6c, 0x5b, 0xb8, 0x53, 0x6a, 0x57, 0x57, 0x1a, 0x5c, 0xc2, 0x61, 0x1e, 0x5f, 0x03, 0x53, 0x2b, 0x81, 0xaf, 0x4b, 0x92 }, + // 255 + { 0xeb, 0xe8, 0x11, 0x0a, 0x3d, 0x2d, 0x07, 0x4b, 0x85, 0x49, 0x56, 0x76, 0xbb, 0x0d, 0x98, 0x16, 0x16, 0x07, 0xb5, 0x5d, 0xb6, 0x19, 0x15, 0x40, 0xfe, 0x4d, 0x53, 0x5a, 0xc3, 0x8a, 0xaf, 0xb1 }, +}; diff --git a/lib/tst/blake2s_selftest.cc b/lib/tst/blake2s_selftest.cc new file mode 100644 index 0000000..58199f6 --- /dev/null +++ b/lib/tst/blake2s_selftest.cc @@ -0,0 +1,117 @@ +// Self test Modules for BLAKE2s +#include + +#include "../blake2/blake2s.c" +#include "blake2s_kat.h" + +static_assert(sizeof(BLAKE2s_param) == (8 * sizeof(uint32_t)), "sizeof struct BLAKE2s_param"); + +// Deterministic sequences (Fibonacci generator). +static void +selftest_seq(uint8_t *out, size_t len, uint32_t seed) +{ + size_t i; + uint32_t t, a, b; + + a = 0xDEAD4BAD * seed; // prime + b = 1; + + for (i = 0; i < len; i++) { // fill the buf + t = a + b; + a = b; + b = t; + out[i] = (t >> 24) & 0xFF; + } +} + +// BLAKE2s self-test validation. Return 0 when OK. +int +blake2s_selftest() +{ + // Grand hash of hash results. + const uint8_t blake2s_res[32] = {0x6A, 0x41, 0x1F, 0x08, 0xCE, 0x25, 0xAD, 0xCD, 0xFB, 0x02, 0xAB, + 0xA6, 0x41, 0x45, 0x1C, 0xEC, 0x53, 0xC5, 0x98, 0xB2, 0x4F, 0x4F, + 0xC7, 0x87, 0xFB, 0xDC, 0x88, 0x79, 0x7F, 0x4C, 0x1D, 0xFE}; + // Parameter sets. + const size_t b2s_md_len[4] = {16, 20, 28, 32}; + const size_t b2s_in_len[6] = {0, 3, 64, 65, 255, 1024}; + + size_t i, j, outlen, inlen; + uint8_t in[1024], md[32], key[32]; + struct BLAKE2s_ctx ctx; + + // 256-bit hash for testing. + if (BLAKE2s_init(&ctx, 32, NULL, 0)) return -1; + + for (i = 0; i < 4; i++) { + outlen = b2s_md_len[i]; + for (j = 0; j < 6; j++) { + inlen = b2s_in_len[j]; + + selftest_seq(in, inlen, inlen); // unkeyed hash + BLAKE2s(md, outlen, NULL, 0, in, inlen); + BLAKE2s_update(&ctx, md, outlen); // hash the hash + + selftest_seq(key, outlen, outlen); // keyed hash + BLAKE2s(md, outlen, key, outlen, in, inlen); + BLAKE2s_update(&ctx, md, outlen); // hash the hash + } + } + + // Compute and compare the hash of hashes. + BLAKE2s_final(&ctx, md); + for (i = 0; i < 32; i++) { + if (md[i] != blake2s_res[i]) return -1; + } + + return 0; +} + +TEST(blake2s, rotr_u32) +{ + EXPECT_EQ(rotr_u32(0xdecafade, 16), 0xfadedeca); + EXPECT_EQ(rotr_u32(0xdecafade, 8), 0xdedecafa); +} + +TEST(blake2s, selftest) { EXPECT_EQ(blake2s_selftest(), 0); } + +TEST(blake2s, selftestAllInOne) +{ + const char *in = "abc"; + size_t inlen = 3; + + uint8_t out[32]; + BLAKE2s(out, 32, NULL, 0, in, inlen); + + const uint8_t blake2s_res[32] = {0x50, 0x8C, 0x5E, 0x8C, 0x32, 0x7C, 0x14, 0xE2, 0xE1, 0xA7, 0x2B, + 0xA3, 0x4E, 0xEB, 0x45, 0x2F, 0x37, 0x45, 0x8B, 0x20, 0x9E, 0xD6, + 0x3A, 0x29, 0x4D, 0x99, 0x9B, 0x4C, 0x86, 0x67, 0x59, 0x82}; + + for (unsigned i = 0; i < 32; i++) { + EXPECT_EQ(out[i], blake2s_res[i]) << "position=" << i; + } +} + +TEST(blake2s, KnownAnswerTest) +{ + uint8_t in[256]; + for (int i = 0; i < 256; ++i) in[i] = i; + uint8_t out[32]; + + for (unsigned i = 0; i < KATs_len; ++i) { + EXPECT_EQ(BLAKE2s(out, 32, NULL, 0, in, i), 0); + for (unsigned j = 0; j < 32; ++j) EXPECT_EQ(out[j], KATs[i][j]) << "on test=" << i << " pos=" << j; + } +} + +TEST(blake2s, KnownAnswerTestKeyed) +{ + uint8_t in[256]; + for (int i = 0; i < 256; ++i) in[i] = i; + uint8_t out[32]; + + for (unsigned i = 0; i < KATs_len; ++i) { + EXPECT_EQ(BLAKE2s(out, 32, KAT_secret, 32, in, i), 0); + for (unsigned j = 0; j < 32; ++j) EXPECT_EQ(out[j], secret_KATs[i][j]) << "on test=" << i << " pos=" << j; + } +} diff --git a/lib/tst/endian_little.cc b/lib/tst/endian_little.cc new file mode 100644 index 0000000..f28e0e6 --- /dev/null +++ b/lib/tst/endian_little.cc @@ -0,0 +1,38 @@ +#include +#include + +namespace libk { +#include "../endian/little.c" +} // namespace libk + +TEST(endian_little, htole16) +{ + EXPECT_EQ(static_cast(0xabcd), libk::htole16(0xabcd)); + EXPECT_EQ(libk::htole16(0xabcd), htole16(0xabcd)); +} +TEST(endian_little, htole32) +{ + EXPECT_EQ(static_cast(0xabcd0123), libk::htole32(0xabcd0123)); + EXPECT_EQ(libk::htole32(0xabcd0123), htole32(0xabcd0123)); +} +TEST(endian_little, htole64) +{ + EXPECT_EQ(static_cast(0x0123456789abcdef), libk::htole64(0x0123456789abcdef)); + EXPECT_EQ(libk::htole64(0xabcdef0123456789), htole64(0xabcdef0123456789)); +} + +TEST(endian_little, htobe16) +{ + EXPECT_EQ(static_cast(0xabcd), libk::htobe16(0xcdab)); + EXPECT_EQ(libk::htobe16(0xabcd), htobe16(0xabcd)); +} +TEST(endian_little, htobe32) +{ + EXPECT_EQ(static_cast(0xabcd0123), libk::htobe32(0x2301cdab)); + EXPECT_EQ(libk::htobe32(0xabcd0123), htobe32(0xabcd0123)); +} +TEST(endian_little, htobe64) +{ + EXPECT_EQ(static_cast(0x0123456789abcdef), libk::htobe64(0xefcdab8967452301)); + EXPECT_EQ(libk::htobe64(0xabcdef0123456789), htobe64(0xabcdef0123456789)); +} diff --git a/rules.mk b/rules.mk index eebc8b0..333e4f8 100644 --- a/rules.mk +++ b/rules.mk @@ -6,8 +6,10 @@ $(foreach V,$(filter %.SRCS, ${.VARIABLES}),\ ) # extra flags -CFLAGS += -isysteminclude -I../lib -CXXFLAGS += -isysteminclude -I../lib -Drestrict=__restrict__ +CFLAGS += -isysteminclude -I../lib \ + -Werror=implicit-function-declaration +CXXFLAGS += -isysteminclude -I../lib -Drestrict=__restrict__ \ + -Werror=shadow # Suffix rules %.a: -- cgit v1.2.1