home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 December / Chip_2002-12_cd1.bin / ctenari / Hytha / MultiHSH.exe / SR.RAR / SR / DCPCrypt / Hashes / DCPtiger.pas < prev   
Pascal/Delphi Source File  |  2002-07-08  |  13KB  |  301 lines

  1. {******************************************************************************}
  2. {* DCPcrypt v2.0 written by David Barton (crypto@cityinthesky.co.uk) **********}
  3. {******************************************************************************}
  4. {* A binary compatible implementation of Tiger ********************************}
  5. {******************************************************************************}
  6. {* Copyright (c) 2002 David Barton                                            *}
  7. {* Permission is hereby granted, free of charge, to any person obtaining a    *}
  8. {* copy of this software and associated documentation files (the "Software"), *}
  9. {* to deal in the Software without restriction, including without limitation  *}
  10. {* the rights to use, copy, modify, merge, publish, distribute, sublicense,   *}
  11. {* and/or sell copies of the Software, and to permit persons to whom the      *}
  12. {* Software is furnished to do so, subject to the following conditions:       *}
  13. {*                                                                            *}
  14. {* The above copyright notice and this permission notice shall be included in *}
  15. {* all copies or substantial portions of the Software.                        *}
  16. {*                                                                            *}
  17. {* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *}
  18. {* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,   *}
  19. {* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL    *}
  20. {* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *}
  21. {* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING    *}
  22. {* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER        *}
  23. {* DEALINGS IN THE SOFTWARE.                                                  *}
  24. {******************************************************************************}
  25. unit DCPtiger;
  26.  
  27. interface
  28. uses
  29.   Classes, Sysutils, DCPcrypt2, DCPconst;
  30.  
  31. type
  32.   TDCP_tiger= class(TDCP_hash)
  33.   protected
  34.     Len: int64;
  35.     Index: DWord;
  36.     CurrentHash: array[0..2] of int64;
  37.     HashBuffer: array[0..63] of byte;
  38.     procedure Compress;
  39.   public
  40.     class function GetId: integer; override;
  41.     class function GetAlgorithm: string; override;
  42.     class function GetHashSize: integer; override;
  43.     class function SelfTest: boolean; override;
  44.     procedure Init; override;
  45.     procedure Burn; override;
  46.     procedure Update(const Buffer; Size: longword); override;
  47.     procedure Final(var Digest); override;
  48.   end;
  49.  
  50. {******************************************************************************}
  51. {******************************************************************************}
  52. implementation
  53. {$R-}{$Q-}
  54.  
  55. {$INCLUDE DCPtiger.inc}
  56.  
  57. procedure TDCP_tiger.Compress;
  58. var
  59.   a, b, c, aa, bb, cc: int64;
  60.   x: array[0..7] of int64;
  61. begin
  62.   a:= CurrentHash[0]; aa:= a;
  63.   b:= CurrentHash[1]; bb:= b;
  64.   c:= CurrentHash[2]; cc:= c;
  65.  
  66.   Move(HashBuffer,x,Sizeof(x));
  67.  
  68.   c:= c xor x[0];
  69.   a:= a - (t1[c and $FF] xor t2[(c shr 16) and $FF] xor t3[(c shr 32) and $FF] xor t4[(c shr 48) and $FF]);
  70.   b:= b + (t4[(c shr 8) and $FF] xor t3[(c shr 24) and $FF] xor t2[(c shr 40) and $FF] xor t1[(c shr 56) and $FF]);
  71.   b:= b * 5;
  72.   a:= a xor x[1];
  73.   b:= b - (t1[a and $FF] xor t2[(a shr 16) and $FF] xor t3[(a shr 32) and $FF] xor t4[(a shr 48) and $FF]);
  74.   c:= c + (t4[(a shr 8) and $FF] xor t3[(a shr 24) and $FF] xor t2[(a shr 40) and $FF] xor t1[(a shr 56) and $FF]);
  75.   c:= c * 5;
  76.   b:= b xor x[2];
  77.   c:= c - (t1[b and $FF] xor t2[(b shr 16) and $FF] xor t3[(b shr 32) and $FF] xor t4[(b shr 48) and $FF]);
  78.   a:= a + (t4[(b shr 8) and $FF] xor t3[(b shr 24) and $FF] xor t2[(b shr 40) and $FF] xor t1[(b shr 56) and $FF]);
  79.   a:= a * 5;
  80.   c:= c xor x[3];
  81.   a:= a - (t1[c and $FF] xor t2[(c shr 16) and $FF] xor t3[(c shr 32) and $FF] xor t4[(c shr 48) and $FF]);
  82.   b:= b + (t4[(c shr 8) and $FF] xor t3[(c shr 24) and $FF] xor t2[(c shr 40) and $FF] xor t1[(c shr 56) and $FF]);
  83.   b:= b * 5;
  84.   a:= a xor x[4];
  85.   b:= b - (t1[a and $FF] xor t2[(a shr 16) and $FF] xor t3[(a shr 32) and $FF] xor t4[(a shr 48) and $FF]);
  86.   c:= c + (t4[(a shr 8) and $FF] xor t3[(a shr 24) and $FF] xor t2[(a shr 40) and $FF] xor t1[(a shr 56) and $FF]);
  87.   c:= c * 5;
  88.   b:= b xor x[5];
  89.   c:= c - (t1[b and $FF] xor t2[(b shr 16) and $FF] xor t3[(b shr 32) and $FF] xor t4[(b shr 48) and $FF]);
  90.   a:= a + (t4[(b shr 8) and $FF] xor t3[(b shr 24) and $FF] xor t2[(b shr 40) and $FF] xor t1[(b shr 56) and $FF]);
  91.   a:= a * 5;
  92.   c:= c xor x[6];
  93.   a:= a - (t1[c and $FF] xor t2[(c shr 16) and $FF] xor t3[(c shr 32) and $FF] xor t4[(c shr 48) and $FF]);
  94.   b:= b + (t4[(c shr 8) and $FF] xor t3[(c shr 24) and $FF] xor t2[(c shr 40) and $FF] xor t1[(c shr 56) and $FF]);
  95.   b:= b * 5;
  96.   a:= a xor x[7];
  97.   b:= b - (t1[a and $FF] xor t2[(a shr 16) and $FF] xor t3[(a shr 32) and $FF] xor t4[(a shr 48) and $FF]);
  98.   c:= c + (t4[(a shr 8) and $FF] xor t3[(a shr 24) and $FF] xor t2[(a shr 40) and $FF] xor t1[(a shr 56) and $FF]);
  99.   c:= c * 5;
  100.   x[0]:= x[0] - (x[7] xor $A5A5A5A5A5A5A5A5);
  101.   x[1]:= x[1] xor x[0];
  102.   x[2]:= x[2] + x[1];
  103.   x[3]:= x[3] - (x[2] xor ((not x[1]) shl 19));
  104.   x[4]:= x[4] xor x[3];
  105.   x[5]:= x[5] + x[4];
  106.   x[6]:= x[6] - (x[5] xor ((not x[4]) shr 23));
  107.   x[7]:= x[7] xor x[6];
  108.   x[0]:= x[0] + x[7];
  109.   x[1]:= x[1] - (x[0] xor ((not x[7]) shl 19));
  110.   x[2]:= x[2] xor x[1];
  111.   x[3]:= x[3] + x[2];
  112.   x[4]:= x[4] - (x[3] xor ((not x[2]) shr 23));
  113.   x[5]:= x[5] xor x[4];
  114.   x[6]:= x[6] + x[5];
  115.   x[7]:= x[7] - (x[6] xor $0123456789ABCDEF);
  116.   b:= b xor x[0];
  117.   c:= c - (t1[b and $FF] xor t2[(b shr 16) and $FF] xor t3[(b shr 32) and $FF] xor t4[(b shr 48) and $FF]);
  118.   a:= a + (t4[(b shr 8) and $FF] xor t3[(b shr 24) and $FF] xor t2[(b shr 40) and $FF] xor t1[(b shr 56) and $FF]);
  119.   a:= a * 7;
  120.   c:= c xor x[1];
  121.   a:= a - (t1[c and $FF] xor t2[(c shr 16) and $FF] xor t3[(c shr 32) and $FF] xor t4[(c shr 48) and $FF]);
  122.   b:= b + (t4[(c shr 8) and $FF] xor t3[(c shr 24) and $FF] xor t2[(c shr 40) and $FF] xor t1[(c shr 56) and $FF]);
  123.   b:= b * 7;
  124.   a:= a xor x[2];
  125.   b:= b - (t1[a and $FF] xor t2[(a shr 16) and $FF] xor t3[(a shr 32) and $FF] xor t4[(a shr 48) and $FF]);
  126.   c:= c + (t4[(a shr 8) and $FF] xor t3[(a shr 24) and $FF] xor t2[(a shr 40) and $FF] xor t1[(a shr 56) and $FF]);
  127.   c:= c * 7;
  128.   b:= b xor x[3];
  129.   c:= c - (t1[b and $FF] xor t2[(b shr 16) and $FF] xor t3[(b shr 32) and $FF] xor t4[(b shr 48) and $FF]);
  130.   a:= a + (t4[(b shr 8) and $FF] xor t3[(b shr 24) and $FF] xor t2[(b shr 40) and $FF] xor t1[(b shr 56) and $FF]);
  131.   a:= a * 7;
  132.   c:= c xor x[4];
  133.   a:= a - (t1[c and $FF] xor t2[(c shr 16) and $FF] xor t3[(c shr 32) and $FF] xor t4[(c shr 48) and $FF]);
  134.   b:= b + (t4[(c shr 8) and $FF] xor t3[(c shr 24) and $FF] xor t2[(c shr 40) and $FF] xor t1[(c shr 56) and $FF]);
  135.   b:= b * 7;
  136.   a:= a xor x[5];
  137.   b:= b - (t1[a and $FF] xor t2[(a shr 16) and $FF] xor t3[(a shr 32) and $FF] xor t4[(a shr 48) and $FF]);
  138.   c:= c + (t4[(a shr 8) and $FF] xor t3[(a shr 24) and $FF] xor t2[(a shr 40) and $FF] xor t1[(a shr 56) and $FF]);
  139.   c:= c * 7;
  140.   b:= b xor x[6];
  141.   c:= c - (t1[b and $FF] xor t2[(b shr 16) and $FF] xor t3[(b shr 32) and $FF] xor t4[(b shr 48) and $FF]);
  142.   a:= a + (t4[(b shr 8) and $FF] xor t3[(b shr 24) and $FF] xor t2[(b shr 40) and $FF] xor t1[(b shr 56) and $FF]);
  143.   a:= a * 7;
  144.   c:= c xor x[7];
  145.   a:= a - (t1[c and $FF] xor t2[(c shr 16) and $FF] xor t3[(c shr 32) and $FF] xor t4[(c shr 48) and $FF]);
  146.   b:= b + (t4[(c shr 8) and $FF] xor t3[(c shr 24) and $FF] xor t2[(c shr 40) and $FF] xor t1[(c shr 56) and $FF]);
  147.   b:= b * 7;
  148.   x[0]:= x[0] - (x[7] xor $A5A5A5A5A5A5A5A5);
  149.   x[1]:= x[1] xor x[0];
  150.   x[2]:= x[2] + x[1];
  151.   x[3]:= x[3] - (x[2] xor ((not x[1]) shl 19));
  152.   x[4]:= x[4] xor x[3];
  153.   x[5]:= x[5] + x[4];
  154.   x[6]:= x[6] - (x[5] xor ((not x[4]) shr 23));
  155.   x[7]:= x[7] xor x[6];
  156.   x[0]:= x[0] + x[7];
  157.   x[1]:= x[1] - (x[0] xor ((not x[7]) shl 19));
  158.   x[2]:= x[2] xor x[1];
  159.   x[3]:= x[3] + x[2];
  160.   x[4]:= x[4] - (x[3] xor ((not x[2]) shr 23));
  161.   x[5]:= x[5] xor x[4];
  162.   x[6]:= x[6] + x[5];
  163.   x[7]:= x[7] - (x[6] xor $0123456789ABCDEF);
  164.   a:= a xor x[0];
  165.   b:= b - (t1[a and $FF] xor t2[(a shr 16) and $FF] xor t3[(a shr 32) and $FF] xor t4[(a shr 48) and $FF]);
  166.   c:= c + (t4[(a shr 8) and $FF] xor t3[(a shr 24) and $FF] xor t2[(a shr 40) and $FF] xor t1[(a shr 56) and $FF]);
  167.   c:= c * 9;
  168.   b:= b xor x[1];
  169.   c:= c - (t1[b and $FF] xor t2[(b shr 16) and $FF] xor t3[(b shr 32) and $FF] xor t4[(b shr 48) and $FF]);
  170.   a:= a + (t4[(b shr 8) and $FF] xor t3[(b shr 24) and $FF] xor t2[(b shr 40) and $FF] xor t1[(b shr 56) and $FF]);
  171.   a:= a * 9;
  172.   c:= c xor x[2];
  173.   a:= a - (t1[c and $FF] xor t2[(c shr 16) and $FF] xor t3[(c shr 32) and $FF] xor t4[(c shr 48) and $FF]);
  174.   b:= b + (t4[(c shr 8) and $FF] xor t3[(c shr 24) and $FF] xor t2[(c shr 40) and $FF] xor t1[(c shr 56) and $FF]);
  175.   b:= b * 9;
  176.   a:= a xor x[3];
  177.   b:= b - (t1[a and $FF] xor t2[(a shr 16) and $FF] xor t3[(a shr 32) and $FF] xor t4[(a shr 48) and $FF]);
  178.   c:= c + (t4[(a shr 8) and $FF] xor t3[(a shr 24) and $FF] xor t2[(a shr 40) and $FF] xor t1[(a shr 56) and $FF]);
  179.   c:= c * 9;
  180.   b:= b xor x[4];
  181.   c:= c - (t1[b and $FF] xor t2[(b shr 16) and $FF] xor t3[(b shr 32) and $FF] xor t4[(b shr 48) and $FF]);
  182.   a:= a + (t4[(b shr 8) and $FF] xor t3[(b shr 24) and $FF] xor t2[(b shr 40) and $FF] xor t1[(b shr 56) and $FF]);
  183.   a:= a * 9;
  184.   c:= c xor x[5];
  185.   a:= a - (t1[c and $FF] xor t2[(c shr 16) and $FF] xor t3[(c shr 32) and $FF] xor t4[(c shr 48) and $FF]);
  186.   b:= b + (t4[(c shr 8) and $FF] xor t3[(c shr 24) and $FF] xor t2[(c shr 40) and $FF] xor t1[(c shr 56) and $FF]);
  187.   b:= b * 9;
  188.   a:= a xor x[6];
  189.   b:= b - (t1[a and $FF] xor t2[(a shr 16) and $FF] xor t3[(a shr 32) and $FF] xor t4[(a shr 48) and $FF]);
  190.   c:= c + (t4[(a shr 8) and $FF] xor t3[(a shr 24) and $FF] xor t2[(a shr 40) and $FF] xor t1[(a shr 56) and $FF]);
  191.   c:= c * 9;
  192.   b:= b xor x[7];
  193.   c:= c - (t1[b and $FF] xor t2[(b shr 16) and $FF] xor t3[(b shr 32) and $FF] xor t4[(b shr 48) and $FF]);
  194.   a:= a + (t4[(b shr 8) and $FF] xor t3[(b shr 24) and $FF] xor t2[(b shr 40) and $FF] xor t1[(b shr 56) and $FF]);
  195.   a:= a * 9;
  196.  
  197.   CurrentHash[0]:= a xor aa;
  198.   CurrentHash[1]:= b - bb;
  199.   CurrentHash[2]:= c + cc;
  200.   Index:= 0;
  201.   FillChar(HashBuffer,Sizeof(HashBuffer),0);
  202. end;
  203.  
  204. class function TDCP_tiger.GetHashSize: integer;
  205. begin
  206.   Result:= 192;
  207. end;
  208.  
  209. class function TDCP_tiger.GetId: integer;
  210. begin
  211.   Result:= DCP_tiger;
  212. end;
  213.  
  214. class function TDCP_tiger.GetAlgorithm: string;
  215. begin
  216.   Result:= 'Tiger';
  217. end;
  218.  
  219. class function TDCP_tiger.SelfTest: boolean;
  220. const
  221.   Test1Out: array[0..2] of int64=
  222.     ($87FB2A9083851CF7,$470D2CF810E6DF9E,$B586445034A5A386);
  223.   Test2Out: array[0..2] of int64=
  224.     ($0C410A042968868A,$1671DA5A3FD29A72,$5EC1E457D3CDB303);
  225. var
  226.   TestHash: TDCP_tiger;
  227.   TestOut: array[0..2] of int64;
  228. begin
  229.   TestHash:= TDCP_tiger.Create(nil);
  230.   TestHash.Init;
  231.   TestHash.UpdateStr('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-');
  232.   TestHash.Final(TestOut);
  233.   Result:= CompareMem(@TestOut,@Test1Out,Sizeof(Test1Out));
  234.   TestHash.Init;
  235.   TestHash.UpdateStr('Tiger - A Fast New Hash Function, by Ross Anderson and Eli Biham');
  236.   TestHash.Final(TestOut);
  237.   Result:= CompareMem(@TestOut,@Test2Out,Sizeof(Test2Out)) and Result;
  238.   TestHash.Free;
  239. end;
  240.  
  241. procedure TDCP_tiger.Init;
  242. begin
  243.   Burn;
  244.   fInitialized:= true;
  245.   CurrentHash[0]:= $0123456789ABCDEF;
  246.   CurrentHash[1]:= $FEDCBA9876543210;
  247.   CurrentHash[2]:= $F096A5B4C3B2E187;
  248. end;
  249.  
  250. procedure TDCP_tiger.Burn;
  251. begin
  252.   Len:= 0;
  253.   Index:= 0;
  254.   FillChar(HashBuffer,Sizeof(HashBuffer),0);
  255.   FillChar(CurrentHash,Sizeof(CurrentHash),0);
  256.   fInitialized:= false;
  257. end;
  258.  
  259. procedure TDCP_tiger.Update(const Buffer; Size: longword);
  260. var
  261.   PBuf: ^byte;
  262. begin
  263.   if not fInitialized then
  264.     raise EDCP_hash.Create('Hash not initialized');
  265.  
  266.   Inc(Len,Size*8);
  267.  
  268.   PBuf:= @Buffer;
  269.   while Size> 0 do
  270.   begin
  271.     if (Sizeof(HashBuffer)-Index)<= DWord(Size) then
  272.     begin
  273.       Move(PBuf^,HashBuffer[Index],Sizeof(HashBuffer)-Index);
  274.       Dec(Size,Sizeof(HashBuffer)-Index);
  275.       Inc(PBuf,Sizeof(HashBuffer)-Index);
  276.       Compress;
  277.     end
  278.     else
  279.     begin
  280.       Move(PBuf^,HashBuffer[Index],Size);
  281.       Inc(Index,Size);
  282.       Size:= 0;
  283.     end;
  284.   end;
  285. end;
  286.  
  287. procedure TDCP_tiger.Final(var Digest);
  288. begin
  289.   if not fInitialized then
  290.     raise EDCP_hash.Create('Hash not initialized');
  291.   HashBuffer[Index]:= $01;
  292.   if Index>= 56 then
  293.     Compress;
  294.   Pint64(@HashBuffer[56])^:= Len;
  295.   Compress;
  296.   Move(CurrentHash,Digest,Sizeof(CurrentHash));
  297.   Burn;
  298. end;
  299.  
  300. end.
  301.