3333#include < crypto/x11/aes.h>
3434#include < crypto/x11/dispatch.h>
3535
36+ #include < attributes.h>
37+
3638#include < cstddef>
3739#include < cstring>
3840
5052
5153namespace sapphire {
5254namespace soft_echo {
55+ namespace {
56+ void ALWAYS_INLINE MixColumn (sph_u64 W[16 ][2 ], int ia, int ib, int ic, int id)
57+ {
58+ for (int n = 0 ; n < 2 ; n ++) {
59+ sph_u64 a = W[ia][n];
60+ sph_u64 b = W[ib][n];
61+ sph_u64 c = W[ic][n];
62+ sph_u64 d = W[id][n];
63+ sph_u64 ab = a ^ b;
64+ sph_u64 bc = b ^ c;
65+ sph_u64 cd = c ^ d;
66+ sph_u64 abx = ((ab & C64 (0x8080808080808080 )) >> 7 ) * 27U
67+ ^ ((ab & C64 (0x7F7F7F7F7F7F7F7F )) << 1 );
68+ sph_u64 bcx = ((bc & C64 (0x8080808080808080 )) >> 7 ) * 27U
69+ ^ ((bc & C64 (0x7F7F7F7F7F7F7F7F )) << 1 );
70+ sph_u64 cdx = ((cd & C64 (0x8080808080808080 )) >> 7 ) * 27U
71+ ^ ((cd & C64 (0x7F7F7F7F7F7F7F7F )) << 1 );
72+ W[ia][n] = abx ^ bc ^ d;
73+ W[ib][n] = bcx ^ a ^ cd;
74+ W[ic][n] = cdx ^ ab ^ d;
75+ W[id][n] = abx ^ bcx ^ cdx ^ ab ^ c;
76+ }
77+ }
78+ } // anonymous namespace
79+
5380void FullStateRound (sph_u64 W[16 ][2 ], sph_u32& K0, sph_u32& K1, sph_u32& K2, sph_u32& K3)
5481{
5582 for (int n = 0 ; n < 16 ; n ++) {
@@ -73,9 +100,18 @@ void FullStateRound(sph_u64 W[16][2], sph_u32& K0, sph_u32& K1, sph_u32& K2, sph
73100 }
74101 }
75102}
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+ }
76111} // namespace soft_echo
77112} // namespace sapphire
78113
114+ sapphire::dispatch::EchoMixCols echo_mix_columns = sapphire::soft_echo::MixColumns;
79115sapphire::dispatch::EchoRoundFn echo_round = sapphire::soft_echo::FullStateRound;
80116
81117#define DECL_STATE_BIG \
@@ -130,45 +166,10 @@ sapphire::dispatch::EchoRoundFn echo_round = sapphire::soft_echo::FullStateRound
130166 SHIFT_ROW3 (3 , 7 , 11 , 15 ); \
131167 } while (0 )
132168
133- static void
134- mix_column (sph_u64 W[16 ][2 ], int ia, int ib, int ic, int id)
135- {
136- int n;
137-
138- for (n = 0 ; n < 2 ; n ++) {
139- sph_u64 a = W[ia][n];
140- sph_u64 b = W[ib][n];
141- sph_u64 c = W[ic][n];
142- sph_u64 d = W[id][n];
143- sph_u64 ab = a ^ b;
144- sph_u64 bc = b ^ c;
145- sph_u64 cd = c ^ d;
146- sph_u64 abx = ((ab & C64 (0x8080808080808080 )) >> 7 ) * 27U
147- ^ ((ab & C64 (0x7F7F7F7F7F7F7F7F )) << 1 );
148- sph_u64 bcx = ((bc & C64 (0x8080808080808080 )) >> 7 ) * 27U
149- ^ ((bc & C64 (0x7F7F7F7F7F7F7F7F )) << 1 );
150- sph_u64 cdx = ((cd & C64 (0x8080808080808080 )) >> 7 ) * 27U
151- ^ ((cd & C64 (0x7F7F7F7F7F7F7F7F )) << 1 );
152- W[ia][n] = abx ^ bc ^ d;
153- W[ib][n] = bcx ^ a ^ cd;
154- W[ic][n] = cdx ^ ab ^ d;
155- W[id][n] = abx ^ bcx ^ cdx ^ ab ^ c;
156- }
157- }
158-
159- #define MIX_COLUMN (a, b, c, d ) mix_column(W, a, b, c, d)
160-
161- #define BIG_MIX_COLUMNS do { \
162- MIX_COLUMN (0 , 1 , 2 , 3 ); \
163- MIX_COLUMN (4 , 5 , 6 , 7 ); \
164- MIX_COLUMN (8 , 9 , 10 , 11 ); \
165- MIX_COLUMN (12 , 13 , 14 , 15 ); \
166- } while (0 )
167-
168169#define BIG_ROUND do { \
169170 echo_round (W, K0, K1, K2, K3); \
170171 BIG_SHIFT_ROWS; \
171- BIG_MIX_COLUMNS ; \
172+ echo_mix_columns (W) ; \
172173 } while (0 )
173174
174175#define FINAL_BIG do { \
0 commit comments