diff options
author | lloyd <[email protected]> | 2013-03-21 15:22:09 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2013-03-21 15:22:09 +0000 |
commit | bdfe5f4efd91f2dabfcbf4fa7636c834b408c956 (patch) | |
tree | d15a2a24f4e2b8d77dca23dc4f45029c200bed73 /src | |
parent | d1d27bda2173c78b9ddf573f83b1115d52af5530 (diff) | |
parent | 1d4b469ecd0499559a463f90bd8553ef075061d9 (diff) |
merge of '767ce7b733ad25a056a4609645dbb0418fed5c91'
and '8795500927af6dc6c8a74d6868d002712f971a2f'
Diffstat (limited to 'src')
27 files changed, 58 insertions, 777 deletions
diff --git a/src/build-data/scripts/dist.py b/src/build-data/scripts/dist.py index e0b890c83..316057d22 100755 --- a/src/build-data/scripts/dist.py +++ b/src/build-data/scripts/dist.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python """ Release script for botan (http://botan.randombit.net/) diff --git a/src/engine/core_engine/lookup_stream.cpp b/src/engine/core_engine/lookup_stream.cpp index 50e246756..683ee6b8c 100644 --- a/src/engine/core_engine/lookup_stream.cpp +++ b/src/engine/core_engine/lookup_stream.cpp @@ -16,14 +16,6 @@ #include <botan/salsa20.h> #endif -#if defined(BOTAN_HAS_TURING) - #include <botan/turing.h> -#endif - -#if defined(BOTAN_HAS_WID_WAKE) - #include <botan/wid_wake.h> -#endif - namespace Botan { /* @@ -45,16 +37,6 @@ Core_Engine::find_stream_cipher(const SCAN_Name& request, return new Salsa20; #endif -#if defined(BOTAN_HAS_TURING) - if(request.algo_name() == "Turing") - return new Turing; -#endif - -#if defined(BOTAN_HAS_WID_WAKE) - if(request.algo_name() == "WiderWake4+1-BE") - return new WiderWake_41_BE; -#endif - return nullptr; } diff --git a/src/filters/aead/aead.h b/src/filters/aead/aead_filt.h index 868008e5d..77818c17e 100644 --- a/src/filters/aead/aead.h +++ b/src/filters/aead/aead_filt.h @@ -12,7 +12,7 @@ namespace Botan { -class AEAD_Mode : public Keyed_Filter +class BOTAN_DLL AEAD_Filter : public Keyed_Filter { public: /** diff --git a/src/filters/aead/eax/eax.cpp b/src/filters/aead/eax/eax.cpp index 57f62833b..d4a982aaf 100644 --- a/src/filters/aead/eax/eax.cpp +++ b/src/filters/aead/eax/eax.cpp @@ -58,16 +58,6 @@ EAX_Mode::EAX_Mode(BlockCipher* cipher, size_t tag_size, bool decrypting) : } /* -* Check if a keylength is valid for EAX -*/ -bool EAX_Mode::valid_keylength(size_t n) const - { - if(!ctr->valid_keylength(n)) - return false; - return true; - } - -/* * Set the EAX key */ void EAX_Mode::set_key(const SymmetricKey& key) diff --git a/src/filters/aead/eax/eax.h b/src/filters/aead/eax/eax.h index e219487cb..cf99622a1 100644 --- a/src/filters/aead/eax/eax.h +++ b/src/filters/aead/eax/eax.h @@ -8,7 +8,7 @@ #ifndef BOTAN_EAX_H__ #define BOTAN_EAX_H__ -#include <botan/aead.h> +#include <botan/aead_filt.h> #include <botan/buf_filt.h> #include <botan/block_cipher.h> #include <botan/stream_cipher.h> @@ -20,7 +20,7 @@ namespace Botan { /** * EAX Mode */ -class BOTAN_DLL EAX_Mode : public AEAD_Mode, +class BOTAN_DLL EAX_Mode : public AEAD_Filter, private Buffered_Filter { public: @@ -32,7 +32,7 @@ class BOTAN_DLL EAX_Mode : public AEAD_Mode, std::string name() const override; - bool valid_keylength(size_t key_len) const override; + Key_Length_Specification key_spec() const override { return ctr->key_spec(); } // EAX supports arbitrary IV lengths bool valid_iv_length(size_t) const override { return true; } diff --git a/src/filters/aead/gcm/gcm.cpp b/src/filters/aead/gcm/gcm.cpp index 013757b59..32a763df7 100644 --- a/src/filters/aead/gcm/gcm.cpp +++ b/src/filters/aead/gcm/gcm.cpp @@ -107,16 +107,6 @@ GCM_Mode::GCM_Mode(BlockCipher* cipher, size_t tag_size, bool decrypting) : throw Invalid_Argument(name() + ": Bad tag size " + std::to_string(m_tag_size)); } -/* -* Check if a keylength is valid for GCM -*/ -bool GCM_Mode::valid_keylength(size_t n) const - { - if(!m_ctr->valid_keylength(n)) - return false; - return true; - } - void GCM_Mode::set_key(const SymmetricKey& key) { m_ctr->set_key(key); diff --git a/src/filters/aead/gcm/gcm.h b/src/filters/aead/gcm/gcm.h index fa13597ce..a04a6b8c0 100644 --- a/src/filters/aead/gcm/gcm.h +++ b/src/filters/aead/gcm/gcm.h @@ -8,7 +8,7 @@ #ifndef BOTAN_GCM_H__ #define BOTAN_GCM_H__ -#include <botan/aead.h> +#include <botan/aead_filt.h> #include <botan/buf_filt.h> #include <botan/block_cipher.h> #include <botan/stream_cipher.h> @@ -19,7 +19,7 @@ namespace Botan { /** * GCM Mode */ -class BOTAN_DLL GCM_Mode : public AEAD_Mode, +class BOTAN_DLL GCM_Mode : public AEAD_Filter, private Buffered_Filter { public: @@ -32,7 +32,7 @@ class BOTAN_DLL GCM_Mode : public AEAD_Mode, */ void set_associated_data(const byte ad[], size_t ad_len) override; - bool valid_keylength(size_t key_len) const override; + Key_Length_Specification key_spec() const override { return m_ctr->key_spec(); } // GCM supports arbitrary IV lengths bool valid_iv_length(size_t) const override { return true; } diff --git a/src/filters/aead/ocb/ocb.cpp b/src/filters/aead/ocb/ocb.cpp index ebf440d32..eb10b6e9f 100644 --- a/src/filters/aead/ocb/ocb.cpp +++ b/src/filters/aead/ocb/ocb.cpp @@ -180,11 +180,6 @@ OCB_Mode::OCB_Mode(BlockCipher* cipher, size_t tag_size, bool decrypting) : OCB_Mode::~OCB_Mode() { /* for unique_ptr destructor */ } -bool OCB_Mode::valid_keylength(size_t n) const - { - return m_cipher->valid_keylength(n); - } - std::string OCB_Mode::name() const { return m_cipher->name() + "/OCB"; // include tag size diff --git a/src/filters/aead/ocb/ocb.h b/src/filters/aead/ocb/ocb.h index 5e3c5cf0a..0a1cbcaff 100644 --- a/src/filters/aead/ocb/ocb.h +++ b/src/filters/aead/ocb/ocb.h @@ -8,7 +8,7 @@ #ifndef BOTAN_OCB_H__ #define BOTAN_OCB_H__ -#include <botan/aead.h> +#include <botan/aead_filt.h> #include <botan/block_cipher.h> #include <botan/buf_filt.h> #include <memory> @@ -27,7 +27,7 @@ class Nonce_State; * @see Free Licenses http://www.cs.ucdavis.edu/~rogaway/ocb/license.htm * @see OCB home page http://www.cs.ucdavis.edu/~rogaway/ocb */ -class BOTAN_DLL OCB_Mode : public AEAD_Mode, +class BOTAN_DLL OCB_Mode : public AEAD_Filter, private Buffered_Filter { public: @@ -37,7 +37,7 @@ class BOTAN_DLL OCB_Mode : public AEAD_Mode, void set_associated_data(const byte ad[], size_t ad_len) override; - bool valid_keylength(size_t n) const override; + Key_Length_Specification key_spec() const override { return m_cipher->key_spec(); } std::string name() const override; diff --git a/src/filters/filters.h b/src/filters/filters.h index 08b505bc0..8fcc2d85d 100644 --- a/src/filters/filters.h +++ b/src/filters/filters.h @@ -58,13 +58,7 @@ class BOTAN_DLL StreamCipher_Filter : public Keyed_Filter */ void set_key(const SymmetricKey& key) { cipher->set_key(key); } - /** - * Check whether a key length is valid for this filter. - * @param length the key length to be checked for validity - * @return true if the key length is valid, false otherwise - */ - bool valid_keylength(size_t length) const - { return cipher->valid_keylength(length); } + Key_Length_Specification key_spec() const override { return cipher->key_spec(); } /** * Construct a stream cipher filter. @@ -153,13 +147,7 @@ class BOTAN_DLL MAC_Filter : public Keyed_Filter */ void set_key(const SymmetricKey& key) { mac->set_key(key); } - /** - * Check whether a key length is valid for this filter. - * @param length the key length to be checked for validity - * @return true if the key length is valid, false otherwise - */ - bool valid_keylength(size_t length) const - { return mac->valid_keylength(length); } + Key_Length_Specification key_spec() const override { return mac->key_spec(); } /** * Construct a MAC filter. The MAC key will be left empty. diff --git a/src/filters/key_filt.h b/src/filters/key_filt.h index 3c79ebac9..6d69d6b83 100644 --- a/src/filters/key_filt.h +++ b/src/filters/key_filt.h @@ -38,7 +38,15 @@ class BOTAN_DLL Keyed_Filter : public Filter * @param length the key length to be checked for validity * @return true if the key length is valid, false otherwise */ - virtual bool valid_keylength(size_t length) const = 0; + bool valid_keylength(size_t length) const + { + return key_spec().valid_keylength(length); + } + + /** + * @return object describing limits on key size + */ + virtual Key_Length_Specification key_spec() const = 0; /** * Check whether an IV length is valid for this filter diff --git a/src/filters/modes/cbc/cbc.h b/src/filters/modes/cbc/cbc.h index 4fd0f7d66..51e217e70 100644 --- a/src/filters/modes/cbc/cbc.h +++ b/src/filters/modes/cbc/cbc.h @@ -28,8 +28,7 @@ class BOTAN_DLL CBC_Encryption : public Keyed_Filter, void set_key(const SymmetricKey& key) { cipher->set_key(key); } - bool valid_keylength(size_t key_len) const - { return cipher->valid_keylength(key_len); } + Key_Length_Specification key_spec() const override { return cipher->key_spec(); } bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } @@ -68,8 +67,7 @@ class BOTAN_DLL CBC_Decryption : public Keyed_Filter, void set_key(const SymmetricKey& key) { cipher->set_key(key); } - bool valid_keylength(size_t key_len) const - { return cipher->valid_keylength(key_len); } + Key_Length_Specification key_spec() const override { return cipher->key_spec(); } bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } diff --git a/src/filters/modes/cfb/cfb.h b/src/filters/modes/cfb/cfb.h index 212ac76da..02154ebb9 100644 --- a/src/filters/modes/cfb/cfb.h +++ b/src/filters/modes/cfb/cfb.h @@ -25,8 +25,7 @@ class BOTAN_DLL CFB_Encryption : public Keyed_Filter void set_key(const SymmetricKey& key) { cipher->set_key(key); } - bool valid_keylength(size_t key_len) const - { return cipher->valid_keylength(key_len); } + Key_Length_Specification key_spec() const override { return cipher->key_spec(); } bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } @@ -59,8 +58,7 @@ class BOTAN_DLL CFB_Decryption : public Keyed_Filter void set_key(const SymmetricKey& key) { cipher->set_key(key); } - bool valid_keylength(size_t key_len) const - { return cipher->valid_keylength(key_len); } + Key_Length_Specification key_spec() const override { return cipher->key_spec(); } bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } diff --git a/src/filters/modes/cts/cts.h b/src/filters/modes/cts/cts.h index ac296316f..b0efb6944 100644 --- a/src/filters/modes/cts/cts.h +++ b/src/filters/modes/cts/cts.h @@ -25,8 +25,7 @@ class BOTAN_DLL CTS_Encryption : public Keyed_Filter void set_key(const SymmetricKey& key) { cipher->set_key(key); } - bool valid_keylength(size_t key_len) const - { return cipher->valid_keylength(key_len); } + Key_Length_Specification key_spec() const override { return cipher->key_spec(); } bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } @@ -60,8 +59,7 @@ class BOTAN_DLL CTS_Decryption : public Keyed_Filter void set_key(const SymmetricKey& key) { cipher->set_key(key); } - bool valid_keylength(size_t key_len) const - { return cipher->valid_keylength(key_len); } + Key_Length_Specification key_spec() const override { return cipher->key_spec(); } bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } diff --git a/src/filters/modes/ecb/ecb.h b/src/filters/modes/ecb/ecb.h index e6476ab5d..8f4e6f1b5 100644 --- a/src/filters/modes/ecb/ecb.h +++ b/src/filters/modes/ecb/ecb.h @@ -26,8 +26,7 @@ class BOTAN_DLL ECB_Encryption : public Keyed_Filter, void set_key(const SymmetricKey& key) { cipher->set_key(key); } - bool valid_keylength(size_t key_len) const - { return cipher->valid_keylength(key_len); } + Key_Length_Specification key_spec() const override { return cipher->key_spec(); } ECB_Encryption(BlockCipher* ciph, BlockCipherModePaddingMethod* pad); @@ -60,8 +59,7 @@ class BOTAN_DLL ECB_Decryption : public Keyed_Filter, void set_key(const SymmetricKey& key) { cipher->set_key(key); } - bool valid_keylength(size_t key_len) const - { return cipher->valid_keylength(key_len); } + Key_Length_Specification key_spec() const override { return cipher->key_spec(); } ECB_Decryption(BlockCipher* ciph, BlockCipherModePaddingMethod* pad); diff --git a/src/filters/modes/xts/xts.cpp b/src/filters/modes/xts/xts.cpp index e29ef6b98..df38614bb 100644 --- a/src/filters/modes/xts/xts.cpp +++ b/src/filters/modes/xts/xts.cpp @@ -39,6 +39,15 @@ size_t xts_parallelism(BlockCipher* cipher) 2 * cipher->block_size()); } +Key_Length_Specification xts_key_spec(const BlockCipher& cipher) + { + const Key_Length_Specification& spec = cipher.key_spec(); + + return Key_Length_Specification(2*spec.minimum_keylength(), + 2*spec.maximum_keylength(), + 2*spec.keylength_multiple()); + } + } /* @@ -82,6 +91,11 @@ std::string XTS_Encryption::name() const return (cipher->name() + "/XTS"); } +Key_Length_Specification XTS_Encryption::key_spec() const + { + return xts_key_spec(*cipher); + } + /* * Set new tweak */ @@ -256,6 +270,11 @@ std::string XTS_Decryption::name() const return (cipher->name() + "/XTS"); } +Key_Length_Specification XTS_Decryption::key_spec() const + { + return xts_key_spec(*cipher); + } + /* * Set new tweak */ diff --git a/src/filters/modes/xts/xts.h b/src/filters/modes/xts/xts.h index d4801cd37..05a779703 100644 --- a/src/filters/modes/xts/xts.h +++ b/src/filters/modes/xts/xts.h @@ -24,8 +24,7 @@ class BOTAN_DLL XTS_Encryption : public Keyed_Filter, void set_key(const SymmetricKey& key); void set_iv(const InitializationVector& iv); - bool valid_keylength(size_t key_len) const - { return cipher->valid_keylength(key_len); } + Key_Length_Specification key_spec() const override; bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } @@ -61,8 +60,7 @@ class BOTAN_DLL XTS_Decryption : public Keyed_Filter, void set_key(const SymmetricKey& key); void set_iv(const InitializationVector& iv); - bool valid_keylength(size_t key_len) const - { return cipher->valid_keylength(key_len); } + Key_Length_Specification key_spec() const override; bool valid_iv_length(size_t iv_len) const { return (iv_len == cipher->block_size()); } diff --git a/src/libstate/lookup.cpp b/src/libstate/lookup.cpp index 1263c0897..5c5f038ee 100644 --- a/src/libstate/lookup.cpp +++ b/src/libstate/lookup.cpp @@ -108,12 +108,12 @@ Keyed_Filter* get_cipher(const std::string& algo_spec, key, InitializationVector(), direction); } -AEAD_Mode* get_aead(const std::string& algo_spec, +AEAD_Filter* get_aead(const std::string& algo_spec, Cipher_Dir direction) { std::unique_ptr<Keyed_Filter> c(get_cipher(algo_spec, direction)); - if(AEAD_Mode* aead = dynamic_cast<AEAD_Mode*>(c.get())) + if(AEAD_Filter* aead = dynamic_cast<AEAD_Filter*>(c.get())) { c.release(); return aead; diff --git a/src/libstate/lookup.h b/src/libstate/lookup.h index 2a47c7f14..c9d1ee707 100644 --- a/src/libstate/lookup.h +++ b/src/libstate/lookup.h @@ -11,7 +11,7 @@ #include <botan/libstate.h> #include <botan/engine.h> #include <botan/filters.h> -#include <botan/aead.h> +#include <botan/aead_filt.h> #include <botan/mode_pad.h> #include <botan/kdf.h> #include <botan/eme.h> @@ -227,7 +227,7 @@ BOTAN_DLL Keyed_Filter* get_cipher(const std::string& algo_spec, * decrypting filter * @return pointer to the encryption or decryption filter */ -BOTAN_DLL AEAD_Mode* get_aead(const std::string& algo_spec, +BOTAN_DLL AEAD_Filter* get_aead(const std::string& algo_spec, Cipher_Dir direction); /** diff --git a/src/selftest/selftest.cpp b/src/selftest/selftest.cpp index e291a8e9d..4be4f8751 100644 --- a/src/selftest/selftest.cpp +++ b/src/selftest/selftest.cpp @@ -7,7 +7,7 @@ #include <botan/selftest.h> #include <botan/filters.h> -#include <botan/aead.h> +#include <botan/aead_filt.h> #include <botan/hex.h> #include <botan/internal/core_engine.h> #include <botan/internal/stl_util.h> @@ -128,13 +128,13 @@ algorithm_kat_detailed(const SCAN_Name& algo_name, #if defined(BOTAN_HAS_AEAD) - if(AEAD_Mode* enc_aead = dynamic_cast<AEAD_Mode*>(enc)) + if(AEAD_Filter* enc_aead = dynamic_cast<AEAD_Filter*>(enc)) { const std::vector<byte> ad = hex_decode(search_map(vars, std::string("ad"))); enc_aead->set_associated_data(&ad[0], ad.size()); - if(AEAD_Mode* dec_aead = dynamic_cast<AEAD_Mode*>(dec)) + if(AEAD_Filter* dec_aead = dynamic_cast<AEAD_Filter*>(dec)) dec_aead->set_associated_data(&ad[0], ad.size()); } #endif diff --git a/src/stream/turing/info.txt b/src/stream/turing/info.txt deleted file mode 100644 index feb00a92d..000000000 --- a/src/stream/turing/info.txt +++ /dev/null @@ -1 +0,0 @@ -define TURING diff --git a/src/stream/turing/tur_tab.cpp b/src/stream/turing/tur_tab.cpp deleted file mode 100644 index a2edd5a5e..000000000 --- a/src/stream/turing/tur_tab.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/* -* Tables for Turing -* (C) 1999-2007 Jack Lloyd -* -* Distributed under the terms of the Botan license -*/ - -#include <botan/turing.h> - -namespace Botan { - -const byte Turing::SBOX[256] = { - 0x61, 0x51, 0xEB, 0x19, 0xB9, 0x5D, 0x60, 0x38, 0x7C, 0xB2, 0x06, 0x12, - 0xC4, 0x5B, 0x16, 0x3B, 0x2B, 0x18, 0x83, 0xB0, 0x7F, 0x75, 0xFA, 0xA0, - 0xE9, 0xDD, 0x6D, 0x7A, 0x6B, 0x68, 0x2D, 0x49, 0xB5, 0x1C, 0x90, 0xF7, - 0xED, 0x9F, 0xE8, 0xCE, 0xAE, 0x77, 0xC2, 0x13, 0xFD, 0xCD, 0x3E, 0xCF, - 0x37, 0x6A, 0xD4, 0xDB, 0x8E, 0x65, 0x1F, 0x1A, 0x87, 0xCB, 0x40, 0x15, - 0x88, 0x0D, 0x35, 0xB3, 0x11, 0x0F, 0xD0, 0x30, 0x48, 0xF9, 0xA8, 0xAC, - 0x85, 0x27, 0x0E, 0x8A, 0xE0, 0x50, 0x64, 0xA7, 0xCC, 0xE4, 0xF1, 0x98, - 0xFF, 0xA1, 0x04, 0xDA, 0xD5, 0xBC, 0x1B, 0xBB, 0xD1, 0xFE, 0x31, 0xCA, - 0xBA, 0xD9, 0x2E, 0xF3, 0x1D, 0x47, 0x4A, 0x3D, 0x71, 0x4C, 0xAB, 0x7D, - 0x8D, 0xC7, 0x59, 0xB8, 0xC1, 0x96, 0x1E, 0xFC, 0x44, 0xC8, 0x7B, 0xDC, - 0x5C, 0x78, 0x2A, 0x9D, 0xA5, 0xF0, 0x73, 0x22, 0x89, 0x05, 0xF4, 0x07, - 0x21, 0x52, 0xA6, 0x28, 0x9A, 0x92, 0x69, 0x8F, 0xC5, 0xC3, 0xF5, 0xE1, - 0xDE, 0xEC, 0x09, 0xF2, 0xD3, 0xAF, 0x34, 0x23, 0xAA, 0xDF, 0x7E, 0x82, - 0x29, 0xC0, 0x24, 0x14, 0x03, 0x32, 0x4E, 0x39, 0x6F, 0xC6, 0xB1, 0x9B, - 0xEA, 0x72, 0x79, 0x41, 0xD8, 0x26, 0x6C, 0x5E, 0x2C, 0xB4, 0xA2, 0x53, - 0x57, 0xE2, 0x9C, 0x86, 0x54, 0x95, 0xB6, 0x80, 0x8C, 0x36, 0x67, 0xBD, - 0x08, 0x93, 0x2F, 0x99, 0x5A, 0xF8, 0x3A, 0xD7, 0x56, 0x84, 0xD2, 0x01, - 0xF6, 0x66, 0x4D, 0x55, 0x8B, 0x0C, 0x0B, 0x46, 0xB7, 0x3C, 0x45, 0x91, - 0xA4, 0xE3, 0x70, 0xD6, 0xFB, 0xE6, 0x10, 0xA9, 0xC9, 0x00, 0x9E, 0xE7, - 0x4F, 0x76, 0x25, 0x3F, 0x5F, 0xA3, 0x33, 0x20, 0x02, 0xEF, 0x62, 0x74, - 0xEE, 0x17, 0x81, 0x42, 0x58, 0x0A, 0x4B, 0x63, 0xE5, 0xBE, 0x6E, 0xAD, - 0xBF, 0x43, 0x94, 0x97 }; - -const u32bit Turing::Q_BOX[256] = { - 0x1FAA1887, 0x4E5E435C, 0x9165C042, 0x250E6EF4, 0x5957EE20, 0xD484FED3, - 0xA666C502, 0x7E54E8AE, 0xD12EE9D9, 0xFC1F38D4, 0x49829B5D, 0x1B5CDF3C, - 0x74864249, 0xDA2E3963, 0x28F4429F, 0xC8432C35, 0x4AF40325, 0x9FC0DD70, - 0xD8973DED, 0x1A02DC5E, 0xCD175B42, 0xF10012BF, 0x6694D78C, 0xACAAB26B, - 0x4EC11B9A, 0x3F168146, 0xC0EA8EC5, 0xB38AC28F, 0x1FED5C0F, 0xAAB4101C, - 0xEA2DB082, 0x470929E1, 0xE71843DE, 0x508299FC, 0xE72FBC4B, 0x2E3915DD, - 0x9FA803FA, 0x9546B2DE, 0x3C233342, 0x0FCEE7C3, 0x24D607EF, 0x8F97EBAB, - 0xF37F859B, 0xCD1F2E2F, 0xC25B71DA, 0x75E2269A, 0x1E39C3D1, 0xEDA56B36, - 0xF8C9DEF2, 0x46C9FC5F, 0x1827B3A3, 0x70A56DDF, 0x0D25B510, 0x000F85A7, - 0xB2E82E71, 0x68CB8816, 0x8F951E2A, 0x72F5F6AF, 0xE4CBC2B3, 0xD34FF55D, - 0x2E6B6214, 0x220B83E3, 0xD39EA6F5, 0x6FE041AF, 0x6B2F1F17, 0xAD3B99EE, - 0x16A65EC0, 0x757016C6, 0xBA7709A4, 0xB0326E01, 0xF4B280D9, 0x4BFB1418, - 0xD6AFF227, 0xFD548203, 0xF56B9D96, 0x6717A8C0, 0x00D5BF6E, 0x10EE7888, - 0xEDFCFE64, 0x1BA193CD, 0x4B0D0184, 0x89AE4930, 0x1C014F36, 0x82A87088, - 0x5EAD6C2A, 0xEF22C678, 0x31204DE7, 0xC9C2E759, 0xD200248E, 0x303B446B, - 0xB00D9FC2, 0x9914A895, 0x906CC3A1, 0x54FEF170, 0x34C19155, 0xE27B8A66, - 0x131B5E69, 0xC3A8623E, 0x27BDFA35, 0x97F068CC, 0xCA3A6ACD, 0x4B55E936, - 0x86602DB9, 0x51DF13C1, 0x390BB16D, 0x5A80B83C, 0x22B23763, 0x39D8A911, - 0x2CB6BC13, 0xBF5579D7, 0x6C5C2FA8, 0xA8F4196E, 0xBCDB5476, 0x6864A866, - 0x416E16AD, 0x897FC515, 0x956FEB3C, 0xF6C8A306, 0x216799D9, 0x171A9133, - 0x6C2466DD, 0x75EB5DCD, 0xDF118F50, 0xE4AFB226, 0x26B9CEF3, 0xADB36189, - 0x8A7A19B1, 0xE2C73084, 0xF77DED5C, 0x8B8BC58F, 0x06DDE421, 0xB41E47FB, - 0xB1CC715E, 0x68C0FF99, 0x5D122F0F, 0xA4D25184, 0x097A5E6C, 0x0CBF18BC, - 0xC2D7C6E0, 0x8BB7E420, 0xA11F523F, 0x35D9B8A2, 0x03DA1A6B, 0x06888C02, - 0x7DD1E354, 0x6BBA7D79, 0x32CC7753, 0xE52D9655, 0xA9829DA1, 0x301590A7, - 0x9BC1C149, 0x13537F1C, 0xD3779B69, 0x2D71F2B7, 0x183C58FA, 0xACDC4418, - 0x8D8C8C76, 0x2620D9F0, 0x71A80D4D, 0x7A74C473, 0x449410E9, 0xA20E4211, - 0xF9C8082B, 0x0A6B334A, 0xB5F68ED2, 0x8243CC1B, 0x453C0FF3, 0x9BE564A0, - 0x4FF55A4F, 0x8740F8E7, 0xCCA7F15F, 0xE300FE21, 0x786D37D6, 0xDFD506F1, - 0x8EE00973, 0x17BBDE36, 0x7A670FA8, 0x5C31AB9E, 0xD4DAB618, 0xCC1F52F5, - 0xE358EB4F, 0x19B9E343, 0x3A8D77DD, 0xCDB93DA6, 0x140FD52D, 0x395412F8, - 0x2BA63360, 0x37E53AD0, 0x80700F1C, 0x7624ED0B, 0x703DC1EC, 0xB7366795, - 0xD6549D15, 0x66CE46D7, 0xD17ABE76, 0xA448E0A0, 0x28F07C02, 0xC31249B7, - 0x6E9ED6BA, 0xEAA47F78, 0xBBCFFFBD, 0xC507CA84, 0xE965F4DA, 0x8E9F35DA, - 0x6AD2AA44, 0x577452AC, 0xB5D674A7, 0x5461A46A, 0x6763152A, 0x9C12B7AA, - 0x12615927, 0x7B4FB118, 0xC351758D, 0x7E81687B, 0x5F52F0B3, 0x2D4254ED, - 0xD4C77271, 0x0431ACAB, 0xBEF94AEC, 0xFEE994CD, 0x9C4D9E81, 0xED623730, - 0xCF8A21E8, 0x51917F0B, 0xA7A9B5D6, 0xB297ADF8, 0xEED30431, 0x68CAC921, - 0xF1B35D46, 0x7A430A36, 0x51194022, 0x9ABCA65E, 0x85EC70BA, 0x39AEA8CC, - 0x737BAE8B, 0x582924D5, 0x03098A5A, 0x92396B81, 0x18DE2522, 0x745C1CB8, - 0xA1B8FE1D, 0x5DB3C697, 0x29164F83, 0x97C16376, 0x8419224C, 0x21203B35, - 0x833AC0FE, 0xD966A19A, 0xAAF0B24F, 0x40FDA998, 0xE7D52D71, 0x390896A8, - 0xCEE6053F, 0xD0B0D300, 0xFF99CBCC, 0x065E3D40 }; - -} diff --git a/src/stream/turing/turing.cpp b/src/stream/turing/turing.cpp deleted file mode 100644 index 8d9b6f090..000000000 --- a/src/stream/turing/turing.cpp +++ /dev/null @@ -1,333 +0,0 @@ -/* -* Turing -* (C) 1999-2008 Jack Lloyd -* -* Distributed under the terms of the Botan license -*/ - -#include <botan/turing.h> -#include <botan/loadstor.h> -#include <botan/rotate.h> -#include <botan/internal/xor_buf.h> - -namespace Botan { - -namespace { - -/* -* Perform an N-way PHT -*/ -inline void PHT(secure_vector<u32bit>& B) - { - u32bit sum = 0; - for(size_t i = 0; i < B.size() - 1; ++i) - sum += B[i]; - - B[B.size()-1] += sum; - - sum = B[B.size()-1]; - for(size_t i = 0; i < B.size() - 1; ++i) - B[i] += sum; - } - -} - -/* -* Combine cipher stream with message -*/ -void Turing::cipher(const byte in[], byte out[], size_t length) - { - while(length >= buffer.size() - position) - { - xor_buf(out, in, &buffer[position], buffer.size() - position); - length -= (buffer.size() - position); - in += (buffer.size() - position); - out += (buffer.size() - position); - generate(); - } - xor_buf(out, in, &buffer[position], length); - position += length; - } - -/* -* Generate cipher stream -*/ -void Turing::generate() - { - // Table for Turing's polynomial multiplication - static const u32bit MULT_TAB[256] = { - 0x00000000, 0xD02B4367, 0xED5686CE, 0x3D7DC5A9, 0x97AC41D1, 0x478702B6, - 0x7AFAC71F, 0xAAD18478, 0x631582EF, 0xB33EC188, 0x8E430421, 0x5E684746, - 0xF4B9C33E, 0x24928059, 0x19EF45F0, 0xC9C40697, 0xC62A4993, 0x16010AF4, - 0x2B7CCF5D, 0xFB578C3A, 0x51860842, 0x81AD4B25, 0xBCD08E8C, 0x6CFBCDEB, - 0xA53FCB7C, 0x7514881B, 0x48694DB2, 0x98420ED5, 0x32938AAD, 0xE2B8C9CA, - 0xDFC50C63, 0x0FEE4F04, 0xC154926B, 0x117FD10C, 0x2C0214A5, 0xFC2957C2, - 0x56F8D3BA, 0x86D390DD, 0xBBAE5574, 0x6B851613, 0xA2411084, 0x726A53E3, - 0x4F17964A, 0x9F3CD52D, 0x35ED5155, 0xE5C61232, 0xD8BBD79B, 0x089094FC, - 0x077EDBF8, 0xD755989F, 0xEA285D36, 0x3A031E51, 0x90D29A29, 0x40F9D94E, - 0x7D841CE7, 0xADAF5F80, 0x646B5917, 0xB4401A70, 0x893DDFD9, 0x59169CBE, - 0xF3C718C6, 0x23EC5BA1, 0x1E919E08, 0xCEBADD6F, 0xCFA869D6, 0x1F832AB1, - 0x22FEEF18, 0xF2D5AC7F, 0x58042807, 0x882F6B60, 0xB552AEC9, 0x6579EDAE, - 0xACBDEB39, 0x7C96A85E, 0x41EB6DF7, 0x91C02E90, 0x3B11AAE8, 0xEB3AE98F, - 0xD6472C26, 0x066C6F41, 0x09822045, 0xD9A96322, 0xE4D4A68B, 0x34FFE5EC, - 0x9E2E6194, 0x4E0522F3, 0x7378E75A, 0xA353A43D, 0x6A97A2AA, 0xBABCE1CD, - 0x87C12464, 0x57EA6703, 0xFD3BE37B, 0x2D10A01C, 0x106D65B5, 0xC04626D2, - 0x0EFCFBBD, 0xDED7B8DA, 0xE3AA7D73, 0x33813E14, 0x9950BA6C, 0x497BF90B, - 0x74063CA2, 0xA42D7FC5, 0x6DE97952, 0xBDC23A35, 0x80BFFF9C, 0x5094BCFB, - 0xFA453883, 0x2A6E7BE4, 0x1713BE4D, 0xC738FD2A, 0xC8D6B22E, 0x18FDF149, - 0x258034E0, 0xF5AB7787, 0x5F7AF3FF, 0x8F51B098, 0xB22C7531, 0x62073656, - 0xABC330C1, 0x7BE873A6, 0x4695B60F, 0x96BEF568, 0x3C6F7110, 0xEC443277, - 0xD139F7DE, 0x0112B4B9, 0xD31DD2E1, 0x03369186, 0x3E4B542F, 0xEE601748, - 0x44B19330, 0x949AD057, 0xA9E715FE, 0x79CC5699, 0xB008500E, 0x60231369, - 0x5D5ED6C0, 0x8D7595A7, 0x27A411DF, 0xF78F52B8, 0xCAF29711, 0x1AD9D476, - 0x15379B72, 0xC51CD815, 0xF8611DBC, 0x284A5EDB, 0x829BDAA3, 0x52B099C4, - 0x6FCD5C6D, 0xBFE61F0A, 0x7622199D, 0xA6095AFA, 0x9B749F53, 0x4B5FDC34, - 0xE18E584C, 0x31A51B2B, 0x0CD8DE82, 0xDCF39DE5, 0x1249408A, 0xC26203ED, - 0xFF1FC644, 0x2F348523, 0x85E5015B, 0x55CE423C, 0x68B38795, 0xB898C4F2, - 0x715CC265, 0xA1778102, 0x9C0A44AB, 0x4C2107CC, 0xE6F083B4, 0x36DBC0D3, - 0x0BA6057A, 0xDB8D461D, 0xD4630919, 0x04484A7E, 0x39358FD7, 0xE91ECCB0, - 0x43CF48C8, 0x93E40BAF, 0xAE99CE06, 0x7EB28D61, 0xB7768BF6, 0x675DC891, - 0x5A200D38, 0x8A0B4E5F, 0x20DACA27, 0xF0F18940, 0xCD8C4CE9, 0x1DA70F8E, - 0x1CB5BB37, 0xCC9EF850, 0xF1E33DF9, 0x21C87E9E, 0x8B19FAE6, 0x5B32B981, - 0x664F7C28, 0xB6643F4F, 0x7FA039D8, 0xAF8B7ABF, 0x92F6BF16, 0x42DDFC71, - 0xE80C7809, 0x38273B6E, 0x055AFEC7, 0xD571BDA0, 0xDA9FF2A4, 0x0AB4B1C3, - 0x37C9746A, 0xE7E2370D, 0x4D33B375, 0x9D18F012, 0xA06535BB, 0x704E76DC, - 0xB98A704B, 0x69A1332C, 0x54DCF685, 0x84F7B5E2, 0x2E26319A, 0xFE0D72FD, - 0xC370B754, 0x135BF433, 0xDDE1295C, 0x0DCA6A3B, 0x30B7AF92, 0xE09CECF5, - 0x4A4D688D, 0x9A662BEA, 0xA71BEE43, 0x7730AD24, 0xBEF4ABB3, 0x6EDFE8D4, - 0x53A22D7D, 0x83896E1A, 0x2958EA62, 0xF973A905, 0xC40E6CAC, 0x14252FCB, - 0x1BCB60CF, 0xCBE023A8, 0xF69DE601, 0x26B6A566, 0x8C67211E, 0x5C4C6279, - 0x6131A7D0, 0xB11AE4B7, 0x78DEE220, 0xA8F5A147, 0x958864EE, 0x45A32789, - 0xEF72A3F1, 0x3F59E096, 0x0224253F, 0xD20F6658 }; - - /* - I tried an implementation without precomputed LFSR offsets, since - I thought that might allow (especially on x86-64) the use of leal to - compute all the offsets.. However on my Core2 with GCC 4.3 it - turned out significantly slower (238 Mib/s, versus 300 Mib/s - with precomputed offsets) - - I also tried using byte vs u32bit for the offset variable (since - x86 memory addressing modes can be odd), but it made things even - slower (186 Mib/s) - */ - static const byte OFFSETS[221] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 14, 15, 16, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 2, 3, 4, - 10, 11, 12, 13, 14, 15, 16, 0, 1, 5, 7, 8, 9, - 15, 16, 0, 1, 2, 3, 4, 5, 6, 10, 12, 13, 14, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 15, 0, 1, 2, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 3, 5, 6, 7, - 13, 14, 15, 16, 0, 1, 2, 3, 4, 8, 10, 11, 12, - 1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 15, 16, 0, - 6, 7, 8, 9, 10, 11, 12, 13, 14, 1, 3, 4, 5, - 11, 12, 13, 14, 15, 16, 0, 1, 2, 6, 8, 9, 10, - 16, 0, 1, 2, 3, 4, 5, 6, 7, 11, 13, 14, 15, - 4, 5, 6, 7, 8, 9, 10, 11, 12, 16, 1, 2, 3, - 9, 10, 11, 12, 13, 14, 15, 16, 0, 4, 6, 7, 8, - 14, 15, 16, 0, 1, 2, 3, 4, 5, 9, 11, 12, 13, - 2, 3, 4, 5, 6, 7, 8, 9, 10, 14, 16, 0, 1, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 2, 4, 5, 6, - 12, 13, 14, 15, 16, 0, 1, 2, 3, 7, 9, 10, 11 }; - - for(size_t i = 0; i != 17; ++i) - { - const byte* R_off = OFFSETS + 13*i; - - u32bit R0 = R[R_off[0]]; - u32bit R1 = R[R_off[1]]; - u32bit R2 = R[R_off[2]]; - u32bit R3 = R[R_off[3]]; - u32bit R4 = R[R_off[4]]; - - const u32bit R5 = R[R_off[5]]; - const u32bit R6 = R[R_off[6]]; - const u32bit R7 = R[R_off[7]]; - const u32bit R8 = R[R_off[8]]; - const u32bit R9 = R[R_off[9]]; - const u32bit R10 = R[R_off[10]]; - const u32bit R11 = R[R_off[11]]; - const u32bit R12 = R[R_off[12]]; - - R[R_off[0]] = R0 = ((R0 << 8) ^ MULT_TAB[(R0 >> 24) & 0xFF]) ^ R11 ^ R4; - - u32bit A = R0; - u32bit B = R10; - u32bit C = R7; - u32bit D = R2; - u32bit E = R1; - - E += A + B + C + D; - - A += E; - B += E; - C += E; - D += E; - - A = S0[get_byte(0, A)] ^ S1[get_byte(1, A)] ^ - S2[get_byte(2, A)] ^ S3[get_byte(3, A)]; - B = S0[get_byte(1, B)] ^ S1[get_byte(2, B)] ^ - S2[get_byte(3, B)] ^ S3[get_byte(0, B)]; - C = S0[get_byte(2, C)] ^ S1[get_byte(3, C)] ^ - S2[get_byte(0, C)] ^ S3[get_byte(1, C)]; - D = S0[get_byte(3, D)] ^ S1[get_byte(0, D)] ^ - S2[get_byte(1, D)] ^ S3[get_byte(2, D)]; - E = S0[get_byte(0, E)] ^ S1[get_byte(1, E)] ^ - S2[get_byte(2, E)] ^ S3[get_byte(3, E)]; - - E += A + B + C + D; - - A += E; - B += E; - C += E; - D += E; - - R[R_off[1]] = R1 = ((R1 << 8) ^ MULT_TAB[(R1 >> 24) & 0xFF]) ^ R12 ^ R5; - R[R_off[2]] = R2 = ((R2 << 8) ^ MULT_TAB[(R2 >> 24) & 0xFF]) ^ R0 ^ R6; - R[R_off[3]] = ((R3 << 8) ^ MULT_TAB[(R3 >> 24) & 0xFF]) ^ R1 ^ R7; - - E += R4; - - R[R_off[4]] = ((R4 << 8) ^ MULT_TAB[(R4 >> 24) & 0xFF]) ^ R2 ^ R8; - - A += R1; - B += R12; - C += R9; - D += R5; - - store_be(A, &buffer[20*i + 0]); - store_be(B, &buffer[20*i + 4]); - store_be(C, &buffer[20*i + 8]); - store_be(D, &buffer[20*i + 12]); - store_be(E, &buffer[20*i + 16]); - } - - position = 0; - } - -/* -* Turing's byte mixing step -*/ -u32bit Turing::fixedS(u32bit W) - { - byte B = SBOX[get_byte(0, W)]; - W ^= Q_BOX[B]; - W &= 0x00FFFFFF; - W |= B << 24; - - B = SBOX[get_byte(1, W)]; - W ^= rotate_left(Q_BOX[B], 8); - W &= 0xFF00FFFF; - W |= B << 16; - - B = SBOX[get_byte(2, W)]; - W ^= rotate_left(Q_BOX[B], 16); - W &= 0xFFFF00FF; - W |= B << 8; - - B = SBOX[get_byte(3, W)]; - W ^= rotate_left(Q_BOX[B], 24); - W &= 0xFFFFFF00; - W |= B; - - return W; - } - -/* -* Turing Key Schedule -*/ -void Turing::key_schedule(const byte key[], size_t length) - { - K.resize(length / 4); - for(size_t i = 0; i != length; ++i) - K[i/4] = (K[i/4] << 8) + key[i]; - - for(size_t i = 0; i != K.size(); ++i) - K[i] = fixedS(K[i]); - - PHT(K); - - R.resize(17); - S0.resize(256); - S1.resize(256); - S2.resize(256); - S3.resize(256); - buffer.resize(17*20); - - for(u32bit i = 0; i != 256; ++i) - { - u32bit W0 = 0, C0 = i; - u32bit W1 = 0, C1 = i; - u32bit W2 = 0, C2 = i; - u32bit W3 = 0, C3 = i; - - for(size_t j = 0; j < K.size(); ++j) - { - C0 = SBOX[get_byte(0, K[j]) ^ C0]; - C1 = SBOX[get_byte(1, K[j]) ^ C1]; - C2 = SBOX[get_byte(2, K[j]) ^ C2]; - C3 = SBOX[get_byte(3, K[j]) ^ C3]; - - W0 ^= rotate_left(Q_BOX[C0], j); - W1 ^= rotate_left(Q_BOX[C1], j + 8); - W2 ^= rotate_left(Q_BOX[C2], j + 16); - W3 ^= rotate_left(Q_BOX[C3], j + 24); - } - - S0[i] = (W0 & 0x00FFFFFF) | (C0 << 24); - S1[i] = (W1 & 0xFF00FFFF) | (C1 << 16); - S2[i] = (W2 & 0xFFFF00FF) | (C2 << 8); - S3[i] = (W3 & 0xFFFFFF00) | C3; - } - - set_iv(nullptr, 0); - } - -/* -* Resynchronization -*/ -void Turing::set_iv(const byte iv[], size_t length) - { - if(!valid_iv_length(length)) - throw Invalid_IV_Length(name(), length); - - secure_vector<u32bit> IV(length / 4); - for(size_t i = 0; i != length; ++i) - IV[i/4] = (IV[i/4] << 8) + iv[i]; - - for(size_t i = 0; i != IV.size(); ++i) - R[i] = IV[i] = fixedS(IV[i]); - - for(size_t i = 0; i != K.size(); ++i) - R[i+IV.size()] = K[i]; - - R[K.size() + IV.size()] = (0x010203 << 8) | (K.size() << 4) | IV.size(); - - for(size_t i = K.size() + IV.size() + 1; i != 17; ++i) - { - const u32bit W = R[i-K.size()-IV.size()-1] + R[i-1]; - R[i] = S0[get_byte(0, W)] ^ S1[get_byte(1, W)] ^ - S2[get_byte(2, W)] ^ S3[get_byte(3, W)]; - } - - PHT(R); - - generate(); - } - -/* -* Clear memory of sensitive data -*/ -void Turing::clear() - { - zap(S0); - zap(S1); - zap(S2); - zap(S3); - zap(R); - zap(K); - buffer.clear(); - position = 0; - } - -} diff --git a/src/stream/turing/turing.h b/src/stream/turing/turing.h deleted file mode 100644 index f2453127a..000000000 --- a/src/stream/turing/turing.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -* Turing -* (C) 1999-2007 Jack Lloyd -* -* Distributed under the terms of the Botan license -*/ - -#ifndef BOTAN_TURING_H__ -#define BOTAN_TURING_H__ - -#include <botan/stream_cipher.h> - -namespace Botan { - -/** -* Turing -*/ -class BOTAN_DLL Turing : public StreamCipher - { - public: - void cipher(const byte in[], byte out[], size_t length); - void set_iv(const byte iv[], size_t iv_length); - - bool valid_iv_length(size_t iv_len) const - { return (iv_len % 4 == 0 && iv_len <= 16); } - - Key_Length_Specification key_spec() const - { - return Key_Length_Specification(4, 32, 4); - } - - void clear(); - std::string name() const { return "Turing"; } - StreamCipher* clone() const { return new Turing; } - - private: - void key_schedule(const byte[], size_t); - void generate(); - - static u32bit fixedS(u32bit); - - static const u32bit Q_BOX[256]; - static const byte SBOX[256]; - - secure_vector<u32bit> S0, S1, S2, S3; - secure_vector<u32bit> R, K; - secure_vector<byte> buffer; - size_t position; - }; - -} - -#endif diff --git a/src/stream/wid_wake/info.txt b/src/stream/wid_wake/info.txt deleted file mode 100644 index f7333dede..000000000 --- a/src/stream/wid_wake/info.txt +++ /dev/null @@ -1 +0,0 @@ -define WID_WAKE diff --git a/src/stream/wid_wake/wid_wake.cpp b/src/stream/wid_wake/wid_wake.cpp deleted file mode 100644 index 317613404..000000000 --- a/src/stream/wid_wake/wid_wake.cpp +++ /dev/null @@ -1,159 +0,0 @@ -/* -* WiderWake -* (C) 1999-2007 Jack Lloyd -* -* Distributed under the terms of the Botan license -*/ - -#include <botan/wid_wake.h> -#include <botan/loadstor.h> -#include <botan/internal/xor_buf.h> -#include <botan/internal/rounding.h> - -namespace Botan { - -/* -* Combine cipher stream with message -*/ -void WiderWake_41_BE::cipher(const byte in[], byte out[], size_t length) - { - while(length >= buffer.size() - position) - { - xor_buf(out, in, &buffer[position], buffer.size() - position); - length -= (buffer.size() - position); - in += (buffer.size() - position); - out += (buffer.size() - position); - generate(buffer.size()); - } - xor_buf(out, in, &buffer[position], length); - position += length; - } - -/* -* Generate cipher stream -*/ -void WiderWake_41_BE::generate(size_t length) - { - u32bit R0 = state[0], R1 = state[1], - R2 = state[2], R3 = state[3], - R4 = state[4]; - - for(size_t i = 0; i != length; i += 8) - { - u32bit R0a; - - store_be(R3, &buffer[i]); - - R0a = R4 + R3; R3 += R2; R2 += R1; R1 += R0; - R0a = (R0a >> 8) ^ T[(R0a & 0xFF)]; - R1 = (R1 >> 8) ^ T[(R1 & 0xFF)]; - R2 = (R2 >> 8) ^ T[(R2 & 0xFF)]; - R3 = (R3 >> 8) ^ T[(R3 & 0xFF)]; - R4 = R0; R0 = R0a; - - store_be(R3, &buffer[i + 4]); - - R0a = R4 + R3; R3 += R2; R2 += R1; R1 += R0; - R0a = (R0a >> 8) ^ T[(R0a & 0xFF)]; - R1 = (R1 >> 8) ^ T[(R1 & 0xFF)]; - R2 = (R2 >> 8) ^ T[(R2 & 0xFF)]; - R3 = (R3 >> 8) ^ T[(R3 & 0xFF)]; - R4 = R0; R0 = R0a; - } - - state[0] = R0; - state[1] = R1; - state[2] = R2; - state[3] = R3; - state[4] = R4; - - position = 0; - } - -/* -* WiderWake Key Schedule -*/ -void WiderWake_41_BE::key_schedule(const byte key[], size_t) - { - t_key.resize(4); - state.resize(5); - buffer.resize( - round_up<size_t>(std::max<size_t>(8*4, DEFAULT_BUFFERSIZE), 8)); - - for(size_t i = 0; i != 4; ++i) - t_key[i] = load_be<u32bit>(key, i); - - static const u32bit MAGIC[8] = { - 0x726A8F3B, 0xE69A3B5C, 0xD3C71FE5, 0xAB3C73D2, - 0x4D3A8EB3, 0x0396D6E8, 0x3D4C2F7A, 0x9EE27CF3 }; - - T.resize(256); - for(size_t i = 0; i != 4; ++i) - T[i] = t_key[i]; - - for(size_t i = 4; i != 256; ++i) - { - u32bit X = T[i-1] + T[i-4]; - T[i] = (X >> 3) ^ MAGIC[X % 8]; - } - - for(size_t i = 0; i != 23; ++i) - T[i] += T[i+89]; - - u32bit X = T[33]; - u32bit Z = (T[59] | 0x01000001) & 0xFF7FFFFF; - for(size_t i = 0; i != 256; ++i) - { - X = (X & 0xFF7FFFFF) + Z; - T[i] = (T[i] & 0x00FFFFFF) ^ X; - } - - X = (T[X & 0xFF] ^ X) & 0xFF; - Z = T[0]; - T[0] = T[X]; - for(size_t i = 1; i != 256; ++i) - { - T[X] = T[i]; - X = (T[i ^ X] ^ X) & 0xFF; - T[i] = T[X]; - } - T[X] = Z; - - position = 0; - - const byte ZEROS[8] = { 0 }; - set_iv(ZEROS, sizeof(ZEROS)); - } - -/* -* Resynchronization -*/ -void WiderWake_41_BE::set_iv(const byte iv[], size_t length) - { - if(!valid_iv_length(length)) - throw Invalid_IV_Length(name(), length); - - for(size_t i = 0; i != 4; ++i) - state[i] = t_key[i]; - - state[4] = load_be<u32bit>(iv, 0); - state[0] ^= state[4]; - state[2] ^= load_be<u32bit>(iv, 1); - - generate(8*4); - generate(buffer.size()); - } - -/* -* Clear memory of sensitive data -*/ -void WiderWake_41_BE::clear() - { - zap(t_key); - zap(state); - zap(T); - zap(buffer); - position = 0; - } - -} diff --git a/src/stream/wid_wake/wid_wake.h b/src/stream/wid_wake/wid_wake.h deleted file mode 100644 index 501345011..000000000 --- a/src/stream/wid_wake/wid_wake.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -* WiderWake -* (C) 1999-2008 Jack Lloyd -* -* Distributed under the terms of the Botan license -*/ - -#ifndef BOTAN_WIDER_WAKE_H__ -#define BOTAN_WIDER_WAKE_H__ - -#include <botan/stream_cipher.h> - -namespace Botan { - -/** -* WiderWake4+1-BE -* -* Note: quite old and possibly not safe; use XSalsa20 or a block -* cipher in counter mode. -*/ -class BOTAN_DLL WiderWake_41_BE : public StreamCipher - { - public: - void cipher(const byte[], byte[], size_t); - void set_iv(const byte[], size_t); - - bool valid_iv_length(size_t iv_len) const - { return (iv_len == 8); } - - Key_Length_Specification key_spec() const - { - return Key_Length_Specification(16); - } - - void clear(); - std::string name() const { return "WiderWake4+1-BE"; } - StreamCipher* clone() const { return new WiderWake_41_BE; } - - private: - void key_schedule(const byte[], size_t); - - void generate(size_t); - - secure_vector<u32bit> T; - secure_vector<u32bit> state; - secure_vector<u32bit> t_key; - secure_vector<byte> buffer; - size_t position; - }; - -} - -#endif |