ReactOS 0.4.15-dev-7788-g1ad9096
sha1.c File Reference
#include "sha1.h"
Include dependency graph for sha1.c:

Go to the source code of this file.

Macros

#define rol(value, bits)   (((value) << (bits)) | ((value) >> (32 - (bits))))
 
#define DWORD2BE(x)   (((x) >> 24) & 0xff) | (((x) >> 8) & 0xff00) | (((x) << 8) & 0xff0000) | (((x) << 24) & 0xff000000);
 
#define blk0(i)   (Block[i] = (rol(Block[i],24)&0xFF00FF00)|(rol(Block[i],8)&0x00FF00FF))
 
#define blk1(i)   (Block[i&15] = rol(Block[(i+13)&15]^Block[(i+8)&15]^Block[(i+2)&15]^Block[i&15],1))
 
#define f1(x, y, z)   (z^(x&(y^z)))
 
#define f2(x, y, z)   (x^y^z)
 
#define f3(x, y, z)   ((x&y)|(z&(x|y)))
 
#define f4(x, y, z)   (x^y^z)
 
#define R0(v, w, x, y, z, i)   z+=f1(w,x,y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);
 
#define R1(v, w, x, y, z, i)   z+=f1(w,x,y)+blk1(i)+0x5A827999+rol(v,5);w=rol(w,30);
 
#define R2(v, w, x, y, z, i)   z+=f2(w,x,y)+blk1(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);
 
#define R3(v, w, x, y, z, i)   z+=f3(w,x,y)+blk1(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);
 
#define R4(v, w, x, y, z, i)   z+=f4(w,x,y)+blk1(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);
 

Functions

static void SHA1Transform (ULONG State[5], UCHAR Buffer[64])
 
VOID NTAPI A_SHAInit (PSHA_CTX Context)
 
VOID NTAPI A_SHAUpdate (PSHA_CTX Context, const unsigned char *Buffer, ULONG BufferSize)
 
VOID NTAPI A_SHAFinal (PSHA_CTX Context, PULONG Result)
 

Macro Definition Documentation

◆ blk0

#define blk0 (   i)    (Block[i] = (rol(Block[i],24)&0xFF00FF00)|(rol(Block[i],8)&0x00FF00FF))

Definition at line 28 of file sha1.c.

◆ blk1

#define blk1 (   i)    (Block[i&15] = rol(Block[(i+13)&15]^Block[(i+8)&15]^Block[(i+2)&15]^Block[i&15],1))

Definition at line 29 of file sha1.c.

◆ DWORD2BE

#define DWORD2BE (   x)    (((x) >> 24) & 0xff) | (((x) >> 8) & 0xff00) | (((x) << 8) & 0xff0000) | (((x) << 24) & 0xff000000);

Definition at line 26 of file sha1.c.

◆ f1

#define f1 (   x,
  y,
  z 
)    (z^(x&(y^z)))

Definition at line 30 of file sha1.c.

◆ f2

#define f2 (   x,
  y,
  z 
)    (x^y^z)

Definition at line 31 of file sha1.c.

◆ f3

#define f3 (   x,
  y,
  z 
)    ((x&y)|(z&(x|y)))

Definition at line 32 of file sha1.c.

◆ f4

#define f4 (   x,
  y,
  z 
)    (x^y^z)

Definition at line 33 of file sha1.c.

◆ R0

#define R0 (   v,
  w,
  x,
  y,
  z,
  i 
)    z+=f1(w,x,y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30);

Definition at line 35 of file sha1.c.

◆ R1

#define R1 (   v,
  w,
  x,
  y,
  z,
  i 
)    z+=f1(w,x,y)+blk1(i)+0x5A827999+rol(v,5);w=rol(w,30);

Definition at line 36 of file sha1.c.

◆ R2

#define R2 (   v,
  w,
  x,
  y,
  z,
  i 
)    z+=f2(w,x,y)+blk1(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30);

Definition at line 37 of file sha1.c.

◆ R3

#define R3 (   v,
  w,
  x,
  y,
  z,
  i 
)    z+=f3(w,x,y)+blk1(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);

Definition at line 38 of file sha1.c.

◆ R4

#define R4 (   v,
  w,
  x,
  y,
  z,
  i 
)    z+=f4(w,x,y)+blk1(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);

Definition at line 39 of file sha1.c.

◆ rol

#define rol (   value,
  bits 
)    (((value) << (bits)) | ((value) >> (32 - (bits))))

Definition at line 24 of file sha1.c.

Function Documentation

◆ A_SHAFinal()

VOID NTAPI A_SHAFinal ( PSHA_CTX  Context,
PULONG  Result 
)

Definition at line 171 of file sha1.c.

172{
173 INT Pad, Index;
174 UCHAR Buffer[72];
175 ULONG *Count;
176 ULONG BufferContentSize, LengthHi, LengthLo;
177
178 BufferContentSize = Context->Count[1] & 63;
179 if (BufferContentSize >= 56)
180 Pad = 56 + 64 - BufferContentSize;
181 else
182 Pad = 56 - BufferContentSize;
183
184 LengthHi = (Context->Count[0] << 3) | (Context->Count[1] >> (32 - 3));
185 LengthLo = (Context->Count[1] << 3);
186
187 memset(Buffer + 1, 0, Pad - 1);
188 Buffer[0] = 0x80;
189 Count = (ULONG*)(Buffer + Pad);
190 Count[0] = DWORD2BE(LengthHi);
191 Count[1] = DWORD2BE(LengthLo);
193
194 for (Index = 0; Index < 5; Index++)
195 Result[Index] = DWORD2BE(Context->State[Index]);
196
198}
char * Pad(char *Str, char PadChar, ULONG Length)
Definition: cabman.cxx:29
Definition: bufpool.h:45
int Count
Definition: noreturn.cpp:7
VOID NTAPI A_SHAUpdate(PSHA_CTX Context, const unsigned char *Buffer, ULONG BufferSize)
Definition: sha1.c:128
#define DWORD2BE(x)
Definition: sha1.c:26
VOID NTAPI A_SHAInit(PSHA_CTX Context)
Definition: sha1.c:102
#define memset(x, y, z)
Definition: compat.h:39
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
_In_ WDFCOLLECTION _In_ ULONG Index
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409
unsigned char UCHAR
Definition: xmlstorage.h:181

Referenced by finalize_hash_impl(), sha_check(), and VerifyInteg().

◆ A_SHAInit()

VOID NTAPI A_SHAInit ( PSHA_CTX  Context)

Definition at line 102 of file sha1.c.

103{
104 /* SHA1 initialization constants */
105 Context->State[0] = 0x67452301;
106 Context->State[1] = 0xEFCDAB89;
107 Context->State[2] = 0x98BADCFE;
108 Context->State[3] = 0x10325476;
109 Context->State[4] = 0xC3D2E1F0;
110 Context->Count[0] =
111 Context->Count[1] = 0;
112}

Referenced by A_SHAFinal(), init_hash_impl(), sha_check(), and VerifyInteg().

◆ A_SHAUpdate()

VOID NTAPI A_SHAUpdate ( PSHA_CTX  Context,
const unsigned char Buffer,
ULONG  BufferSize 
)

Definition at line 128 of file sha1.c.

129{
130 ULONG BufferContentSize;
131
132 BufferContentSize = Context->Count[1] & 63;
133 Context->Count[1] += BufferSize;
134 if (Context->Count[1] < BufferSize)
135 Context->Count[0]++;
136 Context->Count[0] += (BufferSize >> 29);
137
138 if (BufferContentSize + BufferSize < 64)
139 {
140 memcpy(&Context->Buffer[BufferContentSize], Buffer,
141 BufferSize);
142 }
143 else
144 {
145 while (BufferContentSize + BufferSize >= 64)
146 {
147 memcpy(Context->Buffer + BufferContentSize, Buffer,
148 64 - BufferContentSize);
149 Buffer += 64 - BufferContentSize;
150 BufferSize -= 64 - BufferContentSize;
151 SHA1Transform(Context->State, Context->Buffer);
152 BufferContentSize = 0;
153 }
154 memcpy(Context->Buffer + BufferContentSize, Buffer, BufferSize);
155 }
156}
#define BufferSize
Definition: mmc.h:75
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static void SHA1Transform(ULONG State[5], UCHAR Buffer[64])
Definition: sha1.c:42
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
Definition: wdfmemory.h:254

Referenced by A_SHAFinal(), sha_check(), update_hash_impl(), and VerifyInteg().

◆ SHA1Transform()

static void SHA1Transform ( ULONG  State[5],
UCHAR  Buffer[64] 
)
static

Definition at line 42 of file sha1.c.

43{
44 ULONG a, b, c, d, e;
45 ULONG *Block;
46
47 Block = (ULONG*)Buffer;
48
49 /* Copy Context->State[] to working variables */
50 a = State[0];
51 b = State[1];
52 c = State[2];
53 d = State[3];
54 e = State[4];
55
56 /* 4 rounds of 20 operations each. Loop unrolled. */
57 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);
58 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);
59 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);
60 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);
61 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);
62 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);
63 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);
64 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);
65 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);
66 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);
67 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);
68 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);
69 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);
70 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);
71 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);
72 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);
73 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);
74 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);
75 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);
76 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);
77
78 /* Add the working variables back into Context->State[] */
79 State[0] += a;
80 State[1] += b;
81 State[2] += c;
82 State[3] += d;
83 State[4] += e;
84
85 /* Wipe variables */
86 a = b = c = d = e = 0;
87}
const GLubyte * c
Definition: glext.h:8905
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
#define d
Definition: ke_i.h:81
#define e
Definition: ke_i.h:82
#define a
Definition: ke_i.h:78
#define c
Definition: ke_i.h:80
#define b
Definition: ke_i.h:79
#define R1(v, w, x, y, z, i)
Definition: sha1.c:36
#define R2(v, w, x, y, z, i)
Definition: sha1.c:37
#define R0(v, w, x, y, z, i)
Definition: sha1.c:35
#define R3(v, w, x, y, z, i)
Definition: sha1.c:38
#define R4(v, w, x, y, z, i)
Definition: sha1.c:39

Referenced by A_SHAUpdate().