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