diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/misc/nist_keywrap/info.txt | 3 | ||||
-rw-r--r-- | src/lib/misc/nist_keywrap/nist_keywrap.cpp | 209 | ||||
-rw-r--r-- | src/lib/misc/nist_keywrap/nist_keywrap.h | 67 | ||||
-rw-r--r-- | src/lib/misc/rfc3394/info.txt | 1 | ||||
-rw-r--r-- | src/lib/misc/rfc3394/rfc3394.cpp | 76 | ||||
-rw-r--r-- | src/lib/misc/rfc3394/rfc3394.h | 8 | ||||
-rw-r--r-- | src/tests/data/keywrap/nist_key_wrap.vec | 550 | ||||
-rw-r--r-- | src/tests/data/keywrap/nist_key_wrap_invalid.vec | 36 | ||||
-rw-r--r-- | src/tests/data/keywrap/rfc3394.vec (renamed from src/tests/data/rfc3394.vec) | 0 | ||||
-rw-r--r-- | src/tests/test_keywrap.cpp | 130 |
10 files changed, 1005 insertions, 75 deletions
diff --git a/src/lib/misc/nist_keywrap/info.txt b/src/lib/misc/nist_keywrap/info.txt new file mode 100644 index 000000000..3fb3639f0 --- /dev/null +++ b/src/lib/misc/nist_keywrap/info.txt @@ -0,0 +1,3 @@ +<defines> +NIST_KEYWRAP -> 20171119 +</defines> diff --git a/src/lib/misc/nist_keywrap/nist_keywrap.cpp b/src/lib/misc/nist_keywrap/nist_keywrap.cpp new file mode 100644 index 000000000..c349f97aa --- /dev/null +++ b/src/lib/misc/nist_keywrap/nist_keywrap.cpp @@ -0,0 +1,209 @@ +/* +* (C) 2011,2017 Jack Lloyd +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#include <botan/nist_keywrap.h> +#include <botan/block_cipher.h> +#include <botan/loadstor.h> +#include <botan/exceptn.h> + +namespace Botan { + +namespace { + +std::vector<uint8_t> +raw_nist_key_wrap(const uint8_t input[], + size_t input_len, + const BlockCipher& bc, + uint64_t ICV) + { + const size_t n = (input_len + 7) / 8; + + secure_vector<uint8_t> R((n + 1) * 8); + secure_vector<uint8_t> A(16); + + store_be(ICV, A.data()); + + copy_mem(&R[8], input, input_len); + + for(size_t j = 0; j <= 5; ++j) + { + for(size_t i = 1; i <= n; ++i) + { + const uint32_t t = static_cast<uint32_t>((n * j) + i); + + copy_mem(&A[8], &R[8*i], 8); + + bc.encrypt(A.data()); + copy_mem(&R[8*i], &A[8], 8); + + uint8_t t_buf[4] = { 0 }; + store_be(t, t_buf); + xor_buf(&A[4], t_buf, 4); + } + } + + copy_mem(R.data(), A.data(), 8); + + return std::vector<uint8_t>(R.begin(), R.end()); + } + +secure_vector<uint8_t> +raw_nist_key_unwrap(const uint8_t input[], + size_t input_len, + const BlockCipher& bc, + uint64_t& ICV_out) + { + if(input_len < 16 || input_len % 8 != 0) + throw Invalid_Argument("Bad input size for NIST key unwrap"); + + const size_t n = (input_len - 8) / 8; + + secure_vector<uint8_t> R(n * 8); + secure_vector<uint8_t> A(16); + + for(size_t i = 0; i != 8; ++i) + A[i] = input[i]; + + copy_mem(R.data(), input + 8, input_len - 8); + + for(size_t j = 0; j <= 5; ++j) + { + for(size_t i = n; i != 0; --i) + { + const uint32_t t = static_cast<uint32_t>((5 - j) * n + i); + + uint8_t t_buf[4] = { 0 }; + store_be(t, t_buf); + + xor_buf(&A[4], t_buf, 4); + + copy_mem(&A[8], &R[8*(i-1)], 8); + + bc.decrypt(A.data()); + + copy_mem(&R[8*(i-1)], &A[8], 8); + } + } + + ICV_out = load_be<uint64_t>(A.data(), 0); + + return R; + } + +} + +std::vector<uint8_t> +nist_key_wrap(const uint8_t input[], + size_t input_len, + const BlockCipher& bc) + { + if(bc.block_size() != 16) + throw Invalid_Argument("NIST key wrap algorithm requires a 128-bit cipher"); + + if(input_len % 8 != 0) + throw Invalid_Argument("Bad input size for NIST key wrap"); + + return raw_nist_key_wrap(input, input_len, bc, 0xA6A6A6A6A6A6A6A6); + } + +secure_vector<uint8_t> +nist_key_unwrap(const uint8_t input[], + size_t input_len, + const BlockCipher& bc) + { + if(bc.block_size() != 16) + throw Invalid_Argument("NIST key wrap algorithm requires a 128-bit cipher"); + + if(input_len < 16 || input_len % 8 != 0) + throw Invalid_Argument("Bad input size for NIST key unwrap"); + + uint64_t ICV_out = 0; + + secure_vector<uint8_t> R = raw_nist_key_unwrap(input, input_len, bc, ICV_out); + + if(ICV_out != 0xA6A6A6A6A6A6A6A6) + throw Integrity_Failure("NIST key unwrap failed"); + + return R; + } + +std::vector<uint8_t> +nist_key_wrap_padded(const uint8_t input[], + size_t input_len, + const BlockCipher& bc) + { + if(bc.block_size() != 16) + throw Invalid_Argument("NIST key wrap algorithm requires a 128-bit cipher"); + + const uint64_t ICV = 0xA65959A600000000 | static_cast<uint32_t>(input_len); + + if(input_len <= 8) + { + /* + * Special case for small inputs: if input <= 8 bytes just use ECB + */ + std::vector<uint8_t> block(16); + store_be(ICV, block.data()); + copy_mem(block.data() + 8, input, input_len); + bc.encrypt(block); + return block; + } + else + { + return raw_nist_key_wrap(input, input_len, bc, ICV); + } + } + +secure_vector<uint8_t> +nist_key_unwrap_padded(const uint8_t input[], + size_t input_len, + const BlockCipher& bc) + { + if(bc.block_size() != 16) + throw Invalid_Argument("NIST key wrap algorithm requires a 128-bit cipher"); + + if(input_len < 16 || input_len % 8 != 0) + throw Invalid_Argument("Bad input size for NIST key unwrap"); + + uint64_t ICV_out = 0; + secure_vector<uint8_t> R; + + if(input_len == 16) + { + secure_vector<uint8_t> block(input, input + input_len); + bc.decrypt(block); + + ICV_out = load_be<uint64_t>(block.data(), 0); + R.resize(8); + copy_mem(R.data(), block.data() + 8, 8); + } + else + { + R = raw_nist_key_unwrap(input, input_len, bc, ICV_out); + } + + if((ICV_out >> 32) != 0xA65959A6) + throw Integrity_Failure("NIST key unwrap failed"); + + const size_t len = (ICV_out & 0xFFFFFFFF); + + if(len > R.size() || len < R.size() - 8) + throw Integrity_Failure("NIST key unwrap failed"); + + const size_t padding = R.size() - len; + + for(size_t i = 0; i != padding; ++i) + { + if(R[R.size() - i - 1] != 0) + throw Integrity_Failure("NIST key unwrap failed"); + } + + R.resize(R.size() - padding); + + return R; + } + +} diff --git a/src/lib/misc/nist_keywrap/nist_keywrap.h b/src/lib/misc/nist_keywrap/nist_keywrap.h new file mode 100644 index 000000000..022b4016f --- /dev/null +++ b/src/lib/misc/nist_keywrap/nist_keywrap.h @@ -0,0 +1,67 @@ +/* +* (C) 2011,2017 Jack Lloyd +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#ifndef BOTAN_NIST_KEY_WRAP_H_ +#define BOTAN_NIST_KEY_WRAP_H_ + +#include <botan/secmem.h> + +namespace Botan { + +class BlockCipher; + +/** +* Key wrap. See RFC 3394 and NIST SP800-38F +* @param input the value to be encrypted +* @param input_len length of input, must be a multiple of 8 +* @param bc a keyed 128-bit block cipher that will be used to encrypt input +* @return input encrypted under NIST key wrap algorithm +*/ +std::vector<uint8_t> BOTAN_PUBLIC_API(2,4) +nist_key_wrap(const uint8_t input[], + size_t input_len, + const BlockCipher& bc); + +/** +* @param input the value to be decrypted, output of nist_key_wrap +* @param input_len length of input +* @param bc a keyed 128-bit block cipher that will be used to decrypt input +* @return input decrypted under NIST key wrap algorithm +* Throws an exception if decryption fails. +*/ +secure_vector<uint8_t> BOTAN_PUBLIC_API(2,4) +nist_key_unwrap(const uint8_t input[], + size_t input_len, + const BlockCipher& bc); + +/** +* KWP (key wrap with padding). See RFC 5649 and NIST SP800-38F +* @param input the value to be encrypted +* @param input_len length of input +* @param bc a keyed 128-bit block cipher that will be used to encrypt input +* @return input encrypted under NIST key wrap algorithm +*/ +std::vector<uint8_t> BOTAN_PUBLIC_API(2,4) +nist_key_wrap_padded(const uint8_t input[], + size_t input_len, + const BlockCipher& bc); + +/** +* @param input the value to be decrypted, output of nist_key_wrap +* @param input_len length of input +* @param bc a keyed 128-bit block cipher that will be used to decrypt input +* @return input decrypted under NIST key wrap algorithm +* Throws an exception if decryption fails. +*/ +secure_vector<uint8_t> BOTAN_PUBLIC_API(2,4) +nist_key_unwrap_padded(const uint8_t input[], + size_t input_len, + const BlockCipher& bc); + + +} + +#endif diff --git a/src/lib/misc/rfc3394/info.txt b/src/lib/misc/rfc3394/info.txt index ac56ee833..075834219 100644 --- a/src/lib/misc/rfc3394/info.txt +++ b/src/lib/misc/rfc3394/info.txt @@ -4,4 +4,5 @@ RFC3394_KEYWRAP -> 20131128 <requires> aes +nist_keywrap </requires> diff --git a/src/lib/misc/rfc3394/rfc3394.cpp b/src/lib/misc/rfc3394/rfc3394.cpp index 3bb792723..8e69933c7 100644 --- a/src/lib/misc/rfc3394/rfc3394.cpp +++ b/src/lib/misc/rfc3394/rfc3394.cpp @@ -6,18 +6,14 @@ */ #include <botan/rfc3394.h> +#include <botan/nist_keywrap.h> #include <botan/block_cipher.h> -#include <botan/loadstor.h> -#include <botan/exceptn.h> namespace Botan { secure_vector<uint8_t> rfc3394_keywrap(const secure_vector<uint8_t>& key, - const SymmetricKey& kek) + const SymmetricKey& kek) { - if(key.size() % 8 != 0) - throw Invalid_Argument("Bad input key size for NIST key wrap"); - if(kek.size() != 16 && kek.size() != 24 && kek.size() != 32) throw Invalid_Argument("Bad KEK length " + std::to_string(kek.size()) + " for NIST key wrap"); @@ -25,40 +21,12 @@ secure_vector<uint8_t> rfc3394_keywrap(const secure_vector<uint8_t>& key, std::unique_ptr<BlockCipher> aes(BlockCipher::create_or_throw(cipher_name)); aes->set_key(kek); - const size_t n = key.size() / 8; - - secure_vector<uint8_t> R((n + 1) * 8); - secure_vector<uint8_t> A(16); - - for(size_t i = 0; i != 8; ++i) - A[i] = 0xA6; - - copy_mem(&R[8], key.data(), key.size()); - - for(size_t j = 0; j <= 5; ++j) - { - for(size_t i = 1; i <= n; ++i) - { - const uint32_t t = static_cast<uint32_t>((n * j) + i); - - copy_mem(&A[8], &R[8*i], 8); - - aes->encrypt(A.data()); - copy_mem(&R[8*i], &A[8], 8); - - uint8_t t_buf[4] = { 0 }; - store_be(t, t_buf); - xor_buf(&A[4], t_buf, 4); - } - } - - copy_mem(R.data(), A.data(), 8); - - return R; + std::vector<uint8_t> wrapped = nist_key_wrap(key.data(), key.size(), *aes); + return secure_vector<uint8_t>(wrapped.begin(), wrapped.end()); } secure_vector<uint8_t> rfc3394_keyunwrap(const secure_vector<uint8_t>& key, - const SymmetricKey& kek) + const SymmetricKey& kek) { if(key.size() < 16 || key.size() % 8 != 0) throw Invalid_Argument("Bad input key size for NIST key unwrap"); @@ -70,39 +38,7 @@ secure_vector<uint8_t> rfc3394_keyunwrap(const secure_vector<uint8_t>& key, std::unique_ptr<BlockCipher> aes(BlockCipher::create_or_throw(cipher_name)); aes->set_key(kek); - const size_t n = (key.size() - 8) / 8; - - secure_vector<uint8_t> R(n * 8); - secure_vector<uint8_t> A(16); - - for(size_t i = 0; i != 8; ++i) - A[i] = key[i]; - - copy_mem(R.data(), &key[8], key.size() - 8); - - for(size_t j = 0; j <= 5; ++j) - { - for(size_t i = n; i != 0; --i) - { - const uint32_t t = static_cast<uint32_t>((5 - j) * n + i); - - uint8_t t_buf[4] = { 0 }; - store_be(t, t_buf); - - xor_buf(&A[4], t_buf, 4); - - copy_mem(&A[8], &R[8*(i-1)], 8); - - aes->decrypt(A.data()); - - copy_mem(&R[8*(i-1)], &A[8], 8); - } - } - - if(load_be<uint64_t>(A.data(), 0) != 0xA6A6A6A6A6A6A6A6) - throw Integrity_Failure("NIST key unwrap failed"); - - return R; + return nist_key_unwrap(key.data(), key.size(), *aes); } } diff --git a/src/lib/misc/rfc3394/rfc3394.h b/src/lib/misc/rfc3394/rfc3394.h index 77e602fda..9cfcfaaf6 100644 --- a/src/lib/misc/rfc3394/rfc3394.h +++ b/src/lib/misc/rfc3394/rfc3394.h @@ -5,8 +5,8 @@ * Botan is released under the Simplified BSD License (see license.txt) */ -#ifndef BOTAN_AES_KEY_WRAP_H_ -#define BOTAN_AES_KEY_WRAP_H_ +#ifndef BOTAN_RFC3394_H_ +#define BOTAN_RFC3394_H_ #include <botan/symkey.h> @@ -21,7 +21,7 @@ namespace Botan { * @return key encrypted under kek */ secure_vector<uint8_t> BOTAN_PUBLIC_API(2,0) rfc3394_keywrap(const secure_vector<uint8_t>& key, - const SymmetricKey& kek); + const SymmetricKey& kek); /** * Decrypt a key under a key encryption key using the algorithm @@ -32,7 +32,7 @@ secure_vector<uint8_t> BOTAN_PUBLIC_API(2,0) rfc3394_keywrap(const secure_vector * @return key decrypted under kek */ secure_vector<uint8_t> BOTAN_PUBLIC_API(2,0) rfc3394_keyunwrap(const secure_vector<uint8_t>& key, - const SymmetricKey& kek); + const SymmetricKey& kek); } diff --git a/src/tests/data/keywrap/nist_key_wrap.vec b/src/tests/data/keywrap/nist_key_wrap.vec new file mode 100644 index 000000000..5846ce0e9 --- /dev/null +++ b/src/tests/data/keywrap/nist_key_wrap.vec @@ -0,0 +1,550 @@ + +[KW] + +Input = 00112233445566778899AABBCCDDEEFF +Key = 000102030405060708090A0B0C0D0E0F +Output = 1FA68B0A8112B447AEF34BD8FB5A7B829D3E862371D2CFE5 + +Input = 00112233445566778899AABBCCDDEEFF +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Output = 96778B25AE6CA435F92B5B97C050AED2468AB8A17AD84E5D + +Input = 00112233445566778899AABBCCDDEEFF +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Output = 64E8C3F9CE0F5BA263E9777905818A2A93C8191E7D6E8AE7 + +Input = 00112233445566778899AABBCCDDEEFF0001020304050607 +Key = 000102030405060708090A0B0C0D0E0F1011121314151617 +Output = 031D33264E15D33268F24EC260743EDCE1C6C7DDEE725A936BA814915C6762D2 + +Input = 00112233445566778899AABBCCDDEEFF0001020304050607 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Output = A8F9BC1612C68B3FF6E6F4FBE30E71E4769C8B80A32CB8958CD5D17D6B254DA1 + +Input = 00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Output = 28C9F404C4B810F4CBCCB35CFB87F8263F5786E2D80ED326CBC7F0E71A99F43BFB988B9B7A02DD21 + +[KWP] + +# From RFC 5649 + +Key = 5840df6e29b02af1ab493b705bf16ea1ae8338f4dcc176a8 +Input = c37b7e6492584340bed12207808941155068f738 +Output = 138bdeaa9b8fa7fc61f97742e72248ee5ae6ae5360d1ae6a5f54f373fa543b6a + +Key = 5840df6e29b02af1ab493b705bf16ea1ae8338f4dcc176a8 +Input = 466f7250617369 +Output = afbeb0f07dfbf5419200f2ccb50bb24f + +# Following values generated by OpenSSL + +Key = 00000000000000000000000000000000 +Input = 00 +Output = A9D2D4394815D53F2799ABD7E51D2C8B + +Key = 00000000000000000000000000000000 +Input = 0001 +Output = 36D0CA197F638BF478D022C7E543B699 + +Key = 00000000000000000000000000000000 +Input = 000102 +Output = DAB4EE2853E1C44C5E553E644143902B + +Key = 00000000000000000000000000000000 +Input = 00010203 +Output = 446C037F831092B147C372616357BF7D + +Key = 00000000000000000000000000000000 +Input = 0001020304 +Output = 9ED0AF6457B82E0DDADBD2240A303D74 + +Key = 00000000000000000000000000000000 +Input = 000102030405 +Output = D863A8CE0DF301A564945259B4F74E7D + +Key = 00000000000000000000000000000000 +Input = 00010203040506 +Output = E8387E5456242B0C30BE77FC1FF0C1FD + +Key = 00000000000000000000000000000000 +Input = 0001020304050607 +Output = 01FF4C430CDF3D2D815B0972B23D7C35 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708 +Output = C06E2163E0CC845B348E012AC9413DEEE40C8C3B030A3681 + +Key = 00000000000000000000000000000000 +Input = 00010203040506070809 +Output = 3DFD2F643C38B07E121C77C2CA0EF82DA742B0989B6D848E + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A +Output = AFAEF390634E21E754FD09F55A4EDD918A1D23ECA9B76F2B + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B +Output = A42D14C830F64F0A73570BFA7FDF8DDDD5E3AD3065A09FB0 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C +Output = 83F23527625FC643942279D090C1B61D10FC978B54D778CD + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D +Output = E073C30E0DAC595F9FD28A0CB9E53945B26D1E1DE4E66D04 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E +Output = 64E3C2F7E0F7CB297C6B8C4CAF665F9F0A3F7082D2522635 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F +Output = 8F5982C7D265A0A40FC81D2326429A0A65BCD1368F0E16CB + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F10 +Output = E29EC6664BCBA00986DD9845F8C4B26472BFDDF98522E537B5D23D5D2A8D02C5 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F1011 +Output = 9451ABCA0B9756A183F8C9ADA834E1AD2400B693C33624E59F26C35AC1586E2B + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112 +Output = F03CB49A65FD3EF8FC83C52F029A3D73667D5B84DB429C38436619ED8320D12E + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F10111213 +Output = 759524B855037849812D62979A18F24D3E672C2663DEA9204BA5A639FB7DB292 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F1011121314 +Output = F352B8228FBFA0769C2E3858D7451FA603E9B751CFE780ED0F93C850C7870259 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415 +Output = 3491F4C8D916A1BC3824D1478EC746BE8C837415017ED52A1ABC30FB14DDE825 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F10111213141516 +Output = 0E6E35C5B9D706C2FF2C4C6CFCF254849879D6C1CB577E0A73BB12CBC7AC9740 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F1011121314151617 +Output = E7DB580663B113B57489E1107F2DCAF7CF80629E7CE1839E1ED044ECD0299E79 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718 +Output = 883500DB91747BAD8C5E122ED2338F3BCB6B43064F5DA9D1303E165815EC8CC4C5BFD31AEAE1B6A3 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F10111213141516171819 +Output = 24099AAAD4F19BF614ECC35DA9E3646F73AAFAA9C46975D4B56D72A332AF7EC4850B8294D94B7E1A + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A +Output = C24F8CCE3425AC9638145A0DAC28B59368583FF3A7AAD85FBE1AEAAB5D23C0B128A1F9BC575B785A + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B +Output = EFD0BC7612331A98F2D68F86E606717197BF57E35114234C675D40E9462ACF00DE7860C0F38677F7 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C +Output = 89171C602A315AD27EE1C7F903DCD08F48FF02D97EC59A079E9180B26F17BB010D8E56B3CDBF9006 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D +Output = 0AC1B4937C438DDE64E6733A70D3F1BF99393B2A3E6B42ABBCE6A8ECBB1F0665DCDC62530739E8FD + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E +Output = 3A4553B4613F602B0BFC11609616744CC99CAD4B1CA1FFC6568DF20FD2DC0B020CFC1E6ABD2820D4 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Output = 353B0F55E3569A4F11AC5434F94D9C4ADFAC2E289F98B6564FB7DF0EC116E77493C176868DBA1F6C + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20 +Output = B42ECF577992FFE257548A1BD920E8A2648EED647675B407A0E730C658AB3E917C284A6C4DF847E4D783A3BC614A2630 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021 +Output = 06D4BA477CD212C49B78C00D231FCCF7DAAE65742D889EE6C828D87D3C604EF3A14A95DE45EC537B7AC83B78C1CCACA3 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122 +Output = B056D034313D327E2A39E0930C0E43D79CA0A28F3323CD70AB19B381A0D71BB1AF7AB177B0D66B8DBE32178714917A7D + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223 +Output = DE3AD3A933A842B574767B7C6A7FB28F442EA3C94DF7BB81C38F392CFEB8B313E999E3A8248204499A051CE50EDEC5AA + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324 +Output = 3F6EB078FAF08FA5D3BE87EE047CF1ECBAE7FC70753DB67EB63B0A073E73847AD200BD241C91CB87BED689CF8F75C93B + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425 +Output = 445C7209CD605AAEF330EA0C5A6469728AD6B10C510F0CC59DDF26927E11FC5F2D0DC1375541A1F55BAF356D7EE53500 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223242526 +Output = 122A43F6FCF53F48127FB59F3F9CE1C6621F6B6342569908796AE1CF6E5F27BEA025E35ADDBC3B055DD365AB61485905 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 +Output = EAA9E4B5B6372DE37C283D751F0376E4BEAAED1F98FE31DA171910D66CF839AB8FE11AB892806F04AE4E217847802FD1 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728 +Output = 8DABB66ADB361581E5D68EF8A17A09D74A685F7507298362103F5853F9475F21434019F2E92485DA19D2B11F75CF90734231C1421290975C + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223242526272829 +Output = FC8D65BBCB5912874DF58EA60DD63D0E16951C10B05AC069A9764A11276D6AB8C968DA01674F230376F8FE6BEA8473A14D3C79EAEC52E003 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A +Output = 603C4F13DB9F651AC3DD6A3AC6CE056BE605C6D72E708A8424C451BD2C24F63352FA2BB693947689D2626CF273762E5FAEE361D793AF819F + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B +Output = CA10E89057844F6E968DC6A75125621FB6FA779D3D1773ED99891694B19D28B9C9B234EC7135A585AFFDBFA85E813EE54A22938D2B89FCD1 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C +Output = 6C64643E7386B22E2D0BDDE6E812DCAC90F3417D933E057725BDCA8253EF1868AC7152DE08668515DD136E476B00BDFA2F5DEEE0FA23D42D + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D +Output = 2FB135455B08C6EF5C7E835F09DC55078B3BF0B79C72308A25F5437DAD770A59D4E63EFBBA77E7C6A6316005E35082DDE15FD616A3EACEC1 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E +Output = EFDB7BC1EC888B698FA3190BDA302D68E4C854CE38E67790CF661BBC394AB2113BDE3AE202259490253B08FC7BDA36DF0C8DF62E0BBD3AEC + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F +Output = 6FB04EFCAE2CDC3B46A8A9C9834A28B1437C2E755BC594460E0621B46BBE0F5D4BBE181502EC9142F71A4A5B0871EE62E8BD5DF4BAF87357 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30 +Output = F0410A66EE0E4B9913243184284A7473B5E80E59149F23D2F85D5C58329678ADD62EF6038E1153B61772E3F5A7D2E2A65066663FE3B30D3F6D79F0EACBFFB307 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031 +Output = 9EA24A531B21B1D12AA0EF0CD620E46CCF557142ABC2DA7601C6D9C597D16C0CAD842ED4C791EEAAE9AC06AD66B58A44ACA0989B4ED09D9B1D1C07FF705E775C + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132 +Output = A3946C7481A0439B552DAAC3C804A9F9909CD5DAF5D5EC3EDA0D31AE5D99B541FB4D487C7588A786143E36002050C5F8E2DF0864708296F7CA1178588D252D66 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233 +Output = 3389BE82398B80DC86C88B506654437B51528119C26BCDF1F3A6470DF96B5A89D012B7ED0E58508BD244622E3AD919E22A2DB902A53336CF69ACD362194EF788 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323334 +Output = 2E206446A99B6F07DB75253AEB0ACA89CE55811509AA969BFE2952720FE1BD8CE840C2FE6E3E48E730B7B9856AC28D2941EADBC39F829567EECF8EE70A9FEA20 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435 +Output = EB6ECD5B0DEAEB3D61B9DF8581202E272591BF19F3EE052FAA217C5CD96AE15882ECD934D1CF15F2CD5CAD48E46DF1B889C756834FC9067B4BBCE71EF7FBE2CE + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233343536 +Output = 09EA967289A07CD184AB68484799B58A1AD4E47DD0FC1612480695F0CEA62A019D7DB9184DCBA2FA871B8D7F0A21B07DDB1D79A9912C4278A6C10517D6FE7607 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323334353637 +Output = B7B16D760E94318547FDCED193613311BB4C228544EB0D0026A3BFF85440411CECED8E9B72B2B088446E792058C5BEDEEAE42B622C97E7305DB06F49C06DBEEF + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738 +Output = D90841D6B936480461BF2D77FCC3FADF20177A3707FE0A47153271F05BEE51AF1D5B9EC466B1B43A45DC8E439924B6CE3BFD28EA33337036713FEFA82164986696ED78F14E9C3965 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233343536373839 +Output = 1EF61764EEF8B3A532C0CD60D01078719EA74AF30DCAE28A7508A30CB3EFE4352C315DD68C329C967975A8344C99D3234A056040860390416B387DC263396F7EFDEF5A5B92A6C4AD + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A +Output = A591BB3882464EDC11416ECA7995B7488EA8F1B89AFFCDE6FCDDDE60FDD45F51BB238A9503C7AACF750D8024F5B1DD39655558958585BDC842D07A34C35BB04719CC784212DED785 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B +Output = DCB4F791FB0C1867D90AF107256020B66E8ED09B898E626CCDCD55F5503774CADDC3B84E87A91E3CE749EC35A47E25F0C19B9C4C7D9705EA36EDF0D748471849AD61A8769685B2D7 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C +Output = 0AA8C1E34B37FDC58A1A9934BD14B523F20B6AB32F3AAC273E625081015A6E8CE95C891F522AFE87E580AB393CB8942E24DBE812DF74DB93029744184D144692701188BFFEB6E141 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D +Output = 9EEC100B358284F4E24AEECD3F3A87ACF45A67FB9FA46D5F77BC4F7272E544B2D7329A56AEAFBC668FABA50D73A37B00300DE3186AAD77949E28C12A04B65192225A9ED929FCF5E1 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E +Output = E5D51A1C59E955797CD79E962851315E788A72AFC17B003963A64D4713EF93D370129780ECACD566A9DE9AF289ECDF46FDA257D73658383C0C052EB9C70D034E29209568BF144D72 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F +Output = 3199D2B70CE5CDC5DD62F0CB48B1DE3EF07C836C49975841C7B972E661899A1CDA28253BCA33FEB3697C434CECF3EC76D979A3DFC3D862E22758A6B2468752249D2AA0B30EA2A447 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40 +Output = C1C6E77BF5D31BC960ED2045165DB2D6A73283B5511121055773EF2A241E7FD0CE61A71F11CA6488C73945970CB684F5E009CC86A1D3EB0BA5F294ABEE29B3D4424005F21E096EDF105088BF69908455 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F4041 +Output = 59C0B44AF3C63A77E8010B03463C261C03960B4BD0F1AEE7EB0EC2D0E7EBDD08E28FB8C41F24DD4FFC3EEA78C5800714CB4A963A9489E8017362BE33AEB2CF6D9231AE39641A2760E9E5265780FAC82A + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142 +Output = 72F38DBAE62DF7CB17D0E1BAF464224BC54A1C49D10FCAA70877F40B429384C8BEFC18EDBD9A65713A984151F97C3B0F2FA4D6127AE4FC8BED3DBD3A7073CBA8F174284DECE60D1556F8E5957D7881BC + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40414243 +Output = 1EADC50143A9A33DF1901C1BE115B9EE408561B03A7D0BACA7EE2698FA16485699BBC0D1C8BC74D87ADABB50CBB87976965CB01CFBA67035DC3189E98550B0C3902E1271313C81265F4521A732451E7B + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F4041424344 +Output = 4182301DA5BE6417C384943AFFF69A8B80AA7B2DECB55C1A9C29328B8CD16BC9540DB5B5FA751CE1B217E66E51E7168D269DCDB3E6130929DCB5E1741B31E439FC87D2AD81556E1E788BE8F0B370323A + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445 +Output = CD07B672EF635F47FD386FA62A8879FC304C8C2454CFAEAD21FB47FE30E4A4EC4ADD7C1EAB44D261B5DC18FB4EFFCDC56074D7B395E6559E9D5280B523E84A99862AD0BFE66D6980D0F59C56FC229773 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40414243444546 +Output = 69DBA0FB08140943E3FE98E4178646C6CC0B1B44585187CC1688AF21A140CB4BCFA8D370EBC00B612C21FF95FC32FDB3D089BC2F5812139864500D30D8F25D2DCA579439542906CF0C1AFB424A7A2D95 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F4041424344454647 +Output = E852B1E41E680E45CA8428DDE1A4B4D77C620E6F4EB4EB757C69BBB44EB66EE09F5EE6271F6933253C3D2BA20CDA9C5F22E7445DFFE598790C6BF1E3DB70A2B42707CB8CA0A0D28CD3ED32DFD1E1227E + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748 +Output = 5FD7FE77D721DA369BA9CFEB4548AF21518A088DF3951960A6ECA5CD52FFF0A5A89E3A0BD6609C7B40230E31173898A82B685F40E001A67D1F4B8619C6E537A9E03D8D620BF8086CE2F6A81322A6026C1A6585CC12D41D58 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40414243444546474849 +Output = 775509D94509D50839D8D4BCA6624F1DFC873CEC61EAF254DDC5BEDE233026E10625D7D5CF8BEB1C8518829E659F816FF1BE2D029390FE57FCEEBE1E3208C0D250C1F966C8E3FF27A4964E250AB7D732FF670B0E54EA4676 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A +Output = 862892008B4E499C6C6635CE7BA728DD25A6A83C043B66B6B5CE36028B72D3245F5B84BF22D7415BCE41F21D2104A43EBDBEEBD8D138AC4D15E32AD27A7FA88B91AEDFC382194ED728F09738B24F5413A74C0E0B13B4277F + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B +Output = 8F4F512116100D0ED926D1645ABFE94E00D126F0E9429A00CA69E8CCA1C8E70A7F4DF6F9B0AE1CBCB40BE2B05086B4A6F1B101E65187C71B91401B49AF313A593EF01B96855DB1ACDFD809D60DA8B1A682543D7F6AD6C337 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C +Output = F9DD0B7980B4114126972D2ED6208E3FDD95B2A767C4050C16063E7433E3085C148221376F5209FD6AACC359653D2ED254A987C35F1D440F00A39E2B14A8D8DD11ACBBD635C0A76B6628A63B12183F2138A0DA32C074AA82 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D +Output = 863710066B206EBF4035E0B8413D6A94872766EE52155624E9719A16769A975A5EF0595F3816B7993BAF035AE10D205DA4DEC0EE3AF5210582DFA063D347565B332ADF99459BB718928478F334F249B4B38FF8F7B2D2E813 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E +Output = 6E1C71E71669D7CCC469DBA5342B6C14192A0E25A086352A3DD4558A12E1C348FDB1923C31C63F560C08F963B50D4BE52C21989B7A6D83AA14CA8A6089124734734AC4CF4F4C6AC2721D76BCB811F91507E975E4058F1FAF + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F +Output = 518BF14BE0D60D53D184D05068C0795E6AB1846949937546886552F23581A4A934DB2496731E93BDCFD43A78343FBEFDBC8A8B55D5E1A94AD03EEF07BFD32CEECA1A8816BEE47B846E4A368A30D64C10B993CC041EA69073 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50 +Output = B1BC96690224BEAF3F51EE319CE697E8DAF7A666B676239F7C32B7FFE63040F601B8EDEF54D90B243A39C9CD56CDD3AC14CBE89F45D5958798F7DAB6B6F2092FC38F1D5BDA51F06ED67B75AF2587015B1AD21C10C63ACBFB0707D5CC651F8458 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F5051 +Output = 649D67FEF0AE7432B793DE16B3C27598088E87DFD1A4CDA952703412B3828DBA04F9188FD823C03F6221DDBAD16C3728D40FFA2FD88DB52964E556B28D5CE532A52DAC53C7C3258FF2EE12CE901825372A01DCFCAA07C0B55773532838D9CDF0 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152 +Output = 997555B6E7CBDF2D1A010AA7865CA84781A2FA2C4F32762D234A0895BC62004B6BDEE39953B6236B0889147398A8BFDD609D92531325E4B7926DA0B06CD9026B032A929F6172DDCB99C6D42D35F9FC94D6C3ADAF0522D5F3D05217405645FB16 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253 +Output = 7B8582D74051A6DB1B7483D26E0612B86E55ED0CBB7BA88A676049F6DE0EF4C9C4D719B66DECF1A5E6F23653B705E6BF9BDBF423F905944E51D65D1DC792A2D3554B4C427E9CA40B4C406AAF58ED611109F97DE8B05B1ACA8F9C76118F2AA925 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F5051525354 +Output = BA9D1128654C32AC040C7B8460774CADB9E38D9EA07D034FA83516D9E06802FB55F5872C16EF5695EAF6C6A9DAEEE83748793843F213C54A778D4524C72C5ADF5F02801FB2F6C2FC9EC4B8299A42BC33BEA4C7DDEB6A5CF492F4F757ED9A3A86 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455 +Output = DBEB24A8A1198084F973517C8457DB028ED6DB5D1E3D97AE75F1E33EF7D63148DD60AF68F6378E04CE46D6B466C46F4089AA94C36FB0BE591E8D41547A55534E3B004CE4AABE1890B258317EEA581682D9DA7891B2A3AD5186E579B7403A6910 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556 +Output = 9325A7B4B743ADBDEB4F8E9BF92672CBD3E6D29AED20B24415B8D8ADFF2C7652573401BBF7C45386AC6D93F70BFCFF2351489EFDA6720EB9C1BAADFE1D52CED1D0754B5F00EDC1CD8AE4654EB2E0215FC694E64B32A09CF7DA0FCCE5875E0A90 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F5051525354555657 +Output = D3CB65301588CB2820595CE0C0BA899E5A530A4BEEB29DAAB1D26BBAFE35A0A010E3D17A7BF87B3910465FCDA89BDF4EF564A4D801F31878A56625BCA8F55C2EE3ECDB754060DEADCFDDB8F9D11FBD6B7D2B44F6B016C350D04666584C1547CE + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758 +Output = 2DD836C8BDE95C111E549F7199096ADB2F7452E6986B8E736BD89EC01ABA1E8EC2DE7FD9F65FEFD42E5C572C61C5308CA673CD24C499037D8B7A33A35277526E83719D205E3DB0E79815D322D6A14388661D5B6A31D831AC76593D27944539C1FCC5440E0E42E53B + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556575859 +Output = DDB5299481F0419C5672D08DD6AFD92781D05095A9CB9F5F978A892D77615ED7ADF00B9A4B038E450EAF3BC12A38567E3A7732DA9DFFA6B18B341EBA79299C5855138B70DA6E5D3D859F510ECA7F9E0921E433C8814C5B07BEFEB48301A4F3945D7AC995DDDC529F + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A +Output = 4DB58952C398ED8D77C3B4E3677E4E2A282CA36C30B0590765061A2D849884738EE94521B3DEAC18CA8908C6BA8198ED8879BB7EA1B09E06E3770C2F92F1AFCE547DC30F761E568F496D5569FA9540D721F273B789919F3FA0BB10AF07D4C540DBEB8BDF2F939917 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B +Output = BB64F4A30DB269B6EC84E406E5C4706EEEA94370AD65736BEBDD945F5FD3AA85C22D74B47EC086093AEBFBF7A1E671ECA57A3E055AEB0C4B622B81A38EC6C3A1B5341E176AA8ABE20170C5A2B4CAAAF83E55DBC6B4E12339A53C116016EC806432E8198786EB4F4F + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C +Output = C293A47B576F6FCFC00A6E46D0C3BECAA9B2EAE0C043980AA45C87A8CF26472A6925F0EC62F18FC782D69FC9CDE34B8385E6EF343B7BC9BFBD5C6D9FFDF5E49649984C1E8D4238D5F15E75D928610E02BD590F5247EF85486BF327E59D2078E002C9207EF714E705 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D +Output = 3D4522574E9F3E495ADF7154555128FF59252FB5BB992568E3E9D7D22D9FAA288DB70C931CBFC5A2DA5FB89AF6BEBB0B703101E885677E885D8AA921E05689615E98A00182CF683BB36F2CF29A7C7432CA389587B6AB0AEE4165DDD3988A84B207F5FF22E12319FC + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E +Output = ADC07AD97AF4791C34CDCA604E787EF8519B1E82B69FA76F8BD561ADD476AD5C5ED35E9E2D4E5A8F69DBD5A4AF7F3B7C1C719F153BDF740B7C93C104FA44E9A695BF1AAFF7EA153A12CA7C2F7F09E7FF82D9934585347D2821D6D881AF14BFD4A596D2A5175E992D + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F +Output = E3A87C98F63177B4AEBCD213BB5599EE5691FD97A642D5F952DDF6DA711E3CFE64A8C04F348FEF20CDA5310DAD3214F0205749EF8AAC76C46CC9699C86EFEC02678DA53C6B1F2B72FC3FA3A8F6BA9B73E23E351F924831E8D7FBA13F9124CCC03D0383C092656027 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60 +Output = 1FD0A6C2E7496670A1FC367BBADAF2F1662E99837DBE2D65D8FE395B195CCBC07B34E843277562E13F908889D727EFCC45C13B90F87E7E6F4E4C8B2A51D4E085D221CE31B9E6EF1DDC68E832F510CD25B3043908A45C3E13F303C25491CCF3684D4E61FC1B2A0C5AF84A1CDE26CCD430 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061 +Output = 50E0D46EF0669E88808EB80B40B7E7A5BC93A4AE5DCE984BF3F6B8578441DF3236B8E9EA832B17F31E35105B0C3E66268D5749D9120C7D44655C8B318329FC41282BD3E776F0349138CD4B0ECCEB19D9F81BB5C095E8E115D6CC1438CA87922B2B40BCA4C84E501769066EF392B37DC0 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162 +Output = 1B69450C2540AA9FAACF0620A1F17565FE19D5C9150F4669E0B0D4B653FBA06DCF2291F9DB3B0BA9A9C00DAC7183AD9C4E0193F941C9451B2B9F80A89A4269525EFBE65D378AE2214EC3494A1A3029A0DE632C293ADEAD59AF250AC5604FCE40729BA7AE11407AB45382DB4A70F7B409 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263 +Output = 4AB48AAF9B1A82C1A41DEF775C4FDBB2AFA918B12607F8A27B91CEADA784DBEA27D3A427AC44436B9377632FCD0AD89D61F090C98A4055811ABE99D24137BBDDEBC8AA6D9781871CDDFBF35868E22FF7FB2167E6B08931C4BD8992DE6EB9A050D58DF8747550136BE664A9E5D410E90B + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626364 +Output = 9F3DBCF9DF717D45E73B834ED3C82D3DA01CCC566F8DD7CBC1946383660C1CD7748C9CB8E8C50D11D94E9B4F2BEAE2DE8AFED2864F6601FA479A77359BB77493C2DDC2D7F1480882DB03140E716765A6A0483C53557609EE9D378EC53A9901B7ABF08B088B77B8F4729C81965E8C777C + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465 +Output = 00D45FE14E3D338187B9119EE7672BC31425BB5983CED91A7F417A0A449D5A813EDC86ACE59A09654D1F3BC05A9E32DA138E8D1D206F58468291DE5943DB9133C5E47BA79E0BC665E839E01000C4317260E5EAD914C3B3FFA15C9638734CA71EAC37AF1B80F1C1045D49933E43B93FD1 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263646566 +Output = 9EAE24ED81F3B829763EBA904EAFE5A12A7212526DAF6441A53C8E9EF1608E0C8AB69BD5DB988105FF6029904CDC26357F53DD96457723748FE23E1DAE0B68692C8320CC62AFCE75C4D1BC6DDA07219F745AAC398960CE494CBE683B11DD49011B5E0CB353DF37E34D48278C06E3B9CB + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626364656667 +Output = 103E6859FA00EBBDF653FFEDEB45E8630A827D6E07B149ADC1DF74B41B3A4C3A2615E128E13610994A99EBA68A3F0B70964738AB9A4BFE5E057BABE30EE1FC9C4CD683CEC27DF9A20C72B5CAFC95400E7AC1BC951412C0E345A085662726780C132C7AA5C1CDE3B62D2647A346CF65D3 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768 +Output = 3074F4F18FDF69EBB6D9A9BD5D4E69D01E5EB2F061E291A496D45FAB0DA4A473DC29606493331A928938B6DDB99A6550B03993E673D769FDC0180734A5929445AD607930676BFD50D76453BC1C9B5842B0E05AFF04843BA444302BC7C12CC068D4C0EA5AB686558956CE2568F76CC7B950923C022188DE1A + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263646566676869 +Output = 24216B02FD43B829FF427C5141B2518DEA38E2374E8DC75647B0CACCCDDE3795219DAA28DC538A62A661553827120459EA88856CF1A74C9BA569D0689087E3EA5FA2AD8D359032D2EDC84823F5FCE389E09D5543DC1AC387AB9022F9B2FFC8C088231D5052D9CC2C5756496E65E55ABCA3667851A842714C + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A +Output = 59039CDBE79604BC8ACC0B5D6EC5725F96E65980F9FBF450772632ECE1EEF9CDDC634D97AF621299F084FB19D63203F35470614DFFFF84D96368A4006FD5FBF20D9D75B0CC4FF80BD0614327757664670B1E8DCA038BD5BF65C3DBC7FDB619E65E0DD3FA1BBE24AD9313A4EB2F15F54C74167C6C73ED6516 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B +Output = 0A51B1C2AC0406C5BE85E5F8727309DE78C6124FD917D12C8EEA624527D42FD9615F2E0697E10A129BDDE1F1E38128A4C3AEA8B910A0F8406C31C79986825EFD9F09D80DB0B91EACF0F4AAAC0032EF1CB6CBC0F548BAAEFB218B5D1634D7369B1D77F197BB2E7498ED0A3CB141D77336B642DACF31D5457A + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C +Output = F664CE868579486A99025A42697622757287A581D93624868D38ABF4373E7EEF4E12D1A76396A0C0F4D7CBD21E4CB1D98EF8BBD4926C96EDC48A7880050D16BD5A957CA3B140ED14BF66F9A377F34992DBAF39BE45B99C0325C09D272912B9004192E233F43D35BE68610E130D8C8C1488F1F0EBDBD6134A + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D +Output = 9082A582F7757F130DEDAE224FB38D1CFB0C21D2381A5D85052197217B1866769EB3B2B54B213CC8F8790DFF6A17AE2F88BE707AE27526367AE44A95926C7390F8EB36F473BD682FB5980015745F0999006A7BD5C0518965CF333F5A991A541B9D84AF8A0518573D9842D13BE4A7F7188F2619FDCD7A0379 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E +Output = 0EB4964ABCAAFC30588410830C84DBFACEB03244DDBEA08E4461CE01BED1EFC6AE641D73BF5F74B149A4849E584E3EB42470B6501EF20B45B378BA9ED031EAAD108440CF8DBD614CAB59EA67193CFF630311FDB802C285A08D5ED138C02E348062411F6B704676056BB7EEF6D33972B8573BF3320E2D979D + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F +Output = CD20F890025A664BDBC6530D9C790CC35A80B260BFA12D052816C394D5090735B9462B4B480C8ED1A44E2E416A14646000726496597F2BBE534570DE00678C0EB477B12E5D12E3660A2A87FE9F3981BEBB7A5E799145315D0E655188607AF187811DFB114A625BBACFFDF7028324FEB78E405A8AB7992AB0 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70 +Output = 1D4155755C898D95C6A9DF5CD5F1A3B787A116F9260BD2A69D0B0FD303306F6644D20C850511C40C310A7D4B43AA640BAC12C6038E136916055FC78179B3FC160B7DC87616EB423B5B1E355B1FE081DB8273A2CA508E974FDEB04CA9FBEC14A7029D18EA58C6AFCB081E261B06C4A5088EDAE1269FAD6439BD4DCE7F2A7DD3FC + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071 +Output = DA0AAD85CD857E0A4A6897B82A2A11EC9A5BAB108EF73D615424BA9A3E5CFA850AD9469096829AB8618E5967A7AF3AFE1FA583C650A95D0FFCE7EDEE48A7B935A49FE39EB0C1DB52CB6EBAA9C69829BC5E45340AA2FD149007283793E47FAF97BD45657C40411BEF86DBD0E9ACA6F49BE97734C26FB64CC1625895678C6DBF91 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172 +Output = 83F99171340C092801A8482B2FAC5CA3405135D2760503AF3897C08F4217A3BCC08C2E8ECA5230E7D5E48B65EAC41A1DD3F43B8082DAC23EF161C6DF3E88706DC31104FA970227740097F2DF3C0576E70918064B2739B330F35DD7D02A3D144D4F9A5808C33FA98ED56BF3DD25D67CA986CDB14F5DC11BCE798761E7C849AA9D + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273 +Output = 6DD9D141E47A6948E60AF60A31FB955B7358FD843849B03798F3F8B3B28C4BB009FB55EA321F349E844526FDC183FEDC49FC2C6B54D260FBB3D7E20B3E1BE66B0C37ADF9E7F5EDEDEFB238162A01C59421CC8412637E9E9EE59D26C859BBBD7993B27C78084247D4CA894BFC4338952F2AE4669FE3456BE8F0591F5C92882649 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374 +Output = FBFCDEDB9E03C58077E12BFC87F86B7CD3FCACF0DB9D9A31FDDC36E4ECB2B23DFA7974055F3F5A1FF6E8136CF9C708F66F12994087C866E3F85504A3B9724D17938C199F6503BE6A30170296CAB00A2DB1E6CF0963780E58E1FA56E569244369EECC24B4B92FA2B349B8841626DFCE53FE4C36746086F1974ADAF2BA3DBACE2F + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475 +Output = D1A1F1F7C2995DBD4BDB66CB367D6AA995B45CEB202EBD939EFA50D635336855AAFF2E7C548496A259CB4B34795B8099FA086AC00880EA25F3C345A77F40AC967DC91F181E19FCD4E3A5FB73B15B1FA83232DB970F7B30BE98E88BFD4CA0B475C1B7AA831078AC37160D581717E6D546FEA5FAA8EA99C9AEDA4EA471F33B3194 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576 +Output = D376E69BC513EFBB8CA8FBCC2635965E295CCD1C0C27CC6EB5DFE443A585F4DDDA6DAE207A56BCFD1362E4ACE1BFA975AF1212824D65B732E41A1D92D2CFE57F2A0198EBCF862ECFA9D22F024F47CCAE41178382FEC37A39088B94875B739EC64998F62A6417106A9C78BA28D70D06A93F90884AF6A30DD2FC6A21D9FAEE2064 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 +Output = B04E30E501339A530360D9A845CAE9548E0F27E36DB3950A1CBE927A5ED8B855F78E86E1429C1AC5206BB7DE4F4A08D90E166D35F7583C38E59C4A56B962D1800D79C7AD4C8561FA366EC9C0C9EAC00B5AA3C3C16DF1647E73A8C64F14989D2D6FBB4642C12EB19DC7B5A18F531BFDF92434238660B1BE43CA5821ADA82EBE75 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778 +Output = 260635AE31634020B6E488F6C95ABD2CCFB11510C1BD96C093608762F214057815ADBBFB2DE2BCE3027A4ECC1DA4C7A2F8CBCEA25D916ECA621671A9275C6C5E60ADD32C203F995C97C5531A86488D8E3BDD7968C35EC61C2CDFA861C8879B6B32F8D5979FCD5ED1C2E0365547397FA4DF1B60E64FA4A8AA0981DD2A1A9965DF081557F8BF43CD6B + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576777879 +Output = C7F38CB064D26263CDCD274AE9F35613FF1A2A4641591F6E946251FBBC64CA16039CA649F58995241AB67037563972DB55B9D12CFAD6E4128C361C353FFD8AC890D0D1C29991236AAB6C27DF09C24B6955A82777CD5F30BA372D46CB8A848B7AF91683B87EFC80EEF65C9404D2098E6218375D18920C7358E5AD2A1573440FA59F56FA7DBA5D40FC + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A +Output = 2D15CBC166B3EDFB652B09120251DFC5092756E66AE810B1957A9425B2A592D4D21C9E5DC63FBAF0F5079E94F11326599C8D9E71BCA4E9EA6FE11FBFB6901D6A7E2106C1354B18FF6329C6B3E76FDE3A01CC268B7A01562C55CE3B3BF261CDE406750CDAA016FA990951494E54B13469AA6143F205F8D86544C672EB8369A5F363CB0E8355D92083 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B +Output = 19BC8957D0E3C941EBDE22B87A81AE8B422BF122C0C4AD133DC11FF43529039DC9D8671CC4B073C9A1C52A86C0B8F917A0D747224671F87CF3CFFAC440A2843398311A12EEDE2709C4C75C9955BBD9B7D3B2E58B7BBB428D62F20C58C6985CB3292CD82D1E2350071C91FFA08F3C27AAC312B47BBCB5ADE3877F4AB64DA88C1F82D89E78A76E73F6 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C +Output = 80C4B26C03B3FC542BD0674E46BE692606D7D0107EAF03E4AC3DB176D9CE0CE5104A9E5E9CA94BBB402C35643FEB6D08D5C9B7496141033CDFAB7D02FA6293D2EF001354C9565B875CA781872D922B4A4BFC2948295D7FB7C6874DAF9D0F10F24FA07338E08054A02A30D4E27F1C4A7BE139971CF4F5F1862AD7E0C170F5ABFE13EC19F5D7E37CA2 + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D +Output = 0321201DA921361D45A6F9BF613CE15316945C2C3D52D9DDB2D6FA33549CFC4C0837FEBAB65E9AEB2777E4B4D367BC9F0A15683A1BB5805A3292A7DAC59CD1E73524F561FF1E2BDE898FB2605648B385F9A1AA38A10581F4F5DDB31DD54A777F91F21C1B8F61FCD5D3884AE083A5C90545B807FB3EEBD472A81B574718CEE428D5A0FAF776A5229A + +Key = 00000000000000000000000000000000 +Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E +Output = AF2187578A2495DB2A746058D04E2902C83134D727E750C37681015921A852D1E796D2B6D352C86A1F31B891C7EF5A7BB03CF2D61C941D6DC51F5DEDA91C512921E631C8287175EF9D49365F86B4D27160B0CDCC7755E1C60E52C60579014BD705BFEA6323CED9F4072A06CA00BD8A57F69BB87966CC34811DADAA52CC92823AC5DB2AFBA20369D8 + +[KWP.INVALID] diff --git a/src/tests/data/keywrap/nist_key_wrap_invalid.vec b/src/tests/data/keywrap/nist_key_wrap_invalid.vec new file mode 100644 index 000000000..97f2a18af --- /dev/null +++ b/src/tests/data/keywrap/nist_key_wrap_invalid.vec @@ -0,0 +1,36 @@ + +# From CAVS + +[KW] +Key = a377331672bf423c0e523d39bb549493 +Input = 1f3c7f161fa59b93b3df55ffa092b0e557f92397a0d40159 + +Key = accc4b014123f9e95d3c6f92d07da9fd +Input = 020cc7c82b6b7cd2ff4d28186930305edce13d65cc36d8d1 + +Key = 25be3d1d7fa0d1e6d7c97d78f80f538e +Input = 5913a3d046449f5a7ceb5e1e8576e2744b96f179978edcb8 + +Key = 95af5484f263f99346fc45578b651f0a +Input = ed6d3a9014809c0024d0b066e8a9850b6b27f5d320986a6c + +Key = 58f3ac243b1f937e6b131fb06b723277 +Input = d542544d8ff9d1454ecd2104b17d5f13756b2a6c8b15f5f3 + +Key = c5cbee63ff4ec496d7a4c4f2c09554ed +Input = e53da2e62d1a358678f91ff8e421eb84ab00b93239023ba4 + +Key = 5148bdfb74e1a52f5c8cb24c36981019 +Input = f39c78376db84fc611ef8566dfdb7ce42258abf6d9b73c581c61b23072d20b7a0aa3867bc8358c02d52a48f79a3a5996eda5942f7ac5c56b1ff04bde63948461100709f9a4fadbbb28daff6075c547ac0b575b5e34830a1fa0741bac2a4da4a51369289b6d8b2813dd181cb43a7524de145c1b32742e7b57d919d8b61d8487acc596121bcbbc18fd6fae7ba0c3dc6c177cc575a8c0d6b97e145ab9624bed55102aa0fbdd016d49cf284ace156f02a10402800bbe073f73a4a2d8d2d1f5327466a180033d6b7318d4179b9875b00875eb90f2eaf08d05e44e74192cc192aa2f5560a5718c0404560cc09ae09024984338c9b94e9df89ace66aedd8bce938f8fabaed3f31bb4960d85c626613f51b834442559c32e05d527b81c0f23998df7a511b2c45b994d3bbb46f822b22c1da212e33cdbcc625134e3b6e1b10fb8b9e84323067754c21906d555079bf48bc5b6942e4aac282800a2120c4bd4856e94f854a30a6042b9678a80210f3ed821992c5c9707db6e9ba38d58d694916aba87bf8ea6af6a0734924325e1ec996708b36bca5dd78aa7a6fffd7c123dc2f68f11ce36e1542421b532cac45d6863e07de4928e7c3ad8c24517b89df546e86eaa37d6412bb37416ecd0f8c1df43d67f0a93b655f1b27e24d7d1281e2c4b268acbaeb0ceb8ebcbfb56e55e7b703c714db84063c16eeda3477ce5d53736ff38e5436e68e735708faa11bbb96cc7 + +[KWP] + +Key = 659fc41b910ed045a76707d722ff6fa8 +Input = 4d4b37f9ca2416b2942f34f702f0cd37 + +Key = 49ba2b4ac8919de4e7e4cb2648b5dab6 +Input = 3d9afc5661d9c8e0343e1c362b9b2bc5 + +Key = 6801637408f46b912c14330a88ce02d9 +Input = 31f78f54d749e02014a8580f600ae1de796e08efa4f6b60230b979f133a0b735967304b67e280cf25805ab55a16765ba209a4eb66eeb902b90db633d9df1e71e1f707e8fc938adc415b051b6bfb452816f51cd820197b79d16816bd5263b10cd6ceec3239aa1288c731e146a9c8e7bd0 + diff --git a/src/tests/data/rfc3394.vec b/src/tests/data/keywrap/rfc3394.vec index 29192789c..29192789c 100644 --- a/src/tests/data/rfc3394.vec +++ b/src/tests/data/keywrap/rfc3394.vec diff --git a/src/tests/test_keywrap.cpp b/src/tests/test_keywrap.cpp index d710dfc68..a5b216562 100644 --- a/src/tests/test_keywrap.cpp +++ b/src/tests/test_keywrap.cpp @@ -10,6 +10,11 @@ #include <botan/rfc3394.h> #endif +#if defined(BOTAN_HAS_NIST_KEYWRAP) + #include <botan/nist_keywrap.h> + #include <botan/block_cipher.h> +#endif + namespace Botan_Tests { namespace { @@ -18,7 +23,7 @@ namespace { class RFC3394_Keywrap_Tests final : public Text_Based_Test { public: - RFC3394_Keywrap_Tests() : Text_Based_Test("rfc3394.vec", "Key,KEK,Output") {} + RFC3394_Keywrap_Tests() : Text_Based_Test("keywrap/rfc3394.vec", "Key,KEK,Output") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { @@ -50,6 +55,129 @@ class RFC3394_Keywrap_Tests final : public Text_Based_Test BOTAN_REGISTER_TEST("rfc3394", RFC3394_Keywrap_Tests); #endif +#if defined(BOTAN_HAS_NIST_KEYWRAP) && defined(BOTAN_HAS_AES) + +class NIST_Keywrap_Tests final : public Text_Based_Test + { + public: + NIST_Keywrap_Tests() : Text_Based_Test("keywrap/nist_key_wrap.vec", "Input,Key,Output") {} + + Test::Result run_one_test(const std::string& typ, const VarMap& vars) override + { + Test::Result result("NIST keywrap"); + + try + { + if(typ != "KW" && typ != "KWP") + throw Test_Error("Unknown type in NIST key wrap tests"); + + const std::vector<uint8_t> expected = get_req_bin(vars, "Output"); + const std::vector<uint8_t> input = get_req_bin(vars, "Input"); + const std::vector<uint8_t> key = get_req_bin(vars, "Key"); + + std::unique_ptr<Botan::BlockCipher> bc = + Botan::BlockCipher::create_or_throw("AES-" + std::to_string(key.size()*8)); + + bc->set_key(key); + + std::vector<uint8_t> wrapped; + + if(typ == "KW") + { + wrapped = nist_key_wrap(input.data(), input.size(), *bc); + } + else if(typ == "KWP") + { + wrapped = nist_key_wrap_padded(input.data(), input.size(), *bc); + } + + result.test_eq("key wrap", wrapped, expected); + + try + { + Botan::secure_vector<uint8_t> unwrapped; + if(typ == "KW") + { + unwrapped = nist_key_unwrap(expected.data(), expected.size(), *bc); + } + else if(typ == "KWP") + { + unwrapped = nist_key_unwrap_padded(expected.data(), expected.size(), *bc); + } + + result.test_eq("key unwrap", unwrapped, input); + } + catch(Botan::Integrity_Failure& e) + { + result.test_failure("NIST key unwrap failed with integrity failure", e.what()); + } + } + catch(std::exception& e) + { + result.test_failure("", e.what()); + } + + return result; + } + + }; + +BOTAN_REGISTER_TEST("nist_key_wrap", NIST_Keywrap_Tests); + +class NIST_Keywrap_Invalid_Tests final : public Text_Based_Test + { + public: + NIST_Keywrap_Invalid_Tests() : Text_Based_Test("keywrap/nist_key_wrap_invalid.vec", "Key,Input") {} + + Test::Result run_one_test(const std::string& typ, const VarMap& vars) override + { + Test::Result result("NIST keywrap (invalid inputs)"); + + try + { + if(typ != "KW" && typ != "KWP") + throw Test_Error("Unknown type in NIST key wrap tests"); + + const std::vector<uint8_t> input = get_req_bin(vars, "Input"); + const std::vector<uint8_t> key = get_req_bin(vars, "Key"); + + std::unique_ptr<Botan::BlockCipher> bc = + Botan::BlockCipher::create_or_throw("AES-" + std::to_string(key.size()*8)); + + bc->set_key(key); + + try + { + Botan::secure_vector<uint8_t> unwrapped; + if(typ == "KW") + { + unwrapped = nist_key_unwrap(input.data(), input.size(), *bc); + } + else if(typ == "KWP") + { + unwrapped = nist_key_unwrap_padded(input.data(), input.size(), *bc); + } + + result.test_failure("Was able to unwrap invalid keywrap input"); + } + catch(Botan::Integrity_Failure) + { + result.test_success("Rejected invalid input"); + } + } + catch(std::exception& e) + { + result.test_failure("", e.what()); + } + + return result; + } + + }; + +BOTAN_REGISTER_TEST("nist_key_wrap_invalid", NIST_Keywrap_Invalid_Tests); +#endif + } } |