12#if !defined(DISABLE_OPTIMIZED_SHA256)
15#if defined(__linux__) && defined(ENABLE_ARM_SHANI)
20#if defined(__APPLE__) && defined(ENABLE_ARM_SHANI)
22#include <sys/sysctl.h>
25#if defined(__x86_64__) || defined(__amd64__) || defined(__i386__)
71uint32_t inline Sigma0(
uint32_t x) {
return (x >> 2 | x << 30) ^ (x >> 13 | x << 19) ^ (x >> 22 | x << 10); }
72uint32_t inline Sigma1(
uint32_t x) {
return (x >> 6 | x << 26) ^ (x >> 11 | x << 21) ^ (x >> 25 | x << 7); }
102 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];
103 uint32_t w0,
w1,
w2,
w3,
w4,
w5,
w6,
w7,
w8,
w9,
w10,
w11,
w12,
w13,
w14,
w15;
185void TransformD64(
unsigned char* out,
const unsigned char* in)
197 uint32_t w0,
w1,
w2,
w3,
w4,
w5,
w6,
w7,
w8,
w9,
w10,
w11,
w12,
w13,
w14,
w15;
441template<TransformType tr>
445 static const unsigned char padding1[64] = {
446 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
447 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
448 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
449 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0
452 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
453 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
454 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
455 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0
457 sha256::Initialize(s);
468 sha256::Initialize(s);
489 0x6a09e667ul, 0xbb67ae85ul, 0x3c6ef372ul, 0xa54ff53aul, 0x510e527ful, 0x9b05688cul, 0x1f83d9abul, 0x5be0cd19ul
492 static const unsigned char data[641] =
"-"
493 "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do "
494 "eiusmod tempor incididunt ut labore et dolore magna aliqua. Et m"
495 "olestie ac feugiat sed lectus vestibulum mattis ullamcorper. Mor"
496 "bi blandit cursus risus at ultrices mi tempus imperdiet nulla. N"
497 "unc congue nisi vita suscipit tellus mauris. Imperdiet proin fer"
498 "mentum leo vel orci. Massa tempor nec feugiat nisl pretium fusce"
499 " id velit. Telus in metus vulputate eu scelerisque felis. Mi tem"
500 "pus imperdiet nulla malesuada pellentesque. Tristique magna sit.";
502 static const uint32_t result[9][8] = {
503 {0x6a09e667ul, 0xbb67ae85ul, 0x3c6ef372ul, 0xa54ff53aul, 0x510e527ful, 0x9b05688cul, 0x1f83d9abul, 0x5be0cd19ul},
504 {0x91f8ec6bul, 0x4da10fe3ul, 0x1c9c292cul, 0x45e18185ul, 0x435cc111ul, 0x3ca26f09ul, 0xeb954caeul, 0x402a7069ul},
505 {0xcabea5acul, 0x374fb97cul, 0x182ad996ul, 0x7bd69cbful, 0x450ff900ul, 0xc1d2be8aul, 0x6a41d505ul, 0xe6212dc3ul},
506 {0xbcff09d6ul, 0x3e76f36eul, 0x3ecb2501ul, 0x78866e97ul, 0xe1c1e2fdul, 0x32f4eafful, 0x8aa6c4e5ul, 0xdfc024bcul},
507 {0xa08c5d94ul, 0x0a862f93ul, 0x6b7f2f40ul, 0x8f9fae76ul, 0x6d40439ful, 0x79dcee0cul, 0x3e39ff3aul, 0xdc3bdbb1ul},
508 {0x216a0895ul, 0x9f1a3662ul, 0xe99946f9ul, 0x87ba4364ul, 0x0fb5db2cul, 0x12bed3d3ul, 0x6689c0c7ul, 0x292f1b04ul},
509 {0xca3067f8ul, 0xbc8c2656ul, 0x37cb7e0dul, 0x9b6b8b0ful, 0x46dc380bul, 0xf1287f57ul, 0xc42e4b23ul, 0x3fefe94dul},
510 {0x3e4c4039ul, 0xbb6fca8cul, 0x6f27d2f7ul, 0x301e44a4ul, 0x8352ba14ul, 0x5769ce37ul, 0x48a1155ful, 0xc0e1c4c6ul},
511 {0xfe2fa9ddul, 0x69d0862bul, 0x1ae0db23ul, 0x471f9244ul, 0xf55c0145ul, 0xc30f9c3bul, 0x40a84ea0ul, 0x5b8a266cul},
514 static const unsigned char result_d64[256] = {
515 0x09, 0x3a, 0xc4, 0xd0, 0x0f, 0xf7, 0x57, 0xe1, 0x72, 0x85, 0x79, 0x42, 0xfe, 0xe7, 0xe0, 0xa0,
516 0xfc, 0x52, 0xd7, 0xdb, 0x07, 0x63, 0x45, 0xfb, 0x53, 0x14, 0x7d, 0x17, 0x22, 0x86, 0xf0, 0x52,
517 0x48, 0xb6, 0x11, 0x9e, 0x6e, 0x48, 0x81, 0x6d, 0xcc, 0x57, 0x1f, 0xb2, 0x97, 0xa8, 0xd5, 0x25,
518 0x9b, 0x82, 0xaa, 0x89, 0xe2, 0xfd, 0x2d, 0x56, 0xe8, 0x28, 0x83, 0x0b, 0xe2, 0xfa, 0x53, 0xb7,
519 0xd6, 0x6b, 0x07, 0x85, 0x83, 0xb0, 0x10, 0xa2, 0xf5, 0x51, 0x3c, 0xf9, 0x60, 0x03, 0xab, 0x45,
520 0x6c, 0x15, 0x6e, 0xef, 0xb5, 0xac, 0x3e, 0x6c, 0xdf, 0xb4, 0x92, 0x22, 0x2d, 0xce, 0xbf, 0x3e,
521 0xe9, 0xe5, 0xf6, 0x29, 0x0e, 0x01, 0x4f, 0xd2, 0xd4, 0x45, 0x65, 0xb3, 0xbb, 0xf2, 0x4c, 0x16,
522 0x37, 0x50, 0x3c, 0x6e, 0x49, 0x8c, 0x5a, 0x89, 0x2b, 0x1b, 0xab, 0xc4, 0x37, 0xd1, 0x46, 0xe9,
523 0x3d, 0x0e, 0x85, 0xa2, 0x50, 0x73, 0xa1, 0x5e, 0x54, 0x37, 0xd7, 0x94, 0x17, 0x56, 0xc2, 0xd8,
524 0xe5, 0x9f, 0xed, 0x4e, 0xae, 0x15, 0x42, 0x06, 0x0d, 0x74, 0x74, 0x5e, 0x24, 0x30, 0xce, 0xd1,
525 0x9e, 0x50, 0xa3, 0x9a, 0xb8, 0xf0, 0x4a, 0x57, 0x69, 0x78, 0x67, 0x12, 0x84, 0x58, 0xbe, 0xc7,
526 0x36, 0xaa, 0xee, 0x7c, 0x64, 0xa3, 0x76, 0xec, 0xff, 0x55, 0x41, 0x00, 0x2a, 0x44, 0x68, 0x4d,
527 0xb6, 0x53, 0x9e, 0x1c, 0x95, 0xb7, 0xca, 0xdc, 0x7f, 0x7d, 0x74, 0x27, 0x5c, 0x8e, 0xa6, 0x84,
528 0xb5, 0xac, 0x87, 0xa9, 0xf3, 0xff, 0x75, 0xf2, 0x34, 0xcd, 0x1a, 0x3b, 0x82, 0x2c, 0x2b, 0x4e,
529 0x6a, 0x46, 0x30, 0xa6, 0x89, 0x86, 0x23, 0xac, 0xf8, 0xa5, 0x15, 0xe9, 0x0a, 0xaa, 0x1e, 0x9a,
530 0xd7, 0x93, 0x6b, 0x28, 0xe4, 0x3b, 0xfd, 0x59, 0xc6, 0xed, 0x7c, 0x5f, 0xa5, 0x41, 0xcb, 0x51
535 for (
size_t i = 0; i <= 8; ++i) {
539 if (!std::equal(state, state + 8, result[i]))
return false;
543 unsigned char out[32];
545 if (!std::equal(out, out + 32,
result_d64))
return false;
549 unsigned char out[64];
551 if (!std::equal(out, out + 64,
result_d64))
return false;
556 unsigned char out[128];
558 if (!std::equal(out, out + 128,
result_d64))
return false;
563 unsigned char out[256];
565 if (!std::equal(out, out + 256,
result_d64))
return false;
571#if !defined(DISABLE_OPTIMIZED_SHA256)
572#if (defined(__x86_64__) || defined(__amd64__) || defined(__i386__))
577 __asm__(
"xgetbv" :
"=a"(
a),
"=d"(d) :
"c"(0));
587 std::string
ret =
"standard";
588 Transform = sha256::Transform;
594#if !defined(DISABLE_OPTIMIZED_SHA256)
595#if defined(HAVE_GETCPUID)
623#if defined(ENABLE_SSE41) && defined(ENABLE_X86_SHANI)
628 ret =
"x86_shani(1way;2way)";
635#if defined(__x86_64__) || defined(__amd64__)
636 Transform = sha256_sse4::Transform;
640#if defined(ENABLE_SSE41)
642 ret +=
";sse41(4way)";
646#if defined(ENABLE_AVX2)
649 ret +=
";avx2(8way)";
654#if defined(ENABLE_ARM_SHANI)
657#if defined(__linux__)
663#if defined(__aarch64__)
670#if defined(__APPLE__)
672 size_t len =
sizeof(val);
673 if (
sysctlbyname(
"hw.optional.arm.FEAT_SHA256", &val, &len,
nullptr, 0) == 0) {
683 ret =
"arm_shani(1way;2way)";
696 sha256::Initialize(
s);
701 const unsigned char* end = data + len;
708 Transform(
s,
buf, 1);
711 if (end - data >= 64) {
712 size_t blocks = (end - data) / 64;
727 static const unsigned char pad[64] = {0x80};
745 sha256::Initialize(
s);
A hasher class for SHA-256.
void Finalize(unsigned char hash[OUTPUT_SIZE])
CSHA256 & Write(const unsigned char *data, size_t len)
void WriteBE32(B *ptr, uint32_t x)
void WriteBE64(B *ptr, uint64_t x)
uint32_t ReadBE32(const B *ptr)
#define Round(a, b, c, d, e, f, g, h, k, w)
void Transform(uint32_t *s, const unsigned char *chunk, size_t blocks)
void Transform(uint32_t *s, const unsigned char *chunk, size_t blocks)
Internal SHA-256 implementation.
void Transform_2way(unsigned char *out, const unsigned char *in)
void Transform_8way(unsigned char *out, const unsigned char *in)
void Transform_4way(unsigned char *out, const unsigned char *in)
void Transform_2way(unsigned char *out, const unsigned char *in)
void SHA256D64(unsigned char *out, const unsigned char *in, size_t blocks)
Compute multiple double-SHA256's of 64-byte blobs.
std::string SHA256AutoDetect(sha256_implementation::UseImplementation use_implementation)
Autodetect the best available SHA256 implementation.
constexpr auto Ticks(Dur2 d)
Helper to count the seconds of a duration/time_point.