9 #define SHA1CircularShift(bits,word) (((word) << (bits)) | ((word) >> (32-(bits))))
11 // this rotate isn't faster with me
13 #define ROTATE(a,n) _lrotl(a,n)
15 #define ROTATE(a,n) (((a)<<(n))|(((a)&0xffffffff)>>(32-(n))))
18 /* A nice byte order reversal from Wei Dai <weidai@eskimo.com> */
20 /* 5 instructions with rotate instruction, else 9 */
21 #define Endian_Reverse32(a) \
23 unsigned long l=(a); \
24 (a)=((ROTATE(l,8)&0x00FF00FF)|(ROTATE(l,24)&0xFF00FF00)); \
27 /* 6 instructions with rotate instruction, else 8 */
28 #define Endian_Reverse32(a) \
30 unsigned long l=(a); \
31 l=(((l&0xFF00FF00)>>8L)|((l&0x00FF00FF)<<8L)); \
36 #define F_00_19(b,c,d) ((((c) ^ (d)) & (b)) ^ (d))
37 #define F_20_39(b,c,d) ((b) ^ (c) ^ (d))
38 #define F_40_59(b,c,d) (((b) & (c)) | (((b)|(c)) & (d)))
39 #define F_60_79(b,c,d) F_20_39(b,c,d)
52 typedef unsigned int UINT4;
53 #define SHA1HashSize 20
55 void SHA1_NEW( unsigned char * pData, int length, unsigned char * pDigest)
60 UINT4 Message_Block_Index = 0;
64 unsigned char Message_Block[64];
65 UINT4 Message_Block_W[16];
68 Message_Block_W[0] = 0x00000000;
69 Message_Block_W[1] = 0x00000000;
70 Message_Block_W[2] = 0x00000000;
71 Message_Block_W[3] = 0x00000000;
72 Message_Block_W[4] = 0x00000000;
74 UINT4 Intermediate_Hash[5] = { H0, H1, H2, H3, H4 };
76 memcpy(Message_Block, pData, length);
77 Message_Block_Index += length;
80 Message_Block[length] = 0x80;
82 UINT4 W_15 = length << 3;
84 int t; /* Loop counter */
85 UINT4 temp; /* Temporary word value */
86 UINT4 W[80]; /* Word sequence */
87 UINT4 A, B, C, D, E; /* Word buffers */
90 * Initialize the first 16 words in the array W
94 W[x] = (Message_Block[(x) * 4] << 24) | \
95 (Message_Block[(x) * 4 + 1] << 16) | \
96 (Message_Block[(x) * 4 +2] << 8) | \
97 (Message_Block[(x) * 4 +3])
99 #define INIT(x) W[x] = Message_Block_W[x];
101 #define INIT_NULL(x) W[x] = 0;
104 Endian_Reverse32(Message_Block_W[0]);
107 #define INIT_NULL_1_14 \
108 INIT_NULL(1); INIT_NULL_2_14;
110 #define INIT_NULL_2_14 \
111 INIT_NULL(2); INIT_NULL_3_14;
113 #define INIT_NULL_3_14 \
114 INIT_NULL(3); INIT_NULL_4_14;
116 #define INIT_NULL_4_14 \
117 INIT_NULL(4); INIT_NULL_5_14;
119 #define INIT_NULL_5_14 \
120 INIT_NULL(5); INIT_NULL(6); INIT_NULL(7); \
121 INIT_NULL(8); INIT_NULL(9); INIT_NULL(10); INIT_NULL(11); \
122 INIT_NULL(12); INIT_NULL(13); INIT_NULL(14);
124 #define ROTATE1_NULL_1_14 \
125 ROTATE1_NULL; ROTATE1_NULL_2_14;
127 #define ROTATE1_NULL_2_14 \
128 ROTATE1_NULL; ROTATE1_NULL_3_14;
130 #define ROTATE1_NULL_3_14 \
131 ROTATE1_NULL; ROTATE1_NULL_4_14;
133 #define ROTATE1_NULL_4_14 \
134 ROTATE1_NULL; ROTATE1_NULL_5_14;
136 #define ROTATE1_NULL_5_14 \
137 ROTATE1_NULL; ROTATE1_NULL; ROTATE1_NULL; \
138 ROTATE1_NULL; ROTATE1_NULL; ROTATE1_NULL; ROTATE1_NULL; \
139 ROTATE1_NULL; ROTATE1_NULL; ROTATE1_NULL;
143 W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]); \
145 #define EXPAND_3(t) W[t] = SHA1CircularShift(1,W[t-3]);
146 #define EXPAND_16(t) W[t] = SHA1CircularShift(1,W[t-16]);
147 #define EXPAND_3_8(t) W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8]);
157 else if (length < 8) {
158 Endian_Reverse32(Message_Block_W[1]);
167 Endian_Reverse32(Message_Block_W[1]);
168 Endian_Reverse32(Message_Block_W[2]);
169 Endian_Reverse32(Message_Block_W[3]);
170 Endian_Reverse32(Message_Block_W[4]);
171 INIT(1); INIT(2); INIT(3); INIT(4);
193 EXPAND_3(21); EXPAND_3(22);
196 EXPAND(24); EXPAND(25); EXPAND_3_8(26); EXPAND_3_8(27);
197 EXPAND(28); EXPAND(29); EXPAND(30); EXPAND(31);
198 EXPAND(32); EXPAND(33); EXPAND(34); EXPAND(35);
199 EXPAND(36); EXPAND(37); EXPAND(38); EXPAND(39);
200 EXPAND(40); EXPAND(41); EXPAND(42); EXPAND(43);
201 EXPAND(44); EXPAND(45); EXPAND(46); EXPAND(47);
202 EXPAND(48); EXPAND(49); EXPAND(50); EXPAND(51);
203 EXPAND(52); EXPAND(53); EXPAND(54); EXPAND(55);
204 EXPAND(56); EXPAND(57); EXPAND(58); EXPAND(59);
205 EXPAND(60); EXPAND(61); EXPAND(62); EXPAND(63);
206 EXPAND(64); EXPAND(65); EXPAND(66); EXPAND(67);
207 EXPAND(68); EXPAND(69); EXPAND(70); EXPAND(71);
208 EXPAND(72); EXPAND(73); EXPAND(74); EXPAND(75);
209 EXPAND(76); EXPAND(77); EXPAND(78); EXPAND(79);
213 temp = SHA1CircularShift(5,A) + F_00_19(B,C,D) + E + W[t] + K0; \
215 C = SHA1CircularShift(30,B); \
218 #define ROTATE1_NEW(a, b, c, d, e, x) \
219 e += SHA1CircularShift(5,a) + F_00_19(b,c,d) + x + K0; \
220 b = SHA1CircularShift(30,b);
222 #define ROTATE1_W(w) \
223 temp = SHA1CircularShift(5,A) + F_00_19(B,C,D) + E + w + K0; \
225 C = SHA1CircularShift(30,B); \
228 #define ROTATE1_NULL \
229 temp = SHA1CircularShift(5,A) + F_00_19(B,C,D) + E + K0; \
231 C = SHA1CircularShift(30,B); \
234 #define ROTATE2_NEW(a, b, c, d, e, x) \
235 e += SHA1CircularShift(5,a) + F_20_39(b,c,d) + x + K1; \
236 b = SHA1CircularShift(30,b);
239 temp = SHA1CircularShift(5,A) + F_20_39(B,C,D) + E + W[t] + K1; \
241 C = SHA1CircularShift(30,B); \
244 #define ROTATE2_W(w) \
245 temp = SHA1CircularShift(5,A) + F_20_39(B,C,D) + E + w + K1; \
247 C = SHA1CircularShift(30,B); \
251 temp = SHA1CircularShift(5,A) + F_40_59(B,C,D) + E + W[t] + K2; \
253 C = SHA1CircularShift(30,B); \
257 temp = SHA1CircularShift(5,A) + F_60_79(B,C,D) + E + W[t] + K3; \
259 C = SHA1CircularShift(30,B); \
272 B = 2679412915 + W[0];
274 A = SHA1CircularShift(5,B) + 1722862861;
277 A = SHA1CircularShift(5,B) + 1722862861 + W[1];
281 temp = SHA1CircularShift(5,A) + ((((1506887872) ^ (2079550178)) & (B)) ^ (2079550178)) + H2 + K0;
284 temp = SHA1CircularShift(5,A) + (((572662306) & (B)) ^ (2079550178)) + H2 + K0 + W[2];
286 C = SHA1CircularShift(30,B); //SHA1CircularShift(30,(2679412915 + W[0]));
291 temp = SHA1CircularShift(5,A) + ((((C) ^ (1506887872)) & (B)) ^ (1506887872)) + 2079550178 + K0;
294 temp = SHA1CircularShift(5,A) + ((((C) ^ (1506887872)) & (B)) ^ (1506887872)) + 2079550178 + K0 + W[3];
298 C = SHA1CircularShift(30,B);
303 temp = SHA1CircularShift(5,A) + F_00_19(B,C,D) + 1506887872 + K0;
306 temp = SHA1CircularShift(5,A) + F_00_19(B,C,D) + 1506887872 + K0 + W[4];
310 C = SHA1CircularShift(30,B);
316 ROTATE1_NEW( A, B, C, D, E, W_15 );
317 ROTATE1_NEW( E, A, B, C, D, W[16] );
318 ROTATE1_NEW( D, E, A, B, C, W[17] );
319 ROTATE1_NEW( C, D, E, A, B, W[18] );
320 ROTATE1_NEW( B, C, D, E, A, W[19] );
322 for(t = 20; t < 40; t++)
324 if (t == 21 && length < 8) {
325 ROTATE2_W((length<<5)); // *32
332 for(t = 40; t < 60; t++)
337 for(t = 60; t < 80; t++)
342 Intermediate_Hash[0] += A;
343 Intermediate_Hash[1] += B;
344 Intermediate_Hash[2] += C;
345 Intermediate_Hash[3] += D;
346 Intermediate_Hash[4] += E;
348 Endian_Reverse32(Intermediate_Hash[0]);
349 Endian_Reverse32(Intermediate_Hash[1]);
350 Endian_Reverse32(Intermediate_Hash[2]);
351 Endian_Reverse32(Intermediate_Hash[3]);
352 Endian_Reverse32(Intermediate_Hash[4]);
354 memcpy(pDigest, Intermediate_Hash, 20);