8#include <botan/internal/threefish_512.h>
9#include <botan/internal/loadstor.h>
10#include <botan/internal/rotate.h>
11#include <botan/internal/cpuid.h>
15namespace Threefish_F {
17template<
size_t R1,
size_t R2,
size_t R3,
size_t R4>
19 uint64_t& X0, uint64_t& X1, uint64_t& X2, uint64_t& X3,
20 uint64_t& X4, uint64_t& X5, uint64_t& X6, uint64_t& X7)
36template<
size_t R1,
size_t R2,
size_t R3,
size_t R4>
38 uint64_t& X0, uint64_t& X1, uint64_t& X2, uint64_t& X3,
39 uint64_t& X4, uint64_t& X5, uint64_t& X6, uint64_t& X7)
58 Key_Inserter(
const uint64_t* K,
const uint64_t*
T) :
63 uint64_t& X0, uint64_t& X1, uint64_t& X2, uint64_t& X3,
64 uint64_t& X4, uint64_t& X5, uint64_t& X6, uint64_t& X7)
const
71 X5 += m_K[(R+5) % 9] + m_T[(R ) % 3];
72 X6 += m_K[(R+6) % 9] + m_T[(R+1) % 3];
73 X7 += m_K[(R+7) % 9] + R;
78 uint64_t& X0, uint64_t& X1, uint64_t& X2, uint64_t& X3,
79 uint64_t& X4, uint64_t& X5, uint64_t& X6, uint64_t& X7)
const
86 X5 -= m_K[(R+5) % 9] + m_T[(R ) % 3];
87 X6 -= m_K[(R+6) % 9] + m_T[(R+1) % 3];
88 X7 -= m_K[(R+7) % 9] + R;
96template<
size_t R1,
size_t R2>
98 uint64_t& X0, uint64_t& X1, uint64_t& X2, uint64_t& X3,
99 uint64_t& X4, uint64_t& X5, uint64_t& X6, uint64_t& X7,
100 const Key_Inserter& key)
102 e_round<46,36,19,37>(X0,X2,X4,X6, X1,X3,X5,X7);
103 e_round<33,27,14,42>(X2,X4,X6,X0, X1,X7,X5,X3);
104 e_round<17,49,36,39>(X4,X6,X0,X2, X1,X3,X5,X7);
105 e_round<44, 9,54,56>(X6,X0,X2,X4, X1,X7,X5,X3);
106 key.e_add(R1, X0, X1, X2, X3, X4, X5, X6, X7);
108 e_round<39,30,34,24>(X0,X2,X4,X6, X1,X3,X5,X7);
109 e_round<13,50,10,17>(X2,X4,X6,X0, X1,X7,X5,X3);
110 e_round<25,29,39,43>(X4,X6,X0,X2, X1,X3,X5,X7);
111 e_round< 8,35,56,22>(X6,X0,X2,X4, X1,X7,X5,X3);
112 key.e_add(R2, X0, X1, X2, X3, X4, X5, X6, X7);
115template<
size_t R1,
size_t R2>
117 uint64_t& X0, uint64_t& X1, uint64_t& X2, uint64_t& X3,
118 uint64_t& X4, uint64_t& X5, uint64_t& X6, uint64_t& X7,
119 const Key_Inserter& key)
121 d_round< 8,35,56,22>(X6,X0,X2,X4, X1,X7,X5,X3);
122 d_round<25,29,39,43>(X4,X6,X0,X2, X1,X3,X5,X7);
123 d_round<13,50,10,17>(X2,X4,X6,X0, X1,X7,X5,X3);
124 d_round<39,30,34,24>(X0,X2,X4,X6, X1,X3,X5,X7);
125 key.d_add(R1, X0, X1, X2, X3, X4, X5, X6, X7);
127 d_round<44, 9,54,56>(X6,X0,X2,X4, X1,X7,X5,X3);
128 d_round<17,49,36,39>(X4,X6,X0,X2, X1,X3,X5,X7);
129 d_round<33,27,14,42>(X2,X4,X6,X0, X1,X7,X5,X3);
130 d_round<46,36,19,37>(X0,X2,X4,X6, X1,X3,X5,X7);
131 key.d_add(R2, X0, X1, X2, X3, X4, X5, X6, X7);
136void Threefish_512::skein_feedfwd(
const secure_vector<uint64_t>& M,
137 const secure_vector<uint64_t>&
T)
139 using namespace Threefish_F;
146 m_T[2] =
T[0] ^
T[1];
148 const Key_Inserter key(m_K.data(), m_T.data());
159 key.e_add(0, X0, X1, X2, X3, X4, X5, X6, X7);
161 e8_rounds< 1, 2>(X0, X1, X2, X3, X4, X5, X6, X7, key);
162 e8_rounds< 3, 4>(X0, X1, X2, X3, X4, X5, X6, X7, key);
163 e8_rounds< 5, 6>(X0, X1, X2, X3, X4, X5, X6, X7, key);
164 e8_rounds< 7, 8>(X0, X1, X2, X3, X4, X5, X6, X7, key);
165 e8_rounds< 9,10>(X0, X1, X2, X3, X4, X5, X6, X7, key);
166 e8_rounds<11,12>(X0, X1, X2, X3, X4, X5, X6, X7, key);
167 e8_rounds<13,14>(X0, X1, X2, X3, X4, X5, X6, X7, key);
168 e8_rounds<15,16>(X0, X1, X2, X3, X4, X5, X6, X7, key);
169 e8_rounds<17,18>(X0, X1, X2, X3, X4, X5, X6, X7, key);
180 m_K[8] = m_K[0] ^ m_K[1] ^ m_K[2] ^ m_K[3] ^
181 m_K[4] ^ m_K[5] ^ m_K[6] ^ m_K[7] ^ 0x1BD11BDAA9FC1A22;
186 using namespace Threefish_F;
190 const Key_Inserter key(m_K.data(), m_T.data());
194 uint64_t X0, X1, X2, X3, X4, X5, X6, X7;
197 key.e_add(0, X0, X1, X2, X3, X4, X5, X6, X7);
199 e8_rounds< 1, 2>(X0, X1, X2, X3, X4, X5, X6, X7, key);
200 e8_rounds< 3, 4>(X0, X1, X2, X3, X4, X5, X6, X7, key);
201 e8_rounds< 5, 6>(X0, X1, X2, X3, X4, X5, X6, X7, key);
202 e8_rounds< 7, 8>(X0, X1, X2, X3, X4, X5, X6, X7, key);
203 e8_rounds< 9,10>(X0, X1, X2, X3, X4, X5, X6, X7, key);
204 e8_rounds<11,12>(X0, X1, X2, X3, X4, X5, X6, X7, key);
205 e8_rounds<13,14>(X0, X1, X2, X3, X4, X5, X6, X7, key);
206 e8_rounds<15,16>(X0, X1, X2, X3, X4, X5, X6, X7, key);
207 e8_rounds<17,18>(X0, X1, X2, X3, X4, X5, X6, X7, key);
213#undef THREEFISH_ENC_8_ROUNDS
217 using namespace Threefish_F;
221 const Key_Inserter key(m_K.data(), m_T.data());
225 uint64_t X0, X1, X2, X3, X4, X5, X6, X7;
228 key.d_add(18, X0, X1, X2, X3, X4, X5, X6, X7);
230 d8_rounds<17,16>(X0, X1, X2, X3, X4, X5, X6, X7, key);
231 d8_rounds<15,14>(X0, X1, X2, X3, X4, X5, X6, X7, key);
232 d8_rounds<13,12>(X0, X1, X2, X3, X4, X5, X6, X7, key);
233 d8_rounds<11,10>(X0, X1, X2, X3, X4, X5, X6, X7, key);
234 d8_rounds< 9, 8>(X0, X1, X2, X3, X4, X5, X6, X7, key);
235 d8_rounds< 7, 6>(X0, X1, X2, X3, X4, X5, X6, X7, key);
236 d8_rounds< 5, 4>(X0, X1, X2, X3, X4, X5, X6, X7, key);
237 d8_rounds< 3, 2>(X0, X1, X2, X3, X4, X5, X6, X7, key);
238 d8_rounds< 1, 0>(X0, X1, X2, X3, X4, X5, X6, X7, key);
252 m_T[2] = m_T[0] ^ m_T[1];
260void Threefish_512::key_schedule(
const uint8_t key[],
size_t )
265 for(
size_t i = 0; i != 8; ++i)
268 m_K[8] = m_K[0] ^ m_K[1] ^ m_K[2] ^ m_K[3] ^
269 m_K[4] ^ m_K[5] ^ m_K[6] ^ m_K[7] ^ 0x1BD11BDAA9FC1A22;
#define BOTAN_ARG_CHECK(expr, msg)
#define BOTAN_ASSERT(expr, assertion_made)
void assert_key_material_set() const
bool has_keying_material() const override
void set_tweak(const uint8_t tweak[], size_t len) override
void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override
void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override
#define BOTAN_FORCE_INLINE
#define BOTAN_PARALLEL_SIMD_FOR
BOTAN_FORCE_INLINE void d_round(uint64_t &X0, uint64_t &X1, uint64_t &X2, uint64_t &X3, uint64_t &X4, uint64_t &X5, uint64_t &X6, uint64_t &X7)
BOTAN_FORCE_INLINE void d8_rounds(uint64_t &X0, uint64_t &X1, uint64_t &X2, uint64_t &X3, uint64_t &X4, uint64_t &X5, uint64_t &X6, uint64_t &X7, const Key_Inserter &key)
BOTAN_FORCE_INLINE void e8_rounds(uint64_t &X0, uint64_t &X1, uint64_t &X2, uint64_t &X3, uint64_t &X4, uint64_t &X5, uint64_t &X6, uint64_t &X7, const Key_Inserter &key)
BOTAN_FORCE_INLINE void e_round(uint64_t &X0, uint64_t &X1, uint64_t &X2, uint64_t &X3, uint64_t &X4, uint64_t &X5, uint64_t &X6, uint64_t &X7)
constexpr void store_le(uint16_t in, uint8_t out[2])
void zeroise(std::vector< T, Alloc > &vec)
void zap(std::vector< T, Alloc > &vec)
constexpr T load_le(const uint8_t in[], size_t off)
constexpr uint64_t load_le< uint64_t >(const uint8_t in[], size_t off)