equal
deleted
inserted
replaced
49 procedure SHA1Init(var Context: TSHA1Context); |
49 procedure SHA1Init(var Context: TSHA1Context); |
50 procedure SHA1Update(var Context: TSHA1Context; Buf: Pointer; Length: LongWord); |
50 procedure SHA1Update(var Context: TSHA1Context; Buf: Pointer; Length: LongWord); |
51 function SHA1Final(Context: TSHA1Context): TSHA1Digest; |
51 function SHA1Final(Context: TSHA1Context): TSHA1Digest; |
52 |
52 |
53 implementation |
53 implementation |
54 |
54 uses SDLh; |
55 function _bswap(X: LongWord): LongWord; |
|
56 begin |
|
57 Result:= (X shr 24) or ((X shr 8) and $FF00) or ((X shl 8) and $FF0000) or (X shl 24) |
|
58 end; |
|
59 |
55 |
60 function rol(x: LongWord; y: Byte): LongWord; |
56 function rol(x: LongWord; y: Byte): LongWord; |
61 begin |
57 begin |
62 Result:= (X shl y) or (X shr (32 - y)) |
58 Result:= (X shl y) or (X shr (32 - y)) |
63 end; |
59 end; |
88 var S: array[0..4 ] of LongWord; |
84 var S: array[0..4 ] of LongWord; |
89 W: array[0..79] of LongWord; |
85 W: array[0..79] of LongWord; |
90 i, t: LongWord; |
86 i, t: LongWord; |
91 begin |
87 begin |
92 move(Context.H, S, sizeof(S)); |
88 move(Context.H, S, sizeof(S)); |
93 for i:= 0 to 15 do |
89 for i:= 0 to 3 do |
94 W[i]:= _bswap(PLongWord(LongWord(@Context.Buf)+i*4)^); |
90 begin |
|
91 t:= i * 4; |
|
92 with Context do |
|
93 W[i]:= Buf[t + 3] or (Buf[t + 2] shl 8) or (Buf[t + 1] shl 16) or (Buf[t] shl 24); |
|
94 end; |
95 for i := 16 to 79 do |
95 for i := 16 to 79 do |
96 W[i] := rol(W[i - 3] xor W[i - 8] xor W[i - 14] xor W[i - 16], 1); |
96 W[i] := rol(W[i - 3] xor W[i - 8] xor W[i - 14] xor W[i - 16], 1); |
97 for i := 0 to 79 do |
97 for i := 0 to 79 do |
98 begin |
98 begin |
99 t:= rol(S[0], 5) + Ft(i, S[1], S[2], S[3]) + S[4] + W[i] + Kt(i); |
99 t:= rol(S[0], 5) + Ft(i, S[1], S[2], S[3]) + S[4] + W[i] + Kt(i); |
122 end; |
122 end; |
123 |
123 |
124 procedure SHA1Update(var Context: TSHA1Context; Buf: Pointer; Length: LongWord); |
124 procedure SHA1Update(var Context: TSHA1Context; Buf: Pointer; Length: LongWord); |
125 var i: integer; |
125 var i: integer; |
126 begin |
126 begin |
127 for i:= 1 to Length do |
127 for i:= 0 to Pred(Length) do |
128 begin |
128 begin |
129 Context.Buf[Context.CurrLength]:= PByte(Buf)^; |
129 Context.Buf[Context.CurrLength]:= PByteArray(Buf)^[i]; |
130 inc(Context.CurrLength); |
130 inc(Context.CurrLength); |
131 inc(LongWord(Buf)); |
|
132 if Context.CurrLength=64 then |
131 if Context.CurrLength=64 then |
133 begin |
132 begin |
134 SHA1Hash(Context); |
133 SHA1Hash(Context); |
135 inc(Context.Length, 512); |
134 inc(Context.Length, 512); |
136 Context.CurrLength:=0 |
135 Context.CurrLength:=0 |