Browse Source

Add AESPRNGRandom CSPRNG

- removed PCGRandomMinimal since this is not a CSPRNG
- Add AESPRNGRandom CSPRNG
- some minor refactorings.
Ugochukwu Mmaduekwe 6 years ago
parent
commit
0e96dede8f

+ 1 - 1
CryptoLib.Samples/Delphi.Samples/UsageSamples.dpr

@@ -81,7 +81,6 @@ uses
   ClpDigestUtilities in '..\..\CryptoLib\src\Security\ClpDigestUtilities.pas',
   ClpDigestUtilities in '..\..\CryptoLib\src\Security\ClpDigestUtilities.pas',
   ClpRandom in '..\..\CryptoLib\src\Security\ClpRandom.pas',
   ClpRandom in '..\..\CryptoLib\src\Security\ClpRandom.pas',
   ClpSecureRandom in '..\..\CryptoLib\src\Security\ClpSecureRandom.pas',
   ClpSecureRandom in '..\..\CryptoLib\src\Security\ClpSecureRandom.pas',
-  ClpPcgRandomMinimal in '..\..\CryptoLib\src\Utils\Randoms\ClpPcgRandomMinimal.pas',
   ClpRandomNumberGenerator in '..\..\CryptoLib\src\Utils\Rng\ClpRandomNumberGenerator.pas',
   ClpRandomNumberGenerator in '..\..\CryptoLib\src\Utils\Rng\ClpRandomNumberGenerator.pas',
   ClpArrayUtils in '..\..\CryptoLib\src\Utils\ClpArrayUtils.pas',
   ClpArrayUtils in '..\..\CryptoLib\src\Utils\ClpArrayUtils.pas',
   ClpBitConverter in '..\..\CryptoLib\src\Utils\ClpBitConverter.pas',
   ClpBitConverter in '..\..\CryptoLib\src\Utils\ClpBitConverter.pas',
@@ -374,6 +373,7 @@ uses
   ClpIDHValidationParameters in '..\..\CryptoLib\src\Interfaces\ClpIDHValidationParameters.pas',
   ClpIDHValidationParameters in '..\..\CryptoLib\src\Interfaces\ClpIDHValidationParameters.pas',
   ClpIDHDomainParameters in '..\..\CryptoLib\src\Interfaces\ClpIDHDomainParameters.pas',
   ClpIDHDomainParameters in '..\..\CryptoLib\src\Interfaces\ClpIDHDomainParameters.pas',
   ClpIDHValidationParams in '..\..\CryptoLib\src\Interfaces\ClpIDHValidationParams.pas',
   ClpIDHValidationParams in '..\..\CryptoLib\src\Interfaces\ClpIDHValidationParams.pas',
+  ClpAESPRNGRandom in '..\..\CryptoLib\src\Utils\Randoms\ClpAESPRNGRandom.pas',
   UsageExamples in '..\src\UsageExamples.pas';
   UsageExamples in '..\src\UsageExamples.pas';
 
 
 begin
 begin

+ 1 - 1
CryptoLib.Tests/Delphi.Tests/CryptoLib.Tests.TestInsight.dpr

@@ -91,7 +91,6 @@ uses
   ClpDigestUtilities in '..\..\CryptoLib\src\Security\ClpDigestUtilities.pas',
   ClpDigestUtilities in '..\..\CryptoLib\src\Security\ClpDigestUtilities.pas',
   ClpRandom in '..\..\CryptoLib\src\Security\ClpRandom.pas',
   ClpRandom in '..\..\CryptoLib\src\Security\ClpRandom.pas',
   ClpSecureRandom in '..\..\CryptoLib\src\Security\ClpSecureRandom.pas',
   ClpSecureRandom in '..\..\CryptoLib\src\Security\ClpSecureRandom.pas',
-  ClpPcgRandomMinimal in '..\..\CryptoLib\src\Utils\Randoms\ClpPcgRandomMinimal.pas',
   ClpRandomNumberGenerator in '..\..\CryptoLib\src\Utils\Rng\ClpRandomNumberGenerator.pas',
   ClpRandomNumberGenerator in '..\..\CryptoLib\src\Utils\Rng\ClpRandomNumberGenerator.pas',
   ClpArrayUtils in '..\..\CryptoLib\src\Utils\ClpArrayUtils.pas',
   ClpArrayUtils in '..\..\CryptoLib\src\Utils\ClpArrayUtils.pas',
   ClpBitConverter in '..\..\CryptoLib\src\Utils\ClpBitConverter.pas',
   ClpBitConverter in '..\..\CryptoLib\src\Utils\ClpBitConverter.pas',
@@ -384,6 +383,7 @@ uses
   ClpDHBasicAgreement in '..\..\CryptoLib\src\Crypto\Agreement\ClpDHBasicAgreement.pas',
   ClpDHBasicAgreement in '..\..\CryptoLib\src\Crypto\Agreement\ClpDHBasicAgreement.pas',
   ClpIDHAgreement in '..\..\CryptoLib\src\Interfaces\ClpIDHAgreement.pas',
   ClpIDHAgreement in '..\..\CryptoLib\src\Interfaces\ClpIDHAgreement.pas',
   ClpDHAgreement in '..\..\CryptoLib\src\Crypto\Agreement\ClpDHAgreement.pas',
   ClpDHAgreement in '..\..\CryptoLib\src\Crypto\Agreement\ClpDHAgreement.pas',
+  ClpAESPRNGRandom in '..\..\CryptoLib\src\Utils\Randoms\ClpAESPRNGRandom.pas',
   ClpFixedSecureRandom in '..\src\Utils\ClpFixedSecureRandom.pas',
   ClpFixedSecureRandom in '..\src\Utils\ClpFixedSecureRandom.pas',
   ClpIFixedSecureRandom in '..\src\Utils\ClpIFixedSecureRandom.pas',
   ClpIFixedSecureRandom in '..\src\Utils\ClpIFixedSecureRandom.pas',
   ClpIShortenedDigest in '..\src\Utils\ClpIShortenedDigest.pas',
   ClpIShortenedDigest in '..\src\Utils\ClpIShortenedDigest.pas',

+ 1 - 1
CryptoLib.Tests/Delphi.Tests/CryptoLib.Tests.dpr

@@ -94,7 +94,6 @@ uses
   ClpDigestUtilities in '..\..\CryptoLib\src\Security\ClpDigestUtilities.pas',
   ClpDigestUtilities in '..\..\CryptoLib\src\Security\ClpDigestUtilities.pas',
   ClpRandom in '..\..\CryptoLib\src\Security\ClpRandom.pas',
   ClpRandom in '..\..\CryptoLib\src\Security\ClpRandom.pas',
   ClpSecureRandom in '..\..\CryptoLib\src\Security\ClpSecureRandom.pas',
   ClpSecureRandom in '..\..\CryptoLib\src\Security\ClpSecureRandom.pas',
-  ClpPcgRandomMinimal in '..\..\CryptoLib\src\Utils\Randoms\ClpPcgRandomMinimal.pas',
   ClpRandomNumberGenerator in '..\..\CryptoLib\src\Utils\Rng\ClpRandomNumberGenerator.pas',
   ClpRandomNumberGenerator in '..\..\CryptoLib\src\Utils\Rng\ClpRandomNumberGenerator.pas',
   ClpArrayUtils in '..\..\CryptoLib\src\Utils\ClpArrayUtils.pas',
   ClpArrayUtils in '..\..\CryptoLib\src\Utils\ClpArrayUtils.pas',
   ClpBitConverter in '..\..\CryptoLib\src\Utils\ClpBitConverter.pas',
   ClpBitConverter in '..\..\CryptoLib\src\Utils\ClpBitConverter.pas',
@@ -387,6 +386,7 @@ uses
   ClpDHBasicAgreement in '..\..\CryptoLib\src\Crypto\Agreement\ClpDHBasicAgreement.pas',
   ClpDHBasicAgreement in '..\..\CryptoLib\src\Crypto\Agreement\ClpDHBasicAgreement.pas',
   ClpIDHAgreement in '..\..\CryptoLib\src\Interfaces\ClpIDHAgreement.pas',
   ClpIDHAgreement in '..\..\CryptoLib\src\Interfaces\ClpIDHAgreement.pas',
   ClpDHAgreement in '..\..\CryptoLib\src\Crypto\Agreement\ClpDHAgreement.pas',
   ClpDHAgreement in '..\..\CryptoLib\src\Crypto\Agreement\ClpDHAgreement.pas',
+  ClpAESPRNGRandom in '..\..\CryptoLib\src\Utils\Randoms\ClpAESPRNGRandom.pas',
   ClpFixedSecureRandom in '..\src\Utils\ClpFixedSecureRandom.pas',
   ClpFixedSecureRandom in '..\src\Utils\ClpFixedSecureRandom.pas',
   ClpIFixedSecureRandom in '..\src\Utils\ClpIFixedSecureRandom.pas',
   ClpIFixedSecureRandom in '..\src\Utils\ClpIFixedSecureRandom.pas',
   ClpIShortenedDigest in '..\src\Utils\ClpIShortenedDigest.pas',
   ClpIShortenedDigest in '..\src\Utils\ClpIShortenedDigest.pas',

+ 65 - 0
CryptoLib.Tests/src/Security/SecureRandomTests.pas

@@ -32,8 +32,10 @@ uses
 {$ELSE}
 {$ELSE}
   TestFramework,
   TestFramework,
 {$ENDIF FPC}
 {$ENDIF FPC}
+  ClpAESPRNGRandom,
   ClpSecureRandom,
   ClpSecureRandom,
   ClpISecureRandom,
   ClpISecureRandom,
+  ClpRandomNumberGenerator,
   ClpCryptoApiRandomGenerator,
   ClpCryptoApiRandomGenerator,
   ClpICryptoApiRandomGenerator,
   ClpICryptoApiRandomGenerator,
   ClpCryptoLibTypes,
   ClpCryptoLibTypes,
@@ -54,6 +56,9 @@ type
     procedure TearDown; override;
     procedure TearDown; override;
   published
   published
     procedure TestCryptoApi();
     procedure TestCryptoApi();
+    procedure TestOSRandom();
+    procedure TestAESPRNG();
+    procedure TestAESPRNGRandom();
     procedure TestDefault();
     procedure TestDefault();
     procedure TestSha1Prng();
     procedure TestSha1Prng();
     procedure TestSha256Prng();
     procedure TestSha256Prng();
@@ -189,6 +194,66 @@ begin
 
 
 end;
 end;
 
 
+procedure TTestSecureRandom.TestOSRandom;
+var
+  &random: ISecureRandom;
+begin
+  random := TSecureRandom.Create(TCryptoApiRandomGenerator.Create
+    (TRandomNumberGenerator.CreateRNG
+    (TRandomNumberGenerator.TRandomNumberGeneratorMode.rngmOS))
+    as ICryptoApiRandomGenerator);
+
+  CheckSecureRandom(random);
+end;
+
+procedure TTestSecureRandom.TestAESPRNG;
+var
+  &random: ISecureRandom;
+begin
+  random := TSecureRandom.Create(TCryptoApiRandomGenerator.Create
+    (TRandomNumberGenerator.CreateRNG
+    (TRandomNumberGenerator.TRandomNumberGeneratorMode.rngmAES))
+    as ICryptoApiRandomGenerator);
+
+  CheckSecureRandom(random);
+end;
+
+procedure TTestSecureRandom.TestAESPRNGRandom;
+var
+  b1, b2, NilBytes: TBytes;
+  a1, a2: IAESPRNGRandom;
+  Idx: Int32;
+begin
+  // it is hard to validate randomness - we just test the feature set
+  System.SetLength(b1, 16);
+  System.SetLength(b2, 16);
+  NilBytes := Nil;
+  TAESPRNGRandom.GetBytes(b1);
+  TAESPRNGRandom.GetBytes(b2);
+
+  CheckTrue(not AreEqual(b1, b2));
+
+  a1 := TAESPRNGRandom.Create();
+  a2 := TAESPRNGRandom.Create();
+
+  a1.FillBytes(b1);
+  a2.FillBytes(b2);
+  CheckTrue(not AreEqual(b1, b2));
+  a1.FillBytes(NilBytes);
+  CheckEquals(System.Length(NilBytes), 0);
+
+  for Idx := 1 to 10000 do
+  begin
+    System.SetLength(b1, Idx);
+    System.SetLength(b2, Idx);
+    a1.FillBytes(b1);
+    a2.FillBytes(b2);
+
+    CheckTrue(not AreEqual(b1, b2));
+  end;
+
+end;
+
 procedure TTestSecureRandom.TestCryptoApi;
 procedure TTestSecureRandom.TestCryptoApi;
 var
 var
   &random: ISecureRandom;
   &random: ISecureRandom;

+ 6 - 0
CryptoLib/src/Interfaces/ClpIRandomNumberGenerator.pas

@@ -46,6 +46,12 @@ type
 
 
   end;
   end;
 
 
+type
+  IAESPRNGRandomNumberGenerator = interface(IRandomNumberGenerator)
+    ['{9E0D8D8F-D9D4-42D6-9D55-36271293B59E}']
+
+  end;
+
 implementation
 implementation
 
 
 end.
 end.

+ 2 - 2
CryptoLib/src/Packages/Delphi/CryptoLib4PascalPackage.dpk

@@ -344,7 +344,6 @@ contains
   ClpIWNafPreCompInfo in '..\..\Interfaces\ClpIWNafPreCompInfo.pas',
   ClpIWNafPreCompInfo in '..\..\Interfaces\ClpIWNafPreCompInfo.pas',
   ClpIX9ECParametersHolder in '..\..\Interfaces\ClpIX9ECParametersHolder.pas',
   ClpIX9ECParametersHolder in '..\..\Interfaces\ClpIX9ECParametersHolder.pas',
   ClpParametersWithRandom in '..\..\Crypto\Parameters\ClpParametersWithRandom.pas',
   ClpParametersWithRandom in '..\..\Crypto\Parameters\ClpParametersWithRandom.pas',
-  ClpPcgRandomMinimal in '..\..\Utils\Randoms\ClpPcgRandomMinimal.pas',
   ClpRandomDsaKCalculator in '..\..\Crypto\Signers\ClpRandomDsaKCalculator.pas',
   ClpRandomDsaKCalculator in '..\..\Crypto\Signers\ClpRandomDsaKCalculator.pas',
   ClpScaleXPointMap in '..\..\Math\EC\ClpScaleXPointMap.pas',
   ClpScaleXPointMap in '..\..\Math\EC\ClpScaleXPointMap.pas',
   ClpTimes in '..\..\Utils\ClpTimes.pas',
   ClpTimes in '..\..\Utils\ClpTimes.pas',
@@ -402,6 +401,7 @@ contains
   ClpIDHKeyParameters in '..\..\Interfaces\ClpIDHKeyParameters.pas',
   ClpIDHKeyParameters in '..\..\Interfaces\ClpIDHKeyParameters.pas',
   ClpIDHValidationParameters in '..\..\Interfaces\ClpIDHValidationParameters.pas',
   ClpIDHValidationParameters in '..\..\Interfaces\ClpIDHValidationParameters.pas',
   ClpIDHDomainParameters in '..\..\Interfaces\ClpIDHDomainParameters.pas',
   ClpIDHDomainParameters in '..\..\Interfaces\ClpIDHDomainParameters.pas',
-  ClpIDHValidationParams in '..\..\Interfaces\ClpIDHValidationParams.pas';
+  ClpIDHValidationParams in '..\..\Interfaces\ClpIDHValidationParams.pas',
+  ClpAESPRNGRandom in '..\..\Utils\Randoms\ClpAESPRNGRandom.pas';
 
 
 end.
 end.

+ 510 - 510
CryptoLib/src/Packages/FPC/CryptoLib4PascalPackage.lpk

@@ -487,1026 +487,1026 @@ Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring the devel
         <UnitName Value="ClpOSRandom"/>
         <UnitName Value="ClpOSRandom"/>
       </Item115>
       </Item115>
       <Item116>
       <Item116>
-        <Filename Value="..\..\Utils\Randoms\ClpPcgRandomMinimal.pas"/>
-        <UnitName Value="ClpPcgRandomMinimal"/>
-      </Item116>
-      <Item117>
         <Filename Value="..\..\Utils\Rng\ClpRandomNumberGenerator.pas"/>
         <Filename Value="..\..\Utils\Rng\ClpRandomNumberGenerator.pas"/>
         <UnitName Value="ClpRandomNumberGenerator"/>
         <UnitName Value="ClpRandomNumberGenerator"/>
-      </Item117>
-      <Item118>
+      </Item116>
+      <Item117>
         <Filename Value="..\..\Utils\ClpSetWeakRef.pas"/>
         <Filename Value="..\..\Utils\ClpSetWeakRef.pas"/>
         <UnitName Value="ClpSetWeakRef"/>
         <UnitName Value="ClpSetWeakRef"/>
-      </Item118>
-      <Item119>
+      </Item117>
+      <Item118>
         <Filename Value="..\..\Security\ClpParameterUtilities.pas"/>
         <Filename Value="..\..\Security\ClpParameterUtilities.pas"/>
         <UnitName Value="ClpParameterUtilities"/>
         <UnitName Value="ClpParameterUtilities"/>
-      </Item119>
-      <Item120>
+      </Item118>
+      <Item119>
         <Filename Value="..\..\Security\ClpGeneratorUtilities.pas"/>
         <Filename Value="..\..\Security\ClpGeneratorUtilities.pas"/>
         <UnitName Value="ClpGeneratorUtilities"/>
         <UnitName Value="ClpGeneratorUtilities"/>
-      </Item120>
-      <Item121>
+      </Item119>
+      <Item120>
         <Filename Value="..\..\Security\ClpCipherUtilities.pas"/>
         <Filename Value="..\..\Security\ClpCipherUtilities.pas"/>
         <UnitName Value="ClpCipherUtilities"/>
         <UnitName Value="ClpCipherUtilities"/>
-      </Item121>
-      <Item122>
+      </Item120>
+      <Item121>
         <Filename Value="..\..\Interfaces\ClpIAesEngine.pas"/>
         <Filename Value="..\..\Interfaces\ClpIAesEngine.pas"/>
         <UnitName Value="ClpIAesEngine"/>
         <UnitName Value="ClpIAesEngine"/>
-      </Item122>
-      <Item123>
+      </Item121>
+      <Item122>
         <Filename Value="..\..\Interfaces\ClpIParametersWithIV.pas"/>
         <Filename Value="..\..\Interfaces\ClpIParametersWithIV.pas"/>
         <UnitName Value="ClpIParametersWithIV"/>
         <UnitName Value="ClpIParametersWithIV"/>
-      </Item123>
-      <Item124>
+      </Item122>
+      <Item123>
         <Filename Value="..\..\Interfaces\ClpIPaddedBufferedBlockCipher.pas"/>
         <Filename Value="..\..\Interfaces\ClpIPaddedBufferedBlockCipher.pas"/>
         <UnitName Value="ClpIPaddedBufferedBlockCipher"/>
         <UnitName Value="ClpIPaddedBufferedBlockCipher"/>
-      </Item124>
-      <Item125>
+      </Item123>
+      <Item124>
         <Filename Value="..\..\Interfaces\ClpIKeyParameter.pas"/>
         <Filename Value="..\..\Interfaces\ClpIKeyParameter.pas"/>
         <UnitName Value="ClpIKeyParameter"/>
         <UnitName Value="ClpIKeyParameter"/>
-      </Item125>
-      <Item126>
+      </Item124>
+      <Item125>
         <Filename Value="..\..\Interfaces\ClpIBufferedCipherBase.pas"/>
         <Filename Value="..\..\Interfaces\ClpIBufferedCipherBase.pas"/>
         <UnitName Value="ClpIBufferedCipherBase"/>
         <UnitName Value="ClpIBufferedCipherBase"/>
-      </Item126>
-      <Item127>
+      </Item125>
+      <Item126>
         <Filename Value="..\..\Interfaces\ClpIBufferedCipher.pas"/>
         <Filename Value="..\..\Interfaces\ClpIBufferedCipher.pas"/>
         <UnitName Value="ClpIBufferedCipher"/>
         <UnitName Value="ClpIBufferedCipher"/>
-      </Item127>
-      <Item128>
+      </Item126>
+      <Item127>
         <Filename Value="..\..\Interfaces\ClpIBufferedBlockCipher.pas"/>
         <Filename Value="..\..\Interfaces\ClpIBufferedBlockCipher.pas"/>
         <UnitName Value="ClpIBufferedBlockCipher"/>
         <UnitName Value="ClpIBufferedBlockCipher"/>
-      </Item128>
-      <Item129>
+      </Item127>
+      <Item128>
         <Filename Value="..\..\Interfaces\ClpIBlockCipherPadding.pas"/>
         <Filename Value="..\..\Interfaces\ClpIBlockCipherPadding.pas"/>
         <UnitName Value="ClpIBlockCipherPadding"/>
         <UnitName Value="ClpIBlockCipherPadding"/>
-      </Item129>
-      <Item130>
+      </Item128>
+      <Item129>
         <Filename Value="..\..\Interfaces\ClpIBlockCipher.pas"/>
         <Filename Value="..\..\Interfaces\ClpIBlockCipher.pas"/>
         <UnitName Value="ClpIBlockCipher"/>
         <UnitName Value="ClpIBlockCipher"/>
-      </Item130>
-      <Item131>
+      </Item129>
+      <Item130>
         <Filename Value="..\..\Crypto\Paddings\ClpPaddedBufferedBlockCipher.pas"/>
         <Filename Value="..\..\Crypto\Paddings\ClpPaddedBufferedBlockCipher.pas"/>
         <UnitName Value="ClpPaddedBufferedBlockCipher"/>
         <UnitName Value="ClpPaddedBufferedBlockCipher"/>
-      </Item131>
-      <Item132>
+      </Item130>
+      <Item131>
         <Filename Value="..\..\Crypto\Parameters\ClpParametersWithIV.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpParametersWithIV.pas"/>
         <UnitName Value="ClpParametersWithIV"/>
         <UnitName Value="ClpParametersWithIV"/>
-      </Item132>
-      <Item133>
+      </Item131>
+      <Item132>
         <Filename Value="..\..\Crypto\Parameters\ClpKeyParameter.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpKeyParameter.pas"/>
         <UnitName Value="ClpKeyParameter"/>
         <UnitName Value="ClpKeyParameter"/>
-      </Item133>
-      <Item134>
+      </Item132>
+      <Item133>
         <Filename Value="..\..\Crypto\ClpBufferedBlockCipher.pas"/>
         <Filename Value="..\..\Crypto\ClpBufferedBlockCipher.pas"/>
         <UnitName Value="ClpBufferedBlockCipher"/>
         <UnitName Value="ClpBufferedBlockCipher"/>
-      </Item134>
-      <Item135>
+      </Item133>
+      <Item134>
         <Filename Value="..\..\Crypto\ClpBufferedCipherBase.pas"/>
         <Filename Value="..\..\Crypto\ClpBufferedCipherBase.pas"/>
         <UnitName Value="ClpBufferedCipherBase"/>
         <UnitName Value="ClpBufferedCipherBase"/>
-      </Item135>
-      <Item136>
+      </Item134>
+      <Item135>
         <Filename Value="..\..\Utils\ClpCheck.pas"/>
         <Filename Value="..\..\Utils\ClpCheck.pas"/>
         <UnitName Value="ClpCheck"/>
         <UnitName Value="ClpCheck"/>
-      </Item136>
-      <Item137>
+      </Item135>
+      <Item136>
         <Filename Value="..\..\Crypto\Engines\ClpAesEngine.pas"/>
         <Filename Value="..\..\Crypto\Engines\ClpAesEngine.pas"/>
         <UnitName Value="ClpAesEngine"/>
         <UnitName Value="ClpAesEngine"/>
-      </Item137>
-      <Item138>
+      </Item136>
+      <Item137>
         <Filename Value="..\..\Crypto\Generators\ClpPascalCoinECIESKdfBytesGenerator.pas"/>
         <Filename Value="..\..\Crypto\Generators\ClpPascalCoinECIESKdfBytesGenerator.pas"/>
         <UnitName Value="ClpPascalCoinECIESKdfBytesGenerator"/>
         <UnitName Value="ClpPascalCoinECIESKdfBytesGenerator"/>
-      </Item138>
-      <Item139>
+      </Item137>
+      <Item138>
         <Filename Value="..\..\Crypto\Engines\ClpPascalCoinIESEngine.pas"/>
         <Filename Value="..\..\Crypto\Engines\ClpPascalCoinIESEngine.pas"/>
         <UnitName Value="ClpPascalCoinIESEngine"/>
         <UnitName Value="ClpPascalCoinIESEngine"/>
-      </Item139>
-      <Item140>
+      </Item138>
+      <Item139>
         <Filename Value="..\..\Crypto\Generators\ClpBaseKdfBytesGenerator.pas"/>
         <Filename Value="..\..\Crypto\Generators\ClpBaseKdfBytesGenerator.pas"/>
         <UnitName Value="ClpBaseKdfBytesGenerator"/>
         <UnitName Value="ClpBaseKdfBytesGenerator"/>
-      </Item140>
-      <Item141>
+      </Item139>
+      <Item140>
         <Filename Value="..\..\Crypto\Engines\ClpIESEngine.pas"/>
         <Filename Value="..\..\Crypto\Engines\ClpIESEngine.pas"/>
         <UnitName Value="ClpIESEngine"/>
         <UnitName Value="ClpIESEngine"/>
-      </Item141>
-      <Item142>
+      </Item140>
+      <Item141>
         <Filename Value="..\..\Crypto\Parsers\ClpECIESPublicKeyParser.pas"/>
         <Filename Value="..\..\Crypto\Parsers\ClpECIESPublicKeyParser.pas"/>
         <UnitName Value="ClpECIESPublicKeyParser"/>
         <UnitName Value="ClpECIESPublicKeyParser"/>
-      </Item142>
-      <Item143>
+      </Item141>
+      <Item142>
         <Filename Value="..\..\Crypto\ClpIESCipher.pas"/>
         <Filename Value="..\..\Crypto\ClpIESCipher.pas"/>
         <UnitName Value="ClpIESCipher"/>
         <UnitName Value="ClpIESCipher"/>
-      </Item143>
-      <Item144>
+      </Item142>
+      <Item143>
         <Filename Value="..\..\Crypto\Agreement\ClpECDHBasicAgreement.pas"/>
         <Filename Value="..\..\Crypto\Agreement\ClpECDHBasicAgreement.pas"/>
         <UnitName Value="ClpECDHBasicAgreement"/>
         <UnitName Value="ClpECDHBasicAgreement"/>
-      </Item144>
-      <Item145>
+      </Item143>
+      <Item144>
         <Filename Value="..\..\Crypto\ClpEphemeralKeyPair.pas"/>
         <Filename Value="..\..\Crypto\ClpEphemeralKeyPair.pas"/>
         <UnitName Value="ClpEphemeralKeyPair"/>
         <UnitName Value="ClpEphemeralKeyPair"/>
-      </Item145>
-      <Item146>
+      </Item144>
+      <Item145>
         <Filename Value="..\..\Crypto\ClpKeyEncoder.pas"/>
         <Filename Value="..\..\Crypto\ClpKeyEncoder.pas"/>
         <UnitName Value="ClpKeyEncoder"/>
         <UnitName Value="ClpKeyEncoder"/>
-      </Item146>
-      <Item147>
+      </Item145>
+      <Item146>
         <Filename Value="..\..\Crypto\Parameters\ClpIESWithCipherParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpIESWithCipherParameters.pas"/>
         <UnitName Value="ClpIESWithCipherParameters"/>
         <UnitName Value="ClpIESWithCipherParameters"/>
-      </Item147>
-      <Item148>
+      </Item146>
+      <Item147>
         <Filename Value="..\..\Crypto\Parameters\ClpIESParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpIESParameters.pas"/>
         <UnitName Value="ClpIESParameters"/>
         <UnitName Value="ClpIESParameters"/>
-      </Item148>
-      <Item149>
+      </Item147>
+      <Item148>
         <Filename Value="..\..\Crypto\Generators\ClpEphemeralKeyPairGenerator.pas"/>
         <Filename Value="..\..\Crypto\Generators\ClpEphemeralKeyPairGenerator.pas"/>
         <UnitName Value="ClpEphemeralKeyPairGenerator"/>
         <UnitName Value="ClpEphemeralKeyPairGenerator"/>
-      </Item149>
-      <Item150>
+      </Item148>
+      <Item149>
         <Filename Value="..\..\Crypto\Generators\ClpKdf2BytesGenerator.pas"/>
         <Filename Value="..\..\Crypto\Generators\ClpKdf2BytesGenerator.pas"/>
         <UnitName Value="ClpKdf2BytesGenerator"/>
         <UnitName Value="ClpKdf2BytesGenerator"/>
-      </Item150>
-      <Item151>
+      </Item149>
+      <Item150>
         <Filename Value="..\..\Crypto\Parameters\ClpIso18033KdfParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpIso18033KdfParameters.pas"/>
         <UnitName Value="ClpIso18033KdfParameters"/>
         <UnitName Value="ClpIso18033KdfParameters"/>
-      </Item151>
-      <Item152>
+      </Item150>
+      <Item151>
         <Filename Value="..\..\Crypto\Parameters\ClpKdfParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpKdfParameters.pas"/>
         <UnitName Value="ClpKdfParameters"/>
         <UnitName Value="ClpKdfParameters"/>
-      </Item152>
-      <Item153>
+      </Item151>
+      <Item152>
         <Filename Value="..\..\Interfaces\ClpIIESWithCipherParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIIESWithCipherParameters.pas"/>
         <UnitName Value="ClpIIESWithCipherParameters"/>
         <UnitName Value="ClpIIESWithCipherParameters"/>
-      </Item153>
-      <Item154>
+      </Item152>
+      <Item153>
         <Filename Value="..\..\Interfaces\ClpIIESParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIIESParameters.pas"/>
         <UnitName Value="ClpIIESParameters"/>
         <UnitName Value="ClpIIESParameters"/>
-      </Item154>
-      <Item155>
+      </Item153>
+      <Item154>
         <Filename Value="..\..\Interfaces\ClpIPascalCoinECIESKdfBytesGenerator.pas"/>
         <Filename Value="..\..\Interfaces\ClpIPascalCoinECIESKdfBytesGenerator.pas"/>
         <UnitName Value="ClpIPascalCoinECIESKdfBytesGenerator"/>
         <UnitName Value="ClpIPascalCoinECIESKdfBytesGenerator"/>
-      </Item155>
-      <Item156>
+      </Item154>
+      <Item155>
         <Filename Value="..\..\Interfaces\ClpIPascalCoinIESEngine.pas"/>
         <Filename Value="..\..\Interfaces\ClpIPascalCoinIESEngine.pas"/>
         <UnitName Value="ClpIPascalCoinIESEngine"/>
         <UnitName Value="ClpIPascalCoinIESEngine"/>
-      </Item156>
-      <Item157>
+      </Item155>
+      <Item156>
         <Filename Value="..\..\Interfaces\ClpIIESEngine.pas"/>
         <Filename Value="..\..\Interfaces\ClpIIESEngine.pas"/>
         <UnitName Value="ClpIIESEngine"/>
         <UnitName Value="ClpIIESEngine"/>
-      </Item157>
-      <Item158>
+      </Item156>
+      <Item157>
         <Filename Value="..\..\Interfaces\ClpIIESCipher.pas"/>
         <Filename Value="..\..\Interfaces\ClpIIESCipher.pas"/>
         <UnitName Value="ClpIIESCipher"/>
         <UnitName Value="ClpIIESCipher"/>
-      </Item158>
-      <Item159>
+      </Item157>
+      <Item158>
         <Filename Value="..\..\Interfaces\ClpIECIESPublicKeyParser.pas"/>
         <Filename Value="..\..\Interfaces\ClpIECIESPublicKeyParser.pas"/>
         <UnitName Value="ClpIECIESPublicKeyParser"/>
         <UnitName Value="ClpIECIESPublicKeyParser"/>
-      </Item159>
-      <Item160>
+      </Item158>
+      <Item159>
         <Filename Value="..\..\Interfaces\ClpIEphemeralKeyPairGenerator.pas"/>
         <Filename Value="..\..\Interfaces\ClpIEphemeralKeyPairGenerator.pas"/>
         <UnitName Value="ClpIEphemeralKeyPairGenerator"/>
         <UnitName Value="ClpIEphemeralKeyPairGenerator"/>
-      </Item160>
-      <Item161>
+      </Item159>
+      <Item160>
         <Filename Value="..\..\Interfaces\ClpIEphemeralKeyPair.pas"/>
         <Filename Value="..\..\Interfaces\ClpIEphemeralKeyPair.pas"/>
         <UnitName Value="ClpIEphemeralKeyPair"/>
         <UnitName Value="ClpIEphemeralKeyPair"/>
-      </Item161>
-      <Item162>
+      </Item160>
+      <Item161>
         <Filename Value="..\..\Interfaces\ClpIKeyParser.pas"/>
         <Filename Value="..\..\Interfaces\ClpIKeyParser.pas"/>
         <UnitName Value="ClpIKeyParser"/>
         <UnitName Value="ClpIKeyParser"/>
-      </Item162>
-      <Item163>
+      </Item161>
+      <Item162>
         <Filename Value="..\..\Interfaces\ClpIKdf2BytesGenerator.pas"/>
         <Filename Value="..\..\Interfaces\ClpIKdf2BytesGenerator.pas"/>
         <UnitName Value="ClpIKdf2BytesGenerator"/>
         <UnitName Value="ClpIKdf2BytesGenerator"/>
-      </Item163>
-      <Item164>
+      </Item162>
+      <Item163>
         <Filename Value="..\..\Interfaces\ClpIBaseKdfBytesGenerator.pas"/>
         <Filename Value="..\..\Interfaces\ClpIBaseKdfBytesGenerator.pas"/>
         <UnitName Value="ClpIBaseKdfBytesGenerator"/>
         <UnitName Value="ClpIBaseKdfBytesGenerator"/>
-      </Item164>
-      <Item165>
+      </Item163>
+      <Item164>
         <Filename Value="..\..\Interfaces\ClpIIso18033KdfParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIIso18033KdfParameters.pas"/>
         <UnitName Value="ClpIIso18033KdfParameters"/>
         <UnitName Value="ClpIIso18033KdfParameters"/>
-      </Item165>
-      <Item166>
+      </Item164>
+      <Item165>
         <Filename Value="..\..\Interfaces\ClpIKdfParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIKdfParameters.pas"/>
         <UnitName Value="ClpIKdfParameters"/>
         <UnitName Value="ClpIKdfParameters"/>
-      </Item166>
-      <Item167>
+      </Item165>
+      <Item166>
         <Filename Value="..\..\Interfaces\ClpIDerivationFunction.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDerivationFunction.pas"/>
         <UnitName Value="ClpIDerivationFunction"/>
         <UnitName Value="ClpIDerivationFunction"/>
-      </Item167>
-      <Item168>
+      </Item166>
+      <Item167>
         <Filename Value="..\..\Interfaces\ClpIDerivationParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDerivationParameters.pas"/>
         <UnitName Value="ClpIDerivationParameters"/>
         <UnitName Value="ClpIDerivationParameters"/>
-      </Item168>
-      <Item169>
+      </Item167>
+      <Item168>
         <Filename Value="..\..\Interfaces\ClpIECDHBasicAgreement.pas"/>
         <Filename Value="..\..\Interfaces\ClpIECDHBasicAgreement.pas"/>
         <UnitName Value="ClpIECDHBasicAgreement"/>
         <UnitName Value="ClpIECDHBasicAgreement"/>
-      </Item169>
-      <Item170>
+      </Item168>
+      <Item169>
         <Filename Value="..\..\Interfaces\ClpIBasicAgreement.pas"/>
         <Filename Value="..\..\Interfaces\ClpIBasicAgreement.pas"/>
         <UnitName Value="ClpIBasicAgreement"/>
         <UnitName Value="ClpIBasicAgreement"/>
-      </Item170>
-      <Item171>
+      </Item169>
+      <Item170>
         <Filename Value="..\..\Crypto\Generators\ClpCipherKeyGenerator.pas"/>
         <Filename Value="..\..\Crypto\Generators\ClpCipherKeyGenerator.pas"/>
         <UnitName Value="ClpCipherKeyGenerator"/>
         <UnitName Value="ClpCipherKeyGenerator"/>
-      </Item171>
-      <Item172>
+      </Item170>
+      <Item171>
         <Filename Value="..\..\Utils\ClpStringUtils.pas"/>
         <Filename Value="..\..\Utils\ClpStringUtils.pas"/>
         <UnitName Value="ClpStringUtils"/>
         <UnitName Value="ClpStringUtils"/>
-      </Item172>
-      <Item173>
+      </Item171>
+      <Item172>
         <Filename Value="..\..\Interfaces\ClpICipherKeyGenerator.pas"/>
         <Filename Value="..\..\Interfaces\ClpICipherKeyGenerator.pas"/>
         <UnitName Value="ClpICipherKeyGenerator"/>
         <UnitName Value="ClpICipherKeyGenerator"/>
-      </Item173>
-      <Item174>
+      </Item172>
+      <Item173>
         <Filename Value="..\..\Interfaces\ClpIDigest.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDigest.pas"/>
         <UnitName Value="ClpIDigest"/>
         <UnitName Value="ClpIDigest"/>
-      </Item174>
-      <Item175>
+      </Item173>
+      <Item174>
         <Filename Value="..\..\Interfaces\ClpIStreamCipher.pas"/>
         <Filename Value="..\..\Interfaces\ClpIStreamCipher.pas"/>
         <UnitName Value="ClpIStreamCipher"/>
         <UnitName Value="ClpIStreamCipher"/>
-      </Item175>
-      <Item176>
+      </Item174>
+      <Item175>
         <Filename Value="CryptoLib4PascalPackage.pas"/>
         <Filename Value="CryptoLib4PascalPackage.pas"/>
         <AddToUsesPkgSection Value="False"/>
         <AddToUsesPkgSection Value="False"/>
         <UnitName Value="CryptoLib4PascalPackage"/>
         <UnitName Value="CryptoLib4PascalPackage"/>
-      </Item176>
-      <Item177>
+      </Item175>
+      <Item176>
         <Filename Value="..\..\Crypto\Generators\ClpPkcs5S2ParametersGenerator.pas"/>
         <Filename Value="..\..\Crypto\Generators\ClpPkcs5S2ParametersGenerator.pas"/>
         <UnitName Value="ClpPkcs5S2ParametersGenerator"/>
         <UnitName Value="ClpPkcs5S2ParametersGenerator"/>
-      </Item177>
-      <Item178>
+      </Item176>
+      <Item177>
         <Filename Value="..\..\Interfaces\ClpIPkcs5S2ParametersGenerator.pas"/>
         <Filename Value="..\..\Interfaces\ClpIPkcs5S2ParametersGenerator.pas"/>
         <UnitName Value="ClpIPkcs5S2ParametersGenerator"/>
         <UnitName Value="ClpIPkcs5S2ParametersGenerator"/>
-      </Item178>
-      <Item179>
+      </Item177>
+      <Item178>
         <Filename Value="..\..\Interfaces\ClpIPbeParametersGenerator.pas"/>
         <Filename Value="..\..\Interfaces\ClpIPbeParametersGenerator.pas"/>
         <UnitName Value="ClpIPbeParametersGenerator"/>
         <UnitName Value="ClpIPbeParametersGenerator"/>
-      </Item179>
-      <Item180>
+      </Item178>
+      <Item179>
         <Filename Value="..\..\Crypto\Generators\ClpPbeParametersGenerator.pas"/>
         <Filename Value="..\..\Crypto\Generators\ClpPbeParametersGenerator.pas"/>
         <UnitName Value="ClpPbeParametersGenerator"/>
         <UnitName Value="ClpPbeParametersGenerator"/>
-      </Item180>
-      <Item181>
+      </Item179>
+      <Item180>
         <Filename Value="..\..\Crypto\Macs\ClpHMac.pas"/>
         <Filename Value="..\..\Crypto\Macs\ClpHMac.pas"/>
         <UnitName Value="ClpHMac"/>
         <UnitName Value="ClpHMac"/>
-      </Item181>
-      <Item182>
+      </Item180>
+      <Item181>
         <Filename Value="..\..\Asn1\Misc\ClpMiscObjectIdentifiers.pas"/>
         <Filename Value="..\..\Asn1\Misc\ClpMiscObjectIdentifiers.pas"/>
         <UnitName Value="ClpMiscObjectIdentifiers"/>
         <UnitName Value="ClpMiscObjectIdentifiers"/>
-      </Item182>
-      <Item183>
+      </Item181>
+      <Item182>
         <Filename Value="..\..\Asn1\Iana\ClpIanaObjectIdentifiers.pas"/>
         <Filename Value="..\..\Asn1\Iana\ClpIanaObjectIdentifiers.pas"/>
         <UnitName Value="ClpIanaObjectIdentifiers"/>
         <UnitName Value="ClpIanaObjectIdentifiers"/>
-      </Item183>
-      <Item184>
+      </Item182>
+      <Item183>
         <Filename Value="..\..\Security\ClpMacUtilities.pas"/>
         <Filename Value="..\..\Security\ClpMacUtilities.pas"/>
         <UnitName Value="ClpMacUtilities"/>
         <UnitName Value="ClpMacUtilities"/>
-      </Item184>
-      <Item185>
+      </Item183>
+      <Item184>
         <Filename Value="..\..\Interfaces\ClpIMac.pas"/>
         <Filename Value="..\..\Interfaces\ClpIMac.pas"/>
         <UnitName Value="ClpIMac"/>
         <UnitName Value="ClpIMac"/>
-      </Item185>
-      <Item186>
+      </Item184>
+      <Item185>
         <Filename Value="..\..\Interfaces\ClpIHMac.pas"/>
         <Filename Value="..\..\Interfaces\ClpIHMac.pas"/>
         <UnitName Value="ClpIHMac"/>
         <UnitName Value="ClpIHMac"/>
-      </Item186>
-      <Item187>
+      </Item185>
+      <Item186>
         <Filename Value="..\..\Crypto\Signers\ClpDsaSigner.pas"/>
         <Filename Value="..\..\Crypto\Signers\ClpDsaSigner.pas"/>
         <UnitName Value="ClpDsaSigner"/>
         <UnitName Value="ClpDsaSigner"/>
-      </Item187>
-      <Item188>
+      </Item186>
+      <Item187>
         <Filename Value="..\..\Crypto\Generators\ClpDsaKeyPairGenerator.pas"/>
         <Filename Value="..\..\Crypto\Generators\ClpDsaKeyPairGenerator.pas"/>
         <UnitName Value="ClpDsaKeyPairGenerator"/>
         <UnitName Value="ClpDsaKeyPairGenerator"/>
-      </Item188>
-      <Item189>
+      </Item187>
+      <Item188>
         <Filename Value="..\..\Crypto\Signers\ClpECNRSigner.pas"/>
         <Filename Value="..\..\Crypto\Signers\ClpECNRSigner.pas"/>
         <UnitName Value="ClpECNRSigner"/>
         <UnitName Value="ClpECNRSigner"/>
-      </Item189>
-      <Item190>
+      </Item188>
+      <Item189>
         <Filename Value="..\..\Crypto\Parameters\ClpDsaKeyGenerationParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpDsaKeyGenerationParameters.pas"/>
         <UnitName Value="ClpDsaKeyGenerationParameters"/>
         <UnitName Value="ClpDsaKeyGenerationParameters"/>
-      </Item190>
-      <Item191>
+      </Item189>
+      <Item190>
         <Filename Value="..\..\Crypto\Parameters\ClpDsaPrivateKeyParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpDsaPrivateKeyParameters.pas"/>
         <UnitName Value="ClpDsaPrivateKeyParameters"/>
         <UnitName Value="ClpDsaPrivateKeyParameters"/>
-      </Item191>
-      <Item192>
+      </Item190>
+      <Item191>
         <Filename Value="..\..\Crypto\Parameters\ClpDsaPublicKeyParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpDsaPublicKeyParameters.pas"/>
         <UnitName Value="ClpDsaPublicKeyParameters"/>
         <UnitName Value="ClpDsaPublicKeyParameters"/>
-      </Item192>
-      <Item193>
+      </Item191>
+      <Item192>
         <Filename Value="..\..\Crypto\Parameters\ClpDsaValidationParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpDsaValidationParameters.pas"/>
         <UnitName Value="ClpDsaValidationParameters"/>
         <UnitName Value="ClpDsaValidationParameters"/>
-      </Item193>
-      <Item194>
+      </Item192>
+      <Item193>
         <Filename Value="..\..\Crypto\Parameters\ClpDsaParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpDsaParameters.pas"/>
         <UnitName Value="ClpDsaParameters"/>
         <UnitName Value="ClpDsaParameters"/>
-      </Item194>
-      <Item195>
+      </Item193>
+      <Item194>
         <Filename Value="..\..\Crypto\Parameters\ClpDsaKeyParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpDsaKeyParameters.pas"/>
         <UnitName Value="ClpDsaKeyParameters"/>
         <UnitName Value="ClpDsaKeyParameters"/>
-      </Item195>
-      <Item196>
+      </Item194>
+      <Item195>
         <Filename Value="..\..\Interfaces\ClpIECNRSigner.pas"/>
         <Filename Value="..\..\Interfaces\ClpIECNRSigner.pas"/>
         <UnitName Value="ClpIECNRSigner"/>
         <UnitName Value="ClpIECNRSigner"/>
-      </Item196>
-      <Item197>
+      </Item195>
+      <Item196>
         <Filename Value="..\..\Interfaces\ClpIDsaSigner.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDsaSigner.pas"/>
         <UnitName Value="ClpIDsaSigner"/>
         <UnitName Value="ClpIDsaSigner"/>
-      </Item197>
-      <Item198>
+      </Item196>
+      <Item197>
         <Filename Value="..\..\Interfaces\ClpIDsaKeyPairGenerator.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDsaKeyPairGenerator.pas"/>
         <UnitName Value="ClpIDsaKeyPairGenerator"/>
         <UnitName Value="ClpIDsaKeyPairGenerator"/>
-      </Item198>
-      <Item199>
+      </Item197>
+      <Item198>
         <Filename Value="..\..\Interfaces\ClpIDsaPrivateKeyParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDsaPrivateKeyParameters.pas"/>
         <UnitName Value="ClpIDsaPrivateKeyParameters"/>
         <UnitName Value="ClpIDsaPrivateKeyParameters"/>
-      </Item199>
-      <Item200>
+      </Item198>
+      <Item199>
         <Filename Value="..\..\Interfaces\ClpIDsaKeyGenerationParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDsaKeyGenerationParameters.pas"/>
         <UnitName Value="ClpIDsaKeyGenerationParameters"/>
         <UnitName Value="ClpIDsaKeyGenerationParameters"/>
-      </Item200>
-      <Item201>
+      </Item199>
+      <Item200>
         <Filename Value="..\..\Interfaces\ClpIDsaKeyParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDsaKeyParameters.pas"/>
         <UnitName Value="ClpIDsaKeyParameters"/>
         <UnitName Value="ClpIDsaKeyParameters"/>
-      </Item201>
-      <Item202>
+      </Item200>
+      <Item201>
         <Filename Value="..\..\Interfaces\ClpIDsaPublicKeyParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDsaPublicKeyParameters.pas"/>
         <UnitName Value="ClpIDsaPublicKeyParameters"/>
         <UnitName Value="ClpIDsaPublicKeyParameters"/>
-      </Item202>
-      <Item203>
+      </Item201>
+      <Item202>
         <Filename Value="..\..\Interfaces\ClpIDsaParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDsaParameters.pas"/>
         <UnitName Value="ClpIDsaParameters"/>
         <UnitName Value="ClpIDsaParameters"/>
-      </Item203>
-      <Item204>
+      </Item202>
+      <Item203>
         <Filename Value="..\..\Interfaces\ClpIDsaValidationParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDsaValidationParameters.pas"/>
         <UnitName Value="ClpIDsaValidationParameters"/>
         <UnitName Value="ClpIDsaValidationParameters"/>
-      </Item204>
-      <Item205>
+      </Item203>
+      <Item204>
         <Filename Value="..\..\Crypto\Digests\ClpDigest.pas"/>
         <Filename Value="..\..\Crypto\Digests\ClpDigest.pas"/>
         <UnitName Value="ClpDigest"/>
         <UnitName Value="ClpDigest"/>
-      </Item205>
-      <Item206>
+      </Item204>
+      <Item205>
         <Filename Value="..\..\Crypto\Agreement\ClpECDHCBasicAgreement.pas"/>
         <Filename Value="..\..\Crypto\Agreement\ClpECDHCBasicAgreement.pas"/>
         <UnitName Value="ClpECDHCBasicAgreement"/>
         <UnitName Value="ClpECDHCBasicAgreement"/>
-      </Item206>
-      <Item207>
+      </Item205>
+      <Item206>
         <Filename Value="..\..\Interfaces\ClpIECDHCBasicAgreement.pas"/>
         <Filename Value="..\..\Interfaces\ClpIECDHCBasicAgreement.pas"/>
         <UnitName Value="ClpIECDHCBasicAgreement"/>
         <UnitName Value="ClpIECDHCBasicAgreement"/>
-      </Item207>
-      <Item208>
+      </Item206>
+      <Item207>
         <Filename Value="..\..\Crypto\Signers\ClpHMacDsaKCalculator.pas"/>
         <Filename Value="..\..\Crypto\Signers\ClpHMacDsaKCalculator.pas"/>
         <UnitName Value="ClpHMacDsaKCalculator"/>
         <UnitName Value="ClpHMacDsaKCalculator"/>
-      </Item208>
-      <Item209>
+      </Item207>
+      <Item208>
         <Filename Value="..\..\Interfaces\ClpIHMacDsaKCalculator.pas"/>
         <Filename Value="..\..\Interfaces\ClpIHMacDsaKCalculator.pas"/>
         <UnitName Value="ClpIHMacDsaKCalculator"/>
         <UnitName Value="ClpIHMacDsaKCalculator"/>
-      </Item209>
-      <Item210>
+      </Item208>
+      <Item209>
         <Filename Value="..\..\Crypto\Generators\ClpHkdfBytesGenerator.pas"/>
         <Filename Value="..\..\Crypto\Generators\ClpHkdfBytesGenerator.pas"/>
         <UnitName Value="ClpHkdfBytesGenerator"/>
         <UnitName Value="ClpHkdfBytesGenerator"/>
-      </Item210>
-      <Item211>
+      </Item209>
+      <Item210>
         <Filename Value="..\..\Interfaces\ClpIHkdfBytesGenerator.pas"/>
         <Filename Value="..\..\Interfaces\ClpIHkdfBytesGenerator.pas"/>
         <UnitName Value="ClpIHkdfBytesGenerator"/>
         <UnitName Value="ClpIHkdfBytesGenerator"/>
-      </Item211>
-      <Item212>
+      </Item210>
+      <Item211>
         <Filename Value="..\..\Crypto\Parameters\ClpHkdfParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpHkdfParameters.pas"/>
         <UnitName Value="ClpHkdfParameters"/>
         <UnitName Value="ClpHkdfParameters"/>
-      </Item212>
-      <Item213>
+      </Item211>
+      <Item212>
         <Filename Value="..\..\Interfaces\ClpIHkdfParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIHkdfParameters.pas"/>
         <UnitName Value="ClpIHkdfParameters"/>
         <UnitName Value="ClpIHkdfParameters"/>
-      </Item213>
-      <Item214>
+      </Item212>
+      <Item213>
         <Filename Value="..\..\Crypto\Parameters\ClpDsaParameterGenerationParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpDsaParameterGenerationParameters.pas"/>
         <UnitName Value="ClpDsaParameterGenerationParameters"/>
         <UnitName Value="ClpDsaParameterGenerationParameters"/>
-      </Item214>
-      <Item215>
+      </Item213>
+      <Item214>
         <Filename Value="..\..\Interfaces\ClpIDsaParameterGenerationParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDsaParameterGenerationParameters.pas"/>
         <UnitName Value="ClpIDsaParameterGenerationParameters"/>
         <UnitName Value="ClpIDsaParameterGenerationParameters"/>
-      </Item215>
-      <Item216>
+      </Item214>
+      <Item215>
         <Filename Value="..\..\Interfaces\ClpIValidityPrecompInfo.pas"/>
         <Filename Value="..\..\Interfaces\ClpIValidityPrecompInfo.pas"/>
         <UnitName Value="ClpIValidityPrecompInfo"/>
         <UnitName Value="ClpIValidityPrecompInfo"/>
-      </Item216>
-      <Item217>
+      </Item215>
+      <Item216>
         <Filename Value="..\..\Crypto\Generators\ClpDsaParametersGenerator.pas"/>
         <Filename Value="..\..\Crypto\Generators\ClpDsaParametersGenerator.pas"/>
         <UnitName Value="ClpDsaParametersGenerator"/>
         <UnitName Value="ClpDsaParametersGenerator"/>
-      </Item217>
-      <Item218>
+      </Item216>
+      <Item217>
         <Filename Value="..\..\Asn1\X509\ClpDsaParameter.pas"/>
         <Filename Value="..\..\Asn1\X509\ClpDsaParameter.pas"/>
         <UnitName Value="ClpDsaParameter"/>
         <UnitName Value="ClpDsaParameter"/>
-      </Item218>
-      <Item219>
+      </Item217>
+      <Item218>
         <Filename Value="..\..\Interfaces\ClpIDsaParameter.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDsaParameter.pas"/>
         <UnitName Value="ClpIDsaParameter"/>
         <UnitName Value="ClpIDsaParameter"/>
-      </Item219>
-      <Item220>
+      </Item218>
+      <Item219>
         <Filename Value="..\..\Interfaces\ClpIKeyEncoder.pas"/>
         <Filename Value="..\..\Interfaces\ClpIKeyEncoder.pas"/>
         <UnitName Value="ClpIKeyEncoder"/>
         <UnitName Value="ClpIKeyEncoder"/>
-      </Item220>
-      <Item221>
+      </Item219>
+      <Item220>
         <Filename Value="..\..\Interfaces\ClpIDsaParametersGenerator.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDsaParametersGenerator.pas"/>
         <UnitName Value="ClpIDsaParametersGenerator"/>
         <UnitName Value="ClpIDsaParametersGenerator"/>
-      </Item221>
-      <Item222>
+      </Item220>
+      <Item221>
         <Filename Value="..\..\Interfaces\ClpIPreCompCallBack.pas"/>
         <Filename Value="..\..\Interfaces\ClpIPreCompCallBack.pas"/>
         <UnitName Value="ClpIPreCompCallBack"/>
         <UnitName Value="ClpIPreCompCallBack"/>
-      </Item222>
-      <Item223>
+      </Item221>
+      <Item222>
         <Filename Value="..\..\Math\EC\Multiplier\ClpValidityPrecompInfo.pas"/>
         <Filename Value="..\..\Math\EC\Multiplier\ClpValidityPrecompInfo.pas"/>
         <AddToUsesPkgSection Value="False"/>
         <AddToUsesPkgSection Value="False"/>
         <UnitName Value="ClpValidityPrecompInfo"/>
         <UnitName Value="ClpValidityPrecompInfo"/>
-      </Item223>
-      <Item224>
+      </Item222>
+      <Item223>
         <Filename Value="..\..\Asn1\Nist\ClpNistNamedCurves.pas"/>
         <Filename Value="..\..\Asn1\Nist\ClpNistNamedCurves.pas"/>
         <UnitName Value="ClpNistNamedCurves"/>
         <UnitName Value="ClpNistNamedCurves"/>
-      </Item224>
-      <Item225>
+      </Item223>
+      <Item224>
         <Filename Value="..\..\Math\Raw\ClpNat256.pas"/>
         <Filename Value="..\..\Math\Raw\ClpNat256.pas"/>
         <UnitName Value="ClpNat256"/>
         <UnitName Value="ClpNat256"/>
-      </Item225>
-      <Item226>
+      </Item224>
+      <Item225>
         <Filename Value="..\..\Math\Raw\ClpNat320.pas"/>
         <Filename Value="..\..\Math\Raw\ClpNat320.pas"/>
         <UnitName Value="ClpNat320"/>
         <UnitName Value="ClpNat320"/>
-      </Item226>
-      <Item227>
+      </Item225>
+      <Item226>
         <Filename Value="..\..\Crypto\Engines\ClpAesLightEngine.pas"/>
         <Filename Value="..\..\Crypto\Engines\ClpAesLightEngine.pas"/>
         <UnitName Value="ClpAesLightEngine"/>
         <UnitName Value="ClpAesLightEngine"/>
-      </Item227>
-      <Item228>
+      </Item226>
+      <Item227>
         <Filename Value="..\..\Interfaces\ClpIAesLightEngine.pas"/>
         <Filename Value="..\..\Interfaces\ClpIAesLightEngine.pas"/>
         <UnitName Value="ClpIAesLightEngine"/>
         <UnitName Value="ClpIAesLightEngine"/>
-      </Item228>
-      <Item229>
+      </Item227>
+      <Item228>
         <Filename Value="..\..\Crypto\EC\ClpCustomNamedCurves.pas"/>
         <Filename Value="..\..\Crypto\EC\ClpCustomNamedCurves.pas"/>
         <UnitName Value="ClpCustomNamedCurves"/>
         <UnitName Value="ClpCustomNamedCurves"/>
-      </Item229>
-      <Item230>
+      </Item228>
+      <Item229>
         <Filename Value="..\..\Math\Raw\ClpNat384.pas"/>
         <Filename Value="..\..\Math\Raw\ClpNat384.pas"/>
         <UnitName Value="ClpNat384"/>
         <UnitName Value="ClpNat384"/>
-      </Item230>
-      <Item231>
+      </Item229>
+      <Item230>
         <Filename Value="..\..\Math\Raw\ClpNat192.pas"/>
         <Filename Value="..\..\Math\Raw\ClpNat192.pas"/>
         <UnitName Value="ClpNat192"/>
         <UnitName Value="ClpNat192"/>
-      </Item231>
-      <Item232>
+      </Item230>
+      <Item231>
         <Filename Value="..\..\Math\Raw\ClpNat512.pas"/>
         <Filename Value="..\..\Math\Raw\ClpNat512.pas"/>
         <UnitName Value="ClpNat512"/>
         <UnitName Value="ClpNat512"/>
-      </Item232>
-      <Item233>
+      </Item231>
+      <Item232>
         <Filename Value="..\..\Math\Raw\ClpInterleave.pas"/>
         <Filename Value="..\..\Math\Raw\ClpInterleave.pas"/>
         <UnitName Value="ClpInterleave"/>
         <UnitName Value="ClpInterleave"/>
-      </Item233>
-      <Item234>
+      </Item232>
+      <Item233>
         <Filename Value="..\..\Asn1\Bsi\ClpBsiObjectIdentifiers.pas"/>
         <Filename Value="..\..\Asn1\Bsi\ClpBsiObjectIdentifiers.pas"/>
         <UnitName Value="ClpBsiObjectIdentifiers"/>
         <UnitName Value="ClpBsiObjectIdentifiers"/>
-      </Item234>
-      <Item235>
+      </Item233>
+      <Item234>
         <Filename Value="..\..\Asn1\Eac\ClpEacObjectIdentifiers.pas"/>
         <Filename Value="..\..\Asn1\Eac\ClpEacObjectIdentifiers.pas"/>
         <UnitName Value="ClpEacObjectIdentifiers"/>
         <UnitName Value="ClpEacObjectIdentifiers"/>
-      </Item235>
-      <Item236>
+      </Item234>
+      <Item235>
         <Filename Value="..\..\Interfaces\ClpIDsaExt.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDsaExt.pas"/>
         <UnitName Value="ClpIDsaExt"/>
         <UnitName Value="ClpIDsaExt"/>
-      </Item236>
-      <Item237>
+      </Item235>
+      <Item236>
         <Filename Value="..\..\Interfaces\ClpISchnorrDigestSigner.pas"/>
         <Filename Value="..\..\Interfaces\ClpISchnorrDigestSigner.pas"/>
         <UnitName Value="ClpISchnorrDigestSigner"/>
         <UnitName Value="ClpISchnorrDigestSigner"/>
-      </Item237>
-      <Item238>
+      </Item236>
+      <Item237>
         <Filename Value="..\..\Interfaces\ClpIECSchnorrSipaSigner.pas"/>
         <Filename Value="..\..\Interfaces\ClpIECSchnorrSipaSigner.pas"/>
         <UnitName Value="ClpIECSchnorrSipaSigner"/>
         <UnitName Value="ClpIECSchnorrSipaSigner"/>
-      </Item238>
-      <Item239>
+      </Item237>
+      <Item238>
         <Filename Value="..\..\Crypto\Signers\ClpECSchnorrSipaSigner.pas"/>
         <Filename Value="..\..\Crypto\Signers\ClpECSchnorrSipaSigner.pas"/>
         <UnitName Value="ClpECSchnorrSipaSigner"/>
         <UnitName Value="ClpECSchnorrSipaSigner"/>
-      </Item239>
-      <Item240>
+      </Item238>
+      <Item239>
         <Filename Value="..\..\Crypto\Signers\ClpSchnorrDigestSigner.pas"/>
         <Filename Value="..\..\Crypto\Signers\ClpSchnorrDigestSigner.pas"/>
         <UnitName Value="ClpSchnorrDigestSigner"/>
         <UnitName Value="ClpSchnorrDigestSigner"/>
-      </Item240>
-      <Item241>
+      </Item239>
+      <Item240>
         <Filename Value="..\..\Interfaces\ClpISchnorr.pas"/>
         <Filename Value="..\..\Interfaces\ClpISchnorr.pas"/>
         <UnitName Value="ClpISchnorr"/>
         <UnitName Value="ClpISchnorr"/>
-      </Item241>
-      <Item242>
+      </Item240>
+      <Item241>
         <Filename Value="..\..\Interfaces\ClpISchnorrExt.pas"/>
         <Filename Value="..\..\Interfaces\ClpISchnorrExt.pas"/>
         <UnitName Value="ClpISchnorrExt"/>
         <UnitName Value="ClpISchnorrExt"/>
-      </Item242>
-      <Item243>
+      </Item241>
+      <Item242>
         <Filename Value="..\..\Crypto\Engines\ClpBlowfishEngine.pas"/>
         <Filename Value="..\..\Crypto\Engines\ClpBlowfishEngine.pas"/>
         <UnitName Value="ClpBlowfishEngine"/>
         <UnitName Value="ClpBlowfishEngine"/>
-      </Item243>
-      <Item244>
+      </Item242>
+      <Item243>
         <Filename Value="..\..\Interfaces\ClpIBlowfishEngine.pas"/>
         <Filename Value="..\..\Interfaces\ClpIBlowfishEngine.pas"/>
         <UnitName Value="ClpIBlowfishEngine"/>
         <UnitName Value="ClpIBlowfishEngine"/>
-      </Item244>
-      <Item245>
+      </Item243>
+      <Item244>
         <Filename Value="..\..\Math\EC\ClpECC.pas"/>
         <Filename Value="..\..\Math\EC\ClpECC.pas"/>
         <UnitName Value="ClpECC"/>
         <UnitName Value="ClpECC"/>
-      </Item245>
-      <Item246>
+      </Item244>
+      <Item245>
         <Filename Value="..\..\Asn1\ClpAsn1Objects.pas"/>
         <Filename Value="..\..\Asn1\ClpAsn1Objects.pas"/>
         <UnitName Value="ClpAsn1Objects"/>
         <UnitName Value="ClpAsn1Objects"/>
-      </Item246>
-      <Item247>
+      </Item245>
+      <Item246>
         <Filename Value="..\..\Crypto\Signers\SignersEncodings\ClpSignersEncodings.pas"/>
         <Filename Value="..\..\Crypto\Signers\SignersEncodings\ClpSignersEncodings.pas"/>
         <UnitName Value="ClpSignersEncodings"/>
         <UnitName Value="ClpSignersEncodings"/>
-      </Item247>
-      <Item248>
+      </Item246>
+      <Item247>
         <Filename Value="..\..\Interfaces\ClpISignersEncodings.pas"/>
         <Filename Value="..\..\Interfaces\ClpISignersEncodings.pas"/>
         <UnitName Value="ClpISignersEncodings"/>
         <UnitName Value="ClpISignersEncodings"/>
-      </Item248>
-      <Item249>
+      </Item247>
+      <Item248>
         <Filename Value="..\..\Utils\Encoders\ClpEncoders.pas"/>
         <Filename Value="..\..\Utils\Encoders\ClpEncoders.pas"/>
         <UnitName Value="ClpEncoders"/>
         <UnitName Value="ClpEncoders"/>
-      </Item249>
-      <Item250>
+      </Item248>
+      <Item249>
         <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecT283Custom.pas"/>
         <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecT283Custom.pas"/>
         <UnitName Value="ClpSecT283Custom"/>
         <UnitName Value="ClpSecT283Custom"/>
-      </Item250>
-      <Item251>
+      </Item249>
+      <Item250>
         <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP521R1Custom.pas"/>
         <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP521R1Custom.pas"/>
         <UnitName Value="ClpSecP521R1Custom"/>
         <UnitName Value="ClpSecP521R1Custom"/>
-      </Item251>
-      <Item252>
+      </Item250>
+      <Item251>
         <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP384R1Custom.pas"/>
         <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP384R1Custom.pas"/>
         <UnitName Value="ClpSecP384R1Custom"/>
         <UnitName Value="ClpSecP384R1Custom"/>
-      </Item252>
-      <Item253>
+      </Item251>
+      <Item252>
         <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256R1Custom.pas"/>
         <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256R1Custom.pas"/>
         <UnitName Value="ClpSecP256R1Custom"/>
         <UnitName Value="ClpSecP256R1Custom"/>
-      </Item253>
-      <Item254>
+      </Item252>
+      <Item253>
         <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256K1Custom.pas"/>
         <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256K1Custom.pas"/>
         <UnitName Value="ClpSecP256K1Custom"/>
         <UnitName Value="ClpSecP256K1Custom"/>
-      </Item254>
-      <Item255>
+      </Item253>
+      <Item254>
         <Filename Value="..\..\Interfaces\ClpIX9ECC.pas"/>
         <Filename Value="..\..\Interfaces\ClpIX9ECC.pas"/>
         <UnitName Value="ClpIX9ECC"/>
         <UnitName Value="ClpIX9ECC"/>
-      </Item255>
-      <Item256>
+      </Item254>
+      <Item255>
         <Filename Value="..\..\Asn1\X9\ClpX9ECC.pas"/>
         <Filename Value="..\..\Asn1\X9\ClpX9ECC.pas"/>
         <UnitName Value="ClpX9ECC"/>
         <UnitName Value="ClpX9ECC"/>
-      </Item256>
-      <Item257>
+      </Item255>
+      <Item256>
         <Filename Value="..\..\Interfaces\ClpIAsn1Objects.pas"/>
         <Filename Value="..\..\Interfaces\ClpIAsn1Objects.pas"/>
         <UnitName Value="ClpIAsn1Objects"/>
         <UnitName Value="ClpIAsn1Objects"/>
-      </Item257>
-      <Item258>
+      </Item256>
+      <Item257>
         <Filename Value="..\..\Crypto\Modes\ClpBlockCipherModes.pas"/>
         <Filename Value="..\..\Crypto\Modes\ClpBlockCipherModes.pas"/>
         <UnitName Value="ClpBlockCipherModes"/>
         <UnitName Value="ClpBlockCipherModes"/>
-      </Item258>
-      <Item259>
+      </Item257>
+      <Item258>
         <Filename Value="..\..\Math\EC\ClpECCurveConstants.pas"/>
         <Filename Value="..\..\Math\EC\ClpECCurveConstants.pas"/>
         <UnitName Value="ClpECCurveConstants"/>
         <UnitName Value="ClpECCurveConstants"/>
-      </Item259>
-      <Item260>
+      </Item258>
+      <Item259>
         <Filename Value="..\..\Interfaces\ClpIBlockCipherModes.pas"/>
         <Filename Value="..\..\Interfaces\ClpIBlockCipherModes.pas"/>
         <UnitName Value="ClpIBlockCipherModes"/>
         <UnitName Value="ClpIBlockCipherModes"/>
-      </Item260>
-      <Item261>
+      </Item259>
+      <Item260>
         <Filename Value="..\..\Interfaces\ClpIPaddingModes.pas"/>
         <Filename Value="..\..\Interfaces\ClpIPaddingModes.pas"/>
         <UnitName Value="ClpIPaddingModes"/>
         <UnitName Value="ClpIPaddingModes"/>
-      </Item261>
-      <Item262>
+      </Item260>
+      <Item261>
         <Filename Value="..\..\Interfaces\ClpISecP256K1Custom.pas"/>
         <Filename Value="..\..\Interfaces\ClpISecP256K1Custom.pas"/>
         <UnitName Value="ClpISecP256K1Custom"/>
         <UnitName Value="ClpISecP256K1Custom"/>
-      </Item262>
-      <Item263>
+      </Item261>
+      <Item262>
         <Filename Value="..\..\Interfaces\ClpISecP256R1Custom.pas"/>
         <Filename Value="..\..\Interfaces\ClpISecP256R1Custom.pas"/>
         <UnitName Value="ClpISecP256R1Custom"/>
         <UnitName Value="ClpISecP256R1Custom"/>
-      </Item263>
-      <Item264>
+      </Item262>
+      <Item263>
         <Filename Value="..\..\Interfaces\ClpISecP384R1Custom.pas"/>
         <Filename Value="..\..\Interfaces\ClpISecP384R1Custom.pas"/>
         <UnitName Value="ClpISecP384R1Custom"/>
         <UnitName Value="ClpISecP384R1Custom"/>
-      </Item264>
-      <Item265>
+      </Item263>
+      <Item264>
         <Filename Value="..\..\Interfaces\ClpISecP521R1Custom.pas"/>
         <Filename Value="..\..\Interfaces\ClpISecP521R1Custom.pas"/>
         <UnitName Value="ClpISecP521R1Custom"/>
         <UnitName Value="ClpISecP521R1Custom"/>
-      </Item265>
-      <Item266>
+      </Item264>
+      <Item265>
         <Filename Value="..\..\Interfaces\ClpISecT283Custom.pas"/>
         <Filename Value="..\..\Interfaces\ClpISecT283Custom.pas"/>
         <UnitName Value="ClpISecT283Custom"/>
         <UnitName Value="ClpISecT283Custom"/>
-      </Item266>
-      <Item267>
+      </Item265>
+      <Item266>
         <Filename Value="..\..\Crypto\Paddings\ClpPaddingModes.pas"/>
         <Filename Value="..\..\Crypto\Paddings\ClpPaddingModes.pas"/>
         <UnitName Value="ClpPaddingModes"/>
         <UnitName Value="ClpPaddingModes"/>
-      </Item267>
-      <Item268>
+      </Item266>
+      <Item267>
         <Filename Value="..\..\Interfaces\ClpIECC.pas"/>
         <Filename Value="..\..\Interfaces\ClpIECC.pas"/>
         <UnitName Value="ClpIECC"/>
         <UnitName Value="ClpIECC"/>
-      </Item268>
-      <Item269>
+      </Item267>
+      <Item268>
         <Filename Value="..\..\Interfaces\ClpISpeckEngine.pas"/>
         <Filename Value="..\..\Interfaces\ClpISpeckEngine.pas"/>
         <UnitName Value="ClpISpeckEngine"/>
         <UnitName Value="ClpISpeckEngine"/>
-      </Item269>
-      <Item270>
+      </Item268>
+      <Item269>
         <Filename Value="..\..\Crypto\Engines\ClpSpeckEngine.pas"/>
         <Filename Value="..\..\Crypto\Engines\ClpSpeckEngine.pas"/>
         <UnitName Value="ClpSpeckEngine"/>
         <UnitName Value="ClpSpeckEngine"/>
-      </Item270>
-      <Item271>
+      </Item269>
+      <Item270>
         <Filename Value="..\..\Interfaces\ClpIBufferedStreamCipher.pas"/>
         <Filename Value="..\..\Interfaces\ClpIBufferedStreamCipher.pas"/>
         <UnitName Value="ClpIBufferedStreamCipher"/>
         <UnitName Value="ClpIBufferedStreamCipher"/>
-      </Item271>
-      <Item272>
+      </Item270>
+      <Item271>
         <Filename Value="..\..\Interfaces\ClpIChaChaEngine.pas"/>
         <Filename Value="..\..\Interfaces\ClpIChaChaEngine.pas"/>
         <UnitName Value="ClpIChaChaEngine"/>
         <UnitName Value="ClpIChaChaEngine"/>
-      </Item272>
-      <Item273>
+      </Item271>
+      <Item272>
         <Filename Value="..\..\Interfaces\ClpIXSalsa20Engine.pas"/>
         <Filename Value="..\..\Interfaces\ClpIXSalsa20Engine.pas"/>
         <UnitName Value="ClpIXSalsa20Engine"/>
         <UnitName Value="ClpIXSalsa20Engine"/>
-      </Item273>
-      <Item274>
+      </Item272>
+      <Item273>
         <Filename Value="..\..\Interfaces\ClpISalsa20Engine.pas"/>
         <Filename Value="..\..\Interfaces\ClpISalsa20Engine.pas"/>
         <UnitName Value="ClpISalsa20Engine"/>
         <UnitName Value="ClpISalsa20Engine"/>
-      </Item274>
-      <Item275>
+      </Item273>
+      <Item274>
         <Filename Value="..\..\Crypto\ClpBufferedStreamCipher.pas"/>
         <Filename Value="..\..\Crypto\ClpBufferedStreamCipher.pas"/>
         <UnitName Value="ClpBufferedStreamCipher"/>
         <UnitName Value="ClpBufferedStreamCipher"/>
-      </Item275>
-      <Item276>
+      </Item274>
+      <Item275>
         <Filename Value="..\..\Crypto\Engines\ClpSalsa20Engine.pas"/>
         <Filename Value="..\..\Crypto\Engines\ClpSalsa20Engine.pas"/>
         <UnitName Value="ClpSalsa20Engine"/>
         <UnitName Value="ClpSalsa20Engine"/>
-      </Item276>
-      <Item277>
+      </Item275>
+      <Item276>
         <Filename Value="..\..\Crypto\Engines\ClpXSalsa20Engine.pas"/>
         <Filename Value="..\..\Crypto\Engines\ClpXSalsa20Engine.pas"/>
         <UnitName Value="ClpXSalsa20Engine"/>
         <UnitName Value="ClpXSalsa20Engine"/>
-      </Item277>
-      <Item278>
+      </Item276>
+      <Item277>
         <Filename Value="..\..\Crypto\Engines\ClpChaChaEngine.pas"/>
         <Filename Value="..\..\Crypto\Engines\ClpChaChaEngine.pas"/>
         <UnitName Value="ClpChaChaEngine"/>
         <UnitName Value="ClpChaChaEngine"/>
-      </Item278>
-      <Item279>
+      </Item277>
+      <Item278>
         <Filename Value="..\..\Interfaces\ClpIRijndaelEngine.pas"/>
         <Filename Value="..\..\Interfaces\ClpIRijndaelEngine.pas"/>
         <UnitName Value="ClpIRijndaelEngine"/>
         <UnitName Value="ClpIRijndaelEngine"/>
-      </Item279>
-      <Item280>
+      </Item278>
+      <Item279>
         <Filename Value="..\..\Crypto\Engines\ClpRijndaelEngine.pas"/>
         <Filename Value="..\..\Crypto\Engines\ClpRijndaelEngine.pas"/>
         <UnitName Value="ClpRijndaelEngine"/>
         <UnitName Value="ClpRijndaelEngine"/>
-      </Item280>
-      <Item281>
+      </Item279>
+      <Item280>
         <Filename Value="..\..\Interfaces\ClpIIESParameterSpec.pas"/>
         <Filename Value="..\..\Interfaces\ClpIIESParameterSpec.pas"/>
         <UnitName Value="ClpIIESParameterSpec"/>
         <UnitName Value="ClpIIESParameterSpec"/>
-      </Item281>
-      <Item282>
+      </Item280>
+      <Item281>
         <Filename Value="..\..\Interfaces\ClpIAlgorithmParameterSpec.pas"/>
         <Filename Value="..\..\Interfaces\ClpIAlgorithmParameterSpec.pas"/>
         <UnitName Value="ClpIAlgorithmParameterSpec"/>
         <UnitName Value="ClpIAlgorithmParameterSpec"/>
-      </Item282>
-      <Item283>
+      </Item281>
+      <Item282>
         <Filename Value="..\..\Crypto\Parameters\ClpIESParameterSpec.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpIESParameterSpec.pas"/>
         <UnitName Value="ClpIESParameterSpec"/>
         <UnitName Value="ClpIESParameterSpec"/>
-      </Item283>
-      <Item284>
+      </Item282>
+      <Item283>
         <Filename Value="..\..\Math\EC\Custom\Djb\ClpCurve25519Custom.pas"/>
         <Filename Value="..\..\Math\EC\Custom\Djb\ClpCurve25519Custom.pas"/>
         <UnitName Value="ClpCurve25519Custom"/>
         <UnitName Value="ClpCurve25519Custom"/>
-      </Item284>
-      <Item285>
+      </Item283>
+      <Item284>
         <Filename Value="..\..\Interfaces\ClpICurve25519Custom.pas"/>
         <Filename Value="..\..\Interfaces\ClpICurve25519Custom.pas"/>
         <UnitName Value="ClpICurve25519Custom"/>
         <UnitName Value="ClpICurve25519Custom"/>
-      </Item285>
-      <Item286>
+      </Item284>
+      <Item285>
         <Filename Value="..\..\Crypto\Engines\ClpSpeckLegacyEngine.pas"/>
         <Filename Value="..\..\Crypto\Engines\ClpSpeckLegacyEngine.pas"/>
         <UnitName Value="ClpSpeckLegacyEngine"/>
         <UnitName Value="ClpSpeckLegacyEngine"/>
-      </Item286>
-      <Item287>
+      </Item285>
+      <Item286>
         <Filename Value="..\..\Interfaces\ClpISpeckLegacyEngine.pas"/>
         <Filename Value="..\..\Interfaces\ClpISpeckLegacyEngine.pas"/>
         <UnitName Value="ClpISpeckLegacyEngine"/>
         <UnitName Value="ClpISpeckLegacyEngine"/>
-      </Item287>
-      <Item288>
+      </Item286>
+      <Item287>
         <Filename Value="..\..\Interfaces\ClpIEd25519.pas"/>
         <Filename Value="..\..\Interfaces\ClpIEd25519.pas"/>
         <UnitName Value="ClpIEd25519"/>
         <UnitName Value="ClpIEd25519"/>
-      </Item288>
-      <Item289>
+      </Item287>
+      <Item288>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2B.pas"/>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2B.pas"/>
         <UnitName Value="ClpIEd25519Blake2B"/>
         <UnitName Value="ClpIEd25519Blake2B"/>
-      </Item289>
-      <Item290>
+      </Item288>
+      <Item289>
         <Filename Value="..\..\Math\EC\Rfc7748\ClpX25519Field.pas"/>
         <Filename Value="..\..\Math\EC\Rfc7748\ClpX25519Field.pas"/>
         <UnitName Value="ClpX25519Field"/>
         <UnitName Value="ClpX25519Field"/>
-      </Item290>
-      <Item291>
+      </Item289>
+      <Item290>
         <Filename Value="..\..\Math\EC\Rfc8032\ClpEd25519.pas"/>
         <Filename Value="..\..\Math\EC\Rfc8032\ClpEd25519.pas"/>
         <UnitName Value="ClpEd25519"/>
         <UnitName Value="ClpEd25519"/>
-      </Item291>
-      <Item292>
+      </Item290>
+      <Item291>
         <Filename Value="..\..\Math\EC\Rfc8032\ClpEd25519Blake2B.pas"/>
         <Filename Value="..\..\Math\EC\Rfc8032\ClpEd25519Blake2B.pas"/>
         <UnitName Value="ClpEd25519Blake2B"/>
         <UnitName Value="ClpEd25519Blake2B"/>
-      </Item292>
-      <Item293>
+      </Item291>
+      <Item292>
         <Filename Value="..\..\Math\EC\Rfc7748\ClpX25519.pas"/>
         <Filename Value="..\..\Math\EC\Rfc7748\ClpX25519.pas"/>
         <UnitName Value="ClpX25519"/>
         <UnitName Value="ClpX25519"/>
-      </Item293>
-      <Item294>
+      </Item292>
+      <Item293>
         <Filename Value="..\..\Asn1\Edec\ClpEdECObjectIdentifiers.pas"/>
         <Filename Value="..\..\Asn1\Edec\ClpEdECObjectIdentifiers.pas"/>
         <UnitName Value="ClpEdECObjectIdentifiers"/>
         <UnitName Value="ClpEdECObjectIdentifiers"/>
-      </Item294>
-      <Item295>
+      </Item293>
+      <Item294>
         <Filename Value="..\..\Interfaces\ClpIEd25519CtxBlake2BSigner.pas"/>
         <Filename Value="..\..\Interfaces\ClpIEd25519CtxBlake2BSigner.pas"/>
         <UnitName Value="ClpIEd25519CtxBlake2BSigner"/>
         <UnitName Value="ClpIEd25519CtxBlake2BSigner"/>
-      </Item295>
-      <Item296>
+      </Item294>
+      <Item295>
         <Filename Value="..\..\Interfaces\ClpIEd25519PhBlake2BSigner.pas"/>
         <Filename Value="..\..\Interfaces\ClpIEd25519PhBlake2BSigner.pas"/>
         <UnitName Value="ClpIEd25519PhBlake2BSigner"/>
         <UnitName Value="ClpIEd25519PhBlake2BSigner"/>
-      </Item296>
-      <Item297>
+      </Item295>
+      <Item296>
         <Filename Value="..\..\Interfaces\ClpIEd25519PhSigner.pas"/>
         <Filename Value="..\..\Interfaces\ClpIEd25519PhSigner.pas"/>
         <UnitName Value="ClpIEd25519PhSigner"/>
         <UnitName Value="ClpIEd25519PhSigner"/>
-      </Item297>
-      <Item298>
+      </Item296>
+      <Item297>
         <Filename Value="..\..\Interfaces\ClpIEd25519CtxSigner.pas"/>
         <Filename Value="..\..\Interfaces\ClpIEd25519CtxSigner.pas"/>
         <UnitName Value="ClpIEd25519CtxSigner"/>
         <UnitName Value="ClpIEd25519CtxSigner"/>
-      </Item298>
-      <Item299>
+      </Item297>
+      <Item298>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2BSigner.pas"/>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2BSigner.pas"/>
         <UnitName Value="ClpIEd25519Blake2BSigner"/>
         <UnitName Value="ClpIEd25519Blake2BSigner"/>
-      </Item299>
-      <Item300>
+      </Item298>
+      <Item299>
         <Filename Value="..\..\Interfaces\ClpIEd25519Signer.pas"/>
         <Filename Value="..\..\Interfaces\ClpIEd25519Signer.pas"/>
         <UnitName Value="ClpIEd25519Signer"/>
         <UnitName Value="ClpIEd25519Signer"/>
-      </Item300>
-      <Item301>
+      </Item299>
+      <Item300>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2BKeyGenerationParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2BKeyGenerationParameters.pas"/>
         <UnitName Value="ClpIEd25519Blake2BKeyGenerationParameters"/>
         <UnitName Value="ClpIEd25519Blake2BKeyGenerationParameters"/>
-      </Item301>
-      <Item302>
+      </Item300>
+      <Item301>
         <Filename Value="..\..\Interfaces\ClpIEd25519KeyGenerationParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIEd25519KeyGenerationParameters.pas"/>
         <UnitName Value="ClpIEd25519KeyGenerationParameters"/>
         <UnitName Value="ClpIEd25519KeyGenerationParameters"/>
-      </Item302>
-      <Item303>
+      </Item301>
+      <Item302>
         <Filename Value="..\..\Interfaces\ClpIX25519KeyGenerationParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIX25519KeyGenerationParameters.pas"/>
         <UnitName Value="ClpIX25519KeyGenerationParameters"/>
         <UnitName Value="ClpIX25519KeyGenerationParameters"/>
-      </Item303>
-      <Item304>
+      </Item302>
+      <Item303>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2BKeyPairGenerator.pas"/>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2BKeyPairGenerator.pas"/>
         <UnitName Value="ClpIEd25519Blake2BKeyPairGenerator"/>
         <UnitName Value="ClpIEd25519Blake2BKeyPairGenerator"/>
-      </Item304>
-      <Item305>
+      </Item303>
+      <Item304>
         <Filename Value="..\..\Interfaces\ClpIEd25519KeyPairGenerator.pas"/>
         <Filename Value="..\..\Interfaces\ClpIEd25519KeyPairGenerator.pas"/>
         <UnitName Value="ClpIEd25519KeyPairGenerator"/>
         <UnitName Value="ClpIEd25519KeyPairGenerator"/>
-      </Item305>
-      <Item306>
+      </Item304>
+      <Item305>
         <Filename Value="..\..\Interfaces\ClpIX25519KeyPairGenerator.pas"/>
         <Filename Value="..\..\Interfaces\ClpIX25519KeyPairGenerator.pas"/>
         <UnitName Value="ClpIX25519KeyPairGenerator"/>
         <UnitName Value="ClpIX25519KeyPairGenerator"/>
-      </Item306>
-      <Item307>
+      </Item305>
+      <Item306>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2BPrivateKeyParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2BPrivateKeyParameters.pas"/>
         <UnitName Value="ClpIEd25519Blake2BPrivateKeyParameters"/>
         <UnitName Value="ClpIEd25519Blake2BPrivateKeyParameters"/>
-      </Item307>
-      <Item308>
+      </Item306>
+      <Item307>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2BPublicKeyParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2BPublicKeyParameters.pas"/>
         <UnitName Value="ClpIEd25519Blake2BPublicKeyParameters"/>
         <UnitName Value="ClpIEd25519Blake2BPublicKeyParameters"/>
-      </Item308>
-      <Item309>
+      </Item307>
+      <Item308>
         <Filename Value="..\..\Interfaces\ClpIEd25519PrivateKeyParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIEd25519PrivateKeyParameters.pas"/>
         <UnitName Value="ClpIEd25519PrivateKeyParameters"/>
         <UnitName Value="ClpIEd25519PrivateKeyParameters"/>
-      </Item309>
-      <Item310>
+      </Item308>
+      <Item309>
         <Filename Value="..\..\Interfaces\ClpIEd25519PublicKeyParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIEd25519PublicKeyParameters.pas"/>
         <UnitName Value="ClpIEd25519PublicKeyParameters"/>
         <UnitName Value="ClpIEd25519PublicKeyParameters"/>
-      </Item310>
-      <Item311>
+      </Item309>
+      <Item310>
         <Filename Value="..\..\Interfaces\ClpIX25519PublicKeyParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIX25519PublicKeyParameters.pas"/>
         <UnitName Value="ClpIX25519PublicKeyParameters"/>
         <UnitName Value="ClpIX25519PublicKeyParameters"/>
-      </Item311>
-      <Item312>
+      </Item310>
+      <Item311>
         <Filename Value="..\..\Interfaces\ClpIX25519PrivateKeyParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIX25519PrivateKeyParameters.pas"/>
         <UnitName Value="ClpIX25519PrivateKeyParameters"/>
         <UnitName Value="ClpIX25519PrivateKeyParameters"/>
-      </Item312>
-      <Item313>
+      </Item311>
+      <Item312>
         <Filename Value="..\..\Interfaces\ClpIX25519Agreement.pas"/>
         <Filename Value="..\..\Interfaces\ClpIX25519Agreement.pas"/>
         <UnitName Value="ClpIX25519Agreement"/>
         <UnitName Value="ClpIX25519Agreement"/>
-      </Item313>
-      <Item314>
+      </Item312>
+      <Item313>
         <Filename Value="..\..\Interfaces\ClpIRawAgreement.pas"/>
         <Filename Value="..\..\Interfaces\ClpIRawAgreement.pas"/>
         <UnitName Value="ClpIRawAgreement"/>
         <UnitName Value="ClpIRawAgreement"/>
-      </Item314>
-      <Item315>
+      </Item313>
+      <Item314>
         <Filename Value="..\..\Crypto\Agreement\ClpX25519Agreement.pas"/>
         <Filename Value="..\..\Crypto\Agreement\ClpX25519Agreement.pas"/>
         <UnitName Value="ClpX25519Agreement"/>
         <UnitName Value="ClpX25519Agreement"/>
-      </Item315>
-      <Item316>
+      </Item314>
+      <Item315>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519Blake2BKeyGenerationParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519Blake2BKeyGenerationParameters.pas"/>
         <UnitName Value="ClpEd25519Blake2BKeyGenerationParameters"/>
         <UnitName Value="ClpEd25519Blake2BKeyGenerationParameters"/>
-      </Item316>
-      <Item317>
+      </Item315>
+      <Item316>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519KeyGenerationParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519KeyGenerationParameters.pas"/>
         <UnitName Value="ClpEd25519KeyGenerationParameters"/>
         <UnitName Value="ClpEd25519KeyGenerationParameters"/>
-      </Item317>
-      <Item318>
+      </Item316>
+      <Item317>
         <Filename Value="..\..\Crypto\Parameters\ClpX25519KeyGenerationParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpX25519KeyGenerationParameters.pas"/>
         <UnitName Value="ClpX25519KeyGenerationParameters"/>
         <UnitName Value="ClpX25519KeyGenerationParameters"/>
-      </Item318>
-      <Item319>
+      </Item317>
+      <Item318>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519Blake2BPrivateKeyParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519Blake2BPrivateKeyParameters.pas"/>
         <UnitName Value="ClpEd25519Blake2BPrivateKeyParameters"/>
         <UnitName Value="ClpEd25519Blake2BPrivateKeyParameters"/>
-      </Item319>
-      <Item320>
+      </Item318>
+      <Item319>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519Blake2BPublicKeyParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519Blake2BPublicKeyParameters.pas"/>
         <UnitName Value="ClpEd25519Blake2BPublicKeyParameters"/>
         <UnitName Value="ClpEd25519Blake2BPublicKeyParameters"/>
-      </Item320>
-      <Item321>
+      </Item319>
+      <Item320>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519PublicKeyParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519PublicKeyParameters.pas"/>
         <UnitName Value="ClpEd25519PublicKeyParameters"/>
         <UnitName Value="ClpEd25519PublicKeyParameters"/>
-      </Item321>
-      <Item322>
+      </Item320>
+      <Item321>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519PrivateKeyParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519PrivateKeyParameters.pas"/>
         <UnitName Value="ClpEd25519PrivateKeyParameters"/>
         <UnitName Value="ClpEd25519PrivateKeyParameters"/>
-      </Item322>
-      <Item323>
+      </Item321>
+      <Item322>
         <Filename Value="..\..\Crypto\Parameters\ClpX25519PublicKeyParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpX25519PublicKeyParameters.pas"/>
         <UnitName Value="ClpX25519PublicKeyParameters"/>
         <UnitName Value="ClpX25519PublicKeyParameters"/>
-      </Item323>
-      <Item324>
+      </Item322>
+      <Item323>
         <Filename Value="..\..\Crypto\Parameters\ClpX25519PrivateKeyParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpX25519PrivateKeyParameters.pas"/>
         <UnitName Value="ClpX25519PrivateKeyParameters"/>
         <UnitName Value="ClpX25519PrivateKeyParameters"/>
-      </Item324>
-      <Item325>
+      </Item323>
+      <Item324>
         <Filename Value="..\..\Crypto\Generators\ClpEd25519Blake2BKeyPairGenerator.pas"/>
         <Filename Value="..\..\Crypto\Generators\ClpEd25519Blake2BKeyPairGenerator.pas"/>
         <UnitName Value="ClpEd25519Blake2BKeyPairGenerator"/>
         <UnitName Value="ClpEd25519Blake2BKeyPairGenerator"/>
-      </Item325>
-      <Item326>
+      </Item324>
+      <Item325>
         <Filename Value="..\..\Crypto\Generators\ClpEd25519KeyPairGenerator.pas"/>
         <Filename Value="..\..\Crypto\Generators\ClpEd25519KeyPairGenerator.pas"/>
         <UnitName Value="ClpEd25519KeyPairGenerator"/>
         <UnitName Value="ClpEd25519KeyPairGenerator"/>
-      </Item326>
-      <Item327>
+      </Item325>
+      <Item326>
         <Filename Value="..\..\Crypto\Generators\ClpX25519KeyPairGenerator.pas"/>
         <Filename Value="..\..\Crypto\Generators\ClpX25519KeyPairGenerator.pas"/>
         <UnitName Value="ClpX25519KeyPairGenerator"/>
         <UnitName Value="ClpX25519KeyPairGenerator"/>
-      </Item327>
-      <Item328>
+      </Item326>
+      <Item327>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519PhBlake2BSigner.pas"/>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519PhBlake2BSigner.pas"/>
         <UnitName Value="ClpEd25519PhBlake2BSigner"/>
         <UnitName Value="ClpEd25519PhBlake2BSigner"/>
-      </Item328>
-      <Item329>
+      </Item327>
+      <Item328>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519PhSigner.pas"/>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519PhSigner.pas"/>
         <UnitName Value="ClpEd25519PhSigner"/>
         <UnitName Value="ClpEd25519PhSigner"/>
-      </Item329>
-      <Item330>
+      </Item328>
+      <Item329>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519Signer.pas"/>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519Signer.pas"/>
         <UnitName Value="ClpEd25519Signer"/>
         <UnitName Value="ClpEd25519Signer"/>
-      </Item330>
-      <Item331>
+      </Item329>
+      <Item330>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519CtxBlake2BSigner.pas"/>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519CtxBlake2BSigner.pas"/>
         <UnitName Value="ClpEd25519CtxBlake2BSigner"/>
         <UnitName Value="ClpEd25519CtxBlake2BSigner"/>
-      </Item331>
-      <Item332>
+      </Item330>
+      <Item331>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519CtxSigner.pas"/>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519CtxSigner.pas"/>
         <UnitName Value="ClpEd25519CtxSigner"/>
         <UnitName Value="ClpEd25519CtxSigner"/>
-      </Item332>
-      <Item333>
+      </Item331>
+      <Item332>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519Blake2BSigner.pas"/>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519Blake2BSigner.pas"/>
         <UnitName Value="ClpEd25519Blake2BSigner"/>
         <UnitName Value="ClpEd25519Blake2BSigner"/>
-      </Item333>
-      <Item334>
+      </Item332>
+      <Item333>
         <Filename Value="..\..\Asn1\TeleTrust\ClpTeleTrusTNamedCurves.pas"/>
         <Filename Value="..\..\Asn1\TeleTrust\ClpTeleTrusTNamedCurves.pas"/>
         <UnitName Value="ClpTeleTrusTNamedCurves"/>
         <UnitName Value="ClpTeleTrusTNamedCurves"/>
-      </Item334>
-      <Item335>
+      </Item333>
+      <Item334>
         <Filename Value="..\..\Security\ClpAgreementUtilities.pas"/>
         <Filename Value="..\..\Security\ClpAgreementUtilities.pas"/>
         <UnitName Value="ClpAgreementUtilities"/>
         <UnitName Value="ClpAgreementUtilities"/>
-      </Item335>
-      <Item336>
+      </Item334>
+      <Item335>
         <Filename Value="..\..\Interfaces\ClpIKdf1BytesGenerator.pas"/>
         <Filename Value="..\..\Interfaces\ClpIKdf1BytesGenerator.pas"/>
         <UnitName Value="ClpIKdf1BytesGenerator"/>
         <UnitName Value="ClpIKdf1BytesGenerator"/>
-      </Item336>
-      <Item337>
+      </Item335>
+      <Item336>
         <Filename Value="..\..\Crypto\Generators\ClpKdf1BytesGenerator.pas"/>
         <Filename Value="..\..\Crypto\Generators\ClpKdf1BytesGenerator.pas"/>
         <UnitName Value="ClpKdf1BytesGenerator"/>
         <UnitName Value="ClpKdf1BytesGenerator"/>
-      </Item337>
-      <Item338>
+      </Item336>
+      <Item337>
         <Filename Value="..\..\Interfaces\ClpIArgon2ParametersGenerator.pas"/>
         <Filename Value="..\..\Interfaces\ClpIArgon2ParametersGenerator.pas"/>
         <UnitName Value="ClpIArgon2ParametersGenerator"/>
         <UnitName Value="ClpIArgon2ParametersGenerator"/>
-      </Item338>
-      <Item339>
+      </Item337>
+      <Item338>
         <Filename Value="..\..\Crypto\Generators\ClpArgon2ParametersGenerator.pas"/>
         <Filename Value="..\..\Crypto\Generators\ClpArgon2ParametersGenerator.pas"/>
         <UnitName Value="ClpArgon2ParametersGenerator"/>
         <UnitName Value="ClpArgon2ParametersGenerator"/>
-      </Item339>
-      <Item340>
+      </Item338>
+      <Item339>
         <Filename Value="..\..\Interfaces\ClpIScryptParametersGenerator.pas"/>
         <Filename Value="..\..\Interfaces\ClpIScryptParametersGenerator.pas"/>
         <UnitName Value="ClpIScryptParametersGenerator"/>
         <UnitName Value="ClpIScryptParametersGenerator"/>
-      </Item340>
-      <Item341>
+      </Item339>
+      <Item340>
         <Filename Value="..\..\Crypto\Generators\ClpScryptParametersGenerator.pas"/>
         <Filename Value="..\..\Crypto\Generators\ClpScryptParametersGenerator.pas"/>
         <UnitName Value="ClpScryptParametersGenerator"/>
         <UnitName Value="ClpScryptParametersGenerator"/>
-      </Item341>
-      <Item342>
+      </Item340>
+      <Item341>
         <Filename Value="..\..\Interfaces\ClpIDHAgreement.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDHAgreement.pas"/>
         <UnitName Value="ClpIDHAgreement"/>
         <UnitName Value="ClpIDHAgreement"/>
-      </Item342>
-      <Item343>
+      </Item341>
+      <Item342>
         <Filename Value="..\..\Interfaces\ClpIDHBasicAgreement.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDHBasicAgreement.pas"/>
         <UnitName Value="ClpIDHBasicAgreement"/>
         <UnitName Value="ClpIDHBasicAgreement"/>
-      </Item343>
-      <Item344>
+      </Item342>
+      <Item343>
         <Filename Value="..\..\Interfaces\ClpIDHBasicKeyPairGenerator.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDHBasicKeyPairGenerator.pas"/>
         <UnitName Value="ClpIDHBasicKeyPairGenerator"/>
         <UnitName Value="ClpIDHBasicKeyPairGenerator"/>
-      </Item344>
-      <Item345>
+      </Item343>
+      <Item344>
         <Filename Value="..\..\Interfaces\ClpIDHKeyPairGenerator.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDHKeyPairGenerator.pas"/>
         <UnitName Value="ClpIDHKeyPairGenerator"/>
         <UnitName Value="ClpIDHKeyPairGenerator"/>
-      </Item345>
-      <Item346>
+      </Item344>
+      <Item345>
         <Filename Value="..\..\Interfaces\ClpIDHPrivateKeyParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDHPrivateKeyParameters.pas"/>
         <UnitName Value="ClpIDHPrivateKeyParameters"/>
         <UnitName Value="ClpIDHPrivateKeyParameters"/>
-      </Item346>
-      <Item347>
+      </Item345>
+      <Item346>
         <Filename Value="..\..\Interfaces\ClpIDHPublicKeyParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDHPublicKeyParameters.pas"/>
         <UnitName Value="ClpIDHPublicKeyParameters"/>
         <UnitName Value="ClpIDHPublicKeyParameters"/>
-      </Item347>
-      <Item348>
+      </Item346>
+      <Item347>
         <Filename Value="..\..\Interfaces\ClpIDHParametersGenerator.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDHParametersGenerator.pas"/>
         <UnitName Value="ClpIDHParametersGenerator"/>
         <UnitName Value="ClpIDHParametersGenerator"/>
-      </Item348>
-      <Item349>
+      </Item347>
+      <Item348>
         <Filename Value="..\..\Interfaces\ClpIDHKeyGenerationParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDHKeyGenerationParameters.pas"/>
         <UnitName Value="ClpIDHKeyGenerationParameters"/>
         <UnitName Value="ClpIDHKeyGenerationParameters"/>
-      </Item349>
-      <Item350>
+      </Item348>
+      <Item349>
         <Filename Value="..\..\Interfaces\ClpIDHParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDHParameters.pas"/>
         <UnitName Value="ClpIDHParameters"/>
         <UnitName Value="ClpIDHParameters"/>
-      </Item350>
-      <Item351>
+      </Item349>
+      <Item350>
         <Filename Value="..\..\Interfaces\ClpIDHKeyGeneratorHelper.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDHKeyGeneratorHelper.pas"/>
         <UnitName Value="ClpIDHKeyGeneratorHelper"/>
         <UnitName Value="ClpIDHKeyGeneratorHelper"/>
-      </Item351>
-      <Item352>
+      </Item350>
+      <Item351>
         <Filename Value="..\..\Interfaces\ClpIDHKeyParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDHKeyParameters.pas"/>
         <UnitName Value="ClpIDHKeyParameters"/>
         <UnitName Value="ClpIDHKeyParameters"/>
-      </Item352>
-      <Item353>
+      </Item351>
+      <Item352>
         <Filename Value="..\..\Interfaces\ClpIDHValidationParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDHValidationParameters.pas"/>
         <UnitName Value="ClpIDHValidationParameters"/>
         <UnitName Value="ClpIDHValidationParameters"/>
-      </Item353>
-      <Item354>
+      </Item352>
+      <Item353>
         <Filename Value="..\..\Interfaces\ClpIDHDomainParameters.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDHDomainParameters.pas"/>
         <UnitName Value="ClpIDHDomainParameters"/>
         <UnitName Value="ClpIDHDomainParameters"/>
-      </Item354>
-      <Item355>
+      </Item353>
+      <Item354>
         <Filename Value="..\..\Interfaces\ClpIDHValidationParams.pas"/>
         <Filename Value="..\..\Interfaces\ClpIDHValidationParams.pas"/>
         <UnitName Value="ClpIDHValidationParams"/>
         <UnitName Value="ClpIDHValidationParams"/>
-      </Item355>
-      <Item356>
+      </Item354>
+      <Item355>
         <Filename Value="..\..\Crypto\Agreement\ClpDHAgreement.pas"/>
         <Filename Value="..\..\Crypto\Agreement\ClpDHAgreement.pas"/>
         <UnitName Value="ClpDHAgreement"/>
         <UnitName Value="ClpDHAgreement"/>
-      </Item356>
-      <Item357>
+      </Item355>
+      <Item356>
         <Filename Value="..\..\Crypto\Agreement\ClpDHBasicAgreement.pas"/>
         <Filename Value="..\..\Crypto\Agreement\ClpDHBasicAgreement.pas"/>
         <UnitName Value="ClpDHBasicAgreement"/>
         <UnitName Value="ClpDHBasicAgreement"/>
-      </Item357>
-      <Item358>
+      </Item356>
+      <Item357>
         <Filename Value="..\..\Crypto\Generators\ClpDHBasicKeyPairGenerator.pas"/>
         <Filename Value="..\..\Crypto\Generators\ClpDHBasicKeyPairGenerator.pas"/>
         <UnitName Value="ClpDHBasicKeyPairGenerator"/>
         <UnitName Value="ClpDHBasicKeyPairGenerator"/>
-      </Item358>
-      <Item359>
+      </Item357>
+      <Item358>
         <Filename Value="..\..\Crypto\Generators\ClpDHKeyPairGenerator.pas"/>
         <Filename Value="..\..\Crypto\Generators\ClpDHKeyPairGenerator.pas"/>
         <UnitName Value="ClpDHKeyPairGenerator"/>
         <UnitName Value="ClpDHKeyPairGenerator"/>
-      </Item359>
-      <Item360>
+      </Item358>
+      <Item359>
         <Filename Value="..\..\Crypto\Generators\ClpDHParametersGenerator.pas"/>
         <Filename Value="..\..\Crypto\Generators\ClpDHParametersGenerator.pas"/>
         <UnitName Value="ClpDHParametersGenerator"/>
         <UnitName Value="ClpDHParametersGenerator"/>
-      </Item360>
-      <Item361>
+      </Item359>
+      <Item360>
         <Filename Value="..\..\Crypto\Generators\ClpDHKeyGeneratorHelper.pas"/>
         <Filename Value="..\..\Crypto\Generators\ClpDHKeyGeneratorHelper.pas"/>
         <UnitName Value="ClpDHKeyGeneratorHelper"/>
         <UnitName Value="ClpDHKeyGeneratorHelper"/>
-      </Item361>
-      <Item362>
+      </Item360>
+      <Item361>
         <Filename Value="..\..\Crypto\Generators\ClpDHParametersHelper.pas"/>
         <Filename Value="..\..\Crypto\Generators\ClpDHParametersHelper.pas"/>
         <UnitName Value="ClpDHParametersHelper"/>
         <UnitName Value="ClpDHParametersHelper"/>
-      </Item362>
-      <Item363>
+      </Item361>
+      <Item362>
         <Filename Value="..\..\Crypto\Parameters\ClpDHPrivateKeyParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpDHPrivateKeyParameters.pas"/>
         <UnitName Value="ClpDHPrivateKeyParameters"/>
         <UnitName Value="ClpDHPrivateKeyParameters"/>
-      </Item363>
-      <Item364>
+      </Item362>
+      <Item363>
         <Filename Value="..\..\Crypto\Parameters\ClpDHPublicKeyParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpDHPublicKeyParameters.pas"/>
         <UnitName Value="ClpDHPublicKeyParameters"/>
         <UnitName Value="ClpDHPublicKeyParameters"/>
-      </Item364>
-      <Item365>
+      </Item363>
+      <Item364>
         <Filename Value="..\..\Crypto\Parameters\ClpDHKeyGenerationParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpDHKeyGenerationParameters.pas"/>
         <UnitName Value="ClpDHKeyGenerationParameters"/>
         <UnitName Value="ClpDHKeyGenerationParameters"/>
-      </Item365>
-      <Item366>
+      </Item364>
+      <Item365>
         <Filename Value="..\..\Crypto\Parameters\ClpDHKeyParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpDHKeyParameters.pas"/>
         <UnitName Value="ClpDHKeyParameters"/>
         <UnitName Value="ClpDHKeyParameters"/>
-      </Item366>
-      <Item367>
+      </Item365>
+      <Item366>
         <Filename Value="..\..\Crypto\Parameters\ClpDHValidationParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpDHValidationParameters.pas"/>
         <UnitName Value="ClpDHValidationParameters"/>
         <UnitName Value="ClpDHValidationParameters"/>
-      </Item367>
-      <Item368>
+      </Item366>
+      <Item367>
         <Filename Value="..\..\Crypto\Parameters\ClpDHParameters.pas"/>
         <Filename Value="..\..\Crypto\Parameters\ClpDHParameters.pas"/>
         <UnitName Value="ClpDHParameters"/>
         <UnitName Value="ClpDHParameters"/>
-      </Item368>
-      <Item369>
+      </Item367>
+      <Item368>
         <Filename Value="..\..\Asn1\X9\ClpDHDomainParameters.pas"/>
         <Filename Value="..\..\Asn1\X9\ClpDHDomainParameters.pas"/>
         <UnitName Value="ClpDHDomainParameters"/>
         <UnitName Value="ClpDHDomainParameters"/>
-      </Item369>
-      <Item370>
+      </Item368>
+      <Item369>
         <Filename Value="..\..\Asn1\X9\ClpDHValidationParams.pas"/>
         <Filename Value="..\..\Asn1\X9\ClpDHValidationParams.pas"/>
         <UnitName Value="ClpDHValidationParams"/>
         <UnitName Value="ClpDHValidationParams"/>
+      </Item369>
+      <Item370>
+        <Filename Value="..\..\Utils\Randoms\ClpAESPRNGRandom.pas"/>
+        <UnitName Value="ClpAESPRNGRandom"/>
       </Item370>
       </Item370>
     </Files>
     </Files>
     <RequiredPkgs Count="3">
     <RequiredPkgs Count="3">

+ 8 - 8
CryptoLib/src/Packages/FPC/CryptoLib4PascalPackage.pas

@@ -45,13 +45,13 @@ uses
   ClpPrimeField, ClpMod, ClpNat, ClpDigestUtilities, ClpRandom, 
   ClpPrimeField, ClpMod, ClpNat, ClpDigestUtilities, ClpRandom, 
   ClpSecureRandom, ClpSignerUtilities, ClpArrayUtils, ClpBigIntegers, 
   ClpSecureRandom, ClpSignerUtilities, ClpArrayUtils, ClpBigIntegers, 
   ClpBitConverter, ClpBits, ClpConverters, ClpCryptoLibTypes, ClpTimes, 
   ClpBitConverter, ClpBits, ClpConverters, ClpCryptoLibTypes, ClpTimes, 
-  ClpOSRandom, ClpPcgRandomMinimal, ClpRandomNumberGenerator, ClpSetWeakRef, 
-  ClpParameterUtilities, ClpGeneratorUtilities, ClpCipherUtilities, 
-  ClpIAesEngine, ClpIParametersWithIV, ClpIPaddedBufferedBlockCipher, 
-  ClpIKeyParameter, ClpIBufferedCipherBase, ClpIBufferedCipher, 
-  ClpIBufferedBlockCipher, ClpIBlockCipherPadding, ClpIBlockCipher, 
-  ClpPaddedBufferedBlockCipher, ClpParametersWithIV, ClpKeyParameter, 
-  ClpBufferedBlockCipher, ClpBufferedCipherBase, ClpCheck, ClpAesEngine, 
+  ClpOSRandom, ClpRandomNumberGenerator, ClpSetWeakRef, ClpParameterUtilities, 
+  ClpGeneratorUtilities, ClpCipherUtilities, ClpIAesEngine, 
+  ClpIParametersWithIV, ClpIPaddedBufferedBlockCipher, ClpIKeyParameter, 
+  ClpIBufferedCipherBase, ClpIBufferedCipher, ClpIBufferedBlockCipher, 
+  ClpIBlockCipherPadding, ClpIBlockCipher, ClpPaddedBufferedBlockCipher, 
+  ClpParametersWithIV, ClpKeyParameter, ClpBufferedBlockCipher, 
+  ClpBufferedCipherBase, ClpCheck, ClpAesEngine, 
   ClpPascalCoinECIESKdfBytesGenerator, ClpPascalCoinIESEngine, 
   ClpPascalCoinECIESKdfBytesGenerator, ClpPascalCoinIESEngine, 
   ClpBaseKdfBytesGenerator, ClpIESEngine, ClpECIESPublicKeyParser, 
   ClpBaseKdfBytesGenerator, ClpIESEngine, ClpECIESPublicKeyParser, 
   ClpIESCipher, ClpECDHBasicAgreement, ClpEphemeralKeyPair, ClpKeyEncoder, 
   ClpIESCipher, ClpECDHBasicAgreement, ClpEphemeralKeyPair, ClpKeyEncoder, 
@@ -133,7 +133,7 @@ uses
   ClpDHKeyGeneratorHelper, ClpDHParametersHelper, ClpDHPrivateKeyParameters, 
   ClpDHKeyGeneratorHelper, ClpDHParametersHelper, ClpDHPrivateKeyParameters, 
   ClpDHPublicKeyParameters, ClpDHKeyGenerationParameters, ClpDHKeyParameters, 
   ClpDHPublicKeyParameters, ClpDHKeyGenerationParameters, ClpDHKeyParameters, 
   ClpDHValidationParameters, ClpDHParameters, ClpDHDomainParameters, 
   ClpDHValidationParameters, ClpDHParameters, ClpDHDomainParameters, 
-  ClpDHValidationParams;
+  ClpDHValidationParams, ClpAESPRNGRandom;
 
 
 implementation
 implementation
 
 

+ 6 - 1
CryptoLib/src/Security/ClpSecureRandom.pas

@@ -230,7 +230,6 @@ end;
 
 
 class function TSecureRandom.NextCounterValue: Int64;
 class function TSecureRandom.NextCounterValue: Int64;
 begin
 begin
-
   FLock.Acquire;
   FLock.Acquire;
   try
   try
     System.Inc(FCounter);
     System.Inc(FCounter);
@@ -238,6 +237,12 @@ begin
   finally
   finally
     FLock.Release;
     FLock.Release;
   end;
   end;
+  // TODO when we upgrade to FPC 3.2.0 enable and remove locks above
+  // {$IFDEF FPC}
+  // Result := InterLockedIncrement64(FCounter);
+  // {$ELSE}
+  // Result := TInterlocked.Increment(FCounter);
+  // {$ENDIF}
 end;
 end;
 
 
 function TSecureRandom.NextDouble: Double;
 function TSecureRandom.NextDouble: Double;

+ 19 - 2
CryptoLib/src/Utils/ClpArrayUtils.pas

@@ -97,6 +97,8 @@ type
 
 
     class procedure ZeroFill(const buf: TCryptoLibByteArray); static;
     class procedure ZeroFill(const buf: TCryptoLibByteArray); static;
 
 
+    class function NoZeroes(const data: TCryptoLibByteArray): Boolean; static;
+
   end;
   end;
 
 
 implementation
 implementation
@@ -116,6 +118,21 @@ begin
   Result := newLength;
   Result := newLength;
 end;
 end;
 
 
+class function TArrayUtils.NoZeroes(const data: TCryptoLibByteArray): Boolean;
+var
+  i: Int32;
+begin
+  Result := True;
+  for i := System.Low(data) to System.High(data) do
+  begin
+    if data[i] = 0 then
+    begin
+      Result := False;
+      Exit;
+    end;
+  end;
+end;
+
 class function TArrayUtils.Concatenate(const A, B: TCryptoLibByteArray)
 class function TArrayUtils.Concatenate(const A, B: TCryptoLibByteArray)
   : TCryptoLibByteArray;
   : TCryptoLibByteArray;
 var
 var
@@ -173,7 +190,7 @@ class function TArrayUtils.AreEqual(const A, B: TCryptoLibByteArray): Boolean;
 begin
 begin
   if System.Length(A) <> System.Length(B) then
   if System.Length(A) <> System.Length(B) then
   begin
   begin
-    Result := false;
+    Result := False;
     Exit;
     Exit;
   end;
   end;
 
 
@@ -198,7 +215,7 @@ class function TArrayUtils.AreEqual(const A, B: TCryptoLibInt32Array): Boolean;
 begin
 begin
   if System.Length(A) <> System.Length(B) then
   if System.Length(A) <> System.Length(B) then
   begin
   begin
-    Result := false;
+    Result := False;
     Exit;
     Exit;
   end;
   end;
 
 

+ 275 - 0
CryptoLib/src/Utils/Randoms/ClpAESPRNGRandom.pas

@@ -0,0 +1,275 @@
+{ *********************************************************************************** }
+{ *                              CryptoLib Library                                  * }
+{ *                Copyright (c) 2018 - 20XX Ugochukwu Mmaduekwe                    * }
+{ *                 Github Repository <https://github.com/Xor-el>                   * }
+
+{ *  Distributed under the MIT software license, see the accompanying file LICENSE  * }
+{ *          or visit http://www.opensource.org/licenses/mit-license.php.           * }
+
+{ *                              Acknowledgements:                                  * }
+{ *                                                                                 * }
+{ *      Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring     * }
+{ *                           development of this library                           * }
+
+{ * ******************************************************************************* * }
+
+(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
+
+unit ClpAESPRNGRandom;
+
+{$I ..\..\Include\CryptoLib.inc}
+
+interface
+
+uses
+  SyncObjs,
+  ClpAesEngine,
+  ClpIAesEngine,
+  ClpIBlockCipher,
+  ClpIKeyParameter,
+  ClpKeyParameter,
+  ClpIBufferedCipher,
+  ClpIBufferedBlockCipher,
+  ClpBufferedBlockCipher,
+  ClpArrayUtils,
+  ClpOSRandom,
+  ClpCryptoLibTypes;
+
+resourcestring
+  SInvalidAESRNGSeedLength =
+    'AES RNG Seed Length must be either one of these "128/192/256 bits".';
+
+type
+  IAESPRNGRandom = interface(IInterface)
+    ['{DE2F9387-CD63-475F-AD4B-EA0692790FB2}']
+
+    procedure FillBytes(const data: TCryptoLibByteArray);
+    procedure FillNonZeroBytes(const data: TCryptoLibByteArray);
+
+  end;
+
+type
+  TAESPRNGRandom = class sealed(TInterfacedObject, IAESPRNGRandom)
+
+  strict private
+  const
+    COUNTER_SIZE = Int32(16);
+    class var
+
+      FDefaultInstance: IAESPRNGRandom;
+
+  var
+    FLock: TCriticalSection;
+    FCounter: TCryptoLibByteArray;
+    FAESRNGSeedLength, FBytesSinceSeed, FReseedAfterBytes: Int32;
+    FCipher: IBufferedCipher;
+
+    class function GetDefaultInstance: IAESPRNGRandom; static; inline;
+
+    class procedure GetRawEntropy(const AEntropy: TCryptoLibByteArray); inline;
+
+    class procedure Boot(); static;
+    class constructor CreateAESPRNGRandom();
+    class destructor DestroyAESPRNGRandom();
+
+    class procedure ValidateAESRNGSeedLength(ASeedLength: Int32);
+
+    constructor Create(const AAESRNGSeed: TCryptoLibByteArray;
+      AReseedAfterBytes: Int32); overload;
+
+    procedure DoIncrementCounter();
+
+    procedure DoSeed(const AAESRNGSeed: TCryptoLibByteArray);
+
+  public
+    constructor Create(AAESRNGSeedLength: Int32 = 32;
+      AReseedAfterBytes: Int32 = 1024 * 1024); overload;
+
+    destructor Destroy; override;
+
+    procedure FillBytes(const data: TCryptoLibByteArray); overload;
+    procedure FillNonZeroBytes(const data: TCryptoLibByteArray); overload;
+
+    class procedure GetBytes(const data: TCryptoLibByteArray); overload; static;
+    class procedure GetNonZeroBytes(const data: TCryptoLibByteArray);
+      overload; static;
+
+    class property DefaultInstance: IAESPRNGRandom read GetDefaultInstance;
+
+  end;
+
+implementation
+
+{ TAESPRNGRandom }
+
+class function TAESPRNGRandom.GetDefaultInstance: IAESPRNGRandom;
+begin
+  result := FDefaultInstance;
+end;
+
+class procedure TAESPRNGRandom.ValidateAESRNGSeedLength(ASeedLength: Int32);
+begin
+  if ((ASeedLength < 16) or (ASeedLength > 32) or ((ASeedLength and 7) <> 0))
+  then
+  begin
+    raise EArgumentCryptoLibException.CreateRes(@SInvalidAESRNGSeedLength);
+  end;
+end;
+
+class procedure TAESPRNGRandom.GetRawEntropy(const AEntropy
+  : TCryptoLibByteArray);
+begin
+  TOSRandom.GetBytes(AEntropy);
+end;
+
+class procedure TAESPRNGRandom.Boot;
+begin
+  if FDefaultInstance = Nil then
+  begin
+    FDefaultInstance := TAESPRNGRandom.Create();
+  end;
+end;
+
+procedure TAESPRNGRandom.DoIncrementCounter;
+var
+  i: Int32;
+begin
+  for i := System.Low(FCounter) to System.High(FCounter) do
+  begin
+    System.Inc(FCounter[i]);
+    // Check whether we need to loop again to carry the one.
+    if (FCounter[i] <> 0) then
+    begin
+      break;
+    end;
+  end;
+end;
+
+procedure TAESPRNGRandom.DoSeed(const AAESRNGSeed: TCryptoLibByteArray);
+var
+  LKeyParameter: IKeyParameter;
+begin
+  LKeyParameter := TKeyParameter.Create(AAESRNGSeed);
+  FLock.Acquire;
+  try
+    FCipher.Init(True, LKeyParameter);
+    FBytesSinceSeed := 0;
+  finally
+    FLock.Release;
+  end;
+end;
+
+constructor TAESPRNGRandom.Create(const AAESRNGSeed: TCryptoLibByteArray;
+  AReseedAfterBytes: Int32);
+var
+  LAesEngine: IAesEngine;
+  LBlockCipher: IBlockCipher;
+  LAESRNGSeed: TCryptoLibByteArray;
+begin
+  Inherited Create();
+  LAESRNGSeed := System.Copy(AAESRNGSeed);
+  FLock := TCriticalSection.Create;
+  // Set up engine
+  LAesEngine := TAesEngine.Create();
+  LBlockCipher := LAesEngine as IBlockCipher; // ECB no padding
+  FCipher := TBufferedBlockCipher.Create(LBlockCipher) as IBufferedBlockCipher;
+  System.SetLength(FCounter, COUNTER_SIZE);
+  FAESRNGSeedLength := System.Length(LAESRNGSeed);
+  FReseedAfterBytes := AReseedAfterBytes;
+  ValidateAESRNGSeedLength(FAESRNGSeedLength);
+  DoSeed(LAESRNGSeed);
+  TArrayUtils.ZeroFill(LAESRNGSeed); // clear key from memory
+end;
+
+constructor TAESPRNGRandom.Create(AAESRNGSeedLength, AReseedAfterBytes: Int32);
+var
+  LSeed: TCryptoLibByteArray;
+begin
+  System.SetLength(LSeed, AAESRNGSeedLength);
+  GetRawEntropy(LSeed); // pure entropy from OS
+  Create(LSeed, AReseedAfterBytes);
+  TArrayUtils.ZeroFill(LSeed); // clear seed from memory
+end;
+
+destructor TAESPRNGRandom.Destroy;
+begin
+  FLock.Free;
+  inherited Destroy;
+end;
+
+procedure TAESPRNGRandom.FillBytes(const data: TCryptoLibByteArray);
+var
+  LDataLength, LDatum, LResultLength: Int32;
+  LSeed, LResult: TCryptoLibByteArray;
+begin
+  LDataLength := System.Length(data);
+  if LDataLength <= 0 then
+  begin
+    Exit;
+  end;
+
+  if (FBytesSinceSeed > FReseedAfterBytes) then
+  begin
+    System.SetLength(LSeed, FAESRNGSeedLength);
+    GetRawEntropy(LSeed); // pure entropy from OS
+    DoSeed(LSeed);
+    TArrayUtils.ZeroFill(LSeed); // clear seed from memory
+  end;
+
+  LDatum := 0;
+
+  FLock.Acquire;
+  try
+    while (LDataLength shr 4) > 0 do
+    begin
+      DoIncrementCounter;
+      LResultLength := FCipher.DoFinal(FCounter, data, LDatum);
+
+      System.Inc(LDatum, LResultLength);
+      System.Inc(FBytesSinceSeed, LResultLength);
+      System.Dec(LDataLength, LResultLength);
+    end;
+
+    if LDataLength > 0 then
+    begin
+      DoIncrementCounter;
+      LResult := FCipher.DoFinal(FCounter);
+      System.Move(LResult[0], data[LDatum], LDataLength * System.SizeOf(Byte));
+
+      // System.Inc(LDatum, LDataLength);
+      System.Inc(FBytesSinceSeed, LDataLength);
+    end;
+
+  finally
+    FLock.Release;
+  end;
+end;
+
+procedure TAESPRNGRandom.FillNonZeroBytes(const data: TCryptoLibByteArray);
+begin
+  repeat
+    FillBytes(data);
+  until (TArrayUtils.NoZeroes(data));
+end;
+
+class constructor TAESPRNGRandom.CreateAESPRNGRandom;
+begin
+  TAESPRNGRandom.Boot();
+end;
+
+class destructor TAESPRNGRandom.DestroyAESPRNGRandom;
+begin
+  FDefaultInstance := Nil;
+end;
+
+class procedure TAESPRNGRandom.GetBytes(const data: TCryptoLibByteArray);
+begin
+  DefaultInstance.FillBytes(data);
+end;
+
+class procedure TAESPRNGRandom.GetNonZeroBytes(const data: TCryptoLibByteArray);
+begin
+  DefaultInstance.FillNonZeroBytes(data);
+end;
+
+end.

+ 6 - 18
CryptoLib/src/Utils/Randoms/ClpOSRandom.pas

@@ -63,6 +63,7 @@ uses
 {$IF DEFINED(CRYPTOLIB_MSWINDOWS) OR DEFINED(CRYPTOLIB_UNIX)}
 {$IF DEFINED(CRYPTOLIB_MSWINDOWS) OR DEFINED(CRYPTOLIB_UNIX)}
   SysUtils,
   SysUtils,
 {$IFEND}  // ENDIF CRYPTOLIB_MSWINDOWS OR CRYPTOLIB_UNIX
 {$IFEND}  // ENDIF CRYPTOLIB_MSWINDOWS OR CRYPTOLIB_UNIX
+  ClpArrayUtils,
   ClpCryptoLibTypes;
   ClpCryptoLibTypes;
 
 
 resourcestring
 resourcestring
@@ -266,8 +267,6 @@ type
 {$ENDIF}
 {$ENDIF}
     // ================================================================//
     // ================================================================//
 
 
-    class function NoZeroes(const data: TCryptoLibByteArray): Boolean;
-      static; inline;
     class procedure Boot(); static;
     class procedure Boot(); static;
     class constructor OSRandom();
     class constructor OSRandom();
 
 
@@ -300,10 +299,14 @@ function CryptReleaseContext(hProv: THandle; dwFlags: DWORD): BOOL; stdcall;
 
 
 type
 type
   // similar to a TOpaqueData already defined in newer FPC but not available in 3.0.4
   // similar to a TOpaqueData already defined in newer FPC but not available in 3.0.4
+  // TODO when we upgrade to FPC 3.2.0, remove " __SecRandom = record end;" declaration
   __SecRandom = record
   __SecRandom = record
   end;
   end;
 
 
   // similar to POpaqueData (or an OpaquePointer) already defined in newer FPC but not available in 3.0.4
   // similar to POpaqueData (or an OpaquePointer) already defined in newer FPC but not available in 3.0.4
+  // TODO when we upgrade to FPC 3.2.0, use inbuilt OpaquePointer instead
+  // replace "SecRandomRef = ^__SecRandom;" with "SecRandomRef = OpaquePointer;"
+
   SecRandomRef = ^__SecRandom;
   SecRandomRef = ^__SecRandom;
 
 
 function SecRandomCopyBytes(rnd: SecRandomRef; count: LongWord; bytes: PByte)
 function SecRandomCopyBytes(rnd: SecRandomRef; count: LongWord; bytes: PByte)
@@ -330,21 +333,6 @@ procedure arc4random_buf(bytes: PByte; count: LongWord); cdecl; external;
 
 
 implementation
 implementation
 
 
-class function TOSRandom.NoZeroes(const data: TCryptoLibByteArray): Boolean;
-var
-  i: Int32;
-begin
-  result := True;
-  for i := System.Low(data) to System.High(data) do
-  begin
-    if data[i] = 0 then
-    begin
-      result := False;
-      Exit;
-    end;
-  end;
-end;
-
 class procedure TOSRandom.Boot;
 class procedure TOSRandom.Boot;
 begin
 begin
 {$IFDEF CRYPTOLIB_MSWINDOWS}
 {$IFDEF CRYPTOLIB_MSWINDOWS}
@@ -721,7 +709,7 @@ class procedure TOSRandom.GetNonZeroBytes(const data: TCryptoLibByteArray);
 begin
 begin
   repeat
   repeat
     TOSRandom.GetBytes(data);
     TOSRandom.GetBytes(data);
-  until (NoZeroes(data));
+  until (TArrayUtils.NoZeroes(data));
 end;
 end;
 
 
 end.
 end.

+ 0 - 291
CryptoLib/src/Utils/Randoms/ClpPcgRandomMinimal.pas

@@ -1,291 +0,0 @@
-{ *********************************************************************************** }
-{ *                              CryptoLib Library                                  * }
-{ *                Copyright (c) 2018 - 20XX Ugochukwu Mmaduekwe                    * }
-{ *                 Github Repository <https://github.com/Xor-el>                   * }
-
-{ *  Distributed under the MIT software license, see the accompanying file LICENSE  * }
-{ *          or visit http://www.opensource.org/licenses/mit-license.php.           * }
-
-{ *                              Acknowledgements:                                  * }
-{ *                                                                                 * }
-{ *      Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring     * }
-{ *                           development of this library                           * }
-
-{ * ******************************************************************************* * }
-
-(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
-
-unit ClpPcgRandomMinimal;
-
-{$I ..\..\Include\CryptoLib.inc}
-(*
-  * PCG Random Number Generation for Pascal.
-  *
-  * Copyright 2015 Ugochukwu Mmaduekwe <[email protected]>
-  * Copyright 2015 Kevin Harris <[email protected]>
-  * Copyright 2014 Melissa O'Neill <[email protected]>
-  *
-  * For additional information about the PCG random number generation scheme,
-  * including its license and other licensing options, visit
-  *
-  *     http://www.pcg-random.org
-*)
-
-interface
-
-uses
-  SysUtils;
-
-type
-
-  /// <summary>
-  /// The Pcg Random Number Class.
-  /// </summary>
-
-  TPcg = class sealed(TObject)
-
-  strict private
-
-  class var
-    /// <summary>
-    /// The RNG state. All values are possible.
-    /// </summary>
-    Fm_state: UInt64;
-
-    /// <summary>
-    /// Controls which RNG sequence (stream) is selected.
-    /// Must <strong>always</strong> be odd.
-    /// </summary>
-    Fm_inc: UInt64;
-
-    /// <summary>
-    /// Record to help Cast a Comp to an Int64.
-    /// </summary>
-    /// <returns> Int64 </returns>
-
-  type
-
-    CompConverter = record
-    private
-      /// <summary>
-      /// Internal variable used for Casting.
-      /// </summary>
-      FI64: Int64;
-    end;
-
-    /// <summary>
-    /// static class constructor.
-    /// Initializes a new instance of the <see cref="TPcg"/> class
-    /// <strong>FOR USAGE</strong> with <strong>SYSTEM TIME</strong> as initState.
-    /// </summary>
-
-  class constructor Create;
-
-  /// <summary>
-  /// Seed Pcg in two parts, a state initializer
-  /// and a sequence selection constant (a.k.a.
-  /// stream id).
-  /// </summary>
-  /// <param name="initState">Initial state.</param>
-  /// <param name="initSeq">Initial sequence</param>
-
-  class procedure Seed(initState: UInt64; initSeq: UInt64); static;
-
-  /// <summary>
-  /// Generates a uniformly distributed number, r,
-  /// where 0 &lt;= r &lt; exclusiveBound.
-  /// </summary>
-  /// <param name="exclusiveBound">Exclusive bound.</param>
-
-  class function Range32(exclusiveBound: UInt32): UInt32; static;
-
-  /// <summary>
-  /// Generates an Init State from System Time.
-  /// </summary>
-  /// <param name="initSeq">Calculated initSeq.</param>
-  /// <returns> UInt64 </returns>
-
-  class function GetInitState(out initSeq: UInt64): UInt64; static; inline;
-
-  /// <summary>
-  /// Generates an Init Sequence from GetInitState value * 181783497276652981.
-  /// <param name="tempVal">Previous value from GetInitState.</param>
-  /// </summary>
-  /// <returns> UInt64 </returns>
-
-  class function GetInitSeq(tempVal: UInt64): UInt64; static; inline;
-
-  public
-
-    /// <summary>
-    /// Initializes a new instance of the <see cref="TPcg"/> class
-    /// <strong>FOR TESTING</strong> with a <strong>KNOWN</strong> seed.
-    /// </summary>
-
-    constructor Create(); overload;
-
-    /// <summary>
-    /// Initializes a new instance of the <see cref="TPcg"/> class.
-    /// </summary>
-    /// <param name="initState">Initial state.</param>
-    /// <param name="initSeq">Initial sequence</param>
-
-    constructor Create(initState: UInt64; initSeq: UInt64); overload;
-
-    /// <summary>
-    /// Generates a uniformly-distributed 32-bit random number.
-    /// </summary>
-
-    class function NextUInt32(): UInt32; overload; inline;
-
-    /// <summary>
-    /// Generates a uniformly distributed number, r,
-    /// where minimum &lt;= r &lt; exclusiveBound.
-    /// </summary>
-    /// <param name="minimum">The minimum inclusive value.</param>
-    /// <param name="exclusiveBound">The maximum exclusive bound.</param>
-
-    class function NextUInt32(minimum, exclusiveBound: UInt32): UInt32;
-      overload; inline;
-
-    /// <summary>
-    /// Generates a uniformly distributed number, r,
-    /// where minimum &lt;= r &lt; exclusiveBound.
-    /// </summary>
-    /// <param name="minimum">The minimum inclusive value.</param>
-    /// <param name="exclusiveBound">The maximum exclusive bound.</param>
-
-    class function NextInt(minimum, exclusiveBound: Int32): Int32; inline;
-
-  end;
-
-implementation
-
-class function TPcg.NextUInt32(): UInt32;
-var
-  oldState, LValue: UInt64;
-  xorShifted: UInt32;
-  rot: Int32;
-begin
-  oldState := Fm_state;
-  LValue := UInt64(6364136223846793005);
-  Fm_state := oldState * LValue + Fm_inc;
-  xorShifted := UInt32(((oldState shr 18) xor oldState) shr 27);
-  rot := Int32(oldState shr 59);
-  result := (xorShifted shr rot) or (xorShifted shl ((-rot) and 31));
-end;
-
-class function TPcg.NextUInt32(minimum: UInt32; exclusiveBound: UInt32): UInt32;
-var
-  boundRange, rangeResult: UInt32;
-begin
-  boundRange := exclusiveBound - minimum;
-  rangeResult := Range32(boundRange);
-  result := rangeResult + minimum;
-end;
-
-class function TPcg.Range32(exclusiveBound: UInt32): UInt32;
-var
-  r, threshold: UInt32;
-begin
-  // To avoid bias, we need to make the range of the RNG
-  // a multiple of bound, which we do by dropping output
-  // less than a threshold. A naive scheme to calculate the
-  // threshold would be to do
-  //
-  // threshold = UInt64($100000000) mod exclusiveBound;
-  //
-  // but 64-bit div/mod is slower than 32-bit div/mod
-  // (especially on 32-bit platforms). In essence, we do
-  //
-  // threshold := UInt32((UInt64($100000000) - exclusiveBound) mod exclusiveBound);
-  //
-  // because this version will calculate the same modulus,
-  // but the LHS value is less than 2^32.
-  threshold := UInt32((UInt64($100000000) - exclusiveBound) mod exclusiveBound);
-
-  // Uniformity guarantees that this loop will terminate.
-  // In practice, it should terminate quickly; on average
-  // (assuming all bounds are equally likely), 82.25% of
-  // the time, we can expect it to require just one
-  // iteration. In the worst case, someone passes a bound
-  // of 2^31 + 1 (i.e., 2147483649), which invalidates
-  // almost 50% of the range. In practice bounds are
-  // typically small and only a tiny amount of the range
-  // is eliminated.
-  while True do
-  begin
-    r := NextUInt32();
-    if (r >= threshold) then
-    begin
-      result := r mod exclusiveBound;
-      Exit;
-    end;
-
-  end;
-  result := 0; // to make FixInsight Happy :)
-end;
-
-class procedure TPcg.Seed(initState: UInt64; initSeq: UInt64);
-begin
-  Fm_state := UInt32(0);
-  Fm_inc := (initSeq shl 1) or UInt64(1);
-  NextUInt32();
-  Fm_state := Fm_state + initState;
-  NextUInt32();
-end;
-
-class function TPcg.GetInitSeq(tempVal: UInt64): UInt64;
-
-begin
-  result := tempVal * UInt64(181783497276652981);
-end;
-
-class function TPcg.GetInitState(out initSeq: UInt64): UInt64;
-
-begin
-  result := UInt64
-    (CompConverter(TimeStampToMsecs(DateTimeToTimeStamp(Now))).FI64);
-  initSeq := GetInitSeq(result) * UInt64(Int64(1000000));
-
-end;
-
-// static class constructor
-class constructor TPcg.Create();
-var
-  LinitState, LinitSeq: UInt64;
-begin
-
-  LinitState := GetInitState(LinitSeq);
-  // ==> initializes using system time as initState and calculated value as
-  // initSeq
-  Seed(LinitState, LinitSeq);
-
-end;
-
-constructor TPcg.Create();
-var
-  LinitState, LinitSeq: UInt64;
-begin
-  // ==> initializes using default seeds. you can change it to any reasonable
-  // value
-  LinitState := UInt64($853C49E6748FEA9B);
-  LinitSeq := UInt64($DA3E39CB94B95BDB);
-  Seed(LinitState, LinitSeq);
-end;
-
-constructor TPcg.Create(initState, initSeq: UInt64);
-begin
-  Seed(initState, initSeq);
-end;
-
-class function TPcg.NextInt(minimum, exclusiveBound: Int32): Int32;
-var
-  boundRange, rangeResult: UInt32;
-begin
-  boundRange := UInt32(exclusiveBound - minimum);
-  rangeResult := Range32(boundRange);
-  result := Int32(rangeResult) + Int32(minimum);
-end;
-
-end.

+ 13 - 33
CryptoLib/src/Utils/Rng/ClpRandomNumberGenerator.pas

@@ -24,7 +24,7 @@ interface
 uses
 uses
   ClpCryptoLibTypes,
   ClpCryptoLibTypes,
   ClpOSRandom,
   ClpOSRandom,
-  ClpPcgRandomMinimal,
+  ClpAESPRNGRandom,
   ClpIRandomNumberGenerator;
   ClpIRandomNumberGenerator;
 
 
 resourcestring
 resourcestring
@@ -44,7 +44,7 @@ type
 
 
     type
     type
 {$SCOPEDENUMS ON}
 {$SCOPEDENUMS ON}
-    TRandomNumberGeneratorMode = (rngmOS = 0, rngmPCG = 1);
+    TRandomNumberGeneratorMode = (rngmOS = 0, rngmAES = 1);
 {$SCOPEDENUMS OFF}
 {$SCOPEDENUMS OFF}
   class function CreateRNG(): IRandomNumberGenerator; overload; static;
   class function CreateRNG(): IRandomNumberGenerator; overload; static;
 
 
@@ -71,8 +71,8 @@ type
   end;
   end;
 
 
 type
 type
-  TPCGRandomNumberGenerator = class sealed(TRandomNumberGenerator,
-    IPCGRandomNumberGenerator)
+  TAESPRNGRandomNumberGenerator = class sealed(TRandomNumberGenerator,
+    IAESPRNGRandomNumberGenerator)
 
 
   public
   public
     constructor Create();
     constructor Create();
@@ -113,9 +113,9 @@ begin
         Exit;
         Exit;
       end;
       end;
 
 
-    TRandomNumberGeneratorMode.rngmPCG:
+    TRandomNumberGeneratorMode.rngmAES:
       begin
       begin
-        result := TPCGRandomNumberGenerator.Create();
+        result := TAESPRNGRandomNumberGenerator.Create();
         Exit;
         Exit;
       end
       end
 
 
@@ -148,45 +148,25 @@ begin
   TOSRandom.GetNonZeroBytes(data);
   TOSRandom.GetNonZeroBytes(data);
 end;
 end;
 
 
-{ TPCGRandomNumberGenerator }
+{ TAESPRNGRandomNumberGenerator }
 
 
-constructor TPCGRandomNumberGenerator.Create;
+constructor TAESPRNGRandomNumberGenerator.Create;
 begin
 begin
   inherited Create();
   inherited Create();
 end;
 end;
 
 
-procedure TPCGRandomNumberGenerator.GetBytes(const data: TCryptoLibByteArray);
-var
-  i: Int64;
+procedure TAESPRNGRandomNumberGenerator.GetBytes
+  (const data: TCryptoLibByteArray);
 begin
 begin
   ValidateOutputBufferNotNull(data);
   ValidateOutputBufferNotNull(data);
-  i := System.Length(data);
-  while i > 0 do
-  begin
-    data[i - 1] := Byte(TPcg.NextInt(System.Low(Int32), System.High(Int32)));
-    System.Dec(i);
-  end;
-
+  TAESPRNGRandom.GetBytes(data);
 end;
 end;
 
 
-procedure TPCGRandomNumberGenerator.GetNonZeroBytes
+procedure TAESPRNGRandomNumberGenerator.GetNonZeroBytes
   (const data: TCryptoLibByteArray);
   (const data: TCryptoLibByteArray);
-var
-  i: Int64;
-  val: Byte;
 begin
 begin
   ValidateOutputBufferNotNull(data);
   ValidateOutputBufferNotNull(data);
-  i := System.Length(data);
-  while i > 0 do
-  begin
-    repeat
-      val := Byte(TPcg.NextUInt32(System.Low(UInt32), System.High(UInt32)));
-    until (not(val = 0));
-
-    data[i - 1] := val;
-    System.Dec(i);
-  end;
-
+  TAESPRNGRandom.GetNonZeroBytes(data);
 end;
 end;
 
 
 end.
 end.