16namespace Threefish_F {
20template <
size_t R1,
size_t R2,
size_t R3,
size_t R4>
22 uint64_t& X0, uint64_t& X1, uint64_t& X2, uint64_t& X3, uint64_t& X4, uint64_t& X5, uint64_t& X6, uint64_t& X7) {
37template <
size_t R1,
size_t R2,
size_t R3,
size_t R4>
39 uint64_t& X0, uint64_t& X1, uint64_t& X2, uint64_t& X3, uint64_t& X4, uint64_t& X5, uint64_t& X6, uint64_t& X7) {
56 Key_Inserter(
const uint64_t* K,
const uint64_t*
T) : m_K(K), m_T(
T) {}
68 X1 += m_K[(R + 1) % 9];
69 X2 += m_K[(R + 2) % 9];
70 X3 += m_K[(R + 3) % 9];
71 X4 += m_K[(R + 4) % 9];
72 X5 += m_K[(R + 5) % 9] + m_T[(R) % 3];
73 X6 += m_K[(R + 6) % 9] + m_T[(R + 1) % 3];
74 X7 += m_K[(R + 7) % 9] + R;
87 X1 -= m_K[(R + 1) % 9];
88 X2 -= m_K[(R + 2) % 9];
89 X3 -= m_K[(R + 3) % 9];
90 X4 -= m_K[(R + 4) % 9];
91 X5 -= m_K[(R + 5) % 9] + m_T[(R) % 3];
92 X6 -= m_K[(R + 6) % 9] + m_T[(R + 1) % 3];
93 X7 -= m_K[(R + 7) % 9] + R;
101template <
size_t R1,
size_t R2>
110 const Key_Inserter& key) {
111 e_round<46, 36, 19, 37>(X0, X2, X4, X6, X1, X3, X5, X7);
112 e_round<33, 27, 14, 42>(X2, X4, X6, X0, X1, X7, X5, X3);
113 e_round<17, 49, 36, 39>(X4, X6, X0, X2, X1, X3, X5, X7);
114 e_round<44, 9, 54, 56>(X6, X0, X2, X4, X1, X7, X5, X3);
115 key.e_add(R1, X0, X1, X2, X3, X4, X5, X6, X7);
117 e_round<39, 30, 34, 24>(X0, X2, X4, X6, X1, X3, X5, X7);
118 e_round<13, 50, 10, 17>(X2, X4, X6, X0, X1, X7, X5, X3);
119 e_round<25, 29, 39, 43>(X4, X6, X0, X2, X1, X3, X5, X7);
120 e_round<8, 35, 56, 22>(X6, X0, X2, X4, X1, X7, X5, X3);
121 key.e_add(R2, X0, X1, X2, X3, X4, X5, X6, X7);
124template <
size_t R1,
size_t R2>
133 const Key_Inserter& key) {
134 d_round<8, 35, 56, 22>(X6, X0, X2, X4, X1, X7, X5, X3);
135 d_round<25, 29, 39, 43>(X4, X6, X0, X2, X1, X3, X5, X7);
136 d_round<13, 50, 10, 17>(X2, X4, X6, X0, X1, X7, X5, X3);
137 d_round<39, 30, 34, 24>(X0, X2, X4, X6, X1, X3, X5, X7);
138 key.d_add(R1, X0, X1, X2, X3, X4, X5, X6, X7);
140 d_round<44, 9, 54, 56>(X6, X0, X2, X4, X1, X7, X5, X3);
141 d_round<17, 49, 36, 39>(X4, X6, X0, X2, X1, X3, X5, X7);
142 d_round<33, 27, 14, 42>(X2, X4, X6, X0, X1, X7, X5, X3);
143 d_round<46, 36, 19, 37>(X0, X2, X4, X6, X1, X3, X5, X7);
144 key.d_add(R2, X0, X1, X2, X3, X4, X5, X6, X7);
197 using namespace Threefish_F;
201 const Key_Inserter key(m_K.data(), m_T.data());
203 for(
size_t i = 0; i < blocks; ++i) {
204 uint64_t X0, X1, X2, X3, X4, X5, X6, X7;
207 key.e_add(0, X0, X1, X2, X3, X4, X5, X6, X7);
209 e8_rounds<1, 2>(X0, X1, X2, X3, X4, X5, X6, X7, key);
210 e8_rounds<3, 4>(X0, X1, X2, X3, X4, X5, X6, X7, key);
211 e8_rounds<5, 6>(X0, X1, X2, X3, X4, X5, X6, X7, key);
212 e8_rounds<7, 8>(X0, X1, X2, X3, X4, X5, X6, X7, key);
213 e8_rounds<9, 10>(X0, X1, X2, X3, X4, X5, X6, X7, key);
214 e8_rounds<11, 12>(X0, X1, X2, X3, X4, X5, X6, X7, key);
215 e8_rounds<13, 14>(X0, X1, X2, X3, X4, X5, X6, X7, key);
216 e8_rounds<15, 16>(X0, X1, X2, X3, X4, X5, X6, X7, key);
217 e8_rounds<17, 18>(X0, X1, X2, X3, X4, X5, X6, X7, key);
224 using namespace Threefish_F;
228 const Key_Inserter key(m_K.data(), m_T.data());
230 for(
size_t i = 0; i < blocks; ++i) {
231 uint64_t X0, X1, X2, X3, X4, X5, X6, X7;
234 key.d_add(18, X0, X1, X2, X3, X4, X5, X6, X7);
236 d8_rounds<17, 16>(X0, X1, X2, X3, X4, X5, X6, X7, key);
237 d8_rounds<15, 14>(X0, X1, X2, X3, X4, X5, X6, X7, key);
238 d8_rounds<13, 12>(X0, X1, X2, X3, X4, X5, X6, X7, key);
239 d8_rounds<11, 10>(X0, X1, X2, X3, X4, X5, X6, X7, key);
240 d8_rounds<9, 8>(X0, X1, X2, X3, X4, X5, X6, X7, key);
241 d8_rounds<7, 6>(X0, X1, X2, X3, X4, X5, X6, X7, key);
242 d8_rounds<5, 4>(X0, X1, X2, X3, X4, X5, X6, X7, key);
243 d8_rounds<3, 2>(X0, X1, X2, X3, X4, X5, X6, X7, key);
244 d8_rounds<1, 0>(X0, X1, X2, X3, X4, X5, X6, X7, key);