1/***
2* Copyright 2017 Marc Stevens <marc@marc-stevens.nl>, Dan Shumow (danshu@microsoft.com)
3* Distributed under the MIT Software License.
4* See accompanying file LICENSE.txt or copy at
5* https://opensource.org/licenses/MIT
6***/
7
8#ifndef SHA1DC_NO_STANDARD_INCLUDES
9#include <string.h>
10#include <memory.h>
11#include <stdio.h>
12#include <stdlib.h>
13#ifdef __unix__
14#include <sys/types.h> /* make sure macros like _BIG_ENDIAN visible */
15#endif
16#endif
17
18#ifdef SHA1DC_CUSTOM_INCLUDE_SHA1_C
19#include SHA1DC_CUSTOM_INCLUDE_SHA1_C
20#endif
21
22#ifndef SHA1DC_INIT_SAFE_HASH_DEFAULT
23#define SHA1DC_INIT_SAFE_HASH_DEFAULT 1
24#endif
25
26#include "sha1.h"
27#include "ubc_check.h"
28
29#if (defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || \
30 defined(i386) || defined(__i386) || defined(__i386__) || defined(__i486__) || \
31 defined(__i586__) || defined(__i686__) || defined(_M_IX86) || defined(__X86__) || \
32 defined(_X86_) || defined(__THW_INTEL__) || defined(__I86__) || defined(__INTEL__) || \
33 defined(__386) || defined(_M_X64) || defined(_M_AMD64))
34#define SHA1DC_ON_INTEL_LIKE_PROCESSOR
35#endif
36
37/*
38 Because Little-Endian architectures are most common,
39 we only set SHA1DC_BIGENDIAN if one of these conditions is met.
40 Note that all MSFT platforms are little endian,
41 so none of these will be defined under the MSC compiler.
42 If you are compiling on a big endian platform and your compiler does not define one of these,
43 you will have to add whatever macros your tool chain defines to indicate Big-Endianness.
44 */
45
46#if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__)
47/*
48 * Should detect Big Endian under GCC since at least 4.6.0 (gcc svn
49 * rev #165881). See
50 * https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html
51 *
52 * This also works under clang since 3.2, it copied the GCC-ism. See
53 * clang.git's 3b198a97d2 ("Preprocessor: add __BYTE_ORDER__
54 * predefined macro", 2012-07-27)
55 */
56#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
57#define SHA1DC_BIGENDIAN
58#endif
59
60/* Not under GCC-alike */
61#elif defined(__BYTE_ORDER) && defined(__BIG_ENDIAN)
62/*
63 * Should detect Big Endian under glibc.git since 14245eb70e ("entered
64 * into RCS", 1992-11-25). Defined in <endian.h> which will have been
65 * brought in by standard headers. See glibc.git and
66 * https://sourceforge.net/p/predef/wiki/Endianness/
67 */
68#if __BYTE_ORDER == __BIG_ENDIAN
69#define SHA1DC_BIGENDIAN
70#endif
71
72/* Not under GCC-alike or glibc */
73#elif defined(_BYTE_ORDER) && defined(_BIG_ENDIAN) && defined(_LITTLE_ENDIAN)
74/*
75 * *BSD and newlib (embeded linux, cygwin, etc).
76 * the defined(_BIG_ENDIAN) && defined(_LITTLE_ENDIAN) part prevents
77 * this condition from matching with Solaris/sparc.
78 * (Solaris defines only one endian macro)
79 */
80#if _BYTE_ORDER == _BIG_ENDIAN
81#define SHA1DC_BIGENDIAN
82#endif
83
84/* Not under GCC-alike or glibc or *BSD or newlib */
85#elif (defined(__ARMEB__) || defined(__THUMBEB__) || defined(__AARCH64EB__) || \
86 defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || \
87 defined(__sparc))
88/*
89 * Should define Big Endian for a whitelist of known processors. See
90 * https://sourceforge.net/p/predef/wiki/Endianness/ and
91 * http://www.oracle.com/technetwork/server-storage/solaris/portingtosolaris-138514.html
92 */
93#define SHA1DC_BIGENDIAN
94
95/* Not under GCC-alike or glibc or *BSD or newlib or <processor whitelist> */
96#elif (defined(_AIX))
97
98/*
99 * Defines Big Endian on a whitelist of OSs that are known to be Big
100 * Endian-only. See
101 * https://public-inbox.org/git/93056823-2740-d072-1ebd-46b440b33d7e@felt.demon.nl/
102 */
103#define SHA1DC_BIGENDIAN
104
105/* Not under GCC-alike or glibc or *BSD or newlib or <processor whitelist> or <os whitelist> */
106#elif defined(SHA1DC_ON_INTEL_LIKE_PROCESSOR)
107/*
108 * As a last resort before we do anything else we're not 100% sure
109 * about below, we blacklist specific processors here. We could add
110 * more, see e.g. https://wiki.debian.org/ArchitectureSpecificsMemo
111 */
112#else /* Not under GCC-alike or glibc or *BSD or newlib or <processor whitelist> or <os whitelist> or <processor blacklist> */
113
114/* We do nothing more here for now */
115/*#error "Uncomment this to see if you fall through all the detection"*/
116
117#endif /* Big Endian detection */
118
119#if (defined(SHA1DC_FORCE_LITTLEENDIAN) && defined(SHA1DC_BIGENDIAN))
120#undef SHA1DC_BIGENDIAN
121#endif
122#if (defined(SHA1DC_FORCE_BIGENDIAN) && !defined(SHA1DC_BIGENDIAN))
123#define SHA1DC_BIGENDIAN
124#endif
125/*ENDIANNESS SELECTION*/
126
127#if defined(SHA1DC_FORCE_UNALIGNED_ACCESS) || defined(SHA1DC_ON_INTEL_LIKE_PROCESSOR)
128#define SHA1DC_ALLOW_UNALIGNED_ACCESS
129#endif /*UNALIGNMENT DETECTION*/
130
131
132#define rotate_right(x,n) (((x)>>(n))|((x)<<(32-(n))))
133#define rotate_left(x,n) (((x)<<(n))|((x)>>(32-(n))))
134
135#define sha1_bswap32(x) \
136 {x = ((x << 8) & 0xFF00FF00) | ((x >> 8) & 0xFF00FF); x = (x << 16) | (x >> 16);}
137
138#define sha1_mix(W, t) (rotate_left(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1))
139
140#ifdef SHA1DC_BIGENDIAN
141 #define sha1_load(m, t, temp) { temp = m[t]; }
142#else
143 #define sha1_load(m, t, temp) { temp = m[t]; sha1_bswap32(temp); }
144#endif
145
146#define sha1_store(W, t, x) *(volatile uint32_t *)&W[t] = x
147
148#define sha1_f1(b,c,d) ((d)^((b)&((c)^(d))))
149#define sha1_f2(b,c,d) ((b)^(c)^(d))
150#define sha1_f3(b,c,d) (((b)&(c))+((d)&((b)^(c))))
151#define sha1_f4(b,c,d) ((b)^(c)^(d))
152
153#define HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, m, t) \
154 { e += rotate_left(a, 5) + sha1_f1(b,c,d) + 0x5A827999 + m[t]; b = rotate_left(b, 30); }
155#define HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, m, t) \
156 { e += rotate_left(a, 5) + sha1_f2(b,c,d) + 0x6ED9EBA1 + m[t]; b = rotate_left(b, 30); }
157#define HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, m, t) \
158 { e += rotate_left(a, 5) + sha1_f3(b,c,d) + 0x8F1BBCDC + m[t]; b = rotate_left(b, 30); }
159#define HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, m, t) \
160 { e += rotate_left(a, 5) + sha1_f4(b,c,d) + 0xCA62C1D6 + m[t]; b = rotate_left(b, 30); }
161
162#define HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(a, b, c, d, e, m, t) \
163 { b = rotate_right(b, 30); e -= rotate_left(a, 5) + sha1_f1(b,c,d) + 0x5A827999 + m[t]; }
164#define HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(a, b, c, d, e, m, t) \
165 { b = rotate_right(b, 30); e -= rotate_left(a, 5) + sha1_f2(b,c,d) + 0x6ED9EBA1 + m[t]; }
166#define HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(a, b, c, d, e, m, t) \
167 { b = rotate_right(b, 30); e -= rotate_left(a, 5) + sha1_f3(b,c,d) + 0x8F1BBCDC + m[t]; }
168#define HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(a, b, c, d, e, m, t) \
169 { b = rotate_right(b, 30); e -= rotate_left(a, 5) + sha1_f4(b,c,d) + 0xCA62C1D6 + m[t]; }
170
171#define SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(a, b, c, d, e, m, W, t, temp) \
172 {sha1_load(m, t, temp); sha1_store(W, t, temp); e += temp + rotate_left(a, 5) + sha1_f1(b,c,d) + 0x5A827999; b = rotate_left(b, 30);}
173
174#define SHA1COMPRESS_FULL_ROUND1_STEP_EXPAND(a, b, c, d, e, W, t, temp) \
175 {temp = sha1_mix(W, t); sha1_store(W, t, temp); e += temp + rotate_left(a, 5) + sha1_f1(b,c,d) + 0x5A827999; b = rotate_left(b, 30); }
176
177#define SHA1COMPRESS_FULL_ROUND2_STEP(a, b, c, d, e, W, t, temp) \
178 {temp = sha1_mix(W, t); sha1_store(W, t, temp); e += temp + rotate_left(a, 5) + sha1_f2(b,c,d) + 0x6ED9EBA1; b = rotate_left(b, 30); }
179
180#define SHA1COMPRESS_FULL_ROUND3_STEP(a, b, c, d, e, W, t, temp) \
181 {temp = sha1_mix(W, t); sha1_store(W, t, temp); e += temp + rotate_left(a, 5) + sha1_f3(b,c,d) + 0x8F1BBCDC; b = rotate_left(b, 30); }
182
183#define SHA1COMPRESS_FULL_ROUND4_STEP(a, b, c, d, e, W, t, temp) \
184 {temp = sha1_mix(W, t); sha1_store(W, t, temp); e += temp + rotate_left(a, 5) + sha1_f4(b,c,d) + 0xCA62C1D6; b = rotate_left(b, 30); }
185
186
187#define SHA1_STORE_STATE(i) states[i][0] = a; states[i][1] = b; states[i][2] = c; states[i][3] = d; states[i][4] = e;
188
189#ifdef BUILDNOCOLLDETECTSHA1COMPRESSION
190void sha1_compression(uint32_t ihv[5], const uint32_t m[16])
191{
192 uint32_t W[80];
193 uint32_t a,b,c,d,e;
194 unsigned i;
195
196 memcpy(W, m, 16 * 4);
197 for (i = 16; i < 80; ++i)
198 W[i] = sha1_mix(W, i);
199
200 a = ihv[0]; b = ihv[1]; c = ihv[2]; d = ihv[3]; e = ihv[4];
201
202 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, W, 0);
203 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, W, 1);
204 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, W, 2);
205 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, W, 3);
206 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, W, 4);
207 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, W, 5);
208 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, W, 6);
209 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, W, 7);
210 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, W, 8);
211 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, W, 9);
212 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, W, 10);
213 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, W, 11);
214 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, W, 12);
215 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, W, 13);
216 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, W, 14);
217 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, W, 15);
218 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, W, 16);
219 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, W, 17);
220 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, W, 18);
221 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, W, 19);
222
223 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, W, 20);
224 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, W, 21);
225 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, W, 22);
226 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, W, 23);
227 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, W, 24);
228 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, W, 25);
229 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, W, 26);
230 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, W, 27);
231 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, W, 28);
232 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, W, 29);
233 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, W, 30);
234 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, W, 31);
235 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, W, 32);
236 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, W, 33);
237 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, W, 34);
238 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, W, 35);
239 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, W, 36);
240 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, W, 37);
241 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, W, 38);
242 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, W, 39);
243
244 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, W, 40);
245 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, W, 41);
246 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, W, 42);
247 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, W, 43);
248 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, W, 44);
249 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, W, 45);
250 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, W, 46);
251 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, W, 47);
252 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, W, 48);
253 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, W, 49);
254 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, W, 50);
255 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, W, 51);
256 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, W, 52);
257 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, W, 53);
258 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, W, 54);
259 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, W, 55);
260 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, W, 56);
261 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, W, 57);
262 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, W, 58);
263 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, W, 59);
264
265 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, W, 60);
266 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, W, 61);
267 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, W, 62);
268 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, W, 63);
269 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, W, 64);
270 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, W, 65);
271 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, W, 66);
272 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, W, 67);
273 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, W, 68);
274 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, W, 69);
275 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, W, 70);
276 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, W, 71);
277 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, W, 72);
278 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, W, 73);
279 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, W, 74);
280 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, W, 75);
281 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, W, 76);
282 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, W, 77);
283 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, W, 78);
284 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, W, 79);
285
286 ihv[0] += a; ihv[1] += b; ihv[2] += c; ihv[3] += d; ihv[4] += e;
287}
288#endif /*BUILDNOCOLLDETECTSHA1COMPRESSION*/
289
290
291static void sha1_compression_W(uint32_t ihv[5], const uint32_t W[80])
292{
293 uint32_t a = ihv[0], b = ihv[1], c = ihv[2], d = ihv[3], e = ihv[4];
294
295 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, W, 0);
296 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, W, 1);
297 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, W, 2);
298 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, W, 3);
299 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, W, 4);
300 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, W, 5);
301 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, W, 6);
302 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, W, 7);
303 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, W, 8);
304 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, W, 9);
305 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, W, 10);
306 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, W, 11);
307 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, W, 12);
308 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, W, 13);
309 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, W, 14);
310 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, W, 15);
311 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, W, 16);
312 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, W, 17);
313 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, W, 18);
314 HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, W, 19);
315
316 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, W, 20);
317 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, W, 21);
318 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, W, 22);
319 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, W, 23);
320 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, W, 24);
321 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, W, 25);
322 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, W, 26);
323 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, W, 27);
324 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, W, 28);
325 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, W, 29);
326 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, W, 30);
327 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, W, 31);
328 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, W, 32);
329 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, W, 33);
330 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, W, 34);
331 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, W, 35);
332 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, W, 36);
333 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, W, 37);
334 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, W, 38);
335 HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, W, 39);
336
337 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, W, 40);
338 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, W, 41);
339 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, W, 42);
340 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, W, 43);
341 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, W, 44);
342 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, W, 45);
343 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, W, 46);
344 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, W, 47);
345 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, W, 48);
346 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, W, 49);
347 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, W, 50);
348 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, W, 51);
349 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, W, 52);
350 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, W, 53);
351 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, W, 54);
352 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, W, 55);
353 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, W, 56);
354 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, W, 57);
355 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, W, 58);
356 HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, W, 59);
357
358 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, W, 60);
359 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, W, 61);
360 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, W, 62);
361 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, W, 63);
362 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, W, 64);
363 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, W, 65);
364 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, W, 66);
365 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, W, 67);
366 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, W, 68);
367 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, W, 69);
368 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, W, 70);
369 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, W, 71);
370 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, W, 72);
371 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, W, 73);
372 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, W, 74);
373 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, W, 75);
374 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, W, 76);
375 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, W, 77);
376 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, W, 78);
377 HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, W, 79);
378
379 ihv[0] += a; ihv[1] += b; ihv[2] += c; ihv[3] += d; ihv[4] += e;
380}
381
382
383
384void sha1_compression_states(uint32_t ihv[5], const uint32_t m[16], uint32_t W[80], uint32_t states[80][5])
385{
386 uint32_t a = ihv[0], b = ihv[1], c = ihv[2], d = ihv[3], e = ihv[4];
387 uint32_t temp;
388
389#ifdef DOSTORESTATE00
390 SHA1_STORE_STATE(0)
391#endif
392 SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(a, b, c, d, e, m, W, 0, temp);
393
394#ifdef DOSTORESTATE01
395 SHA1_STORE_STATE(1)
396#endif
397 SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(e, a, b, c, d, m, W, 1, temp);
398
399#ifdef DOSTORESTATE02
400 SHA1_STORE_STATE(2)
401#endif
402 SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(d, e, a, b, c, m, W, 2, temp);
403
404#ifdef DOSTORESTATE03
405 SHA1_STORE_STATE(3)
406#endif
407 SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(c, d, e, a, b, m, W, 3, temp);
408
409#ifdef DOSTORESTATE04
410 SHA1_STORE_STATE(4)
411#endif
412 SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(b, c, d, e, a, m, W, 4, temp);
413
414#ifdef DOSTORESTATE05
415 SHA1_STORE_STATE(5)
416#endif
417 SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(a, b, c, d, e, m, W, 5, temp);
418
419#ifdef DOSTORESTATE06
420 SHA1_STORE_STATE(6)
421#endif
422 SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(e, a, b, c, d, m, W, 6, temp);
423
424#ifdef DOSTORESTATE07
425 SHA1_STORE_STATE(7)
426#endif
427 SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(d, e, a, b, c, m, W, 7, temp);
428
429#ifdef DOSTORESTATE08
430 SHA1_STORE_STATE(8)
431#endif
432 SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(c, d, e, a, b, m, W, 8, temp);
433
434#ifdef DOSTORESTATE09
435 SHA1_STORE_STATE(9)
436#endif
437 SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(b, c, d, e, a, m, W, 9, temp);
438
439#ifdef DOSTORESTATE10
440 SHA1_STORE_STATE(10)
441#endif
442 SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(a, b, c, d, e, m, W, 10, temp);
443
444#ifdef DOSTORESTATE11
445 SHA1_STORE_STATE(11)
446#endif
447 SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(e, a, b, c, d, m, W, 11, temp);
448
449#ifdef DOSTORESTATE12
450 SHA1_STORE_STATE(12)
451#endif
452 SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(d, e, a, b, c, m, W, 12, temp);
453
454#ifdef DOSTORESTATE13
455 SHA1_STORE_STATE(13)
456#endif
457 SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(c, d, e, a, b, m, W, 13, temp);
458
459#ifdef DOSTORESTATE14
460 SHA1_STORE_STATE(14)
461#endif
462 SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(b, c, d, e, a, m, W, 14, temp);
463
464#ifdef DOSTORESTATE15
465 SHA1_STORE_STATE(15)
466#endif
467 SHA1COMPRESS_FULL_ROUND1_STEP_LOAD(a, b, c, d, e, m, W, 15, temp);
468
469#ifdef DOSTORESTATE16
470 SHA1_STORE_STATE(16)
471#endif
472 SHA1COMPRESS_FULL_ROUND1_STEP_EXPAND(e, a, b, c, d, W, 16, temp);
473
474#ifdef DOSTORESTATE17
475 SHA1_STORE_STATE(17)
476#endif
477 SHA1COMPRESS_FULL_ROUND1_STEP_EXPAND(d, e, a, b, c, W, 17, temp);
478
479#ifdef DOSTORESTATE18
480 SHA1_STORE_STATE(18)
481#endif
482 SHA1COMPRESS_FULL_ROUND1_STEP_EXPAND(c, d, e, a, b, W, 18, temp);
483
484#ifdef DOSTORESTATE19
485 SHA1_STORE_STATE(19)
486#endif
487 SHA1COMPRESS_FULL_ROUND1_STEP_EXPAND(b, c, d, e, a, W, 19, temp);
488
489
490
491#ifdef DOSTORESTATE20
492 SHA1_STORE_STATE(20)
493#endif
494 SHA1COMPRESS_FULL_ROUND2_STEP(a, b, c, d, e, W, 20, temp);
495
496#ifdef DOSTORESTATE21
497 SHA1_STORE_STATE(21)
498#endif
499 SHA1COMPRESS_FULL_ROUND2_STEP(e, a, b, c, d, W, 21, temp);
500
501#ifdef DOSTORESTATE22
502 SHA1_STORE_STATE(22)
503#endif
504 SHA1COMPRESS_FULL_ROUND2_STEP(d, e, a, b, c, W, 22, temp);
505
506#ifdef DOSTORESTATE23
507 SHA1_STORE_STATE(23)
508#endif
509 SHA1COMPRESS_FULL_ROUND2_STEP(c, d, e, a, b, W, 23, temp);
510
511#ifdef DOSTORESTATE24
512 SHA1_STORE_STATE(24)
513#endif
514 SHA1COMPRESS_FULL_ROUND2_STEP(b, c, d, e, a, W, 24, temp);
515
516#ifdef DOSTORESTATE25
517 SHA1_STORE_STATE(25)
518#endif
519 SHA1COMPRESS_FULL_ROUND2_STEP(a, b, c, d, e, W, 25, temp);
520
521#ifdef DOSTORESTATE26
522 SHA1_STORE_STATE(26)
523#endif
524 SHA1COMPRESS_FULL_ROUND2_STEP(e, a, b, c, d, W, 26, temp);
525
526#ifdef DOSTORESTATE27
527 SHA1_STORE_STATE(27)
528#endif
529 SHA1COMPRESS_FULL_ROUND2_STEP(d, e, a, b, c, W, 27, temp);
530
531#ifdef DOSTORESTATE28
532 SHA1_STORE_STATE(28)
533#endif
534 SHA1COMPRESS_FULL_ROUND2_STEP(c, d, e, a, b, W, 28, temp);
535
536#ifdef DOSTORESTATE29
537 SHA1_STORE_STATE(29)
538#endif
539 SHA1COMPRESS_FULL_ROUND2_STEP(b, c, d, e, a, W, 29, temp);
540
541#ifdef DOSTORESTATE30
542 SHA1_STORE_STATE(30)
543#endif
544 SHA1COMPRESS_FULL_ROUND2_STEP(a, b, c, d, e, W, 30, temp);
545
546#ifdef DOSTORESTATE31
547 SHA1_STORE_STATE(31)
548#endif
549 SHA1COMPRESS_FULL_ROUND2_STEP(e, a, b, c, d, W, 31, temp);
550
551#ifdef DOSTORESTATE32
552 SHA1_STORE_STATE(32)
553#endif
554 SHA1COMPRESS_FULL_ROUND2_STEP(d, e, a, b, c, W, 32, temp);
555
556#ifdef DOSTORESTATE33
557 SHA1_STORE_STATE(33)
558#endif
559 SHA1COMPRESS_FULL_ROUND2_STEP(c, d, e, a, b, W, 33, temp);
560
561#ifdef DOSTORESTATE34
562 SHA1_STORE_STATE(34)
563#endif
564 SHA1COMPRESS_FULL_ROUND2_STEP(b, c, d, e, a, W, 34, temp);
565
566#ifdef DOSTORESTATE35
567 SHA1_STORE_STATE(35)
568#endif
569 SHA1COMPRESS_FULL_ROUND2_STEP(a, b, c, d, e, W, 35, temp);
570
571#ifdef DOSTORESTATE36
572 SHA1_STORE_STATE(36)
573#endif
574 SHA1COMPRESS_FULL_ROUND2_STEP(e, a, b, c, d, W, 36, temp);
575
576#ifdef DOSTORESTATE37
577 SHA1_STORE_STATE(37)
578#endif
579 SHA1COMPRESS_FULL_ROUND2_STEP(d, e, a, b, c, W, 37, temp);
580
581#ifdef DOSTORESTATE38
582 SHA1_STORE_STATE(38)
583#endif
584 SHA1COMPRESS_FULL_ROUND2_STEP(c, d, e, a, b, W, 38, temp);
585
586#ifdef DOSTORESTATE39
587 SHA1_STORE_STATE(39)
588#endif
589 SHA1COMPRESS_FULL_ROUND2_STEP(b, c, d, e, a, W, 39, temp);
590
591
592
593#ifdef DOSTORESTATE40
594 SHA1_STORE_STATE(40)
595#endif
596 SHA1COMPRESS_FULL_ROUND3_STEP(a, b, c, d, e, W, 40, temp);
597
598#ifdef DOSTORESTATE41
599 SHA1_STORE_STATE(41)
600#endif
601 SHA1COMPRESS_FULL_ROUND3_STEP(e, a, b, c, d, W, 41, temp);
602
603#ifdef DOSTORESTATE42
604 SHA1_STORE_STATE(42)
605#endif
606 SHA1COMPRESS_FULL_ROUND3_STEP(d, e, a, b, c, W, 42, temp);
607
608#ifdef DOSTORESTATE43
609 SHA1_STORE_STATE(43)
610#endif
611 SHA1COMPRESS_FULL_ROUND3_STEP(c, d, e, a, b, W, 43, temp);
612
613#ifdef DOSTORESTATE44
614 SHA1_STORE_STATE(44)
615#endif
616 SHA1COMPRESS_FULL_ROUND3_STEP(b, c, d, e, a, W, 44, temp);
617
618#ifdef DOSTORESTATE45
619 SHA1_STORE_STATE(45)
620#endif
621 SHA1COMPRESS_FULL_ROUND3_STEP(a, b, c, d, e, W, 45, temp);
622
623#ifdef DOSTORESTATE46
624 SHA1_STORE_STATE(46)
625#endif
626 SHA1COMPRESS_FULL_ROUND3_STEP(e, a, b, c, d, W, 46, temp);
627
628#ifdef DOSTORESTATE47
629 SHA1_STORE_STATE(47)
630#endif
631 SHA1COMPRESS_FULL_ROUND3_STEP(d, e, a, b, c, W, 47, temp);
632
633#ifdef DOSTORESTATE48
634 SHA1_STORE_STATE(48)
635#endif
636 SHA1COMPRESS_FULL_ROUND3_STEP(c, d, e, a, b, W, 48, temp);
637
638#ifdef DOSTORESTATE49
639 SHA1_STORE_STATE(49)
640#endif
641 SHA1COMPRESS_FULL_ROUND3_STEP(b, c, d, e, a, W, 49, temp);
642
643#ifdef DOSTORESTATE50
644 SHA1_STORE_STATE(50)
645#endif
646 SHA1COMPRESS_FULL_ROUND3_STEP(a, b, c, d, e, W, 50, temp);
647
648#ifdef DOSTORESTATE51
649 SHA1_STORE_STATE(51)
650#endif
651 SHA1COMPRESS_FULL_ROUND3_STEP(e, a, b, c, d, W, 51, temp);
652
653#ifdef DOSTORESTATE52
654 SHA1_STORE_STATE(52)
655#endif
656 SHA1COMPRESS_FULL_ROUND3_STEP(d, e, a, b, c, W, 52, temp);
657
658#ifdef DOSTORESTATE53
659 SHA1_STORE_STATE(53)
660#endif
661 SHA1COMPRESS_FULL_ROUND3_STEP(c, d, e, a, b, W, 53, temp);
662
663#ifdef DOSTORESTATE54
664 SHA1_STORE_STATE(54)
665#endif
666 SHA1COMPRESS_FULL_ROUND3_STEP(b, c, d, e, a, W, 54, temp);
667
668#ifdef DOSTORESTATE55
669 SHA1_STORE_STATE(55)
670#endif
671 SHA1COMPRESS_FULL_ROUND3_STEP(a, b, c, d, e, W, 55, temp);
672
673#ifdef DOSTORESTATE56
674 SHA1_STORE_STATE(56)
675#endif
676 SHA1COMPRESS_FULL_ROUND3_STEP(e, a, b, c, d, W, 56, temp);
677
678#ifdef DOSTORESTATE57
679 SHA1_STORE_STATE(57)
680#endif
681 SHA1COMPRESS_FULL_ROUND3_STEP(d, e, a, b, c, W, 57, temp);
682
683#ifdef DOSTORESTATE58
684 SHA1_STORE_STATE(58)
685#endif
686 SHA1COMPRESS_FULL_ROUND3_STEP(c, d, e, a, b, W, 58, temp);
687
688#ifdef DOSTORESTATE59
689 SHA1_STORE_STATE(59)
690#endif
691 SHA1COMPRESS_FULL_ROUND3_STEP(b, c, d, e, a, W, 59, temp);
692
693
694
695
696#ifdef DOSTORESTATE60
697 SHA1_STORE_STATE(60)
698#endif
699 SHA1COMPRESS_FULL_ROUND4_STEP(a, b, c, d, e, W, 60, temp);
700
701#ifdef DOSTORESTATE61
702 SHA1_STORE_STATE(61)
703#endif
704 SHA1COMPRESS_FULL_ROUND4_STEP(e, a, b, c, d, W, 61, temp);
705
706#ifdef DOSTORESTATE62
707 SHA1_STORE_STATE(62)
708#endif
709 SHA1COMPRESS_FULL_ROUND4_STEP(d, e, a, b, c, W, 62, temp);
710
711#ifdef DOSTORESTATE63
712 SHA1_STORE_STATE(63)
713#endif
714 SHA1COMPRESS_FULL_ROUND4_STEP(c, d, e, a, b, W, 63, temp);
715
716#ifdef DOSTORESTATE64
717 SHA1_STORE_STATE(64)
718#endif
719 SHA1COMPRESS_FULL_ROUND4_STEP(b, c, d, e, a, W, 64, temp);
720
721#ifdef DOSTORESTATE65
722 SHA1_STORE_STATE(65)
723#endif
724 SHA1COMPRESS_FULL_ROUND4_STEP(a, b, c, d, e, W, 65, temp);
725
726#ifdef DOSTORESTATE66
727 SHA1_STORE_STATE(66)
728#endif
729 SHA1COMPRESS_FULL_ROUND4_STEP(e, a, b, c, d, W, 66, temp);
730
731#ifdef DOSTORESTATE67
732 SHA1_STORE_STATE(67)
733#endif
734 SHA1COMPRESS_FULL_ROUND4_STEP(d, e, a, b, c, W, 67, temp);
735
736#ifdef DOSTORESTATE68
737 SHA1_STORE_STATE(68)
738#endif
739 SHA1COMPRESS_FULL_ROUND4_STEP(c, d, e, a, b, W, 68, temp);
740
741#ifdef DOSTORESTATE69
742 SHA1_STORE_STATE(69)
743#endif
744 SHA1COMPRESS_FULL_ROUND4_STEP(b, c, d, e, a, W, 69, temp);
745
746#ifdef DOSTORESTATE70
747 SHA1_STORE_STATE(70)
748#endif
749 SHA1COMPRESS_FULL_ROUND4_STEP(a, b, c, d, e, W, 70, temp);
750
751#ifdef DOSTORESTATE71
752 SHA1_STORE_STATE(71)
753#endif
754 SHA1COMPRESS_FULL_ROUND4_STEP(e, a, b, c, d, W, 71, temp);
755
756#ifdef DOSTORESTATE72
757 SHA1_STORE_STATE(72)
758#endif
759 SHA1COMPRESS_FULL_ROUND4_STEP(d, e, a, b, c, W, 72, temp);
760
761#ifdef DOSTORESTATE73
762 SHA1_STORE_STATE(73)
763#endif
764 SHA1COMPRESS_FULL_ROUND4_STEP(c, d, e, a, b, W, 73, temp);
765
766#ifdef DOSTORESTATE74
767 SHA1_STORE_STATE(74)
768#endif
769 SHA1COMPRESS_FULL_ROUND4_STEP(b, c, d, e, a, W, 74, temp);
770
771#ifdef DOSTORESTATE75
772 SHA1_STORE_STATE(75)
773#endif
774 SHA1COMPRESS_FULL_ROUND4_STEP(a, b, c, d, e, W, 75, temp);
775
776#ifdef DOSTORESTATE76
777 SHA1_STORE_STATE(76)
778#endif
779 SHA1COMPRESS_FULL_ROUND4_STEP(e, a, b, c, d, W, 76, temp);
780
781#ifdef DOSTORESTATE77
782 SHA1_STORE_STATE(77)
783#endif
784 SHA1COMPRESS_FULL_ROUND4_STEP(d, e, a, b, c, W, 77, temp);
785
786#ifdef DOSTORESTATE78
787 SHA1_STORE_STATE(78)
788#endif
789 SHA1COMPRESS_FULL_ROUND4_STEP(c, d, e, a, b, W, 78, temp);
790
791#ifdef DOSTORESTATE79
792 SHA1_STORE_STATE(79)
793#endif
794 SHA1COMPRESS_FULL_ROUND4_STEP(b, c, d, e, a, W, 79, temp);
795
796
797
798 ihv[0] += a; ihv[1] += b; ihv[2] += c; ihv[3] += d; ihv[4] += e;
799}
800
801
802
803
804#define SHA1_RECOMPRESS(t) \
805static void sha1recompress_fast_ ## t (uint32_t ihvin[5], uint32_t ihvout[5], const uint32_t me2[80], const uint32_t state[5]) \
806{ \
807 uint32_t a = state[0], b = state[1], c = state[2], d = state[3], e = state[4]; \
808 if (t > 79) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(b, c, d, e, a, me2, 79); \
809 if (t > 78) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(c, d, e, a, b, me2, 78); \
810 if (t > 77) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(d, e, a, b, c, me2, 77); \
811 if (t > 76) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(e, a, b, c, d, me2, 76); \
812 if (t > 75) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(a, b, c, d, e, me2, 75); \
813 if (t > 74) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(b, c, d, e, a, me2, 74); \
814 if (t > 73) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(c, d, e, a, b, me2, 73); \
815 if (t > 72) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(d, e, a, b, c, me2, 72); \
816 if (t > 71) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(e, a, b, c, d, me2, 71); \
817 if (t > 70) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(a, b, c, d, e, me2, 70); \
818 if (t > 69) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(b, c, d, e, a, me2, 69); \
819 if (t > 68) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(c, d, e, a, b, me2, 68); \
820 if (t > 67) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(d, e, a, b, c, me2, 67); \
821 if (t > 66) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(e, a, b, c, d, me2, 66); \
822 if (t > 65) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(a, b, c, d, e, me2, 65); \
823 if (t > 64) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(b, c, d, e, a, me2, 64); \
824 if (t > 63) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(c, d, e, a, b, me2, 63); \
825 if (t > 62) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(d, e, a, b, c, me2, 62); \
826 if (t > 61) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(e, a, b, c, d, me2, 61); \
827 if (t > 60) HASHCLASH_SHA1COMPRESS_ROUND4_STEP_BW(a, b, c, d, e, me2, 60); \
828 if (t > 59) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(b, c, d, e, a, me2, 59); \
829 if (t > 58) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(c, d, e, a, b, me2, 58); \
830 if (t > 57) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(d, e, a, b, c, me2, 57); \
831 if (t > 56) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(e, a, b, c, d, me2, 56); \
832 if (t > 55) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(a, b, c, d, e, me2, 55); \
833 if (t > 54) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(b, c, d, e, a, me2, 54); \
834 if (t > 53) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(c, d, e, a, b, me2, 53); \
835 if (t > 52) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(d, e, a, b, c, me2, 52); \
836 if (t > 51) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(e, a, b, c, d, me2, 51); \
837 if (t > 50) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(a, b, c, d, e, me2, 50); \
838 if (t > 49) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(b, c, d, e, a, me2, 49); \
839 if (t > 48) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(c, d, e, a, b, me2, 48); \
840 if (t > 47) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(d, e, a, b, c, me2, 47); \
841 if (t > 46) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(e, a, b, c, d, me2, 46); \
842 if (t > 45) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(a, b, c, d, e, me2, 45); \
843 if (t > 44) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(b, c, d, e, a, me2, 44); \
844 if (t > 43) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(c, d, e, a, b, me2, 43); \
845 if (t > 42) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(d, e, a, b, c, me2, 42); \
846 if (t > 41) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(e, a, b, c, d, me2, 41); \
847 if (t > 40) HASHCLASH_SHA1COMPRESS_ROUND3_STEP_BW(a, b, c, d, e, me2, 40); \
848 if (t > 39) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(b, c, d, e, a, me2, 39); \
849 if (t > 38) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(c, d, e, a, b, me2, 38); \
850 if (t > 37) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(d, e, a, b, c, me2, 37); \
851 if (t > 36) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(e, a, b, c, d, me2, 36); \
852 if (t > 35) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(a, b, c, d, e, me2, 35); \
853 if (t > 34) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(b, c, d, e, a, me2, 34); \
854 if (t > 33) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(c, d, e, a, b, me2, 33); \
855 if (t > 32) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(d, e, a, b, c, me2, 32); \
856 if (t > 31) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(e, a, b, c, d, me2, 31); \
857 if (t > 30) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(a, b, c, d, e, me2, 30); \
858 if (t > 29) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(b, c, d, e, a, me2, 29); \
859 if (t > 28) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(c, d, e, a, b, me2, 28); \
860 if (t > 27) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(d, e, a, b, c, me2, 27); \
861 if (t > 26) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(e, a, b, c, d, me2, 26); \
862 if (t > 25) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(a, b, c, d, e, me2, 25); \
863 if (t > 24) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(b, c, d, e, a, me2, 24); \
864 if (t > 23) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(c, d, e, a, b, me2, 23); \
865 if (t > 22) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(d, e, a, b, c, me2, 22); \
866 if (t > 21) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(e, a, b, c, d, me2, 21); \
867 if (t > 20) HASHCLASH_SHA1COMPRESS_ROUND2_STEP_BW(a, b, c, d, e, me2, 20); \
868 if (t > 19) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(b, c, d, e, a, me2, 19); \
869 if (t > 18) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(c, d, e, a, b, me2, 18); \
870 if (t > 17) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(d, e, a, b, c, me2, 17); \
871 if (t > 16) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(e, a, b, c, d, me2, 16); \
872 if (t > 15) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(a, b, c, d, e, me2, 15); \
873 if (t > 14) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(b, c, d, e, a, me2, 14); \
874 if (t > 13) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(c, d, e, a, b, me2, 13); \
875 if (t > 12) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(d, e, a, b, c, me2, 12); \
876 if (t > 11) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(e, a, b, c, d, me2, 11); \
877 if (t > 10) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(a, b, c, d, e, me2, 10); \
878 if (t > 9) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(b, c, d, e, a, me2, 9); \
879 if (t > 8) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(c, d, e, a, b, me2, 8); \
880 if (t > 7) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(d, e, a, b, c, me2, 7); \
881 if (t > 6) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(e, a, b, c, d, me2, 6); \
882 if (t > 5) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(a, b, c, d, e, me2, 5); \
883 if (t > 4) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(b, c, d, e, a, me2, 4); \
884 if (t > 3) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(c, d, e, a, b, me2, 3); \
885 if (t > 2) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(d, e, a, b, c, me2, 2); \
886 if (t > 1) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(e, a, b, c, d, me2, 1); \
887 if (t > 0) HASHCLASH_SHA1COMPRESS_ROUND1_STEP_BW(a, b, c, d, e, me2, 0); \
888 ihvin[0] = a; ihvin[1] = b; ihvin[2] = c; ihvin[3] = d; ihvin[4] = e; \
889 a = state[0]; b = state[1]; c = state[2]; d = state[3]; e = state[4]; \
890 if (t <= 0) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, me2, 0); \
891 if (t <= 1) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, me2, 1); \
892 if (t <= 2) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, me2, 2); \
893 if (t <= 3) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, me2, 3); \
894 if (t <= 4) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, me2, 4); \
895 if (t <= 5) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, me2, 5); \
896 if (t <= 6) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, me2, 6); \
897 if (t <= 7) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, me2, 7); \
898 if (t <= 8) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, me2, 8); \
899 if (t <= 9) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, me2, 9); \
900 if (t <= 10) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, me2, 10); \
901 if (t <= 11) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, me2, 11); \
902 if (t <= 12) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, me2, 12); \
903 if (t <= 13) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, me2, 13); \
904 if (t <= 14) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, me2, 14); \
905 if (t <= 15) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(a, b, c, d, e, me2, 15); \
906 if (t <= 16) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(e, a, b, c, d, me2, 16); \
907 if (t <= 17) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(d, e, a, b, c, me2, 17); \
908 if (t <= 18) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(c, d, e, a, b, me2, 18); \
909 if (t <= 19) HASHCLASH_SHA1COMPRESS_ROUND1_STEP(b, c, d, e, a, me2, 19); \
910 if (t <= 20) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, me2, 20); \
911 if (t <= 21) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, me2, 21); \
912 if (t <= 22) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, me2, 22); \
913 if (t <= 23) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, me2, 23); \
914 if (t <= 24) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, me2, 24); \
915 if (t <= 25) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, me2, 25); \
916 if (t <= 26) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, me2, 26); \
917 if (t <= 27) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, me2, 27); \
918 if (t <= 28) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, me2, 28); \
919 if (t <= 29) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, me2, 29); \
920 if (t <= 30) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, me2, 30); \
921 if (t <= 31) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, me2, 31); \
922 if (t <= 32) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, me2, 32); \
923 if (t <= 33) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, me2, 33); \
924 if (t <= 34) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, me2, 34); \
925 if (t <= 35) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(a, b, c, d, e, me2, 35); \
926 if (t <= 36) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(e, a, b, c, d, me2, 36); \
927 if (t <= 37) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(d, e, a, b, c, me2, 37); \
928 if (t <= 38) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(c, d, e, a, b, me2, 38); \
929 if (t <= 39) HASHCLASH_SHA1COMPRESS_ROUND2_STEP(b, c, d, e, a, me2, 39); \
930 if (t <= 40) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, me2, 40); \
931 if (t <= 41) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, me2, 41); \
932 if (t <= 42) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, me2, 42); \
933 if (t <= 43) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, me2, 43); \
934 if (t <= 44) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, me2, 44); \
935 if (t <= 45) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, me2, 45); \
936 if (t <= 46) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, me2, 46); \
937 if (t <= 47) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, me2, 47); \
938 if (t <= 48) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, me2, 48); \
939 if (t <= 49) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, me2, 49); \
940 if (t <= 50) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, me2, 50); \
941 if (t <= 51) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, me2, 51); \
942 if (t <= 52) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, me2, 52); \
943 if (t <= 53) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, me2, 53); \
944 if (t <= 54) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, me2, 54); \
945 if (t <= 55) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(a, b, c, d, e, me2, 55); \
946 if (t <= 56) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(e, a, b, c, d, me2, 56); \
947 if (t <= 57) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(d, e, a, b, c, me2, 57); \
948 if (t <= 58) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(c, d, e, a, b, me2, 58); \
949 if (t <= 59) HASHCLASH_SHA1COMPRESS_ROUND3_STEP(b, c, d, e, a, me2, 59); \
950 if (t <= 60) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, me2, 60); \
951 if (t <= 61) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, me2, 61); \
952 if (t <= 62) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, me2, 62); \
953 if (t <= 63) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, me2, 63); \
954 if (t <= 64) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, me2, 64); \
955 if (t <= 65) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, me2, 65); \
956 if (t <= 66) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, me2, 66); \
957 if (t <= 67) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, me2, 67); \
958 if (t <= 68) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, me2, 68); \
959 if (t <= 69) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, me2, 69); \
960 if (t <= 70) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, me2, 70); \
961 if (t <= 71) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, me2, 71); \
962 if (t <= 72) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, me2, 72); \
963 if (t <= 73) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, me2, 73); \
964 if (t <= 74) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, me2, 74); \
965 if (t <= 75) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(a, b, c, d, e, me2, 75); \
966 if (t <= 76) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(e, a, b, c, d, me2, 76); \
967 if (t <= 77) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(d, e, a, b, c, me2, 77); \
968 if (t <= 78) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(c, d, e, a, b, me2, 78); \
969 if (t <= 79) HASHCLASH_SHA1COMPRESS_ROUND4_STEP(b, c, d, e, a, me2, 79); \
970 ihvout[0] = ihvin[0] + a; ihvout[1] = ihvin[1] + b; ihvout[2] = ihvin[2] + c; ihvout[3] = ihvin[3] + d; ihvout[4] = ihvin[4] + e; \
971}
972
973#ifdef _MSC_VER
974#pragma warning(push)
975#pragma warning(disable: 4127) /* Compiler complains about the checks in the above macro being constant. */
976#endif
977
978#ifdef DOSTORESTATE0
979SHA1_RECOMPRESS(0)
980#endif
981
982#ifdef DOSTORESTATE1
983SHA1_RECOMPRESS(1)
984#endif
985
986#ifdef DOSTORESTATE2
987SHA1_RECOMPRESS(2)
988#endif
989
990#ifdef DOSTORESTATE3
991SHA1_RECOMPRESS(3)
992#endif
993
994#ifdef DOSTORESTATE4
995SHA1_RECOMPRESS(4)
996#endif
997
998#ifdef DOSTORESTATE5
999SHA1_RECOMPRESS(5)
1000#endif
1001
1002#ifdef DOSTORESTATE6
1003SHA1_RECOMPRESS(6)
1004#endif
1005
1006#ifdef DOSTORESTATE7
1007SHA1_RECOMPRESS(7)
1008#endif
1009
1010#ifdef DOSTORESTATE8
1011SHA1_RECOMPRESS(8)
1012#endif
1013
1014#ifdef DOSTORESTATE9
1015SHA1_RECOMPRESS(9)
1016#endif
1017
1018#ifdef DOSTORESTATE10
1019SHA1_RECOMPRESS(10)
1020#endif
1021
1022#ifdef DOSTORESTATE11
1023SHA1_RECOMPRESS(11)
1024#endif
1025
1026#ifdef DOSTORESTATE12
1027SHA1_RECOMPRESS(12)
1028#endif
1029
1030#ifdef DOSTORESTATE13
1031SHA1_RECOMPRESS(13)
1032#endif
1033
1034#ifdef DOSTORESTATE14
1035SHA1_RECOMPRESS(14)
1036#endif
1037
1038#ifdef DOSTORESTATE15
1039SHA1_RECOMPRESS(15)
1040#endif
1041
1042#ifdef DOSTORESTATE16
1043SHA1_RECOMPRESS(16)
1044#endif
1045
1046#ifdef DOSTORESTATE17
1047SHA1_RECOMPRESS(17)
1048#endif
1049
1050#ifdef DOSTORESTATE18
1051SHA1_RECOMPRESS(18)
1052#endif
1053
1054#ifdef DOSTORESTATE19
1055SHA1_RECOMPRESS(19)
1056#endif
1057
1058#ifdef DOSTORESTATE20
1059SHA1_RECOMPRESS(20)
1060#endif
1061
1062#ifdef DOSTORESTATE21
1063SHA1_RECOMPRESS(21)
1064#endif
1065
1066#ifdef DOSTORESTATE22
1067SHA1_RECOMPRESS(22)
1068#endif
1069
1070#ifdef DOSTORESTATE23
1071SHA1_RECOMPRESS(23)
1072#endif
1073
1074#ifdef DOSTORESTATE24
1075SHA1_RECOMPRESS(24)
1076#endif
1077
1078#ifdef DOSTORESTATE25
1079SHA1_RECOMPRESS(25)
1080#endif
1081
1082#ifdef DOSTORESTATE26
1083SHA1_RECOMPRESS(26)
1084#endif
1085
1086#ifdef DOSTORESTATE27
1087SHA1_RECOMPRESS(27)
1088#endif
1089
1090#ifdef DOSTORESTATE28
1091SHA1_RECOMPRESS(28)
1092#endif
1093
1094#ifdef DOSTORESTATE29
1095SHA1_RECOMPRESS(29)
1096#endif
1097
1098#ifdef DOSTORESTATE30
1099SHA1_RECOMPRESS(30)
1100#endif
1101
1102#ifdef DOSTORESTATE31
1103SHA1_RECOMPRESS(31)
1104#endif
1105
1106#ifdef DOSTORESTATE32
1107SHA1_RECOMPRESS(32)
1108#endif
1109
1110#ifdef DOSTORESTATE33
1111SHA1_RECOMPRESS(33)
1112#endif
1113
1114#ifdef DOSTORESTATE34
1115SHA1_RECOMPRESS(34)
1116#endif
1117
1118#ifdef DOSTORESTATE35
1119SHA1_RECOMPRESS(35)
1120#endif
1121
1122#ifdef DOSTORESTATE36
1123SHA1_RECOMPRESS(36)
1124#endif
1125
1126#ifdef DOSTORESTATE37
1127SHA1_RECOMPRESS(37)
1128#endif
1129
1130#ifdef DOSTORESTATE38
1131SHA1_RECOMPRESS(38)
1132#endif
1133
1134#ifdef DOSTORESTATE39
1135SHA1_RECOMPRESS(39)
1136#endif
1137
1138#ifdef DOSTORESTATE40
1139SHA1_RECOMPRESS(40)
1140#endif
1141
1142#ifdef DOSTORESTATE41
1143SHA1_RECOMPRESS(41)
1144#endif
1145
1146#ifdef DOSTORESTATE42
1147SHA1_RECOMPRESS(42)
1148#endif
1149
1150#ifdef DOSTORESTATE43
1151SHA1_RECOMPRESS(43)
1152#endif
1153
1154#ifdef DOSTORESTATE44
1155SHA1_RECOMPRESS(44)
1156#endif
1157
1158#ifdef DOSTORESTATE45
1159SHA1_RECOMPRESS(45)
1160#endif
1161
1162#ifdef DOSTORESTATE46
1163SHA1_RECOMPRESS(46)
1164#endif
1165
1166#ifdef DOSTORESTATE47
1167SHA1_RECOMPRESS(47)
1168#endif
1169
1170#ifdef DOSTORESTATE48
1171SHA1_RECOMPRESS(48)
1172#endif
1173
1174#ifdef DOSTORESTATE49
1175SHA1_RECOMPRESS(49)
1176#endif
1177
1178#ifdef DOSTORESTATE50
1179SHA1_RECOMPRESS(50)
1180#endif
1181
1182#ifdef DOSTORESTATE51
1183SHA1_RECOMPRESS(51)
1184#endif
1185
1186#ifdef DOSTORESTATE52
1187SHA1_RECOMPRESS(52)
1188#endif
1189
1190#ifdef DOSTORESTATE53
1191SHA1_RECOMPRESS(53)
1192#endif
1193
1194#ifdef DOSTORESTATE54
1195SHA1_RECOMPRESS(54)
1196#endif
1197
1198#ifdef DOSTORESTATE55
1199SHA1_RECOMPRESS(55)
1200#endif
1201
1202#ifdef DOSTORESTATE56
1203SHA1_RECOMPRESS(56)
1204#endif
1205
1206#ifdef DOSTORESTATE57
1207SHA1_RECOMPRESS(57)
1208#endif
1209
1210#ifdef DOSTORESTATE58
1211SHA1_RECOMPRESS(58)
1212#endif
1213
1214#ifdef DOSTORESTATE59
1215SHA1_RECOMPRESS(59)
1216#endif
1217
1218#ifdef DOSTORESTATE60
1219SHA1_RECOMPRESS(60)
1220#endif
1221
1222#ifdef DOSTORESTATE61
1223SHA1_RECOMPRESS(61)
1224#endif
1225
1226#ifdef DOSTORESTATE62
1227SHA1_RECOMPRESS(62)
1228#endif
1229
1230#ifdef DOSTORESTATE63
1231SHA1_RECOMPRESS(63)
1232#endif
1233
1234#ifdef DOSTORESTATE64
1235SHA1_RECOMPRESS(64)
1236#endif
1237
1238#ifdef DOSTORESTATE65
1239SHA1_RECOMPRESS(65)
1240#endif
1241
1242#ifdef DOSTORESTATE66
1243SHA1_RECOMPRESS(66)
1244#endif
1245
1246#ifdef DOSTORESTATE67
1247SHA1_RECOMPRESS(67)
1248#endif
1249
1250#ifdef DOSTORESTATE68
1251SHA1_RECOMPRESS(68)
1252#endif
1253
1254#ifdef DOSTORESTATE69
1255SHA1_RECOMPRESS(69)
1256#endif
1257
1258#ifdef DOSTORESTATE70
1259SHA1_RECOMPRESS(70)
1260#endif
1261
1262#ifdef DOSTORESTATE71
1263SHA1_RECOMPRESS(71)
1264#endif
1265
1266#ifdef DOSTORESTATE72
1267SHA1_RECOMPRESS(72)
1268#endif
1269
1270#ifdef DOSTORESTATE73
1271SHA1_RECOMPRESS(73)
1272#endif
1273
1274#ifdef DOSTORESTATE74
1275SHA1_RECOMPRESS(74)
1276#endif
1277
1278#ifdef DOSTORESTATE75
1279SHA1_RECOMPRESS(75)
1280#endif
1281
1282#ifdef DOSTORESTATE76
1283SHA1_RECOMPRESS(76)
1284#endif
1285
1286#ifdef DOSTORESTATE77
1287SHA1_RECOMPRESS(77)
1288#endif
1289
1290#ifdef DOSTORESTATE78
1291SHA1_RECOMPRESS(78)
1292#endif
1293
1294#ifdef DOSTORESTATE79
1295SHA1_RECOMPRESS(79)
1296#endif
1297
1298#ifdef _MSC_VER
1299#pragma warning(pop)
1300#endif
1301
1302static void sha1_recompression_step(uint32_t step, uint32_t ihvin[5], uint32_t ihvout[5], const uint32_t me2[80], const uint32_t state[5])
1303{
1304 switch (step)
1305 {
1306#ifdef DOSTORESTATE0
1307 case 0:
1308 sha1recompress_fast_0(ihvin, ihvout, me2, state);
1309 break;
1310#endif
1311#ifdef DOSTORESTATE1
1312 case 1:
1313 sha1recompress_fast_1(ihvin, ihvout, me2, state);
1314 break;
1315#endif
1316#ifdef DOSTORESTATE2
1317 case 2:
1318 sha1recompress_fast_2(ihvin, ihvout, me2, state);
1319 break;
1320#endif
1321#ifdef DOSTORESTATE3
1322 case 3:
1323 sha1recompress_fast_3(ihvin, ihvout, me2, state);
1324 break;
1325#endif
1326#ifdef DOSTORESTATE4
1327 case 4:
1328 sha1recompress_fast_4(ihvin, ihvout, me2, state);
1329 break;
1330#endif
1331#ifdef DOSTORESTATE5
1332 case 5:
1333 sha1recompress_fast_5(ihvin, ihvout, me2, state);
1334 break;
1335#endif
1336#ifdef DOSTORESTATE6
1337 case 6:
1338 sha1recompress_fast_6(ihvin, ihvout, me2, state);
1339 break;
1340#endif
1341#ifdef DOSTORESTATE7
1342 case 7:
1343 sha1recompress_fast_7(ihvin, ihvout, me2, state);
1344 break;
1345#endif
1346#ifdef DOSTORESTATE8
1347 case 8:
1348 sha1recompress_fast_8(ihvin, ihvout, me2, state);
1349 break;
1350#endif
1351#ifdef DOSTORESTATE9
1352 case 9:
1353 sha1recompress_fast_9(ihvin, ihvout, me2, state);
1354 break;
1355#endif
1356#ifdef DOSTORESTATE10
1357 case 10:
1358 sha1recompress_fast_10(ihvin, ihvout, me2, state);
1359 break;
1360#endif
1361#ifdef DOSTORESTATE11
1362 case 11:
1363 sha1recompress_fast_11(ihvin, ihvout, me2, state);
1364 break;
1365#endif
1366#ifdef DOSTORESTATE12
1367 case 12:
1368 sha1recompress_fast_12(ihvin, ihvout, me2, state);
1369 break;
1370#endif
1371#ifdef DOSTORESTATE13
1372 case 13:
1373 sha1recompress_fast_13(ihvin, ihvout, me2, state);
1374 break;
1375#endif
1376#ifdef DOSTORESTATE14
1377 case 14:
1378 sha1recompress_fast_14(ihvin, ihvout, me2, state);
1379 break;
1380#endif
1381#ifdef DOSTORESTATE15
1382 case 15:
1383 sha1recompress_fast_15(ihvin, ihvout, me2, state);
1384 break;
1385#endif
1386#ifdef DOSTORESTATE16
1387 case 16:
1388 sha1recompress_fast_16(ihvin, ihvout, me2, state);
1389 break;
1390#endif
1391#ifdef DOSTORESTATE17
1392 case 17:
1393 sha1recompress_fast_17(ihvin, ihvout, me2, state);
1394 break;
1395#endif
1396#ifdef DOSTORESTATE18
1397 case 18:
1398 sha1recompress_fast_18(ihvin, ihvout, me2, state);
1399 break;
1400#endif
1401#ifdef DOSTORESTATE19
1402 case 19:
1403 sha1recompress_fast_19(ihvin, ihvout, me2, state);
1404 break;
1405#endif
1406#ifdef DOSTORESTATE20
1407 case 20:
1408 sha1recompress_fast_20(ihvin, ihvout, me2, state);
1409 break;
1410#endif
1411#ifdef DOSTORESTATE21
1412 case 21:
1413 sha1recompress_fast_21(ihvin, ihvout, me2, state);
1414 break;
1415#endif
1416#ifdef DOSTORESTATE22
1417 case 22:
1418 sha1recompress_fast_22(ihvin, ihvout, me2, state);
1419 break;
1420#endif
1421#ifdef DOSTORESTATE23
1422 case 23:
1423 sha1recompress_fast_23(ihvin, ihvout, me2, state);
1424 break;
1425#endif
1426#ifdef DOSTORESTATE24
1427 case 24:
1428 sha1recompress_fast_24(ihvin, ihvout, me2, state);
1429 break;
1430#endif
1431#ifdef DOSTORESTATE25
1432 case 25:
1433 sha1recompress_fast_25(ihvin, ihvout, me2, state);
1434 break;
1435#endif
1436#ifdef DOSTORESTATE26
1437 case 26:
1438 sha1recompress_fast_26(ihvin, ihvout, me2, state);
1439 break;
1440#endif
1441#ifdef DOSTORESTATE27
1442 case 27:
1443 sha1recompress_fast_27(ihvin, ihvout, me2, state);
1444 break;
1445#endif
1446#ifdef DOSTORESTATE28
1447 case 28:
1448 sha1recompress_fast_28(ihvin, ihvout, me2, state);
1449 break;
1450#endif
1451#ifdef DOSTORESTATE29
1452 case 29:
1453 sha1recompress_fast_29(ihvin, ihvout, me2, state);
1454 break;
1455#endif
1456#ifdef DOSTORESTATE30
1457 case 30:
1458 sha1recompress_fast_30(ihvin, ihvout, me2, state);
1459 break;
1460#endif
1461#ifdef DOSTORESTATE31
1462 case 31:
1463 sha1recompress_fast_31(ihvin, ihvout, me2, state);
1464 break;
1465#endif
1466#ifdef DOSTORESTATE32
1467 case 32:
1468 sha1recompress_fast_32(ihvin, ihvout, me2, state);
1469 break;
1470#endif
1471#ifdef DOSTORESTATE33
1472 case 33:
1473 sha1recompress_fast_33(ihvin, ihvout, me2, state);
1474 break;
1475#endif
1476#ifdef DOSTORESTATE34
1477 case 34:
1478 sha1recompress_fast_34(ihvin, ihvout, me2, state);
1479 break;
1480#endif
1481#ifdef DOSTORESTATE35
1482 case 35:
1483 sha1recompress_fast_35(ihvin, ihvout, me2, state);
1484 break;
1485#endif
1486#ifdef DOSTORESTATE36
1487 case 36:
1488 sha1recompress_fast_36(ihvin, ihvout, me2, state);
1489 break;
1490#endif
1491#ifdef DOSTORESTATE37
1492 case 37:
1493 sha1recompress_fast_37(ihvin, ihvout, me2, state);
1494 break;
1495#endif
1496#ifdef DOSTORESTATE38
1497 case 38:
1498 sha1recompress_fast_38(ihvin, ihvout, me2, state);
1499 break;
1500#endif
1501#ifdef DOSTORESTATE39
1502 case 39:
1503 sha1recompress_fast_39(ihvin, ihvout, me2, state);
1504 break;
1505#endif
1506#ifdef DOSTORESTATE40
1507 case 40:
1508 sha1recompress_fast_40(ihvin, ihvout, me2, state);
1509 break;
1510#endif
1511#ifdef DOSTORESTATE41
1512 case 41:
1513 sha1recompress_fast_41(ihvin, ihvout, me2, state);
1514 break;
1515#endif
1516#ifdef DOSTORESTATE42
1517 case 42:
1518 sha1recompress_fast_42(ihvin, ihvout, me2, state);
1519 break;
1520#endif
1521#ifdef DOSTORESTATE43
1522 case 43:
1523 sha1recompress_fast_43(ihvin, ihvout, me2, state);
1524 break;
1525#endif
1526#ifdef DOSTORESTATE44
1527 case 44:
1528 sha1recompress_fast_44(ihvin, ihvout, me2, state);
1529 break;
1530#endif
1531#ifdef DOSTORESTATE45
1532 case 45:
1533 sha1recompress_fast_45(ihvin, ihvout, me2, state);
1534 break;
1535#endif
1536#ifdef DOSTORESTATE46
1537 case 46:
1538 sha1recompress_fast_46(ihvin, ihvout, me2, state);
1539 break;
1540#endif
1541#ifdef DOSTORESTATE47
1542 case 47:
1543 sha1recompress_fast_47(ihvin, ihvout, me2, state);
1544 break;
1545#endif
1546#ifdef DOSTORESTATE48
1547 case 48:
1548 sha1recompress_fast_48(ihvin, ihvout, me2, state);
1549 break;
1550#endif
1551#ifdef DOSTORESTATE49
1552 case 49:
1553 sha1recompress_fast_49(ihvin, ihvout, me2, state);
1554 break;
1555#endif
1556#ifdef DOSTORESTATE50
1557 case 50:
1558 sha1recompress_fast_50(ihvin, ihvout, me2, state);
1559 break;
1560#endif
1561#ifdef DOSTORESTATE51
1562 case 51:
1563 sha1recompress_fast_51(ihvin, ihvout, me2, state);
1564 break;
1565#endif
1566#ifdef DOSTORESTATE52
1567 case 52:
1568 sha1recompress_fast_52(ihvin, ihvout, me2, state);
1569 break;
1570#endif
1571#ifdef DOSTORESTATE53
1572 case 53:
1573 sha1recompress_fast_53(ihvin, ihvout, me2, state);
1574 break;
1575#endif
1576#ifdef DOSTORESTATE54
1577 case 54:
1578 sha1recompress_fast_54(ihvin, ihvout, me2, state);
1579 break;
1580#endif
1581#ifdef DOSTORESTATE55
1582 case 55:
1583 sha1recompress_fast_55(ihvin, ihvout, me2, state);
1584 break;
1585#endif
1586#ifdef DOSTORESTATE56
1587 case 56:
1588 sha1recompress_fast_56(ihvin, ihvout, me2, state);
1589 break;
1590#endif
1591#ifdef DOSTORESTATE57
1592 case 57:
1593 sha1recompress_fast_57(ihvin, ihvout, me2, state);
1594 break;
1595#endif
1596#ifdef DOSTORESTATE58
1597 case 58:
1598 sha1recompress_fast_58(ihvin, ihvout, me2, state);
1599 break;
1600#endif
1601#ifdef DOSTORESTATE59
1602 case 59:
1603 sha1recompress_fast_59(ihvin, ihvout, me2, state);
1604 break;
1605#endif
1606#ifdef DOSTORESTATE60
1607 case 60:
1608 sha1recompress_fast_60(ihvin, ihvout, me2, state);
1609 break;
1610#endif
1611#ifdef DOSTORESTATE61
1612 case 61:
1613 sha1recompress_fast_61(ihvin, ihvout, me2, state);
1614 break;
1615#endif
1616#ifdef DOSTORESTATE62
1617 case 62:
1618 sha1recompress_fast_62(ihvin, ihvout, me2, state);
1619 break;
1620#endif
1621#ifdef DOSTORESTATE63
1622 case 63:
1623 sha1recompress_fast_63(ihvin, ihvout, me2, state);
1624 break;
1625#endif
1626#ifdef DOSTORESTATE64
1627 case 64:
1628 sha1recompress_fast_64(ihvin, ihvout, me2, state);
1629 break;
1630#endif
1631#ifdef DOSTORESTATE65
1632 case 65:
1633 sha1recompress_fast_65(ihvin, ihvout, me2, state);
1634 break;
1635#endif
1636#ifdef DOSTORESTATE66
1637 case 66:
1638 sha1recompress_fast_66(ihvin, ihvout, me2, state);
1639 break;
1640#endif
1641#ifdef DOSTORESTATE67
1642 case 67:
1643 sha1recompress_fast_67(ihvin, ihvout, me2, state);
1644 break;
1645#endif
1646#ifdef DOSTORESTATE68
1647 case 68:
1648 sha1recompress_fast_68(ihvin, ihvout, me2, state);
1649 break;
1650#endif
1651#ifdef DOSTORESTATE69
1652 case 69:
1653 sha1recompress_fast_69(ihvin, ihvout, me2, state);
1654 break;
1655#endif
1656#ifdef DOSTORESTATE70
1657 case 70:
1658 sha1recompress_fast_70(ihvin, ihvout, me2, state);
1659 break;
1660#endif
1661#ifdef DOSTORESTATE71
1662 case 71:
1663 sha1recompress_fast_71(ihvin, ihvout, me2, state);
1664 break;
1665#endif
1666#ifdef DOSTORESTATE72
1667 case 72:
1668 sha1recompress_fast_72(ihvin, ihvout, me2, state);
1669 break;
1670#endif
1671#ifdef DOSTORESTATE73
1672 case 73:
1673 sha1recompress_fast_73(ihvin, ihvout, me2, state);
1674 break;
1675#endif
1676#ifdef DOSTORESTATE74
1677 case 74:
1678 sha1recompress_fast_74(ihvin, ihvout, me2, state);
1679 break;
1680#endif
1681#ifdef DOSTORESTATE75
1682 case 75:
1683 sha1recompress_fast_75(ihvin, ihvout, me2, state);
1684 break;
1685#endif
1686#ifdef DOSTORESTATE76
1687 case 76:
1688 sha1recompress_fast_76(ihvin, ihvout, me2, state);
1689 break;
1690#endif
1691#ifdef DOSTORESTATE77
1692 case 77:
1693 sha1recompress_fast_77(ihvin, ihvout, me2, state);
1694 break;
1695#endif
1696#ifdef DOSTORESTATE78
1697 case 78:
1698 sha1recompress_fast_78(ihvin, ihvout, me2, state);
1699 break;
1700#endif
1701#ifdef DOSTORESTATE79
1702 case 79:
1703 sha1recompress_fast_79(ihvin, ihvout, me2, state);
1704 break;
1705#endif
1706 default:
1707 abort();
1708 }
1709
1710}
1711
1712
1713
1714static void sha1_process(SHA1_CTX* ctx, const uint32_t block[16])
1715{
1716 unsigned i, j;
1717 uint32_t ubc_dv_mask[DVMASKSIZE] = { 0xFFFFFFFF };
1718 uint32_t ihvtmp[5];
1719
1720 ctx->ihv1[0] = ctx->ihv[0];
1721 ctx->ihv1[1] = ctx->ihv[1];
1722 ctx->ihv1[2] = ctx->ihv[2];
1723 ctx->ihv1[3] = ctx->ihv[3];
1724 ctx->ihv1[4] = ctx->ihv[4];
1725
1726 sha1_compression_states(ctx->ihv, block, ctx->m1, ctx->states);
1727
1728 if (ctx->detect_coll)
1729 {
1730 if (ctx->ubc_check)
1731 {
1732 ubc_check(ctx->m1, ubc_dv_mask);
1733 }
1734
1735 if (ubc_dv_mask[0] != 0)
1736 {
1737 for (i = 0; sha1_dvs[i].dvType != 0; ++i)
1738 {
1739 if (ubc_dv_mask[0] & ((uint32_t)(1) << sha1_dvs[i].maskb))
1740 {
1741 for (j = 0; j < 80; ++j)
1742 ctx->m2[j] = ctx->m1[j] ^ sha1_dvs[i].dm[j];
1743
1744 sha1_recompression_step(sha1_dvs[i].testt, ctx->ihv2, ihvtmp, ctx->m2, ctx->states[sha1_dvs[i].testt]);
1745
1746 /* to verify SHA-1 collision detection code with collisions for reduced-step SHA-1 */
1747 if ((0 == ((ihvtmp[0] ^ ctx->ihv[0]) | (ihvtmp[1] ^ ctx->ihv[1]) | (ihvtmp[2] ^ ctx->ihv[2]) | (ihvtmp[3] ^ ctx->ihv[3]) | (ihvtmp[4] ^ ctx->ihv[4])))
1748 || (ctx->reduced_round_coll && 0==((ctx->ihv1[0] ^ ctx->ihv2[0]) | (ctx->ihv1[1] ^ ctx->ihv2[1]) | (ctx->ihv1[2] ^ ctx->ihv2[2]) | (ctx->ihv1[3] ^ ctx->ihv2[3]) | (ctx->ihv1[4] ^ ctx->ihv2[4]))))
1749 {
1750 ctx->found_collision = 1;
1751
1752 if (ctx->safe_hash)
1753 {
1754 sha1_compression_W(ctx->ihv, ctx->m1);
1755 sha1_compression_W(ctx->ihv, ctx->m1);
1756 }
1757
1758 break;
1759 }
1760 }
1761 }
1762 }
1763 }
1764}
1765
1766void SHA1DCInit(SHA1_CTX* ctx)
1767{
1768 ctx->total = 0;
1769 ctx->ihv[0] = 0x67452301;
1770 ctx->ihv[1] = 0xEFCDAB89;
1771 ctx->ihv[2] = 0x98BADCFE;
1772 ctx->ihv[3] = 0x10325476;
1773 ctx->ihv[4] = 0xC3D2E1F0;
1774 ctx->found_collision = 0;
1775 ctx->safe_hash = SHA1DC_INIT_SAFE_HASH_DEFAULT;
1776 ctx->ubc_check = 1;
1777 ctx->detect_coll = 1;
1778 ctx->reduced_round_coll = 0;
1779 ctx->callback = NULL;
1780}
1781
1782void SHA1DCSetSafeHash(SHA1_CTX* ctx, int safehash)
1783{
1784 if (safehash)
1785 ctx->safe_hash = 1;
1786 else
1787 ctx->safe_hash = 0;
1788}
1789
1790
1791void SHA1DCSetUseUBC(SHA1_CTX* ctx, int ubc_check)
1792{
1793 if (ubc_check)
1794 ctx->ubc_check = 1;
1795 else
1796 ctx->ubc_check = 0;
1797}
1798
1799void SHA1DCSetUseDetectColl(SHA1_CTX* ctx, int detect_coll)
1800{
1801 if (detect_coll)
1802 ctx->detect_coll = 1;
1803 else
1804 ctx->detect_coll = 0;
1805}
1806
1807void SHA1DCSetDetectReducedRoundCollision(SHA1_CTX* ctx, int reduced_round_coll)
1808{
1809 if (reduced_round_coll)
1810 ctx->reduced_round_coll = 1;
1811 else
1812 ctx->reduced_round_coll = 0;
1813}
1814
1815void SHA1DCSetCallback(SHA1_CTX* ctx, collision_block_callback callback)
1816{
1817 ctx->callback = callback;
1818}
1819
1820void SHA1DCUpdate(SHA1_CTX* ctx, const char* buf, size_t len)
1821{
1822 unsigned left, fill;
1823
1824 if (len == 0)
1825 return;
1826
1827 left = ctx->total & 63;
1828 fill = 64 - left;
1829
1830 if (left && len >= fill)
1831 {
1832 ctx->total += fill;
1833 memcpy(ctx->buffer + left, buf, fill);
1834 sha1_process(ctx, (uint32_t*)(ctx->buffer));
1835 buf += fill;
1836 len -= fill;
1837 left = 0;
1838 }
1839 while (len >= 64)
1840 {
1841 ctx->total += 64;
1842
1843#if defined(SHA1DC_ALLOW_UNALIGNED_ACCESS)
1844 sha1_process(ctx, (uint32_t*)(buf));
1845#else
1846 memcpy(ctx->buffer, buf, 64);
1847 sha1_process(ctx, (uint32_t*)(ctx->buffer));
1848#endif /* defined(SHA1DC_ALLOW_UNALIGNED_ACCESS) */
1849 buf += 64;
1850 len -= 64;
1851 }
1852 if (len > 0)
1853 {
1854 ctx->total += len;
1855 memcpy(ctx->buffer + left, buf, len);
1856 }
1857}
1858
1859static const unsigned char sha1_padding[64] =
1860{
1861 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1862 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1863 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1864 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1865};
1866
1867int SHA1DCFinal(unsigned char output[20], SHA1_CTX *ctx)
1868{
1869 uint32_t last = ctx->total & 63;
1870 uint32_t padn = (last < 56) ? (56 - last) : (120 - last);
1871 uint64_t total;
1872 SHA1DCUpdate(ctx, (const char*)(sha1_padding), padn);
1873
1874 total = ctx->total - padn;
1875 total <<= 3;
1876 ctx->buffer[56] = (unsigned char)(total >> 56);
1877 ctx->buffer[57] = (unsigned char)(total >> 48);
1878 ctx->buffer[58] = (unsigned char)(total >> 40);
1879 ctx->buffer[59] = (unsigned char)(total >> 32);
1880 ctx->buffer[60] = (unsigned char)(total >> 24);
1881 ctx->buffer[61] = (unsigned char)(total >> 16);
1882 ctx->buffer[62] = (unsigned char)(total >> 8);
1883 ctx->buffer[63] = (unsigned char)(total);
1884 sha1_process(ctx, (uint32_t*)(ctx->buffer));
1885 output[0] = (unsigned char)(ctx->ihv[0] >> 24);
1886 output[1] = (unsigned char)(ctx->ihv[0] >> 16);
1887 output[2] = (unsigned char)(ctx->ihv[0] >> 8);
1888 output[3] = (unsigned char)(ctx->ihv[0]);
1889 output[4] = (unsigned char)(ctx->ihv[1] >> 24);
1890 output[5] = (unsigned char)(ctx->ihv[1] >> 16);
1891 output[6] = (unsigned char)(ctx->ihv[1] >> 8);
1892 output[7] = (unsigned char)(ctx->ihv[1]);
1893 output[8] = (unsigned char)(ctx->ihv[2] >> 24);
1894 output[9] = (unsigned char)(ctx->ihv[2] >> 16);
1895 output[10] = (unsigned char)(ctx->ihv[2] >> 8);
1896 output[11] = (unsigned char)(ctx->ihv[2]);
1897 output[12] = (unsigned char)(ctx->ihv[3] >> 24);
1898 output[13] = (unsigned char)(ctx->ihv[3] >> 16);
1899 output[14] = (unsigned char)(ctx->ihv[3] >> 8);
1900 output[15] = (unsigned char)(ctx->ihv[3]);
1901 output[16] = (unsigned char)(ctx->ihv[4] >> 24);
1902 output[17] = (unsigned char)(ctx->ihv[4] >> 16);
1903 output[18] = (unsigned char)(ctx->ihv[4] >> 8);
1904 output[19] = (unsigned char)(ctx->ihv[4]);
1905 return ctx->found_collision;
1906}
1907
1908#ifdef SHA1DC_CUSTOM_TRAILING_INCLUDE_SHA1_C
1909#include SHA1DC_CUSTOM_TRAILING_INCLUDE_SHA1_C
1910#endif