@@ -30,48 +30,81 @@ void KeccakF(uint64_t (&st)[25])
30
30
0x8000000000008002 , 0x8000000000000080 , 0x000000000000800a , 0x800000008000000a ,
31
31
0x8000000080008081 , 0x8000000000008080 , 0x0000000080000001 , 0x8000000080008008
32
32
};
33
- static constexpr int ROTC[24 ] = {
34
- 1 , 3 , 6 , 10 , 15 , 21 , 28 , 36 , 45 , 55 , 2 , 14 ,
35
- 27 , 41 , 56 , 8 , 25 , 43 , 62 , 18 , 39 , 61 , 20 , 44
36
- };
37
- static constexpr int PILN[24 ] = {
38
- 10 , 7 , 11 , 17 , 18 , 3 , 5 , 16 , 8 , 21 , 24 , 4 ,
39
- 15 , 23 , 19 , 13 , 12 , 2 , 20 , 14 , 22 , 9 , 6 , 1
40
- };
41
33
static constexpr int ROUNDS = 24 ;
42
34
43
35
for (int round = 0 ; round < ROUNDS; ++round) {
44
- uint64_t bc[ 5 ] , t;
36
+ uint64_t bc0, bc1, bc2, bc3, bc4 , t;
45
37
46
38
// Theta
47
- for (int i = 0 ; i < 5 ; i++) {
48
- bc[i] = st[i] ^ st[i + 5 ] ^ st[i + 10 ] ^ st[i + 15 ] ^ st[i + 20 ];
49
- }
50
-
51
- for (int i = 0 ; i < 5 ; i++) {
52
- t = bc[(i + 4 ) % 5 ] ^ Rotl (bc[(i + 1 ) % 5 ], 1 );
53
- for (int j = 0 ; j < 25 ; j += 5 ) st[j + i] ^= t;
54
- }
39
+ bc0 = st[0 ] ^ st[5 ] ^ st[10 ] ^ st[15 ] ^ st[20 ];
40
+ bc1 = st[1 ] ^ st[6 ] ^ st[11 ] ^ st[16 ] ^ st[21 ];
41
+ bc2 = st[2 ] ^ st[7 ] ^ st[12 ] ^ st[17 ] ^ st[22 ];
42
+ bc3 = st[3 ] ^ st[8 ] ^ st[13 ] ^ st[18 ] ^ st[23 ];
43
+ bc4 = st[4 ] ^ st[9 ] ^ st[14 ] ^ st[19 ] ^ st[24 ];
44
+ t = bc4 ^ Rotl (bc1, 1 ); st[0 ] ^= t; st[5 ] ^= t; st[10 ] ^= t; st[15 ] ^= t; st[20 ] ^= t;
45
+ t = bc0 ^ Rotl (bc2, 1 ); st[1 ] ^= t; st[6 ] ^= t; st[11 ] ^= t; st[16 ] ^= t; st[21 ] ^= t;
46
+ t = bc1 ^ Rotl (bc3, 1 ); st[2 ] ^= t; st[7 ] ^= t; st[12 ] ^= t; st[17 ] ^= t; st[22 ] ^= t;
47
+ t = bc2 ^ Rotl (bc4, 1 ); st[3 ] ^= t; st[8 ] ^= t; st[13 ] ^= t; st[18 ] ^= t; st[23 ] ^= t;
48
+ t = bc3 ^ Rotl (bc0, 1 ); st[4 ] ^= t; st[9 ] ^= t; st[14 ] ^= t; st[19 ] ^= t; st[24 ] ^= t;
55
49
56
50
// Rho Pi
57
51
t = st[1 ];
58
- for (int i = 0 ; i < 24 ; i++) {
59
- int j = PILN[i];
60
- bc[0 ] = st[j];
61
- st[j] = Rotl (t, ROTC[i]);
62
- t = bc[0 ];
63
- }
64
-
65
- // Chi
66
- for (int j = 0 ; j < 25 ; j += 5 ) {
67
- for (int i = 0 ; i < 5 ; i++) bc[i] = st[j + i];
68
- for (int i = 0 ; i < 5 ; i++) {
69
- st[j + i] ^= (~bc[(i + 1 ) % 5 ]) & bc[(i + 2 ) % 5 ];
70
- }
71
- }
52
+ bc0 = st[10 ]; st[10 ] = Rotl (t, 1 ); t = bc0;
53
+ bc0 = st[7 ]; st[7 ] = Rotl (t, 3 ); t = bc0;
54
+ bc0 = st[11 ]; st[11 ] = Rotl (t, 6 ); t = bc0;
55
+ bc0 = st[17 ]; st[17 ] = Rotl (t, 10 ); t = bc0;
56
+ bc0 = st[18 ]; st[18 ] = Rotl (t, 15 ); t = bc0;
57
+ bc0 = st[3 ]; st[3 ] = Rotl (t, 21 ); t = bc0;
58
+ bc0 = st[5 ]; st[5 ] = Rotl (t, 28 ); t = bc0;
59
+ bc0 = st[16 ]; st[16 ] = Rotl (t, 36 ); t = bc0;
60
+ bc0 = st[8 ]; st[8 ] = Rotl (t, 45 ); t = bc0;
61
+ bc0 = st[21 ]; st[21 ] = Rotl (t, 55 ); t = bc0;
62
+ bc0 = st[24 ]; st[24 ] = Rotl (t, 2 ); t = bc0;
63
+ bc0 = st[4 ]; st[4 ] = Rotl (t, 14 ); t = bc0;
64
+ bc0 = st[15 ]; st[15 ] = Rotl (t, 27 ); t = bc0;
65
+ bc0 = st[23 ]; st[23 ] = Rotl (t, 41 ); t = bc0;
66
+ bc0 = st[19 ]; st[19 ] = Rotl (t, 56 ); t = bc0;
67
+ bc0 = st[13 ]; st[13 ] = Rotl (t, 8 ); t = bc0;
68
+ bc0 = st[12 ]; st[12 ] = Rotl (t, 25 ); t = bc0;
69
+ bc0 = st[2 ]; st[2 ] = Rotl (t, 43 ); t = bc0;
70
+ bc0 = st[20 ]; st[20 ] = Rotl (t, 62 ); t = bc0;
71
+ bc0 = st[14 ]; st[14 ] = Rotl (t, 18 ); t = bc0;
72
+ bc0 = st[22 ]; st[22 ] = Rotl (t, 39 ); t = bc0;
73
+ bc0 = st[9 ]; st[9 ] = Rotl (t, 61 ); t = bc0;
74
+ bc0 = st[6 ]; st[6 ] = Rotl (t, 20 ); t = bc0;
75
+ st[1 ] = Rotl (t, 44 );
72
76
73
- // Iota
74
- st[0 ] ^= RNDC[round];
77
+ // Chi Iota
78
+ bc0 = st[0 ]; bc1 = st[1 ]; bc2 = st[2 ]; bc3 = st[3 ]; bc4 = st[4 ];
79
+ st[0 ] = bc0 ^ (~bc1 & bc2) ^ RNDC[round];
80
+ st[1 ] = bc1 ^ (~bc2 & bc3);
81
+ st[2 ] = bc2 ^ (~bc3 & bc4);
82
+ st[3 ] = bc3 ^ (~bc4 & bc0);
83
+ st[4 ] = bc4 ^ (~bc0 & bc1);
84
+ bc0 = st[5 ]; bc1 = st[6 ]; bc2 = st[7 ]; bc3 = st[8 ]; bc4 = st[9 ];
85
+ st[5 ] = bc0 ^ (~bc1 & bc2);
86
+ st[6 ] = bc1 ^ (~bc2 & bc3);
87
+ st[7 ] = bc2 ^ (~bc3 & bc4);
88
+ st[8 ] = bc3 ^ (~bc4 & bc0);
89
+ st[9 ] = bc4 ^ (~bc0 & bc1);
90
+ bc0 = st[10 ]; bc1 = st[11 ]; bc2 = st[12 ]; bc3 = st[13 ]; bc4 = st[14 ];
91
+ st[10 ] = bc0 ^ (~bc1 & bc2);
92
+ st[11 ] = bc1 ^ (~bc2 & bc3);
93
+ st[12 ] = bc2 ^ (~bc3 & bc4);
94
+ st[13 ] = bc3 ^ (~bc4 & bc0);
95
+ st[14 ] = bc4 ^ (~bc0 & bc1);
96
+ bc0 = st[15 ]; bc1 = st[16 ]; bc2 = st[17 ]; bc3 = st[18 ]; bc4 = st[19 ];
97
+ st[15 ] = bc0 ^ (~bc1 & bc2);
98
+ st[16 ] = bc1 ^ (~bc2 & bc3);
99
+ st[17 ] = bc2 ^ (~bc3 & bc4);
100
+ st[18 ] = bc3 ^ (~bc4 & bc0);
101
+ st[19 ] = bc4 ^ (~bc0 & bc1);
102
+ bc0 = st[20 ]; bc1 = st[21 ]; bc2 = st[22 ]; bc3 = st[23 ]; bc4 = st[24 ];
103
+ st[20 ] = bc0 ^ (~bc1 & bc2);
104
+ st[21 ] = bc1 ^ (~bc2 & bc3);
105
+ st[22 ] = bc2 ^ (~bc3 & bc4);
106
+ st[23 ] = bc3 ^ (~bc4 & bc0);
107
+ st[24 ] = bc4 ^ (~bc0 & bc1);
75
108
}
76
109
}
77
110
0 commit comments