home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 December / Chip_2002-12_cd1.bin / ctenari / Hytha / MultiHSH.exe / SR.RAR / SR / DCPCrypt / Ciphers / DCPtea.pas < prev    next >
Pascal/Delphi Source File  |  2002-07-08  |  5KB  |  149 lines

  1. {******************************************************************************}
  2. {* DCPcrypt v2.0 written by David Barton (crypto@cityinthesky.co.uk) **********}
  3. {******************************************************************************}
  4. {* A binary compatible implementation of Tea **********************************}
  5. {******************************************************************************}
  6. {* Copyright (c) 1999-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 DCPtea;
  26.  
  27. interface
  28. uses
  29.   Classes, Sysutils, DCPcrypt2, DCPconst, DCPblockciphers;
  30.  
  31. type
  32.   TDCP_tea= class(TDCP_blockcipher64)
  33.   protected
  34.     KeyData: array[0..3] of dword;
  35.     procedure InitKey(const Key; Size: longword); override;
  36.   public
  37.     class function GetID: integer; override;
  38.     class function GetAlgorithm: string; override;
  39.     class function GetMaxKeySize: integer; override;
  40.     class function SelfTest: boolean; override;
  41.     procedure Burn; override;
  42.     procedure EncryptECB(const InData; var OutData); override;
  43.     procedure DecryptECB(const InData; var OutData); override;
  44.   end;
  45.  
  46.  
  47. {******************************************************************************}
  48. {******************************************************************************}
  49. implementation
  50. {$R-}{$Q-}
  51.  
  52. const
  53.   Delta= $9e3779b9;
  54.   Rounds= 32;
  55.  
  56. function SwapDword(a: dword): dword;
  57. begin
  58.   Result:= ((a and $FF) shl 24) or ((a and $FF00) shl 8) or ((a and $FF0000) shr 8) or ((a and $FF000000) shr 24);
  59. end;
  60.  
  61. class function TDCP_tea.GetID: integer;
  62. begin
  63.   Result:= DCP_tea;
  64. end;
  65.  
  66. class function TDCP_tea.GetAlgorithm: string;
  67. begin
  68.   Result:= 'Tea';
  69. end;
  70.  
  71. class function TDCP_tea.GetMaxKeySize: integer;
  72. begin
  73.   Result:= 128;
  74. end;
  75.  
  76. class function TDCP_tea.SelfTest: boolean;
  77. const
  78.   Key: array[0..3] of dword= ($12345678,$9ABCDEF0,$0FEDCBA9,$87654321);
  79.   PT: array[0..1] of dword= ($12345678,$9ABCDEF0);
  80. var
  81.   Data: array[0..1] of dword;
  82.   Cipher: TDCP_tea;
  83. begin
  84.   Cipher:= TDCP_tea.Create(nil);
  85.   Cipher.Init(Key,Sizeof(Key)*8,nil);
  86.   Cipher.EncryptECB(PT,Data);
  87.   Result:= not CompareMem(@Data,@PT,Sizeof(PT));
  88.   Cipher.DecryptECB(Data,Data);
  89.   Result:= Result and CompareMem(@Data,@PT,Sizeof(PT));
  90.   Cipher.Burn;
  91.   Cipher.Free;
  92. end;
  93.  
  94. procedure TDCP_tea.InitKey(const Key; Size: longword);
  95. begin
  96.   FillChar(KeyData,Sizeof(KeyData),0);
  97.   Move(Key,KeyData,Size div 8);
  98.   KeyData[0]:= SwapDWord(KeyData[0]); KeyData[1]:= SwapDWord(KeyData[1]);
  99.   KeyData[2]:= SwapDWord(KeyData[2]); KeyData[3]:= SwapDWord(KeyData[3]);
  100. end;
  101.  
  102. procedure TDCP_tea.Burn;
  103. begin
  104.   FillChar(KeyData,Sizeof(KeyData),0);
  105.   inherited Burn;
  106. end;
  107.  
  108. procedure TDCP_tea.EncryptECB(const InData; var OutData);
  109. var
  110.   a, b, c, d, x, y, n, sum: dword;
  111. begin
  112.   if not fInitialized then
  113.     raise EDCP_blockcipher.Create('Cipher not initialized');
  114.  
  115.   x:= SwapDWord(pdword(@InData)^);
  116.   y:= SwapDWord(pdword(longword(@InData)+4)^);
  117.   sum:= 0; a:= KeyData[0]; b:= KeyData[1]; c:= KeyData[2]; d:= KeyData[3];
  118.   for n:= 1 to Rounds do
  119.   begin
  120.     Inc(sum,Delta);
  121.     Inc(x,(y shl 4) + (a xor y) + (sum xor (y shr 5)) + b);
  122.     Inc(y,(x shl 4) + (c xor x) + (sum xor (x shr 5)) + d);
  123.   end;
  124.   pdword(@OutData)^:= SwapDWord(x);
  125.   pdword(longword(@OutData)+4)^:= SwapDWord(y);
  126. end;
  127.  
  128. procedure TDCP_tea.DecryptECB(const InData; var OutData);
  129. var
  130.   a, b, c, d, x, y, n, sum: dword;
  131. begin
  132.   if not fInitialized then
  133.     raise EDCP_blockcipher.Create('Cipher not initialized');
  134.  
  135.   x:= SwapDWord(pdword(@InData)^);
  136.   y:= SwapDWord(pdword(longword(@InData)+4)^);
  137.   sum:= Delta shl 5; a:= KeyData[0]; b:= KeyData[1]; c:= KeyData[2]; d:= KeyData[3];
  138.   for n:= 1 to Rounds do
  139.   begin
  140.     Dec(y,(x shl 4) + (c xor x) + (sum xor (x shr 5)) + d);
  141.     Dec(x,(y shl 4) + (a xor y) + (sum xor (y shr 5)) + b);
  142.     Dec(sum,Delta);
  143.   end;
  144.   pdword(@OutData)^:= SwapDWord(x);
  145.   pdword(longword(@OutData)+4)^:= SwapDWord(y);
  146. end;
  147.  
  148. end.
  149.