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

  1. {******************************************************************************}
  2. {* DCPcrypt v2.0 written by David Barton (crypto@cityinthesky.co.uk) **********}
  3. {******************************************************************************}
  4. {* A binary compatible implementation of Gost *********************************}
  5. {******************************************************************************}
  6. {******************************************************************************}
  7. {* !!WARNING!!  !!WARNING!!  !!WARNING!!!!WARNING!!  !!WARNING!!  !!WARNING!! *}
  8. {*                                                                            *}
  9. {*     I am not sure if this is compatible with the actual GOST standard      *}
  10. {*         as a result, use this implementation with extreme caution.         *}
  11. {*                                                                            *}
  12. {* !!WARNING!!  !!WARNING!!  !!WARNING!!!!WARNING!!  !!WARNING!!  !!WARNING!! *}
  13. {******************************************************************************}
  14. {******************************************************************************}
  15. {* Copyright (c) 1999-2002 David Barton                                       *}
  16. {* Permission is hereby granted, free of charge, to any person obtaining a    *}
  17. {* copy of this software and associated documentation files (the "Software"), *}
  18. {* to deal in the Software without restriction, including without limitation  *}
  19. {* the rights to use, copy, modify, merge, publish, distribute, sublicense,   *}
  20. {* and/or sell copies of the Software, and to permit persons to whom the      *}
  21. {* Software is furnished to do so, subject to the following conditions:       *}
  22. {*                                                                            *}
  23. {* The above copyright notice and this permission notice shall be included in *}
  24. {* all copies or substantial portions of the Software.                        *}
  25. {*                                                                            *}
  26. {* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *}
  27. {* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,   *}
  28. {* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL    *}
  29. {* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *}
  30. {* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING    *}
  31. {* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER        *}
  32. {* DEALINGS IN THE SOFTWARE.                                                  *}
  33. {******************************************************************************}
  34. unit DCPgost;
  35.  
  36. interface
  37. uses
  38.   Classes, Sysutils, DCPcrypt2, DCPconst, DCPblockciphers;
  39.  
  40. type
  41.   TDCP_gost= class(TDCP_blockcipher64)
  42.   protected
  43.     KeyData: array[0..7] of DWord;
  44.     procedure InitKey(const Key; Size: longword); override;
  45.   public
  46.     class function GetID: integer; override;
  47.     class function GetAlgorithm: string; override;
  48.     class function GetMaxKeySize: integer; override;
  49.     class function SelfTest: boolean; override;
  50.     procedure Burn; override;
  51.     procedure EncryptECB(const InData; var OutData); override;
  52.     procedure DecryptECB(const InData; var OutData); override;
  53.   end;
  54.  
  55.  
  56. {******************************************************************************}
  57. {******************************************************************************}
  58. implementation
  59. {$R-}{$Q-}
  60. {$I DCPgost.inc}
  61.  
  62. class function TDCP_gost.GetMaxKeySize: integer;
  63. begin
  64.   Result:= 256;
  65. end;
  66.  
  67. class function TDCP_gost.GetID: integer;
  68. begin
  69.   Result:= DCP_gost;
  70. end;
  71.  
  72. class function TDCP_gost.GetAlgorithm: string;
  73. begin
  74.   Result:= 'Gost';
  75. end;
  76.  
  77. class function TDCP_gost.SelfTest: boolean;
  78. const
  79.   Key1: array[0..31] of byte=
  80.     ($BE,$5E,$C2,$00,$6C,$FF,$9D,$CF,$52,$35,$49,$59,$F1,$FF,$0C,$BF,
  81.      $E9,$50,$61,$B5,$A6,$48,$C1,$03,$87,$06,$9C,$25,$99,$7C,$06,$72);
  82.   InData1: array[0..7] of byte=
  83.     ($0D,$F8,$28,$02,$B7,$41,$A2,$92);
  84.   OutData1: array[0..7] of byte=
  85.     ($07,$F9,$02,$7D,$F7,$F7,$DF,$89);
  86.   Key2: array[0..31] of byte=
  87.     ($B3,$85,$27,$2A,$C8,$D7,$2A,$5A,$8B,$34,$4B,$C8,$03,$63,$AC,$4D,
  88.      $09,$BF,$58,$F4,$1F,$54,$06,$24,$CB,$CB,$8F,$DC,$F5,$53,$07,$D7);
  89.   InData2: array[0..7] of byte=
  90.     ($13,$54,$EE,$9C,$0A,$11,$CD,$4C);
  91.   OutData2: array[0..7] of byte=
  92.     ($4F,$B5,$05,$36,$F9,$60,$A7,$B1);
  93. var
  94.   Block: array[0..7] of byte;
  95.   Cipher: TDCP_gost;
  96. begin
  97.   Cipher:= TDCP_gost.Create(nil);
  98.   Cipher.Init(Key1,Sizeof(Key1)*8,nil);
  99.   Cipher.EncryptECB(InData1,Block);
  100.   Result:= boolean(CompareMem(@Block,@OutData1,8));
  101.   Cipher.DecryptECB(Block,Block);
  102.   Cipher.Burn;
  103.   Result:= Result and boolean(CompareMem(@Block,@InData1,8));
  104.   Cipher.Init(Key2,Sizeof(Key2)*8,nil);
  105.   Cipher.EncryptECB(InData2,Block);
  106.   Result:= Result and boolean(CompareMem(@Block,@OutData2,8));
  107.   Cipher.DecryptECB(Block,Block);
  108.   Cipher.Burn;
  109.   Result:= Result and boolean(CompareMem(@Block,@InData2,8));
  110.   Cipher.Free;
  111. end;
  112.  
  113. procedure TDCP_gost.InitKey(const Key; Size: longword);
  114. var
  115.   i: longword;
  116.   userkey: array[0..31] of byte;
  117. begin
  118.   Size:= Size div 8;
  119.  
  120.   FillChar(userkey,Sizeof(userkey),0);
  121.   Move(Key,userkey,Size);
  122.   for i:= 0 to 7 do
  123.     KeyData[i]:= (dword(UserKey[4*i+3]) shl 24) or (dword(UserKey[4*i+2]) shl 16) or
  124.       (dword(UserKey[4*i+1]) shl 8) or (dword(UserKey[4*i+0]));
  125. end;
  126.  
  127. procedure TDCP_gost.Burn;
  128. begin
  129.   FillChar(KeyData,Sizeof(KeyData),0);
  130.   inherited Burn;
  131. end;
  132.  
  133. procedure TDCP_gost.EncryptECB(const InData; var OutData);
  134. var
  135.   n1, n2: DWord;
  136.   i: longword;
  137. begin
  138.   if not fInitialized then
  139.     raise EDCP_blockcipher.Create('Cipher not initialized');
  140.   n1:= PDword(@InData)^;
  141.   n2:= PDword(dword(@InData)+4)^;
  142.   for i:= 0 to 2 do
  143.   begin
  144.     n2:= n2 xor (sTable[3,(n1+KeyData[0]) shr 24] xor sTable[2,((n1+KeyData[0]) shr 16) and $FF]
  145.       xor sTable[1,((n1+KeyData[0]) shr 8) and $FF] xor sTable[0,(n1+KeyData[0]) and $FF]);
  146.     n1:= n1 xor (sTable[3,(n2+KeyData[1]) shr 24] xor sTable[2,((n2+KeyData[1]) shr 16) and $FF]
  147.       xor sTable[1,((n2+KeyData[1]) shr 8) and $FF] xor sTable[0,(n2+KeyData[1]) and $FF]);
  148.     n2:= n2 xor (sTable[3,(n1+KeyData[2]) shr 24] xor sTable[2,((n1+KeyData[2]) shr 16) and $FF]
  149.       xor sTable[1,((n1+KeyData[2]) shr 8) and $FF] xor sTable[0,(n1+KeyData[2]) and $FF]);
  150.     n1:= n1 xor (sTable[3,(n2+KeyData[3]) shr 24] xor sTable[2,((n2+KeyData[3]) shr 16) and $FF]
  151.       xor sTable[1,((n2+KeyData[3]) shr 8) and $FF] xor sTable[0,(n2+KeyData[3]) and $FF]);
  152.     n2:= n2 xor (sTable[3,(n1+KeyData[4]) shr 24] xor sTable[2,((n1+KeyData[4]) shr 16) and $FF]
  153.       xor sTable[1,((n1+KeyData[4]) shr 8) and $FF] xor sTable[0,(n1+KeyData[4]) and $FF]);
  154.     n1:= n1 xor (sTable[3,(n2+KeyData[5]) shr 24] xor sTable[2,((n2+KeyData[5]) shr 16) and $FF]
  155.       xor sTable[1,((n2+KeyData[5]) shr 8) and $FF] xor sTable[0,(n2+KeyData[5]) and $FF]);
  156.     n2:= n2 xor (sTable[3,(n1+KeyData[6]) shr 24] xor sTable[2,((n1+KeyData[6]) shr 16) and $FF]
  157.       xor sTable[1,((n1+KeyData[6]) shr 8) and $FF] xor sTable[0,(n1+KeyData[6]) and $FF]);
  158.     n1:= n1 xor (sTable[3,(n2+KeyData[7]) shr 24] xor sTable[2,((n2+KeyData[7]) shr 16) and $FF]
  159.       xor sTable[1,((n2+KeyData[7]) shr 8) and $FF] xor sTable[0,(n2+KeyData[7]) and $FF]);
  160.   end;
  161.   n2:= n2 xor (sTable[3,(n1+KeyData[7]) shr 24] xor sTable[2,((n1+KeyData[7]) shr 16) and $FF]
  162.     xor sTable[1,((n1+KeyData[7]) shr 8) and $FF] xor sTable[0,(n1+KeyData[7]) and $FF]);
  163.   n1:= n1 xor (sTable[3,(n2+KeyData[6]) shr 24] xor sTable[2,((n2+KeyData[6]) shr 16) and $FF]
  164.     xor sTable[1,((n2+KeyData[6]) shr 8) and $FF] xor sTable[0,(n2+KeyData[6]) and $FF]);
  165.   n2:= n2 xor (sTable[3,(n1+KeyData[5]) shr 24] xor sTable[2,((n1+KeyData[5]) shr 16) and $FF]
  166.     xor sTable[1,((n1+KeyData[5]) shr 8) and $FF] xor sTable[0,(n1+KeyData[5]) and $FF]);
  167.   n1:= n1 xor (sTable[3,(n2+KeyData[4]) shr 24] xor sTable[2,((n2+KeyData[4]) shr 16) and $FF]
  168.     xor sTable[1,((n2+KeyData[4]) shr 8) and $FF] xor sTable[0,(n2+KeyData[4]) and $FF]);
  169.   n2:= n2 xor (sTable[3,(n1+KeyData[3]) shr 24] xor sTable[2,((n1+KeyData[3]) shr 16) and $FF]
  170.     xor sTable[1,((n1+KeyData[3]) shr 8) and $FF] xor sTable[0,(n1+KeyData[3]) and $FF]);
  171.   n1:= n1 xor (sTable[3,(n2+KeyData[2]) shr 24] xor sTable[2,((n2+KeyData[2]) shr 16) and $FF]
  172.     xor sTable[1,((n2+KeyData[2]) shr 8) and $FF] xor sTable[0,(n2+KeyData[2]) and $FF]);
  173.   n2:= n2 xor (sTable[3,(n1+KeyData[1]) shr 24] xor sTable[2,((n1+KeyData[1]) shr 16) and $FF]
  174.     xor sTable[1,((n1+KeyData[1]) shr 8) and $FF] xor sTable[0,(n1+KeyData[1]) and $FF]);
  175.   n1:= n1 xor (sTable[3,(n2+KeyData[0]) shr 24] xor sTable[2,((n2+KeyData[0]) shr 16) and $FF]
  176.     xor sTable[1,((n2+KeyData[0]) shr 8) and $FF] xor sTable[0,(n2+KeyData[0]) and $FF]);
  177.   PDword(@OutData)^:= n2;
  178.   PDword(dword(@OutData)+4)^:= n1;
  179. end;
  180.  
  181. procedure TDCP_gost.DecryptECB(const InData; var OutData);
  182. var
  183.   n1, n2: DWord;
  184.   i: longword;
  185. begin
  186.   if not fInitialized then
  187.     raise EDCP_blockcipher.Create('Cipher not initialized');
  188.   n1:= PDword(@InData)^;
  189.   n2:= PDword(dword(@InData)+4)^;
  190.   n2:= n2 xor (sTable[3,(n1+KeyData[0]) shr 24] xor sTable[2,((n1+KeyData[0]) shr 16) and $FF]
  191.     xor sTable[1,((n1+KeyData[0]) shr 8) and $FF] xor sTable[0,(n1+KeyData[0]) and $FF]);
  192.   n1:= n1 xor (sTable[3,(n2+KeyData[1]) shr 24] xor sTable[2,((n2+KeyData[1]) shr 16) and $FF]
  193.     xor sTable[1,((n2+KeyData[1]) shr 8) and $FF] xor sTable[0,(n2+KeyData[1]) and $FF]);
  194.   n2:= n2 xor (sTable[3,(n1+KeyData[2]) shr 24] xor sTable[2,((n1+KeyData[2]) shr 16) and $FF]
  195.     xor sTable[1,((n1+KeyData[2]) shr 8) and $FF] xor sTable[0,(n1+KeyData[2]) and $FF]);
  196.   n1:= n1 xor (sTable[3,(n2+KeyData[3]) shr 24] xor sTable[2,((n2+KeyData[3]) shr 16) and $FF]
  197.     xor sTable[1,((n2+KeyData[3]) shr 8) and $FF] xor sTable[0,(n2+KeyData[3]) and $FF]);
  198.   n2:= n2 xor (sTable[3,(n1+KeyData[4]) shr 24] xor sTable[2,((n1+KeyData[4]) shr 16) and $FF]
  199.     xor sTable[1,((n1+KeyData[4]) shr 8) and $FF] xor sTable[0,(n1+KeyData[4]) and $FF]);
  200.   n1:= n1 xor (sTable[3,(n2+KeyData[5]) shr 24] xor sTable[2,((n2+KeyData[5]) shr 16) and $FF]
  201.     xor sTable[1,((n2+KeyData[5]) shr 8) and $FF] xor sTable[0,(n2+KeyData[5]) and $FF]);
  202.   n2:= n2 xor (sTable[3,(n1+KeyData[6]) shr 24] xor sTable[2,((n1+KeyData[6]) shr 16) and $FF]
  203.     xor sTable[1,((n1+KeyData[6]) shr 8) and $FF] xor sTable[0,(n1+KeyData[6]) and $FF]);
  204.   n1:= n1 xor (sTable[3,(n2+KeyData[7]) shr 24] xor sTable[2,((n2+KeyData[7]) shr 16) and $FF]
  205.     xor sTable[1,((n2+KeyData[7]) shr 8) and $FF] xor sTable[0,(n2+KeyData[7]) and $FF]);
  206.   for i:= 0 to 2 do
  207.   begin
  208.     n2:= n2 xor (sTable[3,(n1+KeyData[7]) shr 24] xor sTable[2,((n1+KeyData[7]) shr 16) and $FF]
  209.       xor sTable[1,((n1+KeyData[7]) shr 8) and $FF] xor sTable[0,(n1+KeyData[7]) and $FF]);
  210.     n1:= n1 xor (sTable[3,(n2+KeyData[6]) shr 24] xor sTable[2,((n2+KeyData[6]) shr 16) and $FF]
  211.       xor sTable[1,((n2+KeyData[6]) shr 8) and $FF] xor sTable[0,(n2+KeyData[6]) and $FF]);
  212.     n2:= n2 xor (sTable[3,(n1+KeyData[5]) shr 24] xor sTable[2,((n1+KeyData[5]) shr 16) and $FF]
  213.       xor sTable[1,((n1+KeyData[5]) shr 8) and $FF] xor sTable[0,(n1+KeyData[5]) and $FF]);
  214.     n1:= n1 xor (sTable[3,(n2+KeyData[4]) shr 24] xor sTable[2,((n2+KeyData[4]) shr 16) and $FF]
  215.       xor sTable[1,((n2+KeyData[4]) shr 8) and $FF] xor sTable[0,(n2+KeyData[4]) and $FF]);
  216.     n2:= n2 xor (sTable[3,(n1+KeyData[3]) shr 24] xor sTable[2,((n1+KeyData[3]) shr 16) and $FF]
  217.       xor sTable[1,((n1+KeyData[3]) shr 8) and $FF] xor sTable[0,(n1+KeyData[3]) and $FF]);
  218.     n1:= n1 xor (sTable[3,(n2+KeyData[2]) shr 24] xor sTable[2,((n2+KeyData[2]) shr 16) and $FF]
  219.       xor sTable[1,((n2+KeyData[2]) shr 8) and $FF] xor sTable[0,(n2+KeyData[2]) and $FF]);
  220.     n2:= n2 xor (sTable[3,(n1+KeyData[1]) shr 24] xor sTable[2,((n1+KeyData[1]) shr 16) and $FF]
  221.       xor sTable[1,((n1+KeyData[1]) shr 8) and $FF] xor sTable[0,(n1+KeyData[1]) and $FF]);
  222.     n1:= n1 xor (sTable[3,(n2+KeyData[0]) shr 24] xor sTable[2,((n2+KeyData[0]) shr 16) and $FF]
  223.       xor sTable[1,((n2+KeyData[0]) shr 8) and $FF] xor sTable[0,(n2+KeyData[0]) and $FF]);
  224.   end;
  225.   PDword(@OutData)^:= n2;
  226.   PDword(dword(@OutData)+4)^:= n1;
  227. end;
  228.  
  229.  
  230. end.
  231.