Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
keccakf1600.cpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: Complete, auditors: [Nishat], commit: }
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
7/* ethash: C/C++ implementation of Ethash, the Ethereum Proof of Work algorithm.
8 * Copyright 2018-2019 Pawel Bylica.
9 * Licensed under the Apache License, Version 2.0.
10 */
11
12#include "keccak.hpp"
13#include <stdint.h>
14
15static uint64_t rol(uint64_t x, unsigned s)
16{
17 return (s == 0) ? x : ((x << s) | (x >> (64 - s)));
18}
19
20static const uint64_t round_constants[KECCAKF1600_ROUNDS] = {
21 0x0000000000000001, 0x0000000000008082, 0x800000000000808a, 0x8000000080008000, 0x000000000000808b,
22 0x0000000080000001, 0x8000000080008081, 0x8000000000008009, 0x000000000000008a, 0x0000000000000088,
23 0x0000000080008009, 0x000000008000000a, 0x000000008000808b, 0x800000000000008b, 0x8000000000008089,
24 0x8000000000008003, 0x8000000000008002, 0x8000000000000080, 0x000000000000800a, 0x800000008000000a,
25 0x8000000080008081, 0x8000000000008080, 0x0000000080000001, 0x8000000080008008,
26};
27
28// Keccak-f[1600] permutation (24 rounds), i.e. KECCAK-p[1600,24] in FIPS 202. State is 25 lanes of 64 bits, indexed as
29// state[x + 5*y]. Lane byte order is little-endian (per Keccak conventions).
30// The following are the Rho rotation offsets for each lane:
31// {0, 1, 62, 28, 27,
32// 36, 44, 6, 55, 20,
33// 3, 10, 43, 25, 39,
34// 41, 45, 15, 21, 8,
35// 18, 2, 61, 56, 14}
37{
38 /* The implementation based on the "simple" implementation by Ronny Van Keer. */
39
40 int round;
41
42 // A[x,y] = state[x + 5*y].
43 // Lane naming convention: Matrix A. Rows are {b,g,k,m,s} (i.e., y in {0,1,2,3,4}) and columns are {a,e,i,o,u}
44 // (i.e., x in {0,1,2,3,4}). For example, Aba = A[x=0,y=0], Abe = A[x=1,y=0].
45 uint64_t Aba, Abe, Abi, Abo, Abu;
46 uint64_t Aga, Age, Agi, Ago, Agu;
47 uint64_t Aka, Ake, Aki, Ako, Aku;
48 uint64_t Ama, Ame, Ami, Amo, Amu;
49 uint64_t Asa, Ase, Asi, Aso, Asu;
50
51 uint64_t Eba, Ebe, Ebi, Ebo, Ebu;
52 uint64_t Ega, Ege, Egi, Ego, Egu;
53 uint64_t Eka, Eke, Eki, Eko, Eku;
54 uint64_t Ema, Eme, Emi, Emo, Emu;
55 uint64_t Esa, Ese, Esi, Eso, Esu;
56
57 uint64_t Ba, Be, Bi, Bo, Bu;
58
59 uint64_t Da, De, Di, Do, Du;
60
61 Aba = state[0];
62 Abe = state[1];
63 Abi = state[2];
64 Abo = state[3];
65 Abu = state[4];
66 Aga = state[5];
67 Age = state[6];
68 Agi = state[7];
69 Ago = state[8];
70 Agu = state[9];
71 Aka = state[10];
72 Ake = state[11];
73 Aki = state[12];
74 Ako = state[13];
75 Aku = state[14];
76 Ama = state[15];
77 Ame = state[16];
78 Ami = state[17];
79 Amo = state[18];
80 Amu = state[19];
81 Asa = state[20];
82 Ase = state[21];
83 Asi = state[22];
84 Aso = state[23];
85 Asu = state[24];
86
87 for (round = 0; round < KECCAKF1600_ROUNDS; round += 2) {
88 /* Round (round + 0): Axx -> Exx */
89
90 Ba = Aba ^ Aga ^ Aka ^ Ama ^ Asa;
91 Be = Abe ^ Age ^ Ake ^ Ame ^ Ase;
92 Bi = Abi ^ Agi ^ Aki ^ Ami ^ Asi;
93 Bo = Abo ^ Ago ^ Ako ^ Amo ^ Aso;
94 Bu = Abu ^ Agu ^ Aku ^ Amu ^ Asu;
95
96 Da = Bu ^ rol(Be, 1);
97 De = Ba ^ rol(Bi, 1);
98 Di = Be ^ rol(Bo, 1);
99 Do = Bi ^ rol(Bu, 1);
100 Du = Bo ^ rol(Ba, 1);
101
102 Ba = Aba ^ Da;
103 Be = rol(Age ^ De, 44);
104 Bi = rol(Aki ^ Di, 43);
105 Bo = rol(Amo ^ Do, 21);
106 Bu = rol(Asu ^ Du, 14);
107 Eba = Ba ^ (~Be & Bi) ^ round_constants[round];
108 Ebe = Be ^ (~Bi & Bo);
109 Ebi = Bi ^ (~Bo & Bu);
110 Ebo = Bo ^ (~Bu & Ba);
111 Ebu = Bu ^ (~Ba & Be);
112
113 Ba = rol(Abo ^ Do, 28);
114 Be = rol(Agu ^ Du, 20);
115 Bi = rol(Aka ^ Da, 3);
116 Bo = rol(Ame ^ De, 45);
117 Bu = rol(Asi ^ Di, 61);
118 Ega = Ba ^ (~Be & Bi);
119 Ege = Be ^ (~Bi & Bo);
120 Egi = Bi ^ (~Bo & Bu);
121 Ego = Bo ^ (~Bu & Ba);
122 Egu = Bu ^ (~Ba & Be);
123
124 Ba = rol(Abe ^ De, 1);
125 Be = rol(Agi ^ Di, 6);
126 Bi = rol(Ako ^ Do, 25);
127 Bo = rol(Amu ^ Du, 8);
128 Bu = rol(Asa ^ Da, 18);
129 Eka = Ba ^ (~Be & Bi);
130 Eke = Be ^ (~Bi & Bo);
131 Eki = Bi ^ (~Bo & Bu);
132 Eko = Bo ^ (~Bu & Ba);
133 Eku = Bu ^ (~Ba & Be);
134
135 Ba = rol(Abu ^ Du, 27);
136 Be = rol(Aga ^ Da, 36);
137 Bi = rol(Ake ^ De, 10);
138 Bo = rol(Ami ^ Di, 15);
139 Bu = rol(Aso ^ Do, 56);
140 Ema = Ba ^ (~Be & Bi);
141 Eme = Be ^ (~Bi & Bo);
142 Emi = Bi ^ (~Bo & Bu);
143 Emo = Bo ^ (~Bu & Ba);
144 Emu = Bu ^ (~Ba & Be);
145
146 Ba = rol(Abi ^ Di, 62);
147 Be = rol(Ago ^ Do, 55);
148 Bi = rol(Aku ^ Du, 39);
149 Bo = rol(Ama ^ Da, 41);
150 Bu = rol(Ase ^ De, 2);
151 Esa = Ba ^ (~Be & Bi);
152 Ese = Be ^ (~Bi & Bo);
153 Esi = Bi ^ (~Bo & Bu);
154 Eso = Bo ^ (~Bu & Ba);
155 Esu = Bu ^ (~Ba & Be);
156
157 /* Round (round + 1): Exx -> Axx */
158
159 Ba = Eba ^ Ega ^ Eka ^ Ema ^ Esa;
160 Be = Ebe ^ Ege ^ Eke ^ Eme ^ Ese;
161 Bi = Ebi ^ Egi ^ Eki ^ Emi ^ Esi;
162 Bo = Ebo ^ Ego ^ Eko ^ Emo ^ Eso;
163 Bu = Ebu ^ Egu ^ Eku ^ Emu ^ Esu;
164
165 Da = Bu ^ rol(Be, 1);
166 De = Ba ^ rol(Bi, 1);
167 Di = Be ^ rol(Bo, 1);
168 Do = Bi ^ rol(Bu, 1);
169 Du = Bo ^ rol(Ba, 1);
170
171 Ba = Eba ^ Da;
172 Be = rol(Ege ^ De, 44);
173 Bi = rol(Eki ^ Di, 43);
174 Bo = rol(Emo ^ Do, 21);
175 Bu = rol(Esu ^ Du, 14);
176 Aba = Ba ^ (~Be & Bi) ^ round_constants[round + 1];
177 Abe = Be ^ (~Bi & Bo);
178 Abi = Bi ^ (~Bo & Bu);
179 Abo = Bo ^ (~Bu & Ba);
180 Abu = Bu ^ (~Ba & Be);
181
182 Ba = rol(Ebo ^ Do, 28);
183 Be = rol(Egu ^ Du, 20);
184 Bi = rol(Eka ^ Da, 3);
185 Bo = rol(Eme ^ De, 45);
186 Bu = rol(Esi ^ Di, 61);
187 Aga = Ba ^ (~Be & Bi);
188 Age = Be ^ (~Bi & Bo);
189 Agi = Bi ^ (~Bo & Bu);
190 Ago = Bo ^ (~Bu & Ba);
191 Agu = Bu ^ (~Ba & Be);
192
193 Ba = rol(Ebe ^ De, 1);
194 Be = rol(Egi ^ Di, 6);
195 Bi = rol(Eko ^ Do, 25);
196 Bo = rol(Emu ^ Du, 8);
197 Bu = rol(Esa ^ Da, 18);
198 Aka = Ba ^ (~Be & Bi);
199 Ake = Be ^ (~Bi & Bo);
200 Aki = Bi ^ (~Bo & Bu);
201 Ako = Bo ^ (~Bu & Ba);
202 Aku = Bu ^ (~Ba & Be);
203
204 Ba = rol(Ebu ^ Du, 27);
205 Be = rol(Ega ^ Da, 36);
206 Bi = rol(Eke ^ De, 10);
207 Bo = rol(Emi ^ Di, 15);
208 Bu = rol(Eso ^ Do, 56);
209 Ama = Ba ^ (~Be & Bi);
210 Ame = Be ^ (~Bi & Bo);
211 Ami = Bi ^ (~Bo & Bu);
212 Amo = Bo ^ (~Bu & Ba);
213 Amu = Bu ^ (~Ba & Be);
214
215 Ba = rol(Ebi ^ Di, 62);
216 Be = rol(Ego ^ Do, 55);
217 Bi = rol(Eku ^ Du, 39);
218 Bo = rol(Ema ^ Da, 41);
219 Bu = rol(Ese ^ De, 2);
220 Asa = Ba ^ (~Be & Bi);
221 Ase = Be ^ (~Bi & Bo);
222 Asi = Bi ^ (~Bo & Bu);
223 Aso = Bo ^ (~Bu & Ba);
224 Asu = Bu ^ (~Ba & Be);
225 }
226
227 state[0] = Aba;
228 state[1] = Abe;
229 state[2] = Abi;
230 state[3] = Abo;
231 state[4] = Abu;
232 state[5] = Aga;
233 state[6] = Age;
234 state[7] = Agi;
235 state[8] = Ago;
236 state[9] = Agu;
237 state[10] = Aka;
238 state[11] = Ake;
239 state[12] = Aki;
240 state[13] = Ako;
241 state[14] = Aku;
242 state[15] = Ama;
243 state[16] = Ame;
244 state[17] = Ami;
245 state[18] = Amo;
246 state[19] = Amu;
247 state[20] = Asa;
248 state[21] = Ase;
249 state[22] = Asi;
250 state[23] = Aso;
251 state[24] = Asu;
252}
#define NOEXCEPT
Definition keccak.hpp:24
void ethash_keccakf1600(uint64_t state[KECCAKF1600_LANES]) NOEXCEPT
@ KECCAKF1600_ROUNDS
@ KECCAKF1600_LANES