-//#include <stdio.h>
-#if defined(WIN32)
-#include <windows.h>
-#endif
-#include <string.h>
-
-
-
-#define SHA1CircularShift(bits,word) (((word) << (bits)) | ((word) >> (32-(bits))))
-
-// this rotate isn't faster with me
-#if defined(WIN32)
-#define ROTATE(a,n) _lrotl(a,n)
-#else
-#define ROTATE(a,n) (((a)<<(n))|(((a)&0xffffffff)>>(32-(n))))
-#endif
-
-/* A nice byte order reversal from Wei Dai <weidai@eskimo.com> */
-#if defined(WIN32)
-/* 5 instructions with rotate instruction, else 9 */
-#define Endian_Reverse32(a) \
- { \
- unsigned long l=(a); \
- (a)=((ROTATE(l,8)&0x00FF00FF)|(ROTATE(l,24)&0xFF00FF00)); \
- }
-#else
-/* 6 instructions with rotate instruction, else 8 */
-#define Endian_Reverse32(a) \
- { \
- unsigned long l=(a); \
- l=(((l&0xFF00FF00)>>8L)|((l&0x00FF00FF)<<8L)); \
- (a)=ROTATE(l,16L); \
- }
-#endif
-
-#define F_00_19(b,c,d) ((((c) ^ (d)) & (b)) ^ (d))
-#define F_20_39(b,c,d) ((b) ^ (c) ^ (d))
-#define F_40_59(b,c,d) (((b) & (c)) | (((b)|(c)) & (d)))
-#define F_60_79(b,c,d) F_20_39(b,c,d)
-
-#define K0 0x5A827999
-#define K1 0x6ED9EBA1
-#define K2 0x8F1BBCDC
-#define K3 0xCA62C1D6
-
-#define H0 0x67452301
-#define H1 0xEFCDAB89
-#define H2 0x98BADCFE
-#define H3 0x10325476
-#define H4 0xC3D2E1F0
-
-typedef unsigned int UINT4;
-#define SHA1HashSize 20
-
-void SHA1_NEW( unsigned char * pData, int length, unsigned char * pDigest)
-{
- if (length > 16)
- return;
-
- UINT4 Message_Block_Index = 0;
-
- union
- {
- unsigned char Message_Block[64];
- UINT4 Message_Block_W[16];
- };
-
- Message_Block_W[0] = 0x00000000;
- Message_Block_W[1] = 0x00000000;
- Message_Block_W[2] = 0x00000000;
- Message_Block_W[3] = 0x00000000;
- Message_Block_W[4] = 0x00000000;
-
- UINT4 Intermediate_Hash[5] = { H0, H1, H2, H3, H4 };
-
- memcpy(Message_Block, pData, length);
- Message_Block_Index += length;
-
- //padMessage
- Message_Block[length] = 0x80;
-
- UINT4 W_15 = length << 3;
-
- int t; /* Loop counter */
- UINT4 temp; /* Temporary word value */
- UINT4 W[80]; /* Word sequence */
- UINT4 A, B, C, D, E; /* Word buffers */
-
- /*
- * Initialize the first 16 words in the array W
- */
-
- #define INIT_OLD(x) \
- W[x] = (Message_Block[(x) * 4] << 24) | \
- (Message_Block[(x) * 4 + 1] << 16) | \
- (Message_Block[(x) * 4 +2] << 8) | \
- (Message_Block[(x) * 4 +3])
-
- #define INIT(x) W[x] = Message_Block_W[x];
-
- #define INIT_NULL(x) W[x] = 0;
-
-
- Endian_Reverse32(Message_Block_W[0]);
- INIT(0);
-
- #define INIT_NULL_1_14 \
- INIT_NULL(1); INIT_NULL_2_14;
-
- #define INIT_NULL_2_14 \
- INIT_NULL(2); INIT_NULL_3_14;
-
- #define INIT_NULL_3_14 \
- INIT_NULL(3); INIT_NULL_4_14;
-
- #define INIT_NULL_4_14 \
- INIT_NULL(4); INIT_NULL_5_14;
-
- #define INIT_NULL_5_14 \
- INIT_NULL(5); INIT_NULL(6); INIT_NULL(7); \
- INIT_NULL(8); INIT_NULL(9); INIT_NULL(10); INIT_NULL(11); \
- INIT_NULL(12); INIT_NULL(13); INIT_NULL(14);
-
- #define ROTATE1_NULL_1_14 \
- ROTATE1_NULL; ROTATE1_NULL_2_14;
-
- #define ROTATE1_NULL_2_14 \
- ROTATE1_NULL; ROTATE1_NULL_3_14;
-
- #define ROTATE1_NULL_3_14 \
- ROTATE1_NULL; ROTATE1_NULL_4_14;
-
- #define ROTATE1_NULL_4_14 \
- ROTATE1_NULL; ROTATE1_NULL_5_14;
-
- #define ROTATE1_NULL_5_14 \
- ROTATE1_NULL; ROTATE1_NULL; ROTATE1_NULL; \
- ROTATE1_NULL; ROTATE1_NULL; ROTATE1_NULL; ROTATE1_NULL; \
- ROTATE1_NULL; ROTATE1_NULL; ROTATE1_NULL;
-
-
- #define EXPAND(t) \
- W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]); \
-
- #define EXPAND_3(t) W[t] = SHA1CircularShift(1,W[t-3]);
- #define EXPAND_16(t) W[t] = SHA1CircularShift(1,W[t-16]);
- #define EXPAND_3_8(t) W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8]);
-
-
- if (length < 4) {
- INIT_NULL_1_14;
- W[15] = W_15;
- EXPAND_16(16);
- W[17] = 0;
- W[18] = W_15<<1;
- }
- else if (length < 8) {
- Endian_Reverse32(Message_Block_W[1]);
- INIT(1);
- INIT_NULL_2_14;
- W[15] = W_15;
- EXPAND_16(16);
- EXPAND_16(17);
- W[18] = W_15<<1;
- }
- else {
- Endian_Reverse32(Message_Block_W[1]);
- Endian_Reverse32(Message_Block_W[2]);
- Endian_Reverse32(Message_Block_W[3]);
- Endian_Reverse32(Message_Block_W[4]);
- INIT(1); INIT(2); INIT(3); INIT(4);
- INIT_NULL_5_14;
- W[15] = W_15;
- EXPAND(16);
- EXPAND(17);
- EXPAND(18);
- }
-
-
- if (length < 12) {
- EXPAND_3(19);
- }
- else {
- EXPAND(19);
- }
-
- if (length < 16) {
- EXPAND_3(20);
- }
- else {
- EXPAND(20);
- }
- EXPAND_3(21); EXPAND_3(22);
- EXPAND(23);
-
- EXPAND(24); EXPAND(25); EXPAND_3_8(26); EXPAND_3_8(27);
- EXPAND(28); EXPAND(29); EXPAND(30); EXPAND(31);
- EXPAND(32); EXPAND(33); EXPAND(34); EXPAND(35);
- EXPAND(36); EXPAND(37); EXPAND(38); EXPAND(39);
- EXPAND(40); EXPAND(41); EXPAND(42); EXPAND(43);
- EXPAND(44); EXPAND(45); EXPAND(46); EXPAND(47);
- EXPAND(48); EXPAND(49); EXPAND(50); EXPAND(51);
- EXPAND(52); EXPAND(53); EXPAND(54); EXPAND(55);
- EXPAND(56); EXPAND(57); EXPAND(58); EXPAND(59);
- EXPAND(60); EXPAND(61); EXPAND(62); EXPAND(63);
- EXPAND(64); EXPAND(65); EXPAND(66); EXPAND(67);
- EXPAND(68); EXPAND(69); EXPAND(70); EXPAND(71);
- EXPAND(72); EXPAND(73); EXPAND(74); EXPAND(75);
- EXPAND(76); EXPAND(77); EXPAND(78); EXPAND(79);
-
-
- #define ROTATE1(t) \
- temp = SHA1CircularShift(5,A) + F_00_19(B,C,D) + E + W[t] + K0; \
- E = D; D = C; \
- C = SHA1CircularShift(30,B); \
- B = A; A = temp; \
-
- #define ROTATE1_NEW(a, b, c, d, e, x) \
- e += SHA1CircularShift(5,a) + F_00_19(b,c,d) + x + K0; \
- b = SHA1CircularShift(30,b);
-
- #define ROTATE1_W(w) \
- temp = SHA1CircularShift(5,A) + F_00_19(B,C,D) + E + w + K0; \
- E = D; D = C; \
- C = SHA1CircularShift(30,B); \
- B = A; A = temp;
-
- #define ROTATE1_NULL \
- temp = SHA1CircularShift(5,A) + F_00_19(B,C,D) + E + K0; \
- E = D; D = C; \
- C = SHA1CircularShift(30,B); \
- B = A; A = temp; \
-
- #define ROTATE2_NEW(a, b, c, d, e, x) \
- e += SHA1CircularShift(5,a) + F_20_39(b,c,d) + x + K1; \
- b = SHA1CircularShift(30,b);
-
- #define ROTATE2(t) \
- temp = SHA1CircularShift(5,A) + F_20_39(B,C,D) + E + W[t] + K1; \
- E = D; D = C; \
- C = SHA1CircularShift(30,B); \
- B = A; A = temp;
-
- #define ROTATE2_W(w) \
- temp = SHA1CircularShift(5,A) + F_20_39(B,C,D) + E + w + K1; \
- E = D; D = C; \
- C = SHA1CircularShift(30,B); \
- B = A; A = temp;
-
- #define ROTATE3(t) \
- temp = SHA1CircularShift(5,A) + F_40_59(B,C,D) + E + W[t] + K2; \
- E = D; D = C; \
- C = SHA1CircularShift(30,B); \
- B = A; A = temp;
-
- #define ROTATE4(t) \
- temp = SHA1CircularShift(5,A) + F_60_79(B,C,D) + E + W[t] + K3; \
- E = D; D = C; \
- C = SHA1CircularShift(30,B); \
- B = A; A = temp;
-
- A = H0;
- B = H1;
- C = H2;
- D = H3;
- E = H4;
-
-
- E = H2;
- //D = 2079550178;
- //C = 1506887872;
- B = 2679412915 + W[0];
- if (length < 4) {
- A = SHA1CircularShift(5,B) + 1722862861;
- }
- else {
- A = SHA1CircularShift(5,B) + 1722862861 + W[1];
- }
-
- if (length < 8) {
- temp = SHA1CircularShift(5,A) + ((((1506887872) ^ (2079550178)) & (B)) ^ (2079550178)) + H2 + K0;
- }
- else {
- temp = SHA1CircularShift(5,A) + (((572662306) & (B)) ^ (2079550178)) + H2 + K0 + W[2];
- }
- C = SHA1CircularShift(30,B); //SHA1CircularShift(30,(2679412915 + W[0]));
- B = A;
- A = temp;
-
- if (length < 12) {
- temp = SHA1CircularShift(5,A) + ((((C) ^ (1506887872)) & (B)) ^ (1506887872)) + 2079550178 + K0;
- }
- else {
- temp = SHA1CircularShift(5,A) + ((((C) ^ (1506887872)) & (B)) ^ (1506887872)) + 2079550178 + K0 + W[3];
- }
- E = 1506887872;
- D = C;
- C = SHA1CircularShift(30,B);
- B = A;
- A = temp;
-
- if (length < 16) {
- temp = SHA1CircularShift(5,A) + F_00_19(B,C,D) + 1506887872 + K0;
- }
- else {
- temp = SHA1CircularShift(5,A) + F_00_19(B,C,D) + 1506887872 + K0 + W[4];
- }
- E = D;
- D = C;
- C = SHA1CircularShift(30,B);
- B = A;
- A = temp;
-
- ROTATE1_NULL_5_14;
-
- ROTATE1_NEW( A, B, C, D, E, W_15 );
- ROTATE1_NEW( E, A, B, C, D, W[16] );
- ROTATE1_NEW( D, E, A, B, C, W[17] );
- ROTATE1_NEW( C, D, E, A, B, W[18] );
- ROTATE1_NEW( B, C, D, E, A, W[19] );
-
- for(t = 20; t < 40; t++)
- {
- if (t == 21 && length < 8) {
- ROTATE2_W((length<<5)); // *32
- }
- else {
- ROTATE2(t);
- }
- }
-
- for(t = 40; t < 60; t++)
- {
- ROTATE3(t);
- }
-
- for(t = 60; t < 80; t++)
- {
- ROTATE4(t);
- }
-
- Intermediate_Hash[0] += A;
- Intermediate_Hash[1] += B;
- Intermediate_Hash[2] += C;
- Intermediate_Hash[3] += D;
- Intermediate_Hash[4] += E;
-
- Endian_Reverse32(Intermediate_Hash[0]);
- Endian_Reverse32(Intermediate_Hash[1]);
- Endian_Reverse32(Intermediate_Hash[2]);
- Endian_Reverse32(Intermediate_Hash[3]);
- Endian_Reverse32(Intermediate_Hash[4]);
-
- memcpy(pDigest, Intermediate_Hash, 20);
-}
+/*\r
+ * rcracki_mt is a multithreaded implementation and fork of the original \r
+ * RainbowCrack\r
+ *\r
+ * Copyright Martin Westergaard Jørgensen <martinwj2005@gmail.com>\r
+ * Copyright Wei Dai <weidai@eskimo.com>\r
+ * Copyright 2009, 2010 Daniël Niggebrugge <niggebrugge@fox-it.com>\r
+ * Copyright 2009, 2010 James Nobis <frt@quelrod.net>\r
+ *\r
+ * This file is part of rcracki_mt.\r
+ *\r
+ * rcracki_mt is free software: you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation, either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * rcracki_mt is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with rcracki_mt. If not, see <http://www.gnu.org/licenses/>.\r
+ */\r
+\r
+//#include <stdio.h>\r
+#if defined(_WIN32)\r
+ #include <windows.h>\r
+#endif\r
+\r
+#include <string.h>\r
+\r
+#include "sha1.h"\r
+\r
+#define SHA1CircularShift(bits,word) (((word) << (bits)) | ((word) >> (32-(bits))))\r
+\r
+// this rotate isn't faster with me\r
+#if defined(_WIN32)\r
+ #define ROTATE(a,n) _lrotl(a,n)\r
+#else\r
+ #define ROTATE(a,n) (((a)<<(n))|(((a)&0xffffffff)>>(32-(n))))\r
+#endif\r
+\r
+/* A nice byte order reversal from Wei Dai <weidai@eskimo.com> */\r
+#if defined(_WIN32)\r
+/* 5 instructions with rotate instruction, else 9 */\r
+#define Endian_Reverse32(a) \\r
+ { \\r
+ unsigned long l=(a); \\r
+ (a)=((ROTATE(l,8)&0x00FF00FF)|(ROTATE(l,24)&0xFF00FF00)); \\r
+ }\r
+#else\r
+/* 6 instructions with rotate instruction, else 8 */\r
+#define Endian_Reverse32(a) \\r
+ { \\r
+ unsigned long l=(a); \\r
+ l=(((l&0xFF00FF00)>>8L)|((l&0x00FF00FF)<<8L)); \\r
+ (a)=ROTATE(l,16L); \\r
+ }\r
+#endif\r
+\r
+#define F_00_19(b,c,d) ((((c) ^ (d)) & (b)) ^ (d)) \r
+#define F_20_39(b,c,d) ((b) ^ (c) ^ (d))\r
+#define F_40_59(b,c,d) (((b) & (c)) | (((b)|(c)) & (d))) \r
+#define F_60_79(b,c,d) F_20_39(b,c,d)\r
+\r
+#define K0 0x5A827999\r
+#define K1 0x6ED9EBA1\r
+#define K2 0x8F1BBCDC\r
+#define K3 0xCA62C1D6\r
+\r
+#define H0 0x67452301\r
+#define H1 0xEFCDAB89\r
+#define H2 0x98BADCFE\r
+#define H3 0x10325476\r
+#define H4 0xC3D2E1F0\r
+\r
+#define SHA1HashSize 20\r
+\r
+void SHA1_NEW( unsigned char * pData, int length, unsigned char * pDigest)\r
+{\r
+ if (length > 16)\r
+ return;\r
+\r
+ uint32 Message_Block_Index = 0;\r
+\r
+ union\r
+ {\r
+ unsigned char Message_Block[64];\r
+ uint32 Message_Block_W[16];\r
+ };\r
+\r
+ Message_Block_W[0] = 0x00000000;\r
+ Message_Block_W[1] = 0x00000000;\r
+ Message_Block_W[2] = 0x00000000;\r
+ Message_Block_W[3] = 0x00000000;\r
+ Message_Block_W[4] = 0x00000000;\r
+\r
+ uint32 Intermediate_Hash[5] = { H0, H1, H2, H3, H4 };\r
+ \r
+ memcpy(Message_Block, pData, length);\r
+ Message_Block_Index += length;\r
+\r
+ //padMessage\r
+ Message_Block[length] = 0x80;\r
+ \r
+ uint32 W_15 = length << 3;\r
+\r
+ int t; /* Loop counter */\r
+ uint32 temp; /* Temporary word value */\r
+ uint32 W[80]; /* Word sequence */\r
+ uint32 A, B, C, D, E; /* Word buffers */\r
+\r
+ /*\r
+ * Initialize the first 16 words in the array W\r
+ */\r
+\r
+ #define INIT(x) W[x] = Message_Block_W[x];\r
+ \r
+ #define INIT_NULL(x) W[x] = 0;\r
+\r
+ \r
+ Endian_Reverse32(Message_Block_W[0]);\r
+ INIT(0);\r
+\r
+ #define INIT_NULL_1_14 \\r
+ INIT_NULL(1); INIT_NULL_2_14;\r
+\r
+ #define INIT_NULL_2_14 \\r
+ INIT_NULL(2); INIT_NULL_3_14;\r
+\r
+ #define INIT_NULL_3_14 \\r
+ INIT_NULL(3); INIT_NULL_4_14;\r
+\r
+ #define INIT_NULL_4_14 \\r
+ INIT_NULL(4); INIT_NULL_5_14;\r
+\r
+ #define INIT_NULL_5_14 \\r
+ INIT_NULL(5); INIT_NULL(6); INIT_NULL(7); \\r
+ INIT_NULL(8); INIT_NULL(9); INIT_NULL(10); INIT_NULL(11); \\r
+ INIT_NULL(12); INIT_NULL(13); INIT_NULL(14);\r
+\r
+ #define ROTATE1_NULL_5_14 \\r
+ ROTATE1_NULL; ROTATE1_NULL; ROTATE1_NULL; \\r
+ ROTATE1_NULL; ROTATE1_NULL; ROTATE1_NULL; ROTATE1_NULL; \\r
+ ROTATE1_NULL; ROTATE1_NULL; ROTATE1_NULL;\r
+\r
+\r
+ #define EXPAND(t) \\r
+ W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]); \\r
+\r
+ #define EXPAND_3(t) W[t] = SHA1CircularShift(1,W[t-3]);\r
+ #define EXPAND_16(t) W[t] = SHA1CircularShift(1,W[t-16]);\r
+ #define EXPAND_3_8(t) W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8]);\r
+\r
+ if (length < 4) {\r
+ INIT_NULL_1_14;\r
+ W[15] = W_15;\r
+ EXPAND_16(16);\r
+ W[17] = 0;\r
+ W[18] = W_15<<1;\r
+ }\r
+ else if (length < 8) {\r
+ Endian_Reverse32(Message_Block_W[1]);\r
+ INIT(1);\r
+ INIT_NULL_2_14;\r
+ W[15] = W_15;\r
+ EXPAND_16(16);\r
+ EXPAND_16(17);\r
+ W[18] = W_15<<1;\r
+ }\r
+ else {\r
+ Endian_Reverse32(Message_Block_W[1]);\r
+ Endian_Reverse32(Message_Block_W[2]);\r
+ Endian_Reverse32(Message_Block_W[3]);\r
+ Endian_Reverse32(Message_Block_W[4]);\r
+ INIT(1); INIT(2); INIT(3); INIT(4); \r
+ INIT_NULL_5_14;\r
+ W[15] = W_15;\r
+ EXPAND(16);\r
+ EXPAND(17);\r
+ EXPAND(18);\r
+ }\r
+\r
+ if (length < 12) {\r
+ EXPAND_3(19);\r
+ }\r
+ else {\r
+ EXPAND(19);\r
+ }\r
+\r
+ if (length < 16) {\r
+ EXPAND_3(20);\r
+ }\r
+ else {\r
+ EXPAND(20);\r
+ }\r
+ EXPAND_3(21); EXPAND_3(22);\r
+ EXPAND(23);\r
+\r
+ EXPAND(24); EXPAND(25); EXPAND_3_8(26); EXPAND_3_8(27);\r
+ EXPAND(28); EXPAND(29); EXPAND(30); EXPAND(31);\r
+ EXPAND(32); EXPAND(33); EXPAND(34); EXPAND(35);\r
+ EXPAND(36); EXPAND(37); EXPAND(38); EXPAND(39);\r
+ EXPAND(40); EXPAND(41); EXPAND(42); EXPAND(43);\r
+ EXPAND(44); EXPAND(45); EXPAND(46); EXPAND(47);\r
+ EXPAND(48); EXPAND(49); EXPAND(50); EXPAND(51);\r
+ EXPAND(52); EXPAND(53); EXPAND(54); EXPAND(55);\r
+ EXPAND(56); EXPAND(57); EXPAND(58); EXPAND(59);\r
+ EXPAND(60); EXPAND(61); EXPAND(62); EXPAND(63);\r
+ EXPAND(64); EXPAND(65); EXPAND(66); EXPAND(67);\r
+ EXPAND(68); EXPAND(69); EXPAND(70); EXPAND(71);\r
+ EXPAND(72); EXPAND(73); EXPAND(74); EXPAND(75);\r
+ EXPAND(76); EXPAND(77); EXPAND(78); EXPAND(79);\r
+\r
+\r
+ #define ROTATE1_NEW(a, b, c, d, e, x) \\r
+ e += SHA1CircularShift(5,a) + F_00_19(b,c,d) + x + K0; \\r
+ b = SHA1CircularShift(30,b);\r
+\r
+ #define ROTATE1_NULL \\r
+ temp = SHA1CircularShift(5,A) + F_00_19(B,C,D) + E + K0; \\r
+ E = D; D = C; \\r
+ C = SHA1CircularShift(30,B); \\r
+ B = A; A = temp; \\r
+ \r
+ #define ROTATE2_NEW(a, b, c, d, e, x) \\r
+ e += SHA1CircularShift(5,a) + F_20_39(b,c,d) + x + K1; \\r
+ b = SHA1CircularShift(30,b);\r
+ \r
+ #define ROTATE2(t) \\r
+ temp = SHA1CircularShift(5,A) + F_20_39(B,C,D) + E + W[t] + K1; \\r
+ E = D; D = C; \\r
+ C = SHA1CircularShift(30,B); \\r
+ B = A; A = temp;\r
+\r
+ #define ROTATE2_W(w) \\r
+ temp = SHA1CircularShift(5,A) + F_20_39(B,C,D) + E + w + K1; \\r
+ E = D; D = C; \\r
+ C = SHA1CircularShift(30,B); \\r
+ B = A; A = temp;\r
+\r
+ #define ROTATE3(t) \\r
+ temp = SHA1CircularShift(5,A) + F_40_59(B,C,D) + E + W[t] + K2; \\r
+ E = D; D = C; \\r
+ C = SHA1CircularShift(30,B); \\r
+ B = A; A = temp;\r
+\r
+ #define ROTATE4(t) \\r
+ temp = SHA1CircularShift(5,A) + F_60_79(B,C,D) + E + W[t] + K3; \\r
+ E = D; D = C; \\r
+ C = SHA1CircularShift(30,B); \\r
+ B = A; A = temp;\r
+\r
+ A = H0;\r
+ B = H1;\r
+ C = H2;\r
+ D = H3;\r
+ E = H4;\r
+\r
+\r
+ E = H2;\r
+ //D = 2079550178;\r
+ //C = 1506887872;\r
+ B = 2679412915u + W[0];\r
+ if (length < 4) {\r
+ A = SHA1CircularShift(5,B) + 1722862861;\r
+ }\r
+ else {\r
+ A = SHA1CircularShift(5,B) + 1722862861 + W[1];\r
+ }\r
+\r
+ if (length < 8) {\r
+ temp = SHA1CircularShift(5,A) + ((((1506887872) ^ (2079550178)) & (B)) ^ (2079550178)) + H2 + K0;\r
+ }\r
+ else {\r
+ temp = SHA1CircularShift(5,A) + (((572662306) & (B)) ^ (2079550178)) + H2 + K0 + W[2];\r
+ }\r
+ C = SHA1CircularShift(30,B); //SHA1CircularShift(30,(2679412915 + W[0]));\r
+ B = A;\r
+ A = temp;\r
+ \r
+ if (length < 12) {\r
+ temp = SHA1CircularShift(5,A) + ((((C) ^ (1506887872)) & (B)) ^ (1506887872)) + 2079550178 + K0;\r
+ }\r
+ else {\r
+ temp = SHA1CircularShift(5,A) + ((((C) ^ (1506887872)) & (B)) ^ (1506887872)) + 2079550178 + K0 + W[3];\r
+ }\r
+ E = 1506887872;\r
+ D = C;\r
+ C = SHA1CircularShift(30,B);\r
+ B = A;\r
+ A = temp;\r
+\r
+ if (length < 16) {\r
+ temp = SHA1CircularShift(5,A) + F_00_19(B,C,D) + 1506887872 + K0;\r
+ }\r
+ else {\r
+ temp = SHA1CircularShift(5,A) + F_00_19(B,C,D) + 1506887872 + K0 + W[4];\r
+ }\r
+ E = D;\r
+ D = C;\r
+ C = SHA1CircularShift(30,B);\r
+ B = A;\r
+ A = temp;\r
+\r
+ ROTATE1_NULL_5_14;\r
+\r
+ ROTATE1_NEW( A, B, C, D, E, W_15 );\r
+ ROTATE1_NEW( E, A, B, C, D, W[16] );\r
+ ROTATE1_NEW( D, E, A, B, C, W[17] );\r
+ ROTATE1_NEW( C, D, E, A, B, W[18] );\r
+ ROTATE1_NEW( B, C, D, E, A, W[19] );\r
+ \r
+ for(t = 20; t < 40; t++)\r
+ {\r
+ if (t == 21 && length < 8) {\r
+ ROTATE2_W((length<<5)); // *32\r
+ }\r
+ else {\r
+ ROTATE2(t);\r
+ }\r
+ }\r
+\r
+ for(t = 40; t < 60; t++)\r
+ {\r
+ ROTATE3(t);\r
+ }\r
+ \r
+ for(t = 60; t < 80; t++)\r
+ {\r
+ ROTATE4(t);\r
+ }\r
+ \r
+ Intermediate_Hash[0] += A;\r
+ Intermediate_Hash[1] += B;\r
+ Intermediate_Hash[2] += C;\r
+ Intermediate_Hash[3] += D;\r
+ Intermediate_Hash[4] += E;\r
+\r
+ Endian_Reverse32(Intermediate_Hash[0]);\r
+ Endian_Reverse32(Intermediate_Hash[1]);\r
+ Endian_Reverse32(Intermediate_Hash[2]);\r
+ Endian_Reverse32(Intermediate_Hash[3]);\r
+ Endian_Reverse32(Intermediate_Hash[4]);\r
+\r
+ memcpy(pDigest, Intermediate_Hash, 20);\r
+}\r