3
3
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
4
5
5
#include " crypto/sha256.h"
6
-
7
6
#include " crypto/common.h"
8
7
8
+ #include < assert.h>
9
9
#include < string.h>
10
+ #include < atomic>
11
+
12
+ #if defined(__x86_64__) || defined(__amd64__)
13
+ #if defined(EXPERIMENTAL_ASM)
14
+ #include < cpuid.h>
15
+ namespace sha256_sse4
16
+ {
17
+ void Transform (uint32_t * s, const unsigned char * chunk, size_t blocks);
18
+ }
19
+ #endif
20
+ #endif
10
21
11
22
// Internal implementation code.
12
23
namespace
@@ -43,93 +54,142 @@ void inline Initialize(uint32_t* s)
43
54
s[7 ] = 0x5be0cd19ul ;
44
55
}
45
56
46
- /* * Perform one SHA-256 transformation , processing a 64-byte chunk . */
47
- void Transform (uint32_t * s, const unsigned char * chunk)
57
+ /* * Perform a number of SHA-256 transformations , processing 64-byte chunks . */
58
+ void Transform (uint32_t * s, const unsigned char * chunk, size_t blocks )
48
59
{
49
- uint32_t a = s[0 ], b = s[1 ], c = s[2 ], d = s[3 ], e = s[4 ], f = s[5 ], g = s[6 ], h = s[7 ];
50
- uint32_t w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15;
51
-
52
- Round (a, b, c, d, e, f, g, h, 0x428a2f98 , w0 = ReadBE32 (chunk + 0 ));
53
- Round (h, a, b, c, d, e, f, g, 0x71374491 , w1 = ReadBE32 (chunk + 4 ));
54
- Round (g, h, a, b, c, d, e, f, 0xb5c0fbcf , w2 = ReadBE32 (chunk + 8 ));
55
- Round (f, g, h, a, b, c, d, e, 0xe9b5dba5 , w3 = ReadBE32 (chunk + 12 ));
56
- Round (e, f, g, h, a, b, c, d, 0x3956c25b , w4 = ReadBE32 (chunk + 16 ));
57
- Round (d, e, f, g, h, a, b, c, 0x59f111f1 , w5 = ReadBE32 (chunk + 20 ));
58
- Round (c, d, e, f, g, h, a, b, 0x923f82a4 , w6 = ReadBE32 (chunk + 24 ));
59
- Round (b, c, d, e, f, g, h, a, 0xab1c5ed5 , w7 = ReadBE32 (chunk + 28 ));
60
- Round (a, b, c, d, e, f, g, h, 0xd807aa98 , w8 = ReadBE32 (chunk + 32 ));
61
- Round (h, a, b, c, d, e, f, g, 0x12835b01 , w9 = ReadBE32 (chunk + 36 ));
62
- Round (g, h, a, b, c, d, e, f, 0x243185be , w10 = ReadBE32 (chunk + 40 ));
63
- Round (f, g, h, a, b, c, d, e, 0x550c7dc3 , w11 = ReadBE32 (chunk + 44 ));
64
- Round (e, f, g, h, a, b, c, d, 0x72be5d74 , w12 = ReadBE32 (chunk + 48 ));
65
- Round (d, e, f, g, h, a, b, c, 0x80deb1fe , w13 = ReadBE32 (chunk + 52 ));
66
- Round (c, d, e, f, g, h, a, b, 0x9bdc06a7 , w14 = ReadBE32 (chunk + 56 ));
67
- Round (b, c, d, e, f, g, h, a, 0xc19bf174 , w15 = ReadBE32 (chunk + 60 ));
68
-
69
- Round (a, b, c, d, e, f, g, h, 0xe49b69c1 , w0 += sigma1 (w14) + w9 + sigma0 (w1));
70
- Round (h, a, b, c, d, e, f, g, 0xefbe4786 , w1 += sigma1 (w15) + w10 + sigma0 (w2));
71
- Round (g, h, a, b, c, d, e, f, 0x0fc19dc6 , w2 += sigma1 (w0) + w11 + sigma0 (w3));
72
- Round (f, g, h, a, b, c, d, e, 0x240ca1cc , w3 += sigma1 (w1) + w12 + sigma0 (w4));
73
- Round (e, f, g, h, a, b, c, d, 0x2de92c6f , w4 += sigma1 (w2) + w13 + sigma0 (w5));
74
- Round (d, e, f, g, h, a, b, c, 0x4a7484aa , w5 += sigma1 (w3) + w14 + sigma0 (w6));
75
- Round (c, d, e, f, g, h, a, b, 0x5cb0a9dc , w6 += sigma1 (w4) + w15 + sigma0 (w7));
76
- Round (b, c, d, e, f, g, h, a, 0x76f988da , w7 += sigma1 (w5) + w0 + sigma0 (w8));
77
- Round (a, b, c, d, e, f, g, h, 0x983e5152 , w8 += sigma1 (w6) + w1 + sigma0 (w9));
78
- Round (h, a, b, c, d, e, f, g, 0xa831c66d , w9 += sigma1 (w7) + w2 + sigma0 (w10));
79
- Round (g, h, a, b, c, d, e, f, 0xb00327c8 , w10 += sigma1 (w8) + w3 + sigma0 (w11));
80
- Round (f, g, h, a, b, c, d, e, 0xbf597fc7 , w11 += sigma1 (w9) + w4 + sigma0 (w12));
81
- Round (e, f, g, h, a, b, c, d, 0xc6e00bf3 , w12 += sigma1 (w10) + w5 + sigma0 (w13));
82
- Round (d, e, f, g, h, a, b, c, 0xd5a79147 , w13 += sigma1 (w11) + w6 + sigma0 (w14));
83
- Round (c, d, e, f, g, h, a, b, 0x06ca6351 , w14 += sigma1 (w12) + w7 + sigma0 (w15));
84
- Round (b, c, d, e, f, g, h, a, 0x14292967 , w15 += sigma1 (w13) + w8 + sigma0 (w0));
85
-
86
- Round (a, b, c, d, e, f, g, h, 0x27b70a85 , w0 += sigma1 (w14) + w9 + sigma0 (w1));
87
- Round (h, a, b, c, d, e, f, g, 0x2e1b2138 , w1 += sigma1 (w15) + w10 + sigma0 (w2));
88
- Round (g, h, a, b, c, d, e, f, 0x4d2c6dfc , w2 += sigma1 (w0) + w11 + sigma0 (w3));
89
- Round (f, g, h, a, b, c, d, e, 0x53380d13 , w3 += sigma1 (w1) + w12 + sigma0 (w4));
90
- Round (e, f, g, h, a, b, c, d, 0x650a7354 , w4 += sigma1 (w2) + w13 + sigma0 (w5));
91
- Round (d, e, f, g, h, a, b, c, 0x766a0abb , w5 += sigma1 (w3) + w14 + sigma0 (w6));
92
- Round (c, d, e, f, g, h, a, b, 0x81c2c92e , w6 += sigma1 (w4) + w15 + sigma0 (w7));
93
- Round (b, c, d, e, f, g, h, a, 0x92722c85 , w7 += sigma1 (w5) + w0 + sigma0 (w8));
94
- Round (a, b, c, d, e, f, g, h, 0xa2bfe8a1 , w8 += sigma1 (w6) + w1 + sigma0 (w9));
95
- Round (h, a, b, c, d, e, f, g, 0xa81a664b , w9 += sigma1 (w7) + w2 + sigma0 (w10));
96
- Round (g, h, a, b, c, d, e, f, 0xc24b8b70 , w10 += sigma1 (w8) + w3 + sigma0 (w11));
97
- Round (f, g, h, a, b, c, d, e, 0xc76c51a3 , w11 += sigma1 (w9) + w4 + sigma0 (w12));
98
- Round (e, f, g, h, a, b, c, d, 0xd192e819 , w12 += sigma1 (w10) + w5 + sigma0 (w13));
99
- Round (d, e, f, g, h, a, b, c, 0xd6990624 , w13 += sigma1 (w11) + w6 + sigma0 (w14));
100
- Round (c, d, e, f, g, h, a, b, 0xf40e3585 , w14 += sigma1 (w12) + w7 + sigma0 (w15));
101
- Round (b, c, d, e, f, g, h, a, 0x106aa070 , w15 += sigma1 (w13) + w8 + sigma0 (w0));
102
-
103
- Round (a, b, c, d, e, f, g, h, 0x19a4c116 , w0 += sigma1 (w14) + w9 + sigma0 (w1));
104
- Round (h, a, b, c, d, e, f, g, 0x1e376c08 , w1 += sigma1 (w15) + w10 + sigma0 (w2));
105
- Round (g, h, a, b, c, d, e, f, 0x2748774c , w2 += sigma1 (w0) + w11 + sigma0 (w3));
106
- Round (f, g, h, a, b, c, d, e, 0x34b0bcb5 , w3 += sigma1 (w1) + w12 + sigma0 (w4));
107
- Round (e, f, g, h, a, b, c, d, 0x391c0cb3 , w4 += sigma1 (w2) + w13 + sigma0 (w5));
108
- Round (d, e, f, g, h, a, b, c, 0x4ed8aa4a , w5 += sigma1 (w3) + w14 + sigma0 (w6));
109
- Round (c, d, e, f, g, h, a, b, 0x5b9cca4f , w6 += sigma1 (w4) + w15 + sigma0 (w7));
110
- Round (b, c, d, e, f, g, h, a, 0x682e6ff3 , w7 += sigma1 (w5) + w0 + sigma0 (w8));
111
- Round (a, b, c, d, e, f, g, h, 0x748f82ee , w8 += sigma1 (w6) + w1 + sigma0 (w9));
112
- Round (h, a, b, c, d, e, f, g, 0x78a5636f , w9 += sigma1 (w7) + w2 + sigma0 (w10));
113
- Round (g, h, a, b, c, d, e, f, 0x84c87814 , w10 += sigma1 (w8) + w3 + sigma0 (w11));
114
- Round (f, g, h, a, b, c, d, e, 0x8cc70208 , w11 += sigma1 (w9) + w4 + sigma0 (w12));
115
- Round (e, f, g, h, a, b, c, d, 0x90befffa , w12 += sigma1 (w10) + w5 + sigma0 (w13));
116
- Round (d, e, f, g, h, a, b, c, 0xa4506ceb , w13 += sigma1 (w11) + w6 + sigma0 (w14));
117
- Round (c, d, e, f, g, h, a, b, 0xbef9a3f7 , w14 + sigma1 (w12) + w7 + sigma0 (w15));
118
- Round (b, c, d, e, f, g, h, a, 0xc67178f2 , w15 + sigma1 (w13) + w8 + sigma0 (w0));
119
-
120
- s[0 ] += a;
121
- s[1 ] += b;
122
- s[2 ] += c;
123
- s[3 ] += d;
124
- s[4 ] += e;
125
- s[5 ] += f;
126
- s[6 ] += g;
127
- s[7 ] += h;
60
+ while (blocks--) {
61
+ uint32_t a = s[0 ], b = s[1 ], c = s[2 ], d = s[3 ], e = s[4 ], f = s[5 ], g = s[6 ], h = s[7 ];
62
+ uint32_t w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15;
63
+
64
+ Round (a, b, c, d, e, f, g, h, 0x428a2f98 , w0 = ReadBE32 (chunk + 0 ));
65
+ Round (h, a, b, c, d, e, f, g, 0x71374491 , w1 = ReadBE32 (chunk + 4 ));
66
+ Round (g, h, a, b, c, d, e, f, 0xb5c0fbcf , w2 = ReadBE32 (chunk + 8 ));
67
+ Round (f, g, h, a, b, c, d, e, 0xe9b5dba5 , w3 = ReadBE32 (chunk + 12 ));
68
+ Round (e, f, g, h, a, b, c, d, 0x3956c25b , w4 = ReadBE32 (chunk + 16 ));
69
+ Round (d, e, f, g, h, a, b, c, 0x59f111f1 , w5 = ReadBE32 (chunk + 20 ));
70
+ Round (c, d, e, f, g, h, a, b, 0x923f82a4 , w6 = ReadBE32 (chunk + 24 ));
71
+ Round (b, c, d, e, f, g, h, a, 0xab1c5ed5 , w7 = ReadBE32 (chunk + 28 ));
72
+ Round (a, b, c, d, e, f, g, h, 0xd807aa98 , w8 = ReadBE32 (chunk + 32 ));
73
+ Round (h, a, b, c, d, e, f, g, 0x12835b01 , w9 = ReadBE32 (chunk + 36 ));
74
+ Round (g, h, a, b, c, d, e, f, 0x243185be , w10 = ReadBE32 (chunk + 40 ));
75
+ Round (f, g, h, a, b, c, d, e, 0x550c7dc3 , w11 = ReadBE32 (chunk + 44 ));
76
+ Round (e, f, g, h, a, b, c, d, 0x72be5d74 , w12 = ReadBE32 (chunk + 48 ));
77
+ Round (d, e, f, g, h, a, b, c, 0x80deb1fe , w13 = ReadBE32 (chunk + 52 ));
78
+ Round (c, d, e, f, g, h, a, b, 0x9bdc06a7 , w14 = ReadBE32 (chunk + 56 ));
79
+ Round (b, c, d, e, f, g, h, a, 0xc19bf174 , w15 = ReadBE32 (chunk + 60 ));
80
+
81
+ Round (a, b, c, d, e, f, g, h, 0xe49b69c1 , w0 += sigma1 (w14) + w9 + sigma0 (w1));
82
+ Round (h, a, b, c, d, e, f, g, 0xefbe4786 , w1 += sigma1 (w15) + w10 + sigma0 (w2));
83
+ Round (g, h, a, b, c, d, e, f, 0x0fc19dc6 , w2 += sigma1 (w0) + w11 + sigma0 (w3));
84
+ Round (f, g, h, a, b, c, d, e, 0x240ca1cc , w3 += sigma1 (w1) + w12 + sigma0 (w4));
85
+ Round (e, f, g, h, a, b, c, d, 0x2de92c6f , w4 += sigma1 (w2) + w13 + sigma0 (w5));
86
+ Round (d, e, f, g, h, a, b, c, 0x4a7484aa , w5 += sigma1 (w3) + w14 + sigma0 (w6));
87
+ Round (c, d, e, f, g, h, a, b, 0x5cb0a9dc , w6 += sigma1 (w4) + w15 + sigma0 (w7));
88
+ Round (b, c, d, e, f, g, h, a, 0x76f988da , w7 += sigma1 (w5) + w0 + sigma0 (w8));
89
+ Round (a, b, c, d, e, f, g, h, 0x983e5152 , w8 += sigma1 (w6) + w1 + sigma0 (w9));
90
+ Round (h, a, b, c, d, e, f, g, 0xa831c66d , w9 += sigma1 (w7) + w2 + sigma0 (w10));
91
+ Round (g, h, a, b, c, d, e, f, 0xb00327c8 , w10 += sigma1 (w8) + w3 + sigma0 (w11));
92
+ Round (f, g, h, a, b, c, d, e, 0xbf597fc7 , w11 += sigma1 (w9) + w4 + sigma0 (w12));
93
+ Round (e, f, g, h, a, b, c, d, 0xc6e00bf3 , w12 += sigma1 (w10) + w5 + sigma0 (w13));
94
+ Round (d, e, f, g, h, a, b, c, 0xd5a79147 , w13 += sigma1 (w11) + w6 + sigma0 (w14));
95
+ Round (c, d, e, f, g, h, a, b, 0x06ca6351 , w14 += sigma1 (w12) + w7 + sigma0 (w15));
96
+ Round (b, c, d, e, f, g, h, a, 0x14292967 , w15 += sigma1 (w13) + w8 + sigma0 (w0));
97
+
98
+ Round (a, b, c, d, e, f, g, h, 0x27b70a85 , w0 += sigma1 (w14) + w9 + sigma0 (w1));
99
+ Round (h, a, b, c, d, e, f, g, 0x2e1b2138 , w1 += sigma1 (w15) + w10 + sigma0 (w2));
100
+ Round (g, h, a, b, c, d, e, f, 0x4d2c6dfc , w2 += sigma1 (w0) + w11 + sigma0 (w3));
101
+ Round (f, g, h, a, b, c, d, e, 0x53380d13 , w3 += sigma1 (w1) + w12 + sigma0 (w4));
102
+ Round (e, f, g, h, a, b, c, d, 0x650a7354 , w4 += sigma1 (w2) + w13 + sigma0 (w5));
103
+ Round (d, e, f, g, h, a, b, c, 0x766a0abb , w5 += sigma1 (w3) + w14 + sigma0 (w6));
104
+ Round (c, d, e, f, g, h, a, b, 0x81c2c92e , w6 += sigma1 (w4) + w15 + sigma0 (w7));
105
+ Round (b, c, d, e, f, g, h, a, 0x92722c85 , w7 += sigma1 (w5) + w0 + sigma0 (w8));
106
+ Round (a, b, c, d, e, f, g, h, 0xa2bfe8a1 , w8 += sigma1 (w6) + w1 + sigma0 (w9));
107
+ Round (h, a, b, c, d, e, f, g, 0xa81a664b , w9 += sigma1 (w7) + w2 + sigma0 (w10));
108
+ Round (g, h, a, b, c, d, e, f, 0xc24b8b70 , w10 += sigma1 (w8) + w3 + sigma0 (w11));
109
+ Round (f, g, h, a, b, c, d, e, 0xc76c51a3 , w11 += sigma1 (w9) + w4 + sigma0 (w12));
110
+ Round (e, f, g, h, a, b, c, d, 0xd192e819 , w12 += sigma1 (w10) + w5 + sigma0 (w13));
111
+ Round (d, e, f, g, h, a, b, c, 0xd6990624 , w13 += sigma1 (w11) + w6 + sigma0 (w14));
112
+ Round (c, d, e, f, g, h, a, b, 0xf40e3585 , w14 += sigma1 (w12) + w7 + sigma0 (w15));
113
+ Round (b, c, d, e, f, g, h, a, 0x106aa070 , w15 += sigma1 (w13) + w8 + sigma0 (w0));
114
+
115
+ Round (a, b, c, d, e, f, g, h, 0x19a4c116 , w0 += sigma1 (w14) + w9 + sigma0 (w1));
116
+ Round (h, a, b, c, d, e, f, g, 0x1e376c08 , w1 += sigma1 (w15) + w10 + sigma0 (w2));
117
+ Round (g, h, a, b, c, d, e, f, 0x2748774c , w2 += sigma1 (w0) + w11 + sigma0 (w3));
118
+ Round (f, g, h, a, b, c, d, e, 0x34b0bcb5 , w3 += sigma1 (w1) + w12 + sigma0 (w4));
119
+ Round (e, f, g, h, a, b, c, d, 0x391c0cb3 , w4 += sigma1 (w2) + w13 + sigma0 (w5));
120
+ Round (d, e, f, g, h, a, b, c, 0x4ed8aa4a , w5 += sigma1 (w3) + w14 + sigma0 (w6));
121
+ Round (c, d, e, f, g, h, a, b, 0x5b9cca4f , w6 += sigma1 (w4) + w15 + sigma0 (w7));
122
+ Round (b, c, d, e, f, g, h, a, 0x682e6ff3 , w7 += sigma1 (w5) + w0 + sigma0 (w8));
123
+ Round (a, b, c, d, e, f, g, h, 0x748f82ee , w8 += sigma1 (w6) + w1 + sigma0 (w9));
124
+ Round (h, a, b, c, d, e, f, g, 0x78a5636f , w9 += sigma1 (w7) + w2 + sigma0 (w10));
125
+ Round (g, h, a, b, c, d, e, f, 0x84c87814 , w10 += sigma1 (w8) + w3 + sigma0 (w11));
126
+ Round (f, g, h, a, b, c, d, e, 0x8cc70208 , w11 += sigma1 (w9) + w4 + sigma0 (w12));
127
+ Round (e, f, g, h, a, b, c, d, 0x90befffa , w12 += sigma1 (w10) + w5 + sigma0 (w13));
128
+ Round (d, e, f, g, h, a, b, c, 0xa4506ceb , w13 += sigma1 (w11) + w6 + sigma0 (w14));
129
+ Round (c, d, e, f, g, h, a, b, 0xbef9a3f7 , w14 + sigma1 (w12) + w7 + sigma0 (w15));
130
+ Round (b, c, d, e, f, g, h, a, 0xc67178f2 , w15 + sigma1 (w13) + w8 + sigma0 (w0));
131
+
132
+ s[0 ] += a;
133
+ s[1 ] += b;
134
+ s[2 ] += c;
135
+ s[3 ] += d;
136
+ s[4 ] += e;
137
+ s[5 ] += f;
138
+ s[6 ] += g;
139
+ s[7 ] += h;
140
+ chunk += 64 ;
141
+ }
128
142
}
129
143
130
144
} // namespace sha256
145
+
146
+ typedef void (*TransformType)(uint32_t *, const unsigned char *, size_t );
147
+
148
+ bool SelfTest (TransformType tr) {
149
+ static const unsigned char in1[65 ] = {0 , 0x80 };
150
+ static const unsigned char in2[129 ] = {
151
+ 0 ,
152
+ 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 ,
153
+ 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 ,
154
+ 0x80 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
155
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 , 0
156
+ };
157
+ static const uint32_t init[8 ] = {0x6a09e667ul , 0xbb67ae85ul , 0x3c6ef372ul , 0xa54ff53aul , 0x510e527ful , 0x9b05688cul , 0x1f83d9abul , 0x5be0cd19ul };
158
+ static const uint32_t out1[8 ] = {0xe3b0c442ul , 0x98fc1c14ul , 0x9afbf4c8ul , 0x996fb924ul , 0x27ae41e4ul , 0x649b934cul , 0xa495991bul , 0x7852b855ul };
159
+ static const uint32_t out2[8 ] = {0xce4153b0ul , 0x147c2a86ul , 0x3ed4298eul , 0xe0676bc8ul , 0x79fc77a1ul , 0x2abe1f49ul , 0xb2b055dful , 0x1069523eul };
160
+ uint32_t buf[8 ];
161
+ memcpy (buf, init, sizeof (buf));
162
+ // Process nothing, and check we remain in the initial state.
163
+ tr (buf, nullptr , 0 );
164
+ if (memcmp (buf, init, sizeof (buf))) return false ;
165
+ // Process the padded empty string (unaligned)
166
+ tr (buf, in1 + 1 , 1 );
167
+ if (memcmp (buf, out1, sizeof (buf))) return false ;
168
+ // Process 64 spaces (unaligned)
169
+ memcpy (buf, init, sizeof (buf));
170
+ tr (buf, in2 + 1 , 2 );
171
+ if (memcmp (buf, out2, sizeof (buf))) return false ;
172
+ return true ;
173
+ }
174
+
175
+ TransformType Transform = sha256::Transform;
176
+
131
177
} // namespace
132
178
179
+ std::string SHA256AutoDetect ()
180
+ {
181
+ #if defined(EXPERIMENTAL_ASM) && (defined(__x86_64__) || defined(__amd64__))
182
+ uint32_t eax, ebx, ecx, edx;
183
+ if (__get_cpuid (1 , &eax, &ebx, &ecx, &edx) && (ecx >> 19 ) & 1 ) {
184
+ Transform = sha256_sse4::Transform;
185
+ assert (SelfTest (Transform));
186
+ return " sse4" ;
187
+ }
188
+ #endif
189
+
190
+ assert (SelfTest (Transform));
191
+ return " standard" ;
192
+ }
133
193
134
194
// //// SHA-256
135
195
@@ -147,14 +207,14 @@ CSHA256& CSHA256::Write(const unsigned char* data, size_t len)
147
207
memcpy (buf + bufsize, data, 64 - bufsize);
148
208
bytes += 64 - bufsize;
149
209
data += 64 - bufsize;
150
- sha256:: Transform (s, buf);
210
+ Transform (s, buf, 1 );
151
211
bufsize = 0 ;
152
212
}
153
- while (end >= data + 64 ) {
154
- // Process full chunks directly from the source.
155
- sha256:: Transform (s, data);
156
- bytes += 64 ;
157
- data += 64 ;
213
+ if (end - data >= 64 ) {
214
+ size_t blocks = (end - data) / 64 ;
215
+ Transform (s, data, blocks );
216
+ data += 64 * blocks ;
217
+ bytes += 64 * blocks ;
158
218
}
159
219
if (end > data) {
160
220
// Fill the buffer with what remains.
0 commit comments