hedgewars/uSHA.pas
author unc0rr
Fri, 01 May 2009 09:01:44 +0000
changeset 2021 a591afb43768
parent 1066 1f1b3686a2b0
child 2157 a2fa7f594842
permissions -rw-r--r--
Some changes in try to fix issue when you enter room with painted map, but frontend shows generated one (most probably bug is triggered by template filters) Untested.
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
316
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.