28 #define rol(value, bits) (_rotl((value), (bits)))
29 #define DWORD2BE(x) (((x) >> 24) & 0xff) | (((x) >> 8) & 0xff00) | (((x) << 8) & 0xff0000) | (((x) << 24) & 0xff000000);
30 #define blk0(i) (Block[i] = (rol(Block[i],24)&0xFF00FF00)|(rol(Block[i],8)&0x00FF00FF))
31 #define blk1(i) (Block[i&15] = rol(Block[(i+13)&15]^Block[(i+8)&15]^Block[(i+2)&15]^Block[i&15],1))
32 #define f1(x,y,z) (z^(x&(y^z)))
33 #define f2(x,y,z) (x^y^z)
34 #define f3(x,y,z) ((x&y)|(z&(x|y)))
35 #define f4(x,y,z) (x^y^z)
37 #define R0(v,w,x,y,z,i) z+=f1(w,x,y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);
38 #define R1(v,w,x,y,z,i) z+=f1(w,x,y)+blk1(i)+0x5A827999+rol(v,5);w=rol(w,30);
39 #define R2(v,w,x,y,z,i) z+=f2(w,x,y)+blk1(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);
40 #define R3(v,w,x,y,z,i) z+=f3(w,x,y)+blk1(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);
41 #define R4(v,w,x,y,z,i) z+=f4(w,x,y)+blk1(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);
44 static void SHATransform(ULONG State[5], UCHAR Buffer[64])
49 Block = (ULONG*)Buffer;
59 R0(a,b,c,d,e, 0);
R0(e,a,b,c,d, 1);
R0(d,e,a,b,c, 2);
R0(c,d,e,a,b, 3);
60 R0(b,c,d,e,a, 4);
R0(a,b,c,d,e, 5);
R0(e,a,b,c,d, 6);
R0(d,e,a,b,c, 7);
61 R0(c,d,e,a,b, 8);
R0(b,c,d,e,a, 9);
R0(a,b,c,d,e,10);
R0(e,a,b,c,d,11);
62 R0(d,e,a,b,c,12);
R0(c,d,e,a,b,13);
R0(b,c,d,e,a,14);
R0(a,b,c,d,e,15);
63 R1(e,a,b,c,d,16);
R1(d,e,a,b,c,17);
R1(c,d,e,a,b,18);
R1(b,c,d,e,a,19);
64 R2(a,b,c,d,e,20);
R2(e,a,b,c,d,21);
R2(d,e,a,b,c,22);
R2(c,d,e,a,b,23);
65 R2(b,c,d,e,a,24);
R2(a,b,c,d,e,25);
R2(e,a,b,c,d,26);
R2(d,e,a,b,c,27);
66 R2(c,d,e,a,b,28);
R2(b,c,d,e,a,29);
R2(a,b,c,d,e,30);
R2(e,a,b,c,d,31);
67 R2(d,e,a,b,c,32);
R2(c,d,e,a,b,33);
R2(b,c,d,e,a,34);
R2(a,b,c,d,e,35);
68 R2(e,a,b,c,d,36);
R2(d,e,a,b,c,37);
R2(c,d,e,a,b,38);
R2(b,c,d,e,a,39);
69 R3(a,b,c,d,e,40);
R3(e,a,b,c,d,41);
R3(d,e,a,b,c,42);
R3(c,d,e,a,b,43);
70 R3(b,c,d,e,a,44);
R3(a,b,c,d,e,45);
R3(e,a,b,c,d,46);
R3(d,e,a,b,c,47);
71 R3(c,d,e,a,b,48);
R3(b,c,d,e,a,49);
R3(a,b,c,d,e,50);
R3(e,a,b,c,d,51);
72 R3(d,e,a,b,c,52);
R3(c,d,e,a,b,53);
R3(b,c,d,e,a,54);
R3(a,b,c,d,e,55);
73 R3(e,a,b,c,d,56);
R3(d,e,a,b,c,57);
R3(c,d,e,a,b,58);
R3(b,c,d,e,a,59);
74 R4(a,b,c,d,e,60);
R4(e,a,b,c,d,61);
R4(d,e,a,b,c,62);
R4(c,d,e,a,b,63);
75 R4(b,c,d,e,a,64);
R4(a,b,c,d,e,65);
R4(e,a,b,c,d,66);
R4(d,e,a,b,c,67);
76 R4(c,d,e,a,b,68);
R4(b,c,d,e,a,69);
R4(a,b,c,d,e,70);
R4(e,a,b,c,d,71);
77 R4(d,e,a,b,c,72);
R4(c,d,e,a,b,73);
R4(b,c,d,e,a,74);
R4(a,b,c,d,e,75);
78 R4(e,a,b,c,d,76);
R4(d,e,a,b,c,77);
R4(c,d,e,a,b,78);
R4(b,c,d,e,a,79);
88 a = b = c = d = e = 0;
96 Context->state[0] = 0x67452301;
97 Context->state[1] = 0xEFCDAB89;
98 Context->state[2] = 0x98BADCFE;
99 Context->state[3] = 0x10325476;
100 Context->state[4] = 0xC3D2E1F0;
101 Context->count[0] = 0;
102 Context->count[1] = 0;
107 _In_reads_bytes_(Length) UCHAR *Input,
111 ULONG InputContentSize;
113 InputContentSize = Context->count[1] & 63;
114 Context->count[1] += Length;
115 if (Context->count[1] < Length)
117 Context->count[0] += (Length >> 29);
119 if (InputContentSize + Length < 64)
121 RtlCopyMemory(&Context->buffer[InputContentSize], Input,
126 while (InputContentSize + Length >= 64)
128 RtlCopyMemory(Context->buffer + InputContentSize, Input,
129 64 - InputContentSize);
130 Input += 64 - InputContentSize;
131 Length -= 64 - InputContentSize;
132 SHATransform(Context->state, Context->buffer);
133 InputContentSize = 0;
135 RtlCopyMemory(Context->buffer + InputContentSize, Input, Length);
141 _Out_writes_bytes_(20) UCHAR *Hash
147 ULONG BufferContentSize, LengthHi, LengthLo;
150 BufferContentSize = Context->count[1] & 63;
151 if (BufferContentSize >= 56)
152 Pad = 56 + 64 - BufferContentSize;
154 Pad = 56 - BufferContentSize;
156 LengthHi = (Context->count[0] << 3) | (Context->count[1] >> (32 - 3));
157 LengthLo = (Context->count[1] << 3);
159 RtlZeroMemory(Buffer + 1, Pad - 1);
161 Count = (ULONG*)(Buffer + Pad);
166 Result = (ULONG *)Hash;
168 for (Index = 0; Index < 5; Index++)
169 Result[Index] =
DWORD2BE(Context->state[Index]);