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

  1. {******************************************************************************}
  2. {* DCPcrypt v2.0 written by David Barton (crypto@cityinthesky.co.uk) **********}
  3. {******************************************************************************}
  4. {* A binary compatible implementation of RipeMD-160 ***************************}
  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 DCPripemd160;
  26.  
  27. interface
  28. uses
  29.   Classes, Sysutils, DCPcrypt2, DCPconst;
  30.  
  31. type
  32.   TDCP_ripemd160= class(TDCP_hash)
  33.   protected
  34.     LenHi, LenLo: longword;
  35.     Index: DWord;
  36.     CurrentHash: array[0..4] of DWord;
  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. {******************************************************************************}
  53. {******************************************************************************}
  54. implementation
  55. {$R-}{$Q-}
  56.  
  57. procedure TDCP_ripemd160.Compress;
  58. var
  59.   aa, bb, cc, dd, ee, aaa, bbb, ccc, ddd, eee: DWord;
  60.   X: array[0..15] of DWord;
  61. begin
  62.   Move(HashBuffer,X,Sizeof(X));
  63.   aa:= CurrentHash[0];
  64.   aaa:= CurrentHash[0];
  65.   bb:= CurrentHash[1];
  66.   bbb:= CurrentHash[1];
  67.   cc:= CurrentHash[2];
  68.   ccc:= CurrentHash[2];
  69.   dd:= CurrentHash[3];
  70.   ddd:= CurrentHash[3];
  71.   ee:= CurrentHash[4];
  72.   eee:= CurrentHash[4];
  73.  
  74.   aa:= aa + (bb xor cc xor dd) + X[ 0];
  75.   aa:= ((aa shl 11) or (aa shr (32-11))) + ee;
  76.   cc:= ((cc shl 10) or (cc shr (32-10)));
  77.   ee:= ee + (aa xor bb xor cc) + X[ 1];
  78.   ee:= ((ee shl 14) or (ee shr (32-14))) + dd;
  79.   bb:= ((bb shl 10) or (bb shr (32-10)));
  80.   dd:= dd + (ee xor aa xor bb) + X[ 2];
  81.   dd:= ((dd shl 15) or (dd shr (32-15))) + cc;
  82.   aa:= ((aa shl 10) or (aa shr (32-10)));
  83.   cc:= cc + (dd xor ee xor aa) + X[ 3];
  84.   cc:= ((cc shl 12) or (cc shr (32-12))) + bb;
  85.   ee:= ((ee shl 10) or (ee shr (32-10)));
  86.   bb:= bb + (cc xor dd xor ee) + X[ 4];
  87.   bb:= ((bb shl 5) or (bb shr (32-5))) + aa;
  88.   dd:= ((dd shl 10) or (dd shr (32-10)));
  89.   aa:= aa + (bb xor cc xor dd) + X[ 5];
  90.   aa:= ((aa shl 8) or (aa shr (32-8))) + ee;
  91.   cc:= ((cc shl 10) or (cc shr (32-10)));
  92.   ee:= ee + (aa xor bb xor cc) + X[ 6];
  93.   ee:= ((ee shl 7) or (ee shr (32-7))) + dd;
  94.   bb:= ((bb shl 10) or (bb shr (32-10)));
  95.   dd:= dd + (ee xor aa xor bb) + X[ 7];
  96.   dd:= ((dd shl 9) or (dd shr (32-9))) + cc;
  97.   aa:= ((aa shl 10) or (aa shr (32-10)));
  98.   cc:= cc + (dd xor ee xor aa) + X[ 8];
  99.   cc:= ((cc shl 11) or (cc shr (32-11))) + bb;
  100.   ee:= ((ee shl 10) or (ee shr (32-10)));
  101.   bb:= bb + (cc xor dd xor ee) + X[ 9];
  102.   bb:= ((bb shl 13) or (bb shr (32-13))) + aa;
  103.   dd:= ((dd shl 10) or (dd shr (32-10)));
  104.   aa:= aa + (bb xor cc xor dd) + X[10];
  105.   aa:= ((aa shl 14) or (aa shr (32-14))) + ee;
  106.   cc:= ((cc shl 10) or (cc shr (32-10)));
  107.   ee:= ee + (aa xor bb xor cc) + X[11];
  108.   ee:= ((ee shl 15) or (ee shr (32-15))) + dd;
  109.   bb:= ((bb shl 10) or (bb shr (32-10)));
  110.   dd:= dd + (ee xor aa xor bb) + X[12];
  111.   dd:= ((dd shl 6) or (dd shr (32-6))) + cc;
  112.   aa:= ((aa shl 10) or (aa shr (32-10)));
  113.   cc:= cc + (dd xor ee xor aa) + X[13];
  114.   cc:= ((cc shl 7) or (cc shr (32-7))) + bb;
  115.   ee:= ((ee shl 10) or (ee shr (32-10)));
  116.   bb:= bb + (cc xor dd xor ee) + X[14];
  117.   bb:= ((bb shl 9) or (bb shr (32-9))) + aa;
  118.   dd:= ((dd shl 10) or (dd shr (32-10)));
  119.   aa:= aa + (bb xor cc xor dd) + X[15];
  120.   aa:= ((aa shl 8) or (aa shr (32-8))) + ee;
  121.   cc:= ((cc shl 10) or (cc shr (32-10)));
  122.  
  123.   ee:= ee + ((aa and bb) or ((not aa) and cc)) + X[ 7] + $5a827999;
  124.   ee:= ((ee shl 7) or (ee shr (32-7))) + dd;
  125.   bb:= ((bb shl 10) or (bb shr (32-10)));
  126.   dd:= dd + ((ee and aa) or ((not ee) and bb)) + X[ 4] + $5a827999;
  127.   dd:= ((dd shl 6) or (dd shr (32-6))) + cc;
  128.   aa:= ((aa shl 10) or (aa shr (32-10)));
  129.   cc:= cc + ((dd and ee) or ((not dd) and aa)) + X[13] + $5a827999;
  130.   cc:= ((cc shl 8) or (cc shr (32-8))) + bb;
  131.   ee:= ((ee shl 10) or (ee shr (32-10)));
  132.   bb:= bb + ((cc and dd) or ((not cc) and ee)) + X[ 1] + $5a827999;
  133.   bb:= ((bb shl 13) or (bb shr (32-13))) + aa;
  134.   dd:= ((dd shl 10) or (dd shr (32-10)));
  135.   aa:= aa + ((bb and cc) or ((not bb) and dd)) + X[10] + $5a827999;
  136.   aa:= ((aa shl 11) or (aa shr (32-11))) + ee;
  137.   cc:= ((cc shl 10) or (cc shr (32-10)));
  138.   ee:= ee + ((aa and bb) or ((not aa) and cc)) + X[ 6] + $5a827999;
  139.   ee:= ((ee shl 9) or (ee shr (32-9))) + dd;
  140.   bb:= ((bb shl 10) or (bb shr (32-10)));
  141.   dd:= dd + ((ee and aa) or ((not ee) and bb)) + X[15] + $5a827999;
  142.   dd:= ((dd shl 7) or (dd shr (32-7))) + cc;
  143.   aa:= ((aa shl 10) or (aa shr (32-10)));
  144.   cc:= cc + ((dd and ee) or ((not dd) and aa)) + X[ 3] + $5a827999;
  145.   cc:= ((cc shl 15) or (cc shr (32-15))) + bb;
  146.   ee:= ((ee shl 10) or (ee shr (32-10)));
  147.   bb:= bb + ((cc and dd) or ((not cc) and ee)) + X[12] + $5a827999;
  148.   bb:= ((bb shl 7) or (bb shr (32-7))) + aa;
  149.   dd:= ((dd shl 10) or (dd shr (32-10)));
  150.   aa:= aa + ((bb and cc) or ((not bb) and dd)) + X[ 0] + $5a827999;
  151.   aa:= ((aa shl 12) or (aa shr (32-12))) + ee;
  152.   cc:= ((cc shl 10) or (cc shr (32-10)));
  153.   ee:= ee + ((aa and bb) or ((not aa) and cc)) + X[ 9] + $5a827999;
  154.   ee:= ((ee shl 15) or (ee shr (32-15))) + dd;
  155.   bb:= ((bb shl 10) or (bb shr (32-10)));
  156.   dd:= dd + ((ee and aa) or ((not ee) and bb)) + X[ 5] + $5a827999;
  157.   dd:= ((dd shl 9) or (dd shr (32-9))) + cc;
  158.   aa:= ((aa shl 10) or (aa shr (32-10)));
  159.   cc:= cc + ((dd and ee) or ((not dd) and aa)) + X[ 2] + $5a827999;
  160.   cc:= ((cc shl 11) or (cc shr (32-11))) + bb;
  161.   ee:= ((ee shl 10) or (ee shr (32-10)));
  162.   bb:= bb + ((cc and dd) or ((not cc) and ee)) + X[14] + $5a827999;
  163.   bb:= ((bb shl 7) or (bb shr (32-7))) + aa;
  164.   dd:= ((dd shl 10) or (dd shr (32-10)));
  165.   aa:= aa + ((bb and cc) or ((not bb) and dd)) + X[11] + $5a827999;
  166.   aa:= ((aa shl 13) or (aa shr (32-13))) + ee;
  167.   cc:= ((cc shl 10) or (cc shr (32-10)));
  168.   ee:= ee + ((aa and bb) or ((not aa) and cc)) + X[ 8] + $5a827999;
  169.   ee:= ((ee shl 12) or (ee shr (32-12))) + dd;
  170.   bb:= ((bb shl 10) or (bb shr (32-10)));
  171.  
  172.   dd:= dd + ((ee or (not aa)) xor bb) + X[ 3] + $6ed9eba1;
  173.   dd:= ((dd shl 11) or (dd shr (32-11))) + cc;
  174.   aa:= ((aa shl 10) or (aa shr (32-10)));
  175.   cc:= cc + ((dd or (not ee)) xor aa) + X[10] + $6ed9eba1;
  176.   cc:= ((cc shl 13) or (cc shr (32-13))) + bb;
  177.   ee:= ((ee shl 10) or (ee shr (32-10)));
  178.   bb:= bb + ((cc or (not dd)) xor ee) + X[14] + $6ed9eba1;
  179.   bb:= ((bb shl 6) or (bb shr (32-6))) + aa;
  180.   dd:= ((dd shl 10) or (dd shr (32-10)));
  181.   aa:= aa + ((bb or (not cc)) xor dd) + X[ 4] + $6ed9eba1;
  182.   aa:= ((aa shl 7) or (aa shr (32-7))) + ee;
  183.   cc:= ((cc shl 10) or (cc shr (32-10)));
  184.   ee:= ee + ((aa or (not bb)) xor cc) + X[ 9] + $6ed9eba1;
  185.   ee:= ((ee shl 14) or (ee shr (32-14))) + dd;
  186.   bb:= ((bb shl 10) or (bb shr (32-10)));
  187.   dd:= dd + ((ee or (not aa)) xor bb) + X[15] + $6ed9eba1;
  188.   dd:= ((dd shl 9) or (dd shr (32-9))) + cc;
  189.   aa:= ((aa shl 10) or (aa shr (32-10)));
  190.   cc:= cc + ((dd or (not ee)) xor aa) + X[ 8] + $6ed9eba1;
  191.   cc:= ((cc shl 13) or (cc shr (32-13))) + bb;
  192.   ee:= ((ee shl 10) or (ee shr (32-10)));
  193.   bb:= bb + ((cc or (not dd)) xor ee) + X[ 1] + $6ed9eba1;
  194.   bb:= ((bb shl 15) or (bb shr (32-15))) + aa;
  195.   dd:= ((dd shl 10) or (dd shr (32-10)));
  196.   aa:= aa + ((bb or (not cc)) xor dd) + X[ 2] + $6ed9eba1;
  197.   aa:= ((aa shl 14) or (aa shr (32-14))) + ee;
  198.   cc:= ((cc shl 10) or (cc shr (32-10)));
  199.   ee:= ee + ((aa or (not bb)) xor cc) + X[ 7] + $6ed9eba1;
  200.   ee:= ((ee shl 8) or (ee shr (32-8))) + dd;
  201.   bb:= ((bb shl 10) or (bb shr (32-10)));
  202.   dd:= dd + ((ee or (not aa)) xor bb) + X[ 0] + $6ed9eba1;
  203.   dd:= ((dd shl 13) or (dd shr (32-13))) + cc;
  204.   aa:= ((aa shl 10) or (aa shr (32-10)));
  205.   cc:= cc + ((dd or (not ee)) xor aa) + X[ 6] + $6ed9eba1;
  206.   cc:= ((cc shl 6) or (cc shr (32-6))) + bb;
  207.   ee:= ((ee shl 10) or (ee shr (32-10)));
  208.   bb:= bb + ((cc or (not dd)) xor ee) + X[13] + $6ed9eba1;
  209.   bb:= ((bb shl 5) or (bb shr (32-5))) + aa;
  210.   dd:= ((dd shl 10) or (dd shr (32-10)));
  211.   aa:= aa + ((bb or (not cc)) xor dd) + X[11] + $6ed9eba1;
  212.   aa:= ((aa shl 12) or (aa shr (32-12))) + ee;
  213.   cc:= ((cc shl 10) or (cc shr (32-10)));
  214.   ee:= ee + ((aa or (not bb)) xor cc) + X[ 5] + $6ed9eba1;
  215.   ee:= ((ee shl 7) or (ee shr (32-7))) + dd;
  216.   bb:= ((bb shl 10) or (bb shr (32-10)));
  217.   dd:= dd + ((ee or (not aa)) xor bb) + X[12] + $6ed9eba1;
  218.   dd:= ((dd shl 5) or (dd shr (32-5))) + cc;
  219.   aa:= ((aa shl 10) or (aa shr (32-10)));
  220.  
  221.   cc:= cc + ((dd and aa) or (ee and (not aa))) + X[ 1] + $8f1bbcdc;
  222.   cc:= ((cc shl 11) or (cc shr (32-11))) + bb;
  223.   ee:= ((ee shl 10) or (ee shr (32-10)));
  224.   bb:= bb + ((cc and ee) or (dd and (not ee))) + X[ 9] + $8f1bbcdc;
  225.   bb:= ((bb shl 12) or (bb shr (32-12))) + aa;
  226.   dd:= ((dd shl 10) or (dd shr (32-10)));
  227.   aa:= aa + ((bb and dd) or (cc and (not dd))) + X[11] + $8f1bbcdc;
  228.   aa:= ((aa shl 14) or (aa shr (32-14))) + ee;
  229.   cc:= ((cc shl 10) or (cc shr (32-10)));
  230.   ee:= ee + ((aa and cc) or (bb and (not cc))) + X[10] + $8f1bbcdc;
  231.   ee:= ((ee shl 15) or (ee shr (32-15))) + dd;
  232.   bb:= ((bb shl 10) or (bb shr (32-10)));
  233.   dd:= dd + ((ee and bb) or (aa and (not bb))) + X[ 0] + $8f1bbcdc;
  234.   dd:= ((dd shl 14) or (dd shr (32-14))) + cc;
  235.   aa:= ((aa shl 10) or (aa shr (32-10)));
  236.   cc:= cc + ((dd and aa) or (ee and (not aa))) + X[ 8] + $8f1bbcdc;
  237.   cc:= ((cc shl 15) or (cc shr (32-15))) + bb;
  238.   ee:= ((ee shl 10) or (ee shr (32-10)));
  239.   bb:= bb + ((cc and ee) or (dd and (not ee))) + X[12] + $8f1bbcdc;
  240.   bb:= ((bb shl 9) or (bb shr (32-9))) + aa;
  241.   dd:= ((dd shl 10) or (dd shr (32-10)));
  242.   aa:= aa + ((bb and dd) or (cc and (not dd))) + X[ 4] + $8f1bbcdc;
  243.   aa:= ((aa shl 8) or (aa shr (32-8))) + ee;
  244.   cc:= ((cc shl 10) or (cc shr (32-10)));
  245.   ee:= ee + ((aa and cc) or (bb and (not cc))) + X[13] + $8f1bbcdc;
  246.   ee:= ((ee shl 9) or (ee shr (32-9))) + dd;
  247.   bb:= ((bb shl 10) or (bb shr (32-10)));
  248.   dd:= dd + ((ee and bb) or (aa and (not bb))) + X[ 3] + $8f1bbcdc;
  249.   dd:= ((dd shl 14) or (dd shr (32-14))) + cc;
  250.   aa:= ((aa shl 10) or (aa shr (32-10)));
  251.   cc:= cc + ((dd and aa) or (ee and (not aa))) + X[ 7] + $8f1bbcdc;
  252.   cc:= ((cc shl 5) or (cc shr (32-5))) + bb;
  253.   ee:= ((ee shl 10) or (ee shr (32-10)));
  254.   bb:= bb + ((cc and ee) or (dd and (not ee))) + X[15] + $8f1bbcdc;
  255.   bb:= ((bb shl 6) or (bb shr (32-6))) + aa;
  256.   dd:= ((dd shl 10) or (dd shr (32-10)));
  257.   aa:= aa + ((bb and dd) or (cc and (not dd))) + X[14] + $8f1bbcdc;
  258.   aa:= ((aa shl 8) or (aa shr (32-8))) + ee;
  259.   cc:= ((cc shl 10) or (cc shr (32-10)));
  260.   ee:= ee + ((aa and cc) or (bb and (not cc))) + X[ 5] + $8f1bbcdc;
  261.   ee:= ((ee shl 6) or (ee shr (32-6))) + dd;
  262.   bb:= ((bb shl 10) or (bb shr (32-10)));
  263.   dd:= dd + ((ee and bb) or (aa and (not bb))) + X[ 6] + $8f1bbcdc;
  264.   dd:= ((dd shl 5) or (dd shr (32-5))) + cc;
  265.   aa:= ((aa shl 10) or (aa shr (32-10)));
  266.   cc:= cc + ((dd and aa) or (ee and (not aa))) + X[ 2] + $8f1bbcdc;
  267.   cc:= ((cc shl 12) or (cc shr (32-12))) + bb;
  268.   ee:= ((ee shl 10) or (ee shr (32-10)));
  269.  
  270.   bb:= bb + (cc xor (dd or (not ee))) + X[ 4] + $a953fd4e;
  271.   bb:= ((bb shl 9) or (bb shr (32-9))) + aa;
  272.   dd:= ((dd shl 10) or (dd shr (32-10)));
  273.   aa:= aa + (bb xor (cc or (not dd))) + X[ 0] + $a953fd4e;
  274.   aa:= ((aa shl 15) or (aa shr (32-15))) + ee;
  275.   cc:= ((cc shl 10) or (cc shr (32-10)));
  276.   ee:= ee + (aa xor (bb or (not cc))) + X[ 5] + $a953fd4e;
  277.   ee:= ((ee shl 5) or (ee shr (32-5))) + dd;
  278.   bb:= ((bb shl 10) or (bb shr (32-10)));
  279.   dd:= dd + (ee xor (aa or (not bb))) + X[ 9] + $a953fd4e;
  280.   dd:= ((dd shl 11) or (dd shr (32-11))) + cc;
  281.   aa:= ((aa shl 10) or (aa shr (32-10)));
  282.   cc:= cc + (dd xor (ee or (not aa))) + X[ 7] + $a953fd4e;
  283.   cc:= ((cc shl 6) or (cc shr (32-6))) + bb;
  284.   ee:= ((ee shl 10) or (ee shr (32-10)));
  285.   bb:= bb + (cc xor (dd or (not ee))) + X[12] + $a953fd4e;
  286.   bb:= ((bb shl 8) or (bb shr (32-8))) + aa;
  287.   dd:= ((dd shl 10) or (dd shr (32-10)));
  288.   aa:= aa + (bb xor (cc or (not dd))) + X[ 2] + $a953fd4e;
  289.   aa:= ((aa shl 13) or (aa shr (32-13))) + ee;
  290.   cc:= ((cc shl 10) or (cc shr (32-10)));
  291.   ee:= ee + (aa xor (bb or (not cc))) + X[10] + $a953fd4e;
  292.   ee:= ((ee shl 12) or (ee shr (32-12))) + dd;
  293.   bb:= ((bb shl 10) or (bb shr (32-10)));
  294.   dd:= dd + (ee xor (aa or (not bb))) + X[14] + $a953fd4e;
  295.   dd:= ((dd shl 5) or (dd shr (32-5))) + cc;
  296.   aa:= ((aa shl 10) or (aa shr (32-10)));
  297.   cc:= cc + (dd xor (ee or (not aa))) + X[ 1] + $a953fd4e;
  298.   cc:= ((cc shl 12) or (cc shr (32-12))) + bb;
  299.   ee:= ((ee shl 10) or (ee shr (32-10)));
  300.   bb:= bb + (cc xor (dd or (not ee))) + X[ 3] + $a953fd4e;
  301.   bb:= ((bb shl 13) or (bb shr (32-13))) + aa;
  302.   dd:= ((dd shl 10) or (dd shr (32-10)));
  303.   aa:= aa + (bb xor (cc or (not dd))) + X[ 8] + $a953fd4e;
  304.   aa:= ((aa shl 14) or (aa shr (32-14))) + ee;
  305.   cc:= ((cc shl 10) or (cc shr (32-10)));
  306.   ee:= ee + (aa xor (bb or (not cc))) + X[11] + $a953fd4e;
  307.   ee:= ((ee shl 11) or (ee shr (32-11))) + dd;
  308.   bb:= ((bb shl 10) or (bb shr (32-10)));
  309.   dd:= dd + (ee xor (aa or (not bb))) + X[ 6] + $a953fd4e;
  310.   dd:= ((dd shl 8) or (dd shr (32-8))) + cc;
  311.   aa:= ((aa shl 10) or (aa shr (32-10)));
  312.   cc:= cc + (dd xor (ee or (not aa))) + X[15] + $a953fd4e;
  313.   cc:= ((cc shl 5) or (cc shr (32-5))) + bb;
  314.   ee:= ((ee shl 10) or (ee shr (32-10)));
  315.   bb:= bb + (cc xor (dd or (not ee))) + X[13] + $a953fd4e;
  316.   bb:= ((bb shl 6) or (bb shr (32-6))) + aa;
  317.   dd:= ((dd shl 10) or (dd shr (32-10)));
  318.  
  319.   aaa:= aaa + (bbb xor (ccc or (not ddd))) + X[ 5] + $50a28be6;
  320.   aaa:= ((aaa shl 8) or (aaa shr (32-8))) + eee;
  321.   ccc:= ((ccc shl 10) or (ccc shr (32-10)));
  322.   eee:= eee + (aaa xor (bbb or (not ccc))) + X[14] + $50a28be6;
  323.   eee:= ((eee shl 9) or (eee shr (32-9))) + ddd;
  324.   bbb:= ((bbb shl 10) or (bbb shr (32-10)));
  325.   ddd:= ddd + (eee xor (aaa or (not bbb))) + X[ 7] + $50a28be6;
  326.   ddd:= ((ddd shl 9) or (ddd shr (32-9))) + ccc;
  327.   aaa:= ((aaa shl 10) or (aaa shr (32-10)));
  328.   ccc:= ccc + (ddd xor (eee or (not aaa))) + X[ 0] + $50a28be6;
  329.   ccc:= ((ccc shl 11) or (ccc shr (32-11))) + bbb;
  330.   eee:= ((eee shl 10) or (eee shr (32-10)));
  331.   bbb:= bbb + (ccc xor (ddd or (not eee))) + X[ 9] + $50a28be6;
  332.   bbb:= ((bbb shl 13) or (bbb shr (32-13))) + aaa;
  333.   ddd:= ((ddd shl 10) or (ddd shr (32-10)));
  334.   aaa:= aaa + (bbb xor (ccc or (not ddd))) + X[ 2] + $50a28be6;
  335.   aaa:= ((aaa shl 15) or (aaa shr (32-15))) + eee;
  336.   ccc:= ((ccc shl 10) or (ccc shr (32-10)));
  337.   eee:= eee + (aaa xor (bbb or (not ccc))) + X[11] + $50a28be6;
  338.   eee:= ((eee shl 15) or (eee shr (32-15))) + ddd;
  339.   bbb:= ((bbb shl 10) or (bbb shr (32-10)));
  340.   ddd:= ddd + (eee xor (aaa or (not bbb))) + X[ 4] + $50a28be6;
  341.   ddd:= ((ddd shl 5) or (ddd shr (32-5))) + ccc;
  342.   aaa:= ((aaa shl 10) or (aaa shr (32-10)));
  343.   ccc:= ccc + (ddd xor (eee or (not aaa))) + X[13] + $50a28be6;
  344.   ccc:= ((ccc shl 7) or (ccc shr (32-7))) + bbb;
  345.   eee:= ((eee shl 10) or (eee shr (32-10)));
  346.   bbb:= bbb + (ccc xor (ddd or (not eee))) + X[ 6] + $50a28be6;
  347.   bbb:= ((bbb shl 7) or (bbb shr (32-7))) + aaa;
  348.   ddd:= ((ddd shl 10) or (ddd shr (32-10)));
  349.   aaa:= aaa + (bbb xor (ccc or (not ddd))) + X[15] + $50a28be6;
  350.   aaa:= ((aaa shl 8) or (aaa shr (32-8))) + eee;
  351.   ccc:= ((ccc shl 10) or (ccc shr (32-10)));
  352.   eee:= eee + (aaa xor (bbb or (not ccc))) + X[ 8] + $50a28be6;
  353.   eee:= ((eee shl 11) or (eee shr (32-11))) + ddd;
  354.   bbb:= ((bbb shl 10) or (bbb shr (32-10)));
  355.   ddd:= ddd + (eee xor (aaa or (not bbb))) + X[ 1] + $50a28be6;
  356.   ddd:= ((ddd shl 14) or (ddd shr (32-14))) + ccc;
  357.   aaa:= ((aaa shl 10) or (aaa shr (32-10)));
  358.   ccc:= ccc + (ddd xor (eee or (not aaa))) + X[10] + $50a28be6;
  359.   ccc:= ((ccc shl 14) or (ccc shr (32-14))) + bbb;
  360.   eee:= ((eee shl 10) or (eee shr (32-10)));
  361.   bbb:= bbb + (ccc xor (ddd or (not eee))) + X[ 3] + $50a28be6;
  362.   bbb:= ((bbb shl 12) or (bbb shr (32-12))) + aaa;
  363.   ddd:= ((ddd shl 10) or (ddd shr (32-10)));
  364.   aaa:= aaa + (bbb xor (ccc or (not ddd))) + X[12] + $50a28be6;
  365.   aaa:= ((aaa shl 6) or (aaa shr (32-6))) + eee;
  366.   ccc:= ((ccc shl 10) or (ccc shr (32-10)));
  367.  
  368.   eee:= eee + ((aaa and ccc) or (bbb and (not ccc))) + X[ 6] + $5c4dd124;
  369.   eee:= ((eee shl 9) or (eee shr (32-9))) + ddd;
  370.   bbb:= ((bbb shl 10) or (bbb shr (32-10)));
  371.   ddd:= ddd + ((eee and bbb) or (aaa and (not bbb))) + X[11] + $5c4dd124;
  372.   ddd:= ((ddd shl 13) or (ddd shr (32-13))) + ccc;
  373.   aaa:= ((aaa shl 10) or (aaa shr (32-10)));
  374.   ccc:= ccc + ((ddd and aaa) or (eee and (not aaa))) + X[ 3] + $5c4dd124;
  375.   ccc:= ((ccc shl 15) or (ccc shr (32-15))) + bbb;
  376.   eee:= ((eee shl 10) or (eee shr (32-10)));
  377.   bbb:= bbb + ((ccc and eee) or (ddd and (not eee))) + X[ 7] + $5c4dd124;
  378.   bbb:= ((bbb shl 7) or (bbb shr (32-7))) + aaa;
  379.   ddd:= ((ddd shl 10) or (ddd shr (32-10)));
  380.   aaa:= aaa + ((bbb and ddd) or (ccc and (not ddd))) + X[ 0] + $5c4dd124;
  381.   aaa:= ((aaa shl 12) or (aaa shr (32-12))) + eee;
  382.   ccc:= ((ccc shl 10) or (ccc shr (32-10)));
  383.   eee:= eee + ((aaa and ccc) or (bbb and (not ccc))) + X[13] + $5c4dd124;
  384.   eee:= ((eee shl 8) or (eee shr (32-8))) + ddd;
  385.   bbb:= ((bbb shl 10) or (bbb shr (32-10)));
  386.   ddd:= ddd + ((eee and bbb) or (aaa and (not bbb))) + X[ 5] + $5c4dd124;
  387.   ddd:= ((ddd shl 9) or (ddd shr (32-9))) + ccc;
  388.   aaa:= ((aaa shl 10) or (aaa shr (32-10)));
  389.   ccc:= ccc + ((ddd and aaa) or (eee and (not aaa))) + X[10] + $5c4dd124;
  390.   ccc:= ((ccc shl 11) or (ccc shr (32-11))) + bbb;
  391.   eee:= ((eee shl 10) or (eee shr (32-10)));
  392.   bbb:= bbb + ((ccc and eee) or (ddd and (not eee))) + X[14] + $5c4dd124;
  393.   bbb:= ((bbb shl 7) or (bbb shr (32-7))) + aaa;
  394.   ddd:= ((ddd shl 10) or (ddd shr (32-10)));
  395.   aaa:= aaa + ((bbb and ddd) or (ccc and (not ddd))) + X[15] + $5c4dd124;
  396.   aaa:= ((aaa shl 7) or (aaa shr (32-7))) + eee;
  397.   ccc:= ((ccc shl 10) or (ccc shr (32-10)));
  398.   eee:= eee + ((aaa and ccc) or (bbb and (not ccc))) + X[ 8] + $5c4dd124;
  399.   eee:= ((eee shl 12) or (eee shr (32-12))) + ddd;
  400.   bbb:= ((bbb shl 10) or (bbb shr (32-10)));
  401.   ddd:= ddd + ((eee and bbb) or (aaa and (not bbb))) + X[12] + $5c4dd124;
  402.   ddd:= ((ddd shl 7) or (ddd shr (32-7))) + ccc;
  403.   aaa:= ((aaa shl 10) or (aaa shr (32-10)));
  404.   ccc:= ccc + ((ddd and aaa) or (eee and (not aaa))) + X[ 4] + $5c4dd124;
  405.   ccc:= ((ccc shl 6) or (ccc shr (32-6))) + bbb;
  406.   eee:= ((eee shl 10) or (eee shr (32-10)));
  407.   bbb:= bbb + ((ccc and eee) or (ddd and (not eee))) + X[ 9] + $5c4dd124;
  408.   bbb:= ((bbb shl 15) or (bbb shr (32-15))) + aaa;
  409.   ddd:= ((ddd shl 10) or (ddd shr (32-10)));
  410.   aaa:= aaa + ((bbb and ddd) or (ccc and (not ddd))) + X[ 1] + $5c4dd124;
  411.   aaa:= ((aaa shl 13) or (aaa shr (32-13))) + eee;
  412.   ccc:= ((ccc shl 10) or (ccc shr (32-10)));
  413.   eee:= eee + ((aaa and ccc) or (bbb and (not ccc))) + X[ 2] + $5c4dd124;
  414.   eee:= ((eee shl 11) or (eee shr (32-11))) + ddd;
  415.   bbb:= ((bbb shl 10) or (bbb shr (32-10)));
  416.  
  417.   ddd:= ddd + ((eee or (not aaa)) xor bbb) + X[15] + $6d703ef3;
  418.   ddd:= ((ddd shl 9) or (ddd shr (32-9))) + ccc;
  419.   aaa:= ((aaa shl 10) or (aaa shr (32-10)));
  420.   ccc:= ccc + ((ddd or (not eee)) xor aaa) + X[ 5] + $6d703ef3;
  421.   ccc:= ((ccc shl 7) or (ccc shr (32-7))) + bbb;
  422.   eee:= ((eee shl 10) or (eee shr (32-10)));
  423.   bbb:= bbb + ((ccc or (not ddd)) xor eee) + X[ 1] + $6d703ef3;
  424.   bbb:= ((bbb shl 15) or (bbb shr (32-15))) + aaa;
  425.   ddd:= ((ddd shl 10) or (ddd shr (32-10)));
  426.   aaa:= aaa + ((bbb or (not ccc)) xor ddd) + X[ 3] + $6d703ef3;
  427.   aaa:= ((aaa shl 11) or (aaa shr (32-11))) + eee;
  428.   ccc:= ((ccc shl 10) or (ccc shr (32-10)));
  429.   eee:= eee + ((aaa or (not bbb)) xor ccc) + X[ 7] + $6d703ef3;
  430.   eee:= ((eee shl 8) or (eee shr (32-8))) + ddd;
  431.   bbb:= ((bbb shl 10) or (bbb shr (32-10)));
  432.   ddd:= ddd + ((eee or (not aaa)) xor bbb) + X[14] + $6d703ef3;
  433.   ddd:= ((ddd shl 6) or (ddd shr (32-6))) + ccc;
  434.   aaa:= ((aaa shl 10) or (aaa shr (32-10)));
  435.   ccc:= ccc + ((ddd or (not eee)) xor aaa) + X[ 6] + $6d703ef3;
  436.   ccc:= ((ccc shl 6) or (ccc shr (32-6))) + bbb;
  437.   eee:= ((eee shl 10) or (eee shr (32-10)));
  438.   bbb:= bbb + ((ccc or (not ddd)) xor eee) + X[ 9] + $6d703ef3;
  439.   bbb:= ((bbb shl 14) or (bbb shr (32-14))) + aaa;
  440.   ddd:= ((ddd shl 10) or (ddd shr (32-10)));
  441.   aaa:= aaa + ((bbb or (not ccc)) xor ddd) + X[11] + $6d703ef3;
  442.   aaa:= ((aaa shl 12) or (aaa shr (32-12))) + eee;
  443.   ccc:= ((ccc shl 10) or (ccc shr (32-10)));
  444.   eee:= eee + ((aaa or (not bbb)) xor ccc) + X[ 8] + $6d703ef3;
  445.   eee:= ((eee shl 13) or (eee shr (32-13))) + ddd;
  446.   bbb:= ((bbb shl 10) or (bbb shr (32-10)));
  447.   ddd:= ddd + ((eee or (not aaa)) xor bbb) + X[12] + $6d703ef3;
  448.   ddd:= ((ddd shl 5) or (ddd shr (32-5))) + ccc;
  449.   aaa:= ((aaa shl 10) or (aaa shr (32-10)));
  450.   ccc:= ccc + ((ddd or (not eee)) xor aaa) + X[ 2] + $6d703ef3;
  451.   ccc:= ((ccc shl 14) or (ccc shr (32-14))) + bbb;
  452.   eee:= ((eee shl 10) or (eee shr (32-10)));
  453.   bbb:= bbb + ((ccc or (not ddd)) xor eee) + X[10] + $6d703ef3;
  454.   bbb:= ((bbb shl 13) or (bbb shr (32-13))) + aaa;
  455.   ddd:= ((ddd shl 10) or (ddd shr (32-10)));
  456.   aaa:= aaa + ((bbb or (not ccc)) xor ddd) + X[ 0] + $6d703ef3;
  457.   aaa:= ((aaa shl 13) or (aaa shr (32-13))) + eee;
  458.   ccc:= ((ccc shl 10) or (ccc shr (32-10)));
  459.   eee:= eee + ((aaa or (not bbb)) xor ccc) + X[ 4] + $6d703ef3;
  460.   eee:= ((eee shl 7) or (eee shr (32-7))) + ddd;
  461.   bbb:= ((bbb shl 10) or (bbb shr (32-10)));
  462.   ddd:= ddd + ((eee or (not aaa)) xor bbb) + X[13] + $6d703ef3;
  463.   ddd:= ((ddd shl 5) or (ddd shr (32-5))) + ccc;
  464.   aaa:= ((aaa shl 10) or (aaa shr (32-10)));
  465.  
  466.   ccc:= ccc + ((ddd and eee) or ((not ddd) and aaa)) + X[ 8] + $7a6d76e9;
  467.   ccc:= ((ccc shl 15) or (ccc shr (32-15))) + bbb;
  468.   eee:= ((eee shl 10) or (eee shr (32-10)));
  469.   bbb:= bbb + ((ccc and ddd) or ((not ccc) and eee)) + X[ 6] + $7a6d76e9;
  470.   bbb:= ((bbb shl 5) or (bbb shr (32-5))) + aaa;
  471.   ddd:= ((ddd shl 10) or (ddd shr (32-10)));
  472.   aaa:= aaa + ((bbb and ccc) or ((not bbb) and ddd)) + X[ 4] + $7a6d76e9;
  473.   aaa:= ((aaa shl 8) or (aaa shr (32-8))) + eee;
  474.   ccc:= ((ccc shl 10) or (ccc shr (32-10)));
  475.   eee:= eee + ((aaa and bbb) or ((not aaa) and ccc)) + X[ 1] + $7a6d76e9;
  476.   eee:= ((eee shl 11) or (eee shr (32-11))) + ddd;
  477.   bbb:= ((bbb shl 10) or (bbb shr (32-10)));
  478.   ddd:= ddd + ((eee and aaa) or ((not eee) and bbb)) + X[ 3] + $7a6d76e9;
  479.   ddd:= ((ddd shl 14) or (ddd shr (32-14))) + ccc;
  480.   aaa:= ((aaa shl 10) or (aaa shr (32-10)));
  481.   ccc:= ccc + ((ddd and eee) or ((not ddd) and aaa)) + X[11] + $7a6d76e9;
  482.   ccc:= ((ccc shl 14) or (ccc shr (32-14))) + bbb;
  483.   eee:= ((eee shl 10) or (eee shr (32-10)));
  484.   bbb:= bbb + ((ccc and ddd) or ((not ccc) and eee)) + X[15] + $7a6d76e9;
  485.   bbb:= ((bbb shl 6) or (bbb shr (32-6))) + aaa;
  486.   ddd:= ((ddd shl 10) or (ddd shr (32-10)));
  487.   aaa:= aaa + ((bbb and ccc) or ((not bbb) and ddd)) + X[ 0] + $7a6d76e9;
  488.   aaa:= ((aaa shl 14) or (aaa shr (32-14))) + eee;
  489.   ccc:= ((ccc shl 10) or (ccc shr (32-10)));
  490.   eee:= eee + ((aaa and bbb) or ((not aaa) and ccc)) + X[ 5] + $7a6d76e9;
  491.   eee:= ((eee shl 6) or (eee shr (32-6))) + ddd;
  492.   bbb:= ((bbb shl 10) or (bbb shr (32-10)));
  493.   ddd:= ddd + ((eee and aaa) or ((not eee) and bbb)) + X[12] + $7a6d76e9;
  494.   ddd:= ((ddd shl 9) or (ddd shr (32-9))) + ccc;
  495.   aaa:= ((aaa shl 10) or (aaa shr (32-10)));
  496.   ccc:= ccc + ((ddd and eee) or ((not ddd) and aaa)) + X[ 2] + $7a6d76e9;
  497.   ccc:= ((ccc shl 12) or (ccc shr (32-12))) + bbb;
  498.   eee:= ((eee shl 10) or (eee shr (32-10)));
  499.   bbb:= bbb + ((ccc and ddd) or ((not ccc) and eee)) + X[13] + $7a6d76e9;
  500.   bbb:= ((bbb shl 9) or (bbb shr (32-9))) + aaa;
  501.   ddd:= ((ddd shl 10) or (ddd shr (32-10)));
  502.   aaa:= aaa + ((bbb and ccc) or ((not bbb) and ddd)) + X[ 9] + $7a6d76e9;
  503.   aaa:= ((aaa shl 12) or (aaa shr (32-12))) + eee;
  504.   ccc:= ((ccc shl 10) or (ccc shr (32-10)));
  505.   eee:= eee + ((aaa and bbb) or ((not aaa) and ccc)) + X[ 7] + $7a6d76e9;
  506.   eee:= ((eee shl 5) or (eee shr (32-5))) + ddd;
  507.   bbb:= ((bbb shl 10) or (bbb shr (32-10)));
  508.   ddd:= ddd + ((eee and aaa) or ((not eee) and bbb)) + X[10] + $7a6d76e9;
  509.   ddd:= ((ddd shl 15) or (ddd shr (32-15))) + ccc;
  510.   aaa:= ((aaa shl 10) or (aaa shr (32-10)));
  511.   ccc:= ccc + ((ddd and eee) or ((not ddd) and aaa)) + X[14] + $7a6d76e9;
  512.   ccc:= ((ccc shl 8) or (ccc shr (32-8))) + bbb;
  513.   eee:= ((eee shl 10) or (eee shr (32-10)));
  514.  
  515.   bbb:= bbb + (ccc xor ddd xor eee) + X[12];
  516.   bbb:= ((bbb shl 8) or (bbb shr (32-8))) + aaa;
  517.   ddd:= ((ddd shl 10) or (ddd shr (32-10)));
  518.   aaa:= aaa + (bbb xor ccc xor ddd) + X[15];
  519.   aaa:= ((aaa shl 5) or (aaa shr (32-5))) + eee;
  520.   ccc:= ((ccc shl 10) or (ccc shr (32-10)));
  521.   eee:= eee + (aaa xor bbb xor ccc) + X[10];
  522.   eee:= ((eee shl 12) or (eee shr (32-12))) + ddd;
  523.   bbb:= ((bbb shl 10) or (bbb shr (32-10)));
  524.   ddd:= ddd + (eee xor aaa xor bbb) + X[ 4];
  525.   ddd:= ((ddd shl 9) or (ddd shr (32-9))) + ccc;
  526.   aaa:= ((aaa shl 10) or (aaa shr (32-10)));
  527.   ccc:= ccc + (ddd xor eee xor aaa) + X[ 1];
  528.   ccc:= ((ccc shl 12) or (ccc shr (32-12))) + bbb;
  529.   eee:= ((eee shl 10) or (eee shr (32-10)));
  530.   bbb:= bbb + (ccc xor ddd xor eee) + X[ 5];
  531.   bbb:= ((bbb shl 5) or (bbb shr (32-5))) + aaa;
  532.   ddd:= ((ddd shl 10) or (ddd shr (32-10)));
  533.   aaa:= aaa + (bbb xor ccc xor ddd) + X[ 8];
  534.   aaa:= ((aaa shl 14) or (aaa shr (32-14))) + eee;
  535.   ccc:= ((ccc shl 10) or (ccc shr (32-10)));
  536.   eee:= eee + (aaa xor bbb xor ccc) + X[ 7];
  537.   eee:= ((eee shl 6) or (eee shr (32-6))) + ddd;
  538.   bbb:= ((bbb shl 10) or (bbb shr (32-10)));
  539.   ddd:= ddd + (eee xor aaa xor bbb) + X[ 6];
  540.   ddd:= ((ddd shl 8) or (ddd shr (32-8))) + ccc;
  541.   aaa:= ((aaa shl 10) or (aaa shr (32-10)));
  542.   ccc:= ccc + (ddd xor eee xor aaa) + X[ 2];
  543.   ccc:= ((ccc shl 13) or (ccc shr (32-13))) + bbb;
  544.   eee:= ((eee shl 10) or (eee shr (32-10)));
  545.   bbb:= bbb + (ccc xor ddd xor eee) + X[13];
  546.   bbb:= ((bbb shl 6) or (bbb shr (32-6))) + aaa;
  547.   ddd:= ((ddd shl 10) or (ddd shr (32-10)));
  548.   aaa:= aaa + (bbb xor ccc xor ddd) + X[14];
  549.   aaa:= ((aaa shl 5) or (aaa shr (32-5))) + eee;
  550.   ccc:= ((ccc shl 10) or (ccc shr (32-10)));
  551.   eee:= eee + (aaa xor bbb xor ccc) + X[ 0];
  552.   eee:= ((eee shl 15) or (eee shr (32-15))) + ddd;
  553.   bbb:= ((bbb shl 10) or (bbb shr (32-10)));
  554.   ddd:= ddd + (eee xor aaa xor bbb) + X[ 3];
  555.   ddd:= ((ddd shl 13) or (ddd shr (32-13))) + ccc;
  556.   aaa:= ((aaa shl 10) or (aaa shr (32-10)));
  557.   ccc:= ccc + (ddd xor eee xor aaa) + X[ 9];
  558.   ccc:= ((ccc shl 11) or (ccc shr (32-11))) + bbb;
  559.   eee:= ((eee shl 10) or (eee shr (32-10)));
  560.   bbb:= bbb + (ccc xor ddd xor eee) + X[11];
  561.   bbb:= ((bbb shl 11) or (bbb shr (32-11))) + aaa;
  562.   ddd:= ((ddd shl 10) or (ddd shr (32-10)));
  563.  
  564.   ddd:= ddd + cc + CurrentHash[1];
  565.   CurrentHash[1]:= CurrentHash[2] + dd + eee;
  566.   CurrentHash[2]:= CurrentHash[3] + ee + aaa;
  567.   CurrentHash[3]:= CurrentHash[4] + aa + bbb;
  568.   CurrentHash[4]:= CurrentHash[0] + bb + ccc;
  569.   CurrentHash[0]:= ddd;
  570.   FillChar(X,Sizeof(X),0);
  571.   Index:= 0;
  572.   FillChar(HashBuffer,Sizeof(HashBuffer),0);
  573. end;
  574.  
  575. class function TDCP_ripemd160.GetHashSize: integer;
  576. begin
  577.   Result:= 160;
  578. end;
  579.  
  580. class function TDCP_ripemd160.GetId: integer;
  581. begin
  582.   Result:= DCP_ripemd160;
  583. end;
  584.  
  585. class function TDCP_ripemd160.GetAlgorithm: string;
  586. begin
  587.   Result:= 'RipeMD-160';
  588. end;
  589.  
  590. class function TDCP_ripemd160.SelfTest: boolean;
  591. const
  592.   Test1Out: array[0..19] of byte=
  593.     ($0B,$DC,$9D,$2D,$25,$6B,$3E,$E9,$DA,$AE,$34,$7B,$E6,$F4,$DC,$83,$5A,$46,$7F,$FE);
  594.   Test2Out: array[0..19] of byte=
  595.     ($F7,$1C,$27,$10,$9C,$69,$2C,$1B,$56,$BB,$DC,$EB,$5B,$9D,$28,$65,$B3,$70,$8D,$BC);
  596. var
  597.   TestHash: TDCP_ripemd160;
  598.   TestOut: array[0..19] of byte;
  599. begin
  600.   TestHash:= TDCP_ripemd160.Create(nil);
  601.   TestHash.Init;
  602.   TestHash.UpdateStr('a');
  603.   TestHash.Final(TestOut);
  604.   Result:= CompareMem(@TestOut,@Test1Out,Sizeof(Test1Out));
  605.   TestHash.Init;
  606.   TestHash.UpdateStr('abcdefghijklmnopqrstuvwxyz');
  607.   TestHash.Final(TestOut);
  608.   Result:= CompareMem(@TestOut,@Test2Out,Sizeof(Test2Out)) and Result;
  609.   TestHash.Free;
  610. end;
  611.  
  612. procedure TDCP_ripemd160.Init;
  613. begin
  614.   Burn;
  615.   CurrentHash[0]:= $67452301;
  616.   CurrentHash[1]:= $efcdab89;
  617.   CurrentHash[2]:= $98badcfe;
  618.   CurrentHash[3]:= $10325476;
  619.   CurrentHash[4]:= $c3d2e1f0;
  620.   fInitialized:= true;
  621. end;
  622.  
  623. procedure TDCP_ripemd160.Burn;
  624. begin
  625.   LenHi:= 0; LenLo:= 0;
  626.   Index:= 0;
  627.   FillChar(HashBuffer,Sizeof(HashBuffer),0);
  628.   FillChar(CurrentHash,Sizeof(CurrentHash),0);
  629.   fInitialized:= false;
  630. end;
  631.  
  632. procedure TDCP_ripemd160.Update(const Buffer; Size: longword);
  633. var
  634.   PBuf: ^byte;
  635. begin
  636.   if not fInitialized then
  637.     raise EDCP_hash.Create('Hash not initialized');
  638.  
  639.   Inc(LenHi,Size shr 29);
  640.   Inc(LenLo,Size*8);
  641.   if LenLo< (Size*8) then
  642.     Inc(LenHi);
  643.  
  644.   PBuf:= @Buffer;
  645.   while Size> 0 do
  646.   begin
  647.     if (Sizeof(HashBuffer)-Index)<= DWord(Size) then
  648.     begin
  649.       Move(PBuf^,HashBuffer[Index],Sizeof(HashBuffer)-Index);
  650.       Dec(Size,Sizeof(HashBuffer)-Index);
  651.       Inc(PBuf,Sizeof(HashBuffer)-Index);
  652.       Compress;
  653.     end
  654.     else
  655.     begin
  656.       Move(PBuf^,HashBuffer[Index],Size);
  657.       Inc(Index,Size);
  658.       Size:= 0;
  659.     end;
  660.   end;
  661. end;
  662.  
  663. procedure TDCP_ripemd160.Final(var Digest);
  664. begin
  665.   if not fInitialized then
  666.     raise EDCP_hash.Create('Hash not initialized');
  667.   HashBuffer[Index]:= $80;
  668.   if Index>= 56 then
  669.     Compress;
  670.   PDWord(@HashBuffer[56])^:= LenLo;
  671.   PDWord(@HashBuffer[60])^:= LenHi;
  672.   Compress;
  673.   Move(CurrentHash,Digest,Sizeof(CurrentHash));
  674.   Burn;
  675. end;
  676.  
  677.  
  678. end.
  679.