Bitcoin ABC 0.26.3
P2P Digital Currency
Loading...
Searching...
No Matches
sha1.cpp
Go to the documentation of this file.
1// Copyright (c) 2014 The Bitcoin Core developers
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5#include <crypto/sha1.h>
6
7#include <crypto/common.h>
8
9#include <cstring>
10
11// Internal implementation code.
12namespace {
14namespace sha1 {
16 inline void Round(uint32_t a, uint32_t &b, uint32_t c, uint32_t d,
18 e += ((a << 5) | (a >> 27)) + f + k + w;
19 b = (b << 30) | (b >> 2);
20 }
21
22 inline uint32_t f1(uint32_t b, uint32_t c, uint32_t d) {
23 return d ^ (b & (c ^ d));
24 }
25 inline uint32_t f2(uint32_t b, uint32_t c, uint32_t d) {
26 return b ^ c ^ d;
27 }
28 inline uint32_t f3(uint32_t b, uint32_t c, uint32_t d) {
29 return (b & c) | (d & (b | c));
30 }
31
32 inline uint32_t left(uint32_t x) {
33 return (x << 1) | (x >> 31);
34 }
35
37 inline void Initialize(uint32_t *s) {
38 s[0] = 0x67452301ul;
39 s[1] = 0xEFCDAB89ul;
40 s[2] = 0x98BADCFEul;
41 s[3] = 0x10325476ul;
42 s[4] = 0xC3D2E1F0ul;
43 }
44
45 const uint32_t k1 = 0x5A827999ul;
46 const uint32_t k2 = 0x6ED9EBA1ul;
47 const uint32_t k3 = 0x8F1BBCDCul;
48 const uint32_t k4 = 0xCA62C1D6ul;
49
51 void Transform(uint32_t *s, const uint8_t *chunk) {
52 uint32_t a = s[0], b = s[1], c = s[2], d = s[3], e = s[4];
53 uint32_t w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13,
54 w14, w15;
55
56 Round(a, b, c, d, e, f1(b, c, d), k1, w0 = ReadBE32(chunk + 0));
57 Round(e, a, b, c, d, f1(a, b, c), k1, w1 = ReadBE32(chunk + 4));
58 Round(d, e, a, b, c, f1(e, a, b), k1, w2 = ReadBE32(chunk + 8));
59 Round(c, d, e, a, b, f1(d, e, a), k1, w3 = ReadBE32(chunk + 12));
60 Round(b, c, d, e, a, f1(c, d, e), k1, w4 = ReadBE32(chunk + 16));
61 Round(a, b, c, d, e, f1(b, c, d), k1, w5 = ReadBE32(chunk + 20));
62 Round(e, a, b, c, d, f1(a, b, c), k1, w6 = ReadBE32(chunk + 24));
63 Round(d, e, a, b, c, f1(e, a, b), k1, w7 = ReadBE32(chunk + 28));
64 Round(c, d, e, a, b, f1(d, e, a), k1, w8 = ReadBE32(chunk + 32));
65 Round(b, c, d, e, a, f1(c, d, e), k1, w9 = ReadBE32(chunk + 36));
66 Round(a, b, c, d, e, f1(b, c, d), k1, w10 = ReadBE32(chunk + 40));
67 Round(e, a, b, c, d, f1(a, b, c), k1, w11 = ReadBE32(chunk + 44));
68 Round(d, e, a, b, c, f1(e, a, b), k1, w12 = ReadBE32(chunk + 48));
69 Round(c, d, e, a, b, f1(d, e, a), k1, w13 = ReadBE32(chunk + 52));
70 Round(b, c, d, e, a, f1(c, d, e), k1, w14 = ReadBE32(chunk + 56));
71 Round(a, b, c, d, e, f1(b, c, d), k1, w15 = ReadBE32(chunk + 60));
72
73 Round(e, a, b, c, d, f1(a, b, c), k1, w0 = left(w0 ^ w13 ^ w8 ^ w2));
74 Round(d, e, a, b, c, f1(e, a, b), k1, w1 = left(w1 ^ w14 ^ w9 ^ w3));
75 Round(c, d, e, a, b, f1(d, e, a), k1, w2 = left(w2 ^ w15 ^ w10 ^ w4));
76 Round(b, c, d, e, a, f1(c, d, e), k1, w3 = left(w3 ^ w0 ^ w11 ^ w5));
77 Round(a, b, c, d, e, f2(b, c, d), k2, w4 = left(w4 ^ w1 ^ w12 ^ w6));
78 Round(e, a, b, c, d, f2(a, b, c), k2, w5 = left(w5 ^ w2 ^ w13 ^ w7));
79 Round(d, e, a, b, c, f2(e, a, b), k2, w6 = left(w6 ^ w3 ^ w14 ^ w8));
80 Round(c, d, e, a, b, f2(d, e, a), k2, w7 = left(w7 ^ w4 ^ w15 ^ w9));
81 Round(b, c, d, e, a, f2(c, d, e), k2, w8 = left(w8 ^ w5 ^ w0 ^ w10));
82 Round(a, b, c, d, e, f2(b, c, d), k2, w9 = left(w9 ^ w6 ^ w1 ^ w11));
83 Round(e, a, b, c, d, f2(a, b, c), k2, w10 = left(w10 ^ w7 ^ w2 ^ w12));
84 Round(d, e, a, b, c, f2(e, a, b), k2, w11 = left(w11 ^ w8 ^ w3 ^ w13));
85 Round(c, d, e, a, b, f2(d, e, a), k2, w12 = left(w12 ^ w9 ^ w4 ^ w14));
86 Round(b, c, d, e, a, f2(c, d, e), k2, w13 = left(w13 ^ w10 ^ w5 ^ w15));
87 Round(a, b, c, d, e, f2(b, c, d), k2, w14 = left(w14 ^ w11 ^ w6 ^ w0));
88 Round(e, a, b, c, d, f2(a, b, c), k2, w15 = left(w15 ^ w12 ^ w7 ^ w1));
89
90 Round(d, e, a, b, c, f2(e, a, b), k2, w0 = left(w0 ^ w13 ^ w8 ^ w2));
91 Round(c, d, e, a, b, f2(d, e, a), k2, w1 = left(w1 ^ w14 ^ w9 ^ w3));
92 Round(b, c, d, e, a, f2(c, d, e), k2, w2 = left(w2 ^ w15 ^ w10 ^ w4));
93 Round(a, b, c, d, e, f2(b, c, d), k2, w3 = left(w3 ^ w0 ^ w11 ^ w5));
94 Round(e, a, b, c, d, f2(a, b, c), k2, w4 = left(w4 ^ w1 ^ w12 ^ w6));
95 Round(d, e, a, b, c, f2(e, a, b), k2, w5 = left(w5 ^ w2 ^ w13 ^ w7));
96 Round(c, d, e, a, b, f2(d, e, a), k2, w6 = left(w6 ^ w3 ^ w14 ^ w8));
97 Round(b, c, d, e, a, f2(c, d, e), k2, w7 = left(w7 ^ w4 ^ w15 ^ w9));
98 Round(a, b, c, d, e, f3(b, c, d), k3, w8 = left(w8 ^ w5 ^ w0 ^ w10));
99 Round(e, a, b, c, d, f3(a, b, c), k3, w9 = left(w9 ^ w6 ^ w1 ^ w11));
100 Round(d, e, a, b, c, f3(e, a, b), k3, w10 = left(w10 ^ w7 ^ w2 ^ w12));
101 Round(c, d, e, a, b, f3(d, e, a), k3, w11 = left(w11 ^ w8 ^ w3 ^ w13));
102 Round(b, c, d, e, a, f3(c, d, e), k3, w12 = left(w12 ^ w9 ^ w4 ^ w14));
103 Round(a, b, c, d, e, f3(b, c, d), k3, w13 = left(w13 ^ w10 ^ w5 ^ w15));
104 Round(e, a, b, c, d, f3(a, b, c), k3, w14 = left(w14 ^ w11 ^ w6 ^ w0));
105 Round(d, e, a, b, c, f3(e, a, b), k3, w15 = left(w15 ^ w12 ^ w7 ^ w1));
106
107 Round(c, d, e, a, b, f3(d, e, a), k3, w0 = left(w0 ^ w13 ^ w8 ^ w2));
108 Round(b, c, d, e, a, f3(c, d, e), k3, w1 = left(w1 ^ w14 ^ w9 ^ w3));
109 Round(a, b, c, d, e, f3(b, c, d), k3, w2 = left(w2 ^ w15 ^ w10 ^ w4));
110 Round(e, a, b, c, d, f3(a, b, c), k3, w3 = left(w3 ^ w0 ^ w11 ^ w5));
111 Round(d, e, a, b, c, f3(e, a, b), k3, w4 = left(w4 ^ w1 ^ w12 ^ w6));
112 Round(c, d, e, a, b, f3(d, e, a), k3, w5 = left(w5 ^ w2 ^ w13 ^ w7));
113 Round(b, c, d, e, a, f3(c, d, e), k3, w6 = left(w6 ^ w3 ^ w14 ^ w8));
114 Round(a, b, c, d, e, f3(b, c, d), k3, w7 = left(w7 ^ w4 ^ w15 ^ w9));
115 Round(e, a, b, c, d, f3(a, b, c), k3, w8 = left(w8 ^ w5 ^ w0 ^ w10));
116 Round(d, e, a, b, c, f3(e, a, b), k3, w9 = left(w9 ^ w6 ^ w1 ^ w11));
117 Round(c, d, e, a, b, f3(d, e, a), k3, w10 = left(w10 ^ w7 ^ w2 ^ w12));
118 Round(b, c, d, e, a, f3(c, d, e), k3, w11 = left(w11 ^ w8 ^ w3 ^ w13));
119 Round(a, b, c, d, e, f2(b, c, d), k4, w12 = left(w12 ^ w9 ^ w4 ^ w14));
120 Round(e, a, b, c, d, f2(a, b, c), k4, w13 = left(w13 ^ w10 ^ w5 ^ w15));
121 Round(d, e, a, b, c, f2(e, a, b), k4, w14 = left(w14 ^ w11 ^ w6 ^ w0));
122 Round(c, d, e, a, b, f2(d, e, a), k4, w15 = left(w15 ^ w12 ^ w7 ^ w1));
123
124 Round(b, c, d, e, a, f2(c, d, e), k4, w0 = left(w0 ^ w13 ^ w8 ^ w2));
125 Round(a, b, c, d, e, f2(b, c, d), k4, w1 = left(w1 ^ w14 ^ w9 ^ w3));
126 Round(e, a, b, c, d, f2(a, b, c), k4, w2 = left(w2 ^ w15 ^ w10 ^ w4));
127 Round(d, e, a, b, c, f2(e, a, b), k4, w3 = left(w3 ^ w0 ^ w11 ^ w5));
128 Round(c, d, e, a, b, f2(d, e, a), k4, w4 = left(w4 ^ w1 ^ w12 ^ w6));
129 Round(b, c, d, e, a, f2(c, d, e), k4, w5 = left(w5 ^ w2 ^ w13 ^ w7));
130 Round(a, b, c, d, e, f2(b, c, d), k4, w6 = left(w6 ^ w3 ^ w14 ^ w8));
131 Round(e, a, b, c, d, f2(a, b, c), k4, w7 = left(w7 ^ w4 ^ w15 ^ w9));
132 Round(d, e, a, b, c, f2(e, a, b), k4, w8 = left(w8 ^ w5 ^ w0 ^ w10));
133 Round(c, d, e, a, b, f2(d, e, a), k4, w9 = left(w9 ^ w6 ^ w1 ^ w11));
134 Round(b, c, d, e, a, f2(c, d, e), k4, w10 = left(w10 ^ w7 ^ w2 ^ w12));
135 Round(a, b, c, d, e, f2(b, c, d), k4, w11 = left(w11 ^ w8 ^ w3 ^ w13));
136 Round(e, a, b, c, d, f2(a, b, c), k4, w12 = left(w12 ^ w9 ^ w4 ^ w14));
137 Round(d, e, a, b, c, f2(e, a, b), k4, left(w13 ^ w10 ^ w5 ^ w15));
138 Round(c, d, e, a, b, f2(d, e, a), k4, left(w14 ^ w11 ^ w6 ^ w0));
139 Round(b, c, d, e, a, f2(c, d, e), k4, left(w15 ^ w12 ^ w7 ^ w1));
140
141 s[0] += a;
142 s[1] += b;
143 s[2] += c;
144 s[3] += d;
145 s[4] += e;
146 }
147
148} // namespace sha1
149
150} // namespace
151
153
154CSHA1::CSHA1() : bytes(0) {
155 sha1::Initialize(s);
156}
157
158CSHA1 &CSHA1::Write(const uint8_t *data, size_t len) {
159 const uint8_t *end = data + len;
160 size_t bufsize = bytes % 64;
161 if (bufsize && bufsize + len >= 64) {
162 // Fill the buffer, and process it.
163 memcpy(buf + bufsize, data, 64 - bufsize);
164 bytes += 64 - bufsize;
165 data += 64 - bufsize;
166 sha1::Transform(s, buf);
167 bufsize = 0;
168 }
169 while (end - data >= 64) {
170 // Process full chunks directly from the source.
171 sha1::Transform(s, data);
172 bytes += 64;
173 data += 64;
174 }
175 if (end > data) {
176 // Fill the buffer with what remains.
177 memcpy(buf + bufsize, data, end - data);
178 bytes += end - data;
179 }
180 return *this;
181}
182
183void CSHA1::Finalize(uint8_t hash[OUTPUT_SIZE]) {
184 static const uint8_t pad[64] = {0x80};
185 uint8_t sizedesc[8];
186 WriteBE64(sizedesc, bytes << 3);
187 Write(pad, 1 + ((119 - (bytes % 64)) % 64));
188 Write(sizedesc, 8);
189 WriteBE32(hash, s[0]);
190 WriteBE32(hash + 4, s[1]);
191 WriteBE32(hash + 8, s[2]);
192 WriteBE32(hash + 12, s[3]);
193 WriteBE32(hash + 16, s[4]);
194}
195
197 bytes = 0;
198 sha1::Initialize(s);
199 return *this;
200}
static const uint8_t k1[32]
static const uint8_t k2[32]
A hasher class for SHA1.
Definition sha1.h:12
void Finalize(uint8_t hash[OUTPUT_SIZE])
Definition sha1.cpp:183
uint8_t buf[64]
Definition sha1.h:15
CSHA1 & Write(const uint8_t *data, size_t len)
Definition sha1.cpp:158
CSHA1 & Reset()
Definition sha1.cpp:196
CSHA1()
Definition sha1.cpp:154
uint64_t bytes
Definition sha1.h:16
uint32_t s[5]
Definition sha1.h:14
static void WriteBE64(uint8_t *ptr, uint64_t x)
Definition common.h:73
static void WriteBE32(uint8_t *ptr, uint32_t x)
Definition common.h:68
static uint32_t ReadBE32(const uint8_t *ptr)
Definition common.h:56
#define Round(a, b, c, d, e, f, g, h, k, w)
Definition hash_impl.h:24
Internal SHA-1 implementation.
Definition sha1.cpp:14
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...
Definition random.h:85