1 /* ethash: C/C++ implementation of Ethash, the Ethereum Proof of Work algorithm.
2 * Copyright 2018 Pawel Bylica.
3 * Licensed under the Apache License, Version 2.0. See the LICENSE file.
4 */
5
6 #include <stdint.h>
7
rol(uint32_t x,unsigned s)8 static uint32_t rol(uint32_t x, unsigned s)
9 {
10 return (x << s) | (x >> (32 - s));
11 }
12
13 static const uint32_t round_constants[22] = {
14 0x00000001,
15 0x00008082,
16 0x0000808A,
17 0x80008000,
18 0x0000808B,
19 0x80000001,
20 0x80008081,
21 0x00008009,
22 0x0000008A,
23 0x00000088,
24 0x80008009,
25 0x8000000A,
26 0x8000808B,
27 0x0000008B,
28 0x00008089,
29 0x00008003,
30 0x00008002,
31 0x00000080,
32 0x0000800A,
33 0x8000000A,
34 0x80008081,
35 0x00008080,
36 };
37
ethash_keccakf800(uint32_t state[25])38 void ethash_keccakf800(uint32_t state[25])
39 {
40 /* The implementation directly translated from ethash_keccakf1600. */
41
42 int round;
43
44 uint32_t Aba, Abe, Abi, Abo, Abu;
45 uint32_t Aga, Age, Agi, Ago, Agu;
46 uint32_t Aka, Ake, Aki, Ako, Aku;
47 uint32_t Ama, Ame, Ami, Amo, Amu;
48 uint32_t Asa, Ase, Asi, Aso, Asu;
49
50 uint32_t Eba, Ebe, Ebi, Ebo, Ebu;
51 uint32_t Ega, Ege, Egi, Ego, Egu;
52 uint32_t Eka, Eke, Eki, Eko, Eku;
53 uint32_t Ema, Eme, Emi, Emo, Emu;
54 uint32_t Esa, Ese, Esi, Eso, Esu;
55
56 uint32_t Ba, Be, Bi, Bo, Bu;
57
58 uint32_t Da, De, Di, Do, Du;
59
60 Aba = state[0];
61 Abe = state[1];
62 Abi = state[2];
63 Abo = state[3];
64 Abu = state[4];
65 Aga = state[5];
66 Age = state[6];
67 Agi = state[7];
68 Ago = state[8];
69 Agu = state[9];
70 Aka = state[10];
71 Ake = state[11];
72 Aki = state[12];
73 Ako = state[13];
74 Aku = state[14];
75 Ama = state[15];
76 Ame = state[16];
77 Ami = state[17];
78 Amo = state[18];
79 Amu = state[19];
80 Asa = state[20];
81 Ase = state[21];
82 Asi = state[22];
83 Aso = state[23];
84 Asu = state[24];
85
86 for (round = 0; round < 22; round += 2)
87 {
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, 12);
104 Bi = rol(Aki ^ Di, 11);
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, 13);
117 Bu = rol(Asi ^ Di, 29);
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, 4);
137 Bi = rol(Ake ^ De, 10);
138 Bo = rol(Ami ^ Di, 15);
139 Bu = rol(Aso ^ Do, 24);
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, 30);
147 Be = rol(Ago ^ Do, 23);
148 Bi = rol(Aku ^ Du, 7);
149 Bo = rol(Ama ^ Da, 9);
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
158 /* Round (round + 1): Exx -> Axx */
159
160 Ba = Eba ^ Ega ^ Eka ^ Ema ^ Esa;
161 Be = Ebe ^ Ege ^ Eke ^ Eme ^ Ese;
162 Bi = Ebi ^ Egi ^ Eki ^ Emi ^ Esi;
163 Bo = Ebo ^ Ego ^ Eko ^ Emo ^ Eso;
164 Bu = Ebu ^ Egu ^ Eku ^ Emu ^ Esu;
165
166 Da = Bu ^ rol(Be, 1);
167 De = Ba ^ rol(Bi, 1);
168 Di = Be ^ rol(Bo, 1);
169 Do = Bi ^ rol(Bu, 1);
170 Du = Bo ^ rol(Ba, 1);
171
172 Ba = Eba ^ Da;
173 Be = rol(Ege ^ De, 12);
174 Bi = rol(Eki ^ Di, 11);
175 Bo = rol(Emo ^ Do, 21);
176 Bu = rol(Esu ^ Du, 14);
177 Aba = Ba ^ (~Be & Bi) ^ round_constants[round + 1];
178 Abe = Be ^ (~Bi & Bo);
179 Abi = Bi ^ (~Bo & Bu);
180 Abo = Bo ^ (~Bu & Ba);
181 Abu = Bu ^ (~Ba & Be);
182
183 Ba = rol(Ebo ^ Do, 28);
184 Be = rol(Egu ^ Du, 20);
185 Bi = rol(Eka ^ Da, 3);
186 Bo = rol(Eme ^ De, 13);
187 Bu = rol(Esi ^ Di, 29);
188 Aga = Ba ^ (~Be & Bi);
189 Age = Be ^ (~Bi & Bo);
190 Agi = Bi ^ (~Bo & Bu);
191 Ago = Bo ^ (~Bu & Ba);
192 Agu = Bu ^ (~Ba & Be);
193
194 Ba = rol(Ebe ^ De, 1);
195 Be = rol(Egi ^ Di, 6);
196 Bi = rol(Eko ^ Do, 25);
197 Bo = rol(Emu ^ Du, 8);
198 Bu = rol(Esa ^ Da, 18);
199 Aka = Ba ^ (~Be & Bi);
200 Ake = Be ^ (~Bi & Bo);
201 Aki = Bi ^ (~Bo & Bu);
202 Ako = Bo ^ (~Bu & Ba);
203 Aku = Bu ^ (~Ba & Be);
204
205 Ba = rol(Ebu ^ Du, 27);
206 Be = rol(Ega ^ Da, 4);
207 Bi = rol(Eke ^ De, 10);
208 Bo = rol(Emi ^ Di, 15);
209 Bu = rol(Eso ^ Do, 24);
210 Ama = Ba ^ (~Be & Bi);
211 Ame = Be ^ (~Bi & Bo);
212 Ami = Bi ^ (~Bo & Bu);
213 Amo = Bo ^ (~Bu & Ba);
214 Amu = Bu ^ (~Ba & Be);
215
216 Ba = rol(Ebi ^ Di, 30);
217 Be = rol(Ego ^ Do, 23);
218 Bi = rol(Eku ^ Du, 7);
219 Bo = rol(Ema ^ Da, 9);
220 Bu = rol(Ese ^ De, 2);
221 Asa = Ba ^ (~Be & Bi);
222 Ase = Be ^ (~Bi & Bo);
223 Asi = Bi ^ (~Bo & Bu);
224 Aso = Bo ^ (~Bu & Ba);
225 Asu = Bu ^ (~Ba & Be);
226 }
227
228 state[0] = Aba;
229 state[1] = Abe;
230 state[2] = Abi;
231 state[3] = Abo;
232 state[4] = Abu;
233 state[5] = Aga;
234 state[6] = Age;
235 state[7] = Agi;
236 state[8] = Ago;
237 state[9] = Agu;
238 state[10] = Aka;
239 state[11] = Ake;
240 state[12] = Aki;
241 state[13] = Ako;
242 state[14] = Aku;
243 state[15] = Ama;
244 state[16] = Ame;
245 state[17] = Ami;
246 state[18] = Amo;
247 state[19] = Amu;
248 state[20] = Asa;
249 state[21] = Ase;
250 state[22] = Asi;
251 state[23] = Aso;
252 state[24] = Asu;
253 }
254