hedgewars/uSHA.pas
author nemo
Sun, 20 Jun 2010 22:35:10 -0400
changeset 3526 a1d2180fef42
parent 3407 dcc129c4352e
permissions -rw-r--r--
Replace SHA1 with adler32. For simple purposes of checking to see if players are playing the same map, this should be quite adequate and runs 15 times faster.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
     1
(*
1066
1f1b3686a2b0 Update copyright headers a bit
unc0rr
parents: 368
diff changeset
     2
 * Hedgewars, a free turn based strategy game
3236
4ab3917d7d44 Update (c) lines to 2010 as unc0rr requested - they all had varying values so I just took the first year mentioned, then tacked on -2010
nemo
parents: 2630
diff changeset
     3
 * Copyright (c) 2004-2010 Andrey Korotaev <unC0Rr@gmail.com>
316
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
 *)
2630
079ef82eac75 revamped file access and debug display
koda
parents: 2157
diff changeset
    18
 
079ef82eac75 revamped file access and debug display
koda
parents: 2157
diff changeset
    19
{$INCLUDE "options.inc"}
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    20
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    21
unit uSHA;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    22
interface
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    23
uses SDLh;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    24
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    25
type TSHA1Context = packed record
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    26
                    H: array[0..4] of LongWord;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    27
                    Length, CurrLength: Int64;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    28
                    Buf: array[0..63] of byte;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    29
                    end;
368
fe71e55d2d7b Make SHA really work
unc0rr
parents: 351
diff changeset
    30
     TSHA1Digest =  array[0..4] of LongWord;
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    31
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    32
procedure SHA1Init(var Context: TSHA1Context);
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    33
procedure SHA1Update(var Context: TSHA1Context; Buf: PByteArray; Length: LongWord);
2157
a2fa7f594842 Endian aware Land digest
unc0rr
parents: 1066
diff changeset
    34
procedure SHA1UpdateLongwords(var Context: TSHA1Context; Buf: PLongwordArray; Length: LongWord);
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    35
function  SHA1Final(Context: TSHA1Context): TSHA1Digest;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    36
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    37
implementation
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    38
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    39
function rol(x: LongWord; y: Byte): LongWord;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    40
begin
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    41
  rol:= (X shl y) or (X shr (32 - y))
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    42
end;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    43
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    44
function Ft(t, b, c, d: LongWord): LongWord;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    45
begin
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    46
case t of
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    47
      0..19: Ft := (b and c) or ((not b) and d);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    48
     20..39: Ft :=  b xor c xor d;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    49
     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
    50
     else    Ft :=  b xor c xor d;
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    51
  end;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    52
end;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    53
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    54
function Kt(t: Byte): LongWord;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    55
begin
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    56
  case t of
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    57
     0..19: Kt := $5A827999;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    58
    20..39: Kt := $6ED9EBA1;
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    59
    40..59: Kt := $8F1BBCDC;
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    60
  else
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    61
    Kt := $CA62C1D6
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    62
  end;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    63
end;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    64
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    65
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    66
procedure SHA1Hash(var Context: TSHA1Context);
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    67
var S: array[0..4 ] of LongWord;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    68
    W: array[0..79] of LongWord;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    69
    i, t: LongWord;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    70
begin
3407
dcc129c4352e Engine:
smxx
parents: 3369
diff changeset
    71
{$HINTS OFF}
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    72
move(Context.H, S, sizeof(S));
3407
dcc129c4352e Engine:
smxx
parents: 3369
diff changeset
    73
{$HINTS ON}
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    74
for i:= 0 to 15 do
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    75
    SDLNet_Write32(PLongWordArray(@Context.Buf)^[i], @W[i]);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    76
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    77
for i := 16 to 79 do
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    78
    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
    79
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    80
for i := 0 to 79 do
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    81
    begin
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    82
    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
    83
    S[4]:= S[3];
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    84
    S[3]:= S[2];
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    85
    S[2]:= rol(S[1], 30);
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    86
    S[1]:= S[0];
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    87
    S[0]:= t
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    88
    end;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
    89
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    90
for i := 0 to 4 do
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    91
    Context.H[i]:= Context.H[i] + S[i]
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    92
end;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    93
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    94
procedure SHA1Init(var Context: TSHA1Context);
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    95
begin
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    96
  with Context do
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    97
       begin
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    98
       Length    := 0;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
    99
       CurrLength:= 0;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   100
       H[0]:= $67452301;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   101
       H[1]:= $EFCDAB89;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   102
       H[2]:= $98BADCFE;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   103
       H[3]:= $10325476;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   104
       H[4]:= $C3D2E1F0
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   105
  end
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   106
end;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   107
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   108
procedure SHA1Update(var Context: TSHA1Context; Buf: PByteArray; Length: LongWord);
368
fe71e55d2d7b Make SHA really work
unc0rr
parents: 351
diff changeset
   109
var i: Longword;
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   110
begin
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   111
for i:= 0 to Pred(Length) do
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   112
    begin
368
fe71e55d2d7b Make SHA really work
unc0rr
parents: 351
diff changeset
   113
    Context.Buf[Context.CurrLength]:= Buf^[i];
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   114
    inc(Context.CurrLength);
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   115
    if Context.CurrLength = 64 then
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   116
       begin
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   117
       SHA1Hash(Context);
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   118
       inc(Context.Length, 512);
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   119
       Context.CurrLength:= 0
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   120
       end
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   121
    end
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   122
end;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   123
2157
a2fa7f594842 Endian aware Land digest
unc0rr
parents: 1066
diff changeset
   124
procedure SHA1UpdateLongwords(var Context: TSHA1Context; Buf: PLongwordArray; Length: LongWord);
a2fa7f594842 Endian aware Land digest
unc0rr
parents: 1066
diff changeset
   125
var i: Longword;
a2fa7f594842 Endian aware Land digest
unc0rr
parents: 1066
diff changeset
   126
begin
3369
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   127
    for i:= 0 to Pred(Length div 4) do
2157
a2fa7f594842 Endian aware Land digest
unc0rr
parents: 1066
diff changeset
   128
    begin
3369
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   129
        SDLNet_Write32(Buf^[i], @Context.Buf[Context.CurrLength]);
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   130
        inc(Context.CurrLength, 4);
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   131
        if Context.CurrLength = 64 then
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   132
        begin
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   133
            SHA1Hash(Context);
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   134
            inc(Context.Length, 512);
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   135
            Context.CurrLength:= 0
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   136
        end
2157
a2fa7f594842 Endian aware Land digest
unc0rr
parents: 1066
diff changeset
   137
    end
a2fa7f594842 Endian aware Land digest
unc0rr
parents: 1066
diff changeset
   138
end;
a2fa7f594842 Endian aware Land digest
unc0rr
parents: 1066
diff changeset
   139
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   140
function  SHA1Final(Context: TSHA1Context): TSHA1Digest;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   141
var i: LongWord;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   142
begin
3369
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   143
    Context.Length:= Context.Length + Context.CurrLength shl 3;
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   144
    Context.Buf[Context.CurrLength]:= $80;
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   145
    inc(Context.CurrLength);
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   146
3369
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   147
    if Context.CurrLength > 56 then
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   148
    begin
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   149
        FillChar(Context.Buf[Context.CurrLength], 64 - Context.CurrLength, 0);
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   150
        Context.CurrLength:= 64;
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   151
        SHA1Hash(Context);
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   152
        Context.CurrLength:=0
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   153
    end;
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   154
3369
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   155
    FillChar(Context.Buf[Context.CurrLength], 56 - Context.CurrLength, 0);
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   156
3369
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   157
    for i:= 56 to 63 do
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   158
        Context.Buf[i] := (Context.Length shr ((63 - i) * 8)) and $FF;
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   159
    SHA1Hash(Context);
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   160
    for i:= 0 to 4 do
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   161
        SHA1Final[i]:= Context.H[i];
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   162
    
c7289e42f0ee add other controls for map preview, also fix a bug in digest
koda
parents: 3236
diff changeset
   163
    FillChar(Context, sizeof(Context), 0)
316
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   164
end;
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   165
57d50189ad86 Calculate land digest
unc0rr
parents:
diff changeset
   166
end.