13#if defined(__x86_64__) || defined(__amd64__) || defined(__i386__)
42 return z ^ (x & (y ^ z));
45 return (x & y) | (z & (x | y));
48 return (x >> 2 | x << 30) ^ (x >> 13 | x << 19) ^ (x >> 22 | x << 10);
51 return (x >> 6 | x << 26) ^ (x >> 11 | x << 21) ^ (x >> 25 | x << 7);
54 return (x >> 7 | x << 25) ^ (x >> 18 | x << 14) ^ (x >> 3);
57 return (x >> 17 | x << 15) ^ (x >> 19 | x << 13) ^ (x >> 10);
71 inline void Initialize(
uint32_t *s) {
87 uint32_t a = s[0],
b = s[1],
c = s[2], d = s[3],
e = s[4],
f = s[5],
89 uint32_t w0,
w1,
w2,
w3,
w4,
w5,
w6,
w7,
w8,
w9,
w10,
w11,
w12,
w13,
247 uint32_t w0,
w1,
w2,
w3,
w4,
w5,
w6,
w7,
w8,
w9,
w10,
w11,
w12,
w13,
477 0xefbe4786ul + (
w1 += 0xa00000ul +
sigma0(
w2)));
582template <TransformType tr>
586 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
587 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
588 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0};
589 uint8_t buffer2[64] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
590 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
591 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
592 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0};
593 sha256::Initialize(s);
604 sha256::Initialize(s);
624 static const uint32_t init[8] = {0x6a09e667ul, 0xbb67ae85ul, 0x3c6ef372ul,
625 0xa54ff53aul, 0x510e527ful, 0x9b05688cul,
626 0x1f83d9abul, 0x5be0cd19ul};
628 static const uint8_t data[641] =
630 "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do "
631 "eiusmod tempor incididunt ut labore et dolore magna aliqua. Et m"
632 "olestie ac feugiat sed lectus vestibulum mattis ullamcorper. Mor"
633 "bi blandit cursus risus at ultrices mi tempus imperdiet nulla. N"
634 "unc congue nisi vita suscipit tellus mauris. Imperdiet proin fer"
635 "mentum leo vel orci. Massa tempor nec feugiat nisl pretium fusce"
636 " id velit. Telus in metus vulputate eu scelerisque felis. Mi tem"
637 "pus imperdiet nulla malesuada pellentesque. Tristique magna sit.";
640 static const uint32_t result[9][8] = {
641 {0x6a09e667ul, 0xbb67ae85ul, 0x3c6ef372ul, 0xa54ff53aul, 0x510e527ful,
642 0x9b05688cul, 0x1f83d9abul, 0x5be0cd19ul},
643 {0x91f8ec6bul, 0x4da10fe3ul, 0x1c9c292cul, 0x45e18185ul, 0x435cc111ul,
644 0x3ca26f09ul, 0xeb954caeul, 0x402a7069ul},
645 {0xcabea5acul, 0x374fb97cul, 0x182ad996ul, 0x7bd69cbful, 0x450ff900ul,
646 0xc1d2be8aul, 0x6a41d505ul, 0xe6212dc3ul},
647 {0xbcff09d6ul, 0x3e76f36eul, 0x3ecb2501ul, 0x78866e97ul, 0xe1c1e2fdul,
648 0x32f4eafful, 0x8aa6c4e5ul, 0xdfc024bcul},
649 {0xa08c5d94ul, 0x0a862f93ul, 0x6b7f2f40ul, 0x8f9fae76ul, 0x6d40439ful,
650 0x79dcee0cul, 0x3e39ff3aul, 0xdc3bdbb1ul},
651 {0x216a0895ul, 0x9f1a3662ul, 0xe99946f9ul, 0x87ba4364ul, 0x0fb5db2cul,
652 0x12bed3d3ul, 0x6689c0c7ul, 0x292f1b04ul},
653 {0xca3067f8ul, 0xbc8c2656ul, 0x37cb7e0dul, 0x9b6b8b0ful, 0x46dc380bul,
654 0xf1287f57ul, 0xc42e4b23ul, 0x3fefe94dul},
655 {0x3e4c4039ul, 0xbb6fca8cul, 0x6f27d2f7ul, 0x301e44a4ul, 0x8352ba14ul,
656 0x5769ce37ul, 0x48a1155ful, 0xc0e1c4c6ul},
657 {0xfe2fa9ddul, 0x69d0862bul, 0x1ae0db23ul, 0x471f9244ul, 0xf55c0145ul,
658 0xc30f9c3bul, 0x40a84ea0ul, 0x5b8a266cul},
663 0x09, 0x3a, 0xc4, 0xd0, 0x0f, 0xf7, 0x57, 0xe1, 0x72, 0x85, 0x79, 0x42,
664 0xfe, 0xe7, 0xe0, 0xa0, 0xfc, 0x52, 0xd7, 0xdb, 0x07, 0x63, 0x45, 0xfb,
665 0x53, 0x14, 0x7d, 0x17, 0x22, 0x86, 0xf0, 0x52, 0x48, 0xb6, 0x11, 0x9e,
666 0x6e, 0x48, 0x81, 0x6d, 0xcc, 0x57, 0x1f, 0xb2, 0x97, 0xa8, 0xd5, 0x25,
667 0x9b, 0x82, 0xaa, 0x89, 0xe2, 0xfd, 0x2d, 0x56, 0xe8, 0x28, 0x83, 0x0b,
668 0xe2, 0xfa, 0x53, 0xb7, 0xd6, 0x6b, 0x07, 0x85, 0x83, 0xb0, 0x10, 0xa2,
669 0xf5, 0x51, 0x3c, 0xf9, 0x60, 0x03, 0xab, 0x45, 0x6c, 0x15, 0x6e, 0xef,
670 0xb5, 0xac, 0x3e, 0x6c, 0xdf, 0xb4, 0x92, 0x22, 0x2d, 0xce, 0xbf, 0x3e,
671 0xe9, 0xe5, 0xf6, 0x29, 0x0e, 0x01, 0x4f, 0xd2, 0xd4, 0x45, 0x65, 0xb3,
672 0xbb, 0xf2, 0x4c, 0x16, 0x37, 0x50, 0x3c, 0x6e, 0x49, 0x8c, 0x5a, 0x89,
673 0x2b, 0x1b, 0xab, 0xc4, 0x37, 0xd1, 0x46, 0xe9, 0x3d, 0x0e, 0x85, 0xa2,
674 0x50, 0x73, 0xa1, 0x5e, 0x54, 0x37, 0xd7, 0x94, 0x17, 0x56, 0xc2, 0xd8,
675 0xe5, 0x9f, 0xed, 0x4e, 0xae, 0x15, 0x42, 0x06, 0x0d, 0x74, 0x74, 0x5e,
676 0x24, 0x30, 0xce, 0xd1, 0x9e, 0x50, 0xa3, 0x9a, 0xb8, 0xf0, 0x4a, 0x57,
677 0x69, 0x78, 0x67, 0x12, 0x84, 0x58, 0xbe, 0xc7, 0x36, 0xaa, 0xee, 0x7c,
678 0x64, 0xa3, 0x76, 0xec, 0xff, 0x55, 0x41, 0x00, 0x2a, 0x44, 0x68, 0x4d,
679 0xb6, 0x53, 0x9e, 0x1c, 0x95, 0xb7, 0xca, 0xdc, 0x7f, 0x7d, 0x74, 0x27,
680 0x5c, 0x8e, 0xa6, 0x84, 0xb5, 0xac, 0x87, 0xa9, 0xf3, 0xff, 0x75, 0xf2,
681 0x34, 0xcd, 0x1a, 0x3b, 0x82, 0x2c, 0x2b, 0x4e, 0x6a, 0x46, 0x30, 0xa6,
682 0x89, 0x86, 0x23, 0xac, 0xf8, 0xa5, 0x15, 0xe9, 0x0a, 0xaa, 0x1e, 0x9a,
683 0xd7, 0x93, 0x6b, 0x28, 0xe4, 0x3b, 0xfd, 0x59, 0xc6, 0xed, 0x7c, 0x5f,
684 0xa5, 0x41, 0xcb, 0x51};
687 for (
size_t i = 0; i <= 8; ++i) {
691 if (!std::equal(state, state + 8, result[i])) {
718 if (!std::equal(out, out + 128,
result_d64)) {
727 if (!std::equal(out, out + 256,
result_d64)) {
735#if defined(USE_ASM) && \
736 (defined(__x86_64__) || defined(__amd64__) || defined(__i386__))
740 __asm__(
"xgetbv" :
"=a"(
a),
"=d"(d) :
"c"(0));
747 std::string
ret =
"standard";
748#if defined(USE_ASM) && defined(HAVE_GETCPUID)
778#if defined(ENABLE_SHANI) && !defined(BUILD_BITCOIN_INTERNAL)
783 ret =
"shani(1way,2way)";
790#if defined(__x86_64__) || defined(__amd64__)
791 Transform = sha256_sse4::Transform;
795#if defined(ENABLE_SSE41) && !defined(BUILD_BITCOIN_INTERNAL)
797 ret +=
",sse41(4way)";
801#if defined(ENABLE_AVX2) && !defined(BUILD_BITCOIN_INTERNAL)
804 ret +=
",avx2(8way)";
816 sha256::Initialize(
s);
827 Transform(
s,
buf, 1);
830 if (end - data >= 64) {
831 size_t blocks = (end - data) / 64;
832 Transform(
s, data, blocks);
834 bytes += 64 * blocks;
845 static const uint8_t pad[64] = {0x80};
862 sha256::Initialize(
s);
868 while (blocks >= 8) {
876 while (blocks >= 4) {
884 while (blocks >= 2) {
A hasher class for SHA-256.
CSHA256 & Write(const uint8_t *data, size_t len)
void Finalize(uint8_t hash[OUTPUT_SIZE])
static void WriteBE64(uint8_t *ptr, uint64_t x)
static void WriteBE32(uint8_t *ptr, uint32_t x)
static uint32_t ReadBE32(const uint8_t *ptr)
#define Round(a, b, c, d, e, f, g, h, k, w)
void Transform(uint32_t *s, const uint8_t *chunk, size_t blocks)
Internal SHA-256 implementation.
void Transform_8way(uint8_t *out, const uint8_t *in)
void Transform_2way(uint8_t *out, const uint8_t *in)
void Transform_4way(uint8_t *out, const uint8_t *in)
T GetRand(T nMax=std::numeric_limits< T >::max()) noexcept
Generate a uniform random integer of type T in the range [0..nMax) nMax defaults to std::numeric_limi...
void SHA256D64(uint8_t *out, const uint8_t *in, size_t blocks)
Compute multiple double-SHA256's of 64-byte blobs.
std::string SHA256AutoDetect()
Autodetect the best available SHA256 implementation.