@@ -141,9 +141,300 @@ void Transform(uint32_t* s, const unsigned char* chunk, size_t blocks)
141
141
}
142
142
}
143
143
144
+ void TransformD64 (unsigned char * out, const unsigned char * in)
145
+ {
146
+ // Transform 1
147
+ uint32_t a = 0x6a09e667ul ;
148
+ uint32_t b = 0xbb67ae85ul ;
149
+ uint32_t c = 0x3c6ef372ul ;
150
+ uint32_t d = 0xa54ff53aul ;
151
+ uint32_t e = 0x510e527ful ;
152
+ uint32_t f = 0x9b05688cul ;
153
+ uint32_t g = 0x1f83d9abul ;
154
+ uint32_t h = 0x5be0cd19ul ;
155
+
156
+ uint32_t w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15;
157
+
158
+ Round (a, b, c, d, e, f, g, h, 0x428a2f98ul + (w0 = ReadBE32 (in + 0 )));
159
+ Round (h, a, b, c, d, e, f, g, 0x71374491ul + (w1 = ReadBE32 (in + 4 )));
160
+ Round (g, h, a, b, c, d, e, f, 0xb5c0fbcful + (w2 = ReadBE32 (in + 8 )));
161
+ Round (f, g, h, a, b, c, d, e, 0xe9b5dba5ul + (w3 = ReadBE32 (in + 12 )));
162
+ Round (e, f, g, h, a, b, c, d, 0x3956c25bul + (w4 = ReadBE32 (in + 16 )));
163
+ Round (d, e, f, g, h, a, b, c, 0x59f111f1ul + (w5 = ReadBE32 (in + 20 )));
164
+ Round (c, d, e, f, g, h, a, b, 0x923f82a4ul + (w6 = ReadBE32 (in + 24 )));
165
+ Round (b, c, d, e, f, g, h, a, 0xab1c5ed5ul + (w7 = ReadBE32 (in + 28 )));
166
+ Round (a, b, c, d, e, f, g, h, 0xd807aa98ul + (w8 = ReadBE32 (in + 32 )));
167
+ Round (h, a, b, c, d, e, f, g, 0x12835b01ul + (w9 = ReadBE32 (in + 36 )));
168
+ Round (g, h, a, b, c, d, e, f, 0x243185beul + (w10 = ReadBE32 (in + 40 )));
169
+ Round (f, g, h, a, b, c, d, e, 0x550c7dc3ul + (w11 = ReadBE32 (in + 44 )));
170
+ Round (e, f, g, h, a, b, c, d, 0x72be5d74ul + (w12 = ReadBE32 (in + 48 )));
171
+ Round (d, e, f, g, h, a, b, c, 0x80deb1feul + (w13 = ReadBE32 (in + 52 )));
172
+ Round (c, d, e, f, g, h, a, b, 0x9bdc06a7ul + (w14 = ReadBE32 (in + 56 )));
173
+ Round (b, c, d, e, f, g, h, a, 0xc19bf174ul + (w15 = ReadBE32 (in + 60 )));
174
+ Round (a, b, c, d, e, f, g, h, 0xe49b69c1ul + (w0 += sigma1 (w14) + w9 + sigma0 (w1)));
175
+ Round (h, a, b, c, d, e, f, g, 0xefbe4786ul + (w1 += sigma1 (w15) + w10 + sigma0 (w2)));
176
+ Round (g, h, a, b, c, d, e, f, 0x0fc19dc6ul + (w2 += sigma1 (w0) + w11 + sigma0 (w3)));
177
+ Round (f, g, h, a, b, c, d, e, 0x240ca1ccul + (w3 += sigma1 (w1) + w12 + sigma0 (w4)));
178
+ Round (e, f, g, h, a, b, c, d, 0x2de92c6ful + (w4 += sigma1 (w2) + w13 + sigma0 (w5)));
179
+ Round (d, e, f, g, h, a, b, c, 0x4a7484aaul + (w5 += sigma1 (w3) + w14 + sigma0 (w6)));
180
+ Round (c, d, e, f, g, h, a, b, 0x5cb0a9dcul + (w6 += sigma1 (w4) + w15 + sigma0 (w7)));
181
+ Round (b, c, d, e, f, g, h, a, 0x76f988daul + (w7 += sigma1 (w5) + w0 + sigma0 (w8)));
182
+ Round (a, b, c, d, e, f, g, h, 0x983e5152ul + (w8 += sigma1 (w6) + w1 + sigma0 (w9)));
183
+ Round (h, a, b, c, d, e, f, g, 0xa831c66dul + (w9 += sigma1 (w7) + w2 + sigma0 (w10)));
184
+ Round (g, h, a, b, c, d, e, f, 0xb00327c8ul + (w10 += sigma1 (w8) + w3 + sigma0 (w11)));
185
+ Round (f, g, h, a, b, c, d, e, 0xbf597fc7ul + (w11 += sigma1 (w9) + w4 + sigma0 (w12)));
186
+ Round (e, f, g, h, a, b, c, d, 0xc6e00bf3ul + (w12 += sigma1 (w10) + w5 + sigma0 (w13)));
187
+ Round (d, e, f, g, h, a, b, c, 0xd5a79147ul + (w13 += sigma1 (w11) + w6 + sigma0 (w14)));
188
+ Round (c, d, e, f, g, h, a, b, 0x06ca6351ul + (w14 += sigma1 (w12) + w7 + sigma0 (w15)));
189
+ Round (b, c, d, e, f, g, h, a, 0x14292967ul + (w15 += sigma1 (w13) + w8 + sigma0 (w0)));
190
+ Round (a, b, c, d, e, f, g, h, 0x27b70a85ul + (w0 += sigma1 (w14) + w9 + sigma0 (w1)));
191
+ Round (h, a, b, c, d, e, f, g, 0x2e1b2138ul + (w1 += sigma1 (w15) + w10 + sigma0 (w2)));
192
+ Round (g, h, a, b, c, d, e, f, 0x4d2c6dfcul + (w2 += sigma1 (w0) + w11 + sigma0 (w3)));
193
+ Round (f, g, h, a, b, c, d, e, 0x53380d13ul + (w3 += sigma1 (w1) + w12 + sigma0 (w4)));
194
+ Round (e, f, g, h, a, b, c, d, 0x650a7354ul + (w4 += sigma1 (w2) + w13 + sigma0 (w5)));
195
+ Round (d, e, f, g, h, a, b, c, 0x766a0abbul + (w5 += sigma1 (w3) + w14 + sigma0 (w6)));
196
+ Round (c, d, e, f, g, h, a, b, 0x81c2c92eul + (w6 += sigma1 (w4) + w15 + sigma0 (w7)));
197
+ Round (b, c, d, e, f, g, h, a, 0x92722c85ul + (w7 += sigma1 (w5) + w0 + sigma0 (w8)));
198
+ Round (a, b, c, d, e, f, g, h, 0xa2bfe8a1ul + (w8 += sigma1 (w6) + w1 + sigma0 (w9)));
199
+ Round (h, a, b, c, d, e, f, g, 0xa81a664bul + (w9 += sigma1 (w7) + w2 + sigma0 (w10)));
200
+ Round (g, h, a, b, c, d, e, f, 0xc24b8b70ul + (w10 += sigma1 (w8) + w3 + sigma0 (w11)));
201
+ Round (f, g, h, a, b, c, d, e, 0xc76c51a3ul + (w11 += sigma1 (w9) + w4 + sigma0 (w12)));
202
+ Round (e, f, g, h, a, b, c, d, 0xd192e819ul + (w12 += sigma1 (w10) + w5 + sigma0 (w13)));
203
+ Round (d, e, f, g, h, a, b, c, 0xd6990624ul + (w13 += sigma1 (w11) + w6 + sigma0 (w14)));
204
+ Round (c, d, e, f, g, h, a, b, 0xf40e3585ul + (w14 += sigma1 (w12) + w7 + sigma0 (w15)));
205
+ Round (b, c, d, e, f, g, h, a, 0x106aa070ul + (w15 += sigma1 (w13) + w8 + sigma0 (w0)));
206
+ Round (a, b, c, d, e, f, g, h, 0x19a4c116ul + (w0 += sigma1 (w14) + w9 + sigma0 (w1)));
207
+ Round (h, a, b, c, d, e, f, g, 0x1e376c08ul + (w1 += sigma1 (w15) + w10 + sigma0 (w2)));
208
+ Round (g, h, a, b, c, d, e, f, 0x2748774cul + (w2 += sigma1 (w0) + w11 + sigma0 (w3)));
209
+ Round (f, g, h, a, b, c, d, e, 0x34b0bcb5ul + (w3 += sigma1 (w1) + w12 + sigma0 (w4)));
210
+ Round (e, f, g, h, a, b, c, d, 0x391c0cb3ul + (w4 += sigma1 (w2) + w13 + sigma0 (w5)));
211
+ Round (d, e, f, g, h, a, b, c, 0x4ed8aa4aul + (w5 += sigma1 (w3) + w14 + sigma0 (w6)));
212
+ Round (c, d, e, f, g, h, a, b, 0x5b9cca4ful + (w6 += sigma1 (w4) + w15 + sigma0 (w7)));
213
+ Round (b, c, d, e, f, g, h, a, 0x682e6ff3ul + (w7 += sigma1 (w5) + w0 + sigma0 (w8)));
214
+ Round (a, b, c, d, e, f, g, h, 0x748f82eeul + (w8 += sigma1 (w6) + w1 + sigma0 (w9)));
215
+ Round (h, a, b, c, d, e, f, g, 0x78a5636ful + (w9 += sigma1 (w7) + w2 + sigma0 (w10)));
216
+ Round (g, h, a, b, c, d, e, f, 0x84c87814ul + (w10 += sigma1 (w8) + w3 + sigma0 (w11)));
217
+ Round (f, g, h, a, b, c, d, e, 0x8cc70208ul + (w11 += sigma1 (w9) + w4 + sigma0 (w12)));
218
+ Round (e, f, g, h, a, b, c, d, 0x90befffaul + (w12 += sigma1 (w10) + w5 + sigma0 (w13)));
219
+ Round (d, e, f, g, h, a, b, c, 0xa4506cebul + (w13 += sigma1 (w11) + w6 + sigma0 (w14)));
220
+ Round (c, d, e, f, g, h, a, b, 0xbef9a3f7ul + (w14 + sigma1 (w12) + w7 + sigma0 (w15)));
221
+ Round (b, c, d, e, f, g, h, a, 0xc67178f2ul + (w15 + sigma1 (w13) + w8 + sigma0 (w0)));
222
+
223
+ a += 0x6a09e667ul ;
224
+ b += 0xbb67ae85ul ;
225
+ c += 0x3c6ef372ul ;
226
+ d += 0xa54ff53aul ;
227
+ e += 0x510e527ful ;
228
+ f += 0x9b05688cul ;
229
+ g += 0x1f83d9abul ;
230
+ h += 0x5be0cd19ul ;
231
+
232
+ uint32_t t0 = a, t1 = b, t2 = c, t3 = d, t4 = e, t5 = f, t6 = g, t7 = h;
233
+
234
+ // Transform 2
235
+ Round (a, b, c, d, e, f, g, h, 0xc28a2f98ul );
236
+ Round (h, a, b, c, d, e, f, g, 0x71374491ul );
237
+ Round (g, h, a, b, c, d, e, f, 0xb5c0fbcful );
238
+ Round (f, g, h, a, b, c, d, e, 0xe9b5dba5ul );
239
+ Round (e, f, g, h, a, b, c, d, 0x3956c25bul );
240
+ Round (d, e, f, g, h, a, b, c, 0x59f111f1ul );
241
+ Round (c, d, e, f, g, h, a, b, 0x923f82a4ul );
242
+ Round (b, c, d, e, f, g, h, a, 0xab1c5ed5ul );
243
+ Round (a, b, c, d, e, f, g, h, 0xd807aa98ul );
244
+ Round (h, a, b, c, d, e, f, g, 0x12835b01ul );
245
+ Round (g, h, a, b, c, d, e, f, 0x243185beul );
246
+ Round (f, g, h, a, b, c, d, e, 0x550c7dc3ul );
247
+ Round (e, f, g, h, a, b, c, d, 0x72be5d74ul );
248
+ Round (d, e, f, g, h, a, b, c, 0x80deb1feul );
249
+ Round (c, d, e, f, g, h, a, b, 0x9bdc06a7ul );
250
+ Round (b, c, d, e, f, g, h, a, 0xc19bf374ul );
251
+ Round (a, b, c, d, e, f, g, h, 0x649b69c1ul );
252
+ Round (h, a, b, c, d, e, f, g, 0xf0fe4786ul );
253
+ Round (g, h, a, b, c, d, e, f, 0x0fe1edc6ul );
254
+ Round (f, g, h, a, b, c, d, e, 0x240cf254ul );
255
+ Round (e, f, g, h, a, b, c, d, 0x4fe9346ful );
256
+ Round (d, e, f, g, h, a, b, c, 0x6cc984beul );
257
+ Round (c, d, e, f, g, h, a, b, 0x61b9411eul );
258
+ Round (b, c, d, e, f, g, h, a, 0x16f988faul );
259
+ Round (a, b, c, d, e, f, g, h, 0xf2c65152ul );
260
+ Round (h, a, b, c, d, e, f, g, 0xa88e5a6dul );
261
+ Round (g, h, a, b, c, d, e, f, 0xb019fc65ul );
262
+ Round (f, g, h, a, b, c, d, e, 0xb9d99ec7ul );
263
+ Round (e, f, g, h, a, b, c, d, 0x9a1231c3ul );
264
+ Round (d, e, f, g, h, a, b, c, 0xe70eeaa0ul );
265
+ Round (c, d, e, f, g, h, a, b, 0xfdb1232bul );
266
+ Round (b, c, d, e, f, g, h, a, 0xc7353eb0ul );
267
+ Round (a, b, c, d, e, f, g, h, 0x3069bad5ul );
268
+ Round (h, a, b, c, d, e, f, g, 0xcb976d5ful );
269
+ Round (g, h, a, b, c, d, e, f, 0x5a0f118ful );
270
+ Round (f, g, h, a, b, c, d, e, 0xdc1eeefdul );
271
+ Round (e, f, g, h, a, b, c, d, 0x0a35b689ul );
272
+ Round (d, e, f, g, h, a, b, c, 0xde0b7a04ul );
273
+ Round (c, d, e, f, g, h, a, b, 0x58f4ca9dul );
274
+ Round (b, c, d, e, f, g, h, a, 0xe15d5b16ul );
275
+ Round (a, b, c, d, e, f, g, h, 0x007f3e86ul );
276
+ Round (h, a, b, c, d, e, f, g, 0x37088980ul );
277
+ Round (g, h, a, b, c, d, e, f, 0xa507ea32ul );
278
+ Round (f, g, h, a, b, c, d, e, 0x6fab9537ul );
279
+ Round (e, f, g, h, a, b, c, d, 0x17406110ul );
280
+ Round (d, e, f, g, h, a, b, c, 0x0d8cd6f1ul );
281
+ Round (c, d, e, f, g, h, a, b, 0xcdaa3b6dul );
282
+ Round (b, c, d, e, f, g, h, a, 0xc0bbbe37ul );
283
+ Round (a, b, c, d, e, f, g, h, 0x83613bdaul );
284
+ Round (h, a, b, c, d, e, f, g, 0xdb48a363ul );
285
+ Round (g, h, a, b, c, d, e, f, 0x0b02e931ul );
286
+ Round (f, g, h, a, b, c, d, e, 0x6fd15ca7ul );
287
+ Round (e, f, g, h, a, b, c, d, 0x521afacaul );
288
+ Round (d, e, f, g, h, a, b, c, 0x31338431ul );
289
+ Round (c, d, e, f, g, h, a, b, 0x6ed41a95ul );
290
+ Round (b, c, d, e, f, g, h, a, 0x6d437890ul );
291
+ Round (a, b, c, d, e, f, g, h, 0xc39c91f2ul );
292
+ Round (h, a, b, c, d, e, f, g, 0x9eccabbdul );
293
+ Round (g, h, a, b, c, d, e, f, 0xb5c9a0e6ul );
294
+ Round (f, g, h, a, b, c, d, e, 0x532fb63cul );
295
+ Round (e, f, g, h, a, b, c, d, 0xd2c741c6ul );
296
+ Round (d, e, f, g, h, a, b, c, 0x07237ea3ul );
297
+ Round (c, d, e, f, g, h, a, b, 0xa4954b68ul );
298
+ Round (b, c, d, e, f, g, h, a, 0x4c191d76ul );
299
+
300
+ w0 = t0 + a;
301
+ w1 = t1 + b;
302
+ w2 = t2 + c;
303
+ w3 = t3 + d;
304
+ w4 = t4 + e;
305
+ w5 = t5 + f;
306
+ w6 = t6 + g;
307
+ w7 = t7 + h;
308
+
309
+ // Transform 3
310
+ a = 0x6a09e667ul ;
311
+ b = 0xbb67ae85ul ;
312
+ c = 0x3c6ef372ul ;
313
+ d = 0xa54ff53aul ;
314
+ e = 0x510e527ful ;
315
+ f = 0x9b05688cul ;
316
+ g = 0x1f83d9abul ;
317
+ h = 0x5be0cd19ul ;
318
+
319
+ Round (a, b, c, d, e, f, g, h, 0x428a2f98ul + w0);
320
+ Round (h, a, b, c, d, e, f, g, 0x71374491ul + w1);
321
+ Round (g, h, a, b, c, d, e, f, 0xb5c0fbcful + w2);
322
+ Round (f, g, h, a, b, c, d, e, 0xe9b5dba5ul + w3);
323
+ Round (e, f, g, h, a, b, c, d, 0x3956c25bul + w4);
324
+ Round (d, e, f, g, h, a, b, c, 0x59f111f1ul + w5);
325
+ Round (c, d, e, f, g, h, a, b, 0x923f82a4ul + w6);
326
+ Round (b, c, d, e, f, g, h, a, 0xab1c5ed5ul + w7);
327
+ Round (a, b, c, d, e, f, g, h, 0x5807aa98ul );
328
+ Round (h, a, b, c, d, e, f, g, 0x12835b01ul );
329
+ Round (g, h, a, b, c, d, e, f, 0x243185beul );
330
+ Round (f, g, h, a, b, c, d, e, 0x550c7dc3ul );
331
+ Round (e, f, g, h, a, b, c, d, 0x72be5d74ul );
332
+ Round (d, e, f, g, h, a, b, c, 0x80deb1feul );
333
+ Round (c, d, e, f, g, h, a, b, 0x9bdc06a7ul );
334
+ Round (b, c, d, e, f, g, h, a, 0xc19bf274ul );
335
+ Round (a, b, c, d, e, f, g, h, 0xe49b69c1ul + (w0 += sigma0 (w1)));
336
+ Round (h, a, b, c, d, e, f, g, 0xefbe4786ul + (w1 += 0xa00000ul + sigma0 (w2)));
337
+ Round (g, h, a, b, c, d, e, f, 0x0fc19dc6ul + (w2 += sigma1 (w0) + sigma0 (w3)));
338
+ Round (f, g, h, a, b, c, d, e, 0x240ca1ccul + (w3 += sigma1 (w1) + sigma0 (w4)));
339
+ Round (e, f, g, h, a, b, c, d, 0x2de92c6ful + (w4 += sigma1 (w2) + sigma0 (w5)));
340
+ Round (d, e, f, g, h, a, b, c, 0x4a7484aaul + (w5 += sigma1 (w3) + sigma0 (w6)));
341
+ Round (c, d, e, f, g, h, a, b, 0x5cb0a9dcul + (w6 += sigma1 (w4) + 0x100ul + sigma0 (w7)));
342
+ Round (b, c, d, e, f, g, h, a, 0x76f988daul + (w7 += sigma1 (w5) + w0 + 0x11002000ul ));
343
+ Round (a, b, c, d, e, f, g, h, 0x983e5152ul + (w8 = 0x80000000ul + sigma1 (w6) + w1));
344
+ Round (h, a, b, c, d, e, f, g, 0xa831c66dul + (w9 = sigma1 (w7) + w2));
345
+ Round (g, h, a, b, c, d, e, f, 0xb00327c8ul + (w10 = sigma1 (w8) + w3));
346
+ Round (f, g, h, a, b, c, d, e, 0xbf597fc7ul + (w11 = sigma1 (w9) + w4));
347
+ Round (e, f, g, h, a, b, c, d, 0xc6e00bf3ul + (w12 = sigma1 (w10) + w5));
348
+ Round (d, e, f, g, h, a, b, c, 0xd5a79147ul + (w13 = sigma1 (w11) + w6));
349
+ Round (c, d, e, f, g, h, a, b, 0x06ca6351ul + (w14 = sigma1 (w12) + w7 + 0x400022ul ));
350
+ Round (b, c, d, e, f, g, h, a, 0x14292967ul + (w15 = 0x100ul + sigma1 (w13) + w8 + sigma0 (w0)));
351
+ Round (a, b, c, d, e, f, g, h, 0x27b70a85ul + (w0 += sigma1 (w14) + w9 + sigma0 (w1)));
352
+ Round (h, a, b, c, d, e, f, g, 0x2e1b2138ul + (w1 += sigma1 (w15) + w10 + sigma0 (w2)));
353
+ Round (g, h, a, b, c, d, e, f, 0x4d2c6dfcul + (w2 += sigma1 (w0) + w11 + sigma0 (w3)));
354
+ Round (f, g, h, a, b, c, d, e, 0x53380d13ul + (w3 += sigma1 (w1) + w12 + sigma0 (w4)));
355
+ Round (e, f, g, h, a, b, c, d, 0x650a7354ul + (w4 += sigma1 (w2) + w13 + sigma0 (w5)));
356
+ Round (d, e, f, g, h, a, b, c, 0x766a0abbul + (w5 += sigma1 (w3) + w14 + sigma0 (w6)));
357
+ Round (c, d, e, f, g, h, a, b, 0x81c2c92eul + (w6 += sigma1 (w4) + w15 + sigma0 (w7)));
358
+ Round (b, c, d, e, f, g, h, a, 0x92722c85ul + (w7 += sigma1 (w5) + w0 + sigma0 (w8)));
359
+ Round (a, b, c, d, e, f, g, h, 0xa2bfe8a1ul + (w8 += sigma1 (w6) + w1 + sigma0 (w9)));
360
+ Round (h, a, b, c, d, e, f, g, 0xa81a664bul + (w9 += sigma1 (w7) + w2 + sigma0 (w10)));
361
+ Round (g, h, a, b, c, d, e, f, 0xc24b8b70ul + (w10 += sigma1 (w8) + w3 + sigma0 (w11)));
362
+ Round (f, g, h, a, b, c, d, e, 0xc76c51a3ul + (w11 += sigma1 (w9) + w4 + sigma0 (w12)));
363
+ Round (e, f, g, h, a, b, c, d, 0xd192e819ul + (w12 += sigma1 (w10) + w5 + sigma0 (w13)));
364
+ Round (d, e, f, g, h, a, b, c, 0xd6990624ul + (w13 += sigma1 (w11) + w6 + sigma0 (w14)));
365
+ Round (c, d, e, f, g, h, a, b, 0xf40e3585ul + (w14 += sigma1 (w12) + w7 + sigma0 (w15)));
366
+ Round (b, c, d, e, f, g, h, a, 0x106aa070ul + (w15 += sigma1 (w13) + w8 + sigma0 (w0)));
367
+ Round (a, b, c, d, e, f, g, h, 0x19a4c116ul + (w0 += sigma1 (w14) + w9 + sigma0 (w1)));
368
+ Round (h, a, b, c, d, e, f, g, 0x1e376c08ul + (w1 += sigma1 (w15) + w10 + sigma0 (w2)));
369
+ Round (g, h, a, b, c, d, e, f, 0x2748774cul + (w2 += sigma1 (w0) + w11 + sigma0 (w3)));
370
+ Round (f, g, h, a, b, c, d, e, 0x34b0bcb5ul + (w3 += sigma1 (w1) + w12 + sigma0 (w4)));
371
+ Round (e, f, g, h, a, b, c, d, 0x391c0cb3ul + (w4 += sigma1 (w2) + w13 + sigma0 (w5)));
372
+ Round (d, e, f, g, h, a, b, c, 0x4ed8aa4aul + (w5 += sigma1 (w3) + w14 + sigma0 (w6)));
373
+ Round (c, d, e, f, g, h, a, b, 0x5b9cca4ful + (w6 += sigma1 (w4) + w15 + sigma0 (w7)));
374
+ Round (b, c, d, e, f, g, h, a, 0x682e6ff3ul + (w7 += sigma1 (w5) + w0 + sigma0 (w8)));
375
+ Round (a, b, c, d, e, f, g, h, 0x748f82eeul + (w8 += sigma1 (w6) + w1 + sigma0 (w9)));
376
+ Round (h, a, b, c, d, e, f, g, 0x78a5636ful + (w9 += sigma1 (w7) + w2 + sigma0 (w10)));
377
+ Round (g, h, a, b, c, d, e, f, 0x84c87814ul + (w10 += sigma1 (w8) + w3 + sigma0 (w11)));
378
+ Round (f, g, h, a, b, c, d, e, 0x8cc70208ul + (w11 += sigma1 (w9) + w4 + sigma0 (w12)));
379
+ Round (e, f, g, h, a, b, c, d, 0x90befffaul + (w12 += sigma1 (w10) + w5 + sigma0 (w13)));
380
+ Round (d, e, f, g, h, a, b, c, 0xa4506cebul + (w13 += sigma1 (w11) + w6 + sigma0 (w14)));
381
+ Round (c, d, e, f, g, h, a, b, 0xbef9a3f7ul + (w14 + sigma1 (w12) + w7 + sigma0 (w15)));
382
+ Round (b, c, d, e, f, g, h, a, 0xc67178f2ul + (w15 + sigma1 (w13) + w8 + sigma0 (w0)));
383
+
384
+ // Output
385
+ WriteBE32 (out + 0 , a + 0x6a09e667ul );
386
+ WriteBE32 (out + 4 , b + 0xbb67ae85ul );
387
+ WriteBE32 (out + 8 , c + 0x3c6ef372ul );
388
+ WriteBE32 (out + 12 , d + 0xa54ff53aul );
389
+ WriteBE32 (out + 16 , e + 0x510e527ful );
390
+ WriteBE32 (out + 20 , f + 0x9b05688cul );
391
+ WriteBE32 (out + 24 , g + 0x1f83d9abul );
392
+ WriteBE32 (out + 28 , h + 0x5be0cd19ul );
393
+ }
394
+
144
395
} // namespace sha256
145
396
146
397
typedef void (*TransformType)(uint32_t *, const unsigned char *, size_t );
398
+ typedef void (*TransformD64Type)(unsigned char *, const unsigned char *);
399
+
400
+ template <TransformType tr>
401
+ void TransformD64Wrapper (unsigned char * out, const unsigned char * in)
402
+ {
403
+ uint32_t s[8 ];
404
+ static const unsigned char padding1[64 ] = {
405
+ 0x80 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
406
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
407
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
408
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 , 0
409
+ };
410
+ unsigned char buffer2[64 ] = {
411
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
412
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
413
+ 0x80 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
414
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0
415
+ };
416
+ sha256::Initialize (s);
417
+ tr (s, in, 1 );
418
+ tr (s, padding1, 1 );
419
+ WriteBE32 (buffer2 + 0 , s[0 ]);
420
+ WriteBE32 (buffer2 + 4 , s[1 ]);
421
+ WriteBE32 (buffer2 + 8 , s[2 ]);
422
+ WriteBE32 (buffer2 + 12 , s[3 ]);
423
+ WriteBE32 (buffer2 + 16 , s[4 ]);
424
+ WriteBE32 (buffer2 + 20 , s[5 ]);
425
+ WriteBE32 (buffer2 + 24 , s[6 ]);
426
+ WriteBE32 (buffer2 + 28 , s[7 ]);
427
+ sha256::Initialize (s);
428
+ tr (s, buffer2, 1 );
429
+ WriteBE32 (out + 0 , s[0 ]);
430
+ WriteBE32 (out + 4 , s[1 ]);
431
+ WriteBE32 (out + 8 , s[2 ]);
432
+ WriteBE32 (out + 12 , s[3 ]);
433
+ WriteBE32 (out + 16 , s[4 ]);
434
+ WriteBE32 (out + 20 , s[5 ]);
435
+ WriteBE32 (out + 24 , s[6 ]);
436
+ WriteBE32 (out + 28 , s[7 ]);
437
+ }
147
438
148
439
bool SelfTest (TransformType tr) {
149
440
static const unsigned char in1[65 ] = {0 , 0x80 };
@@ -173,7 +464,7 @@ bool SelfTest(TransformType tr) {
173
464
}
174
465
175
466
TransformType Transform = sha256::Transform;
176
-
467
+ TransformD64Type TransformD64 = sha256::TransformD64;
177
468
} // namespace
178
469
179
470
std::string SHA256AutoDetect ()
@@ -182,6 +473,7 @@ std::string SHA256AutoDetect()
182
473
uint32_t eax, ebx, ecx, edx;
183
474
if (__get_cpuid (1 , &eax, &ebx, &ecx, &edx) && (ecx >> 19 ) & 1 ) {
184
475
Transform = sha256_sse4::Transform;
476
+ TransformD64 = TransformD64Wrapper<sha256_sse4::Transform>;
185
477
assert (SelfTest (Transform));
186
478
return " sse4" ;
187
479
}
@@ -247,3 +539,13 @@ CSHA256& CSHA256::Reset()
247
539
sha256::Initialize (s);
248
540
return *this ;
249
541
}
542
+
543
+ void SHA256D64 (unsigned char * out, const unsigned char * in, size_t blocks)
544
+ {
545
+ while (blocks) {
546
+ TransformD64 (out, in);
547
+ out += 32 ;
548
+ in += 64 ;
549
+ --blocks;
550
+ }
551
+ }
0 commit comments