Coverage Report

Created: 2024-11-21 07:03

/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