diff options
-rw-r--r-- | doc/manual/hash.rst | 1 | ||||
-rw-r--r-- | news.rst | 2 | ||||
-rw-r--r-- | src/build-data/policy/bsi.txt | 1 | ||||
-rw-r--r-- | src/build-data/policy/nist.txt | 1 | ||||
-rw-r--r-- | src/lib/hash/hash.cpp | 11 | ||||
-rw-r--r-- | src/lib/hash/sm3/info.txt | 7 | ||||
-rw-r--r-- | src/lib/hash/sm3/sm3.cpp | 269 | ||||
-rw-r--r-- | src/lib/hash/sm3/sm3.h | 47 | ||||
-rw-r--r-- | src/tests/data/hash/sm3.vec | 423 |
9 files changed, 762 insertions, 0 deletions
diff --git a/doc/manual/hash.rst b/doc/manual/hash.rst index f4edc7a4e..605013e87 100644 --- a/doc/manual/hash.rst +++ b/doc/manual/hash.rst @@ -59,6 +59,7 @@ Botan implements the following hash algorithms: - SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512-256) - SHA-3 - SHAKE (SHAKE-128, SHAKE-256) + - SM3 - Skein-512 - Tiger - Whirlpool @@ -116,6 +116,8 @@ Version 1.10.16, 2017-04-04 * Avoid throwing during a destructor since this is undefined in C++11 and rarely a good idea. (GH #930) +* Add the SM3 hash function + Version 1.10.15, 2017-01-12 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/build-data/policy/bsi.txt b/src/build-data/policy/bsi.txt index b3b0e43c2..ae722d4c1 100644 --- a/src/build-data/policy/bsi.txt +++ b/src/build-data/policy/bsi.txt @@ -146,6 +146,7 @@ rmd160 #sha1_sse2 // needed for tls shake skein +sm3 tiger whirlpool keccak diff --git a/src/build-data/policy/nist.txt b/src/build-data/policy/nist.txt index 0a14dc8a4..447d77b6c 100644 --- a/src/build-data/policy/nist.txt +++ b/src/build-data/policy/nist.txt @@ -139,6 +139,7 @@ rmd160 #sha1 // needed for tls #sha1_sse2 // needed for tls skein +sm3 tiger whirlpool diff --git a/src/lib/hash/hash.cpp b/src/lib/hash/hash.cpp index 112554127..c8dd58a66 100644 --- a/src/lib/hash/hash.cpp +++ b/src/lib/hash/hash.cpp @@ -64,6 +64,10 @@ #include <botan/skein_512.h> #endif +#if defined(BOTAN_HAS_SM3) + #include <botan/sm3.h> +#endif + #if defined(BOTAN_HAS_TIGER) #include <botan/tiger.h> #endif @@ -257,6 +261,13 @@ std::unique_ptr<HashFunction> HashFunction::create(const std::string& algo_spec, } #endif +#if defined(BOTAN_HAS_SM3) + if(algo_spec == "SM3") + { + return std::unique_ptr<HashFunction>(new SM3); + } +#endif + #if defined(BOTAN_HAS_WHIRLPOOL) if(req.algo_name() == "Whirlpool") { diff --git a/src/lib/hash/sm3/info.txt b/src/lib/hash/sm3/info.txt new file mode 100644 index 000000000..e591a6ce0 --- /dev/null +++ b/src/lib/hash/sm3/info.txt @@ -0,0 +1,7 @@ +<defines> +SM3 -> 20170402 +</defines> + +<requires> +mdx_hash +</requires> diff --git a/src/lib/hash/sm3/sm3.cpp b/src/lib/hash/sm3/sm3.cpp new file mode 100644 index 000000000..a64a9a5e7 --- /dev/null +++ b/src/lib/hash/sm3/sm3.cpp @@ -0,0 +1,269 @@ +/* +* SM3 +* (C) 2017 Ribose Inc. +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#include <botan/sm3.h> + +namespace Botan { + +namespace { + +const uint32_t SM3_IV[] = { + 0x7380166fUL, 0x4914b2b9UL, 0x172442d7UL, 0xda8a0600UL, + 0xa96f30bcUL, 0x163138aaUL, 0xe38dee4dUL, 0xb0fb0e4eUL +}; + +const uint32_t SM3_TJ_0_15 = 0x79cc4519; +const uint32_t SM3_TJ_16_63 = 0x7a879d8a; + +inline uint32_t P0(uint32_t X) + { + return X ^ rotate_left(X, 9) ^ rotate_left(X, 17); + } + +inline uint32_t P1(uint32_t X) + { + return X ^ rotate_left(X, 15) ^ rotate_left(X, 23); + } + +inline uint32_t FF0(uint32_t X, uint32_t Y, uint32_t Z) + { + return X ^ Y ^ Z; + } + +inline uint32_t FF1(uint32_t X, uint32_t Y, uint32_t Z) + { + return (X & Y) | (X & Z) | (Y & Z); + } + +inline uint32_t GG0(uint32_t X, uint32_t Y, uint32_t Z) + { + return X ^ Y ^ Z; + } + +inline uint32_t GG1(uint32_t X, uint32_t Y, uint32_t Z) + { + return (X & Y) | (~X & Z); + } + +} + +/* +* SM3 Compression Function +*/ +void SM3::compress_n(const uint8_t input[], size_t blocks) + { + uint32_t A = m_digest[0], B = m_digest[1], C = m_digest[2], D = m_digest[3], + E = m_digest[4], F = m_digest[5], G = m_digest[6], H = m_digest[7]; + uint32_t W[68], W1[64]; + uint32_t SS1, SS2, TT1, TT2, T[64]; + + for(size_t i = 0; i != blocks; ++i) + { + + // Message Extension (a) + W[ 0] = load_be<uint32_t>(input, 0); + W[ 1] = load_be<uint32_t>(input, 1); + W[ 2] = load_be<uint32_t>(input, 2); + W[ 3] = load_be<uint32_t>(input, 3); + W[ 4] = load_be<uint32_t>(input, 4); + W[ 5] = load_be<uint32_t>(input, 5); + W[ 6] = load_be<uint32_t>(input, 6); + W[ 7] = load_be<uint32_t>(input, 7); + W[ 8] = load_be<uint32_t>(input, 8); + W[ 9] = load_be<uint32_t>(input, 9); + W[10] = load_be<uint32_t>(input, 10); + W[11] = load_be<uint32_t>(input, 11); + W[12] = load_be<uint32_t>(input, 12); + W[13] = load_be<uint32_t>(input, 13); + W[14] = load_be<uint32_t>(input, 14); + W[15] = load_be<uint32_t>(input, 15); + + // Message Extension (b) + W[16] = P1(W[ 0] ^ W[ 7] ^ rotate_left(W[13], 15)) ^ rotate_left(W[ 3], 7) ^ W[10]; + W[17] = P1(W[ 1] ^ W[ 8] ^ rotate_left(W[14], 15)) ^ rotate_left(W[ 4], 7) ^ W[11]; + W[18] = P1(W[ 2] ^ W[ 9] ^ rotate_left(W[15], 15)) ^ rotate_left(W[ 5], 7) ^ W[12]; + W[19] = P1(W[ 3] ^ W[10] ^ rotate_left(W[16], 15)) ^ rotate_left(W[ 6], 7) ^ W[13]; + W[20] = P1(W[ 4] ^ W[11] ^ rotate_left(W[17], 15)) ^ rotate_left(W[ 7], 7) ^ W[14]; + W[21] = P1(W[ 5] ^ W[12] ^ rotate_left(W[18], 15)) ^ rotate_left(W[ 8], 7) ^ W[15]; + W[22] = P1(W[ 6] ^ W[13] ^ rotate_left(W[19], 15)) ^ rotate_left(W[ 9], 7) ^ W[16]; + W[23] = P1(W[ 7] ^ W[14] ^ rotate_left(W[20], 15)) ^ rotate_left(W[10], 7) ^ W[17]; + W[24] = P1(W[ 8] ^ W[15] ^ rotate_left(W[21], 15)) ^ rotate_left(W[11], 7) ^ W[18]; + W[25] = P1(W[ 9] ^ W[16] ^ rotate_left(W[22], 15)) ^ rotate_left(W[12], 7) ^ W[19]; + W[26] = P1(W[10] ^ W[17] ^ rotate_left(W[23], 15)) ^ rotate_left(W[13], 7) ^ W[20]; + W[27] = P1(W[11] ^ W[18] ^ rotate_left(W[24], 15)) ^ rotate_left(W[14], 7) ^ W[21]; + W[28] = P1(W[12] ^ W[19] ^ rotate_left(W[25], 15)) ^ rotate_left(W[15], 7) ^ W[22]; + W[29] = P1(W[13] ^ W[20] ^ rotate_left(W[26], 15)) ^ rotate_left(W[16], 7) ^ W[23]; + W[30] = P1(W[14] ^ W[21] ^ rotate_left(W[27], 15)) ^ rotate_left(W[17], 7) ^ W[24]; + W[31] = P1(W[15] ^ W[22] ^ rotate_left(W[28], 15)) ^ rotate_left(W[18], 7) ^ W[25]; + W[32] = P1(W[16] ^ W[23] ^ rotate_left(W[29], 15)) ^ rotate_left(W[19], 7) ^ W[26]; + W[33] = P1(W[17] ^ W[24] ^ rotate_left(W[30], 15)) ^ rotate_left(W[20], 7) ^ W[27]; + W[34] = P1(W[18] ^ W[25] ^ rotate_left(W[31], 15)) ^ rotate_left(W[21], 7) ^ W[28]; + W[35] = P1(W[19] ^ W[26] ^ rotate_left(W[32], 15)) ^ rotate_left(W[22], 7) ^ W[29]; + W[36] = P1(W[20] ^ W[27] ^ rotate_left(W[33], 15)) ^ rotate_left(W[23], 7) ^ W[30]; + W[37] = P1(W[21] ^ W[28] ^ rotate_left(W[34], 15)) ^ rotate_left(W[24], 7) ^ W[31]; + W[38] = P1(W[22] ^ W[29] ^ rotate_left(W[35], 15)) ^ rotate_left(W[25], 7) ^ W[32]; + W[39] = P1(W[23] ^ W[30] ^ rotate_left(W[36], 15)) ^ rotate_left(W[26], 7) ^ W[33]; + W[40] = P1(W[24] ^ W[31] ^ rotate_left(W[37], 15)) ^ rotate_left(W[27], 7) ^ W[34]; + W[41] = P1(W[25] ^ W[32] ^ rotate_left(W[38], 15)) ^ rotate_left(W[28], 7) ^ W[35]; + W[42] = P1(W[26] ^ W[33] ^ rotate_left(W[39], 15)) ^ rotate_left(W[29], 7) ^ W[36]; + W[43] = P1(W[27] ^ W[34] ^ rotate_left(W[40], 15)) ^ rotate_left(W[30], 7) ^ W[37]; + W[44] = P1(W[28] ^ W[35] ^ rotate_left(W[41], 15)) ^ rotate_left(W[31], 7) ^ W[38]; + W[45] = P1(W[29] ^ W[36] ^ rotate_left(W[42], 15)) ^ rotate_left(W[32], 7) ^ W[39]; + W[46] = P1(W[30] ^ W[37] ^ rotate_left(W[43], 15)) ^ rotate_left(W[33], 7) ^ W[40]; + W[47] = P1(W[31] ^ W[38] ^ rotate_left(W[44], 15)) ^ rotate_left(W[34], 7) ^ W[41]; + W[48] = P1(W[32] ^ W[39] ^ rotate_left(W[45], 15)) ^ rotate_left(W[35], 7) ^ W[42]; + W[49] = P1(W[33] ^ W[40] ^ rotate_left(W[46], 15)) ^ rotate_left(W[36], 7) ^ W[43]; + W[50] = P1(W[34] ^ W[41] ^ rotate_left(W[47], 15)) ^ rotate_left(W[37], 7) ^ W[44]; + W[51] = P1(W[35] ^ W[42] ^ rotate_left(W[48], 15)) ^ rotate_left(W[38], 7) ^ W[45]; + W[52] = P1(W[36] ^ W[43] ^ rotate_left(W[49], 15)) ^ rotate_left(W[39], 7) ^ W[46]; + W[53] = P1(W[37] ^ W[44] ^ rotate_left(W[50], 15)) ^ rotate_left(W[40], 7) ^ W[47]; + W[54] = P1(W[38] ^ W[45] ^ rotate_left(W[51], 15)) ^ rotate_left(W[41], 7) ^ W[48]; + W[55] = P1(W[39] ^ W[46] ^ rotate_left(W[52], 15)) ^ rotate_left(W[42], 7) ^ W[49]; + W[56] = P1(W[40] ^ W[47] ^ rotate_left(W[53], 15)) ^ rotate_left(W[43], 7) ^ W[50]; + W[57] = P1(W[41] ^ W[48] ^ rotate_left(W[54], 15)) ^ rotate_left(W[44], 7) ^ W[51]; + W[58] = P1(W[42] ^ W[49] ^ rotate_left(W[55], 15)) ^ rotate_left(W[45], 7) ^ W[52]; + W[59] = P1(W[43] ^ W[50] ^ rotate_left(W[56], 15)) ^ rotate_left(W[46], 7) ^ W[53]; + W[60] = P1(W[44] ^ W[51] ^ rotate_left(W[57], 15)) ^ rotate_left(W[47], 7) ^ W[54]; + W[61] = P1(W[45] ^ W[52] ^ rotate_left(W[58], 15)) ^ rotate_left(W[48], 7) ^ W[55]; + W[62] = P1(W[46] ^ W[53] ^ rotate_left(W[59], 15)) ^ rotate_left(W[49], 7) ^ W[56]; + W[63] = P1(W[47] ^ W[54] ^ rotate_left(W[60], 15)) ^ rotate_left(W[50], 7) ^ W[57]; + W[64] = P1(W[48] ^ W[55] ^ rotate_left(W[61], 15)) ^ rotate_left(W[51], 7) ^ W[58]; + W[65] = P1(W[49] ^ W[56] ^ rotate_left(W[62], 15)) ^ rotate_left(W[52], 7) ^ W[59]; + W[66] = P1(W[50] ^ W[57] ^ rotate_left(W[63], 15)) ^ rotate_left(W[53], 7) ^ W[60]; + W[67] = P1(W[51] ^ W[58] ^ rotate_left(W[64], 15)) ^ rotate_left(W[54], 7) ^ W[61]; + + // Message Extension (c) + W1[ 0] = W[ 0] ^ W[ 4]; + W1[ 1] = W[ 1] ^ W[ 5]; + W1[ 2] = W[ 2] ^ W[ 6]; + W1[ 3] = W[ 3] ^ W[ 7]; + W1[ 4] = W[ 4] ^ W[ 8]; + W1[ 5] = W[ 5] ^ W[ 9]; + W1[ 6] = W[ 6] ^ W[10]; + W1[ 7] = W[ 7] ^ W[11]; + W1[ 8] = W[ 8] ^ W[12]; + W1[ 9] = W[ 9] ^ W[13]; + W1[10] = W[10] ^ W[14]; + W1[11] = W[11] ^ W[15]; + W1[12] = W[12] ^ W[16]; + W1[13] = W[13] ^ W[17]; + W1[14] = W[14] ^ W[18]; + W1[15] = W[15] ^ W[19]; + W1[16] = W[16] ^ W[20]; + W1[17] = W[17] ^ W[21]; + W1[18] = W[18] ^ W[22]; + W1[19] = W[19] ^ W[23]; + W1[20] = W[20] ^ W[24]; + W1[21] = W[21] ^ W[25]; + W1[22] = W[22] ^ W[26]; + W1[23] = W[23] ^ W[27]; + W1[24] = W[24] ^ W[28]; + W1[25] = W[25] ^ W[29]; + W1[26] = W[26] ^ W[30]; + W1[27] = W[27] ^ W[31]; + W1[28] = W[28] ^ W[32]; + W1[29] = W[29] ^ W[33]; + W1[30] = W[30] ^ W[34]; + W1[31] = W[31] ^ W[35]; + W1[32] = W[32] ^ W[36]; + W1[33] = W[33] ^ W[37]; + W1[34] = W[34] ^ W[38]; + W1[35] = W[35] ^ W[39]; + W1[36] = W[36] ^ W[40]; + W1[37] = W[37] ^ W[41]; + W1[38] = W[38] ^ W[42]; + W1[39] = W[39] ^ W[43]; + W1[40] = W[40] ^ W[44]; + W1[41] = W[41] ^ W[45]; + W1[42] = W[42] ^ W[46]; + W1[43] = W[43] ^ W[47]; + W1[44] = W[44] ^ W[48]; + W1[45] = W[45] ^ W[49]; + W1[46] = W[46] ^ W[50]; + W1[47] = W[47] ^ W[51]; + W1[48] = W[48] ^ W[52]; + W1[49] = W[49] ^ W[53]; + W1[50] = W[50] ^ W[54]; + W1[51] = W[51] ^ W[55]; + W1[52] = W[52] ^ W[56]; + W1[53] = W[53] ^ W[57]; + W1[54] = W[54] ^ W[58]; + W1[55] = W[55] ^ W[59]; + W1[56] = W[56] ^ W[60]; + W1[57] = W[57] ^ W[61]; + W1[58] = W[58] ^ W[62]; + W1[59] = W[59] ^ W[63]; + W1[60] = W[60] ^ W[64]; + W1[61] = W[61] ^ W[65]; + W1[62] = W[62] ^ W[66]; + W1[63] = W[63] ^ W[67]; + + for (size_t j = 0; j < 16; j++) + { + T[j] = SM3_TJ_0_15; + SS1 = rotate_left(rotate_left(A, 12) + E + rotate_left(T[j], j), 7); + SS2 = SS1 ^ rotate_left(A, 12); + TT1 = FF0(A, B, C) + D + SS2 + W1[j]; + TT2 = GG0(E, F, G) + H + SS1 + W[j]; + D = C; + C = rotate_left(B, 9); + B = A; + A = TT1; + H = G; + G = rotate_left(F, 19); + F = E; + E = P0(TT2); + } + + for (size_t j = 16; j < 64; j++) + { + T[j] = SM3_TJ_16_63; + SS1 = rotate_left(rotate_left(A, 12) + E + rotate_left(T[j], j), 7); + SS2 = SS1 ^ rotate_left(A, 12); + TT1 = FF1(A, B, C) + D + SS2 + W1[j]; + TT2 = GG1(E, F, G) + H + SS1 + W[j]; + D = C; + C = rotate_left(B, 9); + B = A; + A = TT1; + H = G; + G = rotate_left(F, 19); + F = E; + E = P0(TT2); + } + + A = (m_digest[0] ^= A); + B = (m_digest[1] ^= B); + C = (m_digest[2] ^= C); + D = (m_digest[3] ^= D); + E = (m_digest[4] ^= E); + F = (m_digest[5] ^= F); + G = (m_digest[6] ^= G); + H = (m_digest[7] ^= H); + + input += hash_block_size(); + } + } + +/* +* Copy out the digest +*/ +void SM3::copy_out(uint8_t output[]) + { + copy_out_vec_be(output, output_length(), m_digest); + } + +/* +* Clear memory of sensitive data +*/ +void SM3::clear() + { + MDx_HashFunction::clear(); + std::copy(std::begin(SM3_IV), std::end(SM3_IV), m_digest.begin()); + } + +} diff --git a/src/lib/hash/sm3/sm3.h b/src/lib/hash/sm3/sm3.h new file mode 100644 index 000000000..c5dacdf3a --- /dev/null +++ b/src/lib/hash/sm3/sm3.h @@ -0,0 +1,47 @@ +/* +* SM3 +* (C) 2017 Ribose Inc. +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#ifndef BOTAN_SM3_H__ +#define BOTAN_SM3_H__ + +#include <botan/mdx_hash.h> + +namespace Botan { + +enum { + SM3_BLOCK_BYTES = 64, + SM3_DIGEST_BYTES = 32 +}; + +/** +* SM3 +*/ +class BOTAN_DLL SM3 final : public MDx_HashFunction + { + public: + std::string name() const override { return "SM3"; } + size_t output_length() const override { return SM3_DIGEST_BYTES; } + HashFunction* clone() const override { return new SM3; } + + void clear() override; + + SM3() : MDx_HashFunction(SM3_BLOCK_BYTES, true, true), m_digest(SM3_DIGEST_BYTES) + { clear(); } + protected: + void compress_n(const uint8_t[], size_t blocks) override; + void copy_out(uint8_t[]) override; + + private: + /** + * The digest value + */ + secure_vector<uint32_t> m_digest; + }; + +} + +#endif diff --git a/src/tests/data/hash/sm3.vec b/src/tests/data/hash/sm3.vec new file mode 100644 index 000000000..2dd4710bc --- /dev/null +++ b/src/tests/data/hash/sm3.vec @@ -0,0 +1,423 @@ +[SM3] + +# https://tools.ietf.org/html/draft-shen-sm3-hash-01 +In = 616263 +Out = 66C7F0F462EEEDD9D1F2D46BDC10E4E24167C4875CF2F7A2297DA02B8F4BA8E0 + +In = 61626364616263646162636461626364616263646162636461626364616263646162636461626364616263646162636461626364616263646162636461626364 +Out = DEBE9FF92275B8A138604889C18E5A4D6FDB70E5387E5765293dCbA39C0C5732 + +# GmSSL +In = 0090414C494345313233405941484F4F2E434F4D787968B4FA32C3FD2417842E73BBFEFF2F3C848B6831D7E0EC65228B3937E49863E4C6D3B23B0C849CF84241484BFE48F61D59A5B16BA06E6E12D1DA27C5249A421DEBD61B62EAB6746434EBC3CC315E32220B3BADD50BDC4C4E6C147FEDD43D0680512BCBB42C07D47349D2153B70C4E5D7FDFCBFA36EA1A85841B9E46E09A20AE4C7798AA0F119471BEE11825BE46202BB79E2A5844495E97C04FF4DF2548A7C0240F88F1CD4E16352A73C17B7F16F07353E53A176D684A9FE0C6BB798E857 +Out = F4A38489E32B45B6F876E3AC2168CA392362DC8F23459C1D1146FC3DBFB7BC9A + +In = 0090414C494345313233405941484F4F2E434F4D00000000000000000000000000000000000000000000000000000000000000000000E78BCD09746C202378A7E72B12BCE00266B9627ECB0B5A25367AD1AD4CC6242B00CDB9CA7F1E6B0441F658343F4B10297C0EF9B6491082400A62E7A7485735FADD013DE74DA65951C4D76DC89220D5F7777A611B1C38BAE260B175951DC8060C2B3E0165961645281A8626607B917F657D7E9382F1EA5CD931F40F6627F357542653B201686522130D590FB8DE635D8FCA715CC6BF3D05BEF3F75DA5D543454448166612 +Out = 26352AF82EC19F207BBC6F9474E11E90CE0F7DDACE03B27F801817E897A81FD5 + +In = 0090414C494345313233405941484F4F2E434F4D787968B4FA32C3FD2417842E73BBFEFF2F3C848B6831D7E0EC65228B3937E49863E4C6D3B23B0C849CF84241484BFE48F61D59A5B16BA06E6E12D1DA27C5249A421DEBD61B62EAB6746434EBC3CC315E32220B3BADD50BDC4C4E6C147FEDD43D0680512BCBB42C07D47349D2153B70C4E5D7FDFCBFA36EA1A85841B9E46E09A23099093BF3C137D8FCBBCDF4A2AE50F3B0F216C3122D79425FE03A45DBFE16553DF79E8DAC1CF0ECBAA2F2B49D51A4B387F2EFAF482339086A27A8E05BAED98B +Out = E4D1D0C3CA4C7F11BC8FF8CB3F4C02A78F108FA098E51A668487240F75E20F31 + +In = 008842494C4C343536405941484F4F2E434F4D787968B4FA32C3FD2417842E73BBFEFF2F3C848B6831D7E0EC65228B3937E49863E4C6D3B23B0C849CF84241484BFE48F61D59A5B16BA06E6E12D1DA27C5249A421DEBD61B62EAB6746434EBC3CC315E32220B3BADD50BDC4C4E6C147FEDD43D0680512BCBB42C07D47349D2153B70C4E5D7FDFCBFA36EA1A85841B9E46E09A2245493D446C38D8CC0F118374690E7DF633A8A4BFB3329B5ECE604B2B4F37F4353C0869F4B9E17773DE68FEC45E14904E0DEA45BF6CECF9918C85EA047C60A4C +Out = 6B4B6D0E276691BD4A11BF72F4FB501AE309FDACB72FA6CC336E6656119ABD67 + +# this one currently fails for GmSSL and us +#In = 0090414C494345313233405941484F4F2E434F4D00000000000000000000000000000000000000000000000000000000000000000000E78BCD09746C202378A7E72B12BCE00266B9627ECB0B5A25367AD1AD4CC6242B00CDB9CA7F1E6B0441F658343F4B10297C0EF9B6491082400A62E7A7485735FADD013DE74DA65951C4D76DC89220D5F7777A611B1C38BAE260B175951DC8060C2B3E008E3BDB2E11F9193388F1F901CCC857BF49CFC065FB38B9069CAAE6D5AFC3592F004555122AAC0075F42E0A8BBD2C0665C789120DF19D77B4E3EE4712F598040415 +#Out = ECF0080215977B2E5D6D61B98A99442F03E8803DC39E349F8DCA5621A9ACDF2B + +In = 008842494C4C343536405941484F4F2E434F4D00000000000000000000000000000000000000000000000000000000000000000000E78BCD09746C202378A7E72B12BCE00266B9627ECB0B5A25367AD1AD4CC6242B00CDB9CA7F1E6B0441F658343F4B10297C0EF9B6491082400A62E7A7485735FADD013DE74DA65951C4D76DC89220D5F7777A611B1C38BAE260B175951DC8060C2B3E0034297DD83AB14D5B393B6712F32B2F2E938D4690B095424B89DA880C52D4A7D90199BBF11AC95A0EA34BBD00CA50B93EC24ACB68335D20BA5DCFE3B33BDBD2B62D +Out = 557BAD30E183559AEEC3B2256E1C7C11F870D22B165D015ACF9465B09B87B527 + +In = 008031323334353637383132333435363738FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E9332C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0D69C2F1EEC3BFB6B95B30C28085C77B125D77A9C39525D8190768F37D6B205B589DCD316BBE7D89A9DC21917F17799E698531F5E6E3E10BD31370B259C3F81C3 +Out = 4D38D2958CA7FD2CFAE3AF04486959CF92C8EF48E8B83A05C112E739D5F181D0 + +In = 4D38D2958CA7FD2CFAE3AF04486959CF92C8EF48E8B83A05C112E739D5F181D03082020CA003020102020900AF28725D98D33143300C06082A811CCF550183750500307D310B300906035504060C02636E310B300906035504080C02626A310B300906035504070C02626A310F300D060355040A0C06746F70736563310F300D060355040B0C06746F707365633111300F06035504030C08546F707365634341311F301D06092A864886F70D0109010C10626A40746F707365632E636F6D2E636E301E170D3132303632343037353433395A170D3332303632303037353433395A307D310B300906035504060C02636E310B300906035504080C02626A310B300906035504070C02626A310F300D060355040A0C06746F70736563310F300D060355040B0C06746F707365633111300F06035504030C08546F707365634341311F301D06092A864886F70D0109010C10626A40746F707365632E636F6D2E636E3059301306072A8648CE3D020106082A811CCF5501822D03420004D69C2F1EEC3BFB6B95B30C28085C77B125D77A9C39525D8190768F37D6B205B589DCD316BBE7D89A9DC21917F17799E698531F5E6E3E10BD31370B259C3F81C3A3733071300F0603551D130101FF040530030101FF301D0603551D0E041604148E5D90347858BAAAD870D8BDFBA6A85E7B563B64301F0603551D230418301680148E5D90347858BAAAD870D8BDFBA6A85E7B563B64300B0603551D0F040403020106301106096086480186F8420101040403020057 +Out = C3B02E500A8B60B77DEDCF6F4C11BEF8D56E5CDE708C72065654FD7B2167915A + +# random (GmSSL results) +In = +Out = 1AB21D8355CFA17F8E61194831E81A8F22BEC8C728FEFB747ED035EB5082AA2B + +In = 8F +Out = 2B6173F01B9002CAC00EC91C8B481867C2E35BF408BDE154D62844DA1B5B6E18 + +In = BF23 +Out = B49515E07F9E777070D725FD49D41579D263CFFB4EC3FA65B93C87B473D91CB9 + +In = 7A9719 +Out = 171E937ACE4B4E18FEF1EFBAE2FEAAA7F1022F722FFC82155A24E75AE4AC4B29 + +In = FB39E8CC +Out = 041326870D40091C58CE7A252458E86CF19664CA6AA7E11DB8952329B7688A1C + +In = 95AAF89FE9 +Out = B2249A453544CA8699E07B369382001E8D741C76CAD673851A4A25BE5C1765CD + +In = 7688740E973D +Out = 5AC22E272E9C6E7CEF2C17178302817D865CB178C6C04B331B0E5EE61C2014F9 + +In = D7B976B5F139C5 +Out = 667509D27E794D11621817E993B8DA4ACCACB3F83A719E635E0EA455905040DE + +In = 391B4861669A3DE0 +Out = 911B051B02636A5EFE12EC8FAFA3B18D55B1AA6C4BC9E07789B2D44470B94167 + +In = E71EC750CC768837A8 +Out = 429DEBAA692B6AEB85AAE6666ED2F8C206395D6A87560699DCA23D6035918B28 + +In = 898FB851BB90BCEEFB6D +Out = 140F2130D810310C5D0A988E9B380678031C4A9050AABE1A7B5603A98F452684 + +In = 7D33665E8EF4F522B55DF7 +Out = 3B4C28A7BD3AB41B65525F580EDCBE1A308C3FA09D821C192858A349581CA55B + +In = 815E16C63B984946C07AD55A +Out = ECC8181AAFFC4DBCE05C8AD2B3544BF6838791D6C9966DE2996318B33EE37B8B + +In = 87EB36F4116F4D2AA05C9D2B56 +Out = 5B617C321F8769B5227BC02471C117F44DFDF816EBABB60575D07EDEF1F880C0 + +In = F670D1ED03316874263B039CB53A +Out = 911048C7853C404970A9230FD997A95B5B4A00FF74A8AAFBBCE72B4F9444DE8F + +In = 102CB525FA7E0DE28EFE6D2F2AD1B1 +Out = DDC82E25EB0CAA33EE7229A12AC69A7B9B72345236E835857E81BD2173EDC532 + +In = 74C2E33D49E8C2A5144E82EDC04218F9 +Out = AD2B435CDA7615F0AC367AECA843A69189B665552233F4804439090F86F3009F + +In = 706C9721E103771B688E97636AB26B412C +Out = 78B026963E21183970483449EE9272A877A2254C89C63F0F6A0B4B86DEA1DB33 + +In = AC24DED9E54844B3E0CA037EC1D0F8103FEC +Out = EB46D32B15EBF5C5FD2AF316C9717065CC21376053945F04CB6F92D31E1666E9 + +In = 1B39C5A77A7CD6D538C3D2D1079F3F5338C620 +Out = C1761751AF06A5BE5233BD7A8D6FC497FC1EA3F36CAFB988E457F281615BF867 + +In = 65A647B8DD26DCAECE299788B13AC05A0E71C577 +Out = 7239694C9B61CDF9E62D5D48BAFDC283F2041A9C0845E0DD975BB3A8E5A01198 + +In = 98F13468FF3C69382495D34BA12E1E4BD895BEC29A +Out = 6B70357406F59521BA34F961AA4C7D78A088DB325595D6267AF5D499F1D95B1F + +In = 03DE8240C26BBAEF801D579D2F2BE849FFEAB779E056 +Out = D98DEA9C0A614FB689750C75FD4C6D5E91447104F8F563DBEA1F50602DA018F5 + +In = A733F4ADFBE6B110C1EF6FD3599B680A6FA5644FBCD073 +Out = ACFAAAD49A8B94D1DF81EA951A30EE2B899FBA79F60C452F63AF3C79E1283944 + +In = 1CB083E53C6242D1DD62510CCFB3D5496D692B8017023BAE +Out = 1EC1F230391A74818CF79B24C9B4DF63F0A291E317EED70990C65EFAD9B5AD33 + +In = 6A8000BAF113DDEE93437CE36C9B28F69F0DF4A0500633EEAB +Out = 9AA7E33E6D4EDC5E487A4A15B9BFA013D167D256AFD86DF7770468107DF19F87 + +In = D2D424446F9B2B29EFCF93F2DA96208A90A39FB0DC7E46AD8F53 +Out = 6F5321A4BD11EB49DCFC9214D1391FCB733BEDCA2148F05A18AFCC3D141211E6 + +In = DB1BCAF89851CBCC847347EB4B1D0C40EA6F3E0DE1853D713704BC +Out = 6194EEDA953C297C20EC9876E4F0D51C44C1CCC4037CC90E6BA184572C84EF2F + +In = BAB74A186887702204977BCEEFB1BBA1D52C9C58667E7FE0E3F4BC19 +Out = E715A625D3D1271F8A3AADCF215F91161C1BC161BD645627B78C707F0C8B3B3F + +In = 36CDC511B3082AFD547F4331298F879AA742C634C10E0263F80EFDEECE +Out = 4C77EB46A03CC08C37EE567127C0BCE8F952BA5FDD729FF6FC44E3FFE307A507 + +In = 072BEDBCBE5F9295EC6A2BF22490D984BC7388FE99035916C1262E8B592C +Out = 6A1AD547946C39BB22DDA3DC8B861010790D8CEBF4CF8DC3C9493CA8D4C92F70 + +In = 6009DCED63EEF9985DA162F1BEDA1B56E0C17D51119B1AAEEE7B28050BD1DD +Out = 8ABE85411E3CE2C2A2E582EDA291D45FCD3A4A5CD7E1851A7E67A49FA2F3BA9A + +In = 45DC649B6C57A9E21E9B069D06E12729B80A62FACD901C6E9ED10C38BA5C2E65 +Out = 355422A0C526088B16C5207D1ADAD939CF9642150EBE110E213F23884F8DB789 + +In = 8D8AC08987FEB09407263BC7CD471911372F1DAEBE2C879B258C0EFBEF9C544ABA +Out = D730E1A1482889C9F4F2B661941C2E1EA6A12F1C78E70908DF164B33C6226DEE + +In = CAFB786E63C6C4D5103D3AECA6299886B24B786361C03036BAA3CE3DB6BF3BDCA67E +Out = 68B81461292074B7B949A7D8A401CAD6C843633EAA25FE8E85F605E7988BBB62 + +In = E4EC633F7A1F46C75CB75C74C9F37EA24BC8AA5887BE69DD62FFC9B4345651E8FA9A49 +Out = A917D4574112F0FF3E1C00B3F4E302AE03D2B54EE8894CBF924936D2EDA27438 + +In = FEA3D74BEA7E23C35BA395D05F2A92414CDADEDFA78D98B66CE2D5562E6CC375FF1D7986 +Out = 2C1454E32371A89D28BCAD57E06F78A2C32EFFC35BA1F06FB1AB8F0195674CAF + +In = 48227871EF6DD22269CF7175BB6E8865CB00747015D6E1484D77F9A6E0178702188BFC4CE3 +Out = 4AD187F717078CC5151CFB7BD620B7397BF83B2AE8F48982550EA8F6CE91ACF0 + +In = 925A12C519BFAD3D9107E4091470984696FCB39034CA2864205D3C789BFC99B98FEAD7641D8A +Out = 298B93119582BBC6BA4C7600DDA4529FBF95CE2C85185DC81BED51E4F2E43D7B + +In = EFFBE040CFF6884F80507DBA2FD878973534E30C78C781941B4AB3E92E5E6DDEE43C58CE0534A8 +Out = 6CEC5B724F6C7BFB39F3BC39761354E9101E74D33B7C5FAF5A276172712189B5 + +In = 0F05AC77E8F3EC02A963C317DB0EAA7DFCAAB5E53778B0D084E8588E816A259797F17F30A359F944 +Out = 78691973567040980019F43D1F849F36D22CD4DC892B2F78D2EB486711E46F8E + +In = AC0DEB1007740DA8454BF811CC5CDE964A7C5A2F23C7CFDEB973003ABA4FE0D3A00D2F072023B03A48 +Out = F99CE704217B75A6F9A7973C2366E8024F803CB45BC951397C83F597E3604DDF + +In = 64D0A5B549B0DF0C7853CD7E828386310ABD66BC0AE2B3CF6052334D934637578522611AD8EEEB4516F9 +Out = 5A51318FE4208F36EBF5B1B5A4EDAE1898EDFB127F888E0A8CE74D02806A2D7C + +In = 2218D41A7A2042F5D9171018941D3F21FC98E28011F5990D005BA5275052A45AEA443C06F412BABE72644E +Out = 29F3E102AE543F246494B824B773B6F9DFF27010139AA18EE31A4B73789092FF + +In = F045E55868E517232F4ED65CB93D284E61CE37B4B8F2BEF143670ABB6D4A6BFD01B97D79DA5CE282EA481C61 +Out = 85134D76CD0807BDEB81C146F026E3959E1D4C8EB25EBD1E01B58646D8B88AEF + +In = FB31D05DE6CBBE99439A8886FD322D9BEAA490CCAAB58EDD88F80B595AE5F945534CCE79A95570D5AD415C15CF +Out = AB61CA446F7513B1ABAC7DCAE506B7F132D6904B6F28B3D40582B4CF3A4D3E39 + +In = D50B13F45CBB67405B6E970B45EF39E4D2212F95350C81A32ED01D6D313E9AD76F3E832C64133F4F71FE9FFDA640 +Out = CA4DFDDABC5CA39C7E180A78493F4BDD9E24CCC41FEAD023154C4ED51AA3949D + +In = 80614915675003AFA0692E328C1390146C1FEF619404EF22A52CB02A9E1B6EDB37FE69349B2E3C925450C93393BFAE +Out = 4B4A1E12D62B0FE331E89EE5B4275B9CC15083459761E18A6B24603A1C481683 + +In = FF5818BCC88E9D421D1BA030450BC968383D07E5FA17567A34AEFF1363C35B112081DBF8782FBFCF7B22D4BF547F0EDA +Out = 504E22B30A52ABD5D8BF00D3E435CECBCE914A69E5652297C24C7801C89446B7 + +In = B0B07AD69494CC5381A36915445E163F56F7BD3FFD2A4DCA79CE8D971C21EC79BA4259C31D00A9D5DD8BACE8BE351B33DE +Out = 13D92F108CE8E3C29C70B55E7A04E0291EDBEA486F3CE0CFB4A9A5E315DECE41 + +In = 0B82F7A1CD313A71C6F56236889E400B0EA1C88A25E69A7071DEE93853DCD47386665968C4536095CF2196FFF24E3A6B2854 +Out = 3253522FE3E1FD9383CDA8527068671ED0B6DBB1896E8D137342506E4BCE0922 + +In = 9EF5632D6672FA3B311FE6C90D1B7B8E23C1A73D469A7A78F2103FBCD8EC91DED16449746DB1419795FC48C4D37A27E66D4A08 +Out = A7E328AF93AE979E106AC22E1A91AFCFE268FBFD0563F3498AB29FB7C397E6AB + +In = E4914F48B0CB06901007332B69A6AAE40ED2329E25DE9402AC6266509326A57BAFEB94815CF77D5CD07EC3E1B9B6C3DD29F4464D +Out = 9566ABA4535776D9CE6C831D817297C776B0036F53B81A35375BE68AAC10903D + +In = F1E4074DEB7985DD6DF88CCB056B68155081DDB188007EA0C4F8CD2062AC2BEF24DF4482216DE138D5C0562D2B03C10E296E39728F +Out = 8B55A7225C061614573546701642BC0151DC33BE3B841F8D6E10EA32F1822575 + +In = D10F14138405FAD5B9EF771ADBBB0AE7A8B7451666F558BE5E5781A296190F529D25FEB047CBE770F8D1FB66D816839ED7CD13171ECF +Out = 82C2F31DADAEB256557EF017F45A6C8E9BA4DC6F333421296F5313283AA6EAD9 + +In = 7878D676F80324F34328962ED7AF16501061427AE273D8AFBDEC6CD114B049D9B890A3A23772836B34A0A112847CCF2FC01B928E69434D +Out = 3134E59B83E42717F838AB39996B423D29D3610A8CC2BA4A9A6F12E08D5A6256 + +In = 7FB4C6E63E9C4DB639170F9757E2273C9B1986DF897E4A4B278DE99B6EDE9B530F96EA7E7D54004E6B0F05F6E3FBE3AA62506949F73A1CDD +Out = BE9BE655AC18CB030F7BA6CB577D802431C36E16D890E9CD8601D5A0236AAE77 + +In = 1AF3DA21FC5218E8E677A5436317F16B8C8FD068C73996A55B35518CA14159280743EB185AB7BD1DDD8A5081B99180DA39A6324D890B00114E +Out = CD16450E9931B9FDF557A51B62965FB944B1723B0F38614C04A0730F2BC8CBE5 + +In = C0AA21B64BB53003A5D705DB7C8DF15178654F0360EBDC8A63EC90B525AF37D145BB38CF427C43ABBF7F4D92B47908E0E76B74E9D5AC53EEFF74 +Out = 1C74B13ADBC8506D748B21DA0ECC002113B42740F36C5C12A19E5A5F283339F0 + +In = 678365191176C99CC68A07F6561B232061D74FD0AD69B9F0FB893D5E6637F75449C7149D2C83E06CBF20EC70537D7131878AA1520579072E2666A8 +Out = 4A5AD0E337A78175ED26C081BA807019AACE6856450FB5599609CED727A30087 + +In = E0604AF69EA91FF923D8B77780A046E16C5ABC95E65CF534FF11C72E27AEF6517C2E1893690495443704A43032754B66D5425F5D8E6DF5F1D27B8E90 +Out = D4AB98F43B266C93FF9F366F956838279CE23833780A4EFDC649F5111F9F26F2 + +In = FD8A32566F898112A87398CD228DD727B8448498FA151E777967FEDCC0B5A7DAB297DD92120E1A489ECBAE4A977D88A7D6D4B7ABE6E4745536E8F5AEEE +Out = 61D6C410F6DAA6597B436886763F7E48E6C0EE0D7F6FBC7C78665010A5498B16 + +In = A3E62E3F53BB9C98EFE6978011FE95067B550722EE434544D4BBA39DFE7889F236A9ABDFDCB37F0DBE640D3888F71B42ADC104E61A5C909A5FD77F4A7A4F +Out = 2EFDE07F82EDB2AC9B2D9BF375ED0B31CF37EC15FD431BB5F84805EC5BE4DB3D + +In = 1F240AF659192AB6331EB872EE8ECC206B672F0D602AD663021F0146E1AEE1124E7E35B2A0DE9A591517FDDB0333E19A56192E22BC4BEB6AD5896FF626C5D5 +Out = 873A20B028BAC043A2F6C66CE8C689B80C8D9A56B3E5576F711354E1394E88C3 + +In = BD44467EC7A843662CAF04AC9854C0B78939678816502CCE84758655A0DBA2C17CF67538D5B4216FAFEF1C1B639B027A21677F9B02A0054401794E53D2AABB38 +Out = 129F552A87B45C0A352B3F236705087BE01EE802029727B5CEC350EA0A5E66FC + +In = 55F25FA2A9C2A737DAAB7E5412042863DD5E80996722EA6C6EE8FE90BC0649189AACA31EC99936D5AEC424B2D174B75221C03DD5D992D0ACF07B4F69D2A13D0421 +Out = 091523695FAC022B8B62428A07E2AA23E158B3ECE5B71E8217AED2747A29CE27 + +In = 72B4F86F7B64995E3C0B7E7F22607B198892F845529BA542B9C2C970D9C12C990D27A900A89A7AAEF9ADACEA3A641B140340234209FAEBBD7FF3CC778C826353E6AC +Out = BAB5C332D77BBF31B29AFC4581F39B35889685998FF2433AF61BB0C69206028C + +In = BE71E5B7A9CDE6D7D220D879744CC3EC4BFC50A83CE84E3D9888929BCCE7C8199D737DCEE2C7198EE48438AEAFE118F9522C88AD8337362764ACEAC476C9CBD1215C1B +Out = 2B52C627E3E7FDA80955520ABA77198524F32622714763723A5AA33D722D8E12 + +In = 03F157B18514111E6253F21352B99ABF9CF490A4744A0819B2934282BB8DD80B6924109138917CAE8C704D4B2C64B2F685C1770B20A7FFB343EB7649BBCEF8050E85ACAB +Out = 2D8BCE499805D91C19C8BD0A77AD987BA234900F549D918B3A70D8DCAF167EFD + +In = 789C2827FDC6BCF890DF221C22F3C72F193BA3F065A6799F03B7C4DBDD8D1FBF26C13D61B4E4CC73167C34A3092E04FE66829A77B47C99DAA79A4A50B8583151AA89424E1C +Out = A1D6C8E342CD9A7CFF8393E2277B7A8E64CE986CF59DD0E1C9B7DF3FF95FAA97 + +In = 05E63C70886FD99AD2DD7E765FEA4C74AB6CEFD2773CDE3C77E03B3C23B0E1CE122687E118AF9587E179CF1233501C4177656C778CCEC6BDB6A53646424446C663279B5CA385 +Out = 08E5FD51D02A3F09A3A4B7FB069E2C4279FCB0A80875324314282FBDAD4B2F2D + +In = 1AE9481D30C7AAA3E25BE7A4A96FDC618E8A464BCB3F1D41F2332A31392A4616A16362E81DFBE5A0A3CE60A5324B5B7469C74552A7FB35154024FE590389BCCD77CA1DE402B171 +Out = 79D07C6EDA9DABFEEE939EFABE20ECF64B451922BFEABED2E14DB66D889F1D06 + +In = 5B8E70D43337875BC8EB9DAC93E9E00FEA540574470A41DB6CE137A59E8E316EE5A5B618E0F6D9E027DBE9B08324EC7135F9BE8FACC257EECD0BD757E95D0642FF976D265887ADB3 +Out = 8EFE47582FA0CE675B6A06148EE2CBB132A7E9B1951DF7036536E87A119483BA + +In = 1C52D5DF1A6EEA92A60FE1F0E3D85671134B261CE9EC196C61DAE6CE672FA3FD186F310E1D93FF46C88142425B228E3274E6A0A28CED43B029455ED8B8063C3F8596BB016839624BFB +Out = 1D1FB14DE1B07C98C1990F1EE5EDB1D668444E8D77411DB5F4C28BA9D1C68C65 + +In = F70088393CBC8175D942A4D4469D07792AEF90CDEFEDFD1156D68B14E25AF70F59B4496B165BC16603B62F60311C6854D7019B64C83A220AA1FD751B2B8E60BFE6C8E18A176360A4CD89 +Out = EF3F45FAF63447B63D836A55C0BF5CEC906ECB6677B12ED51E884CC3B6566406 + +In = 99DF20C2F743D3C5D1A5626C712F8C2E230CDC77E587960E9E0A13834088C7395E96CFD55B4684C70E2FA8F6AD8F68A10AC6A5224AF61A80F1DE2DE419BF7D64E3691A6508B2792D224F3D +Out = C1492FC381756F8331F0764F1BCE8B68D364BE67AB3A474D2E1B9BABA8467F32 + +In = B7D595867687A684AD6DA616CBECB5C80876AAAC1EE17527136D6652AD65A1FC5C4CF106331C2601F810198A44834564E5541DD8E1643F38200AAD41FB599A68EDA94955D5B8BBEFB022FBA7 +Out = 4023069CF054A98D89C07B3A9066F53E0640700A44958CECE492CC0A661C1AC7 + +In = 18D52FE8EE4A767557B8035D54954F2070012035D57ED42C75730C3AB7CBD86CA0BFF6F71FE818449CD82BE9E079D97A8F68DE1D6ADAEAE36DC0EE615C1ECAE916F397DB9C696D3832FF939BD6 +Out = 9FEBD4895A2A5F07F9406E840EE27251411F4F03E3D6F1BC3E958B528D510FC7 + +In = 765982491587FD61EB065060326EFAEA94F5FDAE7EBAE3F2444D8D76E0477A05AD7F9A5A8324863EB6A2EE034F4DA8BE551076294CF002F64CC5086BE0BDCCCC2FA8BF02BBA33A0B179D3C589619 +Out = 78A1AEE5C0011B24DEA79997BF7852EBEA0552E560E10E0422A0DB69082E4D18 + +In = 726CA2F5DE7760AAD29B131803790C7CD4742D389E7AB770BEAEA95C80D0816007F9F1DEDB04CF8355A8A950FA5A4C0ACE59788D052BFEA11F84D4B590B247AD999CA6C64B3B80E11C4E16173954FF +Out = 0D326846E9E16527A83924C74C2D4D0AA850170761052402AC547047FFA966A6 + +In = 04B58C800732387285CBE23F7574201746BB9B4E1DC55F3A51C2E89162E15D8A88EE02CC874515C08E82399BC6DEC66323C583E0359F367F732EC2308C322AED8542553203DA1C03E2FA5DE81192191F +Out = 969852605DAD4F190B829A18D5174BB1EB5C1E8AE48A927CD04BA72E58BB422A + +In = EAF1CBDE7F6244D12853C4158661113283066802115CC8C775CA40EC6D747E24A49D3E5CF4E2C77BBE6739285FED17A1245ECF2952F9E781DED99B05F1644B52BB49562731BCF2ABB7C67AFE0D1A083429 +Out = 36631635E5F3C8230A7606FBC1673A7C354C87055F64AB72ECC2642FFCB13695 + +In = 5740A3EDA42AD8BE58C5AA4545E2DC9F9735C3BA6CB723AD97A153012EBB98CEE479A784DD4C86CE8C51B47B07A1BEF7C759DC7F0CAC3D9222A16CC2173A83746162C61318B8034BF685C803794AC572E1DF +Out = 3CDBACCD4CEC3023F26EA39A0E77F32030840CD311BF63758B5509CEA2D524CA + +In = 35D3C8B698FBEFE30F9011E3796AD4616D3A49F7F5C100C297378647E20BCC107B0F0BE960CC4AB8972FB70450DF6E94B8F5DC97EA587C5C5062F2389B2C3488EE340D5951307C117BF2C2EF0BE6F90CB2CB87 +Out = C45E00136AE8CE2AFBE2CA985FD92298D80625BD8FD0727CCCB34C627167947E + +In = 4974E863399C12F36FF595A9AD3E32B8E4E7930AB22B71BE1078DA07EC31194553FBABEDDF04794B5A56B9CDFBB70EE1FD862EF6D8146FB73F2C3EA02B9C453A17718858B136562DC2825B3B84989DB084738C7D +Out = F1B2CCBD2A47136862E14C1CE5608175D7BABC06A4F7A5D9B4D671B8FCDD5E73 + +In = 1F110590F155EAA123C82AB981EA1A43232D3E590C7BC3F515900F0C7862FFA868AB27A931F7EF301CB82F7A87C32CA4133984872BBBD3E19597A30745E8BD1BE31FB82CB8260E1427A8E0DC385DCD5B4934814C58 +Out = A222E428F3794E77F15249267815A4AE8E28DBEE0D42822CFF4E4B64EBBACCC4 + +In = 75BED3C7ACA8DDA765FD1E0797AF152E03B366E51932672574595A3212CAD177AD7BB59C45F55D03966A2F9DE47B6E3C71C73D73BDA52F2AD04B03FAE470109B2B87EE7F8931A85DDA0CAF960B12D393FC2F30ADF3F7 +Out = 406C08B881F0A4ADE69049963139C82956211FFDE957C7816F7126AA1E95593A + +In = 3B1139B848F977B63B0A923B8D42A4A78DB5A83C387D3BC2FF62D07171997A309447321EF5C4467A8A1A04F3D9CA94B43184CA4210C57290AD0A44624580562BCB404BFD3BA450CEF3BF3E05FAA83F227FFBFFDD973504 +Out = 38269BF707F56E1EC0DA4C695453C53113173A944FE7248B4FB850A301957A33 + +In = 527300B5BA1489A59C75635F277AA6F9F49AEA1AD4DCDE2952F9929AC00C2936AF0C5C4C55138A45E09A9603EA480CA24ED97DB87428457377DD9D90CF82A47B14F8753AD004EDABF6761E32C3FAA9A7F09A684242FB5374 +Out = 2B092AD2A02EE43E9C2273FE22A4AD079BDBC2508FF4B892A30FD3CEEB80B57C + +In = F2AA628C7999C842AB71A863433BA61BAEA97A0ACE3F68072B87C95C4669BA95581ED631ED1E46F613E515658F89236F66140B507528BA37141105DAF71F1A834421EBBDA95E04450B3E741C7243C47C13B8F32EA3698DA2AC +Out = 01416665B1C5DABE00F0D5AC35A29E2A87A20E9989E2E7F2763B145222200F27 + +In = F277826012962EF07689D1D6DB7C3B936EEC819D61496AF748D3BD0DE716C494485E7795ABB229E7A6B2E2385AE68D2E50D1BE3365231430CA89E21086C90CF5B71CABD983C3B123C557035185A85617B842E43538761D39A225 +Out = 231DD751B4E52B901E320D4FE860FDDEAB2B7C19625DD5FA15594F878EEE7561 + +In = 17A3954E1EF7F7EB155A95E56DE1637183EE11812A0087C4341E7A7A9DFE63D0FFCA91F34FB3C79B12C733BA7CFF5816E7D81A237D46F8615B9073B9ACC506B108597A5458F4B331592787CB0F4DA060F0049E3B89DB654BF68E4D +Out = 91C3E9812673C03F6D8E4C6B9D6756C8D247BF2E3B18FA39AF4593BC104791ED + +In = A6DE68EEA049E6FFA8113F214BDE7F733D540E86285832F639FEC88EC7C11815C5405E55FCCE510F6AAAFBFF0855F43AF349AFB869C14F3A1DD3128F415FF261886AED94D434CC02321B67ACA80A1F6267BF1E5D611F63DD59FB5C90 +Out = F71CED2A6E9D06C47101AF4EF0F5929B6565A5C2A3FE99624CC9BB9A8F767A78 + +In = 073D2FF6248F370FB07EDD5C0BDF24A4EFE7BE32BDB7D419381EB527CDA3A3D66B3305A5B632D86DEFDC97B87B1A343262DC48EA8C7DDF5893AE6236E0A24AB51C7F5B2D4B1CA19875651FD8E379C0E5C2AB5C8EC0880032AFF973CEC4 +Out = A0D8AB714C5DD00FCE23733529CD49C57FB80C88A748A81AB9F3616F5F812AEB + +In = 05A2AB51F38E8CA0E16EE147BE2AEF49168880A3C39A6854DD5D645BE127BC959E4D9EA28031353E278449F7BE5123976BDEC5C65FAE3AA65A0A25942C3AC45394054B1457F7919D0456E234FA772779DA619144B3F5C949A26E81D34069 +Out = 66F1F78FAD4766C6348ACC5B5D1955EE8CED312DC8D0555636EC5397034FD0CA + +In = 58FB3AF8C5C26BB05AAF2E45402740A683DC8D3739893F935F4D5175A1B03972C76C84E77A5B3BBA167141D3C3596A025CD8FB3A7720691612E77FED7ABFB3EE63F98E11E3FBBEF7E876D3489A66473724E11EA0B773621AB9168F17394A2F +Out = DB34E21A54D5B1DA2736B1708F1F1EF068DC162849DF88FE96FD1EAD352BEEF1 + +In = 9D0C6E207788A82B7393FB9BD41B99814D55E736DFD3BE736923F6A1CD82E934440B6866F264A64692A8CAEB7601F5501B02DD780769AFFB9D80642C9F0733A4C34BBACD26EBDAC337B6565DB41979F9A1E11DDF7D5067FED2F238078043295A +Out = 3BBB8F574E235C6C94BE169CC26DDFE8B8F98390FB6D24FEA587F8B2BA4B9E76 + +In = 554BA7C8572CD8986DBC634E29204838AB73E6A952D96CCA677C6713BEF4698581A4C82FCBDF0EA2A53685BDB2FE3B25B2A96BE3CA8DC36EFF548EF2D131ED25A9D7576A1F878A6E937EF325035119422FC9C9C5757C8B6EC00812265D60FCC7B3 +Out = 42C00EBE5E9038F564CA6397B46A86DF88C292C988DD7042C68190D76ACCD679 + +In = 5580420C3097BBB972B5CD7AA51B1B6C87500F68F403D8F113A6B9A9432ADF4087DA14A81B4476147412CFB44410DBD904E6488B951242C1D39D4759DDE4279E976020D329636F0FBE24442B22ACBEC40AF95EBEB3C5C7C87B3EBAA4B72CCD7A7E68 +Out = FF949F3C5955F70CBFC93ACDEE77EAD6E4B9F4CB837780655097F516A824BCE4 + +In = B9B2AF4780F68D75D63B7D4308CF46C383F1111A681B6BC4AFA3A42361D132FEAD8A21A73CF5ED8B7866ACCA1CDA580C1E1203B9970D0467C856435871D5FE93F2197ADE98BCA40904FB032CA59AE931C822EFCD9A423E65EF9B47117717F72F857FE0 +Out = 67B857E13780897F45A0244BCC6166C5130A898A52A181ADF8C9FFC63E7012E8 + +In = 53796795E2EEADC6C5BCB6321DC37FAACCBF7708C8CD8052F3B749C44CC24E1F702636F204A4FB6E1C6CB7A9FD8B712521068336DCAD7C98673A6587D9A426F17DC564EAF777D8D252BD12F4006B1FD8194C94FF1F134B8671D36C5515C92FDCCAEB5A69 +Out = B0B8C4793671790927EFEB10D0B07816979676E52722A6A8AF071E52721FB100 + +In = 26205E90C424BA9C9A542B87A00DBDA3EDD0E9A1AD09AA0FBC5BF81500C10C966FAB462994F3590F4DC40947834C89DB35A88AD81A3FD78A51C5493634BF11B14FF8D52DD588A49E03678C5240199175E856611F5FDBD548E9F13EDAF52356430B37A23A8E +Out = 3F27604AA346161E5634FBD9A4B29812F4F4855D5B0A0EF0907B0D762A180B3E + +In = 58CF59F929EF59581335EE7C73F3492AED7B6FA1878D5667573A0DDE68BBAA5D88D68FE289BED6E6A74FBD79BE1CB612F7E0ED3262AC9B97A92ED9DBB52FDE38A6B08DF1552C636FCE86EF699E9F4CA201851BFF04714258ED377C1BC08B50DB3F3CECC1406B +Out = A8F21A0DF4B1AC55DA304BC08A244AFC09C6207712E339BBF980BFC1951ABE98 + +In = 8E8F4F97A37226A800AB6BBA0EAAEA6EA69665CD2F8C01BB3F5C69C80E95043E80875931E5210218A6452FC3A70D4CB3537D2A92432E99F1B79B2DC8D1AE8F36F9E7439661DDBDD8537ED8272B09C824A20533A19057CCA87A1879B7C9EC837DDF763FD8E5D5B3 +Out = 30AC80E8B71743E38A08C48464CF64844950CCFD4887BC70D25F8C7C80BD55B7 + +In = D43BEE5BC5BF5A5A90152CD700114CD1635A96FCFC2709406ACB673ED21F5FB9C581579777B49C10DC58C47017E0C8FD6DCC89452FD37725B84DB2C03E6E8E85E95A4C82701CF343DE22CC3ED46070E1A260CBD08B1160C55B1E5C57DBE07FCE830A18A72521EC4A +Out = F90475C1D8801341863708D70884C7603C233256A76A246663A8619BA3C382C2 + +In = BEF37CAD600E03F58561F0D018B9A77F2D350057B50B55BD3BC29BB63A2E0FC264AD6F2235D7A35930E50D84DF198A3EC6B0E10E431D7C2DB7D169B395B41E3087644E3FEDFCF7C2A8ED3B2D59BD97F650EE0B07190B21FB58A139101F3FAE867F98B87ADDBA212BE7 +Out = 1CB015C3CC0842303C789F843EA4FA4C15FB0B18A73763C011537923C579EA5F + +In = A6EC667CBB6FB774C8A8DD317BF3C06933A448AE101557E812A559C065E9F77E28930BB6CE8880B0B1FF38727BCB9597AB697490934B3AF3CBA0C0A55F8A7FDE0A1F69EA8C7EC21EF8A245B9B4C795422CFC089519E8ED48EA68DF6D32BA3380E6085660065FF119E148 +Out = 9A2E18EBDD907D2C02BDE46E499FB5A8A4B590774CD0A774A0D467CB5851A0FA + +In = E139DC3051756D9E5858D299A12D7C928F01B79E9141F6228133E0FB172971191ED95E835BD9B0CEB91658F4923824993EE389F05E7D049EDCC6B8E90259418AA7681E0DA970523FEFEB08A9E4ABCD90CCD2FEB07AFEF9A983789FD162E5BD34634AD718B499007C84B648 +Out = 800C2D48B925EA539E528396870A03E89FC4B9538180486B937C3EDF139D87F4 + +In = 86DEB4C32713F1597259DDC1792871A5B36CFB6A006EC60EDF7715F152773435028DB5C32047F831C1DDEAB81ED873F0D0C7B8CC158437E6955C957B47FC2000A482A5C43833EF38EA47AF8F2FED54C7E41A5EC8C8481A6E8961F1073D3DAB7F04220003FD943F4768E742E2 +Out = 296253AC41275B5EB60E12BAB599191A4378EECADACBA075389C17E4FE2FD07C + +In = 8843403FE17D0783C75E3ECA9C5748430D64872CC148A6A2FC589F425D6215DD5D2CC172AA9A566D39AC29CADF8793A514DCDC6B18F82B7E3CB70F489BEAD86AD61439E2AD5A1E735D2CCE8187B905E98B6FC4155DA00E7D45833450A339D8543970B7A02517BE961BDF4F57B2 +Out = 9C9190EAB048014CD0C0F853F5A2A7D2B9D03E12FC8C7BA8B431215BF8A7DD51 + +In = 40F61BCAB993D0BB5FBCB25D34E45F2D06D51E130400BBB7D3FA8EB10D68062B83389BE62095B4D876827C9DED866962923AF22D4C078747FC6F8B8CE7C7392AACCF8F5DD410A72BD008DDFDA7CF0019F97B831D000B93039A696C0289DCC5646E199ED7C12890A66B734EBB0888 +Out = 1A628DAA204E7B4829EE63C71C51FD7897C078AF80B0C044F8358E0C4A4B953F + +In = 7D2398386795EF984FC942848DBADB3216F65296DC0AF9E7C4FD0A49346171DB7289DB25FA5A80A5C919AE065ED2D78BEF6265C7E75151515D03795ECD55B6ECE4F790ECC71CFF786A529E06F23056FC8485D2110CC0AABB9A1CC1644DC77E64B55DC7BE5237E542917428DDE55E84 +Out = D41E85726010E4400DD94A4866A7C44D64F302EE204C9E95237FC8590B1EC4EF + +In = 85BB2F9F9E65D24D36A1FEC56CAFFA21BCA3C14E7792C3BF347D83DEBCF662D1B800BAC20553ECFEBD64E3CF028FD2A60701D27213E10AB13E1995D72929B0CD3CC201513AC991ED390F288B12E7A1756B5D02987EDBCD063C303776BFC3F24D6702C0A6656414E9AFC63BEFA149BF37 +Out = 2AD42AAD7E40FA925E02F1D8520026C0D12E2086B6A6AEA2C089197592B2AB08 + +In = E5A9D188B88E7BC821AAEEE6182073C748EEB10C19066FD40AC6508843B97BBA4A94F3DA2D401CCA34D3468B692E9CB7BEC8400B3FA3FA517C762503E47BDD9AAA7E84D4A124885E69F430B052C8802B4637281E71C68AE22C1BE1F71ACE258249E5EE27B76FA53B896465D2D3B57A707A +Out = 53277E6E788EB3C6B2CAB72E54EB681E6861134FCB4DD63F10E572E28D9F1B7E + +In = 35C9F1143460E2104CAFDD8B1BCE6BD0EC5E953FE3513389E34087964DADBFEDEE8D6C229E5029D00B91AE0C8235A5612190A1F9D026DAAC217FDC4BCF718986FD319FE5E689FF20218DB89EBD3D9D9EBE9F4AB2F28622C050E01C6F681B4772019109F40E12F320A31C76CF20D3B10D0109 +Out = 2AE47F0C7898F1E81D034D6E7DE79617A30918315A0C05983F4D2149627CC556 + +In = 83DE715AA9E75FF678EAE450FF33030717B4FDAA4EBFE229AAD34D4418EED66AFE87E63659F7D4AD6345CB0AD581795B6DCDF6E7023FF9A99441126A15AF023DAC2D6A78638D06EE009707204FB3C688DD7D233DD0C235D4005A8BF9B58392B7702C9AA4A33080461FFED08F3D6DACE81CFB52 +Out = 65573347E093C76FF0DFC7A51D52B781DACEB8A84CBA13D526C05C53F0491521 + +In = 72906374538CB478B6FE074683FADEF4036218CD977C501B7177F2E7D8CB778EB73A0197E81DE8F667AC62306422A46DE662B4C85CDFCC7B678C3A7A1E80EA181ACD9B615B1E6BED52055CEF6E4E0897D330E727BE210AB7F98C2A68614972A57F1C85BFFC1E3C4F25FBE288CF70D67DA569C788 +Out = 5C5E46A337BE3BF974D680494F071A54160A8FA1945E8377B615F282D10883DC + +In = 9357ED0C53457593D12015E9C924DE6815979D172F08713E36D29803F787BF748B2AD6739439F7527CC03158C4300434422B9319C7EB7449BA1CB258E74F04C875436EFCE5881877FDD71EE142C3C5AF6BAF35BD5C05969EB70855DE09152744A8FB611D6C7E10C9564807E1858976784F2959DE8E +Out = DFB8694C78468DCB94331F57F800B3A35C9D8C6ECA25AA8A10E16F2D5D63E168 + +In = 44EB1F76FA2B8FA9C636776006CB25C8777F32A4F5A28638E3141224B17DF92177B02D7E3B6DE0B86826008AD1BEED1811D9F8110D4A37F5F50B8F0C0FD1CA863D30EB507B515F59335E8A818E98A179835CED932265F2BF8FDDED37B6AC899E710BC0727832310EED66F912858864400A7F8CC749BD +Out = C2BAAEE9A6B743E1EA5E1CD2E8DB30478475BD51ADCD88BF023E299731E1B4D1 + +In = F5E327945E0F187F33051A39AD043ACE17D8DFABB438875520D0DD129234A97C7251FABA470E7D5E36CCB9A0F10B7BE1E3E0FD4A79B02F56345614E7ADA9393020D3DD56A161F12149523410CC40436C95A1C95BE346AA1B3B59FADC2990B418B6C85894D9FD0FFA7749762CFDD58597F8A508D6F6DE13 +Out = E8DA8AA5FFAD9A9B21482233B9CFBB575DDEC12EE9F7DA11D2B05751F56CDF89 + +In = A8A9A1D0E289EC76B97A10838BB50104E71D7B20D2E8B6DE63CF2C33CDD32795B055511ABBBE30A2869472FA84DF67B3CFA5C6B9077E662416D9AADB32A193185B267A2A23648AFC1620076B44CF3B367FA7DAB02E465E82611A74A028AA09C77205684486A13D532222C9D805DA77BCBECA370A68BE2D51 +Out = 0EF5BE8B1F3E4FD545D44AE47D187A458F1C61AA950E6FFB2D539C2E887B9CD9 + +In = A6B61A1250CE0EA9B8A5D5D07E63840CEF9E7BC066CCC37A4A8C1F210B7440896F4DD2D25CDB41CCE1ADA000CAC14A5FE952D537D74263E65C4EED03E9949A11774E4CCBB07652AF8A362F433E3A7331E33A7AD86DF84F9FECCE9C4C89ECAA56DC43145C04E3704B7461E9C0D92F644431552078631BA5C10D +Out = A74120F7F6771F430FEDAA44B171F2D4FBCB8BEF83E29FC5A343E9A6FA0F4317 + +In = 218A3B1EA1DD423231E139312975E898026BB4D9B43C960B31652BDE34C10D2B0ECCD341EFBBEF85517B1D2C99308B4E9C484213B58E11BE2D8C945CED2DA27DB405F0047C850407BCBB73510D36972290C87CDA7EBE04AC44937BD99644615E547A7A45EDCA6DB4E1FADF8CCC23A2C832795F370A15A3819254 +Out = 13E2DFF411A0D42EB12D1323CDE957BE60F823A122BFF76316576E73F858254D + +In = 2D30C46D61A2C39AD3DB5BFFBA382120D201AC5026CEDF1D0D1C9473A2D19F01A188D36407403A8C208978F01CD9979A5B4D987315EB01C824A9B6E746211FD7FEC08ED019B3FF8E35B39A3C37C3910158EC5A23D492B28D8083412AA2C397C1F20AB1637512FE8E6AC66ACA20319060EF9AE82314DCD12C73BC7D +Out = 937C307B3D2D0C6FD1D70E852ABBEC3B0E4A893B9C4BC923A734614A22C782D5 + +In = 3D4453F890A2F297D4F0F86FDEF1FBEEFF8949447EBEEDE53F0BD390F73FDFC4366C668E7E3F4388CE5338309102496AE53D7CE63234E0A0AB3C63F91378460870BFA964B25EDD4E34A8FD57E6FB7A86183DBF3F286303B0A8ADBA5A6D0ECED58B0152D7F94D570FCA391B1BC0F551A50A9265955409AAAEBACB0E3E +Out = 8AF4F714EF7C2BAAF7900E16A57467F46CC27AF206D9ECA94A467A98813E7C1D + +In = CCFCFADC38612DEE3677696EB474A3934F4011EEA72EA93228FAA64F8FE004286EF016CD8BCB653FC7F9927CB7A3DE84298F077B561B4FB2C8440F468970A431E99B7A34614B639D7312A220B19720A4D87C517A744C675E5A573116A703A0033C486A73EF3BF5FA448DC4861150D8C604000FA6C20356C45539E43E07 +Out = 917CD68FB4FC4C1DAC564AD882F2197C2EB54D96E22C469D48B573183ADA964A + +In = CEF978907502F606B0EE6AB189ADC305EA048DCD3674070D2E3833F55AEADDDD4D7DA55B01485124CD46224A523A1BD0394A92038353EE2BCD311C5D1A0E18A32B321B31D9EDCD7B5721D2A7504FDEE09CB34364896C939D78FD678A93B9FC38C8C4E3D4BAF7BB5435EAB9EB0FD85998697E4F87C02BAF3140B8E4D718D2 +Out = 162DD86C844AC23FFCE6CBB64F0FA20B840D293C74C29B22DF87225C566D1E75 + +In = 79E9D249F6160066B6FB1928388FFA95265F5965E06C4C22995A012B8D37D42EC8537F3F2FDF0467A7C548895C60E65C97C4CA51ABF87BAE2CCB23708F1E95653DC67942AB4069A82492086CEE3699B3D9F278F319FF219BCF52674D0F860E622677B9BB3D3DA8AB2EDC0DAE5F6B02B4037BDBE29929F51574C4BC838B7FF6 +Out = 90AED3FBDF443EA8F431E308475EC38C85926A6A1EAD802CEF3D2763F0CCBAE6 + +In = B606A8398B80AF73713B0E1418BA34D1C6550221D0CAE6902DAB61234F73606C21C1D96FBA5AE646E7026C36735ACA98E92B44A21F7A47214A4BA587D1576904854CCA368D224FE88F4A59216F09678D41196F399A2BAEFE648A47032A2E79496AEACC91DF0615B21EF90ADD1B64FF851AE680D97BB45ED9B9FB8DA42EE330FA +Out = AE6E2DDA5ACE3B88F4F4F644CCC67248CCBD9E6B2DC5D359B21E93903A965121 + |