hedgewars/uSHA.pas
author unc0rr
Tue, 01 Jul 2008 15:52:10 +0000
changeset 1042 a0ca4b3d2782
parent 368 fe71e55d2d7b
child 1066 1f1b3686a2b0
permissions -rw-r--r--
Fix resource compilation
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
     1
(*
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
     2
 * Hedgewars, a worms-like game
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
     3
 * Copyright (c) 2004-2007 Andrey Korotaev <unC0Rr@gmail.com>
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
     4
 *
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License as published by
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
     7
 * the Free Software Foundation; version 2 of the License
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
     8
 *
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    12
 * GNU General Public License for more details.
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    13
 *
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    17
 *)
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    18
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    19
unit uSHA;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    20
interface
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    21
uses SDLh;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    22
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    23
type TSHA1Context = packed record
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    24
                    H: array[0..4] of LongWord;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    25
                    Length, CurrLength: Int64;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    26
                    Buf: array[0..63] of byte;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    27
                    end;
368
fe71e55d2d7b Make SHA really work
unc0rr
parents: 351
diff changeset
    28
     TSHA1Digest =  array[0..4] of LongWord;
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    29
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    30
procedure SHA1Init(var Context: TSHA1Context);
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    31
procedure SHA1Update(var Context: TSHA1Context; Buf: PByteArray; Length: LongWord);
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    32
function  SHA1Final(Context: TSHA1Context): TSHA1Digest;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    33
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    34
implementation
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    35
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    36
function rol(x: LongWord; y: Byte): LongWord;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    37
begin
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    38
  rol:= (X shl y) or (X shr (32 - y))
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    39
end;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    40
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    41
function Ft(t, b, c, d: LongWord): LongWord;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    42
begin
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    43
case t of
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    44
      0..19: Ft := (b and c) or ((not b) and d);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    45
     20..39: Ft :=  b xor c xor d;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    46
     40..59: Ft := (b and c) or (b and d) or (c and d);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    47
     else    Ft :=  b xor c xor d;
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    48
  end;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    49
end;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    50
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    51
function Kt(t: Byte): LongWord;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    52
begin
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    53
  case t of
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    54
     0..19: Kt := $5A827999;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    55
    20..39: Kt := $6ED9EBA1;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    56
    40..59: Kt := $8F1BBCDC;
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    57
  else
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    58
    Kt := $CA62C1D6
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    59
  end;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    60
end;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    61
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    62
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    63
procedure SHA1Hash(var Context: TSHA1Context);
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    64
var S: array[0..4 ] of LongWord;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    65
    W: array[0..79] of LongWord;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    66
    i, t: LongWord;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    67
begin
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    68
move(Context.H, S, sizeof(S));
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    69
for i:= 0 to 15 do
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    70
    SDLNet_Write32(PLongWordArray(@Context.Buf)^[i], @W[i]);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    71
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    72
for i := 16 to 79 do
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    73
    W[i] := rol(W[i - 3] xor W[i - 8] xor W[i - 14] xor W[i - 16], 1);
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    74
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    75
for i := 0 to 79 do
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    76
    begin
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    77
    t:= rol(S[0], 5) + Ft(i, S[1], S[2], S[3]) + S[4] + W[i] + Kt(i);
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    78
    S[4]:= S[3];
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    79
    S[3]:= S[2];
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    80
    S[2]:= rol(S[1], 30);
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    81
    S[1]:= S[0];
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    82
    S[0]:= t
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    83
    end;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    84
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    85
for i := 0 to 4 do
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    86
    Context.H[i]:= Context.H[i] + S[i]
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    87
end;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    88
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    89
procedure SHA1Init(var Context: TSHA1Context);
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    90
begin
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    91
  with Context do
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    92
       begin
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    93
       Length    := 0;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    94
       CurrLength:= 0;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    95
       H[0]:= $67452301;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    96
       H[1]:= $EFCDAB89;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    97
       H[2]:= $98BADCFE;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    98
       H[3]:= $10325476;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    99
       H[4]:= $C3D2E1F0
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   100
  end
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   101
end;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   102
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   103
procedure SHA1Update(var Context: TSHA1Context; Buf: PByteArray; Length: LongWord);
368
fe71e55d2d7b Make SHA really work
unc0rr
parents: 351
diff changeset
   104
var i: Longword;
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   105
begin
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   106
for i:= 0 to Pred(Length) do
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   107
    begin
368
fe71e55d2d7b Make SHA really work
unc0rr
parents: 351
diff changeset
   108
    Context.Buf[Context.CurrLength]:= Buf^[i];
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   109
    inc(Context.CurrLength);
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   110
    if Context.CurrLength = 64 then
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   111
       begin
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   112
       SHA1Hash(Context);
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   113
       inc(Context.Length, 512);
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   114
       Context.CurrLength:= 0
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   115
       end
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   116
    end
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   117
end;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   118
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   119
function  SHA1Final(Context: TSHA1Context): TSHA1Digest;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   120
var i: LongWord;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   121
begin
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   122
Context.Length:= Context.Length + Context.CurrLength shl 3;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   123
Context.Buf[Context.CurrLength]:= $80;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   124
inc(Context.CurrLength);
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   125
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   126
if Context.CurrLength > 56 then
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   127
   begin
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   128
   FillChar(Context.Buf[Context.CurrLength], 64 - Context.CurrLength, 0);
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   129
   Context.CurrLength:= 64;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   130
   SHA1Hash(Context);
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   131
   Context.CurrLength:=0
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   132
   end;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   133
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   134
FillChar(Context.Buf[Context.CurrLength], 56 - Context.CurrLength, 0);
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   135
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   136
for i:= 56 to 63 do
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   137
    Context.Buf[i] := (Context.Length shr ((63 - i) * 8)) and $FF;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   138
SHA1Hash(Context);
368
fe71e55d2d7b Make SHA really work
unc0rr
parents: 351
diff changeset
   139
for i:= 0 to 4 do SHA1Final[i]:= Context.H[i];
fe71e55d2d7b Make SHA really work
unc0rr
parents: 351
diff changeset
   140
FillChar(Context, sizeof(Context), 0)
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   141
end;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   142
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   143
end.