aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/block/threefish
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/block/threefish')
-rw-r--r--src/lib/block/threefish/threefish.cpp58
-rw-r--r--src/lib/block/threefish/threefish.h10
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;
};