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