aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/relnotes/1_11_8.rst12
-rw-r--r--src/lib/engine/core_engine/lookup_stream.cpp36
-rw-r--r--src/lib/stream/chacha/chacha.cpp166
-rw-r--r--src/lib/stream/chacha/chacha.h49
-rw-r--r--src/lib/stream/chacha/info.txt3
-rw-r--r--src/lib/stream/salsa20/salsa20.cpp138
-rw-r--r--src/lib/stream/salsa20/salsa20.h6
-rw-r--r--src/lib/utils/xor_buf.h53
-rw-r--r--src/tests/data/stream/chacha.vec26
-rw-r--r--src/tests/data/stream/ctr.vec18
-rw-r--r--src/tests/data/stream/ofb.vec8
-rw-r--r--src/tests/test_block.cpp6
-rw-r--r--src/tests/test_hash.cpp6
-rw-r--r--src/tests/test_mac.cpp6
-rw-r--r--src/tests/test_stream.cpp8
15 files changed, 437 insertions, 104 deletions
diff --git a/doc/relnotes/1_11_8.rst b/doc/relnotes/1_11_8.rst
index 533443f3b..a2928f2e5 100644
--- a/doc/relnotes/1_11_8.rst
+++ b/doc/relnotes/1_11_8.rst
@@ -1,6 +1,8 @@
Version 1.11.8, Not Yet Released
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+* The ChaCha20 cipher has been added
+
* The antique PBES1 private key encryption scheme (which only supports
DES or 64-bit RC2) has been removed.
@@ -8,3 +10,13 @@ Version 1.11.8, Not Yet Released
called, causing it to produce incorrect results for the following
message. It was reset correctly in final() so most usages should not
be affected.
+
+* A number of public key padding schemes have been renamed to match
+ the most common notation; for instance EME1 is now called OAEP and
+ EMSA4 is now called PSSR. Aliases are set which should allow all
+ current applications to continue to work unmodified.
+
+* A bug in the CFB encryption caused a few bytes past the end of the
+ final block to be read, though the actual output was not affected.
+
+* Various portability fixes for Visual C++ 2013, OS X, and x86-32.
diff --git a/src/lib/engine/core_engine/lookup_stream.cpp b/src/lib/engine/core_engine/lookup_stream.cpp
index b26bbedcd..8461fadc9 100644
--- a/src/lib/engine/core_engine/lookup_stream.cpp
+++ b/src/lib/engine/core_engine/lookup_stream.cpp
@@ -7,11 +7,24 @@
#include <botan/internal/core_engine.h>
#include <botan/scan_name.h>
+#include <botan/algo_factory.h>
+
+#if defined(BOTAN_HAS_OFB)
+ #include <botan/ofb.h>
+#endif
+
+#if defined(BOTAN_HAS_CTR_BE)
+ #include <botan/ctr.h>
+#endif
#if defined(BOTAN_HAS_RC4)
#include <botan/rc4.h>
#endif
+#if defined(BOTAN_HAS_CHACHA)
+ #include <botan/chacha.h>
+#endif
+
#if defined(BOTAN_HAS_SALSA20)
#include <botan/salsa20.h>
#endif
@@ -23,8 +36,24 @@ namespace Botan {
*/
StreamCipher*
Core_Engine::find_stream_cipher(const SCAN_Name& request,
- Algorithm_Factory&) const
+ Algorithm_Factory& af) const
{
+#if defined(BOTAN_HAS_OFB)
+ if(request.algo_name() == "OFB" && request.arg_count() == 1)
+ {
+ const BlockCipher* proto = af.prototype_block_cipher(request.arg(0));
+ return new OFB(proto->clone());
+ }
+#endif
+
+#if defined(BOTAN_HAS_CTR_BE)
+ if(request.algo_name() == "CTR-BE" && request.arg_count() == 1)
+ {
+ const BlockCipher* proto = af.prototype_block_cipher(request.arg(0));
+ return new CTR_BE(proto->clone());
+ }
+#endif
+
#if defined(BOTAN_HAS_RC4)
if(request.algo_name() == "RC4")
return new RC4(request.arg_as_integer(0, 0));
@@ -32,6 +61,11 @@ Core_Engine::find_stream_cipher(const SCAN_Name& request,
return new RC4(768);
#endif
+#if defined(BOTAN_HAS_CHACHA)
+ if(request.algo_name() == "ChaCha")
+ return new ChaCha;
+#endif
+
#if defined(BOTAN_HAS_SALSA20)
if(request.algo_name() == "Salsa20")
return new Salsa20;
diff --git a/src/lib/stream/chacha/chacha.cpp b/src/lib/stream/chacha/chacha.cpp
new file mode 100644
index 000000000..33db7ac92
--- /dev/null
+++ b/src/lib/stream/chacha/chacha.cpp
@@ -0,0 +1,166 @@
+/*
+* ChaCha
+* (C) 2014 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#include <botan/chacha.h>
+#include <botan/loadstor.h>
+#include <botan/rotate.h>
+#include <botan/internal/xor_buf.h>
+
+namespace Botan {
+
+void ChaCha::chacha(byte output[64], const u32bit input[16])
+ {
+ u32bit x00 = input[ 0], x01 = input[ 1], x02 = input[ 2], x03 = input[ 3],
+ x04 = input[ 4], x05 = input[ 5], x06 = input[ 6], x07 = input[ 7],
+ x08 = input[ 8], x09 = input[ 9], x10 = input[10], x11 = input[11],
+ x12 = input[12], x13 = input[13], x14 = input[14], x15 = input[15];
+
+#define CHACHA_QUARTER_ROUND(a, b, c, d) \
+ do { \
+ a += b; d ^= a; d = rotate_left(d, 16); \
+ c += d; b ^= c; b = rotate_left(b, 12); \
+ a += b; d ^= a; d = rotate_left(d, 8); \
+ c += d; b ^= c; b = rotate_left(b, 7); \
+ } while(0)
+
+ for(size_t i = 0; i != 10; ++i)
+ {
+ CHACHA_QUARTER_ROUND(x00, x04, x08, x12);
+ CHACHA_QUARTER_ROUND(x01, x05, x09, x13);
+ CHACHA_QUARTER_ROUND(x02, x06, x10, x14);
+ CHACHA_QUARTER_ROUND(x03, x07, x11, x15);
+
+ CHACHA_QUARTER_ROUND(x00, x05, x10, x15);
+ CHACHA_QUARTER_ROUND(x01, x06, x11, x12);
+ CHACHA_QUARTER_ROUND(x02, x07, x08, x13);
+ CHACHA_QUARTER_ROUND(x03, x04, x09, x14);
+ }
+
+#undef CHACHA_QUARTER_ROUND
+
+ store_le(x00 + input[ 0], output + 4 * 0);
+ store_le(x01 + input[ 1], output + 4 * 1);
+ store_le(x02 + input[ 2], output + 4 * 2);
+ store_le(x03 + input[ 3], output + 4 * 3);
+ store_le(x04 + input[ 4], output + 4 * 4);
+ store_le(x05 + input[ 5], output + 4 * 5);
+ store_le(x06 + input[ 6], output + 4 * 6);
+ store_le(x07 + input[ 7], output + 4 * 7);
+ store_le(x08 + input[ 8], output + 4 * 8);
+ store_le(x09 + input[ 9], output + 4 * 9);
+ store_le(x10 + input[10], output + 4 * 10);
+ store_le(x11 + input[11], output + 4 * 11);
+ store_le(x12 + input[12], output + 4 * 12);
+ store_le(x13 + input[13], output + 4 * 13);
+ store_le(x14 + input[14], output + 4 * 14);
+ store_le(x15 + input[15], output + 4 * 15);
+ }
+
+/*
+* Combine cipher stream with message
+*/
+void ChaCha::cipher(const byte in[], byte out[], size_t length)
+ {
+ while(length >= m_buffer.size() - m_position)
+ {
+ xor_buf(out, in, &m_buffer[m_position], m_buffer.size() - m_position);
+ length -= (m_buffer.size() - m_position);
+ in += (m_buffer.size() - m_position);
+ out += (m_buffer.size() - m_position);
+ chacha(&m_buffer[0], &m_state[0]);
+
+ ++m_state[12];
+ m_state[13] += (m_state[12] == 0);
+
+ m_position = 0;
+ }
+
+ xor_buf(out, in, &m_buffer[m_position], length);
+
+ m_position += length;
+ }
+
+/*
+* ChaCha Key Schedule
+*/
+void ChaCha::key_schedule(const byte key[], size_t length)
+ {
+ static const u32bit TAU[] =
+ { 0x61707865, 0x3120646e, 0x79622d36, 0x6b206574 };
+
+ static const u32bit SIGMA[] =
+ { 0x61707865, 0x3320646e, 0x79622d32, 0x6b206574 };
+
+ const u32bit* CONSTANTS = (length == 16) ? TAU : SIGMA;
+
+ m_state.resize(16);
+ m_buffer.resize(64);
+
+ m_state[0] = CONSTANTS[0];
+ m_state[1] = CONSTANTS[1];
+ m_state[2] = CONSTANTS[2];
+ m_state[3] = CONSTANTS[3];
+
+ m_state[4] = load_le<u32bit>(key, 0);
+ m_state[5] = load_le<u32bit>(key, 1);
+ m_state[6] = load_le<u32bit>(key, 2);
+ m_state[7] = load_le<u32bit>(key, 3);
+
+ if(length == 32)
+ key += 16;
+
+ m_state[8] = load_le<u32bit>(key, 0);
+ m_state[9] = load_le<u32bit>(key, 1);
+ m_state[10] = load_le<u32bit>(key, 2);
+ m_state[11] = load_le<u32bit>(key, 3);
+
+ m_position = 0;
+
+ const byte ZERO[8] = { 0 };
+ set_iv(ZERO, sizeof(ZERO));
+ }
+
+/*
+* Return the name of this type
+*/
+void ChaCha::set_iv(const byte iv[], size_t length)
+ {
+ if(!valid_iv_length(length))
+ throw Invalid_IV_Length(name(), length);
+
+ m_state[12] = 0;
+ m_state[13] = 0;
+
+ m_state[14] = load_le<u32bit>(iv, 0);
+ m_state[15] = load_le<u32bit>(iv, 1);
+
+ chacha(&m_buffer[0], &m_state[0]);
+ ++m_state[12];
+ m_state[13] += (m_state[12] == 0);
+
+ m_position = 0;
+ }
+
+/*
+* Return the name of this type
+*/
+std::string ChaCha::name() const
+ {
+ return "ChaCha";
+ }
+
+/*
+* Clear memory of sensitive data
+*/
+void ChaCha::clear()
+ {
+ zap(m_state);
+ zap(m_buffer);
+ m_position = 0;
+ }
+
+}
diff --git a/src/lib/stream/chacha/chacha.h b/src/lib/stream/chacha/chacha.h
new file mode 100644
index 000000000..b7d720685
--- /dev/null
+++ b/src/lib/stream/chacha/chacha.h
@@ -0,0 +1,49 @@
+/*
+* ChaCha20
+* (C) 2014 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#ifndef BOTAN_CHACHA_H__
+#define BOTAN_CHACHA_H__
+
+#include <botan/stream_cipher.h>
+
+namespace Botan {
+
+/**
+* DJB's ChaCha (http://cr.yp.to/chacha.html)
+*/
+class BOTAN_DLL ChaCha : public StreamCipher
+ {
+ public:
+ void cipher(const byte in[], byte out[], size_t length);
+
+ void set_iv(const byte iv[], size_t iv_len);
+
+ bool valid_iv_length(size_t iv_len) const
+ { return (iv_len == 8); }
+
+ Key_Length_Specification key_spec() const
+ {
+ return Key_Length_Specification(16, 32, 16);
+ }
+
+ void clear();
+ std::string name() const;
+
+ StreamCipher* clone() const { return new ChaCha; }
+ protected:
+ virtual void chacha(byte output[64], const u32bit input[16]);
+ private:
+ void key_schedule(const byte key[], size_t key_len);
+
+ secure_vector<u32bit> m_state;
+ secure_vector<byte> m_buffer;
+ size_t m_position = 0;
+ };
+
+}
+
+#endif
diff --git a/src/lib/stream/chacha/info.txt b/src/lib/stream/chacha/info.txt
new file mode 100644
index 000000000..666f14d53
--- /dev/null
+++ b/src/lib/stream/chacha/info.txt
@@ -0,0 +1,3 @@
+define CHACHA 20140103
+
+load_on auto
diff --git a/src/lib/stream/salsa20/salsa20.cpp b/src/lib/stream/salsa20/salsa20.cpp
index d8db69ae6..79426f0de 100644
--- a/src/lib/stream/salsa20/salsa20.cpp
+++ b/src/lib/stream/salsa20/salsa20.cpp
@@ -1,6 +1,6 @@
/*
* Salsa20 / XSalsa20
-* (C) 1999-2010 Jack Lloyd
+* (C) 1999-2010,2014 Jack Lloyd
*
* Distributed under the terms of the Botan license
*/
@@ -9,6 +9,7 @@
#include <botan/loadstor.h>
#include <botan/rotate.h>
#include <botan/internal/xor_buf.h>
+#include <botan/internal/simd_32.h>
namespace Botan {
@@ -98,29 +99,30 @@ void salsa20(byte output[64], const u32bit input[16])
}
+#undef SALSA20_QUARTER_ROUND
+
/*
* Combine cipher stream with message
*/
void Salsa20::cipher(const byte in[], byte out[], size_t length)
{
- while(length >= buffer.size() - position)
+ while(length >= m_buffer.size() - m_position)
{
- xor_buf(out, in, &buffer[position], buffer.size() - position);
- length -= (buffer.size() - position);
- in += (buffer.size() - position);
- out += (buffer.size() - position);
- salsa20(&buffer[0], &state[0]);
+ xor_buf(out, in, &m_buffer[m_position], m_buffer.size() - m_position);
+ length -= (m_buffer.size() - m_position);
+ in += (m_buffer.size() - m_position);
+ out += (m_buffer.size() - m_position);
+ salsa20(&m_buffer[0], &m_state[0]);
- ++state[8];
- if(!state[8]) // if overflow in state[8]
- ++state[9]; // carry to state[9]
+ ++m_state[8];
+ m_state[9] += (m_state[8] == 0);
- position = 0;
+ m_position = 0;
}
- xor_buf(out, in, &buffer[position], length);
+ xor_buf(out, in, &m_buffer[m_position], length);
- position += length;
+ m_position += length;
}
/*
@@ -134,41 +136,30 @@ void Salsa20::key_schedule(const byte key[], size_t length)
static const u32bit SIGMA[] =
{ 0x61707865, 0x3320646e, 0x79622d32, 0x6b206574 };
- state.resize(16);
- buffer.resize(64);
+ const u32bit* CONSTANTS = (length == 16) ? TAU : SIGMA;
- if(length == 16)
- {
- state[0] = TAU[0];
- state[1] = load_le<u32bit>(key, 0);
- state[2] = load_le<u32bit>(key, 1);
- state[3] = load_le<u32bit>(key, 2);
- state[4] = load_le<u32bit>(key, 3);
- state[5] = TAU[1];
- state[10] = TAU[2];
- state[11] = load_le<u32bit>(key, 0);
- state[12] = load_le<u32bit>(key, 1);
- state[13] = load_le<u32bit>(key, 2);
- state[14] = load_le<u32bit>(key, 3);
- state[15] = TAU[3];
- }
- else if(length == 32)
- {
- state[0] = SIGMA[0];
- state[1] = load_le<u32bit>(key, 0);
- state[2] = load_le<u32bit>(key, 1);
- state[3] = load_le<u32bit>(key, 2);
- state[4] = load_le<u32bit>(key, 3);
- state[5] = SIGMA[1];
- state[10] = SIGMA[2];
- state[11] = load_le<u32bit>(key, 4);
- state[12] = load_le<u32bit>(key, 5);
- state[13] = load_le<u32bit>(key, 6);
- state[14] = load_le<u32bit>(key, 7);
- state[15] = SIGMA[3];
- }
+ m_state.resize(16);
+ m_buffer.resize(64);
+
+ m_state[0] = CONSTANTS[0];
+ m_state[5] = CONSTANTS[1];
+ m_state[10] = CONSTANTS[2];
+ m_state[15] = CONSTANTS[3];
+
+ m_state[1] = load_le<u32bit>(key, 0);
+ m_state[2] = load_le<u32bit>(key, 1);
+ m_state[3] = load_le<u32bit>(key, 2);
+ m_state[4] = load_le<u32bit>(key, 3);
+
+ if(length == 32)
+ key += 16;
+
+ m_state[11] = load_le<u32bit>(key, 0);
+ m_state[12] = load_le<u32bit>(key, 1);
+ m_state[13] = load_le<u32bit>(key, 2);
+ m_state[14] = load_le<u32bit>(key, 3);
- position = 0;
+ m_position = 0;
const byte ZERO[8] = { 0 };
set_iv(ZERO, sizeof(ZERO));
@@ -185,41 +176,40 @@ void Salsa20::set_iv(const byte iv[], size_t length)
if(length == 8)
{
// Salsa20
- state[6] = load_le<u32bit>(iv, 0);
- state[7] = load_le<u32bit>(iv, 1);
+ m_state[6] = load_le<u32bit>(iv, 0);
+ m_state[7] = load_le<u32bit>(iv, 1);
}
else
{
// XSalsa20
- state[6] = load_le<u32bit>(iv, 0);
- state[7] = load_le<u32bit>(iv, 1);
- state[8] = load_le<u32bit>(iv, 2);
- state[9] = load_le<u32bit>(iv, 3);
+ m_state[6] = load_le<u32bit>(iv, 0);
+ m_state[7] = load_le<u32bit>(iv, 1);
+ m_state[8] = load_le<u32bit>(iv, 2);
+ m_state[9] = load_le<u32bit>(iv, 3);
secure_vector<u32bit> hsalsa(8);
- hsalsa20(&hsalsa[0], &state[0]);
-
- state[ 1] = hsalsa[0];
- state[ 2] = hsalsa[1];
- state[ 3] = hsalsa[2];
- state[ 4] = hsalsa[3];
- state[ 6] = load_le<u32bit>(iv, 4);
- state[ 7] = load_le<u32bit>(iv, 5);
- state[11] = hsalsa[4];
- state[12] = hsalsa[5];
- state[13] = hsalsa[6];
- state[14] = hsalsa[7];
+ hsalsa20(&hsalsa[0], &m_state[0]);
+
+ m_state[ 1] = hsalsa[0];
+ m_state[ 2] = hsalsa[1];
+ m_state[ 3] = hsalsa[2];
+ m_state[ 4] = hsalsa[3];
+ m_state[ 6] = load_le<u32bit>(iv, 4);
+ m_state[ 7] = load_le<u32bit>(iv, 5);
+ m_state[11] = hsalsa[4];
+ m_state[12] = hsalsa[5];
+ m_state[13] = hsalsa[6];
+ m_state[14] = hsalsa[7];
}
- state[8] = 0;
- state[9] = 0;
+ m_state[8] = 0;
+ m_state[9] = 0;
- salsa20(&buffer[0], &state[0]);
- ++state[8];
- if(!state[8]) // if overflow in state[8]
- ++state[9]; // carry to state[9]
+ salsa20(&m_buffer[0], &m_state[0]);
+ ++m_state[8];
+ m_state[9] += (m_state[8] == 0);
- position = 0;
+ m_position = 0;
}
/*
@@ -235,9 +225,9 @@ std::string Salsa20::name() const
*/
void Salsa20::clear()
{
- zap(state);
- zap(buffer);
- position = 0;
+ zap(m_state);
+ zap(m_buffer);
+ m_position = 0;
}
}
diff --git a/src/lib/stream/salsa20/salsa20.h b/src/lib/stream/salsa20/salsa20.h
index b68bb979e..69a9ea62f 100644
--- a/src/lib/stream/salsa20/salsa20.h
+++ b/src/lib/stream/salsa20/salsa20.h
@@ -36,9 +36,9 @@ class BOTAN_DLL Salsa20 : public StreamCipher
private:
void key_schedule(const byte key[], size_t key_len);
- secure_vector<u32bit> state;
- secure_vector<byte> buffer;
- size_t position;
+ secure_vector<u32bit> m_state;
+ secure_vector<byte> m_buffer;
+ size_t m_position;
};
}
diff --git a/src/lib/utils/xor_buf.h b/src/lib/utils/xor_buf.h
index 5773a619c..3c348659e 100644
--- a/src/lib/utils/xor_buf.h
+++ b/src/lib/utils/xor_buf.h
@@ -19,18 +19,15 @@ namespace Botan {
* @param in the read-only input buffer
* @param length the length of the buffers
*/
-inline void xor_buf(byte out[], const byte in[], size_t length)
+template<typename T>
+void xor_buf(T out[], const T in[], size_t length)
{
while(length >= 8)
{
-#if BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK
- *reinterpret_cast<u64bit*>(out) ^= *reinterpret_cast<const u64bit*>(in);
-#else
out[0] ^= in[0]; out[1] ^= in[1];
out[2] ^= in[2]; out[3] ^= in[3];
out[4] ^= in[4]; out[5] ^= in[5];
out[6] ^= in[6]; out[7] ^= in[7];
-#endif
out += 8; in += 8; length -= 8;
}
@@ -46,6 +43,43 @@ inline void xor_buf(byte out[], const byte in[], size_t length)
* @param in2 the second output buffer
* @param length the length of the three buffers
*/
+template<typename T> void xor_buf(T out[],
+ const T in[],
+ const T in2[],
+ size_t length)
+ {
+ while(length >= 8)
+ {
+ out[0] = in[0] ^ in2[0];
+ out[1] = in[1] ^ in2[1];
+ out[2] = in[2] ^ in2[2];
+ out[3] = in[3] ^ in2[3];
+ out[4] = in[4] ^ in2[4];
+ out[5] = in[5] ^ in2[5];
+ out[6] = in[6] ^ in2[6];
+ out[7] = in[7] ^ in2[7];
+
+ in += 8; in2 += 8; out += 8; length -= 8;
+ }
+
+ for(size_t i = 0; i != length; ++i)
+ out[i] = in[i] ^ in2[i];
+ }
+
+#if BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK
+
+inline void xor_buf(byte out[], const byte in[], size_t length)
+ {
+ while(length >= 8)
+ {
+ *reinterpret_cast<u64bit*>(out) ^= *reinterpret_cast<const u64bit*>(in);
+ out += 8; in += 8; length -= 8;
+ }
+
+ for(size_t i = 0; i != length; ++i)
+ out[i] ^= in[i];
+ }
+
inline void xor_buf(byte out[],
const byte in[],
const byte in2[],
@@ -53,16 +87,9 @@ inline void xor_buf(byte out[],
{
while(length >= 8)
{
-#if BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK
*reinterpret_cast<u64bit*>(out) =
*reinterpret_cast<const u64bit*>(in) ^
*reinterpret_cast<const u64bit*>(in2);
-#else
- out[0] = in[0] ^ in2[0]; out[1] = in[1] ^ in2[1];
- out[2] = in[2] ^ in2[2]; out[3] = in[3] ^ in2[3];
- out[4] = in[4] ^ in2[4]; out[5] = in[5] ^ in2[5];
- out[6] = in[6] ^ in2[6]; out[7] = in[7] ^ in2[7];
-#endif
in += 8; in2 += 8; out += 8; length -= 8;
}
@@ -71,6 +98,8 @@ inline void xor_buf(byte out[],
out[i] = in[i] ^ in2[i];
}
+#endif
+
template<typename Alloc, typename Alloc2>
void xor_buf(std::vector<byte, Alloc>& out,
const std::vector<byte, Alloc2>& in,
diff --git a/src/tests/data/stream/chacha.vec b/src/tests/data/stream/chacha.vec
new file mode 100644
index 000000000..9ef1792e2
--- /dev/null
+++ b/src/tests/data/stream/chacha.vec
@@ -0,0 +1,26 @@
+
+[ChaCha]
+Key = 00000000000000000000000000000000
+Nonce = 0000000000000000
+In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+Out = 89670952608364FD00B2F90936F031C8E756E15DBA04B8493D00429259B20F46CC04F111246B6C2CE066BE3BFB32D9AA0FDDFBC12123D4B9E44F34DCA05A103F
+
+Key = 0000000000000000000000000000000000000000000000000000000000000000
+Nonce = 0000000000000000
+In = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+Out = 76B8E0ADA0F13D90405D6AE55386BD28BDD219B8A08DED1AA836EFCC8B770DC7DA41597C5157488D7724E03FB8D84A376A43B8F41518A11CC387B669
+
+Key = 0000000000000000000000000000000000000000000000000000000000000001
+Nonce = 0000000000000000
+In = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+Out = 4540F05A9F1FB296D7736E7B208E3C96EB4FE1834688D2604F450952ED432D41BBE2A0B6EA7566D2A5D1E7E20D42AF2C53D792B1C43FEA817E9AD275
+
+Key = 0000000000000000000000000000000000000000000000000000000000000000
+Nonce = 0100000000000000
+In = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+Out = EF3FDFD6C61578FBF5CF35BD3DD33B8009631634D21E42AC33960BD138E50D32111E4CAF237EE53CA8AD6426194A88545DDC497A0B466E7D6BBDB004
+
+Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
+Nonce = 0001020304050607
+In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+Out = F798A189F195E66982105FFB640BB7757F579DA31602FC93EC01AC56F85AC3C134A4547B733B46413042C9440049176905D3BE59EA1C53F15916155C2BE8241A38008B9A26BC35941E2444177C8ADE6689DE95264986D95889FB60E84629C9BD9A5ACB1CC118BE563EB9B3A4A472F82E09A7E778492B562EF7130E88DFE031C79DB9D4F7C7A899151B9A475032B63FC385245FE054E3DD5A97A5F576FE064025D3CE042C566AB2C507B138DB853E3D6959660996546CC9C4A6EAFDC777C040D70EAF46F76DAD3979E5C5360C3317166A1C894C94A371876A94DF7628FE4EAAF2CCB27D5AAAE0AD7AD0F9D4B6AD3B54098746D4524D38407A6DEB
diff --git a/src/tests/data/stream/ctr.vec b/src/tests/data/stream/ctr.vec
index 0ef283f44..ae97030b3 100644
--- a/src/tests/data/stream/ctr.vec
+++ b/src/tests/data/stream/ctr.vec
@@ -1,4 +1,4 @@
-[DES/CTR-BE]
+[CTR-BE(DES)]
Key = 0123456789ABCDEF
Nonce = 1234567890ABCDEF
In = 4E6F77206973207468652074696D6520666F7220616C6C20
@@ -65,7 +65,7 @@ In = 9DEDC376CFD97AE823AB2E0CB0072DF26DAADC4FD9316C7E8F4F796026DA9ECB8ED69DCD
Out = EDE3E69EE5B55AC758EB39E70E6533CC4D89C148F6AD68293E743CD82B9638F020EE589D
-[AES-128/CTR-BE]
+[CTR-BE(AES-128)]
Key = 2B7E151628AED2A6ABF7158809CF4F3C
Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF
In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710
@@ -86,19 +86,19 @@ Nonce = D3BFFE7D9A480362532B542007577EC6
In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF
Out = 900BF2352D973046F4128A1489F84DB204C552D2E59FFD58844B2BEA8DC04B46B1212433EA1D3704673C45222C77D3D7CF7D21199BCC1464393853EA9FE5976DD8612F828173D82EAB52C10A863FA549911F9B4CD0644766BDE8412F0458C620EB63CD699CFFAEB948BBE360FDC541F0912B683B72A13306E0203F444E378458164F461290E3F934DA40540945D8FB455EB86271F4D55DEBF1CEDEEA08B7917C2247B1261C3710D949B678CDD4D5DE857A2BCD4751F2D4C49C75D52B33A0B761943CF6258DB7C13C321F2E3C43C680CADA039E3F177B88C993464EBE82732229784D929235FB7E4984F1DBC72A2E0431E7BD976A2CE09931DF2C80B7B7405E8DAEF482E4AC7A0E33C52EBAD9C4F854A061B047F37CF70571FACB6D2CFE6EC0CC64933965D74B871150214A009E998BB078E8799E1B43232F9709F1E5602D2DA4D9725D2EA8557374809285A1B48D489FF3A8A50CDA1E0920035E6924272FA1942022D71C9984278B4112253349D916B17FCB93A59FBC2641EEF4DFAD6FB83AECD25A6F55F06A95CEBA94557EE07220C51D0DE32969D70DF310B8DB0E7C8B65F95BB7B14098575CAA8EE472726FF5C87E31E94664FF009793D3230A528E9FE2893210E01870D0B60B1C55A6C49079BC3D97EBA815ECB8DE148A000C310DC372C6F0627EBB1F0CBDB36A79A9DDADACD157B561EFD24FD523067AD3E1DF7370DD7819347C5FCDD7296BD9DD9D940C7956CB8A4ABA3359538474E81613E4BEB346B74F05C66BC19594C12920CBFC145ADEBBC0511E710A490708B6DF67D8F5C5A3A809C9C256CD3A4056019E04C27D773A08BFFF86C6F5E9663DE4369AA4612EA26553F5DF2314A8FDFCA42B897B5EEE64FFBB16F67BB1BFB1E5408C850848978645087CDF026C9D8CB24494E42867D5010B66DE211C5E10F92D6E88784E9F423958D0E50E6F153FC9D7B07894D5888B3CD0AEAEA0ADDC058083E84EBE2CA55E491679BB9476674E8B2D01E17AB60DB86CFFE48AD3C171F427EB57247A5E34970EEE3A4FD9D9FBE9C5F39D326D6FFA45398F822532B8620337EC1846184BB684478EA59D803BFF5F55B4B15F3DEAA58FFB550AC480876DBB16C0FB72E0C224D2FA47BE2A33736208E9DC38EE0E5D050596D692718D9CD90DE7CF9203A6D1FFCD5F09AF6BAD40F006313C7916AFAB0D09220B9F6C7E020EC12D4982A809193EE65DB7EC04B94F580DDF15D6349279FEB9679FC9083ECD1FB1D9B58E2F81D07E586573AF0C61BAFC811BA0D15186F408760314724742143B1A01AA0038EE1BF4DBAF4E85CCD3412B4F17629F069E6F4F24CFB28B4DAC1B7ADF3F2AB621B62D4239C8425B93CB597D2C91FD9F4E3FFC6DD70CCFDF5CD8F42E29344B6D1ECFA073C853D7EB1FCB34EFF9111D90557E15B438D8AEED879991167D04BDFFD42014BD12631AD879A98BA029DF7441C7242F0FFC0EF25E36391EF4D151BE45C6D6DD10B5C591AA039507BF3513BFB36BAC155564B9CA65DB8B2EB74E10C7371090C1DCB54B65F9427E830CF1EC7B43FDD5E7AF72C8FDF19B709A41F9458A1A69D8FE8332442F5D1326597B429D065F17005C90DCBA83833369AA2F8CFE860C7B25269049425B1AAAEEBF873D32246A4EDDE5C42D88DDB5EA5DA95BF7DB2B97B3C37F4593D4F8BDDD2EDA804337307E6C68952FD7FC0A55E2673C08F028522CBF7000CDA1E33523AB0C607CB8361E95CBEB06025636D94E945CA9E911FEA1CB37728F76D2BF776875181EABEFD2841EA068EEAD02A945AA68FB64ECAC7EBFFA9EF739D534B7BC06F9B57ECE9CB9CB8D7977128567293C51E79A8126669925214AB99577019512A72A537429CF5B10FE5B39AA2566AFA490C6FA42916D414173BFAEE8BAA851A73D6E55D0A48A9F47BFE67EC5D27BCE42D7DE7BF52DCE4ACBED91C5E52414D09C8119A3270709EFDF1AC93598EE5D3FD58436465C65C10FBC7E5E830B9E0131D0A406777FC79362F660F8D9D173499326D8D87B1A64952688D72C83ABBC5528A78F57E38E54FF82CF826878D73F7F374284181D467CBC0C1CB980BC3CD3179542663B35EBDCFC45F2810A2CD83F3E8EEE11C7550C3F105153886FD0228C4368DF22B3483905C4EB8CB841626CBDB46010FF6FAD1783D518E9030E0D01C1A284709E56CBB29B18E269BF32CB310AF67FDE673AAAB9D5D05FF067650E9C2320BD294AF308F97547FA907561C6759957E19727BCB6AA81B0668AA891B524A44A9747188806005F497B0F06C8F29277F0532CE48306CB2AB1F4AC69189E48E958CDB252BEAC88343FD10F61D1BF2DCD2347407C4F449738D29FDB3C40BCE2381154DB9B3CB1241BC1E682EF2C7845ADEDBACE1DE98218F967C058CD6861CD66FAF98AD2BFE088DB945EFA1A5EC31C63F4AF18A7E26DAB81333B2D1D1B64ADB0F0B628941712AC56D651AAE05C5D4C5ACB7FA3AC16A1A3D22395B76371ACC9D4CC047259B1BD1659AB6987E4CBB363B2E2378D5CCB15C41ABE14B65B920F58356653E0240181B2192107884699352634712003815BEB662F3D31F1EE213E43637738F9DBDDA96524CBB76FF388C93CF540968D41CD79D6F575B47E8A4C8576A34D864FCF15DE44929682C7024F5B96250449649697EE056F1FDA1A0D35953F03E88DC3B35913024218DF877B75BECE027A2A7EF7C76BD650E0586D404934E344B8C7376A601998294C196D0D221CCBB59AE05F7DED4E355B3FAF1D0C51DAA055F925440C272D41911D83AABEB3638316F1AFBF7BFFDAD1E800F296323AA33A7853644CEBF3733BA2748DE7D37B9AF8A5A4C05B74211B359B0E6B518B10A012B4F7188865AFDBAC2CE1D53B9F3E8F7F80BA15D11CF2967C42662FC4177D2E3C00D3DDCF581B8FF5E6544F312AC52D93B7A0789C2DFB187E10EDEAB3BA6E74B9B685F1FC924974A4D0302C89C6709CFDAFDD6B235AE0326D8E22D164390620DB012B85A81560896F2C085307D07F3470887541EB5ED2065261C87ACA522E83C2CA77D9A9751DF6DE35EDF82E04F55CC9A50F5646254EFF10612AE8B5010B4F1886262666B997005F452CDDAD9E7FA8185F64B601171879FDDE907F8C35F8F100B942FADC0D9F4FD734B462866E42CFDDE56DE0539EF8F71F0AA72DCD8DAC6BB031B89C8F0A88C051C5E4E28EA5E95A925A88611EFD7EBEBE524F60A9EA32A41FE34777091D401429EE7F185EE61DA6486CE491F09A97062BE1A357DF998775143C7D1FF33A1EA9041241495473661FDF3E908AC9F5811FF83EFD6E331FF17097109FC66220B989428D078263FF696CA376663888819F3AC66F0BEBDC5EE5BD48C347C124FF427A47C80B92761A90664BABFAAC275A3069B13890B79E9513A935823FB60823D6C76A9F88DCE6A7C1F11E3DA5068F454AA317FCF92C4BDFF500A2BEA63BB7D4939F4440AE335C1E165769C5D041B31873BECA28648D44DB6628FCC0705B5E4CC838C1DC8022D9B890FCD54CBA42B372610E9CE351E5FDFBE46621768A30CF70969FCB37C484B2595B5291FE7E8B597DE9986271AFCD2DEE3029DADD330FD5EB38D7BB5276423DEBF31DFE3BB97E36D09FC62823060A0D2636CAB111C7C9D27DE3D2436996F6CBCDADA9BF7AD9B4EFF7EED2459DAAEE42AF414BDB2C7995003B2DF8474EA76BF08870317EB29AC6B46D19DFB471A8FD58EEFD58BD4436C30E4A695A30B83E53854AB12D4F0CB6290385570484CD78128782C55783E73DEDD0EF8330690D2CCC67A6C3A5C0E5824A4C68ED1E9DE7C047C3A27D838677EC1CA64EA21D7F51BA404CDB61F09CE2F3CAE82E68BEF8EB0BFB6F51F1D711E68BC7000C57170BCE6E6CB583CDD384B031552B471DA6E4AEDFC6E696EEA1D4E48CEAC08202D8C0626D957C1BA8D367C647C95BEC5C97448F0B0DED70E3DE200ECDBC2E2BF76600E838C2D52DC2799C55ACD450C5C33089485F65219B57A09756792353A80184B1FEBF9F40E7C31150C35BC9ACC208693A30594CEB60FE53D4EF4852AECEF9CD128A0DAC72A323396AE9DF8406223E554CDC0D3DD2EC641FB19094239D186BBCBCDB685A5ECA4945C0FA7B2F0CF0D42ABA7F5983D5B765168197B0556A235AC452CC42D59BB9F27D186E1640E447AA00E3005CF5FA24BC7CD4873CFB2AA4B47528F9813E1881FECB1C072288D8CFA45E2D0C52F17C49E7D73040ED49F0E71B427189A9A038D6F7039B7872A41E2C55E6A95834E9BECE5C70C18F89E270A2D24286EF6C027DEAC450A852804BCFBA92DFD52E7900F7F3E4A957AA4D594390CD47ED3072961B5D024AA9EFE854E692D64F3CC3123EA52F49A6F61D2316A5A17374EC9FF6F043076C07D597942D25BB0BA1BD71E971C42AA5CE9BB17511342A3EB35C6DCAF8DC36F762F8B1856E5E7BF492B8A6FA8F1D8AE461515462871B255966F0F5BAA52E73CAAC894C2CB56320155D4E5DBCFA84A0FEE3082D92EBEA98808406E736BE2EC8F41BBE90F07919682183DBB287D7004D2C2622C4FAFCAFA19A766DA033DA12E4BDF7855A08759C9FC6CA0F61B6CF96C492CA8CC168B3CBF7F587B53A7EF630B5374690000D9E7B84C3AE7832F4BBDC1943378F83007660DC83CB4F05E7A93BC6EA39EAF13CAB2E61C852A60A343247CDCBFD757B2475399051924A93731400EB91791C5E2DA5D03F43A39CCA44F3124DEC80D433AFBACE19660D0D32BEC383C1567549C112CA8055D3A1A7811A7F4F036AAE719762F98A3BD8CF5FB2D9673BC163ECCCC72328F13B03CC3C249C7AFA4041C0DC76E9A8094462CB41E9711A6F5E50E5D5473143F1E9AEE421D6FD88FAC95BCD75E46E25D2588F7E3D7489DEE5E7AFE73AB038D4C845A92B1C0C399B698F8E532AAC023CD1489B986BE46B7DA2A4B76AA76DF5F7FE1F66C282AB30ACEF5A7FD59B71AE64DF858D0E0425089290913B3C4CC82DF6219DE24ABC8703ED475D8373402EF46526416F2ED77AFC236C4F3EA0DAA5AD9AB949B024F340C6F1505B399FA703B6464C0098FAB1A3DEDAB5BE68C2FD030DEF738CD027FAE6CD4B03A2354D20ACE3F69BEDBB90A5FFC390BFD90D53695CDC136B85FA6B9649CB4841C43D5C9F649E32C410419B5EADF4D26AC0D36006D3CF4677FDD2FBFAAE156F2DA1587FFE4CEA0392AE804420E2FFED43935135F441CE90B7077D8E0B0F77706AAC6A9E23DCFE15F5635A0A1E1A315D8AE0489BA6DD88A1C8EB29BEC076F2E95627CD12FF4D6784FEF2DBA9F5BAC6F1895E5F15AE2E51A1D65B7835CCCA3B2AC7D4AFB05E00D210519F932D184340625647DE20BFB32329C238AC096CA68E159F90CEA319683F1C0D9DE2380438BB4E6DCFD358AA655D0F78C9E93B23C0F1BF13C128587E65B23C7B87350F1A5B8C37B5BB5971F4A160C9A7FC3E920F050353739B4C2523F1F628E8B4988047EC59E13F120CC557E14EF259CB15BEBE470008D1C0BAB2B6B50AA6FA379488B3553979BE4841441F971299C46BCEB73BCFF4ABE0B2B003C7E5C110FDA68D63D264F95D5E9C194B4B869F420EB9B93531396512AFBB6FED334FDBFC972E9BA42F3E3D774A7C6F1685DC8805DA4E10A150D90E79828A600F242BC2B7FC2EE22BE0EA362D687E6B2E4191C268EAB6189F58968CACA413F2E6D1A413E37AC4E93E8A7C3E13D992D09E7025D48E21F658F54B2354A1182F1203C21F05831B7B83308DC2A8F6F2E3C97592B252E66CDF43529068D9DC78465F66CA6B29AAD0C3922947EA98CCE6630EB581FB75F421D59E36DE1F4BE9D7BEEA0C75218C574FB70E5927162DF36AA1DDAE51428092B8A733C8D65E884FA48B6A4A6F2D386883D3BE615EEC10B3488DE1D54908AFDBDA76CC54BC71A7131DA141ECFBBFAECA0C193B83E8DE2ABCDA150629D8BD1706D16E4B2BBA4FB95A4DBD1B2E73071682B7B38142699C998631B31F53DE66B0C3AF8C799FE21E617F49EACCBAD64B76EAA4A21E7ECDCA1114B1C64C2B2A71B5BC764EC880E866AF3EC6E3801213341C998D0F00B9AD7B7DEEF21C0033247DCE567FECF294B16DDDC3346725677442A6F6FEC62627521EFACD02E16123623ECDF970493B9C8B9E10156A9B2439F03096B17093E5DAC3C9048EAF05CE92B8C2FB2B671AB886E5988288914B5A8DAB05909181A5F9142EC46D5FA71816CD944642D0568520EB87A4307FB4B608D4EAC1EBE88DD52F6549895F732CB75D495F5F2325D2B0FFFE0FB702045188BA98D603E546F09F44BB40804F4670BA22F9D188F986F00FC2BE3BC29E0D387985F564599DB2B0F9149BBA7225F00D6316455E2713E43E173A9418C5C4EAF5D3CF2CA4FDA77DE466ADAB5BF8A2FE395E9DCCDF040ACD903F13F1807817251B4844B12F7723627E3B66211258BAC1F45B26AF3303D1BB55241BB4EE3EB9F00050AA44DE7A81AE5501EC7ABF1A1692F3CE17267A1A83E6B870777C6249780B655008FF69C6EF3A32AACC1E4A8CD2CD50115EABE08E4A085AD93351DA04E5AC71C5FB74FAD7864324C070765C32ADF07071632767C5D0612B4B9407EBFC3141D6D8B202DFE164CB8F7112E3AE5176AA55779441B1352CF4838395A65ED5261FCD8C596CBA3684A56DC2FD5E440CACB2033C945E65EB9EC0E475A7CB3E67C8D5F627F506F6CB1D5A1F26F75A395056A1D8D70420B13F63834201AAEA6C11CC6E55BDE40A0ACC75255D06C5921A85D621B1C32434AE8CDA7925BED56718BA59CEE88896139381809548A0AF81502DB88439A48999A3B40C6FA62EBFBBB1DCB03409C73CECC4509BC4F2D45E7382D4AB7F69386FBE6377876D0D30D5F4DCC6BA7330987B48C9772410942B114D6F0D46AE5F3FDDA09618BCD78F0D9972DDD71DAC9801CDEB80676BBB32315888E008DA9471855C2B299927FFA73EB7A4754A2F9A80500629959830BC3141A6A3FCF3F529DAF588B0C415A6D237145BC3475724072D543D78F69E1F153086ADC5E28B420A3B1B81E139CE9B81F532FF557DC23BDE406373B10F5C03E2308C9F51D5E0150D6128A1BF82FFE1069849CDF84FDE7E3DF994608C5E0B2420889408D8DEF8DFACF31B539D3429470785FEA4E5480AA0C93B5C8225901F3177DB948DE7352882A9915B8D2332A85F16A4D1CB55EEF211E3190FB718D1D302A171EB57C234A5B1E5A6A297E7AE4BC65752ECAA27412D2A6835BC69229E7593A23EB1224E97419BA6A17BD77F9FDBE30BE2BCCF0BEACE22576C0570DBE4FC885192C11998620066D8CD92DAFD200B3D483FB825523F490CA75971D066647A8855436084B047C78D6581C1FBA6276B0A7729668B3B0D7D358FFB92332C57436F2F59873A1CDD128AD11341B5F256251B61C90C365D5F0768F441562B3FCD9E27A71306B7C940983560461889455560D32532DCF45E9DEE3E2B3C5514E249344B4DDF105774935D5AAD836B04B5E979E61E3ED7909A8384CB0C866352E7A1C7068B7368BEC60EAFB4A081E553F51B09C4CE8664964F64A4031CF8934382C0EBA040C0F0B2D3C1F5F3ABC3D30785E53F5F081248CC7A6A3664BAD836C1E6CCC91BA1B037B4F0F2C43AEAF9F749268D47E11F7188BC7264960AE26DB142C9801D084E0B691648AE83E85AD51A0A17081F978A434C82F6572AE0AF94B4A04A5686FF61ADFDDF73E6FD22F6434F3FDA4F0B2A838DF375D3FF92C9192462E8CF44F43AF70F154EFB12D84EBFE48264E55769E997D6F3D200E223DC104987B9786417F3296D732FD45EC48033F00688F92C7B5CDCE46E4BC8064F499F9B06EFF82B70D6ECD8C5A1EB5FFE1D6C605A54DC621D6544322911E827CE798CB0A8CE73C82F863F97934CABBE2CBBB2D2A2A6EBD553E8A09D8B49D87F79F29E3161DFB3EF37D5D0D9A93F7C13C2A75CEDB3E61121E85273545E85942EE1C6BCC698515CB8E88E76AD57BBF0FC85B10F10883AC4682A86D29CDD56E5A63751D47F06673F7891CAC9460B4AA9547DFAD60374AF982423D332BE9D7EF16759FB095A698B0DA5D7B5127861A8B39911F717A212C17A9368D2C1E57CDA3032C61C56B84529677905B3E351D71D06D46B8D69CFF8E10D175E084ABD4B36A0A3BA424F6641E917CA1B64A2FF62C6AD6DDE35A51556FDCCCF5428892E8FA6DD45626AAA1551EC7D7E8A89CC863E5AFD53A0D01ECAFB2A6268B7E0370C376F7A724B1023FFD184D900AA2C909CE156458C7F2504E32FE615A90DDF360C7F0B7708399AEA3BF3549A401BEE0CA1FC0D22F1871967DFEB0B740FB93151B7EDD2D807DEFDE734BD1C22A19E1D0A0101071A8DE3FF8007068E2E5CC43EB334055E292F88EA02D52B9771ABD3577B22E7236AA3B511C5E914AEFAE9C5B015F8AD013C109849CB5150298FD56E9CCB1DB84CE6A34219303322FBF38F9735414DFFE395ABFB19F1798894EDBD1FF77530741933847484965C3E25509BD31E6E6DC247E9B17AF7EE350B00816DC1DD0EA44792C6EE83541153208E0104BE27F055335718B2BA1AAFAD3EC4D62B952ABEEAD95B857EFA8F26AEA3E9FCB087A80D7DDF3BF29D63BEBF3A248A8D86A4C208BB7A3EE0836869074438C418254BDFC5A2A04C5FB21606B21AF22BC2631A46BD555BE9803EF4330B9F6C8C7C93478819EE8D2A0C5651C0C5AFCE5F20EDF72DBE8315E0BC8BDE40F09C80E760A804DB197977217F10BDABB3A14A23B30DBF3CDB2BBE9DDB141A9B115D16CE0CEED99E120514BCBD0DDD934379B9C48016A010151284377FB6B8E08A703CA401CE018F61D6D516C83F95499943EA2C818E315769C2A45172DD344ED15DA05D8AB1C32E4F2E7DE3ED5BD46E956878F266E27CBD65FD775B13FBE330B01C31AC5C27C8DD30F0240F5B9C024A6984FB7131C8CA04A6087091292D53AF14ADE0F2190E0F427029D0F27765BBD746DE5E2A9B8933DD0CC3B1CD1126551378372AB4C16AC49ECCBB107F71D7DD4175ABB0DC477E1B4FCCC42F868D7D8D737BEC4B5CE078017352D36A45CBE6E9CB676ECB84F5703445D42970D99F5744A008E21A6EB7A7A699C2435FC669DA5A8DE38BA98E6611DD8DE45482273C7DF9702BB10D345B826518F38789E66C62E0465D3874209350890EBBC5A3F8F132341CD58E7CC9E43B22C579BD938792C8B158ADA14D94F8179DC180CBB0280A6101D7BF2D17C0557F920307155E8DF1D95AE124FF9B91F9F2B9D4CE3D131D6DA313EDE0F09ACC122CAD8A296B5F806BFC2CBE5D8E526F020BC5BF5D5ED4728F818210F5E2A570B534DC39890CCD1FC48AB7AF86888E9453F3607401CEB4C22E3F960E7A8A5C80EBA5DD3717FC1224D190D4351E4944B4C23A949614D884D2AE59D989FD53302C83D66B26088C37EDC61207234F9B8EABEF6BF457BD61EF4B77D198B7A56B00FA723B4CFBB6E2CB116DAB87DE542FACC26A8A9F2B841B2F26B1C0B6D22172CD5C1AC70E5C5C1288BE1BB0EFC9F2EF68E0F88B8A6DD467F8C21FD4AA5C467C5D2ADBE9A72BB6F44262BBF4D23525D0D2527A06D740BC2BD45A3B8CB96CD66307242351D6B6A7C1B6E67C7A84E2FBF61AAB52E5701F51C4480093AEB29168AF847B48254CF04D1418C77AE1680BC564C5DF597308AFFB211B3CAB194D8AD0427AF89E0B55F65C2827CA704BE1B854A819FF87E4A6DF735D107422890DA141915D1687B56D2F1C5F007684331C7C17890E887390822AED10377F271A36855DD8687D9F476F3B1642F1388F121814C474778291202B97333C1AC5D6E1818FAD8AA2B9446840CC0D29EEDF118D53A15763ECCD692A0A92611BCC49F3A50C03A4E7C39BF3C545D9B2C2A08D3CFECBFEEC8D846D325396CE30275629AA3914B7CDDB05959A5EDB2DC952B28ADEB6B16197DC22D0F6BEB17126A1E2E0C66BE205E37E4AD7FEA34DCD7B406A87A155216009AC43AE89CB0C036433D736F5D9F2FE2FA091C28781602A59EDF96127C31265144B20360BD64DBDE8116E84A9E41F8259D9A6CB4E3368A646413FC23D76F55B4083F4420C1157A1D9B5EFC27BDF72B1FCB6617BF40CD8FFD2FCD645284321390BBB6707CE8442ED81163CA30A924CC9B5BD8BADB02CD15847F1893A7E94F82C06C19BBEC9E46B769DC853A2B9EDB14BCE4BDE8C6EA26A9510B6A8ACC62DCD55DCCC73DD962BAB314CDC65F9AE4BAA7FB4563CD38CFC6A6AA7A60E6D9C9FAAFADC55A8A207E9C2ECF21C343ED29113DA4E6E2EBAD2ACB1DBDA9652EBF1D20E8FA79533670DE60CFE73BCF469A8D89B5D6B2DCA831CEAB441F5540B4C4EDCEFD246478BD068FFDEB22F692DE4D814CEB4C105CA55AB82398D21CF7C2F992161B7D961F2FF91DE1C0ECA854036660BBB67071690C8E2DE999C809190D8DB16CCBDD971F4A0068F98129EDD0453ED31BC5724BEC70FC5CC79373CF6FA5D87562456538735D50674863F219CE5B3E61B1ED02564644DAE69BC0CEFD6302464042ED1CB8B741863FE00911729A0FBDEEDDD00FCAD9A80C88077750ADFFDBD921E2DB19070A41444FFEC61DC8B3D0221D336A5ED40A9C7BC7461AB8121CD4E9BEFB4755EEE92B8B3EDB2751D05028E5279233A44E0D4A205BA1F864FD5A0115272B4B2C7AA8E8D3D202390DCE85A47DF27909DB1CB7BDC29DF6FEEDECCC6814068F0C87513AB975977C7563E41F7E0FA1864F9CC9B5778F23A11B7D67D15E7D1711F2A6CFA4AA7DB1996B73259F791BB8FA73C99CA04BD837C8E7235624E6AF48EA30391B32B55EC08DF2F25B54BF663871D439C57A9400E6973B723CEAC8D55E01BE30841061CDE175DDEF36AE57DFD000B38155349703E2C9D10549890B7846C61ED62A6193AD3DE03A3F24275DE3FEDFAF9C384B601F0C1213F46A90BE8E3B97EA11C31880C9F905221064E6A7C297E300FFFBDFC0FC6A1C05ABB0D56F9918501E3EBBE84F986CFF4E94FBC1E71B98B315026E4EAB1C22634EE50BEFE7426FF41ECD53152344EA558FA9E9ECF80FF1C01335021C06BC46ADB15707A025CAC95D564016EEB1D192D93B94900CB346169BB1A18F91D88266D312A4BF5F050801C60FC681E3ACF1B1364422E0708120AF483A664D067273293687B3E321508D59BC60B78D0C9B46D3E4E5751ED038C228899BB3CC32239E5AA653012C656423222F2D04C213A5DC78005B739FAF522B17AED99542BD9B6543E4E9EC1A536667B484B412802F17704B99DC3246EF9180A0FFA1C269F0BAFAF79B1BE323F3F2D045A979A46A6B45EC9609C8BF2DA5BD40A2454D80DA1CFF9FA75965FFACEA20CB0F8ADC881EC8360F82BB297A6570BE1F8FAF0F10AE84645591974F7C246338A45443AC2B9DD7B8151A6351A001F520E4C6EEC800283609F16DA88396852BBD27C4FEA4EA0C2FAC4FB6B3A8E993F6E91DD06D461828F687FBB061A57E118D5B6D8EE5CFC6D453D48DBAA7CDE2C4B9CC226416A0B1D3B1BC6C1F429C481C187E0F6D022ED4110A7916D891E98600EA01263FBFDE28265F924F1E95F7B68C95DB4DA20EE37171BBB05637A883637D536ECDD9D7B6D36C15E255C1C024CB26BF5092A631A29B78454FDA730292662849E7B83F71D419B099E31A2420699F4F37378AC5C1985194C44A6F38A2F0D2CDF
-[AES-192/CTR-BE]
+[CTR-BE(AES-192)]
Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B
Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF
In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710
Out = 1ABC932417521CA24F2B0459FE7E6E0B090339EC0AA6FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050
-[AES-256/CTR-BE]
+[CTR-BE(AES-256)]
Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4
Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF
In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710
Out = 601EC313775789A5B7A7F504BBF3D228F443E3CA4D62B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6
-[TripleDES/CTR-BE]
+[CTR-BE(TripleDES)]
Key = 88EC5C9E9F223D7FBA9B30756EF4599D456EC9862840CA14
Nonce = B49FDBD64C0714ED
In = 97
@@ -844,7 +844,7 @@ Nonce = 9176BDCAFFCFACB3
In = F47B2AACAF0711AD04EC04C760D5CF3BE9BE42CAE6272CFF7172F4B0F7F1235A6B1195B0AE0CF39F28E919040EF7D34CC6FDED0872106A8BA2969CA6EEDE67556CABEC04DB7896892DACAD714C8D10CD3120B79E5D0E886972064786699FCE1A9343982A08542B7C3D96BC02FF72CEF2381F240A2EF062687E108E5BB3F9CA2D048AA03573B08792C0D89BAF4714D1D33CF59794C9A8C6D83F604B2DC920A5DF13FAB79C6C58F32046C805036FD56B3DC271DC5885243A0317211835BB5CB852A4CAA08FF5662A4859C06228B73320A0FD1354CD2A0AF64C4DF0E91337576C355ECE02728DD5BA5181CF6D35B6521D3649B4C6918B22652093E672C3F791901B477C87EFCD4139E9D483271C56FDF33FB0BDFDB4E61C79EA7D504149B2C83EAA17F1E79D327DFDDC0C5C0BBA35B02769B4B15241DF2EBE60AE06CF221B257BC83357F0B3256E14E66A143B458BDA48F346E8920BB599D32754E0F89ECE4A832E2CE8C90AB7AEFBF2A2303B0DEC950B618FAB9B6944D99F8EDF7CBBD0A306FBA7558CCE0DB1B2B02C315FC4E503957569AB5821E9C3C65D22B9BCC6C034B68C191A1EFA3216B85518EC923E131A265323AF45BC06F3F0F5FA712ECAB6CC50B0378B04C58A7CDF84A7DA1153C58DA793D949B9F12A8AD611EE1A137913EEA42151830EF9E451E4974D30CD2DC7C15C4B52DB58C837029B11C7E5C00FB1F8F5C52DFE552190AFA39F69683F8FB8FDB843D40B8EA29BF5B26A09580B38072EC612C76F1A59BB36212C3AED57B546742402C0316CC5320D7D03E97470ED4161BC1176C54FA92910EA05FE125E3B54422467C8BE2593A12FE303D882BCCFA393F436B462743B0C47CCFC9C8D9A878337B7CEE12117D3B6ACFD051930E270043B33B6C0F581971FEC18067CFB6B5C16A7E74BF6F04151059FC04F0945CCFB31B2019BB2B822E19099F08FC9E24BD45B6F6AFF87D58D7452F5C028A91849FCB08FF1AE5A884BAE1222EA4D94F0704903AF009F9D87087D0410F0C68A574ED50E27FA2DD6915228FF2050B731F5E25464F088A01D600BE49A0A2BA4A230833C6B35EF360A06DAAA5FDAA31A35ADD1D16B1EE223B03FB8CB852B576A92488237323E017D6AAA904B5D79A60B9BD8F8312124A125B7390925BC4179286155A7F77AB0D7426BEB84D6F790A5166B97987EC2B42E84D251DE0F5DA59B849A9F836D3F5373C33CE5153EE29756D325F400F77363DA2A29DBA537A26C530A57E9368BE2236A30E5CB9D0B2C5D3C6B765375DBB6F0D79B31C27A6E0FAD4C7740095F6219B299BE7C48A954E719051A5A48FFADC51BF96B2FB0389EAD449E63E42549667342FED323A398507CEBCA8B202A99573040C384A251CEAB34D508955ADA861BF6AB73DC0A9C1D291E4A9903E752C5A54FBDE4B73D4BDF38642FD1011F070EDAC8C2370FCA
Out = AA33DD431C05B53F558F5A9394D28B938F8E8149AA494CB5FDBC7A73E5E8AF94EADA457D0A86C871CFD001E14E29A7718696052EF6392B4108A66A68A103A0601AB1703AC6C7EF17981DFAE8BD1DB8AC47C211E241184B926FF6B3BC35B60E0DFF1161902106AB81E463EE1DF41420729D7C164FDE18AA42E697F1C4E01B2C495FD4E9276FA34C45FAD5AC98DE47F137D1098C0918608853DB8506CBA17C1D4C12A41A9CAD5F7F490D46C15DE97ADB0BC83854114E5F9A1872DB4A3AE8E400AFADE2D5A33A0C6663A394839423CA9B8EBF417F3C5F047C76D61E171F6654FD08EE424C2078B063D118CB3F69665342A4C16864029259EF76F303E5A1E23A7789F99206E43CF03E58AC070812B977A7D30FBB582429193CB0526211C6F002D23394E9A6D2DECA4C83A3CF092B4047FF86E36E2FE1EB09BCAA1D7B929BF9ADB48DEC871D67FEF35B0FCA8018EBEB3AB9527FBADE5AB45A47918C61FF6AE21C2108387C9750F0B37155B7893E1A13B9226A9723B2597EADA5039938AB1679917DF84C491A2EE6E76C6840177E556B35F292DA3C785CF37E477BA53A1816D592D3186E4FC4A15BEA60AB799C681D8B64A7E17D781EBB6F9139C9CCC789244A6A0E6691E278ECA60A9654826FCEE4519E8725D209A6CE4180C91C17698A5C48EABBC7BBE7F335AC4331D4D352A2C99B6784245E046A334179A29DDA41EF6BE685F634FE02020A8B787659B123BA086536415BA7AF3C31ECB3A05E06FF1EAF2DB92D794817C89C568436C56608EFF8E6745C9DE92141C0CB99A13D137D723D23092E6E06D084747E9D778D268CFE64BB2423D92BC5391E395AE4663EE83B2E8E703EA577E67EB00A6310C2C28119EE9D6C10849ABC97A55BABCA512FFEBA057857DA44BB149B5FB0900CE09CD65A975AA29213D9B6E3849FECB62A12FD85FCF2E1EF67D121FE8C9FAC0C20E1EF41C7C7F01FA177C66AFD31418ACBA38517B10CCCE1644B5BA691D79D70E4C0AFAC83FE051D871A6149BF027938A0F8E03EB10688372D65DF17EE27C8E193701066DDD5758D216C75775CFD0AED04232FDAFEA16199CD3BE58F7C6EE1EFAF3BE8D08FBB179D1D3D4AD61B8772A076AECAD5F3C82BAF24527A357DA547DD03DF1DD5D9CDB1C8DE65608E673378C1ECE400C1D2CCBEA4867E4F24DEF07CA60EE21513C52180F93555DD75BF22391A0615EBA90A9B4CB4CC95A3DEC8ADAEF579BFC78E5FCFB0AADF05223C1726A6F1367B96F9CFE7711620DAE28644514E79605F70C8EA3B60C3CBCC93FBF414276A99AB1E1F28D63E4611C1B1A0CEC1F32DCEB3A85EF7803C9B8499CFA7409E15D4488C787B2D04E8F58E94256DDADFF89A0DF9A2975558EEB5E52E8322EA46B96FBE68DA49BABE11A6E954C6724213881A4DA032E361860AC881FBE19EBF199E4330DB9A7BEC002FBC6F
-[Serpent/CTR-BE]
+[CTR-BE(Serpent)]
Key = 740614949B42870F0851A0D639A37AC8288898B0F9CC3B326B983ADA69BDBB76
Nonce = 3377FFD0C8093067A0E33B8700E2C2E1
In = F3
@@ -1400,7 +1400,7 @@ Nonce = 23C93FBB6EF742A576769819A5BC6AC3
In = 20143BDD828F687A93266C2E489909BFD6D85884A40018082FDE227841647D162DAFC24140580495B6E0C393CFE2BBE80615C87CBF5E057D74A4CD7589DE69E136870A24AE67F9F0FC7B92369903718B9268500155ABBD6C8D0E81FB1104403A02A56FC82F1DE4137EBA1433AAD9CE7B34198ABE7D9845DC462DBB4FC6DA4F937EBEAC139339B405ABA51BFC9B06B38CBF17352F47C6EF3968F06305123888130738B887911567A28DEFBCE943D18C73ACBE920C386143E0B6B2C9EA30C84A7E4196481F93395C8BECE5F9B341725DA7883DD74792AD01407A05BE7A2121AFB2E9EAEBBA7574F9582D0455571A077603A511ABBEF9EABEF4553A48EF
Out = FC293D577FE018127C31A901490F19DD72D0A3212C828EA530B256E563874E03C700366884568B2F58B0478B8953F5A667E070BDC386404C47A45A862626D7F621C5E87C3F48A15B8F7DFA5EC168ACBEE32E08551DC7AB5826F42A75CE8A0A61BB9E1F4AD5BE53AC87687961388BB809ECEFDDD93782A956F9976242B20B1C2B5EAE31D28B48A44337AC677C6B865D89954E1159353FCFA1741C287FEE15473CB4004E400FAF336995004964A79E2EB0FDF48C2EA09120126443E8771F9700718BC94E5070DA8DAC17BB3F73555F3942AAC1C2830371D6417EE51EBCB1ACB8B4C74BAAE38E6CED7F7622388FBE2B2153DB6945B77AADCF7DC99502D6
-[Noekeon/CTR-BE]
+[CTR-BE(Noekeon)]
Key = E6CB9AEBBEFE8C4EE3B4763AF201BAE3
Nonce = 1B17F86B0A89CB174F5DC673C187803C
In = 21
@@ -2041,7 +2041,7 @@ Nonce = D43BE1D1871642996713B6400DA4B0A7
In = E71039961AC14FCF7212ACA932E1C6307696CF7D98A96048D888CACE6B95A32A268EF802CD311EDAA92D96019938D7F6D1E12C70306A1A893341F610D387248F00A113BE0BA43CE254B0958EE5DDCF10BDE3223EFF0BB7FB71C833A7A3AE52F78E00B7A294A23B76868A53B74737E23B93A7B89F6890791CBA7657715B9DA9BD
Out = E411BA4401573E11E51D6D7E318D6DDCF23E5927CA429DCA57C419BBC391CAC9EAE01A2384F4705EAC94B06F151638BC7299DD8FF570404363430E9B06FFAABEC5E1384485E7A085AAF6E2692742F7E9003B18A4B9FD5D772EB0A326655F38F39B2D49035C484AE4B4F12B14A7BC74A1F0ED2BEC9906E45C22C085C04679DB62
-[TEA/CTR-BE]
+[CTR-BE(TEA)]
Key = F580309FD46FC90ABA15E05AD82078A4
Nonce = AF4D336BEB213C0F
In = 0779B5A4D94C4B572257340F8F86FBDC5AE955DB72E588CB3D8298FE27ADC668
@@ -2327,7 +2327,7 @@ Nonce = 4FD1822D02B9C1A3
In = 7E508A73B21580529EF3C160A981240BA4A83989EC072F7F8296DC7DA3B9F785D11FA67DA1843A31BEEDD09919738D6E98AC7F37402FA60968E0EA3890CD0A0238B31AE3A26EF28BAE750FF2451D98D8B405FEC83672C3A531CDEE25AE5566EA23C51CE747CB44092B82AB89D0C3D0731DE92D1C862E50DA27A7024338FD62311DBB7BD2029713263EE16F9FF37EACE71EE5F25AD185A9E0327173F4287A93BAF814ADAF5AF869F2436BAAD8D8D3EA4908A816FADEE43AAC1B7E408BC049D2383F91D25D4CFC3537784E0071B5BB1614CE40C8E1EB9FCEF299C8C10DF96597B10BFF0606CA3CDD6AB72BBF8D4341222E36675360FA3193A0E275C95590056585
Out = A5B2EC64C27DDC68D99C9F82F0833898B11B2355DF8F1CAFA49C4B3D67327A2367AED1C8330F5A700C788529F78AC260E0DB5231DF15E01BB616566CF4E3A64F1F42B503E42403867EA24A5DBB80E5B6403BAF272BB480E0B39C77E4D092FB8ED54360912930F36B91C94F39689F6571D948D9660CE319E1D72EECC0AF93072417F4A65F0F1823581B9DCF874094E32741BBA233F5A998C1CAEEE53C331BA9F9D437DDBA066160137AC5E7D006DE9EF709B1D033145CE09F1FDDE0C5B278201665BB835726314E1B76E8DE23E4FBE36C22F5D7009E6B7DB7F151DB23CD520666101F7D3F699016CDC3F286402EBAE4F59ABCCC3A86502112935EA87E1A993F6C
-[XTEA/CTR-BE]
+[CTR-BE(XTEA)]
Key = EC1147D3A4CB70A20AA8664E88E60985
Nonce = 7A38520947DD623F
In = ABA78D16A7A85065A61F31B9C9CD4053444BA2A36C80E97C4C7BD0956676FA39
diff --git a/src/tests/data/stream/ofb.vec b/src/tests/data/stream/ofb.vec
index 940be2e75..940ee77e0 100644
--- a/src/tests/data/stream/ofb.vec
+++ b/src/tests/data/stream/ofb.vec
@@ -1,4 +1,4 @@
-[DES/OFB]
+[OFB(DES)]
Key = 0123456789ABCDEF
Nonce = 1234567890ABCDEF
In = 4E6F77206973207468652074696D6520666F7220616C6C20
@@ -19,19 +19,19 @@ Nonce = 99DE32FF0351509B
In = 08A6091FA2987FDC682A8199A6D6BD1F
Out = 640B5033DCF26873FA8A34DB644F2BF2
-[AES-128/OFB]
+[OFB(AES-128)]
Key = 2B7E151628AED2A6ABF7158809CF4F3C
Nonce = 000102030405060708090A0B0C0D0E0F
In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710
Out = 3B3FD92EB72DAD20333449F8E83CFB4A7789508D16918F03F53C52DAC54ED8259740051E9C5FECF64344F7A82260EDCC304C6528F659C77866A510D9C1D6AE5E
-[AES-192/OFB]
+[OFB(AES-192)]
Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B
Nonce = 000102030405060708090A0B0C0D0E0F
In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710
Out = CDC80D6FDDF18CAB34C25909C99A4174FCC28B8D4C63837C09E81700C11004018D9A9AEAC0F6596F559C6D4DAF59A5F26D9F200857CA6C3E9CAC524BD9ACC92A
-[AES-256/OFB]
+[OFB(AES-256)]
Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4
Nonce = 000102030405060708090A0B0C0D0E0F
In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710
diff --git a/src/tests/test_block.cpp b/src/tests/test_block.cpp
index 2ef5f8979..037ea0547 100644
--- a/src/tests/test_block.cpp
+++ b/src/tests/test_block.cpp
@@ -24,6 +24,12 @@ size_t block_test(const std::string& algo,
const auto providers = af.providers_of(algo);
size_t fails = 0;
+ if(providers.empty())
+ {
+ std::cout << "Unknown algo " << algo << "\n";
+ ++fails;
+ }
+
for(auto provider: providers)
{
const BlockCipher* proto = af.prototype_block_cipher(algo, provider);
diff --git a/src/tests/test_hash.cpp b/src/tests/test_hash.cpp
index cd0fb785b..6077bf906 100644
--- a/src/tests/test_hash.cpp
+++ b/src/tests/test_hash.cpp
@@ -19,6 +19,12 @@ size_t hash_test(const std::string& algo,
const auto providers = af.providers_of(algo);
size_t fails = 0;
+ if(providers.empty())
+ {
+ std::cout << "Unknown algo " << algo << "\n";
+ ++fails;
+ }
+
for(auto provider: providers)
{
auto proto = af.prototype_hash_function(algo, provider);
diff --git a/src/tests/test_mac.cpp b/src/tests/test_mac.cpp
index 2b07497aa..90d501233 100644
--- a/src/tests/test_mac.cpp
+++ b/src/tests/test_mac.cpp
@@ -20,6 +20,12 @@ size_t mac_test(const std::string& algo,
const auto providers = af.providers_of(algo);
size_t fails = 0;
+ if(providers.empty())
+ {
+ std::cout << "Unknown algo " << algo << "\n";
+ ++fails;
+ }
+
for(auto provider: providers)
{
auto proto = af.prototype_mac(algo, provider);
diff --git a/src/tests/test_stream.cpp b/src/tests/test_stream.cpp
index 707f5d62d..ef186e982 100644
--- a/src/tests/test_stream.cpp
+++ b/src/tests/test_stream.cpp
@@ -26,13 +26,19 @@ size_t stream_test(const std::string& algo,
const auto providers = af.providers_of(algo);
size_t fails = 0;
+ if(providers.empty())
+ {
+ std::cout << "Unknown algo " << algo << "\n";
+ ++fails;
+ }
+
for(auto provider: providers)
{
const StreamCipher* proto = af.prototype_stream_cipher(algo, provider);
if(!proto)
{
- std::cout << "Unable to get " << algo << " from " << provider << "\n";
+ std::cout << "Unable to get " << algo << " from provider '" << provider << "'\n";
++fails;
continue;
}