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: not started, auditors: [], date: YYYY-MM-DD }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
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 (x << s) | (x >> (64 - s));
18}
19
20static const uint64_t round_constants[24] = {
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
28void ethash_keccakf1600(uint64_t state[25]) NOEXCEPT
29{
30 /* The implementation based on the "simple" implementation by Ronny Van Keer. */
31
32 int round;
33
34 uint64_t Aba, Abe, Abi, Abo, Abu;
35 uint64_t Aga, Age, Agi, Ago, Agu;
36 uint64_t Aka, Ake, Aki, Ako, Aku;
37 uint64_t Ama, Ame, Ami, Amo, Amu;
38 uint64_t Asa, Ase, Asi, Aso, Asu;
39
40 uint64_t Eba, Ebe, Ebi, Ebo, Ebu;
41 uint64_t Ega, Ege, Egi, Ego, Egu;
42 uint64_t Eka, Eke, Eki, Eko, Eku;
43 uint64_t Ema, Eme, Emi, Emo, Emu;
44 uint64_t Esa, Ese, Esi, Eso, Esu;
45
46 uint64_t Ba, Be, Bi, Bo, Bu;
47
48 uint64_t Da, De, Di, Do, Du;
49
50 Aba = state[0];
51 Abe = state[1];
52 Abi = state[2];
53 Abo = state[3];
54 Abu = state[4];
55 Aga = state[5];
56 Age = state[6];
57 Agi = state[7];
58 Ago = state[8];
59 Agu = state[9];
60 Aka = state[10];
61 Ake = state[11];
62 Aki = state[12];
63 Ako = state[13];
64 Aku = state[14];
65 Ama = state[15];
66 Ame = state[16];
67 Ami = state[17];
68 Amo = state[18];
69 Amu = state[19];
70 Asa = state[20];
71 Ase = state[21];
72 Asi = state[22];
73 Aso = state[23];
74 Asu = state[24];
75
76 for (round = 0; round < 24; round += 2) {
77 /* Round (round + 0): Axx -> Exx */
78
79 Ba = Aba ^ Aga ^ Aka ^ Ama ^ Asa;
80 Be = Abe ^ Age ^ Ake ^ Ame ^ Ase;
81 Bi = Abi ^ Agi ^ Aki ^ Ami ^ Asi;
82 Bo = Abo ^ Ago ^ Ako ^ Amo ^ Aso;
83 Bu = Abu ^ Agu ^ Aku ^ Amu ^ Asu;
84
85 Da = Bu ^ rol(Be, 1);
86 De = Ba ^ rol(Bi, 1);
87 Di = Be ^ rol(Bo, 1);
88 Do = Bi ^ rol(Bu, 1);
89 Du = Bo ^ rol(Ba, 1);
90
91 Ba = Aba ^ Da;
92 Be = rol(Age ^ De, 44);
93 Bi = rol(Aki ^ Di, 43);
94 Bo = rol(Amo ^ Do, 21);
95 Bu = rol(Asu ^ Du, 14);
96 Eba = Ba ^ (~Be & Bi) ^ round_constants[round];
97 Ebe = Be ^ (~Bi & Bo);
98 Ebi = Bi ^ (~Bo & Bu);
99 Ebo = Bo ^ (~Bu & Ba);
100 Ebu = Bu ^ (~Ba & Be);
101
102 Ba = rol(Abo ^ Do, 28);
103 Be = rol(Agu ^ Du, 20);
104 Bi = rol(Aka ^ Da, 3);
105 Bo = rol(Ame ^ De, 45);
106 Bu = rol(Asi ^ Di, 61);
107 Ega = Ba ^ (~Be & Bi);
108 Ege = Be ^ (~Bi & Bo);
109 Egi = Bi ^ (~Bo & Bu);
110 Ego = Bo ^ (~Bu & Ba);
111 Egu = Bu ^ (~Ba & Be);
112
113 Ba = rol(Abe ^ De, 1);
114 Be = rol(Agi ^ Di, 6);
115 Bi = rol(Ako ^ Do, 25);
116 Bo = rol(Amu ^ Du, 8);
117 Bu = rol(Asa ^ Da, 18);
118 Eka = Ba ^ (~Be & Bi);
119 Eke = Be ^ (~Bi & Bo);
120 Eki = Bi ^ (~Bo & Bu);
121 Eko = Bo ^ (~Bu & Ba);
122 Eku = Bu ^ (~Ba & Be);
123
124 Ba = rol(Abu ^ Du, 27);
125 Be = rol(Aga ^ Da, 36);
126 Bi = rol(Ake ^ De, 10);
127 Bo = rol(Ami ^ Di, 15);
128 Bu = rol(Aso ^ Do, 56);
129 Ema = Ba ^ (~Be & Bi);
130 Eme = Be ^ (~Bi & Bo);
131 Emi = Bi ^ (~Bo & Bu);
132 Emo = Bo ^ (~Bu & Ba);
133 Emu = Bu ^ (~Ba & Be);
134
135 Ba = rol(Abi ^ Di, 62);
136 Be = rol(Ago ^ Do, 55);
137 Bi = rol(Aku ^ Du, 39);
138 Bo = rol(Ama ^ Da, 41);
139 Bu = rol(Ase ^ De, 2);
140 Esa = Ba ^ (~Be & Bi);
141 Ese = Be ^ (~Bi & Bo);
142 Esi = Bi ^ (~Bo & Bu);
143 Eso = Bo ^ (~Bu & Ba);
144 Esu = Bu ^ (~Ba & Be);
145
146 /* Round (round + 1): Exx -> Axx */
147
148 Ba = Eba ^ Ega ^ Eka ^ Ema ^ Esa;
149 Be = Ebe ^ Ege ^ Eke ^ Eme ^ Ese;
150 Bi = Ebi ^ Egi ^ Eki ^ Emi ^ Esi;
151 Bo = Ebo ^ Ego ^ Eko ^ Emo ^ Eso;
152 Bu = Ebu ^ Egu ^ Eku ^ Emu ^ Esu;
153
154 Da = Bu ^ rol(Be, 1);
155 De = Ba ^ rol(Bi, 1);
156 Di = Be ^ rol(Bo, 1);
157 Do = Bi ^ rol(Bu, 1);
158 Du = Bo ^ rol(Ba, 1);
159
160 Ba = Eba ^ Da;
161 Be = rol(Ege ^ De, 44);
162 Bi = rol(Eki ^ Di, 43);
163 Bo = rol(Emo ^ Do, 21);
164 Bu = rol(Esu ^ Du, 14);
165 Aba = Ba ^ (~Be & Bi) ^ round_constants[round + 1];
166 Abe = Be ^ (~Bi & Bo);
167 Abi = Bi ^ (~Bo & Bu);
168 Abo = Bo ^ (~Bu & Ba);
169 Abu = Bu ^ (~Ba & Be);
170
171 Ba = rol(Ebo ^ Do, 28);
172 Be = rol(Egu ^ Du, 20);
173 Bi = rol(Eka ^ Da, 3);
174 Bo = rol(Eme ^ De, 45);
175 Bu = rol(Esi ^ Di, 61);
176 Aga = Ba ^ (~Be & Bi);
177 Age = Be ^ (~Bi & Bo);
178 Agi = Bi ^ (~Bo & Bu);
179 Ago = Bo ^ (~Bu & Ba);
180 Agu = Bu ^ (~Ba & Be);
181
182 Ba = rol(Ebe ^ De, 1);
183 Be = rol(Egi ^ Di, 6);
184 Bi = rol(Eko ^ Do, 25);
185 Bo = rol(Emu ^ Du, 8);
186 Bu = rol(Esa ^ Da, 18);
187 Aka = Ba ^ (~Be & Bi);
188 Ake = Be ^ (~Bi & Bo);
189 Aki = Bi ^ (~Bo & Bu);
190 Ako = Bo ^ (~Bu & Ba);
191 Aku = Bu ^ (~Ba & Be);
192
193 Ba = rol(Ebu ^ Du, 27);
194 Be = rol(Ega ^ Da, 36);
195 Bi = rol(Eke ^ De, 10);
196 Bo = rol(Emi ^ Di, 15);
197 Bu = rol(Eso ^ Do, 56);
198 Ama = Ba ^ (~Be & Bi);
199 Ame = Be ^ (~Bi & Bo);
200 Ami = Bi ^ (~Bo & Bu);
201 Amo = Bo ^ (~Bu & Ba);
202 Amu = Bu ^ (~Ba & Be);
203
204 Ba = rol(Ebi ^ Di, 62);
205 Be = rol(Ego ^ Do, 55);
206 Bi = rol(Eku ^ Du, 39);
207 Bo = rol(Ema ^ Da, 41);
208 Bu = rol(Ese ^ De, 2);
209 Asa = Ba ^ (~Be & Bi);
210 Ase = Be ^ (~Bi & Bo);
211 Asi = Bi ^ (~Bo & Bu);
212 Aso = Bo ^ (~Bu & Ba);
213 Asu = Bu ^ (~Ba & Be);
214 }
215
216 state[0] = Aba;
217 state[1] = Abe;
218 state[2] = Abi;
219 state[3] = Abo;
220 state[4] = Abu;
221 state[5] = Aga;
222 state[6] = Age;
223 state[7] = Agi;
224 state[8] = Ago;
225 state[9] = Agu;
226 state[10] = Aka;
227 state[11] = Ake;
228 state[12] = Aki;
229 state[13] = Ako;
230 state[14] = Aku;
231 state[15] = Ama;
232 state[16] = Ame;
233 state[17] = Ami;
234 state[18] = Amo;
235 state[19] = Amu;
236 state[20] = Asa;
237 state[21] = Ase;
238 state[22] = Asi;
239 state[23] = Aso;
240 state[24] = Asu;
241}
#define NOEXCEPT
Definition keccak.hpp:21
void ethash_keccakf1600(uint64_t state[25]) NOEXCEPT