12 #if defined(__x86_64__) || defined(__amd64__) || defined(__i386__) 17 void Transform(uint32_t* s,
const unsigned char* chunk,
size_t blocks);
39 void Transform(uint32_t* s,
const unsigned char* chunk,
size_t blocks);
48 uint32_t
inline Ch(uint32_t x, uint32_t y, uint32_t z) {
return z ^ (x & (y ^ z)); }
49 uint32_t
inline Maj(uint32_t x, uint32_t y, uint32_t z) {
return (x & y) | (z & (x | y)); }
50 uint32_t
inline Sigma0(uint32_t x) {
return (x >> 2 | x << 30) ^ (x >> 13 | x << 19) ^ (x >> 22 | x << 10); }
51 uint32_t
inline Sigma1(uint32_t x) {
return (x >> 6 | x << 26) ^ (x >> 11 | x << 21) ^ (x >> 25 | x << 7); }
52 uint32_t
inline sigma0(uint32_t x) {
return (x >> 7 | x << 25) ^ (x >> 18 | x << 14) ^ (x >> 3); }
53 uint32_t
inline sigma1(uint32_t x) {
return (x >> 17 | x << 15) ^ (x >> 19 | x << 13) ^ (x >> 10); }
56 void inline Round(uint32_t a, uint32_t b, uint32_t c, uint32_t& d, uint32_t e, uint32_t f, uint32_t g, uint32_t& h, uint32_t k)
58 uint32_t t1 = h +
Sigma1(e) +
Ch(e, f, g) + k;
65 void inline Initialize(uint32_t* s)
78 void Transform(uint32_t* s,
const unsigned char* chunk,
size_t blocks)
81 uint32_t a = s[0], b = s[1], c = s[2], d = s[3], e = s[4], f = s[5], g = s[6], h = s[7];
82 uint32_t w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15;
84 Round(a, b, c, d, e, f, g, h, 0x428a2f98 + (w0 =
ReadBE32(chunk + 0)));
85 Round(h, a, b, c, d, e, f, g, 0x71374491 + (w1 =
ReadBE32(chunk + 4)));
86 Round(g, h, a, b, c, d, e, f, 0xb5c0fbcf + (w2 =
ReadBE32(chunk + 8)));
87 Round(f, g, h, a, b, c, d, e, 0xe9b5dba5 + (w3 =
ReadBE32(chunk + 12)));
88 Round(e, f, g, h, a, b, c, d, 0x3956c25b + (w4 =
ReadBE32(chunk + 16)));
89 Round(d, e, f, g, h, a, b, c, 0x59f111f1 + (w5 =
ReadBE32(chunk + 20)));
90 Round(c, d, e, f, g, h, a, b, 0x923f82a4 + (w6 =
ReadBE32(chunk + 24)));
91 Round(b, c, d, e, f, g, h, a, 0xab1c5ed5 + (w7 =
ReadBE32(chunk + 28)));
92 Round(a, b, c, d, e, f, g, h, 0xd807aa98 + (w8 =
ReadBE32(chunk + 32)));
93 Round(h, a, b, c, d, e, f, g, 0x12835b01 + (w9 =
ReadBE32(chunk + 36)));
94 Round(g, h, a, b, c, d, e, f, 0x243185be + (w10 =
ReadBE32(chunk + 40)));
95 Round(f, g, h, a, b, c, d, e, 0x550c7dc3 + (w11 =
ReadBE32(chunk + 44)));
96 Round(e, f, g, h, a, b, c, d, 0x72be5d74 + (w12 =
ReadBE32(chunk + 48)));
97 Round(d, e, f, g, h, a, b, c, 0x80deb1fe + (w13 =
ReadBE32(chunk + 52)));
98 Round(c, d, e, f, g, h, a, b, 0x9bdc06a7 + (w14 =
ReadBE32(chunk + 56)));
99 Round(b, c, d, e, f, g, h, a, 0xc19bf174 + (w15 =
ReadBE32(chunk + 60)));
101 Round(a, b, c, d, e, f, g, h, 0xe49b69c1 + (w0 +=
sigma1(w14) + w9 +
sigma0(w1)));
102 Round(h, a, b, c, d, e, f, g, 0xefbe4786 + (w1 +=
sigma1(w15) + w10 +
sigma0(w2)));
103 Round(g, h, a, b, c, d, e, f, 0x0fc19dc6 + (w2 +=
sigma1(w0) + w11 +
sigma0(w3)));
104 Round(f, g, h, a, b, c, d, e, 0x240ca1cc + (w3 +=
sigma1(w1) + w12 +
sigma0(w4)));
105 Round(e, f, g, h, a, b, c, d, 0x2de92c6f + (w4 +=
sigma1(w2) + w13 +
sigma0(w5)));
106 Round(d, e, f, g, h, a, b, c, 0x4a7484aa + (w5 +=
sigma1(w3) + w14 +
sigma0(w6)));
107 Round(c, d, e, f, g, h, a, b, 0x5cb0a9dc + (w6 +=
sigma1(w4) + w15 +
sigma0(w7)));
108 Round(b, c, d, e, f, g, h, a, 0x76f988da + (w7 +=
sigma1(w5) + w0 +
sigma0(w8)));
109 Round(a, b, c, d, e, f, g, h, 0x983e5152 + (w8 +=
sigma1(w6) + w1 +
sigma0(w9)));
110 Round(h, a, b, c, d, e, f, g, 0xa831c66d + (w9 +=
sigma1(w7) + w2 +
sigma0(w10)));
111 Round(g, h, a, b, c, d, e, f, 0xb00327c8 + (w10 +=
sigma1(w8) + w3 +
sigma0(w11)));
112 Round(f, g, h, a, b, c, d, e, 0xbf597fc7 + (w11 +=
sigma1(w9) + w4 +
sigma0(w12)));
113 Round(e, f, g, h, a, b, c, d, 0xc6e00bf3 + (w12 +=
sigma1(w10) + w5 +
sigma0(w13)));
114 Round(d, e, f, g, h, a, b, c, 0xd5a79147 + (w13 +=
sigma1(w11) + w6 +
sigma0(w14)));
115 Round(c, d, e, f, g, h, a, b, 0x06ca6351 + (w14 +=
sigma1(w12) + w7 +
sigma0(w15)));
116 Round(b, c, d, e, f, g, h, a, 0x14292967 + (w15 +=
sigma1(w13) + w8 +
sigma0(w0)));
118 Round(a, b, c, d, e, f, g, h, 0x27b70a85 + (w0 +=
sigma1(w14) + w9 +
sigma0(w1)));
119 Round(h, a, b, c, d, e, f, g, 0x2e1b2138 + (w1 +=
sigma1(w15) + w10 +
sigma0(w2)));
120 Round(g, h, a, b, c, d, e, f, 0x4d2c6dfc + (w2 +=
sigma1(w0) + w11 +
sigma0(w3)));
121 Round(f, g, h, a, b, c, d, e, 0x53380d13 + (w3 +=
sigma1(w1) + w12 +
sigma0(w4)));
122 Round(e, f, g, h, a, b, c, d, 0x650a7354 + (w4 +=
sigma1(w2) + w13 +
sigma0(w5)));
123 Round(d, e, f, g, h, a, b, c, 0x766a0abb + (w5 +=
sigma1(w3) + w14 +
sigma0(w6)));
124 Round(c, d, e, f, g, h, a, b, 0x81c2c92e + (w6 +=
sigma1(w4) + w15 +
sigma0(w7)));
125 Round(b, c, d, e, f, g, h, a, 0x92722c85 + (w7 +=
sigma1(w5) + w0 +
sigma0(w8)));
126 Round(a, b, c, d, e, f, g, h, 0xa2bfe8a1 + (w8 +=
sigma1(w6) + w1 +
sigma0(w9)));
127 Round(h, a, b, c, d, e, f, g, 0xa81a664b + (w9 +=
sigma1(w7) + w2 +
sigma0(w10)));
128 Round(g, h, a, b, c, d, e, f, 0xc24b8b70 + (w10 +=
sigma1(w8) + w3 +
sigma0(w11)));
129 Round(f, g, h, a, b, c, d, e, 0xc76c51a3 + (w11 +=
sigma1(w9) + w4 +
sigma0(w12)));
130 Round(e, f, g, h, a, b, c, d, 0xd192e819 + (w12 +=
sigma1(w10) + w5 +
sigma0(w13)));
131 Round(d, e, f, g, h, a, b, c, 0xd6990624 + (w13 +=
sigma1(w11) + w6 +
sigma0(w14)));
132 Round(c, d, e, f, g, h, a, b, 0xf40e3585 + (w14 +=
sigma1(w12) + w7 +
sigma0(w15)));
133 Round(b, c, d, e, f, g, h, a, 0x106aa070 + (w15 +=
sigma1(w13) + w8 +
sigma0(w0)));
135 Round(a, b, c, d, e, f, g, h, 0x19a4c116 + (w0 +=
sigma1(w14) + w9 +
sigma0(w1)));
136 Round(h, a, b, c, d, e, f, g, 0x1e376c08 + (w1 +=
sigma1(w15) + w10 +
sigma0(w2)));
137 Round(g, h, a, b, c, d, e, f, 0x2748774c + (w2 +=
sigma1(w0) + w11 +
sigma0(w3)));
138 Round(f, g, h, a, b, c, d, e, 0x34b0bcb5 + (w3 +=
sigma1(w1) + w12 +
sigma0(w4)));
139 Round(e, f, g, h, a, b, c, d, 0x391c0cb3 + (w4 +=
sigma1(w2) + w13 +
sigma0(w5)));
140 Round(d, e, f, g, h, a, b, c, 0x4ed8aa4a + (w5 +=
sigma1(w3) + w14 +
sigma0(w6)));
141 Round(c, d, e, f, g, h, a, b, 0x5b9cca4f + (w6 +=
sigma1(w4) + w15 +
sigma0(w7)));
142 Round(b, c, d, e, f, g, h, a, 0x682e6ff3 + (w7 +=
sigma1(w5) + w0 +
sigma0(w8)));
143 Round(a, b, c, d, e, f, g, h, 0x748f82ee + (w8 +=
sigma1(w6) + w1 +
sigma0(w9)));
144 Round(h, a, b, c, d, e, f, g, 0x78a5636f + (w9 +=
sigma1(w7) + w2 +
sigma0(w10)));
145 Round(g, h, a, b, c, d, e, f, 0x84c87814 + (w10 +=
sigma1(w8) + w3 +
sigma0(w11)));
146 Round(f, g, h, a, b, c, d, e, 0x8cc70208 + (w11 +=
sigma1(w9) + w4 +
sigma0(w12)));
147 Round(e, f, g, h, a, b, c, d, 0x90befffa + (w12 +=
sigma1(w10) + w5 +
sigma0(w13)));
148 Round(d, e, f, g, h, a, b, c, 0xa4506ceb + (w13 +=
sigma1(w11) + w6 +
sigma0(w14)));
149 Round(c, d, e, f, g, h, a, b, 0xbef9a3f7 + (w14 +
sigma1(w12) + w7 +
sigma0(w15)));
150 Round(b, c, d, e, f, g, h, a, 0xc67178f2 + (w15 +
sigma1(w13) + w8 +
sigma0(w0)));
164 void TransformD64(
unsigned char* out,
const unsigned char* in)
167 uint32_t a = 0x6a09e667ul;
168 uint32_t b = 0xbb67ae85ul;
169 uint32_t c = 0x3c6ef372ul;
170 uint32_t d = 0xa54ff53aul;
171 uint32_t e = 0x510e527ful;
172 uint32_t f = 0x9b05688cul;
173 uint32_t g = 0x1f83d9abul;
174 uint32_t h = 0x5be0cd19ul;
176 uint32_t w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15;
178 Round(a, b, c, d, e, f, g, h, 0x428a2f98ul + (w0 =
ReadBE32(in + 0)));
179 Round(h, a, b, c, d, e, f, g, 0x71374491ul + (w1 =
ReadBE32(in + 4)));
180 Round(g, h, a, b, c, d, e, f, 0xb5c0fbcful + (w2 =
ReadBE32(in + 8)));
181 Round(f, g, h, a, b, c, d, e, 0xe9b5dba5ul + (w3 =
ReadBE32(in + 12)));
182 Round(e, f, g, h, a, b, c, d, 0x3956c25bul + (w4 =
ReadBE32(in + 16)));
183 Round(d, e, f, g, h, a, b, c, 0x59f111f1ul + (w5 =
ReadBE32(in + 20)));
184 Round(c, d, e, f, g, h, a, b, 0x923f82a4ul + (w6 =
ReadBE32(in + 24)));
185 Round(b, c, d, e, f, g, h, a, 0xab1c5ed5ul + (w7 =
ReadBE32(in + 28)));
186 Round(a, b, c, d, e, f, g, h, 0xd807aa98ul + (w8 =
ReadBE32(in + 32)));
187 Round(h, a, b, c, d, e, f, g, 0x12835b01ul + (w9 =
ReadBE32(in + 36)));
188 Round(g, h, a, b, c, d, e, f, 0x243185beul + (w10 =
ReadBE32(in + 40)));
189 Round(f, g, h, a, b, c, d, e, 0x550c7dc3ul + (w11 =
ReadBE32(in + 44)));
190 Round(e, f, g, h, a, b, c, d, 0x72be5d74ul + (w12 =
ReadBE32(in + 48)));
191 Round(d, e, f, g, h, a, b, c, 0x80deb1feul + (w13 =
ReadBE32(in + 52)));
192 Round(c, d, e, f, g, h, a, b, 0x9bdc06a7ul + (w14 =
ReadBE32(in + 56)));
193 Round(b, c, d, e, f, g, h, a, 0xc19bf174ul + (w15 =
ReadBE32(in + 60)));
194 Round(a, b, c, d, e, f, g, h, 0xe49b69c1ul + (w0 +=
sigma1(w14) + w9 +
sigma0(w1)));
195 Round(h, a, b, c, d, e, f, g, 0xefbe4786ul + (w1 +=
sigma1(w15) + w10 +
sigma0(w2)));
196 Round(g, h, a, b, c, d, e, f, 0x0fc19dc6ul + (w2 +=
sigma1(w0) + w11 +
sigma0(w3)));
197 Round(f, g, h, a, b, c, d, e, 0x240ca1ccul + (w3 +=
sigma1(w1) + w12 +
sigma0(w4)));
198 Round(e, f, g, h, a, b, c, d, 0x2de92c6ful + (w4 +=
sigma1(w2) + w13 +
sigma0(w5)));
199 Round(d, e, f, g, h, a, b, c, 0x4a7484aaul + (w5 +=
sigma1(w3) + w14 +
sigma0(w6)));
200 Round(c, d, e, f, g, h, a, b, 0x5cb0a9dcul + (w6 +=
sigma1(w4) + w15 +
sigma0(w7)));
201 Round(b, c, d, e, f, g, h, a, 0x76f988daul + (w7 +=
sigma1(w5) + w0 +
sigma0(w8)));
202 Round(a, b, c, d, e, f, g, h, 0x983e5152ul + (w8 +=
sigma1(w6) + w1 +
sigma0(w9)));
203 Round(h, a, b, c, d, e, f, g, 0xa831c66dul + (w9 +=
sigma1(w7) + w2 +
sigma0(w10)));
204 Round(g, h, a, b, c, d, e, f, 0xb00327c8ul + (w10 +=
sigma1(w8) + w3 +
sigma0(w11)));
205 Round(f, g, h, a, b, c, d, e, 0xbf597fc7ul + (w11 +=
sigma1(w9) + w4 +
sigma0(w12)));
206 Round(e, f, g, h, a, b, c, d, 0xc6e00bf3ul + (w12 +=
sigma1(w10) + w5 +
sigma0(w13)));
207 Round(d, e, f, g, h, a, b, c, 0xd5a79147ul + (w13 +=
sigma1(w11) + w6 +
sigma0(w14)));
208 Round(c, d, e, f, g, h, a, b, 0x06ca6351ul + (w14 +=
sigma1(w12) + w7 +
sigma0(w15)));
209 Round(b, c, d, e, f, g, h, a, 0x14292967ul + (w15 +=
sigma1(w13) + w8 +
sigma0(w0)));
210 Round(a, b, c, d, e, f, g, h, 0x27b70a85ul + (w0 +=
sigma1(w14) + w9 +
sigma0(w1)));
211 Round(h, a, b, c, d, e, f, g, 0x2e1b2138ul + (w1 +=
sigma1(w15) + w10 +
sigma0(w2)));
212 Round(g, h, a, b, c, d, e, f, 0x4d2c6dfcul + (w2 +=
sigma1(w0) + w11 +
sigma0(w3)));
213 Round(f, g, h, a, b, c, d, e, 0x53380d13ul + (w3 +=
sigma1(w1) + w12 +
sigma0(w4)));
214 Round(e, f, g, h, a, b, c, d, 0x650a7354ul + (w4 +=
sigma1(w2) + w13 +
sigma0(w5)));
215 Round(d, e, f, g, h, a, b, c, 0x766a0abbul + (w5 +=
sigma1(w3) + w14 +
sigma0(w6)));
216 Round(c, d, e, f, g, h, a, b, 0x81c2c92eul + (w6 +=
sigma1(w4) + w15 +
sigma0(w7)));
217 Round(b, c, d, e, f, g, h, a, 0x92722c85ul + (w7 +=
sigma1(w5) + w0 +
sigma0(w8)));
218 Round(a, b, c, d, e, f, g, h, 0xa2bfe8a1ul + (w8 +=
sigma1(w6) + w1 +
sigma0(w9)));
219 Round(h, a, b, c, d, e, f, g, 0xa81a664bul + (w9 +=
sigma1(w7) + w2 +
sigma0(w10)));
220 Round(g, h, a, b, c, d, e, f, 0xc24b8b70ul + (w10 +=
sigma1(w8) + w3 +
sigma0(w11)));
221 Round(f, g, h, a, b, c, d, e, 0xc76c51a3ul + (w11 +=
sigma1(w9) + w4 +
sigma0(w12)));
222 Round(e, f, g, h, a, b, c, d, 0xd192e819ul + (w12 +=
sigma1(w10) + w5 +
sigma0(w13)));
223 Round(d, e, f, g, h, a, b, c, 0xd6990624ul + (w13 +=
sigma1(w11) + w6 +
sigma0(w14)));
224 Round(c, d, e, f, g, h, a, b, 0xf40e3585ul + (w14 +=
sigma1(w12) + w7 +
sigma0(w15)));
225 Round(b, c, d, e, f, g, h, a, 0x106aa070ul + (w15 +=
sigma1(w13) + w8 +
sigma0(w0)));
226 Round(a, b, c, d, e, f, g, h, 0x19a4c116ul + (w0 +=
sigma1(w14) + w9 +
sigma0(w1)));
227 Round(h, a, b, c, d, e, f, g, 0x1e376c08ul + (w1 +=
sigma1(w15) + w10 +
sigma0(w2)));
228 Round(g, h, a, b, c, d, e, f, 0x2748774cul + (w2 +=
sigma1(w0) + w11 +
sigma0(w3)));
229 Round(f, g, h, a, b, c, d, e, 0x34b0bcb5ul + (w3 +=
sigma1(w1) + w12 +
sigma0(w4)));
230 Round(e, f, g, h, a, b, c, d, 0x391c0cb3ul + (w4 +=
sigma1(w2) + w13 +
sigma0(w5)));
231 Round(d, e, f, g, h, a, b, c, 0x4ed8aa4aul + (w5 +=
sigma1(w3) + w14 +
sigma0(w6)));
232 Round(c, d, e, f, g, h, a, b, 0x5b9cca4ful + (w6 +=
sigma1(w4) + w15 +
sigma0(w7)));
233 Round(b, c, d, e, f, g, h, a, 0x682e6ff3ul + (w7 +=
sigma1(w5) + w0 +
sigma0(w8)));
234 Round(a, b, c, d, e, f, g, h, 0x748f82eeul + (w8 +=
sigma1(w6) + w1 +
sigma0(w9)));
235 Round(h, a, b, c, d, e, f, g, 0x78a5636ful + (w9 +=
sigma1(w7) + w2 +
sigma0(w10)));
236 Round(g, h, a, b, c, d, e, f, 0x84c87814ul + (w10 +=
sigma1(w8) + w3 +
sigma0(w11)));
237 Round(f, g, h, a, b, c, d, e, 0x8cc70208ul + (w11 +=
sigma1(w9) + w4 +
sigma0(w12)));
238 Round(e, f, g, h, a, b, c, d, 0x90befffaul + (w12 +=
sigma1(w10) + w5 +
sigma0(w13)));
239 Round(d, e, f, g, h, a, b, c, 0xa4506cebul + (w13 +=
sigma1(w11) + w6 +
sigma0(w14)));
240 Round(c, d, e, f, g, h, a, b, 0xbef9a3f7ul + (w14 +
sigma1(w12) + w7 +
sigma0(w15)));
241 Round(b, c, d, e, f, g, h, a, 0xc67178f2ul + (w15 +
sigma1(w13) + w8 +
sigma0(w0)));
252 uint32_t t0 = a, t1 = b, t2 = c, t3 = d, t4 = e, t5 = f, t6 = g, t7 = h;
255 Round(a, b, c, d, e, f, g, h, 0xc28a2f98ul);
256 Round(h, a, b, c, d, e, f, g, 0x71374491ul);
257 Round(g, h, a, b, c, d, e, f, 0xb5c0fbcful);
258 Round(f, g, h, a, b, c, d, e, 0xe9b5dba5ul);
259 Round(e, f, g, h, a, b, c, d, 0x3956c25bul);
260 Round(d, e, f, g, h, a, b, c, 0x59f111f1ul);
261 Round(c, d, e, f, g, h, a, b, 0x923f82a4ul);
262 Round(b, c, d, e, f, g, h, a, 0xab1c5ed5ul);
263 Round(a, b, c, d, e, f, g, h, 0xd807aa98ul);
264 Round(h, a, b, c, d, e, f, g, 0x12835b01ul);
265 Round(g, h, a, b, c, d, e, f, 0x243185beul);
266 Round(f, g, h, a, b, c, d, e, 0x550c7dc3ul);
267 Round(e, f, g, h, a, b, c, d, 0x72be5d74ul);
268 Round(d, e, f, g, h, a, b, c, 0x80deb1feul);
269 Round(c, d, e, f, g, h, a, b, 0x9bdc06a7ul);
270 Round(b, c, d, e, f, g, h, a, 0xc19bf374ul);
271 Round(a, b, c, d, e, f, g, h, 0x649b69c1ul);
272 Round(h, a, b, c, d, e, f, g, 0xf0fe4786ul);
273 Round(g, h, a, b, c, d, e, f, 0x0fe1edc6ul);
274 Round(f, g, h, a, b, c, d, e, 0x240cf254ul);
275 Round(e, f, g, h, a, b, c, d, 0x4fe9346ful);
276 Round(d, e, f, g, h, a, b, c, 0x6cc984beul);
277 Round(c, d, e, f, g, h, a, b, 0x61b9411eul);
278 Round(b, c, d, e, f, g, h, a, 0x16f988faul);
279 Round(a, b, c, d, e, f, g, h, 0xf2c65152ul);
280 Round(h, a, b, c, d, e, f, g, 0xa88e5a6dul);
281 Round(g, h, a, b, c, d, e, f, 0xb019fc65ul);
282 Round(f, g, h, a, b, c, d, e, 0xb9d99ec7ul);
283 Round(e, f, g, h, a, b, c, d, 0x9a1231c3ul);
284 Round(d, e, f, g, h, a, b, c, 0xe70eeaa0ul);
285 Round(c, d, e, f, g, h, a, b, 0xfdb1232bul);
286 Round(b, c, d, e, f, g, h, a, 0xc7353eb0ul);
287 Round(a, b, c, d, e, f, g, h, 0x3069bad5ul);
288 Round(h, a, b, c, d, e, f, g, 0xcb976d5ful);
289 Round(g, h, a, b, c, d, e, f, 0x5a0f118ful);
290 Round(f, g, h, a, b, c, d, e, 0xdc1eeefdul);
291 Round(e, f, g, h, a, b, c, d, 0x0a35b689ul);
292 Round(d, e, f, g, h, a, b, c, 0xde0b7a04ul);
293 Round(c, d, e, f, g, h, a, b, 0x58f4ca9dul);
294 Round(b, c, d, e, f, g, h, a, 0xe15d5b16ul);
295 Round(a, b, c, d, e, f, g, h, 0x007f3e86ul);
296 Round(h, a, b, c, d, e, f, g, 0x37088980ul);
297 Round(g, h, a, b, c, d, e, f, 0xa507ea32ul);
298 Round(f, g, h, a, b, c, d, e, 0x6fab9537ul);
299 Round(e, f, g, h, a, b, c, d, 0x17406110ul);
300 Round(d, e, f, g, h, a, b, c, 0x0d8cd6f1ul);
301 Round(c, d, e, f, g, h, a, b, 0xcdaa3b6dul);
302 Round(b, c, d, e, f, g, h, a, 0xc0bbbe37ul);
303 Round(a, b, c, d, e, f, g, h, 0x83613bdaul);
304 Round(h, a, b, c, d, e, f, g, 0xdb48a363ul);
305 Round(g, h, a, b, c, d, e, f, 0x0b02e931ul);
306 Round(f, g, h, a, b, c, d, e, 0x6fd15ca7ul);
307 Round(e, f, g, h, a, b, c, d, 0x521afacaul);
308 Round(d, e, f, g, h, a, b, c, 0x31338431ul);
309 Round(c, d, e, f, g, h, a, b, 0x6ed41a95ul);
310 Round(b, c, d, e, f, g, h, a, 0x6d437890ul);
311 Round(a, b, c, d, e, f, g, h, 0xc39c91f2ul);
312 Round(h, a, b, c, d, e, f, g, 0x9eccabbdul);
313 Round(g, h, a, b, c, d, e, f, 0xb5c9a0e6ul);
314 Round(f, g, h, a, b, c, d, e, 0x532fb63cul);
315 Round(e, f, g, h, a, b, c, d, 0xd2c741c6ul);
316 Round(d, e, f, g, h, a, b, c, 0x07237ea3ul);
317 Round(c, d, e, f, g, h, a, b, 0xa4954b68ul);
318 Round(b, c, d, e, f, g, h, a, 0x4c191d76ul);
339 Round(a, b, c, d, e, f, g, h, 0x428a2f98ul + w0);
340 Round(h, a, b, c, d, e, f, g, 0x71374491ul + w1);
341 Round(g, h, a, b, c, d, e, f, 0xb5c0fbcful + w2);
342 Round(f, g, h, a, b, c, d, e, 0xe9b5dba5ul + w3);
343 Round(e, f, g, h, a, b, c, d, 0x3956c25bul + w4);
344 Round(d, e, f, g, h, a, b, c, 0x59f111f1ul + w5);
345 Round(c, d, e, f, g, h, a, b, 0x923f82a4ul + w6);
346 Round(b, c, d, e, f, g, h, a, 0xab1c5ed5ul + w7);
347 Round(a, b, c, d, e, f, g, h, 0x5807aa98ul);
348 Round(h, a, b, c, d, e, f, g, 0x12835b01ul);
349 Round(g, h, a, b, c, d, e, f, 0x243185beul);
350 Round(f, g, h, a, b, c, d, e, 0x550c7dc3ul);
351 Round(e, f, g, h, a, b, c, d, 0x72be5d74ul);
352 Round(d, e, f, g, h, a, b, c, 0x80deb1feul);
353 Round(c, d, e, f, g, h, a, b, 0x9bdc06a7ul);
354 Round(b, c, d, e, f, g, h, a, 0xc19bf274ul);
355 Round(a, b, c, d, e, f, g, h, 0xe49b69c1ul + (w0 +=
sigma0(w1)));
356 Round(h, a, b, c, d, e, f, g, 0xefbe4786ul + (w1 += 0xa00000ul +
sigma0(w2)));
361 Round(c, d, e, f, g, h, a, b, 0x5cb0a9dcul + (w6 +=
sigma1(w4) + 0x100ul +
sigma0(w7)));
362 Round(b, c, d, e, f, g, h, a, 0x76f988daul + (w7 +=
sigma1(w5) + w0 + 0x11002000ul));
363 Round(a, b, c, d, e, f, g, h, 0x983e5152ul + (w8 = 0x80000000ul +
sigma1(w6) + w1));
364 Round(h, a, b, c, d, e, f, g, 0xa831c66dul + (w9 =
sigma1(w7) + w2));
365 Round(g, h, a, b, c, d, e, f, 0xb00327c8ul + (w10 =
sigma1(w8) + w3));
366 Round(f, g, h, a, b, c, d, e, 0xbf597fc7ul + (w11 =
sigma1(w9) + w4));
367 Round(e, f, g, h, a, b, c, d, 0xc6e00bf3ul + (w12 =
sigma1(w10) + w5));
368 Round(d, e, f, g, h, a, b, c, 0xd5a79147ul + (w13 =
sigma1(w11) + w6));
369 Round(c, d, e, f, g, h, a, b, 0x06ca6351ul + (w14 =
sigma1(w12) + w7 + 0x400022ul));
370 Round(b, c, d, e, f, g, h, a, 0x14292967ul + (w15 = 0x100ul +
sigma1(w13) + w8 +
sigma0(w0)));
371 Round(a, b, c, d, e, f, g, h, 0x27b70a85ul + (w0 +=
sigma1(w14) + w9 +
sigma0(w1)));
372 Round(h, a, b, c, d, e, f, g, 0x2e1b2138ul + (w1 +=
sigma1(w15) + w10 +
sigma0(w2)));
373 Round(g, h, a, b, c, d, e, f, 0x4d2c6dfcul + (w2 +=
sigma1(w0) + w11 +
sigma0(w3)));
374 Round(f, g, h, a, b, c, d, e, 0x53380d13ul + (w3 +=
sigma1(w1) + w12 +
sigma0(w4)));
375 Round(e, f, g, h, a, b, c, d, 0x650a7354ul + (w4 +=
sigma1(w2) + w13 +
sigma0(w5)));
376 Round(d, e, f, g, h, a, b, c, 0x766a0abbul + (w5 +=
sigma1(w3) + w14 +
sigma0(w6)));
377 Round(c, d, e, f, g, h, a, b, 0x81c2c92eul + (w6 +=
sigma1(w4) + w15 +
sigma0(w7)));
378 Round(b, c, d, e, f, g, h, a, 0x92722c85ul + (w7 +=
sigma1(w5) + w0 +
sigma0(w8)));
379 Round(a, b, c, d, e, f, g, h, 0xa2bfe8a1ul + (w8 +=
sigma1(w6) + w1 +
sigma0(w9)));
380 Round(h, a, b, c, d, e, f, g, 0xa81a664bul + (w9 +=
sigma1(w7) + w2 +
sigma0(w10)));
381 Round(g, h, a, b, c, d, e, f, 0xc24b8b70ul + (w10 +=
sigma1(w8) + w3 +
sigma0(w11)));
382 Round(f, g, h, a, b, c, d, e, 0xc76c51a3ul + (w11 +=
sigma1(w9) + w4 +
sigma0(w12)));
383 Round(e, f, g, h, a, b, c, d, 0xd192e819ul + (w12 +=
sigma1(w10) + w5 +
sigma0(w13)));
384 Round(d, e, f, g, h, a, b, c, 0xd6990624ul + (w13 +=
sigma1(w11) + w6 +
sigma0(w14)));
385 Round(c, d, e, f, g, h, a, b, 0xf40e3585ul + (w14 +=
sigma1(w12) + w7 +
sigma0(w15)));
386 Round(b, c, d, e, f, g, h, a, 0x106aa070ul + (w15 +=
sigma1(w13) + w8 +
sigma0(w0)));
387 Round(a, b, c, d, e, f, g, h, 0x19a4c116ul + (w0 +=
sigma1(w14) + w9 +
sigma0(w1)));
388 Round(h, a, b, c, d, e, f, g, 0x1e376c08ul + (w1 +=
sigma1(w15) + w10 +
sigma0(w2)));
389 Round(g, h, a, b, c, d, e, f, 0x2748774cul + (w2 +=
sigma1(w0) + w11 +
sigma0(w3)));
390 Round(f, g, h, a, b, c, d, e, 0x34b0bcb5ul + (w3 +=
sigma1(w1) + w12 +
sigma0(w4)));
391 Round(e, f, g, h, a, b, c, d, 0x391c0cb3ul + (w4 +=
sigma1(w2) + w13 +
sigma0(w5)));
392 Round(d, e, f, g, h, a, b, c, 0x4ed8aa4aul + (w5 +=
sigma1(w3) + w14 +
sigma0(w6)));
393 Round(c, d, e, f, g, h, a, b, 0x5b9cca4ful + (w6 +=
sigma1(w4) + w15 +
sigma0(w7)));
394 Round(b, c, d, e, f, g, h, a, 0x682e6ff3ul + (w7 +=
sigma1(w5) + w0 +
sigma0(w8)));
395 Round(a, b, c, d, e, f, g, h, 0x748f82eeul + (w8 +=
sigma1(w6) + w1 +
sigma0(w9)));
396 Round(h, a, b, c, d, e, f, g, 0x78a5636ful + (w9 +=
sigma1(w7) + w2 +
sigma0(w10)));
397 Round(g, h, a, b, c, d, e, f, 0x84c87814ul + (w10 +=
sigma1(w8) + w3 +
sigma0(w11)));
398 Round(f, g, h, a, b, c, d, e, 0x8cc70208ul + (w11 +=
sigma1(w9) + w4 +
sigma0(w12)));
399 Round(e, f, g, h, a, b, c, d, 0x90befffaul + (w12 +=
sigma1(w10) + w5 +
sigma0(w13)));
400 Round(d, e, f, g, h, a, b, c, 0xa4506cebul + (w13 +=
sigma1(w11) + w6 +
sigma0(w14)));
401 Round(c, d, e, f, g, h, a, b, 0xbef9a3f7ul + (w14 +
sigma1(w12) + w7 +
sigma0(w15)));
402 Round(b, c, d, e, f, g, h, a, 0xc67178f2ul + (w15 +
sigma1(w13) + w8 +
sigma0(w0)));
417 typedef void (*TransformType)(uint32_t*,
const unsigned char*,
size_t);
418 typedef void (*TransformD64Type)(
unsigned char*,
const unsigned char*);
420 template<TransformType tr>
421 void TransformD64Wrapper(
unsigned char* out,
const unsigned char* in)
424 static const unsigned char padding1[64] = {
425 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
426 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
427 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
428 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0
430 unsigned char buffer2[64] = {
431 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
432 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
433 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
434 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0
436 sha256::Initialize(s);
447 sha256::Initialize(s);
460 TransformD64Type TransformD64 = sha256::TransformD64;
461 TransformD64Type TransformD64_2way =
nullptr;
462 TransformD64Type TransformD64_4way =
nullptr;
463 TransformD64Type TransformD64_8way =
nullptr;
467 static const uint32_t init[8] = {
468 0x6a09e667ul, 0xbb67ae85ul, 0x3c6ef372ul, 0xa54ff53aul, 0x510e527ful, 0x9b05688cul, 0x1f83d9abul, 0x5be0cd19ul
471 static const unsigned char data[641] =
"-" 472 "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do " 473 "eiusmod tempor incididunt ut labore et dolore magna aliqua. Et m" 474 "olestie ac feugiat sed lectus vestibulum mattis ullamcorper. Mor" 475 "bi blandit cursus risus at ultrices mi tempus imperdiet nulla. N" 476 "unc congue nisi vita suscipit tellus mauris. Imperdiet proin fer" 477 "mentum leo vel orci. Massa tempor nec feugiat nisl pretium fusce" 478 " id velit. Telus in metus vulputate eu scelerisque felis. Mi tem" 479 "pus imperdiet nulla malesuada pellentesque. Tristique magna sit.";
481 static const uint32_t result[9][8] = {
482 {0x6a09e667ul, 0xbb67ae85ul, 0x3c6ef372ul, 0xa54ff53aul, 0x510e527ful, 0x9b05688cul, 0x1f83d9abul, 0x5be0cd19ul},
483 {0x91f8ec6bul, 0x4da10fe3ul, 0x1c9c292cul, 0x45e18185ul, 0x435cc111ul, 0x3ca26f09ul, 0xeb954caeul, 0x402a7069ul},
484 {0xcabea5acul, 0x374fb97cul, 0x182ad996ul, 0x7bd69cbful, 0x450ff900ul, 0xc1d2be8aul, 0x6a41d505ul, 0xe6212dc3ul},
485 {0xbcff09d6ul, 0x3e76f36eul, 0x3ecb2501ul, 0x78866e97ul, 0xe1c1e2fdul, 0x32f4eafful, 0x8aa6c4e5ul, 0xdfc024bcul},
486 {0xa08c5d94ul, 0x0a862f93ul, 0x6b7f2f40ul, 0x8f9fae76ul, 0x6d40439ful, 0x79dcee0cul, 0x3e39ff3aul, 0xdc3bdbb1ul},
487 {0x216a0895ul, 0x9f1a3662ul, 0xe99946f9ul, 0x87ba4364ul, 0x0fb5db2cul, 0x12bed3d3ul, 0x6689c0c7ul, 0x292f1b04ul},
488 {0xca3067f8ul, 0xbc8c2656ul, 0x37cb7e0dul, 0x9b6b8b0ful, 0x46dc380bul, 0xf1287f57ul, 0xc42e4b23ul, 0x3fefe94dul},
489 {0x3e4c4039ul, 0xbb6fca8cul, 0x6f27d2f7ul, 0x301e44a4ul, 0x8352ba14ul, 0x5769ce37ul, 0x48a1155ful, 0xc0e1c4c6ul},
490 {0xfe2fa9ddul, 0x69d0862bul, 0x1ae0db23ul, 0x471f9244ul, 0xf55c0145ul, 0xc30f9c3bul, 0x40a84ea0ul, 0x5b8a266cul},
493 static const unsigned char result_d64[256] = {
494 0x09, 0x3a, 0xc4, 0xd0, 0x0f, 0xf7, 0x57, 0xe1, 0x72, 0x85, 0x79, 0x42, 0xfe, 0xe7, 0xe0, 0xa0,
495 0xfc, 0x52, 0xd7, 0xdb, 0x07, 0x63, 0x45, 0xfb, 0x53, 0x14, 0x7d, 0x17, 0x22, 0x86, 0xf0, 0x52,
496 0x48, 0xb6, 0x11, 0x9e, 0x6e, 0x48, 0x81, 0x6d, 0xcc, 0x57, 0x1f, 0xb2, 0x97, 0xa8, 0xd5, 0x25,
497 0x9b, 0x82, 0xaa, 0x89, 0xe2, 0xfd, 0x2d, 0x56, 0xe8, 0x28, 0x83, 0x0b, 0xe2, 0xfa, 0x53, 0xb7,
498 0xd6, 0x6b, 0x07, 0x85, 0x83, 0xb0, 0x10, 0xa2, 0xf5, 0x51, 0x3c, 0xf9, 0x60, 0x03, 0xab, 0x45,
499 0x6c, 0x15, 0x6e, 0xef, 0xb5, 0xac, 0x3e, 0x6c, 0xdf, 0xb4, 0x92, 0x22, 0x2d, 0xce, 0xbf, 0x3e,
500 0xe9, 0xe5, 0xf6, 0x29, 0x0e, 0x01, 0x4f, 0xd2, 0xd4, 0x45, 0x65, 0xb3, 0xbb, 0xf2, 0x4c, 0x16,
501 0x37, 0x50, 0x3c, 0x6e, 0x49, 0x8c, 0x5a, 0x89, 0x2b, 0x1b, 0xab, 0xc4, 0x37, 0xd1, 0x46, 0xe9,
502 0x3d, 0x0e, 0x85, 0xa2, 0x50, 0x73, 0xa1, 0x5e, 0x54, 0x37, 0xd7, 0x94, 0x17, 0x56, 0xc2, 0xd8,
503 0xe5, 0x9f, 0xed, 0x4e, 0xae, 0x15, 0x42, 0x06, 0x0d, 0x74, 0x74, 0x5e, 0x24, 0x30, 0xce, 0xd1,
504 0x9e, 0x50, 0xa3, 0x9a, 0xb8, 0xf0, 0x4a, 0x57, 0x69, 0x78, 0x67, 0x12, 0x84, 0x58, 0xbe, 0xc7,
505 0x36, 0xaa, 0xee, 0x7c, 0x64, 0xa3, 0x76, 0xec, 0xff, 0x55, 0x41, 0x00, 0x2a, 0x44, 0x68, 0x4d,
506 0xb6, 0x53, 0x9e, 0x1c, 0x95, 0xb7, 0xca, 0xdc, 0x7f, 0x7d, 0x74, 0x27, 0x5c, 0x8e, 0xa6, 0x84,
507 0xb5, 0xac, 0x87, 0xa9, 0xf3, 0xff, 0x75, 0xf2, 0x34, 0xcd, 0x1a, 0x3b, 0x82, 0x2c, 0x2b, 0x4e,
508 0x6a, 0x46, 0x30, 0xa6, 0x89, 0x86, 0x23, 0xac, 0xf8, 0xa5, 0x15, 0xe9, 0x0a, 0xaa, 0x1e, 0x9a,
509 0xd7, 0x93, 0x6b, 0x28, 0xe4, 0x3b, 0xfd, 0x59, 0xc6, 0xed, 0x7c, 0x5f, 0xa5, 0x41, 0xcb, 0x51
514 for (
size_t i = 0; i <= 8; ++i) {
518 if (!std::equal(state, state + 8, result[i]))
return false;
522 unsigned char out[32];
523 TransformD64(out, data + 1);
524 if (!std::equal(out, out + 32, result_d64))
return false;
527 if (TransformD64_2way) {
528 unsigned char out[64];
529 TransformD64_2way(out, data + 1);
530 if (!std::equal(out, out + 64, result_d64))
return false;
534 if (TransformD64_4way) {
535 unsigned char out[128];
536 TransformD64_4way(out, data + 1);
537 if (!std::equal(out, out + 128, result_d64))
return false;
541 if (TransformD64_8way) {
542 unsigned char out[256];
543 TransformD64_8way(out, data + 1);
544 if (!std::equal(out, out + 256, result_d64))
return false;
551 #if defined(USE_ASM) && (defined(__x86_64__) || defined(__amd64__) || defined(__i386__)) 553 void inline cpuid(uint32_t leaf, uint32_t subleaf, uint32_t& a, uint32_t& b, uint32_t& c, uint32_t& d)
556 __cpuid_count(leaf, subleaf, a, b, c, d);
558 __asm__ (
"cpuid" :
"=a"(a),
"=b"(b),
"=c"(c),
"=d"(d) :
"0"(leaf),
"2"(subleaf));
566 __asm__(
"xgetbv" :
"=a"(a),
"=d"(d) :
"c"(0));
575 std::string ret =
"standard";
576 #if defined(USE_ASM) && (defined(__x86_64__) || defined(__amd64__) || defined(__i386__)) 577 bool have_sse4 =
false;
578 bool have_xsave =
false;
579 bool have_avx =
false;
580 bool have_avx2 =
false;
581 bool have_shani =
false;
582 bool enabled_avx =
false;
592 uint32_t eax, ebx, ecx, edx;
593 cpuid(1, 0, eax, ebx, ecx, edx);
594 have_sse4 = (ecx >> 19) & 1;
595 have_xsave = (ecx >> 27) & 1;
596 have_avx = (ecx >> 28) & 1;
597 if (have_xsave && have_avx) {
598 enabled_avx = AVXEnabled();
601 cpuid(7, 0, eax, ebx, ecx, edx);
602 have_avx2 = (ebx >> 5) & 1;
603 have_shani = (ebx >> 29) & 1;
606 #if defined(ENABLE_SHANI) && !defined(BUILD_BITCOIN_INTERNAL) 609 TransformD64 = TransformD64Wrapper<sha256_shani::Transform>;
611 ret =
"shani(1way,2way)";
618 #if defined(__x86_64__) || defined(__amd64__) 620 TransformD64 = TransformD64Wrapper<sha256_sse4::Transform>;
623 #if defined(ENABLE_SSE41) && !defined(BUILD_BITCOIN_INTERNAL) 625 ret +=
",sse41(4way)";
629 #if defined(ENABLE_AVX2) && !defined(BUILD_BITCOIN_INTERNAL) 630 if (have_avx2 && have_avx && enabled_avx) {
632 ret +=
",avx2(8way)";
645 sha256::Initialize(
s);
650 const unsigned char* end = data + len;
651 size_t bufsize =
bytes % 64;
652 if (bufsize && bufsize + len >= 64) {
654 memcpy(
buf + bufsize, data, 64 - bufsize);
655 bytes += 64 - bufsize;
656 data += 64 - bufsize;
660 if (end - data >= 64) {
661 size_t blocks = (end - data) / 64;
664 bytes += 64 * blocks;
676 static const unsigned char pad[64] = {0x80};
677 unsigned char sizedesc[8];
694 sha256::Initialize(
s);
698 void SHA256D64(
unsigned char* out,
const unsigned char* in,
size_t blocks)
700 if (TransformD64_8way) {
701 while (blocks >= 8) {
702 TransformD64_8way(out, in);
708 if (TransformD64_4way) {
709 while (blocks >= 4) {
710 TransformD64_4way(out, in);
716 if (TransformD64_2way) {
717 while (blocks >= 2) {
718 TransformD64_2way(out, in);
725 TransformD64(out, in);
CSHA256 & Write(const unsigned char *data, size_t len)
OutIter copy(Range &&r, OutIter out)
#define Round(a, b, c, d, e, f, g, h, k, w)
void Transform_2way(unsigned char *out, const unsigned char *in)
static void WriteBE64(unsigned char *ptr, uint64_t x)
std::string SHA256AutoDetect()
Autodetect the best available SHA256 implementation.
void Transform(uint32_t *s, const unsigned char *chunk, size_t blocks)
void Finalize(unsigned char hash[OUTPUT_SIZE])
static uint32_t ReadBE32(const unsigned char *ptr)
void Transform_8way(unsigned char *out, const unsigned char *in)
void * memcpy(void *a, const void *b, size_t c)
Internal SHA-256 implementation.
void Transform_4way(unsigned char *out, const unsigned char *in)
static void WriteBE32(unsigned char *ptr, uint32_t x)
void SHA256D64(unsigned char *out, const unsigned char *in, size_t blocks)
Compute multiple double-SHA256's of 64-byte blobs.
A hasher class for SHA-256.