20 NAMESPACE_BEGIN(CryptoPP)
22 static const word64 KeccakF_RoundConstants[24] =
24 W64LIT(0x0000000000000001), W64LIT(0x0000000000008082), W64LIT(0x800000000000808a),
25 W64LIT(0x8000000080008000), W64LIT(0x000000000000808b), W64LIT(0x0000000080000001),
26 W64LIT(0x8000000080008081), W64LIT(0x8000000000008009), W64LIT(0x000000000000008a),
27 W64LIT(0x0000000000000088), W64LIT(0x0000000080008009), W64LIT(0x000000008000000a),
28 W64LIT(0x000000008000808b), W64LIT(0x800000000000008b), W64LIT(0x8000000000008089),
29 W64LIT(0x8000000000008003), W64LIT(0x8000000000008002), W64LIT(0x8000000000000080),
30 W64LIT(0x000000000000800a), W64LIT(0x800000008000000a), W64LIT(0x8000000080008081),
31 W64LIT(0x8000000000008080), W64LIT(0x0000000080000001), W64LIT(0x8000000080008008)
34 static void KeccakF1600(word64 *state)
37 word64 Aba, Abe, Abi, Abo, Abu;
38 word64 Aga, Age, Agi, Ago, Agu;
39 word64 Aka, Ake, Aki, Ako, Aku;
40 word64 Ama, Ame, Ami, Amo, Amu;
41 word64 Asa, Ase, Asi, Aso, Asu;
42 word64 BCa, BCe, BCi, BCo, BCu;
43 word64 Da, De, Di, Do, Du;
44 word64 Eba, Ebe, Ebi, Ebo, Ebu;
45 word64 Ega, Ege, Egi, Ego, Egu;
46 word64 Eka, Eke, Eki, Eko, Eku;
47 word64 Ema, Eme, Emi, Emo, Emu;
48 word64 Esa, Ese, Esi, Eso, Esu;
52 Block::Get(state)(Aba)(Abe)(Abi)(Abo)(Abu)(Aga)(Age)(Agi)(Ago)(Agu)(Aka)(Ake)(Aki)(Ako)(Aku)(Ama)(Ame)(Ami)(Amo)(Amu)(Asa)(Ase)(Asi)(Aso)(Asu);
54 for(
unsigned int round = 0; round < 24; round += 2 )
57 BCa = Aba^Aga^Aka^Ama^Asa;
58 BCe = Abe^Age^Ake^Ame^Ase;
59 BCi = Abi^Agi^Aki^Ami^Asi;
60 BCo = Abo^Ago^Ako^Amo^Aso;
61 BCu = Abu^Agu^Aku^Amu^Asu;
64 Da = BCu^rotlFixed(BCe, 1);
65 De = BCa^rotlFixed(BCi, 1);
66 Di = BCe^rotlFixed(BCo, 1);
67 Do = BCi^rotlFixed(BCu, 1);
68 Du = BCo^rotlFixed(BCa, 1);
73 BCe = rotlFixed(Age, 44);
75 BCi = rotlFixed(Aki, 43);
77 BCo = rotlFixed(Amo, 21);
79 BCu = rotlFixed(Asu, 14);
80 Eba = BCa ^((~BCe)& BCi );
81 Eba ^= (word64)KeccakF_RoundConstants[round];
82 Ebe = BCe ^((~BCi)& BCo );
83 Ebi = BCi ^((~BCo)& BCu );
84 Ebo = BCo ^((~BCu)& BCa );
85 Ebu = BCu ^((~BCa)& BCe );
88 BCa = rotlFixed(Abo, 28);
90 BCe = rotlFixed(Agu, 20);
92 BCi = rotlFixed(Aka, 3);
94 BCo = rotlFixed(Ame, 45);
96 BCu = rotlFixed(Asi, 61);
97 Ega = BCa ^((~BCe)& BCi );
98 Ege = BCe ^((~BCi)& BCo );
99 Egi = BCi ^((~BCo)& BCu );
100 Ego = BCo ^((~BCu)& BCa );
101 Egu = BCu ^((~BCa)& BCe );
104 BCa = rotlFixed(Abe, 1);
106 BCe = rotlFixed(Agi, 6);
108 BCi = rotlFixed(Ako, 25);
110 BCo = rotlFixed(Amu, 8);
112 BCu = rotlFixed(Asa, 18);
113 Eka = BCa ^((~BCe)& BCi );
114 Eke = BCe ^((~BCi)& BCo );
115 Eki = BCi ^((~BCo)& BCu );
116 Eko = BCo ^((~BCu)& BCa );
117 Eku = BCu ^((~BCa)& BCe );
120 BCa = rotlFixed(Abu, 27);
122 BCe = rotlFixed(Aga, 36);
124 BCi = rotlFixed(Ake, 10);
126 BCo = rotlFixed(Ami, 15);
128 BCu = rotlFixed(Aso, 56);
129 Ema = BCa ^((~BCe)& BCi );
130 Eme = BCe ^((~BCi)& BCo );
131 Emi = BCi ^((~BCo)& BCu );
132 Emo = BCo ^((~BCu)& BCa );
133 Emu = BCu ^((~BCa)& BCe );
136 BCa = rotlFixed(Abi, 62);
138 BCe = rotlFixed(Ago, 55);
140 BCi = rotlFixed(Aku, 39);
142 BCo = rotlFixed(Ama, 41);
144 BCu = rotlFixed(Ase, 2);
145 Esa = BCa ^((~BCe)& BCi );
146 Ese = BCe ^((~BCi)& BCo );
147 Esi = BCi ^((~BCo)& BCu );
148 Eso = BCo ^((~BCu)& BCa );
149 Esu = BCu ^((~BCa)& BCe );
152 BCa = Eba^Ega^Eka^Ema^Esa;
153 BCe = Ebe^Ege^Eke^Eme^Ese;
154 BCi = Ebi^Egi^Eki^Emi^Esi;
155 BCo = Ebo^Ego^Eko^Emo^Eso;
156 BCu = Ebu^Egu^Eku^Emu^Esu;
159 Da = BCu^rotlFixed(BCe, 1);
160 De = BCa^rotlFixed(BCi, 1);
161 Di = BCe^rotlFixed(BCo, 1);
162 Do = BCi^rotlFixed(BCu, 1);
163 Du = BCo^rotlFixed(BCa, 1);
168 BCe = rotlFixed(Ege, 44);
170 BCi = rotlFixed(Eki, 43);
172 BCo = rotlFixed(Emo, 21);
174 BCu = rotlFixed(Esu, 14);
175 Aba = BCa ^((~BCe)& BCi );
176 Aba ^= (word64)KeccakF_RoundConstants[round+1];
177 Abe = BCe ^((~BCi)& BCo );
178 Abi = BCi ^((~BCo)& BCu );
179 Abo = BCo ^((~BCu)& BCa );
180 Abu = BCu ^((~BCa)& BCe );
183 BCa = rotlFixed(Ebo, 28);
185 BCe = rotlFixed(Egu, 20);
187 BCi = rotlFixed(Eka, 3);
189 BCo = rotlFixed(Eme, 45);
191 BCu = rotlFixed(Esi, 61);
192 Aga = BCa ^((~BCe)& BCi );
193 Age = BCe ^((~BCi)& BCo );
194 Agi = BCi ^((~BCo)& BCu );
195 Ago = BCo ^((~BCu)& BCa );
196 Agu = BCu ^((~BCa)& BCe );
199 BCa = rotlFixed(Ebe, 1);
201 BCe = rotlFixed(Egi, 6);
203 BCi = rotlFixed(Eko, 25);
205 BCo = rotlFixed(Emu, 8);
207 BCu = rotlFixed(Esa, 18);
208 Aka = BCa ^((~BCe)& BCi );
209 Ake = BCe ^((~BCi)& BCo );
210 Aki = BCi ^((~BCo)& BCu );
211 Ako = BCo ^((~BCu)& BCa );
212 Aku = BCu ^((~BCa)& BCe );
215 BCa = rotlFixed(Ebu, 27);
217 BCe = rotlFixed(Ega, 36);
219 BCi = rotlFixed(Eke, 10);
221 BCo = rotlFixed(Emi, 15);
223 BCu = rotlFixed(Eso, 56);
224 Ama = BCa ^((~BCe)& BCi );
225 Ame = BCe ^((~BCi)& BCo );
226 Ami = BCi ^((~BCo)& BCu );
227 Amo = BCo ^((~BCu)& BCa );
228 Amu = BCu ^((~BCa)& BCe );
231 BCa = rotlFixed(Ebi, 62);
233 BCe = rotlFixed(Ego, 55);
235 BCi = rotlFixed(Eku, 39);
237 BCo = rotlFixed(Ema, 41);
239 BCu = rotlFixed(Ese, 2);
240 Asa = BCa ^((~BCe)& BCi );
241 Ase = BCe ^((~BCi)& BCo );
242 Asi = BCi ^((~BCo)& BCu );
243 Aso = BCo ^((~BCu)& BCa );
244 Asu = BCu ^((~BCa)& BCe );
248 Block::Put(NULL, state)(Aba)(Abe)(Abi)(Abo)(Abu)(Aga)(Age)(Agi)(Ago)(Agu)(Aka)(Ake)(Aki)(Ako)(Aku)(Ama)(Ame)(Ami)(Amo)(Amu)(Asa)(Ase)(Asi)(Aso)(Asu);
255 while (length >= (spaceLeft = r() - m_counter))
257 xorbuf(m_state.BytePtr() + m_counter, input, spaceLeft);
258 KeccakF1600(m_state);
264 xorbuf(m_state.BytePtr() + m_counter, input, length);
265 m_counter += (
unsigned int)length;
270 memset(m_state, 0, m_state.SizeInBytes());
276 ThrowIfInvalidTruncatedSize(size);
277 m_state.BytePtr()[m_counter] ^= 1;
278 m_state.BytePtr()[r()-1] ^= 0x80;
279 KeccakF1600(m_state);
280 memcpy(hash, m_state, size);