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;
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 );
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 );
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 );
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 );
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;
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 );
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 );
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 );
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 );
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);
254 assert((input && length) || !(input || length));
259 while (length >= (spaceLeft = r() - m_counter))
263 KeccakF1600(m_state);
271 m_counter += (
unsigned int)length;
282 ThrowIfInvalidTruncatedSize(size);
283 m_state.
BytePtr()[m_counter] ^= 1;
284 m_state.
BytePtr()[r()-1] ^= 0x80;
285 KeccakF1600(m_state);
286 memcpy(hash, m_state, size);
T rotlFixed(T x, unsigned int y)
Performs a left rotate.
Classes for SHA-3 message digests.
void Restart()
Restart the hash.
void TruncatedFinal(byte *hash, size_t size)
Computes the hash of the current message.
void xorbuf(byte *buf, const byte *mask, size_t count)
Performs an XOR of a buffer with a mask.
void Update(const byte *input, size_t length)
Updates a hash with additional input.
Crypto++ library namespace.
size_type SizeInBytes() const
Provides the number of bytes in the SecBlock.
byte * BytePtr()
Provides a byte pointer to the first element in the memory block.