hedgewars/uSHA.pas
changeset 101 f568cc72ea8c
parent 100 f324a18698fe
equal deleted inserted replaced
100:f324a18698fe 101:f568cc72ea8c
    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