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.
1// Copyright (c) 2014-present The Bitcoin Core developers2// Distributed under the MIT software license, see the accompanying3// file COPYING or http://www.opensource.org/licenses/mit-license.php.5#include <crypto/sha1.h>7#include <crypto/common.h>9#include <cstring>11// Internal implementation code.12namespace13{14/// Internal SHA-1 implementation.15namespace sha116{17/** One round of SHA-1. */18void inline Round(uint32_t a, uint32_t& b, uint32_t c, uint32_t d, uint32_t& e, uint32_t f, uint32_t k, uint32_t w)19{20e += ((a << 5) | (a >> 27)) + f + k + w;21b = (b << 30) | (b >> 2);22}24uint32_t inline f1(uint32_t b, uint32_t c, uint32_t d) { return d ^ (b & (c ^ d)); }25uint32_t inline f2(uint32_t b, uint32_t c, uint32_t d) { return b ^ c ^ d; }26uint32_t inline f3(uint32_t b, uint32_t c, uint32_t d) { return (b & c) | (d & (b | c)); }28uint32_t inline left(uint32_t x) { return (x << 1) | (x >> 31); }30/** Initialize SHA-1 state. */31void inline Initialize(uint32_t* s)32{33s[0] = 0x67452301ul;34s[1] = 0xEFCDAB89ul;35s[2] = 0x98BADCFEul;36s[3] = 0x10325476ul;37s[4] = 0xC3D2E1F0ul;38}40const uint32_t k1 = 0x5A827999ul;41const uint32_t k2 = 0x6ED9EBA1ul;42const uint32_t k3 = 0x8F1BBCDCul;43const uint32_t k4 = 0xCA62C1D6ul;45/** Perform a SHA-1 transformation, processing a 64-byte chunk. */46void Transform(uint32_t* s, const unsigned char* chunk)47{48uint32_t a = s[0], b = s[1], c = s[2], d = s[3], e = s[4];49uint32_t w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15;51Round(a, b, c, d, e, f1(b, c, d), k1, w0 = ReadBE32(chunk + 0));52Round(e, a, b, c, d, f1(a, b, c), k1, w1 = ReadBE32(chunk + 4));53Round(d, e, a, b, c, f1(e, a, b), k1, w2 = ReadBE32(chunk + 8));54Round(c, d, e, a, b, f1(d, e, a), k1, w3 = ReadBE32(chunk + 12));55Round(b, c, d, e, a, f1(c, d, e), k1, w4 = ReadBE32(chunk + 16));56Round(a, b, c, d, e, f1(b, c, d), k1, w5 = ReadBE32(chunk + 20));57Round(e, a, b, c, d, f1(a, b, c), k1, w6 = ReadBE32(chunk + 24));58Round(d, e, a, b, c, f1(e, a, b), k1, w7 = ReadBE32(chunk + 28));59Round(c, d, e, a, b, f1(d, e, a), k1, w8 = ReadBE32(chunk + 32));60Round(b, c, d, e, a, f1(c, d, e), k1, w9 = ReadBE32(chunk + 36));61Round(a, b, c, d, e, f1(b, c, d), k1, w10 = ReadBE32(chunk + 40));62Round(e, a, b, c, d, f1(a, b, c), k1, w11 = ReadBE32(chunk + 44));63Round(d, e, a, b, c, f1(e, a, b), k1, w12 = ReadBE32(chunk + 48));64Round(c, d, e, a, b, f1(d, e, a), k1, w13 = ReadBE32(chunk + 52));65Round(b, c, d, e, a, f1(c, d, e), k1, w14 = ReadBE32(chunk + 56));66Round(a, b, c, d, e, f1(b, c, d), k1, w15 = ReadBE32(chunk + 60));68Round(e, a, b, c, d, f1(a, b, c), k1, w0 = left(w0 ^ w13 ^ w8 ^ w2));69Round(d, e, a, b, c, f1(e, a, b), k1, w1 = left(w1 ^ w14 ^ w9 ^ w3));70Round(c, d, e, a, b, f1(d, e, a), k1, w2 = left(w2 ^ w15 ^ w10 ^ w4));71Round(b, c, d, e, a, f1(c, d, e), k1, w3 = left(w3 ^ w0 ^ w11 ^ w5));72Round(a, b, c, d, e, f2(b, c, d), k2, w4 = left(w4 ^ w1 ^ w12 ^ w6));73Round(e, a, b, c, d, f2(a, b, c), k2, w5 = left(w5 ^ w2 ^ w13 ^ w7));74Round(d, e, a, b, c, f2(e, a, b), k2, w6 = left(w6 ^ w3 ^ w14 ^ w8));75Round(c, d, e, a, b, f2(d, e, a), k2, w7 = left(w7 ^ w4 ^ w15 ^ w9));76Round(b, c, d, e, a, f2(c, d, e), k2, w8 = left(w8 ^ w5 ^ w0 ^ w10));77Round(a, b, c, d, e, f2(b, c, d), k2, w9 = left(w9 ^ w6 ^ w1 ^ w11));78Round(e, a, b, c, d, f2(a, b, c), k2, w10 = left(w10 ^ w7 ^ w2 ^ w12));79Round(d, e, a, b, c, f2(e, a, b), k2, w11 = left(w11 ^ w8 ^ w3 ^ w13));80Round(c, d, e, a, b, f2(d, e, a), k2, w12 = left(w12 ^ w9 ^ w4 ^ w14));81Round(b, c, d, e, a, f2(c, d, e), k2, w13 = left(w13 ^ w10 ^ w5 ^ w15));82Round(a, b, c, d, e, f2(b, c, d), k2, w14 = left(w14 ^ w11 ^ w6 ^ w0));83Round(e, a, b, c, d, f2(a, b, c), k2, w15 = left(w15 ^ w12 ^ w7 ^ w1));85Round(d, e, a, b, c, f2(e, a, b), k2, w0 = left(w0 ^ w13 ^ w8 ^ w2));86Round(c, d, e, a, b, f2(d, e, a), k2, w1 = left(w1 ^ w14 ^ w9 ^ w3));87Round(b, c, d, e, a, f2(c, d, e), k2, w2 = left(w2 ^ w15 ^ w10 ^ w4));88Round(a, b, c, d, e, f2(b, c, d), k2, w3 = left(w3 ^ w0 ^ w11 ^ w5));89Round(e, a, b, c, d, f2(a, b, c), k2, w4 = left(w4 ^ w1 ^ w12 ^ w6));90Round(d, e, a, b, c, f2(e, a, b), k2, w5 = left(w5 ^ w2 ^ w13 ^ w7));91Round(c, d, e, a, b, f2(d, e, a), k2, w6 = left(w6 ^ w3 ^ w14 ^ w8));92Round(b, c, d, e, a, f2(c, d, e), k2, w7 = left(w7 ^ w4 ^ w15 ^ w9));93Round(a, b, c, d, e, f3(b, c, d), k3, w8 = left(w8 ^ w5 ^ w0 ^ w10));94Round(e, a, b, c, d, f3(a, b, c), k3, w9 = left(w9 ^ w6 ^ w1 ^ w11));95Round(d, e, a, b, c, f3(e, a, b), k3, w10 = left(w10 ^ w7 ^ w2 ^ w12));96Round(c, d, e, a, b, f3(d, e, a), k3, w11 = left(w11 ^ w8 ^ w3 ^ w13));97Round(b, c, d, e, a, f3(c, d, e), k3, w12 = left(w12 ^ w9 ^ w4 ^ w14));98Round(a, b, c, d, e, f3(b, c, d), k3, w13 = left(w13 ^ w10 ^ w5 ^ w15));99Round(e, a, b, c, d, f3(a, b, c), k3, w14 = left(w14 ^ w11 ^ w6 ^ w0));100Round(d, e, a, b, c, f3(e, a, b), k3, w15 = left(w15 ^ w12 ^ w7 ^ w1));102Round(c, d, e, a, b, f3(d, e, a), k3, w0 = left(w0 ^ w13 ^ w8 ^ w2));103Round(b, c, d, e, a, f3(c, d, e), k3, w1 = left(w1 ^ w14 ^ w9 ^ w3));104Round(a, b, c, d, e, f3(b, c, d), k3, w2 = left(w2 ^ w15 ^ w10 ^ w4));105Round(e, a, b, c, d, f3(a, b, c), k3, w3 = left(w3 ^ w0 ^ w11 ^ w5));106Round(d, e, a, b, c, f3(e, a, b), k3, w4 = left(w4 ^ w1 ^ w12 ^ w6));107Round(c, d, e, a, b, f3(d, e, a), k3, w5 = left(w5 ^ w2 ^ w13 ^ w7));108Round(b, c, d, e, a, f3(c, d, e), k3, w6 = left(w6 ^ w3 ^ w14 ^ w8));109Round(a, b, c, d, e, f3(b, c, d), k3, w7 = left(w7 ^ w4 ^ w15 ^ w9));110Round(e, a, b, c, d, f3(a, b, c), k3, w8 = left(w8 ^ w5 ^ w0 ^ w10));111Round(d, e, a, b, c, f3(e, a, b), k3, w9 = left(w9 ^ w6 ^ w1 ^ w11));112Round(c, d, e, a, b, f3(d, e, a), k3, w10 = left(w10 ^ w7 ^ w2 ^ w12));113Round(b, c, d, e, a, f3(c, d, e), k3, w11 = left(w11 ^ w8 ^ w3 ^ w13));114Round(a, b, c, d, e, f2(b, c, d), k4, w12 = left(w12 ^ w9 ^ w4 ^ w14));115Round(e, a, b, c, d, f2(a, b, c), k4, w13 = left(w13 ^ w10 ^ w5 ^ w15));116Round(d, e, a, b, c, f2(e, a, b), k4, w14 = left(w14 ^ w11 ^ w6 ^ w0));117Round(c, d, e, a, b, f2(d, e, a), k4, w15 = left(w15 ^ w12 ^ w7 ^ w1));119Round(b, c, d, e, a, f2(c, d, e), k4, w0 = left(w0 ^ w13 ^ w8 ^ w2));120Round(a, b, c, d, e, f2(b, c, d), k4, w1 = left(w1 ^ w14 ^ w9 ^ w3));121Round(e, a, b, c, d, f2(a, b, c), k4, w2 = left(w2 ^ w15 ^ w10 ^ w4));122Round(d, e, a, b, c, f2(e, a, b), k4, w3 = left(w3 ^ w0 ^ w11 ^ w5));123Round(c, d, e, a, b, f2(d, e, a), k4, w4 = left(w4 ^ w1 ^ w12 ^ w6));124Round(b, c, d, e, a, f2(c, d, e), k4, w5 = left(w5 ^ w2 ^ w13 ^ w7));125Round(a, b, c, d, e, f2(b, c, d), k4, w6 = left(w6 ^ w3 ^ w14 ^ w8));126Round(e, a, b, c, d, f2(a, b, c), k4, w7 = left(w7 ^ w4 ^ w15 ^ w9));127Round(d, e, a, b, c, f2(e, a, b), k4, w8 = left(w8 ^ w5 ^ w0 ^ w10));128Round(c, d, e, a, b, f2(d, e, a), k4, w9 = left(w9 ^ w6 ^ w1 ^ w11));129Round(b, c, d, e, a, f2(c, d, e), k4, w10 = left(w10 ^ w7 ^ w2 ^ w12));130Round(a, b, c, d, e, f2(b, c, d), k4, w11 = left(w11 ^ w8 ^ w3 ^ w13));131Round(e, a, b, c, d, f2(a, b, c), k4, w12 = left(w12 ^ w9 ^ w4 ^ w14));132Round(d, e, a, b, c, f2(e, a, b), k4, left(w13 ^ w10 ^ w5 ^ w15));133Round(c, d, e, a, b, f2(d, e, a), k4, left(w14 ^ w11 ^ w6 ^ w0));134Round(b, c, d, e, a, f2(c, d, e), k4, left(w15 ^ w12 ^ w7 ^ w1));136s[0] += a;137s[1] += b;138s[2] += c;139s[3] += d;140s[4] += e;141}143} // namespace sha1145} // namespace147////// SHA1149CSHA1::CSHA1()150{151sha1::Initialize(s);152}154CSHA1& CSHA1::Write(const unsigned char* data, size_t len)155{156const unsigned char* end = data + len;157size_t bufsize = bytes % 64;158if (bufsize && bufsize + len >= 64) {159// Fill the buffer, and process it.160memcpy(buf + bufsize, data, 64 - bufsize);161bytes += 64 - bufsize;162data += 64 - bufsize;163sha1::Transform(s, buf);164bufsize = 0;165}166while (end - data >= 64) {167// Process full chunks directly from the source.168sha1::Transform(s, data);169bytes += 64;170data += 64;171}172if (end > data) {173// Fill the buffer with what remains.174memcpy(buf + bufsize, data, end - data);175bytes += end - data;176}177return *this;178}180void CSHA1::Finalize(unsigned char hash[OUTPUT_SIZE])181{182static const unsigned char pad[64] = {0x80};183unsigned char sizedesc[8];184WriteBE64(sizedesc, bytes << 3);185Write(pad, 1 + ((119 - (bytes % 64)) % 64));186Write(sizedesc, 8);187WriteBE32(hash, s[0]);188WriteBE32(hash + 4, s[1]);189WriteBE32(hash + 8, s[2]);190WriteBE32(hash + 12, s[3]);191WriteBE32(hash + 16, s[4]);192}194CSHA1& CSHA1::Reset()195{196bytes = 0;197sha1::Initialize(s);198return *this;199}
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.