aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/deprecated.txt2
-rw-r--r--src/build-data/policy/bsi.txt1
-rw-r--r--src/build-data/policy/modern.txt1
-rw-r--r--src/lib/modes/cipher_mode.cpp18
-rw-r--r--src/lib/modes/ecb/ecb.cpp145
-rw-r--r--src/lib/modes/ecb/ecb.h99
-rw-r--r--src/lib/modes/ecb/info.txt5
-rw-r--r--src/lib/modes/mode_pad/mode_pad.h2
-rw-r--r--src/tests/data/block/idea.vec4
-rw-r--r--src/tests/data/block/serpent.vec4
-rw-r--r--src/tests/data/block/xtea.vec123
11 files changed, 132 insertions, 272 deletions
diff --git a/doc/deprecated.txt b/doc/deprecated.txt
index 1a1a95242..cafb34d93 100644
--- a/doc/deprecated.txt
+++ b/doc/deprecated.txt
@@ -8,8 +8,6 @@ in the source.
Currently deprecated:
-- ECB Cipher_Mode for block ciphers
-
- 3DES and SEED ciphersuites in TLS
- DSA ciphersuites/certs in TLS
diff --git a/src/build-data/policy/bsi.txt b/src/build-data/policy/bsi.txt
index 782cf36dd..949626e0a 100644
--- a/src/build-data/policy/bsi.txt
+++ b/src/build-data/policy/bsi.txt
@@ -103,7 +103,6 @@ eax
ocb
siv
cfb
-ecb
# stream
chacha
diff --git a/src/build-data/policy/modern.txt b/src/build-data/policy/modern.txt
index e6b58dcf7..def5da2b8 100644
--- a/src/build-data/policy/modern.txt
+++ b/src/build-data/policy/modern.txt
@@ -101,7 +101,6 @@ md4
gost_3411
cfb
-ecb
ofb
elgamal
diff --git a/src/lib/modes/cipher_mode.cpp b/src/lib/modes/cipher_mode.cpp
index d622e7754..843e49581 100644
--- a/src/lib/modes/cipher_mode.cpp
+++ b/src/lib/modes/cipher_mode.cpp
@@ -18,10 +18,6 @@
#include <botan/aead.h>
#endif
-#if defined(BOTAN_HAS_MODE_ECB)
- #include <botan/ecb.h>
-#endif
-
#if defined(BOTAN_HAS_MODE_CBC)
#include <botan/cbc.h>
#endif
@@ -140,20 +136,6 @@ Cipher_Mode* get_cipher_mode(const std::string& algo, Cipher_Dir direction)
}
#endif
-#if defined(BOTAN_HAS_MODE_ECB)
- if(spec.algo_name() == "ECB")
- {
- std::unique_ptr<BlockCipherModePaddingMethod> pad(get_bc_pad(spec.arg(1, "NoPadding")));
- if(pad)
- {
- if(direction == ENCRYPTION)
- return new ECB_Encryption(bc.release(), pad.release());
- else
- return new ECB_Decryption(bc.release(), pad.release());
- }
- }
-#endif
-
#endif
return nullptr;
diff --git a/src/lib/modes/ecb/ecb.cpp b/src/lib/modes/ecb/ecb.cpp
deleted file mode 100644
index 78dff5ffa..000000000
--- a/src/lib/modes/ecb/ecb.cpp
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
-* ECB Mode
-* (C) 1999-2009,2013 Jack Lloyd
-* (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#include <botan/ecb.h>
-#include <botan/internal/rounding.h>
-
-namespace Botan {
-
-ECB_Mode::ECB_Mode(BlockCipher* cipher, BlockCipherModePaddingMethod* padding) :
- m_cipher(cipher),
- m_padding(padding)
- {
- if(!m_padding->valid_blocksize(cipher->block_size()))
- throw Invalid_Argument("Padding " + m_padding->name() +
- " cannot be used with " +
- cipher->name() + "/ECB");
- }
-
-void ECB_Mode::clear()
- {
- m_cipher->clear();
- }
-
-void ECB_Mode::reset()
- {
- // no msg state here
- return;
- }
-
-std::string ECB_Mode::name() const
- {
- return cipher().name() + "/ECB/" + padding().name();
- }
-
-size_t ECB_Mode::update_granularity() const
- {
- return cipher().parallel_bytes();
- }
-
-Key_Length_Specification ECB_Mode::key_spec() const
- {
- return cipher().key_spec();
- }
-
-size_t ECB_Mode::default_nonce_length() const
- {
- return 0;
- }
-
-bool ECB_Mode::valid_nonce_length(size_t n) const
- {
- return (n == 0);
- }
-
-void ECB_Mode::key_schedule(const byte key[], size_t length)
- {
- m_cipher->set_key(key, length);
- }
-
-void ECB_Mode::start_msg(const byte[], size_t nonce_len)
- {
- if(nonce_len != 0)
- throw Invalid_IV_Length(name(), nonce_len);
- }
-
-size_t ECB_Encryption::minimum_final_size() const
- {
- return 0;
- }
-
-size_t ECB_Encryption::output_length(size_t input_length) const
- {
- if(input_length == 0)
- return cipher().block_size();
- else
- return round_up(input_length, cipher().block_size());
- }
-
-size_t ECB_Encryption::process(uint8_t buf[], size_t sz)
- {
- const size_t BS = cipher().block_size();
- BOTAN_ASSERT(sz % BS == 0, "ECB input is full blocks");
- const size_t blocks = sz / BS;
- cipher().encrypt_n(buf, buf, blocks);
- return sz;
- }
-
-void ECB_Encryption::finish(secure_vector<byte>& buffer, size_t offset)
- {
- BOTAN_ASSERT(buffer.size() >= offset, "Offset is sane");
- const size_t sz = buffer.size() - offset;
-
- const size_t BS = cipher().block_size();
-
- const size_t bytes_in_final_block = sz % BS;
-
- padding().add_padding(buffer, bytes_in_final_block, BS);
-
- if(buffer.size() % BS)
- throw Exception("Did not pad to full block size in " + name());
-
- update(buffer, offset);
- }
-
-size_t ECB_Decryption::output_length(size_t input_length) const
- {
- return input_length;
- }
-
-size_t ECB_Decryption::minimum_final_size() const
- {
- return cipher().block_size();
- }
-
-size_t ECB_Decryption::process(uint8_t buf[], size_t sz)
- {
- const size_t BS = cipher().block_size();
- BOTAN_ASSERT(sz % BS == 0, "Input is full blocks");
- size_t blocks = sz / BS;
- cipher().decrypt_n(buf, buf, blocks);
- return sz;
- }
-
-void ECB_Decryption::finish(secure_vector<byte>& buffer, size_t offset)
- {
- BOTAN_ASSERT(buffer.size() >= offset, "Offset is sane");
- const size_t sz = buffer.size() - offset;
-
- const size_t BS = cipher().block_size();
-
- if(sz == 0 || sz % BS)
- throw Decoding_Error(name() + ": Ciphertext not a multiple of block size");
-
- update(buffer, offset);
-
- const size_t pad_bytes = BS - padding().unpad(&buffer[buffer.size()-BS], BS);
- buffer.resize(buffer.size() - pad_bytes); // remove padding
- }
-
-}
diff --git a/src/lib/modes/ecb/ecb.h b/src/lib/modes/ecb/ecb.h
deleted file mode 100644
index 9fc17a80d..000000000
--- a/src/lib/modes/ecb/ecb.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
-* ECB Mode
-* (C) 1999-2009,2013 Jack Lloyd
-* (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity
-*
-* Botan is released under the Simplified BSD License (see license.txt)
-*/
-
-#ifndef BOTAN_MODE_ECB_H__
-#define BOTAN_MODE_ECB_H__
-
-#include <botan/cipher_mode.h>
-#include <botan/block_cipher.h>
-#include <botan/mode_pad.h>
-
-namespace Botan {
-
-/**
-* ECB mode
-*/
-class BOTAN_DLL ECB_Mode : public Cipher_Mode
- {
- public:
- std::string name() const override;
-
- size_t update_granularity() const override;
-
- Key_Length_Specification key_spec() const override;
-
- size_t default_nonce_length() const override;
-
- bool valid_nonce_length(size_t n) const override;
-
- void clear() override;
-
- void reset() override;
-
- protected:
- ECB_Mode(BlockCipher* cipher, BlockCipherModePaddingMethod* padding);
-
- const BlockCipher& cipher() const { return *m_cipher; }
-
- const BlockCipherModePaddingMethod& padding() const { return *m_padding; }
-
- private:
- void start_msg(const byte nonce[], size_t nonce_len) override;
- void key_schedule(const byte key[], size_t length) override;
-
- std::unique_ptr<BlockCipher> m_cipher;
- std::unique_ptr<BlockCipherModePaddingMethod> m_padding;
- };
-
-/**
-* ECB Encryption
-*/
-class BOTAN_DLL ECB_Encryption final : public ECB_Mode
- {
- public:
- /**
- * @param cipher block cipher to use
- * @param padding padding method to use
- */
- ECB_Encryption(BlockCipher* cipher, BlockCipherModePaddingMethod* padding) :
- ECB_Mode(cipher, padding) {}
-
- size_t process(uint8_t buf[], size_t size) override;
-
- void finish(secure_vector<byte>& final_block, size_t offset = 0) override;
-
- size_t output_length(size_t input_length) const override;
-
- size_t minimum_final_size() const override;
- };
-
-/**
-* ECB Decryption
-*/
-class BOTAN_DLL ECB_Decryption final : public ECB_Mode
- {
- public:
- /**
- * @param cipher block cipher to use
- * @param padding padding method to use
- */
- ECB_Decryption(BlockCipher* cipher, BlockCipherModePaddingMethod* padding) :
- ECB_Mode(cipher, padding) {}
-
- size_t process(uint8_t buf[], size_t size) override;
-
- void finish(secure_vector<byte>& final_block, size_t offset = 0) override;
-
- size_t output_length(size_t input_length) const override;
-
- size_t minimum_final_size() const override;
- };
-
-}
-
-#endif
diff --git a/src/lib/modes/ecb/info.txt b/src/lib/modes/ecb/info.txt
deleted file mode 100644
index 5e7737717..000000000
--- a/src/lib/modes/ecb/info.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-define MODE_ECB 20131128
-
-<requires>
-mode_pad
-</requires>
diff --git a/src/lib/modes/mode_pad/mode_pad.h b/src/lib/modes/mode_pad/mode_pad.h
index 7c67ceaad..4f07bc6ae 100644
--- a/src/lib/modes/mode_pad/mode_pad.h
+++ b/src/lib/modes/mode_pad/mode_pad.h
@@ -1,5 +1,5 @@
/*
-* ECB/CBC Padding Methods
+* CBC Padding Methods
* (C) 1999-2008,2013 Jack Lloyd
* (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity
*
diff --git a/src/tests/data/block/idea.vec b/src/tests/data/block/idea.vec
index eee5ef5e9..3f9c2f4cf 100644
--- a/src/tests/data/block/idea.vec
+++ b/src/tests/data/block/idea.vec
@@ -94,6 +94,10 @@ Key = F2022315280960F16FD09741D13F693A
In = C309000000000000A02A000000000000B03D000000000000C9420000000000002B4C000000000000A04E0000000000009857000000000000C8600000000000000063000000000000F2660000000000008698000000000000729D00000000000034A000000000000023A500000000000010AE00000000000025AE00000000000030D600000000000064DB000000000000BCE1000000000000F6E70000000000004AEC00000000000080F9000000000000E0FE00000000000061FF000000000000
Out = 9C3C4F44BB50DF7367DAD70E6FED04E0AEB0344116C6E41F66A1A304E822132D8AFCC1727259D93DD6E742EAEF2FD8C03EAD7890DC4EFACBB8776F3439A3DB1B55D47DC6BC4A43349BA9E85FE178CD1ADBDD4E9D19CA1E7659341251586E13864A8C4E93A2616A0C18890A622452AD9FD09CB1A9CDC83ABF2FCFA325FA0117319C924852D426132D05DA82EEBC3C261A6036C6477FBE3F65C40B8B02C2F9D8C8B3084034AB3873CF22F20759C145ECCE92CE6B557D6DB959DA0B8AD4E0DFBCEA
+Key = 00010002000300040005000600070008
+In = 000000010002000301020304050607080019324B647D96AFF5202D5B9C671B08FAE6D2BEAA96826E0A141E28323C4650050A0F14191E2328050A0F14191E2328000000010002000301020304050607080019324B647D96AFF5202D5B9C671B08FAE6D2BEAA96826E0A141E28323C4650050A0F14191E2328050A0F14191E2328
+Out = 11FBED2B01986DE5540E5FEA18C2F8B19F0A0AB6E10CED78CF18FD7355E2C5C585DF52005608193D2F7DE750212FB7347B7314925DE59C097B7314925DE59C0911FBED2B01986DE5540E5FEA18C2F8B19F0A0AB6E10CED78CF18FD7355E2C5C585DF52005608193D2F7DE750212FB7347B7314925DE59C097B7314925DE59C09
+
Key = 67C6697351FF4AEC29CDBAABF2FBE346
In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C9475D8BE6189F95CBBA8990F95B1EBF1B305EFF700E9A13AE5CA0BCBD0484764BD1F231EA81C7B64C514735AC55E4B79633B706424119E09DCAAD4ACF21B10AF3B33CDE3504847155CBB6F2219BA9B7DF50BE11A1C7F23F829F8A41B13B5CA4EE8983238E0794D3D34BC5F4E77FACB6C05AC86212BAA1A55A2BE70B5733B045CD33694B3AFE2F0E49E4F321549FD824EA90870D4B28A2954489A0ABCD50E18A844AC5BF38E4CD72D9B0942E506C433AFCDA3847F2DADD47647DE321CEC4AC430F62023856CFBB20704F4EC0BB920BA86C33E05F1ECD96733B79950A3E314D3D934F75EA0F210A8F6059401BEB4BC4478FA4969E623D01ADA696A7E4C7E5125B34884533A94FB319990325744EE9BBCE9E525CF08F5E9E25E5360AAD2B2D085FA54D835E8D466826498D9A8877565705A8A3F62802944DE7CA5894E5759D351ADAC869580EC17E485F18C0C66F17CC07CBB22FCE466DA610B63AF62BC83B4692F3AFFAF271693AC071FB86D11342D8DEF4F89D4B66335C1C7E4248367D8ED9612EC453902D8E50AF89D7709D1A596C1F41F95AA82CA6C49AE90CD1668BAAC7AA6F2B4A8CA99B2C2372ACB08CF61C9C3805E6E0328DA4CD76A19EDD2D3994C798B0022569AD418D1FEE4D9CD45A391C601FFC92AD91501432FEE150287617C13629E69FC7281CD7165A63EAB49CF714BCE3A75A74F76EA7E64FF81EB61FDFEC39B67BF0DE98C7E4E32BDF97C8C6AC75BA43C02F4B2ED7216ECF3014DF000108B67CF99505B179F8ED4980A6103D1BCA70DBE9BBFAB0ED59801D6E5F2D6F67D3EC5168E212E2DAF02C6B963C98A1F7097DE0C56891A2B211B01070DD8FD8B16C2A1A4E3CFD292D2984B3561D555D16C33DDC2BCF7EDDE13EFE520C7E2ABDDA44D81881C531AEEEB66244C3B791EA8ACFB6A68F3584606472B260E0DD2EBB21F6C3A3BC0542AABBA4EF8F6C7169E731108DB0460220AA74D31B55B03A00D220D475DCD9B877856D5704C9C86EA0F98F2EB9C530DA7FA5AD8B0B5DB50C2FD5D095A2AA5E2A3FBB71347549A316332234ECE765B7571B64D216B28712E25CF3780F9DC629CD719B01E6D4A4FD17C731F4AE97BC05A310D7B9C36EDCA5BBC02DBB5DE3D52B65702D4C44C2495C897B5128030D2DB61E056FD1643C871FFCA4DB5A88A075EE10933A655573B1DEEF02F6E20024981E2A07FF8E34769E311B698B9419F1822A84BC8FDA2041A90F449FE154B48962DE81525CB5C8FAE6D45462786E53FA98D8A718A2C75A4BC6AEEBA7F39021567EA2B8CB6871B64F561AB1CE7905B901EE5
Out = 9C142A22EDF81444F47272B80A037C169E304393537CECE8003BD80F7B0544063B4A141F9A99D3C6820BAD98BECD914804F389EB2A50E1E2CF22161FC78B93660E07E2686E70AC0715299C4796F3559FDA802E61CB4ABBF42BAE516BD09FA410085A0A92C6F32A3797D19808D3B3D049B605852E970E5A1B8031D3DC34B5A273F54ED35E21D780204F4B3C512596237153BE9FAF74A44E9A9DCBE96D628AA58B1E3363A94DF540230B38A1ACA440432640E5387D92F1CC1A16F8628A4CB6229F513AB926300668CF97B27643C9C9D0C3030D0CDFBBCB69C3DB199E5D392A97A51DE6C9881AE5612A69FA0EA026F2F254B929201AFB3AFC8D977C3ED6E12F011892037D0F49B0144E07A0F0556F0BAC9B3F829C233265439AF711E0B5DD6EC813FD51281E8AA6F031B096C64EE8F03E041FE4DC6B5441141F2D4A308CE8EA77C6483E3CF565EC49CF27A0B13F28D3C63AD7FB6B3A96579D30C9D65F7BA86E56DA6D14AF3C7D170CB5BF5F21C70C1771354DA2850CFF8D9250273828C1FE60C4AC086049404E3D63E04935F03B057B4783B13CF49757A8B5ABB3D2E37E54B881D236F7DF7FE80E4AE33E9125F54AA96D96BFB15607F0800B215CBF9BB0F7E29080D8504E9BC1F78256593B9565E5AA5FA22032A47041B453D1B154A8D24CD59CF9AA6A8E55363F3DF2B6307ABA5134D67B0DF0AE4FE77F23BF7DF8504FE9DC7F32A8562E2DF585E639847DD624E55B0D0DCCDA72D0F1E072D82D4BC135DC5F7F9130956D401FAB1456527FE087A436C1511CDFEA58202D200E1817E360E8400AAE83B073A63596B033D7E83C6CAB7FDD7069C3B1718EAF60B937CD2458255E68FCD9514FD14AA6E27EC76E75F95F0A678A0F64D49C1B9B8F8DA56DDB8CE640FF6E7195F4A679165F9996F3DDF992E3CB4ED9E9084AFC0038E4BEFB467CC8170AF8F004082BBCB137BBD45C124BE8CEDC89DD565A24830889CE4B9781FC18803BDA1A0A4EB70DA35887B02F18CFF9329E2B7C31B0F5F0648E0508379B52C8FF91CEF939A040A8C20F2F27ED65553680729A2181B3B3C4AA02BFF8DF0A9228A87BBF52B48F473D0F9070C76E4DB6F09FFDFEB629BD0E1944B7016AF34187E2985AEAE30D6480A58F649A0C858E1F1458388A9E822A306AC1AA7465882DE78F242EF7B0CB45D68A057F00D8609587922C8FAD6F1A7FFA34BF2175FC516730A61CF82C6F866C978CC292BCC1F91E6AF1785FCDAA9A43A01E6AEE91E222F8AF8C989F2A4C50B7A1D45BC15E11E5E6E6EF720506B8DF564648BEBFE272C0A77D41295865108150CDB3620970A37DB94F1CC35E434DC33434D99871F6141EB57C9E648AD1BF70E2B7FCEB81EA871DD92F19C366EA532CA4A7BEF9242128B7ADDD308B58FFF5594CB4156A03C6A6ED3F27E8DB20FB2F4208422B7E9E0A4E63A0122560CFBC
diff --git a/src/tests/data/block/serpent.vec b/src/tests/data/block/serpent.vec
index 8a40c54b7..9e6b9eb07 100644
--- a/src/tests/data/block/serpent.vec
+++ b/src/tests/data/block/serpent.vec
@@ -10,6 +10,10 @@ Key = 0000000000000000000000000000000000000000000000000000000000000000
In = D095576FCEA3E3A7ED98D9F29073D78E2F6AA890CEA3E3A7ED98D9F29073D78ED095576F315C1C58ED98D9F29073D78E2F6AA890315C1C58ED98D9F29073D78ED095576FCEA3E3A71267260D9073D78E2F6AA890CEA3E3A71267260D9073D78ED095576F315C1C581267260D9073D78E2F6AA890315C1C581267260D9073D78E5718F3B4ED59D02DE5C40E9A826FFF30AC56479B43617B1C7C804629E36E93F520027AB27AB4CCF48F9973CC052E0A35C8DD678E5D5E8F67FAA0CB599C7886BD
Out = B90EE5862DE69168F2BDD5125B45472BA3E17E2DF4EA6F41B2017E37023F202AFD2951E466110BC6F4816EBF968CDD01C36EE750C51192B0C85D5BB2584AE06286069E27F65F454C6E3F7E9097DCEFAA00FA885A8854844C970338841CA2E24DA18A399A0AA2FD20EAA740A0CB6145B53D79E39A79CC14D97147F3D172F66BB19263BE9CA3CB9661695C1CCD1041F2E8C35E27B56BAA1AF03542B3DA703BFEF722AAA7F89676ADAA2923903B2A3DB526734448F52EDB9316CAFA7F095C24B0E7
+Key = 00000000000000000000000000000000
+In = D29D576FCEA3A3A7ED9099F29273D78E2D62A890CEA3A3A7ED9099F29273D78ED29D576F315C5C58ED9099F29273D78E2D62A890315C5C58ED9099F29273D78ED29D576FCEA3A3A7126F660D9273D78E2D62A890CEA3A3A7126F660D9273D78ED29D576F315C5C58126F660D9273D78E2D62A890315C5C58126F660D9273D78ED29D576FCEA3A3A7ED9099F26D8C28712D62A890CEA3A3A7ED9099F26D8C2871D29D576F315C5C58ED9099F26D8C28712D62A890315C5C58ED9099F26D8C2871D29D576FCEA3A3A7126F660D6D8C28712D62A890CEA3A3A7126F660D6D8C2871D29D576F315C5C58126F660D6D8C28712D62A890315C5C58126F660D6D8C2871AA26D561F567520E8AE47528C24C18D731A2193D9A97FED6922B17AAA6372B74BE5DEBD559E303C9C92B174A5107BBFEB626D8F65EDCCDF3AEE475C8A183772241DDE7C1F1631F5FDED4F42746471BD651D238BA86176EFE39E4695AAEB73B52EA5926CADAD8018962E469BA920CB8BF1EA9062E4D9CEDD5FAD4F4C7990367A4B966E5C5D2277288C61B96A559CC84AFB6A6583C5AACFCD6212B0BD8AEF3C6A9A11DDBD175639341052B0B384678D8D9352299B71DD880E29D1B96452DB86540B2288B968AE8B08648D1CE9606FD992D717EB02EB81A2E939D54ACA91087112D0D809C5EE82F477EBA7B956DBB23463B0F0190D616F5294112FFB7884E8B37F941BA1B505386B7428B88338188F7E718A3348230BF5CFA552F88D22463D9703A115351622E016BCA26918D17E13225F67EE4E3F2C46FE52ECBDA044C585717DC563A8403FF5309D62370B1DCF5A11EDD2F7D73602B70CD2553E44C1D3F170126155BBD9BE3A965B345E834718F651CEF6CC65E8C5C566E894817350F497816F1EEFA51FC91FEBB6E9F8CB141CC0EB6AF3C6F8380CBD3C996167F2F0E90E71B756C87EB62A4975356B28DCBF6A64A0BD107206D48FE6DBE19D50314B90AC87B8335706F9B26007071AD8105CFAA1C1E2FF7FEAE5CEC4D11477F24E6B2009068703C0E29E2950F2AC2DACD63DEEB5C7EFA9FDB9F3B740563D5518287DC981FC9CB46D4B5A5A86FEC08FE70D18297DCF51072DDBE038DA040EBB12C509F5940A212DDEB59F02132BE4581FC23EABAA960D6341D9352E36DFD6E4EAF0F6F439BC8CE73A9AB3164FF30350F2DC08E939A104D6DF0C2C28F8E2D44468A61278BB6B4294DAE45AE0CAA032FC97CD4D8C57FB83BBA8AFCAE22070BC882D3A42B38A09E65
+Out = B2288B968AE8B08648D1CE9606FD992D717EB02EB81A2E939D54ACA91087112D0D809C5EE82F477EBA7B956DBB23463B0F0190D616F5294112FFB7884E8B37F941BA1B505386B7428B88338188F7E718A3348230BF5CFA552F88D22463D9703A115351622E016BCA26918D17E13225F67EE4E3F2C46FE52ECBDA044C585717DC563A8403FF5309D62370B1DCF5A11EDD2F7D73602B70CD2553E44C1D3F170126155BBD9BE3A965B345E834718F651CEF6CC65E8C5C566E894817350F497816F1EEFA51FC91FEBB6E9F8CB141CC0EB6AF3C6F8380CBD3C996167F2F0E90E71B756C87EB62A4975356B28DCBF6A64A0BD107206D48FE6DBE19D50314B90AC87B8335706F9B26007071AD8105CFAA1C1E2FF7FEAE5CEC4D11477F24E6B2009068703C0E29E2950F2AC2DACD63DEEB5C7EFA9FDB9F3B740563D5518287DC981FC9CB46D4B5A5A86FEC08FE70D18297DCF51072DDBE038DA040EBB12C509F5940A212DDEB59F02132BE4581FC23EABAA960D6341D9352E36DFD6E4EAF0F6F439BC8CE73A9AB3164FF30350F2DC08E939A104D6DF0C2C28F8E2D44468A61278BB6B4294DAE45AE0CAA032FC97CD4D8C57FB83BBA8AFCAE22070BC882D3A42B38A09E6558A51ED82169DE7027CBE72452626CA3FF6BBF2FB2C574EC9D5656505B51688047AEA89DBBB5C4EBE819C5BDFDAB16033D2FE7D01071373624D99845D90E32C1708C609C4E75BE40D8DE77F8EA78C2CC98852792C22E971F29C2E125247FB43CAD1FD857DE9B8016C5971FFF86AD399ED669FEF7481FD73B9A45B1CFFE9C556DAE9A816916FB1F5822B2CEC8986F6E5B156775D0F6F432D57D351C62A24AFE63AE812270F7416D05E153E5AB703DCD3FF320F6AD3D00647C23F08699E0EE9F5EDDB3C717C2A6D3E58D38269DBA0243926D64CCD92B1101086DD3F0DDB73312A31D5F5EA0FD18AB84E242C96FFCC222F9FE12D5B15F5A3C365E9FF3248FB43B385A0F73507F49A08E68952BEE09DC7D35E7B29A44C8970624CB3A93DA4AE7E49835AE41A5BE2EE591750FF9A7D431B1EE8A69099E689A06324AA0AE431ACAE762FD3B90A8B269090A4CEEA076CF1EB7A580DEDE896BED63917384B1C5E18B7B57A7EB6B127A7A32898989E32CFF9A46BF6A62268500E53AD8A5FBC95226266BD9AAE1BA501274C49A7A7EC67D7577114B7707DAB9D066AF086C09E7DD4116CEA6EE25DA9A65EF05A31ED0BDF56D525EC8968D1D01AF7165C5AEAC76BD367A575A
+
Key = 000000000000000000000000000000000000000000000000
In = D29D576FCEABA3A7ED9899F2927BD78E
Out = 130E353E1037C22405E8FAEFB2C3C3E9
diff --git a/src/tests/data/block/xtea.vec b/src/tests/data/block/xtea.vec
index e2377c887..27b88ae99 100644
--- a/src/tests/data/block/xtea.vec
+++ b/src/tests/data/block/xtea.vec
@@ -147,3 +147,126 @@ Key = A6BFB85FA91B8CA4197C8B502A62F972
In = 3DAADD7A9633E19B
Out = 4DE5C07EA1564A64
+Key = DD0C8719A8DA117DD9D1DAA189E65654
+In = E197D59E064818B7C8AD72C29E227E09
+Out = 04CD161E422154E5BCA5249582B9D4C0
+
+Key = D8C8ACF6B4B68A837639320798994979
+In = AE53AA320088B4042EAAEE3649FE6E36445696F01CA40D3C
+Out = A3B303C42178F97F719449529D51511491B41EB70E6101C6
+
+Key = 24059EA6D8A9F0CA678ED6680362596F
+In = 655A6B1D6970ABA078819E5AE1D08471A0E01E0A5C64E612504F4BD9BE4A8AE8
+Out = 7DB966E1A2B7C0E8EAA9D308EF89652A5857461D100DD0CEF9C6FE7BB4DFE33A
+
+Key = 2434D48F17E0A7D91F255FCE60F3D6EA
+In = F3B1BB81C053DB02A8515885CA6DF124AB04927D2AAF6F0032BF17B4B437E1F2C7D82F89BAD898DF
+Out = 215D5ABF53C4AA0D7571A0D9D05C3B6D33D65BF35EFFA4778FF59DEE90900ACDD4FC6645368A294F
+
+Key = 18C1E1EB3925EEC61559DB74EC99491B
+In = 06F0A1AD9F9EAA665044D0A2EFA10ABC30F7FBA3FC47C6AE1947B7E9B47733547E5C843DAC59D09393835061D834971E
+Out = 066309B116A6692F279F2526FD284E75479BF7FB5F63096AD7108CFB0DB39062A2627594F098F0BF5A3B4C67CF29E993
+
+Key = 5258617DB39A2968B1EB02565A2BDD1D
+In = 2FA1106E95056E070352666F059A72DF6CC949BB3161D5FFD8FE46451444D096BBD606B0BD443189AF001E5BBBA134DB1FEA7AE9B4587438
+Out = 1DF05B34A733F83B7DA1F194507904CDA99C374174AAB472CC598E06960263BD9DD0EFA2F4C14CC8AF4039A55EC00125766D25FBB7139081
+
+Key = C4A02982C1291093144C64DA1E7E3D67
+In = E6ABE28FD1E9392CFC65978D586D31D344140673E345D6AA06C75E1C03E4E314831EB94ABCAF6B23F2C34670A79500C6142EE722FD7E408D751DCB30E5C63F5D
+Out = 3EC6FE802F4EAA740DDF34EB79798F458049FE09190D12455EDD6129BAE85D22FF4E96AEB59DB9413DC24D41730454F65C443C819265B4CDBFB87F5ADDE7F4EA
+
+Key = 58B61987700468A366178595E20A365A
+In = 213595590E62A55F241E3D4CFCA65C1BA23BF801ED05D25A8FD0A06A9846BE3C28B9BA45A2B32BE80ED468E007EB6EFF0EECDA4460A700977B84464631B642135BAB8519248CA0E0
+Out = 5A6D52C19193A6C002D58C15BD2490CAA36550B684A726C33F1A12DFA2D4764FB75EA336823833637765F37547103691B852FAB81BBD74EF6C20BB885AC42946998E74D2B8C2BB75
+
+Key = 75E691CF7E511D4B1A114C0E80BC7C7E
+In = 7DE080A1683521CEAF78AB4C3160D326A07FF4C6F446A94FEADFC0BC8464EB781D743694734C5938F7D2DE4822EFFF34A82EF0C2E11F92CF1E0B2989786FA990DA3AAEC7FC647675024BDB47F20C67A7
+Out = 1A5002651E1686F56A6BFDD8DC40DA9DCAE7E4773237720BAC8962DC2FEBCAAD885C4A62F13476B303B2700150F5CBA1CA976A753E6971095F175E8BA2D97E1F1C18FEBB0F8658DCE957E65DA18D38D8
+
+Key = 5161285DC54A3D9ECB691C0CDF987D33
+In = 739D59F39F57C04D1450926AD161AE7CF1522C4929CB299C2EE03842E3DA7AFD54AF4DEF19867E278678222C85D8901526E62A008D449478FE4249173B6E80980B9F91D09F7F5CA8A174EC73A57AA878E74F0315B6F3E15C
+Out = 59E210F2DF601ECB05F4FBAED1077A9AE1B783526DABCB881881BCD103658E03FD6C1D122508DD039470226BA0AA50AA087D40732D77D137DD2CC96824E24C44BA8955D250297C02E3D444F4F1E78F5A02C50C7314CE356C
+
+Key = 19B8DF4B8C9BEBE46AE4F71FDB4EF5D4
+In = 3A483364A30C28F9B932A11152D741304802030C60453D1E9433823A21F033DF5A6FB43FE9CCB423946DD363F9EEA9F0E60898652E8E4C4B6AB6410B468861CDCE22B3043BBF72520232EB34D1685274A3FDCBFD9753DAD0AE467CF7EE661145
+Out = 11AB2B4CC8CC30311EE2B979C6AF90C5EDF073CA2E483C2F0207E8E95AACC55F0120C9B0DC689A2B645EA1560FEBF3D027F0F24E551205091D04A72657209E814A9DAF3457ED96539FC1CC8937D76E2EB4854313E2C067F86EF889757E014B35
+
+Key = 3D29E84526A1D60D177C03632DBF1E96
+In = A9E72827F67035507B5F0747149A73AC2763000470087FD6F8F165FCB872AE7BA58CF568E1D70D28891881F0464207E5FF67CD2A707B71286DA7635085B3B68F9228A646A186C8D09D3E31B56562ACABD0D5AA32F608C54086642AEBB72767643C90B7DC02FF772F
+Out = 5AC440B8C9AF2D5843B125711F519D34DACF4D86CDBC856933C96D5B3CEA980E9DEC2F0E2BF6E8EEF38214D59B5562324C009953DCCC4ED2D6C6B55211AC5E0EDC7C8AD3F8760823D55365D84525E09DD3145DB6D700D9BAA4A92F38EAAD8CE33000A0ED72A1FEAF
+
+Key = 10E1FEA37BE818FD0CC1421E16A3151F
+In = D24A21AB1ECBCF2EF83A1FCBC1032EED930FE269AFF8EDCFEE26FB1A2DA9D063EAE522E841024B7FDEDCDD6BAA1126834C996B9FD09654901FA8830C64AB1F5CA3BE896D5E60BE29D08C9E0A4F07956551E618F1FBF46DC8255A4E2F4DC8DE5729CCBB39FAECEA0A4C45F53FCF5C3973
+Out = 2A2A34F1EB3F99FAFADAE4A68CC85799D9EB7B1F0277E71D56FBC395E3A93980B670D36B87153B90B8154EA962C39A049088665EBFE6D43A5E9A04A93F4D683DD509E27BD3AC659E5AEEE8B62EC3037C425EFEC0E726E8E572017940725A794E58817914308832AB59644B03D1155D33
+
+Key = 80477A99D76ADDF3DEBEF9E8FF185DFD
+In = 9CF0C3E72880B2C3FEB787D84866DB80D4B4EFA60E3708CE6FAF0ECC29EDED0C8D9EB26957F1DF63FD39EB11158DD089B9622D161AA83E0BB921067F77D6F4479B17FB9C9F30C4F56A86EEF38733C8D557053BD4978E41B965CF1F2025402836AC90935E9564BF23F5FC76F29DDBA491446695A82D54514C
+Out = 3A8E38AC17AD900742F711491153A7FB93C04F981CF75FB34FC9B28A2C24A81C60AC4585DFE04FC026B6731A8C2404E65DE9FDAFDD32685A3863EC4CC77490F8E0D3ED234152FAEF3C8E1BCE7E4BAFD1171141D5ACE23BB3E5EAB0F20D000371DEF9E831BF716B6AC5EC2313F013766071F3AAD4492FD780
+
+Key = 978393BF38701AE612953AE4C060B632
+In = C1BB0B801F25223FCDF8CF13251877AA8472CA6924C0F51F1C968E981CFEF665F99EC57E4C33C3B083D7DC62DC0096B062CBB6DDF4D39DC28843A74E81A5F9558FD9F5F74D3857BF01A341BA443A2440C85CF069A757AA0E1ADD2B67860F3BEA805EAE1316BFD5638C312E96614607B5BD816B55FA16C301B71212B5B1203F2B
+Out = D481D95387B075DDB6771A669D3E11AC591A629B53405802F016E710D5E919E195A4553CF83337ABBBD506131F363D2BB5A8D3B542AE8A99B4D4641C373BABFE737C14AC6612FE466D2A83C867F42D4004685B230D3FC1C23D3410D767353A5C523B0B36E0D35D9B3D9605AE9C8402D0F7679A3573F3354E6BE0F2D173355B6B
+
+Key = 9A4972A00B5C1B22AA07DA8C1C8B8FF9
+In = 0C0627A330788002C9DCDFBBF23F46ECFF4CF793D93D934CC553A64ABAD1DEA3710F775C71D54412BB3B6361B54C5E2DE7244CED9B546D146F20D8730FDD8AA155EAFFBEF34C70BE1F6199F67D88186ED039E00BB88B7DD13F071AA4C309CF92C10DE3882674B5C5C5EDB457F826C2D62724E1AD328CC09FB4113E083E4C4D31717FFA66914890CC
+Out = 5AAE35C53504B9DB9CBD7C00B01AF71772BE3E911DC6EBE45C1EBD331DD81CAAE710F9637B2B22C12BD16B0D84F0B41A59BF169938475F56B57347362C7E6EF4F9ABAEC9F44C3BF11BC2D02DD0DB00A8DB780A1D1B399C11485EAAE96E1AF12EDF48B4CF6FCCD343F16CD0565E843EB4FE1DFFC1EE2FA8E0F73839D6F6E131442154A4972F552DC4
+
+Key = 8EBCF7F6F9025BD94D2985A4D3982A84
+In = F2DF92A7AF36169DF9F2CE6DAAB0788284FEFC9D1C43619FAE6CB75576EE173DA697A01D96835B357C89B737794D0E5B2C7F02F8E5DB968E2D000AFCFDF9B17BFC8383832A2CA177CBE99385C9314F94977350C2D4B4AC6D37E0EC8F36E666C54011B2ABAD25CA922946A7B0C9FB5AAF54D618BBFE59C1751404200BA90051B5E54F64C7045B72B01681FCC6E7763F8B
+Out = F090795579AE3AFE49B96ECD3A8C01D449DA8AD81AEABAC135EB9CBB904647D5B1522B208F325C0597A2294CC1A10164551549B69E96F5AE72DDE9A4656AA533FBD7E98A6E66BE29663176D5621CD21F29494D1CF6D784432B1524BA56BC3E67E9FB4378190268B4DE6BA74B8B2B0E1EA52B75C45FCEA715B8A00B7D2456BCE2B45B192EDC10FE777FE53260F8E25397
+
+Key = C2A7EAFAE3BAD26025FBC1EC1F3B1342
+In = EE4C225C44528549B4F609723FB33467DBF135FAAB3F6C82DD9E3383714F39EBB31FA595850389D1BB1C1E9DDC3D1E0439F21B819B3D294B15EF81EA1E95C36E75D20B4C0D7C3765E97E9A2B9E03B5F5D5705DBB35C241779E232B0781EF9A3F371D89E451DC68F6F7E0AC8AEB7F8E41DEE6A0A86ED9195CCF12BDBD820243865FDD31B8D0F33418023E2089BF65A5C9D20E03DD7D4C8287
+Out = 355BDD01480727A7496347973315434AFD0D75AC1AAF3869A461F78EF5E5923A7C4F749F7929C497CDCA398F4CA868A860E0296A952BC115C07B38D5460753D134E8111C0C108136154EBC7A386921F754D1F116F474C4B7DC8B5515ECA301E30D1D4661FF2814621C0CE1CE812B317C94EE900FD23FC2D941504B345B5BCB4DF7CC3A01BD3D759E4A7C4C4FA893B6B230D21FEFFB69C0E4
+
+Key = 86014B66CAE76E61371F64A580B3A3F7
+In = FC2B09E77FD6C0DFAFA0EBA6AA058D2357A620E4EFE70E52E8136B5294EBCF97E3DB642E3062EDA1DD93DAF24E97FB14F41C53D38729105BB46DB59507B6152CBF7747537F9FC8A8CDAB5028AEBB26FA8B5E020D7E1D110C159425ADA07B6E2526106DB5C1B4E2F62B5FFDD398EF3581EEA831FC686389C19E679B394A79D24AA34403BAB37A8B313F82878605E027EED34926D390BCFBB1E786153B0379C382
+Out = F330598D81495B8AEFCBEF71B791A872B394E7A472E4E9E4D4C4DAABF7C2EDA0AF52CC162FF5001DF22EB012792A509C25566AD0BEBA50529F015CF3C4E6139C80373604EABA6F7593AF87B31E300A3A2C5B9DC10EB36DE921BDF7E5569BFE8A4155F6F5F272846194E0178B228E15DF6787AD158F0907205FA941D76BA4A4F2C121652806B463CC1DB8BDDE50776BBF19577A25A66B4DC3230870963E53A137
+
+Key = 372ADAC63D66E934514CB2E26B388F25
+In = 2642676CAE2461ADAADCE76CB12F9BE1A85DA497B5B6FA3FFFDA136E5ED6E53ABE52AA961D3D12EDA92644D9CCF6EE1C0023744BE75786CE57FCA3102D0E4AEFB3F6CF7E0FC1C74D37DDC4CBF3CD59560DE06209006A55E8C463156B8F1D81C7C9FDC270A39FDBD67F53A19673514569BD75BD747076C2CDBCF51C98995EDFE830CA8372279EA41819DC68ECA82B247653BA8EB10A8F909A762B74D9D46D7BB3E29C725C74504D0D
+Out = 20401A5F52C04821DB0609B9113ECE78977DB9A614CAEF283062D84985985C50090D64F5BE66BB90E68D75801900FEBFFEA8BD5790337BB0ED215011E541AE1285FB3B305E05F4A24E2CD6D3A62EE76CA4DDDD2E371A67E36DEA94EA5C26CA1D1B322F249DAD9C5DE435D7704B4F29A7D960EB9582316EC193C97BB5B64BBB2ADE27F250C2BFBDD48D660825EBE99E75C0E4354E0E5B84338E6361A5C9C368F095D3630C3E9878AD
+
+Key = B4BB2D7C1DCCF12BF555DFBFF33BFA09
+In = 26BA6EF5054908E2CE4618CFABAF79F8D87DA4605B7F33EFA1C6AA0F039E138CCA821C75F0B2D17E52932B25CDCDE78DA2BC77432786E865CB153E0A0C637E9691D08679075095EA47DC18F40435B2DDD071D066F3B2B792FA528C0A64725F2B07981A2FD91F658C49B75317FB963B2BB68430EC9FAAE98963A8EA85F62AD4F77E115D3FD979DB421A773F2454E6AF49BD950550B126921E2FA581EEDB2387EA285D652DA362BBABE6F7D8454074B6C9
+Out = 9CD37096F29ED2C56C7D2842883A79D712F6AB9F5F08AED655CFECAA2F482FF470D74597188C280E8FAA0B19B51B56A4A8B2B8E3ACE48927A61787341F5DC153621C14110710895E4AD3886ACE7599919C985C70A8B9A7891FA43D1CDDB30726A2D5027D77386E5E8B80BD7CBCBAA250269C250A8F2276E052A88997182528B947751DECC3E8555A8D4C6D6C223F7B6D431AE2C7931DB88200DA4D987FA0ADDF0C0C8997B7224E06F9701BFAAB2E99CB
+
+Key = FB8C5F864EAD033E0F3D427E76B5C9F5
+In = C1EFE0B080811DBEAB17EB4C00E62F695BA71BB8E27006187F6F224F29D83820BEF01EF26D3CD5FF85CD5B005FF0DE9A8795B20F31E4D98A3BAE15B7BFB60FB8642D77C12E488652A26B5E32116AA0F7177D1E3F46C31DFDF212683B08E84C0EE72A15466974FC5024F3A0FA2061F53AAA86B3A29114D165C150D6FBBF0F07645C91CB5C9EFBCB292ACCF7159203BF83A28FD040E92711854CDB4679A6D885FBADD29438BA11E9ECBA68F8BCD4433F7DCC6C263E41C3E64D
+Out = 781D45863F3047C63BDB423712F166E4E5D018A6CD05B70E1131622E93BD6E0CB56735B5335001B9B971A671475DF0EDBEC0FAB32DDFD422504A941860C223D86B77EE2A4F7CBC4434738CF7F59059EFC0CFE4693FA9BD553B5EF3C1F311FDB66C8B4117620126768A74227874D9BC89FECA06CEBCEE39528378B1B5915543453E667860D94C0406543B341175650D865D245225B0964BE723516490D8F908DA7B73A72C790A5B6CD6B980D0FF8DEFE9BE0859163D3527D5
+
+Key = 4ABBB43F2BF9C69B02AED5D4D82310F2
+In = B863168DAF023E33D00F90F5BD076FA62F3BFADC93F0A1EE0E1466DC87507BE3E0420F884D40511F5C1A6DC912E70F33EC90D52E2F98FBE89EF076E3A95CF011F6ABA8A946B409C196ED86094597D35C548EF84ACAD0CB3E292CFC4D43183F4D97C43BFC5445A5DDF396159F9662D0D844391075E5A209A00CFD49AA86519F7C3DE285D9DD02F3924D0836C725AA0669F3B98C4B42AC893B90F55D4F07B83CAD7F693BF49D72423A369E7FC563D44229CBFB5F7A25EEBB50DBDCA0852851D417
+Out = 3F22A08DF104CB891887000C0B975296A0A736B7D074739DBB7B16100EC96EA30F84438E3C9B6F38063C2C4FD8B39262D828F000B8176D6793F8537598DA976A29228966AF45F698BE394FD0FBFED864BB1B81BCEF8D9FED2BC7FBECEFC31D319D6C54648C9C0ADBB83B18A56E8C1D72DB37FD24EABA87F6C9767E3B3FA4566DA71D03539EB8E558390EFB8B1839AFEBE11FCD2F81774674228FB965D4A78164E57F5348DB47E06C0D2507B9738F3750D1780D49E485B9CF89A7C716F9A628AF
+
+Key = 8C366409428A56AD49CF09F5C790325F
+In = FB669C4A5B01B8808E3A7A08E47D2ECE63202C4F896402163D88BDE3FA02A0C7EA924B808AC430A3A157B09FDA1991A18DE25F842E2DD3A221AD2804660791AE592E60D9991C59D6D0E50CA49F1F4FF5AABA0C81DA2C36EC169B420745357B82201009C2E2EF15853C65647FC93B587E25415AAABB8AAA7B441F8E1616A1DDBA24C83935C5A4755C19719837AC1EFC7275B37E264B1AF004513D53BC94BFF7D6763AB8AEA592FFCE8725BF2CC06C711AA2691475CDCDB82A28ABFBB1D166A20D3563B66060699F16
+Out = EF73A9BB5596BC30BAF024316E5085A71F83CA9C8BBEBA4C0F5EACE57BD0F19A9688590B4F255E048E90EE2F8316885ABBC82BD6F15FD6AD56C3C58D5FE6BF3BBBC6795E4E9D424EB570CA5775B39EF117F4D0337F88E6B3096F0206F89D01F1EEB39A388F42C44CB03AD06A6A4E914D545499852E2EC5F1F35556515FC7D04E884D48D92BB1ED179C485EE5E5B136F81BEDF14ABB843AC9292B80440FDB5CDD50EB573C744AF2444BDFFFD785FE3535F698F446B533FECEFC1ADF7752916B2B77C68F1AD08A77B5
+
+Key = 0D852CA9C6CB0FA6A95F2B0D414A6F19
+In = 379AC957E6721F2C33CFA9C8E8FAA85B3AE28E346E99FAFE06C5F2497724D800C332A3DE25424523CBDEBB0EA95AA31C88B8A00ED3CF0E90B42BC1CF690618CC15796E1966AA57067D5B7E172A1F818C1C7EAF58C27E6EB3F647879E9785FC8362210C8E8C458A60AF1CFDBEF698869E3347645C6D9AE7407F8DC7A1F84B20C1CEB17E33320F9BECC4B3E8E450BE9F5956F74CF33F764526F097DFCB63C57C9798F791B471C494062BB6675C374EA7273E69C12B5349172AEED9C66AF0380490B74F2293AA22DA87976580994A5109B5
+Out = 7AE8556DD6A8EE6E86499658479AE39CC400452F06071044CD165FF5C2B85FD59DE4BFEC7FBFE20F578C1E21A53BC896D3FE5D77C7F908FA96A68FADA439645F621ACDDD9E2F351F1E4D87BE5BCA2D6C93584DC331DD623925B630EC01C296F64F71DF0DD92232C7B0A0DB821B1761A442CA73EC3FCBAB386B0FFA35754ED91B113D51CD9239DF73ED46BBE1485075BAAAFAC363F541870AA96EE7F21C4ECDBC0DA9F309B2CAB1C77D6220B2BC9EF5F2319607D7C3D32C9F007C21CCA676872818085C971FFB778138C5398EE372DEC9
+
+Key = C071C64B7DBA548A42CF9656521425FB
+In = 84B35BBFE1FFE781B931EEA1556DBA23D38673BB229EDBAAEA95A93736104DF3805D496895F105FC5433F698CAC70526A74EB67935788C35D87E6ACB63A285999CB981173BA6EB6F8402F89D4D2DBF0A5DE904D5BDFC4864C6E48B906090DC418E9A91BDA8BE63E3CB341B570EBA6C5095A478C0FF43C062E12FB180D0B74DA39F7B562FFE9F652B3FF4356BA024777AC34D7F84C45FEA5EC21BBAB205C6FF43EC92782BEEFD471DD8703FBD5DE167A829443F5F1EE398475A40049C2AB577B5A6BF2581420F38D22F46142B59C92ED80F44A22A49644843
+Out = 17B0379B31BE60CD613289C2176135F971DDAAC953B76C8B48BA9FFCA0A040EF00E97A320FD19C9D4CB269AC205DCEDA98DB7390992FA4FC567DE5A39ACF08DACE83858E03E3BDE07B75AB74CF4D90DA3FF2B95476F9A81853BFFEBD91450E71E4D5BB5291BEA641F877361112D65E7578390A71CA8778CFACD4D25F71C90D289AD29045358D1DC8E14983E75CCA03F12521969916432CB967202086B62B33AFE1FA5B5A68BD4BF19888922F814577ED0E4F09C50D884A7DAE5B08B2AABFA8FA159BEA131841CB0F3B63F826E36682208F78839D9E84D917
+
+Key = BC12C0EA9A1D8C2F0CA4F4683EFB8E38
+In = AC1211AABCB5E081D8C95FDD138A42FD6F1D808E37077D65D8FEAC80791E5D169A32B2F333CED7B84CFA383B430BD7611726230664C2471C0413CE30006872B0707DBDA38F9640D5E376D050DDD5526A3313AD1247B6CE98F1484D9FF0169B7190F8D4CBE10BC03234E3CA2581EEB98DC5969E2EB57A4C5A10DD5B5619D80D5A9B9C3595EAD7E0B5B622A5A2F685D70CD687BEA1876C74A29DE026C1F8F673D66F1171B1633A05393A9896705A8E504BC474083DB285BF8DD893D3D699505345EB97985948DA52A17AEABF279CC28E9793D360E8D707D5C36C0047BDC6ABE83E
+Out = 40BF0E1D3B5D92417849BBAE059D7EA6F22D409F5563957BAD0A4398F963AC823AE33A6F6E908AC004E94A5AB9E3E7C4184C94FC90EBFAC6CC70C60FE939453507BB65913FC9A97721A730880EFE22439DF0C516009A06FAE30F6CED63D9CEB707C331D0EDC2945EE3561EDAE176E525E66EEF01E4FE4880F8F7D79A32E45CF71300A262A5F78079C20D7A9EB543D2269579EC077A33EBCFB9289EB85C979951923ED96ADAA2984D6DEB1F5B3FA9CDD859EF877B7594E84B99E3A9D2C8B8F984428D18A1B59EBFB851CB8EF0B4719725CF07D73E580C18B537BE3AFB34186668
+
+Key = A114856E299B436E09F437C57B15109B
+In = 2D2E50EFC0C6378E1D6BF584C498600F883CB10A49E27325E20A018B0BB3F192C7462F1CF76636CB86F3CE38DBE3A70502A7A6F72EEFB76990773407DA628C11FBEC2E8478EF2F98F0BEDB6733F695CF0158B8CF5AF6097F84116CDF8B973F3B0A6BC863B12EFCEDF0AD18F4755974E9A05E554654115EA2B309DC37D41B7C1C6686C6470A7A528BFD2E8ECA7E28657ABB5BC34532C38365FA1BA9DAA3CEBC85A9F30195E6D4EB52EF8CD243AE7DB1D082501FCA2A93A4A81C4E1DEF5F4E0625BB088D0B2F4C31DC26561179DC3B46DFCACE0E82CA9A05058E2118194F6021CFDBE0D8C1D7B6D41B
+Out = A6A0348A6F587D6664381AE45F8A0BC69C51F7BF6C26755452CDDB4F1F101EA2224F61BCDBA8E97067DA55F4BF59A5D7CF12ABCF4DF18B92E4B6921569051F5E70F25698FE0D6C19B891B48A3E03EBD7FE4A79A250A8B5FE6662D4430725AC447B55BBDAFB259B323872B4EFBB452FB968E979006EA49A789F4C3743DBC1306AFBF5A4B1F421C99A3AA07A2E98A47B4DAF2204CECB2AA86FB9AB60125AD0CD94C799CF3EBEC65C6F4F2B864C11F513CEA9D6280CDF16B1F0E1F943A444786E1DCB1851681572ACA9571699B82CE9E5275E6999A1EEB599CC8A0583D11D47938324E95B67407A0D68
+
+Key = C722C9F2A15369264DB7F54FEB0207B8
+In = AFC793265B90D53B647275124998999B3D8C91440541DB7E8CB0E8837AEB4653FC35361B55D659148D9F25E3C109B1BB92C037397DA8F91CD5AF0B6EDE7667BFCF1DDCEE76AE83F167D937EB67005D48A9503315476A43A45001F621444C562563DE6901E969F6662249A6BDAB7A638405EA3AC01304FD2DB772CC7AC122CD3D65B749A3F31704910950B642C8E5654DC10B07C614C65A07BDE2AB52196999066284CF0F6EB66CD1A62C29B683A436C5BBC15704688BAB92972421903D53F2072F7B8D53B02B70F63E7A7503207360A4872E04CBADBFEB321BCDDEA5E89419FEDED04000065DF73BE58A79AB5BDF885E
+Out = 6CAE06C13E54BB2375E3D3C741E9C61D3813AB63CB157E54FAFD28E9A4D935E57D74032E5E669844D277F211B480F0E54E4F0B09C2242FE1D5EEFF32E1313759A47E7450B55E09C437D1EF3F60A0572134C2D9B5258414BA5D84774D65FE545F1B80E7FC06BD7669D05AFAA2271AEE74F8E0C247070CBA2FFCA62B6CE5BFB0B6E75055F099939AC44FEC6E9A3615FD57B3723119FF14C927BA06DFFA36E91744E035AE7A9F21625D74BB62C41802782201D1043E5B9AE266997FABBB42ED800EA1E2F2A4E78C265E3CBAA9979ED89A8FC6C9F16BC6802A5E7D2D819A7D8357B9C40B5BCC50726EBA3DD0791E11489771
+
+Key = BEF7E425E917D067300D40D19AE12ADE
+In = 936C9695CF82D4241CAEDA1E8C80DA52CA4837BBDD2158E2CCDAA99EFEC6F1FA29D6ADDD6FE3A660F50FC6C2AE456BF742081FB471A317707C523638AA27DD85621CDED72631C4690A857512265A11C283193BE33BBA6E77EACD56E9DF9541BDC3567814E98F0E6D57D9B25440FB7AB62AD9375B2A96F60C4E4B57AD02F62EAA06793D0C5761369447B9A0621EC2F9AFBE8F52E8720CCF67E4A1BC7285463E8DEAADC248CD8207739F04FD13F72E0A7A0CDDD5EA0B7111582A389C21F499BB4349E8BDFAB0925E4C299773A9A546913D37B7951C9052EE9455391880A77CC66F133FB8AF5CBDDB2433F3F9D52F94A15D8A9143D0729F6D60
+Out = 8144D92331D338C920C0BA0C6B32C6EE28BBCE148F6B56B5D2A12D029734A41B8B4071E4A7601A88E8CEB031DDD38E4588CCAA900E8E23AA1C3D4AAD39FB75B90A8C47ABE3641FC6B04EA1E74FD4B4B9E72310F79D25509B3DCA63BEB093A08F7149A23E0D548DD5C20449C90FB41C88CBB6D1D51D35DE46D4112090926A7948563487E34E7507CCBA9825BB48EA8709239CB49CBC0FC09447570E1FDE99E1316BC24A5CD38E53F613152BA9BAFEB065AE30CD73DADEF90E4E907C0E55EA0488B9CDD20926B3893D8429E4C9FCEA17087B6933064976F2503ACD2D8D0DF4CF6F10BFEC0C914B0C46E6FF575464FCEB1EDC01AFBE446F77AC
+
+Key = 19796BDCABF22920277106075D0E0EB0
+In = 23D35E037CBBA0A76A46DD433B547E17B54A81782A51D13829BA301250ECBEB0EB598F76BE470D8411E7E58516873B4C9BB87E4B41C4DA3BB941C3F8A9EEFAA507D30948692ADD5E53AF8EF3CE42D6944D8E2994F45F4090B8934BCB09B94B3BF04726F42B00ECF9D9893BAAABFAF712E022F82317CFEC8AAEB7242BAADEF7526833C2EA481816856BD423CC652CC04301C7212BBE69F251BEBFCACAF0F12A19F99EC4A88E4381403B24322133373ABE881C0F97D706EE4CBF3F5F7E69B8624F50270E508ED0487B0B8116BE1AF904C23B4F704BCB8AF92B118A912B5CD0D759C3F73A6331E1337B693B7EA65A017CB62C51A4E4AC7C6AB9530DE747FFCEF27C
+Out = D968A79959F5DCB6486FE846504AC0E8753E56410795AB9637BA84EDD9AFD692DA253ACFDE1FCEF40280D30BAD93AF2386B755835AD1CB18D472DAF37D7C69109DE9898E09C69DD8D5DAD6D6640246B28F905FC0B1329D44E9AD2DD4D5D467862AE364CE7A81D5433B00CAF11B9A1D7D54910CB2B01888348ED423A2BB40CE0CC23210CE10CB9B123AAA8F41A3B25114398160C0E9241CEF67F52CC419AD31E5E04C4CE91716ED99702AE69E7A1D501C47A53F81E611827C7694E9B4B9446F263FF1170F4CD70B432EFEF97F0916CC6BA81A8E11EC996526E9202F6910FE8A427CD0BC8C7BFA23D0DCE30FDD6C2F36B582A3C9B698BC5CC6CEB3F951B26D586B