Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
501// Expected output state for hashing the i*64 first input bytes above (excluding SHA256 padding).502static 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},512};513// Expected output for each of the individual 8 64-byte messages under full double SHA256 (including padding).514static const unsigned char result_d64[256] = {5150x09, 0x3a, 0xc4, 0xd0, 0x0f, 0xf7, 0x57, 0xe1, 0x72, 0x85, 0x79, 0x42, 0xfe, 0xe7, 0xe0, 0xa0,5160xfc, 0x52, 0xd7, 0xdb, 0x07, 0x63, 0x45, 0xfb, 0x53, 0x14, 0x7d, 0x17, 0x22, 0x86, 0xf0, 0x52,5170x48, 0xb6, 0x11, 0x9e, 0x6e, 0x48, 0x81, 0x6d, 0xcc, 0x57, 0x1f, 0xb2, 0x97, 0xa8, 0xd5, 0x25,5180x9b, 0x82, 0xaa, 0x89, 0xe2, 0xfd, 0x2d, 0x56, 0xe8, 0x28, 0x83, 0x0b, 0xe2, 0xfa, 0x53, 0xb7,5190xd6, 0x6b, 0x07, 0x85, 0x83, 0xb0, 0x10, 0xa2, 0xf5, 0x51, 0x3c, 0xf9, 0x60, 0x03, 0xab, 0x45,5200x6c, 0x15, 0x6e, 0xef, 0xb5, 0xac, 0x3e, 0x6c, 0xdf, 0xb4, 0x92, 0x22, 0x2d, 0xce, 0xbf, 0x3e,5210xe9, 0xe5, 0xf6, 0x29, 0x0e, 0x01, 0x4f, 0xd2, 0xd4, 0x45, 0x65, 0xb3, 0xbb, 0xf2, 0x4c, 0x16,5220x37, 0x50, 0x3c, 0x6e, 0x49, 0x8c, 0x5a, 0x89, 0x2b, 0x1b, 0xab, 0xc4, 0x37, 0xd1, 0x46, 0xe9,5230x3d, 0x0e, 0x85, 0xa2, 0x50, 0x73, 0xa1, 0x5e, 0x54, 0x37, 0xd7, 0x94, 0x17, 0x56, 0xc2, 0xd8,5240xe5, 0x9f, 0xed, 0x4e, 0xae, 0x15, 0x42, 0x06, 0x0d, 0x74, 0x74, 0x5e, 0x24, 0x30, 0xce, 0xd1,5250x9e, 0x50, 0xa3, 0x9a, 0xb8, 0xf0, 0x4a, 0x57, 0x69, 0x78, 0x67, 0x12, 0x84, 0x58, 0xbe, 0xc7,5260x36, 0xaa, 0xee, 0x7c, 0x64, 0xa3, 0x76, 0xec, 0xff, 0x55, 0x41, 0x00, 0x2a, 0x44, 0x68, 0x4d,5270xb6, 0x53, 0x9e, 0x1c, 0x95, 0xb7, 0xca, 0xdc, 0x7f, 0x7d, 0x74, 0x27, 0x5c, 0x8e, 0xa6, 0x84,5280xb5, 0xac, 0x87, 0xa9, 0xf3, 0xff, 0x75, 0xf2, 0x34, 0xcd, 0x1a, 0x3b, 0x82, 0x2c, 0x2b, 0x4e,5290x6a, 0x46, 0x30, 0xa6, 0x89, 0x86, 0x23, 0xac, 0xf8, 0xa5, 0x15, 0xe9, 0x0a, 0xaa, 0x1e, 0x9a,5300xd7, 0x93, 0x6b, 0x28, 0xe4, 0x3b, 0xfd, 0x59, 0xc6, 0xed, 0x7c, 0x5f, 0xa5, 0x41, 0xcb, 0x51531};534// Test Transform() for 0 through 8 transformations.535for (size_t i = 0; i <= 8; ++i) {536uint32_t state[8];537std::copy(init, init + 8, state);538Transform(state, data + 1, i);539if (!std::equal(state, state + 8, result[i])) return false;540}542// Test TransformD64543unsigned char out[32];544TransformD64(out, data + 1);545if (!std::equal(out, out + 32, result_d64)) return false;547// Test TransformD64_2way, if available.548if (TransformD64_2way) {549unsigned char out[64];550TransformD64_2way(out, data + 1);551if (!std::equal(out, out + 64, result_d64)) return false;552}554// Test TransformD64_4way, if available.555if (TransformD64_4way) {556unsigned char out[128];557TransformD64_4way(out, data + 1);558if (!std::equal(out, out + 128, result_d64)) return false;559}561// Test TransformD64_8way, if available.562if (TransformD64_8way) {563unsigned char out[256];564TransformD64_8way(out, data + 1);565if (!std::equal(out, out + 256, result_d64)) return false;566}568return true;569}571#if !defined(DISABLE_OPTIMIZED_SHA256)572#if (defined(__x86_64__) || defined(__amd64__) || defined(__i386__))573/** Check whether the OS has enabled AVX registers. */574bool AVXEnabled()575{576uint32_t a, d;577__asm__("xgetbv" : "=a"(a), "=d"(d) : "c"(0));578return (a & 6) == 6;579}580#endif581#endif // DISABLE_OPTIMIZED_SHA256582} // namespace585std::string SHA256AutoDetect(sha256_implementation::UseImplementation use_implementation)586{587std::string ret = "standard";588Transform = sha256::Transform;589TransformD64 = sha256::TransformD64;590TransformD64_2way = nullptr;591TransformD64_4way = nullptr;592TransformD64_8way = nullptr;594#if !defined(DISABLE_OPTIMIZED_SHA256)595#if defined(HAVE_GETCPUID)596bool have_sse4 = false;597bool have_xsave = false;598bool have_avx = false;599[[maybe_unused]] bool have_avx2 = false;600[[maybe_unused]] bool have_x86_shani = false;601[[maybe_unused]] bool enabled_avx = false;603uint32_t eax, ebx, ecx, edx;604GetCPUID(1, 0, eax, ebx, ecx, edx);605if (use_implementation & sha256_implementation::USE_SSE4) {606have_sse4 = (ecx >> 19) & 1;607}608have_xsave = (ecx >> 27) & 1;609have_avx = (ecx >> 28) & 1;610if (have_xsave && have_avx) {611enabled_avx = AVXEnabled();612}613if (have_sse4) {614GetCPUID(7, 0, eax, ebx, ecx, edx);615if (use_implementation & sha256_implementation::USE_AVX2) {616have_avx2 = (ebx >> 5) & 1;617}618if (use_implementation & sha256_implementation::USE_SHANI) {619have_x86_shani = (ebx >> 29) & 1;620}621}623#if defined(ENABLE_SSE41) && defined(ENABLE_X86_SHANI)624if (have_x86_shani) {625Transform = sha256_x86_shani::Transform;626TransformD64 = TransformD64Wrapper<sha256_x86_shani::Transform>;627TransformD64_2way = sha256d64_x86_shani::Transform_2way;628ret = "x86_shani(1way;2way)";629have_sse4 = false; // Disable SSE4/AVX2;630have_avx2 = false;631}632#endif634if (have_sse4) {635#if defined(__x86_64__) || defined(__amd64__)636Transform = sha256_sse4::Transform;637TransformD64 = TransformD64Wrapper<sha256_sse4::Transform>;638ret = "sse4(1way)";639#endif640#if defined(ENABLE_SSE41)641TransformD64_4way = sha256d64_sse41::Transform_4way;642ret += ";sse41(4way)";643#endif644}646#if defined(ENABLE_AVX2)647if (have_avx2 && have_avx && enabled_avx) {648TransformD64_8way = sha256d64_avx2::Transform_8way;649ret += ";avx2(8way)";650}651#endif652#endif // defined(HAVE_GETCPUID)654#if defined(ENABLE_ARM_SHANI)655bool have_arm_shani = false;656if (use_implementation & sha256_implementation::USE_SHANI) {657#if defined(__linux__)658#if defined(__arm__) // 32-bit659if (getauxval(AT_HWCAP2) & HWCAP2_SHA2) {660have_arm_shani = true;661}662#endif663#if defined(__aarch64__) // 64-bit664if (getauxval(AT_HWCAP) & HWCAP_SHA2) {665have_arm_shani = true;666}667#endif668#endif670#if defined(__APPLE__)671int val = 0;672size_t len = sizeof(val);673if (sysctlbyname("hw.optional.arm.FEAT_SHA256", &val, &len, nullptr, 0) == 0) {674have_arm_shani = val != 0;675}676#endif677}679if (have_arm_shani) {680Transform = sha256_arm_shani::Transform;681TransformD64 = TransformD64Wrapper<sha256_arm_shani::Transform>;682TransformD64_2way = sha256d64_arm_shani::Transform_2way;683ret = "arm_shani(1way;2way)";684}685#endif686#endif // DISABLE_OPTIMIZED_SHA256688assert(SelfTest());689return ret;690}692////// SHA-256694CSHA256::CSHA256()695{696sha256::Initialize(s);697}699CSHA256& CSHA256::Write(const unsigned char* data, size_t len)700{701const unsigned char* end = data + len;702size_t bufsize = bytes % 64;703if (bufsize && bufsize + len >= 64) {704// Fill the buffer, and process it.705memcpy(buf + bufsize, data, 64 - bufsize);706bytes += 64 - bufsize;707data += 64 - bufsize;708Transform(s, buf, 1);709bufsize = 0;710}711if (end - data >= 64) {712size_t blocks = (end - data) / 64;713Transform(s, data, blocks);714data += 64 * blocks;715bytes += 64 * blocks;716}717if (end > data) {718// Fill the buffer with what remains.719memcpy(buf + bufsize, data, end - data);720bytes += end - data;721}722return *this;723}725void CSHA256::Finalize(unsigned char hash[OUTPUT_SIZE])726{727static const unsigned char pad[64] = {0x80};728unsigned char sizedesc[8];729WriteBE64(sizedesc, bytes << 3);730Write(pad, 1 + ((119 - (bytes % 64)) % 64));731Write(sizedesc, 8);732WriteBE32(hash, s[0]);733WriteBE32(hash + 4, s[1]);734WriteBE32(hash + 8, s[2]);735WriteBE32(hash + 12, s[3]);736WriteBE32(hash + 16, s[4]);737WriteBE32(hash + 20, s[5]);738WriteBE32(hash + 24, s[6]);739WriteBE32(hash + 28, s[7]);740}742CSHA256& CSHA256::Reset()743{744bytes = 0;745sha256::Initialize(s);746return *this;747}749void SHA256D64(unsigned char* out, const unsigned char* in, size_t blocks)750{