Skip to content

Commit 250dcce

Browse files
committed
crypto: combine Echo512's Shift and Mix operations
1 parent 71d6ef9 commit 250dcce

File tree

4 files changed

+49
-59
lines changed

4 files changed

+49
-59
lines changed

src/crypto/x11/dispatch.cpp

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ namespace sapphire {
1818
#if !defined(DISABLE_OPTIMIZED_SHA256)
1919
#if defined(ENABLE_SSSE3)
2020
namespace ssse3_echo {
21-
void MixColumns(uint64_t W[16][2]);
22-
void ShiftRows(uint64_t W[16][2]);
21+
void ShiftAndMix(uint64_t W[16][2]);
2322
} // namespace ssse3_echo
2423
#endif // ENABLE_SSSE3
2524

@@ -46,24 +45,21 @@ void RoundKeyless(uint32_t x0, uint32_t x1, uint32_t x2, uint32_t x3,
4645
} // namespace soft_aes
4746
namespace soft_echo {
4847
void FullStateRound(uint64_t W[16][2], uint32_t& k0, uint32_t& k1, uint32_t& k2, uint32_t& k3);
49-
void MixColumns(uint64_t W[16][2]);
50-
void ShiftRows(uint64_t W[16][2]);
48+
void ShiftAndMix(uint64_t W[16][2]);
5149
} // namespace soft_echo
5250
} // namespace sapphire
5351

5452
extern sapphire::dispatch::AESRoundFn aes_round;
5553
extern sapphire::dispatch::AESRoundFnNk aes_round_nk;
56-
extern sapphire::dispatch::EchoMixCols echo_mix_columns;
54+
extern sapphire::dispatch::EchoShiftMix echo_shift_mix;
5755
extern sapphire::dispatch::EchoRoundFn echo_round;
58-
extern sapphire::dispatch::EchoShiftRows echo_shift_rows;
5956

6057
void SapphireAutoDetect()
6158
{
6259
aes_round = sapphire::soft_aes::Round;
6360
aes_round_nk = sapphire::soft_aes::RoundKeyless;
6461
echo_round = sapphire::soft_echo::FullStateRound;
65-
echo_mix_columns = sapphire::soft_echo::MixColumns;
66-
echo_shift_rows = sapphire::soft_echo::ShiftRows;
62+
echo_shift_mix = sapphire::soft_echo::ShiftAndMix;
6763

6864
#if !defined(DISABLE_OPTIMIZED_SHA256)
6965
#if defined(HAVE_GETCPUID)
@@ -81,8 +77,7 @@ void SapphireAutoDetect()
8177
#if defined(ENABLE_SSSE3)
8278
const bool use_ssse3 = ((ecx >> 9) & 1);
8379
if (use_ssse3) {
84-
echo_mix_columns = sapphire::ssse3_echo::MixColumns;
85-
echo_shift_rows = sapphire::ssse3_echo::ShiftRows;
80+
echo_shift_mix = sapphire::ssse3_echo::ShiftAndMix;
8681
}
8782
#endif // ENABLE_SSSE3
8883
#endif // HAVE_GETCPUID

src/crypto/x11/dispatch.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,8 @@ typedef void (*AESRoundFn)(uint32_t, uint32_t, uint32_t, uint32_t,
1515
typedef void (*AESRoundFnNk)(uint32_t, uint32_t, uint32_t, uint32_t,
1616
uint32_t&, uint32_t&, uint32_t&, uint32_t&);
1717

18-
typedef void (*EchoMixCols)(uint64_t[16][2]);
1918
typedef void (*EchoRoundFn)(uint64_t[16][2], uint32_t&, uint32_t&, uint32_t&, uint32_t&);
20-
typedef void (*EchoShiftRows)(uint64_t[16][2]);
19+
typedef void (*EchoShiftMix)(uint64_t[16][2]);
2120
} // namespace dispatch
2221
} // namespace sapphire
2322

src/crypto/x11/echo.cpp

Lines changed: 37 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -75,41 +75,8 @@ void ALWAYS_INLINE MixColumn(sph_u64 W[16][2], int ia, int ib, int ic, int id)
7575
W[id][n] = abx ^ bcx ^ cdx ^ ab ^ c;
7676
}
7777
}
78-
} // anonymous namespace
79-
80-
void FullStateRound(sph_u64 W[16][2], sph_u32& K0, sph_u32& K1, sph_u32& K2, sph_u32& K3)
81-
{
82-
for (int n = 0; n < 16; n ++) {
83-
sph_u64 Wl = W[n][0];
84-
sph_u64 Wh = W[n][1];
85-
sph_u32 X0 = (sph_u32)Wl;
86-
sph_u32 X1 = (sph_u32)(Wl >> 32);
87-
sph_u32 X2 = (sph_u32)Wh;
88-
sph_u32 X3 = (sph_u32)(Wh >> 32);
89-
sph_u32 Y0, Y1, Y2, Y3;
90-
soft_aes::Round(X0, X1, X2, X3, K0, K1, K2, K3, Y0, Y1, Y2, Y3);
91-
soft_aes::RoundKeyless(Y0, Y1, Y2, Y3, X0, X1, X2, X3);
92-
W[n][0] = (sph_u64)X0 | ((sph_u64)X1 << 32);
93-
W[n][1] = (sph_u64)X2 | ((sph_u64)X3 << 32);
94-
if ((K0 = T32(K0 + 1)) == 0) {
95-
if ((K1 = T32(K1 + 1)) == 0) {
96-
if ((K2 = T32(K2 + 1)) == 0) {
97-
K3 = T32(K3 + 1);
98-
}
99-
}
100-
}
101-
}
102-
}
103-
104-
void MixColumns(uint64_t W[16][2])
105-
{
106-
MixColumn(W, 0, 1, 2, 3);
107-
MixColumn(W, 4, 5, 6, 7);
108-
MixColumn(W, 8, 9, 10, 11);
109-
MixColumn(W, 12, 13, 14, 15);
110-
}
11178

112-
void ShiftRows(uint64_t W[16][2])
79+
void ALWAYS_INLINE ShiftRows(uint64_t W[16][2])
11380
{
11481
#define SHIFT_ROW1(a, b, c, d) do { \
11582
sph_u64 tmp; \
@@ -151,12 +118,45 @@ void ShiftRows(uint64_t W[16][2])
151118
#undef SHIFT_ROW2
152119
#undef SHIFT_ROW3
153120
}
121+
} // anonymous namespace
122+
123+
void FullStateRound(sph_u64 W[16][2], sph_u32& K0, sph_u32& K1, sph_u32& K2, sph_u32& K3)
124+
{
125+
for (int n = 0; n < 16; n ++) {
126+
sph_u64 Wl = W[n][0];
127+
sph_u64 Wh = W[n][1];
128+
sph_u32 X0 = (sph_u32)Wl;
129+
sph_u32 X1 = (sph_u32)(Wl >> 32);
130+
sph_u32 X2 = (sph_u32)Wh;
131+
sph_u32 X3 = (sph_u32)(Wh >> 32);
132+
sph_u32 Y0, Y1, Y2, Y3;
133+
soft_aes::Round(X0, X1, X2, X3, K0, K1, K2, K3, Y0, Y1, Y2, Y3);
134+
soft_aes::RoundKeyless(Y0, Y1, Y2, Y3, X0, X1, X2, X3);
135+
W[n][0] = (sph_u64)X0 | ((sph_u64)X1 << 32);
136+
W[n][1] = (sph_u64)X2 | ((sph_u64)X3 << 32);
137+
if ((K0 = T32(K0 + 1)) == 0) {
138+
if ((K1 = T32(K1 + 1)) == 0) {
139+
if ((K2 = T32(K2 + 1)) == 0) {
140+
K3 = T32(K3 + 1);
141+
}
142+
}
143+
}
144+
}
145+
}
146+
147+
void ShiftAndMix(uint64_t W[16][2])
148+
{
149+
ShiftRows(W);
150+
MixColumn(W, 0, 1, 2, 3);
151+
MixColumn(W, 4, 5, 6, 7);
152+
MixColumn(W, 8, 9, 10, 11);
153+
MixColumn(W, 12, 13, 14, 15);
154+
}
154155
} // namespace soft_echo
155156
} // namespace sapphire
156157

157-
sapphire::dispatch::EchoMixCols echo_mix_columns = sapphire::soft_echo::MixColumns;
158158
sapphire::dispatch::EchoRoundFn echo_round = sapphire::soft_echo::FullStateRound;
159-
sapphire::dispatch::EchoShiftRows echo_shift_rows = sapphire::soft_echo::ShiftRows;
159+
sapphire::dispatch::EchoShiftMix echo_shift_mix = sapphire::soft_echo::ShiftAndMix;
160160

161161
#define DECL_STATE_BIG \
162162
alignas(16) sph_u64 W[16][2];
@@ -174,8 +174,7 @@ sapphire::dispatch::EchoShiftRows echo_shift_rows = sapphire::soft_echo::ShiftRo
174174

175175
#define BIG_ROUND do { \
176176
echo_round(W, K0, K1, K2, K3); \
177-
echo_shift_rows(W); \
178-
echo_mix_columns(W); \
177+
echo_shift_mix(W); \
179178
} while (0)
180179

181180
#define FINAL_BIG do { \

src/crypto/x11/ssse3/echo.cpp

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,7 @@ void ALWAYS_INLINE ShiftRow3(__m128i& Wa, __m128i& Wb, __m128i& Wc, __m128i& Wd)
8080
} // anonymous namespace
8181

8282
namespace ssse3_echo {
83-
void MixColumns(uint64_t W[16][2])
84-
{
85-
MixColumn(W, 0, 1, 2, 3);
86-
MixColumn(W, 4, 5, 6, 7);
87-
MixColumn(W, 8, 9, 10, 11);
88-
MixColumn(W, 12, 13, 14, 15);
89-
}
90-
91-
void ShiftRows(uint64_t W[16][2])
83+
void ShiftAndMix(uint64_t W[16][2])
9284
{
9385
alignas(16) __m128i w[16];
9486
w[0] = _mm_load_si128((const __m128i*)&W[0][0]);
@@ -128,6 +120,11 @@ void ShiftRows(uint64_t W[16][2])
128120
_mm_store_si128((__m128i*)&W[13][0], w[13]);
129121
_mm_store_si128((__m128i*)&W[14][0], w[14]);
130122
_mm_store_si128((__m128i*)&W[15][0], w[15]);
123+
124+
MixColumn(W, 0, 1, 2, 3);
125+
MixColumn(W, 4, 5, 6, 7);
126+
MixColumn(W, 8, 9, 10, 11);
127+
MixColumn(W, 12, 13, 14, 15);
131128
}
132129
} // namespace ssse3_echo
133130
} // namespace sapphire

0 commit comments

Comments
 (0)