aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJack Lloyd <[email protected]>2016-12-04 15:59:52 -0500
committerJack Lloyd <[email protected]>2016-12-04 15:59:52 -0500
commitd44c00a0d311d9295653b1a7bffbc679967631f1 (patch)
treee4496204111a27dba1ac3cd5093bd8874efb1aa9 /src
parenta681421d01ea132ea3461f99641daacd9bd64df9 (diff)
Remove ECB mode
Not a good thing to offer at this level. If you know what you are doing for the strange special case where it is necessary, the raw BlockCipher interface is available and probably more convenient.
Diffstat (limited to 'src')
-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
10 files changed, 132 insertions, 270 deletions
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