@@ -446,38 +446,90 @@ void TransformD64Wrapper(unsigned char* out, const unsigned char* in)
446
446
WriteBE32 (out + 28 , s[7 ]);
447
447
}
448
448
449
- bool SelfTest (TransformType tr) {
450
- static const unsigned char in1[65 ] = {0 , 0x80 };
451
- static const unsigned char in2[129 ] = {
452
- 0 ,
453
- 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 ,
454
- 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 ,
455
- 0x80 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
456
- 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 , 0
457
- };
458
- static const uint32_t init[8 ] = {0x6a09e667ul , 0xbb67ae85ul , 0x3c6ef372ul , 0xa54ff53aul , 0x510e527ful , 0x9b05688cul , 0x1f83d9abul , 0x5be0cd19ul };
459
- static const uint32_t out1[8 ] = {0xe3b0c442ul , 0x98fc1c14ul , 0x9afbf4c8ul , 0x996fb924ul , 0x27ae41e4ul , 0x649b934cul , 0xa495991bul , 0x7852b855ul };
460
- static const uint32_t out2[8 ] = {0xce4153b0ul , 0x147c2a86ul , 0x3ed4298eul , 0xe0676bc8ul , 0x79fc77a1ul , 0x2abe1f49ul , 0xb2b055dful , 0x1069523eul };
461
- uint32_t buf[8 ];
462
- memcpy (buf, init, sizeof (buf));
463
- // Process nothing, and check we remain in the initial state.
464
- tr (buf, nullptr , 0 );
465
- if (memcmp (buf, init, sizeof (buf))) return false ;
466
- // Process the padded empty string (unaligned)
467
- tr (buf, in1 + 1 , 1 );
468
- if (memcmp (buf, out1, sizeof (buf))) return false ;
469
- // Process 64 spaces (unaligned)
470
- memcpy (buf, init, sizeof (buf));
471
- tr (buf, in2 + 1 , 2 );
472
- if (memcmp (buf, out2, sizeof (buf))) return false ;
473
- return true ;
474
- }
475
-
476
449
TransformType Transform = sha256::Transform;
477
450
TransformD64Type TransformD64 = sha256::TransformD64;
478
451
TransformD64Type TransformD64_4way = nullptr ;
479
452
TransformD64Type TransformD64_8way = nullptr ;
480
453
454
+ bool SelfTest () {
455
+ // Input state (equal to the initial SHA256 state)
456
+ static const uint32_t init[8 ] = {
457
+ 0x6a09e667ul , 0xbb67ae85ul , 0x3c6ef372ul , 0xa54ff53aul , 0x510e527ful , 0x9b05688cul , 0x1f83d9abul , 0x5be0cd19ul
458
+ };
459
+ // Some random input data to test with
460
+ static const unsigned char data[641 ] = " -" // Intentionally not aligned
461
+ " Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do "
462
+ " eiusmod tempor incididunt ut labore et dolore magna aliqua. Et m"
463
+ " olestie ac feugiat sed lectus vestibulum mattis ullamcorper. Mor"
464
+ " bi blandit cursus risus at ultrices mi tempus imperdiet nulla. N"
465
+ " unc congue nisi vita suscipit tellus mauris. Imperdiet proin fer"
466
+ " mentum leo vel orci. Massa tempor nec feugiat nisl pretium fusce"
467
+ " id velit. Telus in metus vulputate eu scelerisque felis. Mi tem"
468
+ " pus imperdiet nulla malesuada pellentesque. Tristique magna sit." ;
469
+ // Expected output state for hashing the i*64 first input bytes above (excluding SHA256 padding).
470
+ static const uint32_t result[9 ][8 ] = {
471
+ {0x6a09e667ul , 0xbb67ae85ul , 0x3c6ef372ul , 0xa54ff53aul , 0x510e527ful , 0x9b05688cul , 0x1f83d9abul , 0x5be0cd19ul },
472
+ {0x91f8ec6bul , 0x4da10fe3ul , 0x1c9c292cul , 0x45e18185ul , 0x435cc111ul , 0x3ca26f09ul , 0xeb954caeul , 0x402a7069ul },
473
+ {0xcabea5acul , 0x374fb97cul , 0x182ad996ul , 0x7bd69cbful , 0x450ff900ul , 0xc1d2be8aul , 0x6a41d505ul , 0xe6212dc3ul },
474
+ {0xbcff09d6ul , 0x3e76f36eul , 0x3ecb2501ul , 0x78866e97ul , 0xe1c1e2fdul , 0x32f4eafful , 0x8aa6c4e5ul , 0xdfc024bcul },
475
+ {0xa08c5d94ul , 0x0a862f93ul , 0x6b7f2f40ul , 0x8f9fae76ul , 0x6d40439ful , 0x79dcee0cul , 0x3e39ff3aul , 0xdc3bdbb1ul },
476
+ {0x216a0895ul , 0x9f1a3662ul , 0xe99946f9ul , 0x87ba4364ul , 0x0fb5db2cul , 0x12bed3d3ul , 0x6689c0c7ul , 0x292f1b04ul },
477
+ {0xca3067f8ul , 0xbc8c2656ul , 0x37cb7e0dul , 0x9b6b8b0ful , 0x46dc380bul , 0xf1287f57ul , 0xc42e4b23ul , 0x3fefe94dul },
478
+ {0x3e4c4039ul , 0xbb6fca8cul , 0x6f27d2f7ul , 0x301e44a4ul , 0x8352ba14ul , 0x5769ce37ul , 0x48a1155ful , 0xc0e1c4c6ul },
479
+ {0xfe2fa9ddul , 0x69d0862bul , 0x1ae0db23ul , 0x471f9244ul , 0xf55c0145ul , 0xc30f9c3bul , 0x40a84ea0ul , 0x5b8a266cul },
480
+ };
481
+ // Expected output for each of the individual 8 64-byte messages under full double SHA256 (including padding).
482
+ static const unsigned char result_d64[256 ] = {
483
+ 0x09 , 0x3a , 0xc4 , 0xd0 , 0x0f , 0xf7 , 0x57 , 0xe1 , 0x72 , 0x85 , 0x79 , 0x42 , 0xfe , 0xe7 , 0xe0 , 0xa0 ,
484
+ 0xfc , 0x52 , 0xd7 , 0xdb , 0x07 , 0x63 , 0x45 , 0xfb , 0x53 , 0x14 , 0x7d , 0x17 , 0x22 , 0x86 , 0xf0 , 0x52 ,
485
+ 0x48 , 0xb6 , 0x11 , 0x9e , 0x6e , 0x48 , 0x81 , 0x6d , 0xcc , 0x57 , 0x1f , 0xb2 , 0x97 , 0xa8 , 0xd5 , 0x25 ,
486
+ 0x9b , 0x82 , 0xaa , 0x89 , 0xe2 , 0xfd , 0x2d , 0x56 , 0xe8 , 0x28 , 0x83 , 0x0b , 0xe2 , 0xfa , 0x53 , 0xb7 ,
487
+ 0xd6 , 0x6b , 0x07 , 0x85 , 0x83 , 0xb0 , 0x10 , 0xa2 , 0xf5 , 0x51 , 0x3c , 0xf9 , 0x60 , 0x03 , 0xab , 0x45 ,
488
+ 0x6c , 0x15 , 0x6e , 0xef , 0xb5 , 0xac , 0x3e , 0x6c , 0xdf , 0xb4 , 0x92 , 0x22 , 0x2d , 0xce , 0xbf , 0x3e ,
489
+ 0xe9 , 0xe5 , 0xf6 , 0x29 , 0x0e , 0x01 , 0x4f , 0xd2 , 0xd4 , 0x45 , 0x65 , 0xb3 , 0xbb , 0xf2 , 0x4c , 0x16 ,
490
+ 0x37 , 0x50 , 0x3c , 0x6e , 0x49 , 0x8c , 0x5a , 0x89 , 0x2b , 0x1b , 0xab , 0xc4 , 0x37 , 0xd1 , 0x46 , 0xe9 ,
491
+ 0x3d , 0x0e , 0x85 , 0xa2 , 0x50 , 0x73 , 0xa1 , 0x5e , 0x54 , 0x37 , 0xd7 , 0x94 , 0x17 , 0x56 , 0xc2 , 0xd8 ,
492
+ 0xe5 , 0x9f , 0xed , 0x4e , 0xae , 0x15 , 0x42 , 0x06 , 0x0d , 0x74 , 0x74 , 0x5e , 0x24 , 0x30 , 0xce , 0xd1 ,
493
+ 0x9e , 0x50 , 0xa3 , 0x9a , 0xb8 , 0xf0 , 0x4a , 0x57 , 0x69 , 0x78 , 0x67 , 0x12 , 0x84 , 0x58 , 0xbe , 0xc7 ,
494
+ 0x36 , 0xaa , 0xee , 0x7c , 0x64 , 0xa3 , 0x76 , 0xec , 0xff , 0x55 , 0x41 , 0x00 , 0x2a , 0x44 , 0x68 , 0x4d ,
495
+ 0xb6 , 0x53 , 0x9e , 0x1c , 0x95 , 0xb7 , 0xca , 0xdc , 0x7f , 0x7d , 0x74 , 0x27 , 0x5c , 0x8e , 0xa6 , 0x84 ,
496
+ 0xb5 , 0xac , 0x87 , 0xa9 , 0xf3 , 0xff , 0x75 , 0xf2 , 0x34 , 0xcd , 0x1a , 0x3b , 0x82 , 0x2c , 0x2b , 0x4e ,
497
+ 0x6a , 0x46 , 0x30 , 0xa6 , 0x89 , 0x86 , 0x23 , 0xac , 0xf8 , 0xa5 , 0x15 , 0xe9 , 0x0a , 0xaa , 0x1e , 0x9a ,
498
+ 0xd7 , 0x93 , 0x6b , 0x28 , 0xe4 , 0x3b , 0xfd , 0x59 , 0xc6 , 0xed , 0x7c , 0x5f , 0xa5 , 0x41 , 0xcb , 0x51
499
+ };
500
+
501
+
502
+ // Test Transform() for 0 through 8 transformations.
503
+ for (size_t i = 0 ; i <= 8 ; ++i) {
504
+ uint32_t state[8 ];
505
+ std::copy (init, init + 8 , state);
506
+ Transform (state, data + 1 , i);
507
+ if (!std::equal (state, state + 8 , result[i])) return false ;
508
+ }
509
+
510
+ // Test TransformD64
511
+ unsigned char out[32 ];
512
+ TransformD64 (out, data + 1 );
513
+ if (!std::equal (out, out + 32 , result_d64)) return false ;
514
+
515
+ // Test TransformD64_4way, if available.
516
+ if (TransformD64_4way) {
517
+ unsigned char out[128 ];
518
+ TransformD64_4way (out, data + 1 );
519
+ if (!std::equal (out, out + 128 , result_d64)) return false ;
520
+ }
521
+
522
+ // Test TransformD64_8way, if available.
523
+ if (TransformD64_8way) {
524
+ unsigned char out[256 ];
525
+ TransformD64_8way (out, data + 1 );
526
+ if (!std::equal (out, out + 256 , result_d64)) return false ;
527
+ }
528
+
529
+ return true ;
530
+ }
531
+
532
+
481
533
#if defined(USE_ASM) && (defined(__x86_64__) || defined(__amd64__) || defined(__i386__))
482
534
// We can't use cpuid.h's __get_cpuid as it does not support subleafs.
483
535
void inline cpuid (uint32_t leaf, uint32_t subleaf, uint32_t & a, uint32_t & b, uint32_t & c, uint32_t & d)
@@ -515,7 +567,7 @@ std::string SHA256AutoDetect()
515
567
}
516
568
#endif
517
569
518
- assert (SelfTest (Transform ));
570
+ assert (SelfTest ());
519
571
return ret;
520
572
}
521
573
0 commit comments