diff options
Diffstat (limited to 'src/lib/block/threefish')
-rw-r--r-- | src/lib/block/threefish/threefish.cpp | 58 | ||||
-rw-r--r-- | src/lib/block/threefish/threefish.h | 10 |
2 files changed, 60 insertions, 8 deletions
diff --git a/src/lib/block/threefish/threefish.cpp b/src/lib/block/threefish/threefish.cpp index 587a76a12..aa1b1ee81 100644 --- a/src/lib/block/threefish/threefish.cpp +++ b/src/lib/block/threefish/threefish.cpp @@ -1,6 +1,6 @@ /* * Threefish-512 -* (C) 2013 Jack Lloyd +* (C) 2013,2014 Jack Lloyd * * Distributed under the terms of the Botan license */ @@ -11,11 +11,6 @@ namespace Botan { -void Threefish_512::encrypt_n(const byte in[], byte out[], size_t blocks) const - { - BOTAN_ASSERT(m_K.size() == 9, "Key was set"); - BOTAN_ASSERT(m_T.size() == 3, "Tweak was set"); - #define THREEFISH_ROUND(X0,X1,X2,X3,X4,X5,X6,X7,ROT1,ROT2,ROT3,ROT4) \ do { \ X0 += X4; \ @@ -59,6 +54,55 @@ void Threefish_512::encrypt_n(const byte in[], byte out[], size_t blocks) const THREEFISH_INJECT_KEY(R2); \ } while(0) +void Threefish_512::skein_feedfwd(const secure_vector<u64bit>& M, + const secure_vector<u64bit>& T) + { + BOTAN_ASSERT(m_K.size() == 9, "Key was set"); + BOTAN_ASSERT(M.size() == 8, "Single block"); + + m_T[0] = T[0]; + m_T[1] = T[1]; + m_T[2] = T[0] ^ T[1]; + + u64bit X0 = M[0]; + u64bit X1 = M[1]; + u64bit X2 = M[2]; + u64bit X3 = M[3]; + u64bit X4 = M[4]; + u64bit X5 = M[5]; + u64bit X6 = M[6]; + u64bit X7 = M[7]; + + THREEFISH_INJECT_KEY(0); + + THREEFISH_ENC_8_ROUNDS(1,2); + THREEFISH_ENC_8_ROUNDS(3,4); + THREEFISH_ENC_8_ROUNDS(5,6); + THREEFISH_ENC_8_ROUNDS(7,8); + THREEFISH_ENC_8_ROUNDS(9,10); + THREEFISH_ENC_8_ROUNDS(11,12); + THREEFISH_ENC_8_ROUNDS(13,14); + THREEFISH_ENC_8_ROUNDS(15,16); + THREEFISH_ENC_8_ROUNDS(17,18); + + m_K[0] = M[0] ^ X0; + m_K[1] = M[1] ^ X1; + m_K[2] = M[2] ^ X2; + m_K[3] = M[3] ^ X3; + m_K[4] = M[4] ^ X4; + m_K[5] = M[5] ^ X5; + m_K[6] = M[6] ^ X6; + m_K[7] = M[7] ^ X7; + + m_K[8] = m_K[0] ^ m_K[1] ^ m_K[2] ^ m_K[3] ^ + m_K[4] ^ m_K[5] ^ m_K[6] ^ m_K[7] ^ 0x1BD11BDAA9FC1A22; + } + +void Threefish_512::encrypt_n(const byte in[], byte out[], size_t blocks) const + { + BOTAN_ASSERT(m_K.size() == 9, "Key was set"); + BOTAN_ASSERT(m_T.size() == 3, "Tweak was set"); + for(size_t i = 0; i != blocks; ++i) { u64bit X0 = load_le<u64bit>(in, 0); @@ -87,11 +131,11 @@ void Threefish_512::encrypt_n(const byte in[], byte out[], size_t blocks) const in += 64; out += 64; } + } #undef THREEFISH_ENC_8_ROUNDS #undef THREEFISH_INJECT_KEY #undef THREEFISH_ROUND - } void Threefish_512::decrypt_n(const byte in[], byte out[], size_t blocks) const { diff --git a/src/lib/block/threefish/threefish.h b/src/lib/block/threefish/threefish.h index 327e54843..0d3c6fb9d 100644 --- a/src/lib/block/threefish/threefish.h +++ b/src/lib/block/threefish/threefish.h @@ -1,6 +1,6 @@ /* * Threefish -* (C) 2013 Jack Lloyd +* (C) 2013,2014 Jack Lloyd * * Distributed under the terms of the Botan license */ @@ -28,12 +28,20 @@ class BOTAN_DLL Threefish_512 : public Block_Cipher_Fixed_Params<64, 64> BlockCipher* clone() const override { return new Threefish_512; } Threefish_512() : m_T(3) {} + protected: const secure_vector<u64bit>& get_T() const { return m_T; } const secure_vector<u64bit>& get_K() const { return m_K; } private: void key_schedule(const byte key[], size_t key_len) override; + // Interface for Skein + friend class Skein_512; + + virtual void skein_feedfwd(const secure_vector<u64bit>& M, + const secure_vector<u64bit>& T); + + // Private data secure_vector<u64bit> m_T; secure_vector<u64bit> m_K; }; |