/src/cryptopp/keccak_core.cpp
Line | Count | Source |
1 | | // keccakc.cpp - Keccak core functions shared between SHA3 and Keccak. |
2 | | // written and placed in the public domain by JW. |
3 | | |
4 | | /* |
5 | | The Keccak sponge function, designed by Guido Bertoni, Joan Daemen, |
6 | | Michael Peeters and Gilles Van Assche. For more information, feedback or |
7 | | questions, please refer to our website: http://keccak.noekeon.org/ |
8 | | |
9 | | Implementation by Ronny Van Keer, hereby denoted as "the implementer". |
10 | | |
11 | | To the extent possible under law, the implementer has waived all copyright |
12 | | and related or neighboring rights to the source code in this file. |
13 | | http://creativecommons.org/publicdomain/zero/1.0/ |
14 | | */ |
15 | | |
16 | | #include "pch.h" |
17 | | #include "keccak.h" |
18 | | |
19 | | NAMESPACE_BEGIN(CryptoPP) |
20 | | |
21 | | // The Keccak core function |
22 | | extern void KeccakF1600(word64 *state); |
23 | | // The F1600 round constants |
24 | | extern const word64 KeccakF1600Constants[24]; |
25 | | |
26 | | NAMESPACE_END |
27 | | |
28 | | NAMESPACE_BEGIN(CryptoPP) |
29 | | |
30 | | CRYPTOPP_ALIGN_DATA(8) |
31 | | const word64 KeccakF1600Constants[24] = |
32 | | { |
33 | | W64LIT(0x0000000000000001), W64LIT(0x0000000000008082), |
34 | | W64LIT(0x800000000000808a), W64LIT(0x8000000080008000), |
35 | | W64LIT(0x000000000000808b), W64LIT(0x0000000080000001), |
36 | | W64LIT(0x8000000080008081), W64LIT(0x8000000000008009), |
37 | | W64LIT(0x000000000000008a), W64LIT(0x0000000000000088), |
38 | | W64LIT(0x0000000080008009), W64LIT(0x000000008000000a), |
39 | | W64LIT(0x000000008000808b), W64LIT(0x800000000000008b), |
40 | | W64LIT(0x8000000000008089), W64LIT(0x8000000000008003), |
41 | | W64LIT(0x8000000000008002), W64LIT(0x8000000000000080), |
42 | | W64LIT(0x000000000000800a), W64LIT(0x800000008000000a), |
43 | | W64LIT(0x8000000080008081), W64LIT(0x8000000000008080), |
44 | | W64LIT(0x0000000080000001), W64LIT(0x8000000080008008) |
45 | | }; |
46 | | |
47 | | void KeccakF1600(word64 *state) |
48 | 1.29M | { |
49 | 1.29M | word64 Aba, Abe, Abi, Abo, Abu; |
50 | 1.29M | word64 Aga, Age, Agi, Ago, Agu; |
51 | 1.29M | word64 Aka, Ake, Aki, Ako, Aku; |
52 | 1.29M | word64 Ama, Ame, Ami, Amo, Amu; |
53 | 1.29M | word64 Asa, Ase, Asi, Aso, Asu; |
54 | 1.29M | word64 BCa, BCe, BCi, BCo, BCu; |
55 | 1.29M | word64 Da, De, Di, Do, Du; |
56 | 1.29M | word64 Eba, Ebe, Ebi, Ebo, Ebu; |
57 | 1.29M | word64 Ega, Ege, Egi, Ego, Egu; |
58 | 1.29M | word64 Eka, Eke, Eki, Eko, Eku; |
59 | 1.29M | word64 Ema, Eme, Emi, Emo, Emu; |
60 | 1.29M | word64 Esa, Ese, Esi, Eso, Esu; |
61 | | |
62 | 1.29M | typedef BlockGetAndPut<word64, LittleEndian, true, true> Block; |
63 | 1.29M | 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); |
64 | | |
65 | 16.8M | for( unsigned int round = 0; round < 24; round += 2 ) |
66 | 15.5M | { |
67 | | // prepareTheta |
68 | 15.5M | BCa = Aba^Aga^Aka^Ama^Asa; |
69 | 15.5M | BCe = Abe^Age^Ake^Ame^Ase; |
70 | 15.5M | BCi = Abi^Agi^Aki^Ami^Asi; |
71 | 15.5M | BCo = Abo^Ago^Ako^Amo^Aso; |
72 | 15.5M | BCu = Abu^Agu^Aku^Amu^Asu; |
73 | | |
74 | | //thetaRhoPiChiIotaPrepareTheta(round , A, E) |
75 | 15.5M | Da = BCu^rotlConstant<1>(BCe); |
76 | 15.5M | De = BCa^rotlConstant<1>(BCi); |
77 | 15.5M | Di = BCe^rotlConstant<1>(BCo); |
78 | 15.5M | Do = BCi^rotlConstant<1>(BCu); |
79 | 15.5M | Du = BCo^rotlConstant<1>(BCa); |
80 | | |
81 | 15.5M | Aba ^= Da; |
82 | 15.5M | BCa = Aba; |
83 | 15.5M | Age ^= De; |
84 | 15.5M | BCe = rotlConstant<44>(Age); |
85 | 15.5M | Aki ^= Di; |
86 | 15.5M | BCi = rotlConstant<43>(Aki); |
87 | 15.5M | Amo ^= Do; |
88 | 15.5M | BCo = rotlConstant<21>(Amo); |
89 | 15.5M | Asu ^= Du; |
90 | 15.5M | BCu = rotlConstant<14>(Asu); |
91 | 15.5M | Eba = BCa ^((~BCe)& BCi ); |
92 | 15.5M | Eba ^= KeccakF1600Constants[round]; |
93 | 15.5M | Ebe = BCe ^((~BCi)& BCo ); |
94 | 15.5M | Ebi = BCi ^((~BCo)& BCu ); |
95 | 15.5M | Ebo = BCo ^((~BCu)& BCa ); |
96 | 15.5M | Ebu = BCu ^((~BCa)& BCe ); |
97 | | |
98 | 15.5M | Abo ^= Do; |
99 | 15.5M | BCa = rotlConstant<28>(Abo); |
100 | 15.5M | Agu ^= Du; |
101 | 15.5M | BCe = rotlConstant<20>(Agu); |
102 | 15.5M | Aka ^= Da; |
103 | 15.5M | BCi = rotlConstant<3>(Aka); |
104 | 15.5M | Ame ^= De; |
105 | 15.5M | BCo = rotlConstant<45>(Ame); |
106 | 15.5M | Asi ^= Di; |
107 | 15.5M | BCu = rotlConstant<61>(Asi); |
108 | 15.5M | Ega = BCa ^((~BCe)& BCi ); |
109 | 15.5M | Ege = BCe ^((~BCi)& BCo ); |
110 | 15.5M | Egi = BCi ^((~BCo)& BCu ); |
111 | 15.5M | Ego = BCo ^((~BCu)& BCa ); |
112 | 15.5M | Egu = BCu ^((~BCa)& BCe ); |
113 | | |
114 | 15.5M | Abe ^= De; |
115 | 15.5M | BCa = rotlConstant<1>(Abe); |
116 | 15.5M | Agi ^= Di; |
117 | 15.5M | BCe = rotlConstant<6>(Agi); |
118 | 15.5M | Ako ^= Do; |
119 | 15.5M | BCi = rotlConstant<25>(Ako); |
120 | 15.5M | Amu ^= Du; |
121 | 15.5M | BCo = rotlConstant<8>(Amu); |
122 | 15.5M | Asa ^= Da; |
123 | 15.5M | BCu = rotlConstant<18>(Asa); |
124 | 15.5M | Eka = BCa ^((~BCe)& BCi ); |
125 | 15.5M | Eke = BCe ^((~BCi)& BCo ); |
126 | 15.5M | Eki = BCi ^((~BCo)& BCu ); |
127 | 15.5M | Eko = BCo ^((~BCu)& BCa ); |
128 | 15.5M | Eku = BCu ^((~BCa)& BCe ); |
129 | | |
130 | 15.5M | Abu ^= Du; |
131 | 15.5M | BCa = rotlConstant<27>(Abu); |
132 | 15.5M | Aga ^= Da; |
133 | 15.5M | BCe = rotlConstant<36>(Aga); |
134 | 15.5M | Ake ^= De; |
135 | 15.5M | BCi = rotlConstant<10>(Ake); |
136 | 15.5M | Ami ^= Di; |
137 | 15.5M | BCo = rotlConstant<15>(Ami); |
138 | 15.5M | Aso ^= Do; |
139 | 15.5M | BCu = rotlConstant<56>(Aso); |
140 | 15.5M | Ema = BCa ^((~BCe)& BCi ); |
141 | 15.5M | Eme = BCe ^((~BCi)& BCo ); |
142 | 15.5M | Emi = BCi ^((~BCo)& BCu ); |
143 | 15.5M | Emo = BCo ^((~BCu)& BCa ); |
144 | 15.5M | Emu = BCu ^((~BCa)& BCe ); |
145 | | |
146 | 15.5M | Abi ^= Di; |
147 | 15.5M | BCa = rotlConstant<62>(Abi); |
148 | 15.5M | Ago ^= Do; |
149 | 15.5M | BCe = rotlConstant<55>(Ago); |
150 | 15.5M | Aku ^= Du; |
151 | 15.5M | BCi = rotlConstant<39>(Aku); |
152 | 15.5M | Ama ^= Da; |
153 | 15.5M | BCo = rotlConstant<41>(Ama); |
154 | 15.5M | Ase ^= De; |
155 | 15.5M | BCu = rotlConstant<2>(Ase); |
156 | 15.5M | Esa = BCa ^((~BCe)& BCi ); |
157 | 15.5M | Ese = BCe ^((~BCi)& BCo ); |
158 | 15.5M | Esi = BCi ^((~BCo)& BCu ); |
159 | 15.5M | Eso = BCo ^((~BCu)& BCa ); |
160 | 15.5M | Esu = BCu ^((~BCa)& BCe ); |
161 | | |
162 | | // prepareTheta |
163 | 15.5M | BCa = Eba^Ega^Eka^Ema^Esa; |
164 | 15.5M | BCe = Ebe^Ege^Eke^Eme^Ese; |
165 | 15.5M | BCi = Ebi^Egi^Eki^Emi^Esi; |
166 | 15.5M | BCo = Ebo^Ego^Eko^Emo^Eso; |
167 | 15.5M | BCu = Ebu^Egu^Eku^Emu^Esu; |
168 | | |
169 | | //thetaRhoPiChiIotaPrepareTheta(round+1, E, A) |
170 | 15.5M | Da = BCu^rotlConstant<1>(BCe); |
171 | 15.5M | De = BCa^rotlConstant<1>(BCi); |
172 | 15.5M | Di = BCe^rotlConstant<1>(BCo); |
173 | 15.5M | Do = BCi^rotlConstant<1>(BCu); |
174 | 15.5M | Du = BCo^rotlConstant<1>(BCa); |
175 | | |
176 | 15.5M | Eba ^= Da; |
177 | 15.5M | BCa = Eba; |
178 | 15.5M | Ege ^= De; |
179 | 15.5M | BCe = rotlConstant<44>(Ege); |
180 | 15.5M | Eki ^= Di; |
181 | 15.5M | BCi = rotlConstant<43>(Eki); |
182 | 15.5M | Emo ^= Do; |
183 | 15.5M | BCo = rotlConstant<21>(Emo); |
184 | 15.5M | Esu ^= Du; |
185 | 15.5M | BCu = rotlConstant<14>(Esu); |
186 | 15.5M | Aba = BCa ^((~BCe)& BCi ); |
187 | 15.5M | Aba ^= KeccakF1600Constants[round+1]; |
188 | 15.5M | Abe = BCe ^((~BCi)& BCo ); |
189 | 15.5M | Abi = BCi ^((~BCo)& BCu ); |
190 | 15.5M | Abo = BCo ^((~BCu)& BCa ); |
191 | 15.5M | Abu = BCu ^((~BCa)& BCe ); |
192 | | |
193 | 15.5M | Ebo ^= Do; |
194 | 15.5M | BCa = rotlConstant<28>(Ebo); |
195 | 15.5M | Egu ^= Du; |
196 | 15.5M | BCe = rotlConstant<20>(Egu); |
197 | 15.5M | Eka ^= Da; |
198 | 15.5M | BCi = rotlConstant<3>(Eka); |
199 | 15.5M | Eme ^= De; |
200 | 15.5M | BCo = rotlConstant<45>(Eme); |
201 | 15.5M | Esi ^= Di; |
202 | 15.5M | BCu = rotlConstant<61>(Esi); |
203 | 15.5M | Aga = BCa ^((~BCe)& BCi ); |
204 | 15.5M | Age = BCe ^((~BCi)& BCo ); |
205 | 15.5M | Agi = BCi ^((~BCo)& BCu ); |
206 | 15.5M | Ago = BCo ^((~BCu)& BCa ); |
207 | 15.5M | Agu = BCu ^((~BCa)& BCe ); |
208 | | |
209 | 15.5M | Ebe ^= De; |
210 | 15.5M | BCa = rotlConstant<1>(Ebe); |
211 | 15.5M | Egi ^= Di; |
212 | 15.5M | BCe = rotlConstant<6>(Egi); |
213 | 15.5M | Eko ^= Do; |
214 | 15.5M | BCi = rotlConstant<25>(Eko); |
215 | 15.5M | Emu ^= Du; |
216 | 15.5M | BCo = rotlConstant<8>(Emu); |
217 | 15.5M | Esa ^= Da; |
218 | 15.5M | BCu = rotlConstant<18>(Esa); |
219 | 15.5M | Aka = BCa ^((~BCe)& BCi ); |
220 | 15.5M | Ake = BCe ^((~BCi)& BCo ); |
221 | 15.5M | Aki = BCi ^((~BCo)& BCu ); |
222 | 15.5M | Ako = BCo ^((~BCu)& BCa ); |
223 | 15.5M | Aku = BCu ^((~BCa)& BCe ); |
224 | | |
225 | 15.5M | Ebu ^= Du; |
226 | 15.5M | BCa = rotlConstant<27>(Ebu); |
227 | 15.5M | Ega ^= Da; |
228 | 15.5M | BCe = rotlConstant<36>(Ega); |
229 | 15.5M | Eke ^= De; |
230 | 15.5M | BCi = rotlConstant<10>(Eke); |
231 | 15.5M | Emi ^= Di; |
232 | 15.5M | BCo = rotlConstant<15>(Emi); |
233 | 15.5M | Eso ^= Do; |
234 | 15.5M | BCu = rotlConstant<56>(Eso); |
235 | 15.5M | Ama = BCa ^((~BCe)& BCi ); |
236 | 15.5M | Ame = BCe ^((~BCi)& BCo ); |
237 | 15.5M | Ami = BCi ^((~BCo)& BCu ); |
238 | 15.5M | Amo = BCo ^((~BCu)& BCa ); |
239 | 15.5M | Amu = BCu ^((~BCa)& BCe ); |
240 | | |
241 | 15.5M | Ebi ^= Di; |
242 | 15.5M | BCa = rotlConstant<62>(Ebi); |
243 | 15.5M | Ego ^= Do; |
244 | 15.5M | BCe = rotlConstant<55>(Ego); |
245 | 15.5M | Eku ^= Du; |
246 | 15.5M | BCi = rotlConstant<39>(Eku); |
247 | 15.5M | Ema ^= Da; |
248 | 15.5M | BCo = rotlConstant<41>(Ema); |
249 | 15.5M | Ese ^= De; |
250 | 15.5M | BCu = rotlConstant<2>(Ese); |
251 | 15.5M | Asa = BCa ^((~BCe)& BCi ); |
252 | 15.5M | Ase = BCe ^((~BCi)& BCo ); |
253 | 15.5M | Asi = BCi ^((~BCo)& BCu ); |
254 | 15.5M | Aso = BCo ^((~BCu)& BCa ); |
255 | 15.5M | Asu = BCu ^((~BCa)& BCe ); |
256 | 15.5M | } |
257 | | |
258 | 1.29M | Block::Put(NULLPTR, 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); |
259 | 1.29M | } |
260 | | |
261 | | NAMESPACE_END |