diff options
68 files changed, 313 insertions, 272 deletions
diff --git a/src/alloc/secmem.h b/src/alloc/secmem.h index 9b533eac0..e92efe9a0 100644 --- a/src/alloc/secmem.h +++ b/src/alloc/secmem.h @@ -333,7 +333,7 @@ class MemoryVector : public MemoryRegion<T> * swapped out to disk. In this way, a security hole allowing attackers * to find swapped out secret keys is closed. */ -template<typename T, u32bit INITIAL_LEN = 0> +template<typename T> class SecureVector : public MemoryRegion<T> { public: @@ -349,8 +349,7 @@ class SecureVector : public MemoryRegion<T> * Create a buffer of the specified length. * @param n the length of the buffer to create. */ - SecureVector(u32bit n = INITIAL_LEN) - { this->init(true, n); } + SecureVector(u32bit n = 0) { this->init(true, n); } /** * Create a buffer with the specified contents. @@ -360,11 +359,8 @@ class SecureVector : public MemoryRegion<T> */ SecureVector(const T in[], u32bit n) { - this->init(true, INITIAL_LEN); - if(INITIAL_LEN) - this->copy(&in[0], n); - else - this->set(&in[0], n); + this->init(true); + this->set(&in[0], n); } /** @@ -374,11 +370,8 @@ class SecureVector : public MemoryRegion<T> */ SecureVector(const MemoryRegion<T>& in) { - this->init(true, INITIAL_LEN); - if(INITIAL_LEN) - this->copy(&in[0], in.size()); - else - this->set(&in[0], in.size()); + this->init(true); + this->set(&in[0], in.size()); } }; diff --git a/src/block/aes/aes.cpp b/src/block/aes/aes.cpp index 93f7f4363..f2f1bc9e5 100644 --- a/src/block/aes/aes.cpp +++ b/src/block/aes/aes.cpp @@ -627,7 +627,7 @@ void AES::key_schedule(const byte key[], u32bit length) ROUNDS = (length / 4) + 6; - SecureVector<u32bit, 64> XEK, XDK; + SecureVector<u32bit> XEK(64), XDK(64); const u32bit X = length / 4; for(u32bit j = 0; j != X; ++j) @@ -681,7 +681,8 @@ u32bit AES::S(u32bit input) /* * AES Constructor */ -AES::AES(u32bit key_size) : BlockCipher(16, key_size) +AES::AES(u32bit key_size) : BlockCipher(16, key_size), + EK(56), ME(16), DK(56), MD(16) { if(key_size != 16 && key_size != 24 && key_size != 32) throw Invalid_Key_Length(name(), key_size); diff --git a/src/block/aes/aes.h b/src/block/aes/aes.h index 8770bdb35..ba688a6e3 100644 --- a/src/block/aes/aes.h +++ b/src/block/aes/aes.h @@ -25,7 +25,7 @@ class BOTAN_DLL AES : public BlockCipher std::string name() const { return "AES"; } BlockCipher* clone() const { return new AES; } - AES() : BlockCipher(16, 16, 32, 8) { ROUNDS = 14; } + AES() : BlockCipher(16, 16, 32, 8), EK(56), ME(16), DK(56), MD(16) { ROUNDS = 14; } /** * AES fixed to a particular key_size (16, 24, or 32 bytes) @@ -38,11 +38,11 @@ class BOTAN_DLL AES : public BlockCipher u32bit ROUNDS; - SecureVector<u32bit, 56> EK; - SecureVector<byte, 16> ME; + SecureVector<u32bit> EK; + SecureVector<byte> ME; - SecureVector<u32bit, 56> DK; - SecureVector<byte, 16> MD; + SecureVector<u32bit> DK; + SecureVector<byte> MD; }; /** diff --git a/src/block/aes_ssse3/aes_ssse3.h b/src/block/aes_ssse3/aes_ssse3.h index babd30509..6e7d29a37 100644 --- a/src/block/aes_ssse3/aes_ssse3.h +++ b/src/block/aes_ssse3/aes_ssse3.h @@ -25,11 +25,11 @@ class BOTAN_DLL AES_128_SSSE3 : public BlockCipher std::string name() const { return "AES-128"; } BlockCipher* clone() const { return new AES_128_SSSE3; } - AES_128_SSSE3() : BlockCipher(16, 16) {} + AES_128_SSSE3() : BlockCipher(16, 16), EK(44), DK(44) {} private: void key_schedule(const byte[], u32bit); - SecureVector<u32bit, 44> EK, DK; + SecureVector<u32bit> EK, DK; }; /** @@ -45,11 +45,11 @@ class BOTAN_DLL AES_192_SSSE3 : public BlockCipher std::string name() const { return "AES-192"; } BlockCipher* clone() const { return new AES_192_SSSE3; } - AES_192_SSSE3() : BlockCipher(16, 24) {} + AES_192_SSSE3() : BlockCipher(16, 24), EK(52), DK(52) {} private: void key_schedule(const byte[], u32bit); - SecureVector<u32bit, 52> EK, DK; + SecureVector<u32bit> EK, DK; }; /** @@ -65,11 +65,11 @@ class BOTAN_DLL AES_256_SSSE3 : public BlockCipher std::string name() const { return "AES-256"; } BlockCipher* clone() const { return new AES_256_SSSE3; } - AES_256_SSSE3() : BlockCipher(16, 32) {} + AES_256_SSSE3() : BlockCipher(16, 32), EK(60), DK(60) {} private: void key_schedule(const byte[], u32bit); - SecureVector<u32bit, 60> EK, DK; + SecureVector<u32bit> EK, DK; }; } diff --git a/src/block/blowfish/blowfish.cpp b/src/block/blowfish/blowfish.cpp index 6e4ad5b28..91d25884d 100644 --- a/src/block/blowfish/blowfish.cpp +++ b/src/block/blowfish/blowfish.cpp @@ -131,8 +131,10 @@ void Blowfish::generate_sbox(MemoryRegion<u32bit>& box, */ void Blowfish::clear() { - P.copy(P_INIT, 18); - S.copy(S_INIT, 1024); + std::copy(P_INIT, P_INIT + 18, P.begin()); + std::copy(S_INIT, S_INIT + 1024, S.begin()); + //P.copy(P_INIT, 18); + //S.copy(S_INIT, 1024); } } diff --git a/src/block/blowfish/blowfish.h b/src/block/blowfish/blowfish.h index 88122aed8..0b4df50ad 100644 --- a/src/block/blowfish/blowfish.h +++ b/src/block/blowfish/blowfish.h @@ -25,7 +25,7 @@ class BOTAN_DLL Blowfish : public BlockCipher std::string name() const { return "Blowfish"; } BlockCipher* clone() const { return new Blowfish; } - Blowfish() : BlockCipher(8, 1, 56) {} + Blowfish() : BlockCipher(8, 1, 56), S(1024), P(18) {} private: void key_schedule(const byte[], u32bit); void generate_sbox(MemoryRegion<u32bit>& box, @@ -34,8 +34,8 @@ class BOTAN_DLL Blowfish : public BlockCipher static const u32bit P_INIT[18]; static const u32bit S_INIT[1024]; - SecureVector<u32bit, 1024> S; - SecureVector<u32bit, 18> P; + SecureVector<u32bit> S; + SecureVector<u32bit> P; }; } diff --git a/src/block/cast/cast128.cpp b/src/block/cast/cast128.cpp index b68b7abd7..48eb910ce 100644 --- a/src/block/cast/cast128.cpp +++ b/src/block/cast/cast128.cpp @@ -119,7 +119,7 @@ void CAST_128::decrypt_n(const byte in[], byte out[], u32bit blocks) const void CAST_128::key_schedule(const byte key[], u32bit length) { clear(); - SecureVector<u32bit, 4> X; + SecureVector<u32bit> X(4); for(u32bit j = 0; j != length; ++j) X[j/4] = (X[j/4] << 8) + key[j]; @@ -145,7 +145,7 @@ void CAST_128::cast_ks(MemoryRegion<u32bit>& K, const u32bit* X; }; - SecureVector<u32bit, 4> Z; + SecureVector<u32bit> Z(4); ByteReader x(&X[0]), z(&Z[0]); Z[0] = X[0] ^ S5[x(13)] ^ S6[x(15)] ^ S7[x(12)] ^ S8[x(14)] ^ S7[x( 8)]; diff --git a/src/block/cast/cast128.h b/src/block/cast/cast128.h index 425eb46cc..bb8332aca 100644 --- a/src/block/cast/cast128.h +++ b/src/block/cast/cast128.h @@ -25,7 +25,7 @@ class BOTAN_DLL CAST_128 : public BlockCipher std::string name() const { return "CAST-128"; } BlockCipher* clone() const { return new CAST_128; } - CAST_128() : BlockCipher(8, 11, 16) {} + CAST_128() : BlockCipher(8, 11, 16), MK(16), RK(16) {} private: void key_schedule(const byte[], u32bit); @@ -37,7 +37,7 @@ class BOTAN_DLL CAST_128 : public BlockCipher static const u32bit S7[256]; static const u32bit S8[256]; - SecureVector<u32bit, 16> MK, RK; + SecureVector<u32bit> MK, RK; }; extern const u32bit CAST_SBOX1[256]; diff --git a/src/block/cast/cast256.cpp b/src/block/cast/cast256.cpp index 8aaf8009f..551d4e387 100644 --- a/src/block/cast/cast256.cpp +++ b/src/block/cast/cast256.cpp @@ -138,12 +138,13 @@ void CAST_256::decrypt_n(const byte in[], byte out[], u32bit blocks) const */ void CAST_256::key_schedule(const byte key[], u32bit length) { - SecureVector<u32bit, 8> TMP; + SecureVector<u32bit> K(8); for(u32bit j = 0; j != length; ++j) - TMP[j/4] = (TMP[j/4] << 8) + key[j]; + K[j/4] = (K[j/4] << 8) + key[j]; + + u32bit A = K[0], B = K[1], C = K[2], D = K[3], + E = K[4], F = K[5], G = K[6], H = K[7]; - u32bit A = TMP[0], B = TMP[1], C = TMP[2], D = TMP[3], - E = TMP[4], F = TMP[5], G = TMP[6], H = TMP[7]; for(u32bit j = 0; j != 48; j += 4) { round1(G, H, KEY_MASK[4*j+ 0], KEY_ROT[(4*j+ 0) % 32]); diff --git a/src/block/cast/cast256.h b/src/block/cast/cast256.h index c9820c1ab..533f57ac1 100644 --- a/src/block/cast/cast256.h +++ b/src/block/cast/cast256.h @@ -25,15 +25,15 @@ class BOTAN_DLL CAST_256 : public BlockCipher std::string name() const { return "CAST-256"; } BlockCipher* clone() const { return new CAST_256; } - CAST_256() : BlockCipher(16, 4, 32, 4) {} + CAST_256() : BlockCipher(16, 4, 32, 4), MK(48), RK(48) {} private: void key_schedule(const byte[], u32bit); static const u32bit KEY_MASK[192]; static const byte KEY_ROT[32]; - SecureVector<u32bit, 48> MK; - SecureVector<byte, 48> RK; + SecureVector<u32bit> MK; + SecureVector<byte> RK; }; extern const u32bit CAST_SBOX1[256]; diff --git a/src/block/des/des.h b/src/block/des/des.h index f631986f0..e338b9a29 100644 --- a/src/block/des/des.h +++ b/src/block/des/des.h @@ -25,11 +25,11 @@ class BOTAN_DLL DES : public BlockCipher std::string name() const { return "DES"; } BlockCipher* clone() const { return new DES; } - DES() : BlockCipher(8, 8) {} + DES() : BlockCipher(8, 8), round_key(32) {} private: void key_schedule(const byte[], u32bit); - SecureVector<u32bit, 32> round_key; + SecureVector<u32bit> round_key; }; /** @@ -45,11 +45,11 @@ class BOTAN_DLL TripleDES : public BlockCipher std::string name() const { return "TripleDES"; } BlockCipher* clone() const { return new TripleDES; } - TripleDES() : BlockCipher(8, 16, 24, 8) {} + TripleDES() : BlockCipher(8, 16, 24, 8), round_key(96) {} private: void key_schedule(const byte[], u32bit); - SecureVector<u32bit, 96> round_key; + SecureVector<u32bit> round_key; }; /* diff --git a/src/block/des/desx.h b/src/block/des/desx.h index 007948ba7..cb452c47b 100644 --- a/src/block/des/desx.h +++ b/src/block/des/desx.h @@ -25,10 +25,10 @@ class BOTAN_DLL DESX : public BlockCipher std::string name() const { return "DESX"; } BlockCipher* clone() const { return new DESX; } - DESX() : BlockCipher(8, 24) {} + DESX() : BlockCipher(8, 24), K1(8), K2(8) {} private: void key_schedule(const byte[], u32bit); - SecureVector<byte, 8> K1, K2; + SecureVector<byte> K1, K2; DES des; }; diff --git a/src/block/gost_28147/gost_28147.cpp b/src/block/gost_28147/gost_28147.cpp index 3844fd441..8d7e950c6 100644 --- a/src/block/gost_28147/gost_28147.cpp +++ b/src/block/gost_28147/gost_28147.cpp @@ -52,7 +52,7 @@ GOST_28147_89_Params::GOST_28147_89_Params(const std::string& n) : name(n) * GOST Constructor */ GOST_28147_89::GOST_28147_89(const GOST_28147_89_Params& param) : - BlockCipher(8, 32) + BlockCipher(8, 32), SBOX(1024), EK(8) { // Convert the parallel 4x4 sboxes into larger word-based sboxes for(size_t i = 0; i != 4; ++i) diff --git a/src/block/gost_28147/gost_28147.h b/src/block/gost_28147/gost_28147.h index 9d845ae72..501e621e0 100644 --- a/src/block/gost_28147/gost_28147.h +++ b/src/block/gost_28147/gost_28147.h @@ -65,13 +65,13 @@ class BOTAN_DLL GOST_28147_89 : public BlockCipher */ GOST_28147_89(const GOST_28147_89_Params& params); private: - GOST_28147_89(const SecureVector<u32bit, 1024>& other_SBOX) : - BlockCipher(8, 32), SBOX(other_SBOX) {} + GOST_28147_89(const SecureVector<u32bit>& other_SBOX) : + BlockCipher(8, 32), SBOX(other_SBOX), EK(8) {} void key_schedule(const byte[], u32bit); - SecureVector<u32bit, 1024> SBOX; - SecureVector<u32bit, 8> EK; + SecureVector<u32bit> SBOX; + SecureVector<u32bit> EK; }; } diff --git a/src/block/idea/idea.h b/src/block/idea/idea.h index 737970b29..1a315ce3f 100644 --- a/src/block/idea/idea.h +++ b/src/block/idea/idea.h @@ -25,21 +25,21 @@ class BOTAN_DLL IDEA : public BlockCipher std::string name() const { return "IDEA"; } BlockCipher* clone() const { return new IDEA; } - IDEA() : BlockCipher(8, 16) {} + IDEA() : BlockCipher(8, 16), EK(52), DK(52) {} protected: /** * @return const reference to encryption subkeys */ - const SecureVector<u16bit, 52>& get_EK() const { return EK; } + const SecureVector<u16bit>& get_EK() const { return EK; } /** * @return const reference to decryption subkeys */ - const SecureVector<u16bit, 52>& get_DK() const { return DK; } + const SecureVector<u16bit>& get_DK() const { return DK; } private: void key_schedule(const byte[], u32bit); - SecureVector<u16bit, 52> EK, DK; + SecureVector<u16bit> EK, DK; }; } diff --git a/src/block/kasumi/kasumi.cpp b/src/block/kasumi/kasumi.cpp index 8dcdff716..023a7a503 100644 --- a/src/block/kasumi/kasumi.cpp +++ b/src/block/kasumi/kasumi.cpp @@ -204,7 +204,7 @@ void KASUMI::key_schedule(const byte key[], u32bit) static const u16bit RC[] = { 0x0123, 0x4567, 0x89AB, 0xCDEF, 0xFEDC, 0xBA98, 0x7654, 0x3210 }; - SecureVector<u16bit, 16> K; + SecureVector<u16bit> K(16); for(u32bit j = 0; j != 8; ++j) { K[j] = load_be<u16bit>(key, j); diff --git a/src/block/kasumi/kasumi.h b/src/block/kasumi/kasumi.h index f8575c2d2..51727dd4d 100644 --- a/src/block/kasumi/kasumi.h +++ b/src/block/kasumi/kasumi.h @@ -25,11 +25,11 @@ class BOTAN_DLL KASUMI : public BlockCipher std::string name() const { return "KASUMI"; } BlockCipher* clone() const { return new KASUMI; } - KASUMI() : BlockCipher(8, 16) {} + KASUMI() : BlockCipher(8, 16), EK(64) {} private: void key_schedule(const byte[], u32bit); - SecureVector<u16bit, 64> EK; + SecureVector<u16bit> EK; }; } diff --git a/src/block/mars/mars.cpp b/src/block/mars/mars.cpp index 57a224fac..71cef3ee8 100644 --- a/src/block/mars/mars.cpp +++ b/src/block/mars/mars.cpp @@ -320,9 +320,10 @@ void MARS::decrypt_n(const byte in[], byte out[], u32bit blocks) const */ void MARS::key_schedule(const byte key[], u32bit length) { - SecureVector<u32bit, 15> T; + SecureVector<u32bit> T(15); for(u32bit j = 0; j != length / 4; ++j) T[j] = load_le<u32bit>(key, j); + T[length / 4] = length / 4; for(u32bit j = 0; j != 4; ++j) diff --git a/src/block/mars/mars.h b/src/block/mars/mars.h index 37501fff1..84a9a21f7 100644 --- a/src/block/mars/mars.h +++ b/src/block/mars/mars.h @@ -25,11 +25,11 @@ class BOTAN_DLL MARS : public BlockCipher std::string name() const { return "MARS"; } BlockCipher* clone() const { return new MARS; } - MARS() : BlockCipher(16, 16, 32, 4) {} + MARS() : BlockCipher(16, 16, 32, 4), EK(40) {} private: void key_schedule(const byte[], u32bit); - SecureVector<u32bit, 40> EK; + SecureVector<u32bit> EK; }; } diff --git a/src/block/misty1/misty1.cpp b/src/block/misty1/misty1.cpp index d5d3513a2..1d032172d 100644 --- a/src/block/misty1/misty1.cpp +++ b/src/block/misty1/misty1.cpp @@ -204,7 +204,7 @@ void MISTY1::decrypt_n(const byte in[], byte out[], u32bit blocks) const */ void MISTY1::key_schedule(const byte key[], u32bit length) { - SecureVector<u16bit, 32> KS; + SecureVector<u16bit> KS(32); for(u32bit j = 0; j != length / 2; ++j) KS[j] = load_be<u16bit>(key, j); @@ -251,7 +251,7 @@ void MISTY1::key_schedule(const byte key[], u32bit length) /* * MISTY1 Constructor */ -MISTY1::MISTY1(u32bit rounds) : BlockCipher(8, 16) +MISTY1::MISTY1(u32bit rounds) : BlockCipher(8, 16), EK(100), DK(100) { if(rounds != 8) throw Invalid_Argument("MISTY1: Invalid number of rounds: " diff --git a/src/block/misty1/misty1.h b/src/block/misty1/misty1.h index dbb8e2c45..7a9f1f9d9 100644 --- a/src/block/misty1/misty1.h +++ b/src/block/misty1/misty1.h @@ -33,7 +33,7 @@ class BOTAN_DLL MISTY1 : public BlockCipher private: void key_schedule(const byte[], u32bit); - SecureVector<u16bit, 100> EK, DK; + SecureVector<u16bit> EK, DK; }; } diff --git a/src/block/noekeon/noekeon.h b/src/block/noekeon/noekeon.h index 2e524f8b8..ee3d32c80 100644 --- a/src/block/noekeon/noekeon.h +++ b/src/block/noekeon/noekeon.h @@ -25,7 +25,7 @@ class BOTAN_DLL Noekeon : public BlockCipher std::string name() const { return "Noekeon"; } BlockCipher* clone() const { return new Noekeon; } - Noekeon() : BlockCipher(16, 16) {} + Noekeon() : BlockCipher(16, 16), EK(4), DK(4) {} protected: /** * The Noekeon round constants @@ -35,16 +35,16 @@ class BOTAN_DLL Noekeon : public BlockCipher /** * @return const reference to encryption subkeys */ - const SecureVector<u32bit, 4>& get_EK() const { return EK; } + const SecureVector<u32bit>& get_EK() const { return EK; } /** * @return const reference to decryption subkeys */ - const SecureVector<u32bit, 4>& get_DK() const { return DK; } + const SecureVector<u32bit>& get_DK() const { return DK; } private: void key_schedule(const byte[], u32bit); - SecureVector<u32bit, 4> EK, DK; + SecureVector<u32bit> EK, DK; }; } diff --git a/src/block/noekeon_simd/noekeon_simd.cpp b/src/block/noekeon_simd/noekeon_simd.cpp index be7ca86da..a7fb66f98 100644 --- a/src/block/noekeon_simd/noekeon_simd.cpp +++ b/src/block/noekeon_simd/noekeon_simd.cpp @@ -55,7 +55,7 @@ namespace Botan { */ void Noekeon_SIMD::encrypt_n(const byte in[], byte out[], u32bit blocks) const { - const SecureVector<u32bit, 4>& EK = this->get_EK(); + const SecureVector<u32bit>& EK = this->get_EK(); SIMD_32 K0 = SIMD_32(EK[0]); SIMD_32 K1 = SIMD_32(EK[1]); @@ -112,7 +112,7 @@ void Noekeon_SIMD::encrypt_n(const byte in[], byte out[], u32bit blocks) const */ void Noekeon_SIMD::decrypt_n(const byte in[], byte out[], u32bit blocks) const { - const SecureVector<u32bit, 4>& DK = this->get_DK(); + const SecureVector<u32bit>& DK = this->get_DK(); SIMD_32 K0 = SIMD_32(DK[0]); SIMD_32 K1 = SIMD_32(DK[1]); diff --git a/src/block/rc2/rc2.cpp b/src/block/rc2/rc2.cpp index 4657d7b6c..8a939ecae 100644 --- a/src/block/rc2/rc2.cpp +++ b/src/block/rc2/rc2.cpp @@ -124,7 +124,7 @@ void RC2::key_schedule(const byte key[], u32bit length) 0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77, 0x0A, 0xA6, 0x20, 0x68, 0xFE, 0x7F, 0xC1, 0xAD }; - SecureVector<byte, 128> L; + SecureVector<byte> L(128); L.copy(key, length); for(u32bit j = length; j != 128; ++j) diff --git a/src/block/rc2/rc2.h b/src/block/rc2/rc2.h index e6c900056..7e1953441 100644 --- a/src/block/rc2/rc2.h +++ b/src/block/rc2/rc2.h @@ -32,11 +32,11 @@ class BOTAN_DLL RC2 : public BlockCipher std::string name() const { return "RC2"; } BlockCipher* clone() const { return new RC2; } - RC2() : BlockCipher(8, 1, 32) {} + RC2() : BlockCipher(8, 1, 32), K(64) {} private: void key_schedule(const byte[], u32bit); - SecureVector<u16bit, 64> K; + SecureVector<u16bit> K; }; } diff --git a/src/block/rc5/rc5.cpp b/src/block/rc5/rc5.cpp index dcda1bb25..ded0f961d 100644 --- a/src/block/rc5/rc5.cpp +++ b/src/block/rc5/rc5.cpp @@ -82,9 +82,11 @@ void RC5::key_schedule(const byte key[], u32bit length) for(u32bit j = 1; j != S.size(); ++j) S[j] = S[j-1] + 0x9E3779B9; - SecureVector<u32bit, 8> K; + SecureVector<u32bit> K(8); + for(s32bit j = length-1; j >= 0; --j) K[j/4] = (K[j/4] << 8) + key[j]; + for(u32bit j = 0, A = 0, B = 0; j != MIX_ROUNDS; ++j) { A = rotate_left(S[j % S.size()] + A + B, 3); diff --git a/src/block/rc6/rc6.cpp b/src/block/rc6/rc6.cpp index ff846f006..5f88d1d0b 100644 --- a/src/block/rc6/rc6.cpp +++ b/src/block/rc6/rc6.cpp @@ -119,9 +119,11 @@ void RC6::key_schedule(const byte key[], u32bit length) for(u32bit j = 1; j != S.size(); ++j) S[j] = S[j-1] + 0x9E3779B9; - SecureVector<u32bit, 8> K; + SecureVector<u32bit> K(8); + for(s32bit j = length-1; j >= 0; --j) K[j/4] = (K[j/4] << 8) + key[j]; + for(u32bit j = 0, A = 0, B = 0; j != MIX_ROUNDS; ++j) { A = rotate_left(S[j % S.size()] + A + B, 3); diff --git a/src/block/rc6/rc6.h b/src/block/rc6/rc6.h index 02c464c5c..55a9d412e 100644 --- a/src/block/rc6/rc6.h +++ b/src/block/rc6/rc6.h @@ -25,11 +25,11 @@ class BOTAN_DLL RC6 : public BlockCipher std::string name() const { return "RC6"; } BlockCipher* clone() const { return new RC6; } - RC6() : BlockCipher(16, 1, 32) {} + RC6() : BlockCipher(16, 1, 32), S(44) {} private: void key_schedule(const byte[], u32bit); - SecureVector<u32bit, 44> S; + SecureVector<u32bit> S; }; } diff --git a/src/block/safer/safer_sk.cpp b/src/block/safer/safer_sk.cpp index 74e7b6298..aebb770d7 100644 --- a/src/block/safer/safer_sk.cpp +++ b/src/block/safer/safer_sk.cpp @@ -91,7 +91,7 @@ void SAFER_SK::decrypt_n(const byte in[], byte out[], u32bit blocks) const */ void SAFER_SK::key_schedule(const byte key[], u32bit) { - SecureVector<byte, 18> KB; + SecureVector<byte> KB(18); for(u32bit j = 0; j != 8; ++j) { diff --git a/src/block/seed/seed.cpp b/src/block/seed/seed.cpp index 651233bdb..ca09937e8 100644 --- a/src/block/seed/seed.cpp +++ b/src/block/seed/seed.cpp @@ -111,7 +111,7 @@ void SEED::key_schedule(const byte key[], u32bit) 0x779B99E3, 0xEF3733C6, 0xDE6E678D, 0xBCDCCF1B }; - SecureVector<u32bit, 4> WK; + SecureVector<u32bit> WK(4); for(u32bit j = 0; j != 4; ++j) WK[j] = load_be<u32bit>(key, j); diff --git a/src/block/seed/seed.h b/src/block/seed/seed.h index bfc9c7fa1..001743ada 100644 --- a/src/block/seed/seed.h +++ b/src/block/seed/seed.h @@ -25,7 +25,7 @@ class BOTAN_DLL SEED : public BlockCipher std::string name() const { return "SEED"; } BlockCipher* clone() const { return new SEED; } - SEED() : BlockCipher(16, 16) {} + SEED() : BlockCipher(16, 16), K(32) {} private: void key_schedule(const byte[], u32bit); @@ -37,7 +37,7 @@ class BOTAN_DLL SEED : public BlockCipher static const u32bit S0[256], S1[256], S2[256], S3[256]; }; - SecureVector<u32bit, 32> K; + SecureVector<u32bit> K; }; } diff --git a/src/block/serpent/serpent.cpp b/src/block/serpent/serpent.cpp index 4979ecbab..4133750ad 100644 --- a/src/block/serpent/serpent.cpp +++ b/src/block/serpent/serpent.cpp @@ -355,7 +355,7 @@ void Serpent::key_schedule(const byte key[], u32bit length) { const u32bit PHI = 0x9E3779B9; - SecureVector<u32bit, 140> W; + SecureVector<u32bit> W(140); for(u32bit j = 0; j != length / 4; ++j) W[j] = load_le<u32bit>(key, j); diff --git a/src/block/serpent/serpent.h b/src/block/serpent/serpent.h index 56afd3330..f980c602e 100644 --- a/src/block/serpent/serpent.h +++ b/src/block/serpent/serpent.h @@ -24,13 +24,13 @@ class BOTAN_DLL Serpent : public BlockCipher void clear() { zeroise(round_key); } std::string name() const { return "Serpent"; } BlockCipher* clone() const { return new Serpent; } - Serpent() : BlockCipher(16, 16, 32, 8) {} + Serpent() : BlockCipher(16, 16, 32, 8), round_key(132) {} protected: /** * For use by subclasses using SIMD, asm, etc * @return const reference to the key schedule */ - const SecureVector<u32bit, 132>& get_round_keys() const + const SecureVector<u32bit>& get_round_keys() const { return round_key; } /** @@ -42,7 +42,7 @@ class BOTAN_DLL Serpent : public BlockCipher private: void key_schedule(const byte key[], u32bit length); - SecureVector<u32bit, 132> round_key; + SecureVector<u32bit> round_key; }; } diff --git a/src/block/skipjack/skipjack.h b/src/block/skipjack/skipjack.h index 29978efc7..123ab85ae 100644 --- a/src/block/skipjack/skipjack.h +++ b/src/block/skipjack/skipjack.h @@ -25,11 +25,11 @@ class BOTAN_DLL Skipjack : public BlockCipher std::string name() const { return "Skipjack"; } BlockCipher* clone() const { return new Skipjack; } - Skipjack() : BlockCipher(8, 10) {} + Skipjack() : BlockCipher(8, 10), FTAB(2560) {} private: void key_schedule(const byte[], u32bit); - SecureVector<byte, 2560> FTAB; + SecureVector<byte> FTAB; }; } diff --git a/src/block/square/square.cpp b/src/block/square/square.cpp index 2d798c3e8..4b6709d50 100644 --- a/src/block/square/square.cpp +++ b/src/block/square/square.cpp @@ -140,7 +140,7 @@ void Square::decrypt_n(const byte in[], byte out[], u32bit blocks) const */ void Square::key_schedule(const byte key[], u32bit) { - SecureVector<u32bit, 36> XEK, XDK; + SecureVector<u32bit> XEK(36), XDK(36); for(u32bit i = 0; i != 4; ++i) XEK[i] = load_be<u32bit>(key, i); diff --git a/src/block/square/square.h b/src/block/square/square.h index a17771f11..0c0cc871d 100644 --- a/src/block/square/square.h +++ b/src/block/square/square.h @@ -25,7 +25,7 @@ class BOTAN_DLL Square : public BlockCipher std::string name() const { return "Square"; } BlockCipher* clone() const { return new Square; } - Square() : BlockCipher(16, 16) {} + Square() : BlockCipher(16, 16), EK(28), DK(28), ME(32), MD(32) {} private: void key_schedule(const byte[], u32bit); @@ -45,8 +45,8 @@ class BOTAN_DLL Square : public BlockCipher static const u32bit TD2[256]; static const u32bit TD3[256]; - SecureVector<u32bit, 28> EK, DK; - SecureVector<byte, 32> ME, MD; + SecureVector<u32bit> EK, DK; + SecureVector<byte> ME, MD; }; } diff --git a/src/block/tea/tea.h b/src/block/tea/tea.h index 6e1c4fafb..dd03ec3c6 100644 --- a/src/block/tea/tea.h +++ b/src/block/tea/tea.h @@ -25,10 +25,10 @@ class BOTAN_DLL TEA : public BlockCipher std::string name() const { return "TEA"; } BlockCipher* clone() const { return new TEA; } - TEA() : BlockCipher(8, 16) {} + TEA() : BlockCipher(8, 16), K(4) {} private: void key_schedule(const byte[], u32bit); - SecureVector<u32bit, 4> K; + SecureVector<u32bit> K; }; } diff --git a/src/block/twofish/twofish.cpp b/src/block/twofish/twofish.cpp index 805695087..b760de382 100644 --- a/src/block/twofish/twofish.cpp +++ b/src/block/twofish/twofish.cpp @@ -18,42 +18,42 @@ void Twofish::encrypt_n(const byte in[], byte out[], u32bit blocks) const { for(u32bit i = 0; i != blocks; ++i) { - u32bit A = load_le<u32bit>(in, 0) ^ round_key[0]; - u32bit B = load_le<u32bit>(in, 1) ^ round_key[1]; - u32bit C = load_le<u32bit>(in, 2) ^ round_key[2]; - u32bit D = load_le<u32bit>(in, 3) ^ round_key[3]; + u32bit A = load_le<u32bit>(in, 0) ^ RK[0]; + u32bit B = load_le<u32bit>(in, 1) ^ RK[1]; + u32bit C = load_le<u32bit>(in, 2) ^ RK[2]; + u32bit D = load_le<u32bit>(in, 3) ^ RK[3]; for(u32bit j = 0; j != 16; j += 2) { u32bit X, Y; - X = SBox0[get_byte(3, A)] ^ SBox1[get_byte(2, A)] ^ - SBox2[get_byte(1, A)] ^ SBox3[get_byte(0, A)]; - Y = SBox0[get_byte(0, B)] ^ SBox1[get_byte(3, B)] ^ - SBox2[get_byte(2, B)] ^ SBox3[get_byte(1, B)]; + X = SB[ get_byte(3, A)] ^ SB[256+get_byte(2, A)] ^ + SB[512+get_byte(1, A)] ^ SB[768+get_byte(0, A)]; + Y = SB[ get_byte(0, B)] ^ SB[256+get_byte(3, B)] ^ + SB[512+get_byte(2, B)] ^ SB[768+get_byte(1, B)]; X += Y; - Y += X + round_key[2*j + 9]; - X += round_key[2*j + 8]; + Y += X + RK[2*j + 9]; + X += RK[2*j + 8]; C = rotate_right(C ^ X, 1); D = rotate_left(D, 1) ^ Y; - X = SBox0[get_byte(3, C)] ^ SBox1[get_byte(2, C)] ^ - SBox2[get_byte(1, C)] ^ SBox3[get_byte(0, C)]; - Y = SBox0[get_byte(0, D)] ^ SBox1[get_byte(3, D)] ^ - SBox2[get_byte(2, D)] ^ SBox3[get_byte(1, D)]; + X = SB[ get_byte(3, C)] ^ SB[256+get_byte(2, C)] ^ + SB[512+get_byte(1, C)] ^ SB[768+get_byte(0, C)]; + Y = SB[ get_byte(0, D)] ^ SB[256+get_byte(3, D)] ^ + SB[512+get_byte(2, D)] ^ SB[768+get_byte(1, D)]; X += Y; - Y += X + round_key[2*j + 11]; - X += round_key[2*j + 10]; + Y += X + RK[2*j + 11]; + X += RK[2*j + 10]; A = rotate_right(A ^ X, 1); B = rotate_left(B, 1) ^ Y; } - C ^= round_key[4]; - D ^= round_key[5]; - A ^= round_key[6]; - B ^= round_key[7]; + C ^= RK[4]; + D ^= RK[5]; + A ^= RK[6]; + B ^= RK[7]; store_le(out, C, D, A, B); @@ -69,42 +69,42 @@ void Twofish::decrypt_n(const byte in[], byte out[], u32bit blocks) const { for(u32bit i = 0; i != blocks; ++i) { - u32bit A = load_le<u32bit>(in, 0) ^ round_key[4]; - u32bit B = load_le<u32bit>(in, 1) ^ round_key[5]; - u32bit C = load_le<u32bit>(in, 2) ^ round_key[6]; - u32bit D = load_le<u32bit>(in, 3) ^ round_key[7]; + u32bit A = load_le<u32bit>(in, 0) ^ RK[4]; + u32bit B = load_le<u32bit>(in, 1) ^ RK[5]; + u32bit C = load_le<u32bit>(in, 2) ^ RK[6]; + u32bit D = load_le<u32bit>(in, 3) ^ RK[7]; for(u32bit j = 0; j != 16; j += 2) { u32bit X, Y; - X = SBox0[get_byte(3, A)] ^ SBox1[get_byte(2, A)] ^ - SBox2[get_byte(1, A)] ^ SBox3[get_byte(0, A)]; - Y = SBox0[get_byte(0, B)] ^ SBox1[get_byte(3, B)] ^ - SBox2[get_byte(2, B)] ^ SBox3[get_byte(1, B)]; + X = SB[ get_byte(3, A)] ^ SB[256+get_byte(2, A)] ^ + SB[512+get_byte(1, A)] ^ SB[768+get_byte(0, A)]; + Y = SB[ get_byte(0, B)] ^ SB[256+get_byte(3, B)] ^ + SB[512+get_byte(2, B)] ^ SB[768+get_byte(1, B)]; X += Y; - Y += X + round_key[39 - 2*j]; - X += round_key[38 - 2*j]; + Y += X + RK[39 - 2*j]; + X += RK[38 - 2*j]; C = rotate_left(C, 1) ^ X; D = rotate_right(D ^ Y, 1); - X = SBox0[get_byte(3, C)] ^ SBox1[get_byte(2, C)] ^ - SBox2[get_byte(1, C)] ^ SBox3[get_byte(0, C)]; - Y = SBox0[get_byte(0, D)] ^ SBox1[get_byte(3, D)] ^ - SBox2[get_byte(2, D)] ^ SBox3[get_byte(1, D)]; + X = SB[ get_byte(3, C)] ^ SB[256+get_byte(2, C)] ^ + SB[512+get_byte(1, C)] ^ SB[768+get_byte(0, C)]; + Y = SB[ get_byte(0, D)] ^ SB[256+get_byte(3, D)] ^ + SB[512+get_byte(2, D)] ^ SB[768+get_byte(1, D)]; X += Y; - Y += X + round_key[37 - 2*j]; - X += round_key[36 - 2*j]; + Y += X + RK[37 - 2*j]; + X += RK[36 - 2*j]; A = rotate_left(A, 1) ^ X; B = rotate_right(B ^ Y, 1); } - C ^= round_key[0]; - D ^= round_key[1]; - A ^= round_key[2]; - B ^= round_key[3]; + C ^= RK[0]; + D ^= RK[1]; + A ^= RK[2]; + B ^= RK[3]; store_le(out, C, D, A, B); @@ -118,78 +118,90 @@ void Twofish::decrypt_n(const byte in[], byte out[], u32bit blocks) const */ void Twofish::key_schedule(const byte key[], u32bit length) { - SecureVector<byte, 16> S; + SecureVector<byte> S(16); - for(u32bit j = 0; j != length; ++j) - rs_mul(&S[4*(j/8)], key[j], j); + for(u32bit i = 0; i != length; ++i) + rs_mul(&S[4*(i/8)], key[i], i); if(length == 16) { - for(u32bit j = 0; j != 256; ++j) + for(u32bit i = 0; i != 256; ++i) { - SBox0[j] = MDS0[Q0[Q0[j]^S[ 0]]^S[ 4]]; - SBox1[j] = MDS1[Q0[Q1[j]^S[ 1]]^S[ 5]]; - SBox2[j] = MDS2[Q1[Q0[j]^S[ 2]]^S[ 6]]; - SBox3[j] = MDS3[Q1[Q1[j]^S[ 3]]^S[ 7]]; + SB[ i] = MDS0[Q0[Q0[i]^S[ 0]]^S[ 4]]; + SB[256+i] = MDS1[Q0[Q1[i]^S[ 1]]^S[ 5]]; + SB[512+i] = MDS2[Q1[Q0[i]^S[ 2]]^S[ 6]]; + SB[768+i] = MDS3[Q1[Q1[i]^S[ 3]]^S[ 7]]; } - for(u32bit j = 0; j != 40; j += 2) + + for(u32bit i = 0; i != 40; i += 2) { - u32bit X = MDS0[Q0[Q0[j ]^key[ 8]]^key[ 0]] ^ - MDS1[Q0[Q1[j ]^key[ 9]]^key[ 1]] ^ - MDS2[Q1[Q0[j ]^key[10]]^key[ 2]] ^ - MDS3[Q1[Q1[j ]^key[11]]^key[ 3]]; - u32bit Y = MDS0[Q0[Q0[j+1]^key[12]]^key[ 4]] ^ - MDS1[Q0[Q1[j+1]^key[13]]^key[ 5]] ^ - MDS2[Q1[Q0[j+1]^key[14]]^key[ 6]] ^ - MDS3[Q1[Q1[j+1]^key[15]]^key[ 7]]; - Y = rotate_left(Y, 8); X += Y; Y += X; - round_key[j] = X; round_key[j+1] = rotate_left(Y, 9); + u32bit X = MDS0[Q0[Q0[i ]^key[ 8]]^key[ 0]] ^ + MDS1[Q0[Q1[i ]^key[ 9]]^key[ 1]] ^ + MDS2[Q1[Q0[i ]^key[10]]^key[ 2]] ^ + MDS3[Q1[Q1[i ]^key[11]]^key[ 3]]; + u32bit Y = MDS0[Q0[Q0[i+1]^key[12]]^key[ 4]] ^ + MDS1[Q0[Q1[i+1]^key[13]]^key[ 5]] ^ + MDS2[Q1[Q0[i+1]^key[14]]^key[ 6]] ^ + MDS3[Q1[Q1[i+1]^key[15]]^key[ 7]]; + Y = rotate_left(Y, 8); + X += Y; Y += X; + + RK[i] = X; + RK[i+1] = rotate_left(Y, 9); } } else if(length == 24) { - for(u32bit j = 0; j != 256; ++j) + for(u32bit i = 0; i != 256; ++i) { - SBox0[j] = MDS0[Q0[Q0[Q1[j]^S[ 0]]^S[ 4]]^S[ 8]]; - SBox1[j] = MDS1[Q0[Q1[Q1[j]^S[ 1]]^S[ 5]]^S[ 9]]; - SBox2[j] = MDS2[Q1[Q0[Q0[j]^S[ 2]]^S[ 6]]^S[10]]; - SBox3[j] = MDS3[Q1[Q1[Q0[j]^S[ 3]]^S[ 7]]^S[11]]; + SB[ i] = MDS0[Q0[Q0[Q1[i]^S[ 0]]^S[ 4]]^S[ 8]]; + SB[256+i] = MDS1[Q0[Q1[Q1[i]^S[ 1]]^S[ 5]]^S[ 9]]; + SB[512+i] = MDS2[Q1[Q0[Q0[i]^S[ 2]]^S[ 6]]^S[10]]; + SB[768+i] = MDS3[Q1[Q1[Q0[i]^S[ 3]]^S[ 7]]^S[11]]; } - for(u32bit j = 0; j != 40; j += 2) + + for(u32bit i = 0; i != 40; i += 2) { - u32bit X = MDS0[Q0[Q0[Q1[j ]^key[16]]^key[ 8]]^key[ 0]] ^ - MDS1[Q0[Q1[Q1[j ]^key[17]]^key[ 9]]^key[ 1]] ^ - MDS2[Q1[Q0[Q0[j ]^key[18]]^key[10]]^key[ 2]] ^ - MDS3[Q1[Q1[Q0[j ]^key[19]]^key[11]]^key[ 3]]; - u32bit Y = MDS0[Q0[Q0[Q1[j+1]^key[20]]^key[12]]^key[ 4]] ^ - MDS1[Q0[Q1[Q1[j+1]^key[21]]^key[13]]^key[ 5]] ^ - MDS2[Q1[Q0[Q0[j+1]^key[22]]^key[14]]^key[ 6]] ^ - MDS3[Q1[Q1[Q0[j+1]^key[23]]^key[15]]^key[ 7]]; - Y = rotate_left(Y, 8); X += Y; Y += X; - round_key[j] = X; round_key[j+1] = rotate_left(Y, 9); + u32bit X = MDS0[Q0[Q0[Q1[i ]^key[16]]^key[ 8]]^key[ 0]] ^ + MDS1[Q0[Q1[Q1[i ]^key[17]]^key[ 9]]^key[ 1]] ^ + MDS2[Q1[Q0[Q0[i ]^key[18]]^key[10]]^key[ 2]] ^ + MDS3[Q1[Q1[Q0[i ]^key[19]]^key[11]]^key[ 3]]; + u32bit Y = MDS0[Q0[Q0[Q1[i+1]^key[20]]^key[12]]^key[ 4]] ^ + MDS1[Q0[Q1[Q1[i+1]^key[21]]^key[13]]^key[ 5]] ^ + MDS2[Q1[Q0[Q0[i+1]^key[22]]^key[14]]^key[ 6]] ^ + MDS3[Q1[Q1[Q0[i+1]^key[23]]^key[15]]^key[ 7]]; + Y = rotate_left(Y, 8); + X += Y; Y += X; + + RK[i] = X; + RK[i+1] = rotate_left(Y, 9); } } else if(length == 32) { - for(u32bit j = 0; j != 256; ++j) + for(u32bit i = 0; i != 256; ++i) { - SBox0[j] = MDS0[Q0[Q0[Q1[Q1[j]^S[ 0]]^S[ 4]]^S[ 8]]^S[12]]; - SBox1[j] = MDS1[Q0[Q1[Q1[Q0[j]^S[ 1]]^S[ 5]]^S[ 9]]^S[13]]; - SBox2[j] = MDS2[Q1[Q0[Q0[Q0[j]^S[ 2]]^S[ 6]]^S[10]]^S[14]]; - SBox3[j] = MDS3[Q1[Q1[Q0[Q1[j]^S[ 3]]^S[ 7]]^S[11]]^S[15]]; + SB[ i] = MDS0[Q0[Q0[Q1[Q1[i]^S[ 0]]^S[ 4]]^S[ 8]]^S[12]]; + SB[256+i] = MDS1[Q0[Q1[Q1[Q0[i]^S[ 1]]^S[ 5]]^S[ 9]]^S[13]]; + SB[512+i] = MDS2[Q1[Q0[Q0[Q0[i]^S[ 2]]^S[ 6]]^S[10]]^S[14]]; + SB[768+i] = MDS3[Q1[Q1[Q0[Q1[i]^S[ 3]]^S[ 7]]^S[11]]^S[15]]; } - for(u32bit j = 0; j != 40; j += 2) + + for(u32bit i = 0; i != 40; i += 2) { - u32bit X = MDS0[Q0[Q0[Q1[Q1[j ]^key[24]]^key[16]]^key[ 8]]^key[ 0]] ^ - MDS1[Q0[Q1[Q1[Q0[j ]^key[25]]^key[17]]^key[ 9]]^key[ 1]] ^ - MDS2[Q1[Q0[Q0[Q0[j ]^key[26]]^key[18]]^key[10]]^key[ 2]] ^ - MDS3[Q1[Q1[Q0[Q1[j ]^key[27]]^key[19]]^key[11]]^key[ 3]]; - u32bit Y = MDS0[Q0[Q0[Q1[Q1[j+1]^key[28]]^key[20]]^key[12]]^key[ 4]] ^ - MDS1[Q0[Q1[Q1[Q0[j+1]^key[29]]^key[21]]^key[13]]^key[ 5]] ^ - MDS2[Q1[Q0[Q0[Q0[j+1]^key[30]]^key[22]]^key[14]]^key[ 6]] ^ - MDS3[Q1[Q1[Q0[Q1[j+1]^key[31]]^key[23]]^key[15]]^key[ 7]]; - Y = rotate_left(Y, 8); X += Y; Y += X; - round_key[j] = X; round_key[j+1] = rotate_left(Y, 9); + u32bit X = MDS0[Q0[Q0[Q1[Q1[i ]^key[24]]^key[16]]^key[ 8]]^key[ 0]] ^ + MDS1[Q0[Q1[Q1[Q0[i ]^key[25]]^key[17]]^key[ 9]]^key[ 1]] ^ + MDS2[Q1[Q0[Q0[Q0[i ]^key[26]]^key[18]]^key[10]]^key[ 2]] ^ + MDS3[Q1[Q1[Q0[Q1[i ]^key[27]]^key[19]]^key[11]]^key[ 3]]; + u32bit Y = MDS0[Q0[Q0[Q1[Q1[i+1]^key[28]]^key[20]]^key[12]]^key[ 4]] ^ + MDS1[Q0[Q1[Q1[Q0[i+1]^key[29]]^key[21]]^key[13]]^key[ 5]] ^ + MDS2[Q1[Q0[Q0[Q0[i+1]^key[30]]^key[22]]^key[14]]^key[ 6]] ^ + MDS3[Q1[Q1[Q0[Q1[i+1]^key[31]]^key[23]]^key[15]]^key[ 7]]; + Y = rotate_left(Y, 8); + X += Y; Y += X; + + RK[i] = X; + RK[i+1] = rotate_left(Y, 9); } } } @@ -220,11 +232,8 @@ void Twofish::rs_mul(byte S[4], byte key, u32bit offset) */ void Twofish::clear() { - zeroise(SBox0); - zeroise(SBox1); - zeroise(SBox2); - zeroise(SBox3); - zeroise(round_key); + zeroise(SB); + zeroise(RK); } } diff --git a/src/block/twofish/twofish.h b/src/block/twofish/twofish.h index 3191dc963..eb4900ffa 100644 --- a/src/block/twofish/twofish.h +++ b/src/block/twofish/twofish.h @@ -25,7 +25,7 @@ class BOTAN_DLL Twofish : public BlockCipher std::string name() const { return "Twofish"; } BlockCipher* clone() const { return new Twofish; } - Twofish() : BlockCipher(16, 16, 32, 8) {} + Twofish() : BlockCipher(16, 16, 32, 8), SB(1024), RK(40) {} private: void key_schedule(const byte[], u32bit); @@ -41,8 +41,7 @@ class BOTAN_DLL Twofish : public BlockCipher static const byte EXP_TO_POLY[255]; static const byte POLY_TO_EXP[255]; - SecureVector<u32bit, 256> SBox0, SBox1, SBox2, SBox3; - SecureVector<u32bit, 40> round_key; + SecureVector<u32bit> SB, RK; }; } diff --git a/src/block/xtea/xtea.cpp b/src/block/xtea/xtea.cpp index 03e9f628c..9e47e5328 100644 --- a/src/block/xtea/xtea.cpp +++ b/src/block/xtea/xtea.cpp @@ -121,7 +121,7 @@ void XTEA::decrypt_n(const byte in[], byte out[], u32bit blocks) const */ void XTEA::key_schedule(const byte key[], u32bit) { - SecureVector<u32bit, 4> UK; + SecureVector<u32bit> UK(4); for(u32bit i = 0; i != 4; ++i) UK[i] = load_be<u32bit>(key, i); diff --git a/src/block/xtea/xtea.h b/src/block/xtea/xtea.h index d328bf2f0..54c925df2 100644 --- a/src/block/xtea/xtea.h +++ b/src/block/xtea/xtea.h @@ -25,16 +25,16 @@ class BOTAN_DLL XTEA : public BlockCipher std::string name() const { return "XTEA"; } BlockCipher* clone() const { return new XTEA; } - XTEA() : BlockCipher(8, 16) {} + XTEA() : BlockCipher(8, 16), EK(64) {} protected: /** * @return const reference to the key schedule */ - const SecureVector<u32bit, 64>& get_EK() const { return EK; } + const SecureVector<u32bit>& get_EK() const { return EK; } private: void key_schedule(const byte[], u32bit); - SecureVector<u32bit, 64> EK; + SecureVector<u32bit> EK; }; } diff --git a/src/filters/base64/base64.cpp b/src/filters/base64/base64.cpp index e342f7109..5f365ca5a 100644 --- a/src/filters/base64/base64.cpp +++ b/src/filters/base64/base64.cpp @@ -107,7 +107,8 @@ void Base64_Encoder::end_msg() if(left_over) { - SecureVector<byte, 3> remainder(in + start_of_last_block, left_over); + SecureVector<byte> remainder(3); + copy_mem(&remainder[0], &in[start_of_last_block], left_over); encode(remainder, out); @@ -217,7 +218,8 @@ void Base64_Decoder::end_msg() if(left_over) { - SecureVector<byte, 4> remainder(in + start_of_last_block, left_over); + SecureVector<byte> remainder(4); + copy_mem(&remainder[0], &in[start_of_last_block], left_over); decode(remainder, out); send(out, ((left_over == 1) ? (1) : (left_over - 1))); } diff --git a/src/filters/secqueue.cpp b/src/filters/secqueue.cpp index db0366bc8..bfe02b0d3 100644 --- a/src/filters/secqueue.cpp +++ b/src/filters/secqueue.cpp @@ -16,7 +16,9 @@ namespace Botan { class SecureQueueNode { public: - SecureQueueNode() { next = 0; start = end = 0; } + SecureQueueNode() : buffer(DEFAULT_BUFFERSIZE) + { next = 0; start = end = 0; } + ~SecureQueueNode() { next = 0; start = end = 0; } u32bit write(const byte input[], u32bit length) @@ -48,7 +50,7 @@ class SecureQueueNode private: friend class SecureQueue; SecureQueueNode* next; - SecureVector<byte, DEFAULT_BUFFERSIZE> buffer; + SecureVector<byte> buffer; u32bit start, end; }; diff --git a/src/hash/bmw/bmw_512.h b/src/hash/bmw/bmw_512.h index d3c9c03c6..b1eaa6874 100644 --- a/src/hash/bmw/bmw_512.h +++ b/src/hash/bmw/bmw_512.h @@ -21,13 +21,14 @@ class BOTAN_DLL BMW_512 : public MDx_HashFunction void clear(); std::string name() const { return "BMW512"; } HashFunction* clone() const { return new BMW_512; } - BMW_512() : MDx_HashFunction(64, 128, false, true) { clear(); } + + BMW_512() : MDx_HashFunction(64, 128, false, true), H(16), M(16), Q(32) + { clear(); } private: void compress_n(const byte input[], u32bit blocks); void copy_out(byte output[]); - SecureVector<u64bit, 16> H, M; - SecureVector<u64bit, 32> Q; + SecureVector<u64bit> H, M, Q; }; } diff --git a/src/hash/gost_3411/gost_3411.cpp b/src/hash/gost_3411/gost_3411.cpp index ad874fe8a..ee43514d5 100644 --- a/src/hash/gost_3411/gost_3411.cpp +++ b/src/hash/gost_3411/gost_3411.cpp @@ -17,7 +17,10 @@ namespace Botan { */ GOST_34_11::GOST_34_11() : HashFunction(32, 32), - cipher(GOST_28147_89_Params("R3411_CryptoPro")) + cipher(GOST_28147_89_Params("R3411_CryptoPro")), + buffer(32), + sum(32), + hash(32) { count = 0; position = 0; @@ -223,11 +226,11 @@ void GOST_34_11::final_result(byte out[]) compress_n(buffer, 1); } - SecureVector<byte, 32> length_buf; + SecureVector<byte> length_buf(32); const u64bit bit_count = count * 8; store_le(bit_count, length_buf); - SecureVector<byte, 32> sum_buf(sum); + SecureVector<byte> sum_buf = sum; compress_n(length_buf, 1); compress_n(sum_buf, 1); diff --git a/src/hash/gost_3411/gost_3411.h b/src/hash/gost_3411/gost_3411.h index 04417d6fd..5d26e8557 100644 --- a/src/hash/gost_3411/gost_3411.h +++ b/src/hash/gost_3411/gost_3411.h @@ -31,9 +31,7 @@ class BOTAN_DLL GOST_34_11 : public HashFunction void final_result(byte[]); GOST_28147_89 cipher; - SecureVector<byte, 32> buffer; - SecureVector<byte, 32> sum; - SecureVector<byte, 32> hash; + SecureVector<byte> buffer, sum, hash; u64bit count; u32bit position; }; diff --git a/src/hash/has160/has160.h b/src/hash/has160/has160.h index a82e4c579..7cff320b8 100644 --- a/src/hash/has160/has160.h +++ b/src/hash/has160/has160.h @@ -22,13 +22,14 @@ class BOTAN_DLL HAS_160 : public MDx_HashFunction void clear(); std::string name() const { return "HAS-160"; } HashFunction* clone() const { return new HAS_160; } - HAS_160() : MDx_HashFunction(20, 64, false, true) { clear(); } + + HAS_160() : MDx_HashFunction(20, 64, false, true), X(20), digest(5) + { clear(); } private: void compress_n(const byte[], u32bit blocks); void copy_out(byte[]); - SecureVector<u32bit, 20> X; - SecureVector<u32bit, 5> digest; + SecureVector<u32bit> X, digest; }; } diff --git a/src/hash/md2/md2.h b/src/hash/md2/md2.h index 9d39d8913..b25d5f410 100644 --- a/src/hash/md2/md2.h +++ b/src/hash/md2/md2.h @@ -21,14 +21,15 @@ class BOTAN_DLL MD2 : public HashFunction void clear(); std::string name() const { return "MD2"; } HashFunction* clone() const { return new MD2; } - MD2() : HashFunction(16, 16) { clear(); } + + MD2() : HashFunction(16, 16), X(48), checksum(16), buffer(16) + { clear(); } private: void add_data(const byte[], u32bit); void hash(const byte[]); void final_result(byte[]); - SecureVector<byte, 48> X; - SecureVector<byte, 16> checksum, buffer; + SecureVector<byte> X, checksum, buffer; u32bit position; }; diff --git a/src/hash/md4/md4.h b/src/hash/md4/md4.h index 44d60406a..44081e635 100644 --- a/src/hash/md4/md4.h +++ b/src/hash/md4/md4.h @@ -21,13 +21,14 @@ class BOTAN_DLL MD4 : public MDx_HashFunction void clear(); std::string name() const { return "MD4"; } HashFunction* clone() const { return new MD4; } - MD4() : MDx_HashFunction(16, 64, false, true) { clear(); } + + MD4() : MDx_HashFunction(16, 64, false, true), M(16), digest(4) + { clear(); } protected: void compress_n(const byte input[], u32bit blocks); void copy_out(byte[]); - SecureVector<u32bit, 16> M; - SecureVector<u32bit, 4> digest; + SecureVector<u32bit> M, digest; }; } diff --git a/src/hash/md5/md5.h b/src/hash/md5/md5.h index d0706ab4b..732ec026d 100644 --- a/src/hash/md5/md5.h +++ b/src/hash/md5/md5.h @@ -21,13 +21,14 @@ class BOTAN_DLL MD5 : public MDx_HashFunction void clear(); std::string name() const { return "MD5"; } HashFunction* clone() const { return new MD5; } - MD5() : MDx_HashFunction(16, 64, false, true) { clear(); } + + MD5() : MDx_HashFunction(16, 64, false, true), M(16), digest(4) + { clear(); } protected: void compress_n(const byte[], u32bit blocks); void copy_out(byte[]); - SecureVector<u32bit, 16> M; - SecureVector<u32bit, 4> digest; + SecureVector<u32bit> M, digest; }; } diff --git a/src/hash/rmd128/rmd128.h b/src/hash/rmd128/rmd128.h index c7c7f4580..23272c622 100644 --- a/src/hash/rmd128/rmd128.h +++ b/src/hash/rmd128/rmd128.h @@ -21,13 +21,14 @@ class BOTAN_DLL RIPEMD_128 : public MDx_HashFunction void clear(); std::string name() const { return "RIPEMD-128"; } HashFunction* clone() const { return new RIPEMD_128; } - RIPEMD_128() : MDx_HashFunction(16, 64, false, true) { clear(); } + + RIPEMD_128() : MDx_HashFunction(16, 64, false, true), M(16), digest(4) + { clear(); } private: void compress_n(const byte[], u32bit blocks); void copy_out(byte[]); - SecureVector<u32bit, 16> M; - SecureVector<u32bit, 4> digest; + SecureVector<u32bit> M, digest; }; } diff --git a/src/hash/rmd160/rmd160.h b/src/hash/rmd160/rmd160.h index 0b6e847f0..09c995628 100644 --- a/src/hash/rmd160/rmd160.h +++ b/src/hash/rmd160/rmd160.h @@ -21,13 +21,14 @@ class BOTAN_DLL RIPEMD_160 : public MDx_HashFunction void clear(); std::string name() const { return "RIPEMD-160"; } HashFunction* clone() const { return new RIPEMD_160; } - RIPEMD_160() : MDx_HashFunction(20, 64, false, true) { clear(); } + + RIPEMD_160() : MDx_HashFunction(20, 64, false, true), M(16), digest(5) + { clear(); } private: void compress_n(const byte[], u32bit blocks); void copy_out(byte[]); - SecureVector<u32bit, 16> M; - SecureVector<u32bit, 5> digest; + SecureVector<u32bit> M, digest; }; } diff --git a/src/hash/sha1/sha160.cpp b/src/hash/sha1/sha160.cpp index 0b3d7c346..79348a371 100644 --- a/src/hash/sha1/sha160.cpp +++ b/src/hash/sha1/sha160.cpp @@ -156,7 +156,7 @@ void SHA_160::clear() * SHA_160 Constructor */ SHA_160::SHA_160() : - MDx_HashFunction(20, 64, true, true), W(80) + MDx_HashFunction(20, 64, true, true), digest(5), W(80) { clear(); } @@ -165,7 +165,7 @@ SHA_160::SHA_160() : * SHA_160 Constructor */ SHA_160::SHA_160(u32bit W_size) : - MDx_HashFunction(20, 64, true, true), W(W_size) + MDx_HashFunction(20, 64, true, true), digest(5), W(W_size) { clear(); } diff --git a/src/hash/sha1/sha160.h b/src/hash/sha1/sha160.h index c66831a1e..690aea1d5 100644 --- a/src/hash/sha1/sha160.h +++ b/src/hash/sha1/sha160.h @@ -35,7 +35,7 @@ class BOTAN_DLL SHA_160 : public MDx_HashFunction void compress_n(const byte[], u32bit blocks); void copy_out(byte[]); - SecureVector<u32bit, 5> digest; + SecureVector<u32bit> digest; SecureVector<u32bit> W; }; diff --git a/src/hash/sha2/sha2_32.h b/src/hash/sha2/sha2_32.h index 71f0cff4b..a3e3a6f19 100644 --- a/src/hash/sha2/sha2_32.h +++ b/src/hash/sha2/sha2_32.h @@ -22,13 +22,14 @@ class BOTAN_DLL SHA_224 : public MDx_HashFunction void clear(); std::string name() const { return "SHA-224"; } HashFunction* clone() const { return new SHA_224; } - SHA_224() : MDx_HashFunction(28, 64, true, true) { clear(); } + + SHA_224() : MDx_HashFunction(28, 64, true, true), W(64), digest(8) + { clear(); } private: void compress_n(const byte[], u32bit blocks); void copy_out(byte[]); - SecureVector<u32bit, 64> W; - SecureVector<u32bit, 8> digest; + SecureVector<u32bit> W, digest; }; /** @@ -40,13 +41,14 @@ class BOTAN_DLL SHA_256 : public MDx_HashFunction void clear(); std::string name() const { return "SHA-256"; } HashFunction* clone() const { return new SHA_256; } - SHA_256() : MDx_HashFunction(32, 64, true, true) { clear(); } + + SHA_256() : MDx_HashFunction(32, 64, true, true), W(64), digest(8) + { clear(); } private: void compress_n(const byte[], u32bit blocks); void copy_out(byte[]); - SecureVector<u32bit, 64> W; - SecureVector<u32bit, 8> digest; + SecureVector<u32bit> W, digest; }; } diff --git a/src/hash/sha2/sha2_64.h b/src/hash/sha2/sha2_64.h index e8112595e..726712221 100644 --- a/src/hash/sha2/sha2_64.h +++ b/src/hash/sha2/sha2_64.h @@ -21,13 +21,14 @@ class BOTAN_DLL SHA_384 : public MDx_HashFunction void clear(); std::string name() const { return "SHA-384"; } HashFunction* clone() const { return new SHA_384; } - SHA_384() : MDx_HashFunction(48, 128, true, true, 16) { clear(); } + + SHA_384() : MDx_HashFunction(48, 128, true, true, 16), W(80), digest(8) + { clear(); } private: void compress_n(const byte[], u32bit blocks); void copy_out(byte[]); - SecureVector<u64bit, 80> W; - SecureVector<u64bit, 8> digest; + SecureVector<u64bit> W, digest; }; /** @@ -39,13 +40,13 @@ class BOTAN_DLL SHA_512 : public MDx_HashFunction void clear(); std::string name() const { return "SHA-512"; } HashFunction* clone() const { return new SHA_512; } - SHA_512() : MDx_HashFunction(64, 128, true, true, 16) { clear(); } + SHA_512() : MDx_HashFunction(64, 128, true, true, 16), W(80), digest(8) + { clear(); } private: void compress_n(const byte[], u32bit blocks); void copy_out(byte[]); - SecureVector<u64bit, 80> W; - SecureVector<u64bit, 8> digest; + SecureVector<u64bit> W, digest; }; } diff --git a/src/hash/skein/skein_512.cpp b/src/hash/skein/skein_512.cpp index 5aa49ab7a..a3aff52ab 100644 --- a/src/hash/skein/skein_512.cpp +++ b/src/hash/skein/skein_512.cpp @@ -170,12 +170,12 @@ Skein_512::Skein_512(u32bit arg_output_bits, const std::string& arg_personalization) : HashFunction(arg_output_bits / 8, 64), personalization(arg_personalization), - output_bits(arg_output_bits) + output_bits(arg_output_bits), + H(9), T(3), buffer(64), buf_pos(0) { if(output_bits == 0 || output_bits % 8 != 0) throw Invalid_Argument("Bad output bits size for Skein-512"); - buf_pos = 0; initial_block(H, T, output_bits, personalization); } @@ -239,7 +239,7 @@ void Skein_512::final_result(byte out[]) u32bit out_bytes = output_bits / 8; - SecureVector<u64bit, 9> H_out; + SecureVector<u64bit> H_out(9); while(out_bytes) { diff --git a/src/hash/skein/skein_512.h b/src/hash/skein/skein_512.h index 5d17fa564..811b633eb 100644 --- a/src/hash/skein/skein_512.h +++ b/src/hash/skein/skein_512.h @@ -37,10 +37,10 @@ class BOTAN_DLL Skein_512 : public HashFunction std::string personalization; u32bit output_bits; - SecureVector<u64bit, 9> H; - SecureVector<u64bit, 3> T; - SecureVector<byte, 64> buffer; + SecureVector<u64bit> H; + SecureVector<u64bit> T; + SecureVector<byte> buffer; u32bit buf_pos; }; diff --git a/src/hash/tiger/tiger.cpp b/src/hash/tiger/tiger.cpp index d931324e0..9d3e2cbe4 100644 --- a/src/hash/tiger/tiger.cpp +++ b/src/hash/tiger/tiger.cpp @@ -167,7 +167,10 @@ std::string Tiger::name() const * Tiger Constructor */ Tiger::Tiger(u32bit hashlen, u32bit pass) : - MDx_HashFunction(hashlen, 64, false, false), PASS(pass) + MDx_HashFunction(hashlen, 64, false, false), + X(8), + digest(3), + PASS(pass) { if(OUTPUT_LENGTH != 16 && OUTPUT_LENGTH != 20 && OUTPUT_LENGTH != 24) throw Invalid_Argument("Tiger: Illegal hash output size: " + diff --git a/src/hash/tiger/tiger.h b/src/hash/tiger/tiger.h index 94665b902..4b8a99344 100644 --- a/src/hash/tiger/tiger.h +++ b/src/hash/tiger/tiger.h @@ -44,8 +44,7 @@ class BOTAN_DLL Tiger : public MDx_HashFunction static const u64bit SBOX3[256]; static const u64bit SBOX4[256]; - SecureVector<u64bit, 8> X; - SecureVector<u64bit, 3> digest; + SecureVector<u64bit> X, digest; const u32bit PASS; }; diff --git a/src/hash/whirlpool/whrlpool.h b/src/hash/whirlpool/whrlpool.h index e28053d4f..98be0b480 100644 --- a/src/hash/whirlpool/whrlpool.h +++ b/src/hash/whirlpool/whrlpool.h @@ -21,7 +21,9 @@ class BOTAN_DLL Whirlpool : public MDx_HashFunction void clear(); std::string name() const { return "Whirlpool"; } HashFunction* clone() const { return new Whirlpool; } - Whirlpool() : MDx_HashFunction(64, 64, true, true, 32) { clear(); } + + Whirlpool() : MDx_HashFunction(64, 64, true, true, 32), M(8), digest(8) + { clear(); } private: void compress_n(const byte[], u32bit blocks); void copy_out(byte[]); @@ -34,7 +36,8 @@ class BOTAN_DLL Whirlpool : public MDx_HashFunction static const u64bit C5[256]; static const u64bit C6[256]; static const u64bit C7[256]; - SecureVector<u64bit, 8> M, digest; + + SecureVector<u64bit> M, digest; }; } diff --git a/src/mac/x919_mac/x919_mac.cpp b/src/mac/x919_mac/x919_mac.cpp index f0c2419fa..975b195f6 100644 --- a/src/mac/x919_mac/x919_mac.cpp +++ b/src/mac/x919_mac/x919_mac.cpp @@ -89,7 +89,7 @@ ANSI_X919_MAC::ANSI_X919_MAC(BlockCipher* e_in) : e_in->MINIMUM_KEYLENGTH, 2*e_in->MAXIMUM_KEYLENGTH, 2*e_in->KEYLENGTH_MULTIPLE), - e(e_in), d(e->clone()), position(0) + e(e_in), d(e->clone()), state(e->BLOCK_SIZE), position(0) { if(e->name() != "DES") throw Invalid_Argument("ANSI X9.19 MAC only supports DES"); diff --git a/src/mac/x919_mac/x919_mac.h b/src/mac/x919_mac/x919_mac.h index 8432db7d1..275d39367 100644 --- a/src/mac/x919_mac/x919_mac.h +++ b/src/mac/x919_mac/x919_mac.h @@ -35,7 +35,7 @@ class BOTAN_DLL ANSI_X919_MAC : public MessageAuthenticationCode BlockCipher* e; BlockCipher* d; - SecureVector<byte, 8> state; + SecureVector<byte> state; u32bit position; }; diff --git a/src/stream/arc4/arc4.cpp b/src/stream/arc4/arc4.cpp index 90f0f0904..97364bd1a 100644 --- a/src/stream/arc4/arc4.cpp +++ b/src/stream/arc4/arc4.cpp @@ -97,7 +97,8 @@ void ARC4::clear() /* * ARC4 Constructor */ -ARC4::ARC4(u32bit s) : StreamCipher(1, 256), SKIP(s) +ARC4::ARC4(u32bit s) : StreamCipher(1, 256), SKIP(s), + state(256), buffer(DEFAULT_BUFFERSIZE) { clear(); } diff --git a/src/stream/arc4/arc4.h b/src/stream/arc4/arc4.h index 0488783ef..1b8684e75 100644 --- a/src/stream/arc4/arc4.h +++ b/src/stream/arc4/arc4.h @@ -38,8 +38,8 @@ class BOTAN_DLL ARC4 : public StreamCipher const u32bit SKIP; - SecureVector<byte, DEFAULT_BUFFERSIZE> buffer; - SecureVector<u32bit, 256> state; + SecureVector<u32bit> state; + SecureVector<byte> buffer; u32bit X, Y, position; }; diff --git a/src/stream/salsa20/salsa20.h b/src/stream/salsa20/salsa20.h index 4ba483082..7e6c523cd 100644 --- a/src/stream/salsa20/salsa20.h +++ b/src/stream/salsa20/salsa20.h @@ -29,13 +29,13 @@ class BOTAN_DLL Salsa20 : public StreamCipher std::string name() const; StreamCipher* clone() const { return new Salsa20; } - Salsa20() : StreamCipher(16, 32, 16) { position = 0; } + Salsa20() : StreamCipher(16, 32, 16), state(16), buffer(64) { position = 0; } ~Salsa20() { clear(); } private: void key_schedule(const byte key[], u32bit key_len); - SecureVector<u32bit, 16> state; - SecureVector<byte, 64> buffer; + SecureVector<u32bit> state; + SecureVector<byte> buffer; u32bit position; }; diff --git a/src/stream/turing/turing.h b/src/stream/turing/turing.h index 92c5083a4..c0b11fd7b 100644 --- a/src/stream/turing/turing.h +++ b/src/stream/turing/turing.h @@ -27,7 +27,12 @@ class BOTAN_DLL Turing : public StreamCipher void clear(); std::string name() const { return "Turing"; } StreamCipher* clone() const { return new Turing; } - Turing() : StreamCipher(4, 32, 4) { position = 0; } + + Turing() : StreamCipher(4, 32, 4), + S0(256), S1(256), S2(256), S3(256), + R(17), buffer(340) + { position = 0; } + private: void key_schedule(const byte[], u32bit); void generate(); @@ -37,10 +42,10 @@ class BOTAN_DLL Turing : public StreamCipher static const u32bit Q_BOX[256]; static const byte SBOX[256]; - SecureVector<u32bit, 256> S0, S1, S2, S3; - SecureVector<u32bit, 17> R; + SecureVector<u32bit> S0, S1, S2, S3; + SecureVector<u32bit> R; SecureVector<u32bit> K; - SecureVector<byte, 340> buffer; + SecureVector<byte> buffer; u32bit position; }; diff --git a/src/stream/wid_wake/wid_wake.h b/src/stream/wid_wake/wid_wake.h index 365a6d9ff..88f5690bf 100644 --- a/src/stream/wid_wake/wid_wake.h +++ b/src/stream/wid_wake/wid_wake.h @@ -30,16 +30,21 @@ class BOTAN_DLL WiderWake_41_BE : public StreamCipher void clear(); std::string name() const { return "WiderWake4+1-BE"; } StreamCipher* clone() const { return new WiderWake_41_BE; } - WiderWake_41_BE() : StreamCipher(16, 16, 1) {} + + WiderWake_41_BE() : StreamCipher(16, 16, 1), + T(256), state(5), t_key(4), + buffer(DEFAULT_BUFFERSIZE), position(0) + { } + private: void key_schedule(const byte[], u32bit); void generate(u32bit); - SecureVector<byte, DEFAULT_BUFFERSIZE> buffer; - SecureVector<u32bit, 256> T; - SecureVector<u32bit, 5> state; - SecureVector<u32bit, 4> t_key; + SecureVector<u32bit> T; + SecureVector<u32bit> state; + SecureVector<u32bit> t_key; + SecureVector<byte> buffer; u32bit position; }; |