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

  1. {******************************************************************************}
  2. {* DCPcrypt v2.0 written by David Barton (crypto@cityinthesky.co.uk) **********}
  3. {******************************************************************************}
  4. {* Block cipher component definitions *****************************************}
  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 DCPblockciphers;
  26.  
  27. interface
  28. uses
  29.   Classes, Sysutils, DCPcrypt2;
  30.  
  31. {******************************************************************************}
  32.     { Base type definition for 64 bit block ciphers }
  33. type
  34.   TDCP_blockcipher64= class(TDCP_blockcipher)
  35.   private
  36.     IV, CV: array[0..7] of byte;
  37.  
  38.     procedure IncCounter;
  39.   public
  40.     class function GetBlockSize: integer; override;
  41.       { Get the block size of the cipher (in bits) }
  42.  
  43.     procedure Reset; override;
  44.       { Reset any stored chaining information }
  45.     procedure Burn; override;
  46.       { Clear all stored key information and chaining information }
  47.     procedure SetIV(const Value); override;
  48.       { Sets the IV to Value and performs a reset }
  49.     procedure GetIV(var Value); override;
  50.       { Returns the current chaining information, not the actual IV }
  51.     procedure Init(const Key; Size: longword; InitVector: pointer); override;
  52.       { Do key setup based on the data in Key, size is in bits }
  53.  
  54.     procedure EncryptCBC(const Indata; var Outdata; Size: longword); override;
  55.       { Encrypt size bytes of data using the CBC method of encryption }
  56.     procedure DecryptCBC(const Indata; var Outdata; Size: longword); override;
  57.       { Decrypt size bytes of data using the CBC method of decryption }
  58.     procedure EncryptCFB8bit(const Indata; var Outdata; Size: longword); override;
  59.       { Encrypt size bytes of data using the CFB (8 bit) method of encryption }
  60.     procedure DecryptCFB8bit(const Indata; var Outdata; Size: longword); override;
  61.       { Decrypt size bytes of data using the CFB (8 bit) method of decryption }
  62.     procedure EncryptCFBblock(const Indata; var Outdata; Size: longword); override;
  63.       { Encrypt size bytes of data using the CFB (block) method of encryption }
  64.     procedure DecryptCFBblock(const Indata; var Outdata; Size: longword); override;
  65.       { Decrypt size bytes of data using the CFB (block) method of decryption }
  66.     procedure EncryptOFB(const Indata; var Outdata; Size: longword); override;
  67.       { Encrypt size bytes of data using the OFB method of encryption }
  68.     procedure DecryptOFB(const Indata; var Outdata; Size: longword); override;
  69.       { Decrypt size bytes of data using the OFB method of decryption }
  70.     procedure EncryptCTR(const Indata; var Outdata; Size: longword); override;
  71.       { Encrypt size bytes of data using the CTR method of encryption }
  72.     procedure DecryptCTR(const Indata; var Outdata; Size: longword); override;
  73.       { Decrypt size bytes of data using the CTR method of decryption }
  74.   end;
  75.  
  76. {******************************************************************************}
  77.     { Base type definition for 128 bit block ciphers }
  78. type
  79.   TDCP_blockcipher128= class(TDCP_blockcipher)
  80.   private
  81.     IV, CV: array[0..15] of byte;
  82.  
  83.     procedure IncCounter;
  84.   public
  85.     class function GetBlockSize: integer; override;
  86.       { Get the block size of the cipher (in bits) }
  87.  
  88.     procedure Reset; override;
  89.       { Reset any stored chaining information }
  90.     procedure Burn; override;
  91.       { Clear all stored key information and chaining information }
  92.     procedure SetIV(const Value); override;
  93.       { Sets the IV to Value and performs a reset }
  94.     procedure GetIV(var Value); override;
  95.       { Returns the current chaining information, not the actual IV }
  96.     procedure Init(const Key; Size: longword; InitVector: pointer); override;
  97.       { Do key setup based on the data in Key, size is in bits }
  98.  
  99.     procedure EncryptCBC(const Indata; var Outdata; Size: longword); override;
  100.       { Encrypt size bytes of data using the CBC method of encryption }
  101.     procedure DecryptCBC(const Indata; var Outdata; Size: longword); override;
  102.       { Decrypt size bytes of data using the CBC method of decryption }
  103.     procedure EncryptCFB8bit(const Indata; var Outdata; Size: longword); override;
  104.       { Encrypt size bytes of data using the CFB (8 bit) method of encryption }
  105.     procedure DecryptCFB8bit(const Indata; var Outdata; Size: longword); override;
  106.       { Decrypt size bytes of data using the CFB (8 bit) method of decryption }
  107.     procedure EncryptCFBblock(const Indata; var Outdata; Size: longword); override;
  108.       { Encrypt size bytes of data using the CFB (block) method of encryption }
  109.     procedure DecryptCFBblock(const Indata; var Outdata; Size: longword); override;
  110.       { Decrypt size bytes of data using the CFB (block) method of decryption }
  111.     procedure EncryptOFB(const Indata; var Outdata; Size: longword); override;
  112.       { Encrypt size bytes of data using the OFB method of encryption }
  113.     procedure DecryptOFB(const Indata; var Outdata; Size: longword); override;
  114.       { Decrypt size bytes of data using the OFB method of decryption }
  115.     procedure EncryptCTR(const Indata; var Outdata; Size: longword); override;
  116.       { Encrypt size bytes of data using the CTR method of encryption }
  117.     procedure DecryptCTR(const Indata; var Outdata; Size: longword); override;
  118.       { Decrypt size bytes of data using the CTR method of decryption }
  119.   end;
  120.  
  121. implementation
  122.  
  123.  
  124. {** TDCP_blockcipher64 ********************************************************}
  125.  
  126. procedure TDCP_blockcipher64.IncCounter;
  127. var
  128.   i: integer;
  129. begin
  130.   Inc(CV[7]);
  131.   i:= 7;
  132.   while (i> 0) and (CV[i] = 0) do
  133.   begin
  134.     Inc(CV[i-1]);
  135.     Dec(i);
  136.   end;
  137. end;
  138.  
  139. class function TDCP_blockcipher64.GetBlockSize: integer;
  140. begin
  141.   Result:= 64;
  142. end;
  143.  
  144. procedure TDCP_blockcipher64.Init(const Key; Size: longword; InitVector: pointer);
  145. begin
  146.   inherited Init(Key,Size,InitVector);
  147.   InitKey(Key,Size);
  148.   if InitVector= nil then
  149.   begin
  150.     FillChar(IV,8,{$IFDEF DCP1COMPAT}$FF{$ELSE}0{$ENDIF});
  151.     EncryptECB(IV,IV);
  152.     Reset;
  153.   end
  154.   else
  155.   begin
  156.     Move(InitVector^,IV,8);
  157.     Reset;
  158.   end;
  159. end;
  160.  
  161. procedure TDCP_blockcipher64.SetIV(const Value);
  162. begin
  163.   if not fInitialized then
  164.     raise EDCP_blockcipher.Create('Cipher not initialized');
  165.   Move(Value,IV,8);
  166.   Reset;
  167. end;
  168.  
  169. procedure TDCP_blockcipher64.GetIV(var Value);
  170. begin
  171.   if not fInitialized then
  172.     raise EDCP_blockcipher.Create('Cipher not initialized');
  173.   Move(CV,Value,8);
  174. end;
  175.  
  176. procedure TDCP_blockcipher64.Reset;
  177. begin
  178.   if not fInitialized then
  179.     raise EDCP_blockcipher.Create('Cipher not initialized')
  180.   else
  181.     Move(IV,CV,8);
  182. end;
  183.  
  184. procedure TDCP_blockcipher64.Burn;
  185. begin
  186.   FillChar(IV,8,$FF);
  187.   FillChar(CV,8,$FF);
  188.   inherited Burn;
  189. end;
  190.  
  191. procedure TDCP_blockcipher64.EncryptCBC(const Indata; var Outdata; Size: longword);
  192. var
  193.   i: longword;
  194.   p1, p2: pointer;
  195. begin
  196.   if not fInitialized then
  197.     raise EDCP_blockcipher.Create('Cipher not initialized');
  198.   p1:= @Indata;
  199.   p2:= @Outdata;
  200.   for i:= 1 to (Size div 8) do
  201.   begin
  202.     Move(p1^,p2^,8);
  203.     XorBlock(p2^,CV,8);
  204.     EncryptECB(p2^,p2^);
  205.     Move(p2^,CV,8);
  206.     p1:= pointer(longword(p1) + 8);
  207.     p2:= pointer(longword(p2) + 8);
  208.   end;
  209.   if (Size mod 8)<> 0 then
  210.   begin
  211.     EncryptECB(CV,CV);
  212.     Move(p1^,p2^,Size mod 8);
  213.     XorBlock(p2^,CV,Size mod 8);
  214.   end;
  215. end;
  216.  
  217. procedure TDCP_blockcipher64.DecryptCBC(const Indata; var Outdata; Size: longword);
  218. var
  219.   i: longword;
  220.   p1, p2: pointer;
  221.   Temp: array[0..7] of byte;
  222. begin
  223.   if not fInitialized then
  224.     raise EDCP_blockcipher.Create('Cipher not initialized');
  225.   p1:= @Indata;
  226.   p2:= @Outdata;
  227.   for i:= 1 to (Size div 8) do
  228.   begin
  229.     Move(p1^,p2^,8);
  230.     Move(p1^,Temp,8);
  231.     DecryptECB(p2^,p2^);
  232.     XorBlock(p2^,CV,8);
  233.     Move(Temp,CV,8);
  234.     p1:= pointer(longword(p1) + 8);
  235.     p2:= pointer(longword(p2) + 8);
  236.   end;
  237.   if (Size mod 8)<> 0 then
  238.   begin
  239.     EncryptECB(CV,CV);
  240.     Move(p1^,p2^,Size mod 8);
  241.     XorBlock(p2^,CV,Size mod 8);
  242.   end;
  243. end;
  244.  
  245. procedure TDCP_blockcipher64.EncryptCFB8bit(const Indata; var Outdata; Size: longword);
  246. var
  247.   i: longword;
  248.   p1, p2: Pbyte;
  249.   Temp: array[0..7] of byte;
  250. begin
  251.   if not fInitialized then
  252.     raise EDCP_blockcipher.Create('Cipher not initialized');
  253.   p1:= @Indata;
  254.   p2:= @Outdata;
  255.   for i:= 1 to Size do
  256.   begin
  257.     EncryptECB(CV,Temp);
  258.     p2^:= p1^ xor Temp[0];
  259.     Move(CV[1],CV[0],8-1);
  260.     CV[7]:= p2^;
  261.     Inc(p1);
  262.     Inc(p2);
  263.   end;
  264. end;
  265.  
  266. procedure TDCP_blockcipher64.DecryptCFB8bit(const Indata; var Outdata; Size: longword);
  267. var
  268.   i: longword;
  269.   p1, p2: Pbyte;
  270.   TempByte: byte;
  271.   Temp: array[0..7] of byte;
  272. begin
  273.   if not fInitialized then
  274.     raise EDCP_blockcipher.Create('Cipher not initialized');
  275.   p1:= @Indata;
  276.   p2:= @Outdata;
  277.   for i:= 1 to Size do
  278.   begin
  279.     TempByte:= p1^;
  280.     EncryptECB(CV,Temp);
  281.     p2^:= p1^ xor Temp[0];
  282.     Move(CV[1],CV[0],8-1);
  283.     CV[7]:= TempByte;
  284.     Inc(p1);
  285.     Inc(p2);
  286.   end;
  287. end;
  288.  
  289. procedure TDCP_blockcipher64.EncryptCFBblock(const Indata; var Outdata; Size: longword);
  290. var
  291.   i: longword;
  292.   p1, p2: Pbyte;
  293. begin
  294.   if not fInitialized then
  295.     raise EDCP_blockcipher.Create('Cipher not initialized');
  296.   p1:= @Indata;
  297.   p2:= @Outdata;
  298.   for i:= 1 to (Size div 8) do
  299.   begin
  300.     EncryptECB(CV,CV);
  301.     Move(p1^,p2^,8);
  302.     XorBlock(p2^,CV,8);
  303.     Move(p2^,CV,8);
  304.     p1:= pointer(longword(p1) + 8);
  305.     p2:= pointer(longword(p2) + 8);
  306.   end;
  307.   if (Size mod 8)<> 0 then
  308.   begin
  309.     EncryptECB(CV,CV);
  310.     Move(p1^,p2^,Size mod 8);
  311.     XorBlock(p2^,CV,Size mod 8);
  312.   end;
  313. end;
  314.  
  315. procedure TDCP_blockcipher64.DecryptCFBblock(const Indata; var Outdata; Size: longword);
  316. var
  317.   i: longword;
  318.   p1, p2: Pbyte;
  319.   Temp: array[0..7] of byte;
  320. begin
  321.   if not fInitialized then
  322.     raise EDCP_blockcipher.Create('Cipher not initialized');
  323.   p1:= @Indata;
  324.   p2:= @Outdata;
  325.   for i:= 1 to (Size div 8) do
  326.   begin
  327.     Move(p1^,Temp,8);
  328.     EncryptECB(CV,CV);
  329.     Move(p1^,p2^,8);
  330.     XorBlock(p2^,CV,8);
  331.     Move(Temp,CV,8);
  332.     p1:= pointer(longword(p1) + 8);
  333.     p2:= pointer(longword(p2) + 8);
  334.   end;
  335.   if (Size mod 8)<> 0 then
  336.   begin
  337.     EncryptECB(CV,CV);
  338.     Move(p1^,p2^,Size mod 8);
  339.     XorBlock(p2^,CV,Size mod 8);
  340.   end;
  341. end;
  342.  
  343. procedure TDCP_blockcipher64.EncryptOFB(const Indata; var Outdata; Size: longword);
  344. var
  345.   i: longword;
  346.   p1, p2: pointer;
  347. begin
  348.   if not fInitialized then
  349.     raise EDCP_blockcipher.Create('Cipher not initialized');
  350.   p1:= @Indata;
  351.   p2:= @Outdata;
  352.   for i:= 1 to (Size div 8) do
  353.   begin
  354.     EncryptECB(CV,CV);
  355.     Move(p1^,p2^,8);
  356.     XorBlock(p2^,CV,8);
  357.     p1:= pointer(longword(p1) + 8);
  358.     p2:= pointer(longword(p2) + 8);
  359.   end;
  360.   if (Size mod 8)<> 0 then
  361.   begin
  362.     EncryptECB(CV,CV);
  363.     Move(p1^,p2^,Size mod 8);
  364.     XorBlock(p2^,CV,Size mod 8);
  365.   end;
  366. end;
  367.  
  368. procedure TDCP_blockcipher64.DecryptOFB(const Indata; var Outdata; Size: longword);
  369. var
  370.   i: longword;
  371.   p1, p2: pointer;
  372. begin
  373.   if not fInitialized then
  374.     raise EDCP_blockcipher.Create('Cipher not initialized');
  375.   p1:= @Indata;
  376.   p2:= @Outdata;
  377.   for i:= 1 to (Size div 8) do
  378.   begin
  379.     EncryptECB(CV,CV);
  380.     Move(p1^,p2^,8);
  381.     XorBlock(p2^,CV,8);
  382.     p1:= pointer(longword(p1) + 8);
  383.     p2:= pointer(longword(p2) + 8);
  384.   end;
  385.   if (Size mod 8)<> 0 then
  386.   begin
  387.     EncryptECB(CV,CV);
  388.     Move(p1^,p2^,Size mod 8);
  389.     XorBlock(p2^,CV,Size mod 8);
  390.   end;
  391. end;
  392.  
  393. procedure TDCP_blockcipher64.EncryptCTR(const Indata; var Outdata; Size: longword);
  394. var
  395.   temp: array[0..7] of byte;
  396.   i: longword;
  397.   p1, p2: pointer;
  398. begin
  399.   if not fInitialized then
  400.     raise EDCP_blockcipher.Create('Cipher not initialized');
  401.   p1:= @Indata;
  402.   p2:= @Outdata;
  403.   for i:= 1 to (Size div 8) do
  404.   begin
  405.     EncryptECB(CV,temp);
  406.     IncCounter;
  407.     Move(p1^,p2^,8);
  408.     XorBlock(p2^,temp,8);
  409.     p1:= pointer(longword(p1) + 8);
  410.     p2:= pointer(longword(p2) + 8);
  411.   end;
  412.   if (Size mod 8)<> 0 then
  413.   begin
  414.     EncryptECB(CV,temp);
  415.     IncCounter;
  416.     Move(p1^,p2^,Size mod 8);
  417.     XorBlock(p2^,temp,Size mod 8);
  418.   end;
  419. end;
  420.  
  421. procedure TDCP_blockcipher64.DecryptCTR(const Indata; var Outdata; Size: longword);
  422. var
  423.   temp: array[0..7] of byte;
  424.   i: longword;
  425.   p1, p2: pointer;
  426. begin
  427.   if not fInitialized then
  428.     raise EDCP_blockcipher.Create('Cipher not initialized');
  429.   p1:= @Indata;
  430.   p2:= @Outdata;
  431.   for i:= 1 to (Size div 8) do
  432.   begin
  433.     EncryptECB(CV,temp);
  434.     IncCounter;
  435.     Move(p1^,p2^,8);
  436.     XorBlock(p2^,temp,8);
  437.     p1:= pointer(longword(p1) + 8);
  438.     p2:= pointer(longword(p2) + 8);
  439.   end;
  440.   if (Size mod 8)<> 0 then
  441.   begin
  442.     EncryptECB(CV,temp);
  443.     IncCounter;
  444.     Move(p1^,p2^,Size mod 8);
  445.     XorBlock(p2^,temp,Size mod 8);
  446.   end;
  447. end;
  448.  
  449. {** TDCP_blockcipher128 ********************************************************}
  450.  
  451. procedure TDCP_blockcipher128.IncCounter;
  452. var
  453.   i: integer;
  454. begin
  455.   Inc(CV[15]);
  456.   i:= 15;
  457.   while (i> 0) and (CV[i] = 0) do
  458.   begin
  459.     Inc(CV[i-1]);
  460.     Dec(i);
  461.   end;
  462. end;
  463.  
  464. class function TDCP_blockcipher128.GetBlockSize: integer;
  465. begin
  466.   Result:= 128;
  467. end;
  468.  
  469. procedure TDCP_blockcipher128.Init(const Key; Size: longword; InitVector: pointer);
  470. begin
  471.   inherited Init(Key,Size,InitVector);
  472.   InitKey(Key,Size);
  473.   if InitVector= nil then
  474.   begin
  475.     FillChar(IV,16,{$IFDEF DCP1COMPAT}$FF{$ELSE}0{$ENDIF});
  476.     EncryptECB(IV,IV);
  477.     Reset;
  478.   end
  479.   else
  480.   begin
  481.     Move(InitVector^,IV,16);
  482.     Reset;
  483.   end;
  484. end;
  485.  
  486. procedure TDCP_blockcipher128.SetIV(const Value);
  487. begin
  488.   if not fInitialized then
  489.     raise EDCP_blockcipher.Create('Cipher not initialized');
  490.   Move(Value,IV,16);
  491.   Reset;
  492. end;
  493.  
  494. procedure TDCP_blockcipher128.GetIV(var Value);
  495. begin
  496.   if not fInitialized then
  497.     raise EDCP_blockcipher.Create('Cipher not initialized');
  498.   Move(CV,Value,16);
  499. end;
  500.  
  501. procedure TDCP_blockcipher128.Reset;
  502. begin
  503.   if not fInitialized then
  504.     raise EDCP_blockcipher.Create('Cipher not initialized')
  505.   else
  506.     Move(IV,CV,16);
  507. end;
  508.  
  509. procedure TDCP_blockcipher128.Burn;
  510. begin
  511.   FillChar(IV,16,$FF);
  512.   FillChar(CV,16,$FF);
  513.   inherited Burn;
  514. end;
  515.  
  516. procedure TDCP_blockcipher128.EncryptCBC(const Indata; var Outdata; Size: longword);
  517. var
  518.   i: longword;
  519.   p1, p2: pointer;
  520. begin
  521.   if not fInitialized then
  522.     raise EDCP_blockcipher.Create('Cipher not initialized');
  523.   p1:= @Indata;
  524.   p2:= @Outdata;
  525.   for i:= 1 to (Size div 16) do
  526.   begin
  527.     Move(p1^,p2^,16);
  528.     XorBlock(p2^,CV,16);
  529.     EncryptECB(p2^,p2^);
  530.     Move(p2^,CV,16);
  531.     p1:= pointer(longword(p1) + 16);
  532.     p2:= pointer(longword(p2) + 16);
  533.   end;
  534.   if (Size mod 16)<> 0 then
  535.   begin
  536.     EncryptECB(CV,CV);
  537.     Move(p1^,p2^,Size mod 16);
  538.     XorBlock(p2^,CV,Size mod 16);
  539.   end;
  540. end;
  541.  
  542. procedure TDCP_blockcipher128.DecryptCBC(const Indata; var Outdata; Size: longword);
  543. var
  544.   i: longword;
  545.   p1, p2: pointer;
  546.   Temp: array[0..15] of byte;
  547. begin
  548.   if not fInitialized then
  549.     raise EDCP_blockcipher.Create('Cipher not initialized');
  550.   p1:= @Indata;
  551.   p2:= @Outdata;
  552.   for i:= 1 to (Size div 16) do
  553.   begin
  554.     Move(p1^,p2^,16);
  555.     Move(p1^,Temp,16);
  556.     DecryptECB(p2^,p2^);
  557.     XorBlock(p2^,CV,16);
  558.     Move(Temp,CV,16);
  559.     p1:= pointer(longword(p1) + 16);
  560.     p2:= pointer(longword(p2) + 16);
  561.   end;
  562.   if (Size mod 16)<> 0 then
  563.   begin
  564.     EncryptECB(CV,CV);
  565.     Move(p1^,p2^,Size mod 16);
  566.     XorBlock(p2^,CV,Size mod 16);
  567.   end;
  568. end;
  569.  
  570. procedure TDCP_blockcipher128.EncryptCFB8bit(const Indata; var Outdata; Size: longword);
  571. var
  572.   i: longword;
  573.   p1, p2: Pbyte;
  574.   Temp: array[0..15] of byte;
  575. begin
  576.   if not fInitialized then
  577.     raise EDCP_blockcipher.Create('Cipher not initialized');
  578.   p1:= @Indata;
  579.   p2:= @Outdata;
  580.   for i:= 1 to Size do
  581.   begin
  582.     EncryptECB(CV,Temp);
  583.     p2^:= p1^ xor Temp[0];
  584.     Move(CV[1],CV[0],15);
  585.     CV[15]:= p2^;
  586.     Inc(p1);
  587.     Inc(p2);
  588.   end;
  589. end;
  590.  
  591. procedure TDCP_blockcipher128.DecryptCFB8bit(const Indata; var Outdata; Size: longword);
  592. var
  593.   i: longword;
  594.   p1, p2: Pbyte;
  595.   TempByte: byte;
  596.   Temp: array[0..15] of byte;
  597. begin
  598.   if not fInitialized then
  599.     raise EDCP_blockcipher.Create('Cipher not initialized');
  600.   p1:= @Indata;
  601.   p2:= @Outdata;
  602.   for i:= 1 to Size do
  603.   begin
  604.     TempByte:= p1^;
  605.     EncryptECB(CV,Temp);
  606.     p2^:= p1^ xor Temp[0];
  607.     Move(CV[1],CV[0],15);
  608.     CV[15]:= TempByte;
  609.     Inc(p1);
  610.     Inc(p2);
  611.   end;
  612. end;
  613.  
  614. procedure TDCP_blockcipher128.EncryptCFBblock(const Indata; var Outdata; Size: longword);
  615. var
  616.   i: longword;
  617.   p1, p2: Pbyte;
  618. begin
  619.   if not fInitialized then
  620.     raise EDCP_blockcipher.Create('Cipher not initialized');
  621.   p1:= @Indata;
  622.   p2:= @Outdata;
  623.   for i:= 1 to (Size div 16) do
  624.   begin
  625.     EncryptECB(CV,CV);
  626.     Move(p1^,p2^,16);
  627.     XorBlock(p2^,CV,16);
  628.     Move(p2^,CV,16);
  629.     p1:= pointer(longword(p1) + 16);
  630.     p2:= pointer(longword(p2) + 16);
  631.   end;
  632.   if (Size mod 16)<> 0 then
  633.   begin
  634.     EncryptECB(CV,CV);
  635.     Move(p1^,p2^,Size mod 16);
  636.     XorBlock(p2^,CV,Size mod 16);
  637.   end;
  638. end;
  639.  
  640. procedure TDCP_blockcipher128.DecryptCFBblock(const Indata; var Outdata; Size: longword);
  641. var
  642.   i: longword;
  643.   p1, p2: Pbyte;
  644.   Temp: array[0..15] of byte;
  645. begin
  646.   if not fInitialized then
  647.     raise EDCP_blockcipher.Create('Cipher not initialized');
  648.   p1:= @Indata;
  649.   p2:= @Outdata;
  650.   for i:= 1 to (Size div 16) do
  651.   begin
  652.     Move(p1^,Temp,16);
  653.     EncryptECB(CV,CV);
  654.     Move(p1^,p2^,16);
  655.     XorBlock(p2^,CV,16);
  656.     Move(Temp,CV,16);
  657.     p1:= pointer(longword(p1) + 16);
  658.     p2:= pointer(longword(p2) + 16);
  659.   end;
  660.   if (Size mod 16)<> 0 then
  661.   begin
  662.     EncryptECB(CV,CV);
  663.     Move(p1^,p2^,Size mod 16);
  664.     XorBlock(p2^,CV,Size mod 16);
  665.   end;
  666. end;
  667.  
  668. procedure TDCP_blockcipher128.EncryptOFB(const Indata; var Outdata; Size: longword);
  669. var
  670.   i: longword;
  671.   p1, p2: pointer;
  672. begin
  673.   if not fInitialized then
  674.     raise EDCP_blockcipher.Create('Cipher not initialized');
  675.   p1:= @Indata;
  676.   p2:= @Outdata;
  677.   for i:= 1 to (Size div 16) do
  678.   begin
  679.     EncryptECB(CV,CV);
  680.     Move(p1^,p2^,16);
  681.     XorBlock(p2^,CV,16);
  682.     p1:= pointer(longword(p1) + 16);
  683.     p2:= pointer(longword(p2) + 16);
  684.   end;
  685.   if (Size mod 16)<> 0 then
  686.   begin
  687.     EncryptECB(CV,CV);
  688.     Move(p1^,p2^,Size mod 16);
  689.     XorBlock(p2^,CV,Size mod 16);
  690.   end;
  691. end;
  692.  
  693. procedure TDCP_blockcipher128.DecryptOFB(const Indata; var Outdata; Size: longword);
  694. var
  695.   i: longword;
  696.   p1, p2: pointer;
  697. begin
  698.   if not fInitialized then
  699.     raise EDCP_blockcipher.Create('Cipher not initialized');
  700.   p1:= @Indata;
  701.   p2:= @Outdata;
  702.   for i:= 1 to (Size div 16) do
  703.   begin
  704.     EncryptECB(CV,CV);
  705.     Move(p1^,p2^,16);
  706.     XorBlock(p2^,CV,16);
  707.     p1:= pointer(longword(p1) + 16);
  708.     p2:= pointer(longword(p2) + 16);
  709.   end;
  710.   if (Size mod 16)<> 0 then
  711.   begin
  712.     EncryptECB(CV,CV);
  713.     Move(p1^,p2^,Size mod 16);
  714.     XorBlock(p2^,CV,Size mod 16);
  715.   end;
  716. end;
  717.  
  718. procedure TDCP_blockcipher128.EncryptCTR(const Indata; var Outdata; Size: longword);
  719. var
  720.   temp: array[0..15] of byte;
  721.   i: longword;
  722.   p1, p2: pointer;
  723. begin
  724.   if not fInitialized then
  725.     raise EDCP_blockcipher.Create('Cipher not initialized');
  726.   p1:= @Indata;
  727.   p2:= @Outdata;
  728.   for i:= 1 to (Size div 16) do
  729.   begin
  730.     EncryptECB(CV,temp);
  731.     IncCounter;
  732.     Move(p1^,p2^,16);
  733.     XorBlock(p2^,temp,16);
  734.     p1:= pointer(longword(p1) + 16);
  735.     p2:= pointer(longword(p2) + 16);
  736.   end;
  737.   if (Size mod 16)<> 0 then
  738.   begin
  739.     EncryptECB(CV,temp);
  740.     IncCounter;
  741.     Move(p1^,p2^,Size mod 16);
  742.     XorBlock(p2^,temp,Size mod 16);
  743.   end;
  744. end;
  745.  
  746. procedure TDCP_blockcipher128.DecryptCTR(const Indata; var Outdata; Size: longword);
  747. var
  748.   temp: array[0..15] of byte;
  749.   i: longword;
  750.   p1, p2: pointer;
  751. begin
  752.   if not fInitialized then
  753.     raise EDCP_blockcipher.Create('Cipher not initialized');
  754.   p1:= @Indata;
  755.   p2:= @Outdata;
  756.   for i:= 1 to (Size div 16) do
  757.   begin
  758.     EncryptECB(CV,temp);
  759.     IncCounter;
  760.     Move(p1^,p2^,16);
  761.     XorBlock(p2^,temp,16);
  762.     p1:= pointer(longword(p1) + 16);
  763.     p2:= pointer(longword(p2) + 16);
  764.   end;
  765.   if (Size mod 16)<> 0 then
  766.   begin
  767.     EncryptECB(CV,temp);
  768.     IncCounter;
  769.     Move(p1^,p2^,Size mod 16);
  770.     XorBlock(p2^,temp,Size mod 16);
  771.   end;
  772. end;
  773.  
  774. end.
  775.