sha1dc / sha1.con commit general improvements (43abf13)
   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) || 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://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#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
 191void 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
 292static 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
 385void 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) \
 806static 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
 980SHA1_RECOMPRESS(0)
 981#endif
 982
 983#ifdef DOSTORESTATE1
 984SHA1_RECOMPRESS(1)
 985#endif
 986
 987#ifdef DOSTORESTATE2
 988SHA1_RECOMPRESS(2)
 989#endif
 990
 991#ifdef DOSTORESTATE3
 992SHA1_RECOMPRESS(3)
 993#endif
 994
 995#ifdef DOSTORESTATE4
 996SHA1_RECOMPRESS(4)
 997#endif
 998
 999#ifdef DOSTORESTATE5
1000SHA1_RECOMPRESS(5)
1001#endif
1002
1003#ifdef DOSTORESTATE6
1004SHA1_RECOMPRESS(6)
1005#endif
1006
1007#ifdef DOSTORESTATE7
1008SHA1_RECOMPRESS(7)
1009#endif
1010
1011#ifdef DOSTORESTATE8
1012SHA1_RECOMPRESS(8)
1013#endif
1014
1015#ifdef DOSTORESTATE9
1016SHA1_RECOMPRESS(9)
1017#endif
1018
1019#ifdef DOSTORESTATE10
1020SHA1_RECOMPRESS(10)
1021#endif
1022
1023#ifdef DOSTORESTATE11
1024SHA1_RECOMPRESS(11)
1025#endif
1026
1027#ifdef DOSTORESTATE12
1028SHA1_RECOMPRESS(12)
1029#endif
1030
1031#ifdef DOSTORESTATE13
1032SHA1_RECOMPRESS(13)
1033#endif
1034
1035#ifdef DOSTORESTATE14
1036SHA1_RECOMPRESS(14)
1037#endif
1038
1039#ifdef DOSTORESTATE15
1040SHA1_RECOMPRESS(15)
1041#endif
1042
1043#ifdef DOSTORESTATE16
1044SHA1_RECOMPRESS(16)
1045#endif
1046
1047#ifdef DOSTORESTATE17
1048SHA1_RECOMPRESS(17)
1049#endif
1050
1051#ifdef DOSTORESTATE18
1052SHA1_RECOMPRESS(18)
1053#endif
1054
1055#ifdef DOSTORESTATE19
1056SHA1_RECOMPRESS(19)
1057#endif
1058
1059#ifdef DOSTORESTATE20
1060SHA1_RECOMPRESS(20)
1061#endif
1062
1063#ifdef DOSTORESTATE21
1064SHA1_RECOMPRESS(21)
1065#endif
1066
1067#ifdef DOSTORESTATE22
1068SHA1_RECOMPRESS(22)
1069#endif
1070
1071#ifdef DOSTORESTATE23
1072SHA1_RECOMPRESS(23)
1073#endif
1074
1075#ifdef DOSTORESTATE24
1076SHA1_RECOMPRESS(24)
1077#endif
1078
1079#ifdef DOSTORESTATE25
1080SHA1_RECOMPRESS(25)
1081#endif
1082
1083#ifdef DOSTORESTATE26
1084SHA1_RECOMPRESS(26)
1085#endif
1086
1087#ifdef DOSTORESTATE27
1088SHA1_RECOMPRESS(27)
1089#endif
1090
1091#ifdef DOSTORESTATE28
1092SHA1_RECOMPRESS(28)
1093#endif
1094
1095#ifdef DOSTORESTATE29
1096SHA1_RECOMPRESS(29)
1097#endif
1098
1099#ifdef DOSTORESTATE30
1100SHA1_RECOMPRESS(30)
1101#endif
1102
1103#ifdef DOSTORESTATE31
1104SHA1_RECOMPRESS(31)
1105#endif
1106
1107#ifdef DOSTORESTATE32
1108SHA1_RECOMPRESS(32)
1109#endif
1110
1111#ifdef DOSTORESTATE33
1112SHA1_RECOMPRESS(33)
1113#endif
1114
1115#ifdef DOSTORESTATE34
1116SHA1_RECOMPRESS(34)
1117#endif
1118
1119#ifdef DOSTORESTATE35
1120SHA1_RECOMPRESS(35)
1121#endif
1122
1123#ifdef DOSTORESTATE36
1124SHA1_RECOMPRESS(36)
1125#endif
1126
1127#ifdef DOSTORESTATE37
1128SHA1_RECOMPRESS(37)
1129#endif
1130
1131#ifdef DOSTORESTATE38
1132SHA1_RECOMPRESS(38)
1133#endif
1134
1135#ifdef DOSTORESTATE39
1136SHA1_RECOMPRESS(39)
1137#endif
1138
1139#ifdef DOSTORESTATE40
1140SHA1_RECOMPRESS(40)
1141#endif
1142
1143#ifdef DOSTORESTATE41
1144SHA1_RECOMPRESS(41)
1145#endif
1146
1147#ifdef DOSTORESTATE42
1148SHA1_RECOMPRESS(42)
1149#endif
1150
1151#ifdef DOSTORESTATE43
1152SHA1_RECOMPRESS(43)
1153#endif
1154
1155#ifdef DOSTORESTATE44
1156SHA1_RECOMPRESS(44)
1157#endif
1158
1159#ifdef DOSTORESTATE45
1160SHA1_RECOMPRESS(45)
1161#endif
1162
1163#ifdef DOSTORESTATE46
1164SHA1_RECOMPRESS(46)
1165#endif
1166
1167#ifdef DOSTORESTATE47
1168SHA1_RECOMPRESS(47)
1169#endif
1170
1171#ifdef DOSTORESTATE48
1172SHA1_RECOMPRESS(48)
1173#endif
1174
1175#ifdef DOSTORESTATE49
1176SHA1_RECOMPRESS(49)
1177#endif
1178
1179#ifdef DOSTORESTATE50
1180SHA1_RECOMPRESS(50)
1181#endif
1182
1183#ifdef DOSTORESTATE51
1184SHA1_RECOMPRESS(51)
1185#endif
1186
1187#ifdef DOSTORESTATE52
1188SHA1_RECOMPRESS(52)
1189#endif
1190
1191#ifdef DOSTORESTATE53
1192SHA1_RECOMPRESS(53)
1193#endif
1194
1195#ifdef DOSTORESTATE54
1196SHA1_RECOMPRESS(54)
1197#endif
1198
1199#ifdef DOSTORESTATE55
1200SHA1_RECOMPRESS(55)
1201#endif
1202
1203#ifdef DOSTORESTATE56
1204SHA1_RECOMPRESS(56)
1205#endif
1206
1207#ifdef DOSTORESTATE57
1208SHA1_RECOMPRESS(57)
1209#endif
1210
1211#ifdef DOSTORESTATE58
1212SHA1_RECOMPRESS(58)
1213#endif
1214
1215#ifdef DOSTORESTATE59
1216SHA1_RECOMPRESS(59)
1217#endif
1218
1219#ifdef DOSTORESTATE60
1220SHA1_RECOMPRESS(60)
1221#endif
1222
1223#ifdef DOSTORESTATE61
1224SHA1_RECOMPRESS(61)
1225#endif
1226
1227#ifdef DOSTORESTATE62
1228SHA1_RECOMPRESS(62)
1229#endif
1230
1231#ifdef DOSTORESTATE63
1232SHA1_RECOMPRESS(63)
1233#endif
1234
1235#ifdef DOSTORESTATE64
1236SHA1_RECOMPRESS(64)
1237#endif
1238
1239#ifdef DOSTORESTATE65
1240SHA1_RECOMPRESS(65)
1241#endif
1242
1243#ifdef DOSTORESTATE66
1244SHA1_RECOMPRESS(66)
1245#endif
1246
1247#ifdef DOSTORESTATE67
1248SHA1_RECOMPRESS(67)
1249#endif
1250
1251#ifdef DOSTORESTATE68
1252SHA1_RECOMPRESS(68)
1253#endif
1254
1255#ifdef DOSTORESTATE69
1256SHA1_RECOMPRESS(69)
1257#endif
1258
1259#ifdef DOSTORESTATE70
1260SHA1_RECOMPRESS(70)
1261#endif
1262
1263#ifdef DOSTORESTATE71
1264SHA1_RECOMPRESS(71)
1265#endif
1266
1267#ifdef DOSTORESTATE72
1268SHA1_RECOMPRESS(72)
1269#endif
1270
1271#ifdef DOSTORESTATE73
1272SHA1_RECOMPRESS(73)
1273#endif
1274
1275#ifdef DOSTORESTATE74
1276SHA1_RECOMPRESS(74)
1277#endif
1278
1279#ifdef DOSTORESTATE75
1280SHA1_RECOMPRESS(75)
1281#endif
1282
1283#ifdef DOSTORESTATE76
1284SHA1_RECOMPRESS(76)
1285#endif
1286
1287#ifdef DOSTORESTATE77
1288SHA1_RECOMPRESS(77)
1289#endif
1290
1291#ifdef DOSTORESTATE78
1292SHA1_RECOMPRESS(78)
1293#endif
1294
1295#ifdef DOSTORESTATE79
1296SHA1_RECOMPRESS(79)
1297#endif
1298
1299#ifdef _MSC_VER
1300#pragma warning(pop)
1301#endif
1302
1303static 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
1715static 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
1767void 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
1783void 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
1792void 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
1800void 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
1808void 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
1816void SHA1DCSetCallback(SHA1_CTX* ctx, collision_block_callback callback)
1817{
1818        ctx->callback = callback;
1819}
1820
1821void 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
1860static 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
1868int 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