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.
5 #include "crypto/sha1.h"
7 #include "crypto/common.h"
11 // Internal implementation code.
14 /// Internal SHA-1 implementation.
17 /** One round of SHA-1. */
18 void 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
)
20 e
+= ((a
<< 5) | (a
>> 27)) + f
+ k
+ w
;
21 b
= (b
<< 30) | (b
>> 2);
24 uint32_t inline f1(uint32_t b
, uint32_t c
, uint32_t d
) { return d
^ (b
& (c
^ d
)); }
25 uint32_t inline f2(uint32_t b
, uint32_t c
, uint32_t d
) { return b
^ c
^ d
; }
26 uint32_t inline f3(uint32_t b
, uint32_t c
, uint32_t d
) { return (b
& c
) | (d
& (b
| c
)); }
28 uint32_t inline left(uint32_t x
) { return (x
<< 1) | (x
>> 31); }
30 /** Initialize SHA-1 state. */
31 void inline Initialize(uint32_t* s
)
40 const uint32_t k1
= 0x5A827999ul
;
41 const uint32_t k2
= 0x6ED9EBA1ul
;
42 const uint32_t k3
= 0x8F1BBCDCul
;
43 const uint32_t k4
= 0xCA62C1D6ul
;
45 /** Perform a SHA-1 transformation, processing a 64-byte chunk. */
46 void Transform(uint32_t* s
, const unsigned char* chunk
)
48 uint32_t a
= s
[0], b
= s
[1], c
= s
[2], d
= s
[3], e
= s
[4];
49 uint32_t w0
, w1
, w2
, w3
, w4
, w5
, w6
, w7
, w8
, w9
, w10
, w11
, w12
, w13
, w14
, w15
;
51 Round(a
, b
, c
, d
, e
, f1(b
, c
, d
), k1
, w0
= ReadBE32(chunk
+ 0));
52 Round(e
, a
, b
, c
, d
, f1(a
, b
, c
), k1
, w1
= ReadBE32(chunk
+ 4));
53 Round(d
, e
, a
, b
, c
, f1(e
, a
, b
), k1
, w2
= ReadBE32(chunk
+ 8));
54 Round(c
, d
, e
, a
, b
, f1(d
, e
, a
), k1
, w3
= ReadBE32(chunk
+ 12));
55 Round(b
, c
, d
, e
, a
, f1(c
, d
, e
), k1
, w4
= ReadBE32(chunk
+ 16));
56 Round(a
, b
, c
, d
, e
, f1(b
, c
, d
), k1
, w5
= ReadBE32(chunk
+ 20));
57 Round(e
, a
, b
, c
, d
, f1(a
, b
, c
), k1
, w6
= ReadBE32(chunk
+ 24));
58 Round(d
, e
, a
, b
, c
, f1(e
, a
, b
), k1
, w7
= ReadBE32(chunk
+ 28));
59 Round(c
, d
, e
, a
, b
, f1(d
, e
, a
), k1
, w8
= ReadBE32(chunk
+ 32));
60 Round(b
, c
, d
, e
, a
, f1(c
, d
, e
), k1
, w9
= ReadBE32(chunk
+ 36));
61 Round(a
, b
, c
, d
, e
, f1(b
, c
, d
), k1
, w10
= ReadBE32(chunk
+ 40));
62 Round(e
, a
, b
, c
, d
, f1(a
, b
, c
), k1
, w11
= ReadBE32(chunk
+ 44));
63 Round(d
, e
, a
, b
, c
, f1(e
, a
, b
), k1
, w12
= ReadBE32(chunk
+ 48));
64 Round(c
, d
, e
, a
, b
, f1(d
, e
, a
), k1
, w13
= ReadBE32(chunk
+ 52));
65 Round(b
, c
, d
, e
, a
, f1(c
, d
, e
), k1
, w14
= ReadBE32(chunk
+ 56));
66 Round(a
, b
, c
, d
, e
, f1(b
, c
, d
), k1
, w15
= ReadBE32(chunk
+ 60));
68 Round(e
, a
, b
, c
, d
, f1(a
, b
, c
), k1
, w0
= left(w0
^ w13
^ w8
^ w2
));
69 Round(d
, e
, a
, b
, c
, f1(e
, a
, b
), k1
, w1
= left(w1
^ w14
^ w9
^ w3
));
70 Round(c
, d
, e
, a
, b
, f1(d
, e
, a
), k1
, w2
= left(w2
^ w15
^ w10
^ w4
));
71 Round(b
, c
, d
, e
, a
, f1(c
, d
, e
), k1
, w3
= left(w3
^ w0
^ w11
^ w5
));
72 Round(a
, b
, c
, d
, e
, f2(b
, c
, d
), k2
, w4
= left(w4
^ w1
^ w12
^ w6
));
73 Round(e
, a
, b
, c
, d
, f2(a
, b
, c
), k2
, w5
= left(w5
^ w2
^ w13
^ w7
));
74 Round(d
, e
, a
, b
, c
, f2(e
, a
, b
), k2
, w6
= left(w6
^ w3
^ w14
^ w8
));
75 Round(c
, d
, e
, a
, b
, f2(d
, e
, a
), k2
, w7
= left(w7
^ w4
^ w15
^ w9
));
76 Round(b
, c
, d
, e
, a
, f2(c
, d
, e
), k2
, w8
= left(w8
^ w5
^ w0
^ w10
));
77 Round(a
, b
, c
, d
, e
, f2(b
, c
, d
), k2
, w9
= left(w9
^ w6
^ w1
^ w11
));
78 Round(e
, a
, b
, c
, d
, f2(a
, b
, c
), k2
, w10
= left(w10
^ w7
^ w2
^ w12
));
79 Round(d
, e
, a
, b
, c
, f2(e
, a
, b
), k2
, w11
= left(w11
^ w8
^ w3
^ w13
));
80 Round(c
, d
, e
, a
, b
, f2(d
, e
, a
), k2
, w12
= left(w12
^ w9
^ w4
^ w14
));
81 Round(b
, c
, d
, e
, a
, f2(c
, d
, e
), k2
, w13
= left(w13
^ w10
^ w5
^ w15
));
82 Round(a
, b
, c
, d
, e
, f2(b
, c
, d
), k2
, w14
= left(w14
^ w11
^ w6
^ w0
));
83 Round(e
, a
, b
, c
, d
, f2(a
, b
, c
), k2
, w15
= left(w15
^ w12
^ w7
^ w1
));
85 Round(d
, e
, a
, b
, c
, f2(e
, a
, b
), k2
, w0
= left(w0
^ w13
^ w8
^ w2
));
86 Round(c
, d
, e
, a
, b
, f2(d
, e
, a
), k2
, w1
= left(w1
^ w14
^ w9
^ w3
));
87 Round(b
, c
, d
, e
, a
, f2(c
, d
, e
), k2
, w2
= left(w2
^ w15
^ w10
^ w4
));
88 Round(a
, b
, c
, d
, e
, f2(b
, c
, d
), k2
, w3
= left(w3
^ w0
^ w11
^ w5
));
89 Round(e
, a
, b
, c
, d
, f2(a
, b
, c
), k2
, w4
= left(w4
^ w1
^ w12
^ w6
));
90 Round(d
, e
, a
, b
, c
, f2(e
, a
, b
), k2
, w5
= left(w5
^ w2
^ w13
^ w7
));
91 Round(c
, d
, e
, a
, b
, f2(d
, e
, a
), k2
, w6
= left(w6
^ w3
^ w14
^ w8
));
92 Round(b
, c
, d
, e
, a
, f2(c
, d
, e
), k2
, w7
= left(w7
^ w4
^ w15
^ w9
));
93 Round(a
, b
, c
, d
, e
, f3(b
, c
, d
), k3
, w8
= left(w8
^ w5
^ w0
^ w10
));
94 Round(e
, a
, b
, c
, d
, f3(a
, b
, c
), k3
, w9
= left(w9
^ w6
^ w1
^ w11
));
95 Round(d
, e
, a
, b
, c
, f3(e
, a
, b
), k3
, w10
= left(w10
^ w7
^ w2
^ w12
));
96 Round(c
, d
, e
, a
, b
, f3(d
, e
, a
), k3
, w11
= left(w11
^ w8
^ w3
^ w13
));
97 Round(b
, c
, d
, e
, a
, f3(c
, d
, e
), k3
, w12
= left(w12
^ w9
^ w4
^ w14
));
98 Round(a
, b
, c
, d
, e
, f3(b
, c
, d
), k3
, w13
= left(w13
^ w10
^ w5
^ w15
));
99 Round(e
, a
, b
, c
, d
, f3(a
, b
, c
), k3
, w14
= left(w14
^ w11
^ w6
^ w0
));
100 Round(d
, e
, a
, b
, c
, f3(e
, a
, b
), k3
, w15
= left(w15
^ w12
^ w7
^ w1
));
102 Round(c
, d
, e
, a
, b
, f3(d
, e
, a
), k3
, w0
= left(w0
^ w13
^ w8
^ w2
));
103 Round(b
, c
, d
, e
, a
, f3(c
, d
, e
), k3
, w1
= left(w1
^ w14
^ w9
^ w3
));
104 Round(a
, b
, c
, d
, e
, f3(b
, c
, d
), k3
, w2
= left(w2
^ w15
^ w10
^ w4
));
105 Round(e
, a
, b
, c
, d
, f3(a
, b
, c
), k3
, w3
= left(w3
^ w0
^ w11
^ w5
));
106 Round(d
, e
, a
, b
, c
, f3(e
, a
, b
), k3
, w4
= left(w4
^ w1
^ w12
^ w6
));
107 Round(c
, d
, e
, a
, b
, f3(d
, e
, a
), k3
, w5
= left(w5
^ w2
^ w13
^ w7
));
108 Round(b
, c
, d
, e
, a
, f3(c
, d
, e
), k3
, w6
= left(w6
^ w3
^ w14
^ w8
));
109 Round(a
, b
, c
, d
, e
, f3(b
, c
, d
), k3
, w7
= left(w7
^ w4
^ w15
^ w9
));
110 Round(e
, a
, b
, c
, d
, f3(a
, b
, c
), k3
, w8
= left(w8
^ w5
^ w0
^ w10
));
111 Round(d
, e
, a
, b
, c
, f3(e
, a
, b
), k3
, w9
= left(w9
^ w6
^ w1
^ w11
));
112 Round(c
, d
, e
, a
, b
, f3(d
, e
, a
), k3
, w10
= left(w10
^ w7
^ w2
^ w12
));
113 Round(b
, c
, d
, e
, a
, f3(c
, d
, e
), k3
, w11
= left(w11
^ w8
^ w3
^ w13
));
114 Round(a
, b
, c
, d
, e
, f2(b
, c
, d
), k4
, w12
= left(w12
^ w9
^ w4
^ w14
));
115 Round(e
, a
, b
, c
, d
, f2(a
, b
, c
), k4
, w13
= left(w13
^ w10
^ w5
^ w15
));
116 Round(d
, e
, a
, b
, c
, f2(e
, a
, b
), k4
, w14
= left(w14
^ w11
^ w6
^ w0
));
117 Round(c
, d
, e
, a
, b
, f2(d
, e
, a
), k4
, w15
= left(w15
^ w12
^ w7
^ w1
));
119 Round(b
, c
, d
, e
, a
, f2(c
, d
, e
), k4
, w0
= left(w0
^ w13
^ w8
^ w2
));
120 Round(a
, b
, c
, d
, e
, f2(b
, c
, d
), k4
, w1
= left(w1
^ w14
^ w9
^ w3
));
121 Round(e
, a
, b
, c
, d
, f2(a
, b
, c
), k4
, w2
= left(w2
^ w15
^ w10
^ w4
));
122 Round(d
, e
, a
, b
, c
, f2(e
, a
, b
), k4
, w3
= left(w3
^ w0
^ w11
^ w5
));
123 Round(c
, d
, e
, a
, b
, f2(d
, e
, a
), k4
, w4
= left(w4
^ w1
^ w12
^ w6
));
124 Round(b
, c
, d
, e
, a
, f2(c
, d
, e
), k4
, w5
= left(w5
^ w2
^ w13
^ w7
));
125 Round(a
, b
, c
, d
, e
, f2(b
, c
, d
), k4
, w6
= left(w6
^ w3
^ w14
^ w8
));
126 Round(e
, a
, b
, c
, d
, f2(a
, b
, c
), k4
, w7
= left(w7
^ w4
^ w15
^ w9
));
127 Round(d
, e
, a
, b
, c
, f2(e
, a
, b
), k4
, w8
= left(w8
^ w5
^ w0
^ w10
));
128 Round(c
, d
, e
, a
, b
, f2(d
, e
, a
), k4
, w9
= left(w9
^ w6
^ w1
^ w11
));
129 Round(b
, c
, d
, e
, a
, f2(c
, d
, e
), k4
, w10
= left(w10
^ w7
^ w2
^ w12
));
130 Round(a
, b
, c
, d
, e
, f2(b
, c
, d
), k4
, w11
= left(w11
^ w8
^ w3
^ w13
));
131 Round(e
, a
, b
, c
, d
, f2(a
, b
, c
), k4
, w12
= left(w12
^ w9
^ w4
^ w14
));
132 Round(d
, e
, a
, b
, c
, f2(e
, a
, b
), k4
, left(w13
^ w10
^ w5
^ w15
));
133 Round(c
, d
, e
, a
, b
, f2(d
, e
, a
), k4
, left(w14
^ w11
^ w6
^ w0
));
134 Round(b
, c
, d
, e
, a
, f2(c
, d
, e
), k4
, left(w15
^ w12
^ w7
^ w1
));
149 CSHA1::CSHA1() : bytes(0)
154 CSHA1
& CSHA1::Write(const unsigned char* data
, size_t len
)
156 const unsigned char* end
= data
+ len
;
157 size_t bufsize
= bytes
% 64;
158 if (bufsize
&& bufsize
+ len
>= 64) {
159 // Fill the buffer, and process it.
160 memcpy(buf
+ bufsize
, data
, 64 - bufsize
);
161 bytes
+= 64 - bufsize
;
162 data
+= 64 - bufsize
;
163 sha1::Transform(s
, buf
);
166 while (end
>= data
+ 64) {
167 // Process full chunks directly from the source.
168 sha1::Transform(s
, data
);
173 // Fill the buffer with what remains.
174 memcpy(buf
+ bufsize
, data
, end
- data
);
180 void CSHA1::Finalize(unsigned char hash
[OUTPUT_SIZE
])
182 static const unsigned char pad
[64] = {0x80};
183 unsigned char sizedesc
[8];
184 WriteBE64(sizedesc
, bytes
<< 3);
185 Write(pad
, 1 + ((119 - (bytes
% 64)) % 64));
187 WriteBE32(hash
, s
[0]);
188 WriteBE32(hash
+ 4, s
[1]);
189 WriteBE32(hash
+ 8, s
[2]);
190 WriteBE32(hash
+ 12, s
[3]);
191 WriteBE32(hash
+ 16, s
[4]);
194 CSHA1
& CSHA1::Reset()