2
0
Эх сурвалжийг харах

add Kdf1BytesGenerator and ShortenedDigest class

-add Kdf1BytesGenerator tests
-add Kdf2BytesGenerator tests
-add ShortenedDigest tests
Ugochukwu Mmaduekwe 6 жил өмнө
parent
commit
2a0df6baae

+ 2 - 0
CryptoLib.Samples/Delphi.Samples/UsageSamples.dpr

@@ -339,6 +339,8 @@ uses
   ClpEd25519PhBlake2BSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpEd25519PhBlake2BSigner.pas',
   ClpTeleTrusTNamedCurves in '..\..\CryptoLib\src\Asn1\TeleTrust\ClpTeleTrusTNamedCurves.pas',
   ClpAgreementUtilities in '..\..\CryptoLib\src\Security\ClpAgreementUtilities.pas',
+  ClpKdf1BytesGenerator in '..\..\CryptoLib\src\Crypto\Generators\ClpKdf1BytesGenerator.pas',
+  ClpIKdf1BytesGenerator in '..\..\CryptoLib\src\Interfaces\ClpIKdf1BytesGenerator.pas',
   UsageExamples in '..\src\UsageExamples.pas';
 
 begin

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

@@ -349,8 +349,12 @@ uses
   ClpEd25519PhBlake2BSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpEd25519PhBlake2BSigner.pas',
   ClpTeleTrusTNamedCurves in '..\..\CryptoLib\src\Asn1\TeleTrust\ClpTeleTrusTNamedCurves.pas',
   ClpAgreementUtilities in '..\..\CryptoLib\src\Security\ClpAgreementUtilities.pas',
+  ClpKdf1BytesGenerator in '..\..\CryptoLib\src\Crypto\Generators\ClpKdf1BytesGenerator.pas',
+  ClpIKdf1BytesGenerator in '..\..\CryptoLib\src\Interfaces\ClpIKdf1BytesGenerator.pas',
   ClpFixedSecureRandom in '..\src\Utils\ClpFixedSecureRandom.pas',
   ClpIFixedSecureRandom in '..\src\Utils\ClpIFixedSecureRandom.pas',
+  ClpIShortenedDigest in '..\src\Utils\ClpIShortenedDigest.pas',
+  ClpShortenedDigest in '..\src\Utils\ClpShortenedDigest.pas',
   BlowfishTestVectors in '..\src\Crypto\BlowfishTestVectors.pas',
   BlockCipherVectorTests in '..\src\Crypto\BlockCipherVectorTests.pas',
   AESTestVectors in '..\src\Crypto\AESTestVectors.pas',
@@ -408,7 +412,10 @@ uses
   X25519Tests in '..\src\Math\EC\Rfc7748\X25519Tests.pas',
   Ed25519Tests in '..\src\Math\EC\Rfc8032\Ed25519Tests.pas',
   X25519HigherLevelTests in '..\src\Others\X25519HigherLevelTests.pas',
-  Ed25519HigherLevelTests in '..\src\Others\Ed25519HigherLevelTests.pas';
+  Ed25519HigherLevelTests in '..\src\Others\Ed25519HigherLevelTests.pas',
+  ShortenedDigestTests in '..\src\Others\ShortenedDigestTests.pas',
+  Kdf1GeneratorTests in '..\src\Crypto\Kdf1GeneratorTests.pas',
+  Kdf2GeneratorTests in '..\src\Crypto\Kdf2GeneratorTests.pas';
 
 begin
 

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

@@ -352,8 +352,12 @@ uses
   ClpEd25519PhBlake2BSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpEd25519PhBlake2BSigner.pas',
   ClpTeleTrusTNamedCurves in '..\..\CryptoLib\src\Asn1\TeleTrust\ClpTeleTrusTNamedCurves.pas',
   ClpAgreementUtilities in '..\..\CryptoLib\src\Security\ClpAgreementUtilities.pas',
+  ClpKdf1BytesGenerator in '..\..\CryptoLib\src\Crypto\Generators\ClpKdf1BytesGenerator.pas',
+  ClpIKdf1BytesGenerator in '..\..\CryptoLib\src\Interfaces\ClpIKdf1BytesGenerator.pas',
   ClpFixedSecureRandom in '..\src\Utils\ClpFixedSecureRandom.pas',
   ClpIFixedSecureRandom in '..\src\Utils\ClpIFixedSecureRandom.pas',
+  ClpIShortenedDigest in '..\src\Utils\ClpIShortenedDigest.pas',
+  ClpShortenedDigest in '..\src\Utils\ClpShortenedDigest.pas',
   BlowfishTestVectors in '..\src\Crypto\BlowfishTestVectors.pas',
   BlockCipherVectorTests in '..\src\Crypto\BlockCipherVectorTests.pas',
   AESTestVectors in '..\src\Crypto\AESTestVectors.pas',
@@ -411,7 +415,10 @@ uses
   X25519Tests in '..\src\Math\EC\Rfc7748\X25519Tests.pas',
   Ed25519Tests in '..\src\Math\EC\Rfc8032\Ed25519Tests.pas',
   X25519HigherLevelTests in '..\src\Others\X25519HigherLevelTests.pas',
-  Ed25519HigherLevelTests in '..\src\Others\Ed25519HigherLevelTests.pas';
+  Ed25519HigherLevelTests in '..\src\Others\Ed25519HigherLevelTests.pas',
+  ShortenedDigestTests in '..\src\Others\ShortenedDigestTests.pas',
+  Kdf1GeneratorTests in '..\src\Crypto\Kdf1GeneratorTests.pas',
+  Kdf2GeneratorTests in '..\src\Crypto\Kdf2GeneratorTests.pas';
 
 begin
 

+ 21 - 1
CryptoLib.Tests/FreePascal.Tests/CryptoLib.Tests.lpi

@@ -77,7 +77,7 @@
         <PackageName Value="FCL"/>
       </Item4>
     </RequiredPackages>
-    <Units Count="61">
+    <Units Count="66">
       <Unit0>
         <Filename Value="CryptoLib.lpr"/>
         <IsPartOfProject Value="True"/>
@@ -323,6 +323,26 @@
         <Filename Value="..\src\Others\X25519HigherLevelTests.pas"/>
         <IsPartOfProject Value="True"/>
       </Unit60>
+      <Unit61>
+        <Filename Value="..\src\Utils\ClpShortenedDigest.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit61>
+      <Unit62>
+        <Filename Value="..\src\Utils\ClpIShortenedDigest.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit62>
+      <Unit63>
+        <Filename Value="..\src\Others\ShortenedDigestTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit63>
+      <Unit64>
+        <Filename Value="..\src\Crypto\Kdf2GeneratorTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit64>
+      <Unit65>
+        <Filename Value="..\src\Crypto\Kdf1GeneratorTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit65>
     </Units>
   </ProjectOptions>
   <CompilerOptions>

+ 6 - 1
CryptoLib.Tests/FreePascal.Tests/CryptoLib.lpr

@@ -64,8 +64,13 @@ uses
   Ed25519Tests,
   X25519HigherLevelTests,
   Ed25519HigherLevelTests,
+  ShortenedDigestTests,
+  Kdf1GeneratorTests,
+  Kdf2GeneratorTests,
   ClpFixedSecureRandom,
-  ClpIFixedSecureRandom;
+  ClpIFixedSecureRandom,
+  ClpShortenedDigest,
+  ClpIShortenedDigest;
 
 {$R *.res}
 

+ 21 - 1
CryptoLib.Tests/FreePascal.Tests/CryptoLibConsole.Tests.lpi

@@ -37,7 +37,7 @@
         <PackageName Value="FCL"/>
       </Item2>
     </RequiredPackages>
-    <Units Count="61">
+    <Units Count="66">
       <Unit0>
         <Filename Value="CryptoLibConsole.lpr"/>
         <IsPartOfProject Value="True"/>
@@ -282,6 +282,26 @@
         <Filename Value="..\src\Others\X25519HigherLevelTests.pas"/>
         <IsPartOfProject Value="True"/>
       </Unit60>
+      <Unit61>
+        <Filename Value="..\src\Utils\ClpShortenedDigest.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit61>
+      <Unit62>
+        <Filename Value="..\src\Utils\ClpIShortenedDigest.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit62>
+      <Unit63>
+        <Filename Value="..\src\Others\ShortenedDigestTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit63>
+      <Unit64>
+        <Filename Value="..\src\Crypto\Kdf1GeneratorTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit64>
+      <Unit65>
+        <Filename Value="..\src\Crypto\Kdf2GeneratorTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit65>
     </Units>
   </ProjectOptions>
   <CompilerOptions>

+ 6 - 1
CryptoLib.Tests/FreePascal.Tests/CryptoLibConsole.lpr

@@ -62,8 +62,13 @@ uses
   Ed25519Tests,
   X25519HigherLevelTests,
   Ed25519HigherLevelTests,
+  ShortenedDigestTests,
+  Kdf1GeneratorTests,
+  Kdf2GeneratorTests,
   ClpFixedSecureRandom,
-  ClpIFixedSecureRandom;
+  ClpIFixedSecureRandom,
+  ClpShortenedDigest,
+  ClpIShortenedDigest;
 
 type
 

+ 174 - 0
CryptoLib.Tests/src/Crypto/Kdf1GeneratorTests.pas

@@ -0,0 +1,174 @@
+{ *********************************************************************************** }
+{ *                              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 Kdf1GeneratorTests;
+
+interface
+
+{$IFDEF FPC}
+{$MODE DELPHI}
+{$ENDIF FPC}
+
+uses
+  SysUtils,
+{$IFDEF FPC}
+  fpcunit,
+  testregistry,
+{$ELSE}
+  TestFramework,
+{$ENDIF FPC}
+  ClpDigestUtilities,
+  ClpShortenedDigest,
+  ClpIShortenedDigest,
+  ClpIDerivationFunction,
+  ClpIIso18033KdfParameters,
+  ClpIso18033KdfParameters,
+  ClpKdf1BytesGenerator,
+  ClpIKdf1BytesGenerator,
+  ClpEncoders,
+  ClpArrayUtils,
+  ClpCryptoLibTypes;
+
+type
+
+  TCryptoLibTestCase = class abstract(TTestCase)
+
+  end;
+
+type
+
+  /// <summary>
+  /// KDF1 tests - vectors from ISO 18033.
+  /// </summary>
+  TTestKdf1Generator = class(TCryptoLibTestCase)
+  private
+  var
+    Fseed1, Fmask1, Fseed2, Fmask2, Fseed3, Fmask3: TCryptoLibByteArray;
+
+    procedure CheckMask(count: Int32; const kdf: IDerivationFunction;
+      const seed, result: TCryptoLibByteArray);
+    procedure DoTestKdf1Generator();
+
+  protected
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+
+    procedure TestKdf1Generator;
+
+  end;
+
+implementation
+
+{ TTestKdf1Generator }
+
+procedure TTestKdf1Generator.CheckMask(count: Int32;
+  const kdf: IDerivationFunction; const seed, result: TCryptoLibByteArray);
+var
+  data: TCryptoLibByteArray;
+begin
+  System.SetLength(data, System.Length(result));
+
+  kdf.Init(TIso18033KdfParameters.Create(seed) as IIso18033KdfParameters);
+
+  kdf.GenerateBytes(data, 0, System.Length(data));
+
+  if (not TArrayUtils.AreEqual(result, data)) then
+  begin
+    Fail(Format('KDF1 failed generator test %d', [count]));
+  end;
+end;
+
+procedure TTestKdf1Generator.DoTestKdf1Generator;
+var
+  temp: TCryptoLibByteArray;
+begin
+
+  CheckMask(1, TKdf1BytesGenerator.Create(TShortenedDigest.Create
+    (TDigestUtilities.GetDigest('SHA-256'), 20) as IShortenedDigest)
+    as IKdf1BytesGenerator, Fseed1, Fmask1);
+
+  CheckMask(2, TKdf1BytesGenerator.Create(TDigestUtilities.GetDigest('SHA-1'))
+    as IKdf1BytesGenerator, Fseed2, Fmask2);
+
+  CheckMask(3, TKdf1BytesGenerator.Create(TShortenedDigest.Create
+    (TDigestUtilities.GetDigest('SHA-256'), 20) as IShortenedDigest)
+    as IKdf1BytesGenerator, Fseed3, Fmask3);
+
+  try
+    System.SetLength(temp, 10);
+    (TKdf1BytesGenerator.Create(TDigestUtilities.GetDigest('SHA-1'))
+      as IKdf1BytesGenerator).GenerateBytes(temp, 0, 20);
+    Fail('short input array not caught');
+  except
+    on e: EDataLengthCryptoLibException do
+    begin
+      // expected
+    end;
+
+  end;
+end;
+
+procedure TTestKdf1Generator.SetUp;
+begin
+  inherited;
+  Fseed1 := THex.Decode('d6e168c5f256a2dcff7ef12facd390f393c7a88d');
+  Fmask1 := THex.Decode('0742ba966813af75536bb6149cc44fc256fd6406df79665bc31dc5'
+    + 'a62f70535e52c53015b9d37d412ff3c1193439599e1b628774c50d9c' +
+    'cb78d82c425e4521ee47b8c36a4bcffe8b8112a89312fc04420a39de' +
+    '99223890e74ce10378bc515a212b97b8a6447ba6a8870278');
+
+  Fseed2 := THex.Decode
+    ('032e45326fa859a72ec235acff929b15d1372e30b207255f0611b8f785d7643741' +
+    '52e0ac009e509e7ba30cd2f1778e113b64e135cf4e2292c75efe5288edfda4');
+  Fmask2 := THex.Decode
+    ('5f8de105b5e96b2e490ddecbd147dd1def7e3b8e0e6a26eb7b956ccb8b3bdc1ca9' +
+    '75bc57c3989e8fbad31a224655d800c46954840ff32052cdf0d640562bdfadfa263c' +
+    'fccf3c52b29f2af4a1869959bc77f854cf15bd7a25192985a842dbff8e13efee5b7e' +
+    '7e55bbe4d389647c686a9a9ab3fb889b2d7767d3837eea4e0a2f04');
+
+  Fseed3 := Fseed2;
+
+  Fmask3 := THex.Decode
+    ('09e2decf2a6e1666c2f6071ff4298305e2643fd510a2403db42a8743cb989de86e' +
+    '668d168cbe604611ac179f819a3d18412e9eb45668f2923c087c12fee0c5a0d2a8aa' +
+    '70185401fbbd99379ec76c663e875a60b4aacb1319fa11c3365a8b79a44669f26fb5' +
+    '55c80391847b05eca1cb5cf8c2d531448d33fbaca19f6410ee1fcb');
+end;
+
+procedure TTestKdf1Generator.TearDown;
+begin
+  inherited;
+
+end;
+
+procedure TTestKdf1Generator.TestKdf1Generator;
+begin
+  DoTestKdf1Generator();
+end;
+
+initialization
+
+// Register any test cases with the test runner
+
+{$IFDEF FPC}
+  RegisterTest(TTestKdf1Generator);
+{$ELSE}
+  RegisterTest(TTestKdf1Generator.Suite);
+{$ENDIF FPC}
+
+end.

+ 194 - 0
CryptoLib.Tests/src/Crypto/Kdf2GeneratorTests.pas

@@ -0,0 +1,194 @@
+{ *********************************************************************************** }
+{ *                              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 Kdf2GeneratorTests;
+
+interface
+
+{$IFDEF FPC}
+{$MODE DELPHI}
+{$ENDIF FPC}
+
+uses
+  SysUtils,
+{$IFDEF FPC}
+  fpcunit,
+  testregistry,
+{$ELSE}
+  TestFramework,
+{$ENDIF FPC}
+  ClpDigestUtilities,
+  ClpShortenedDigest,
+  ClpIShortenedDigest,
+  ClpIDerivationFunction,
+  ClpKdfParameters,
+  ClpIKdfParameters,
+  ClpKdf2BytesGenerator,
+  ClpIKdf2BytesGenerator,
+  ClpEncoders,
+  ClpArrayUtils,
+  ClpCryptoLibTypes;
+
+type
+
+  TCryptoLibTestCase = class abstract(TTestCase)
+
+  end;
+
+type
+
+  /// <summary>
+  /// KDF2 tests - vectors from ISO 18033.
+  /// </summary>
+  TTestKdf2Generator = class(TCryptoLibTestCase)
+  private
+  var
+    Fseed1, Fmask1, Fseed2, Fmask2, Fseed3, Fmask3, Fseed4, Fmask4,
+      FadjustedMask2, Fsha1Mask: TCryptoLibByteArray;
+
+    procedure CheckMask(count: Int32; const kdf: IDerivationFunction;
+      const seed, result: TCryptoLibByteArray);
+    procedure DoTestKdf2Generator();
+
+  protected
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+
+    procedure TestKdf2Generator;
+
+  end;
+
+implementation
+
+{ TTestKdf2Generator }
+
+procedure TTestKdf2Generator.CheckMask(count: Int32;
+  const kdf: IDerivationFunction; const seed, result: TCryptoLibByteArray);
+var
+  data: TCryptoLibByteArray;
+begin
+  System.SetLength(data, System.Length(result));
+
+  kdf.Init(TKdfParameters.Create(seed, Nil) as IKdfParameters);
+
+  kdf.GenerateBytes(data, 0, System.Length(data));
+
+  if (not TArrayUtils.AreEqual(result, data)) then
+  begin
+    Fail(Format('KDF2 failed generator test %d', [count]));
+  end;
+end;
+
+procedure TTestKdf2Generator.DoTestKdf2Generator;
+var
+  temp: TCryptoLibByteArray;
+begin
+
+  CheckMask(1, TKdf2BytesGenerator.Create(TShortenedDigest.Create
+    (TDigestUtilities.GetDigest('SHA-256'), 20) as IShortenedDigest)
+    as IKdf2BytesGenerator, Fseed1, Fmask1);
+
+  CheckMask(2, TKdf2BytesGenerator.Create(TShortenedDigest.Create
+    (TDigestUtilities.GetDigest('SHA-256'), 20) as IShortenedDigest)
+    as IKdf2BytesGenerator, Fseed2, Fmask2);
+
+  CheckMask(3, TKdf2BytesGenerator.Create(TDigestUtilities.GetDigest('SHA-256'))
+    as IKdf2BytesGenerator, Fseed2, FadjustedMask2);
+
+  CheckMask(4, TKdf2BytesGenerator.Create(TDigestUtilities.GetDigest('SHA-1'))
+    as IKdf2BytesGenerator, Fseed2, Fsha1Mask);
+
+  CheckMask(5, TKdf2BytesGenerator.Create(TDigestUtilities.GetDigest('SHA-1'))
+    as IKdf2BytesGenerator, Fseed3, Fmask3);
+
+  CheckMask(6, TKdf2BytesGenerator.Create(TDigestUtilities.GetDigest('SHA-1'))
+    as IKdf2BytesGenerator, Fseed4, Fmask4);
+
+  try
+    System.SetLength(temp, 10);
+    (TKdf2BytesGenerator.Create(TDigestUtilities.GetDigest('SHA-1'))
+      as IKdf2BytesGenerator).GenerateBytes(temp, 0, 20);
+    Fail('short input array not caught');
+  except
+    on e: EDataLengthCryptoLibException do
+    begin
+      // expected
+    end;
+
+  end;
+end;
+
+procedure TTestKdf2Generator.SetUp;
+begin
+  inherited;
+  Fseed1 := THex.Decode('d6e168c5f256a2dcff7ef12facd390f393c7a88d');
+  Fmask1 := THex.Decode('df79665bc31dc5a62f70535e52c53015b9d37d412ff3c119343959'
+    + '9e1b628774c50d9ccb78d82c425e4521ee47b8c36a4bcffe8b8112a8' +
+    '9312fc04420a39de99223890e74ce10378bc515a212b97b8a6447ba6' +
+    'a8870278f0262727ca041fa1aa9f7b5d1cf7f308232fe861');
+
+  Fseed2 := THex.Decode
+    ('032e45326fa859a72ec235acff929b15d1372e30b207255f0611b8f785d7643741' +
+    '52e0ac009e509e7ba30cd2f1778e113b64e135cf4e2292c75efe5288edfda4');
+  Fmask2 := THex.Decode
+    ('10a2403db42a8743cb989de86e668d168cbe604611ac179f819a3d18412e9eb456' +
+    '68f2923c087c12fee0c5a0d2a8aa70185401fbbd99379ec76c663e875a60b4aacb13' +
+    '19fa11c3365a8b79a44669f26fb555c80391847b05eca1cb5cf8c2d531448d33fbac' +
+    'a19f6410ee1fcb260892670e0814c348664f6a7248aaf998a3acc6');
+  FadjustedMask2 := THex.Decode
+    ('10a2403db42a8743cb989de86e668d168cbe6046e23ff26f741e87949a3bba1311ac1' +
+    '79f819a3d18412e9eb45668f2923c087c1299005f8d5fd42ca257bc93e8fee0c5a0d2' +
+    'a8aa70185401fbbd99379ec76c663e9a29d0b70f3fe261a59cdc24875a60b4aacb131' +
+    '9fa11c3365a8b79a44669f26fba933d012db213d7e3b16349');
+
+  Fsha1Mask := THex.Decode
+    ('0e6a26eb7b956ccb8b3bdc1ca975bc57c3989e8fbad31a224655d800c46954840ff32' +
+    '052cdf0d640562bdfadfa263cfccf3c52b29f2af4a1869959bc77f854cf15bd7a2519' +
+    '2985a842dbff8e13efee5b7e7e55bbe4d389647c686a9a9ab3fb889b2d7767d3837ee' +
+    'a4e0a2f04b53ca8f50fb31225c1be2d0126c8c7a4753b0807');
+
+  Fseed3 := THex.Decode('CA7C0F8C3FFA87A96E1B74AC8E6AF594347BB40A');
+  Fmask3 := THex.Decode('744AB703F5BC082E59185F6D049D2D367DB245C2');
+
+  Fseed4 := THex.Decode('0499B502FC8B5BAFB0F4047E731D1F9FD8CD0D8881');
+  Fmask4 := THex.Decode
+    ('03C62280C894E103C680B13CD4B4AE740A5EF0C72547292F82DC6B1777F47D63BA9D1EA732DBF386');
+end;
+
+procedure TTestKdf2Generator.TearDown;
+begin
+  inherited;
+
+end;
+
+procedure TTestKdf2Generator.TestKdf2Generator;
+begin
+  DoTestKdf2Generator();
+end;
+
+initialization
+
+// Register any test cases with the test runner
+
+{$IFDEF FPC}
+  RegisterTest(TTestKdf2Generator);
+{$ELSE}
+  RegisterTest(TTestKdf2Generator.Suite);
+{$ENDIF FPC}
+
+end.

+ 167 - 0
CryptoLib.Tests/src/Others/ShortenedDigestTests.pas

@@ -0,0 +1,167 @@
+{ *********************************************************************************** }
+{ *                              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 ShortenedDigestTests;
+
+interface
+
+{$IFDEF FPC}
+{$MODE DELPHI}
+{$ENDIF FPC}
+
+uses
+  SysUtils,
+{$IFDEF FPC}
+  fpcunit,
+  testregistry,
+{$ELSE}
+  TestFramework,
+{$ENDIF FPC}
+  ClpIDigest,
+  ClpIShortenedDigest,
+  ClpShortenedDigest,
+  ClpDigestUtilities,
+  ClpArrayUtils,
+  ClpCryptoLibTypes;
+
+type
+
+  TCryptoLibTestCase = class abstract(TTestCase)
+
+  end;
+
+type
+
+  TTestShortenedDigest = class(TCryptoLibTestCase)
+
+  private
+    procedure DoTestShortenedDigest();
+
+  protected
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+    procedure TestShortenedDigest();
+
+  end;
+
+implementation
+
+{ TTestShortenedDigest }
+
+procedure TTestShortenedDigest.DoTestShortenedDigest;
+var
+  d: IDigest;
+  sd: IShortenedDigest;
+  temp: TCryptoLibByteArray;
+begin
+  d := TDigestUtilities.GetDigest('SHA-1');
+  sd := TShortenedDigest.Create(TDigestUtilities.GetDigest('SHA-1'), 10);
+
+  if (sd.GetDigestSize() <> 10) then
+  begin
+    Fail('size check wrong for SHA-1');
+  end;
+
+  if (sd.GetByteLength() <> d.GetByteLength()) then
+  begin
+    Fail('byte length check wrong for SHA-1');
+  end;
+
+  //
+  // check output fits
+  //
+  System.SetLength(temp, 10);
+  sd.DoFinal(temp, 0);
+
+  CheckTrue(TArrayUtils.AreEqual(temp, sd.DoFinal),
+    Format('DoFinal(temp, 0) <> temp := DoFinal() %s', [sd.AlgorithmName]));
+
+  d := TDigestUtilities.GetDigest('SHA-512');
+  sd := TShortenedDigest.Create(TDigestUtilities.GetDigest('SHA-512'), 20);
+
+  if (sd.GetDigestSize() <> 20) then
+  begin
+    Fail('size check wrong for SHA-512');
+  end;
+
+  if (sd.GetByteLength() <> d.GetByteLength()) then
+  begin
+    Fail('byte length check wrong for SHA-512');
+  end;
+
+  //
+  // check output fits
+  //
+  System.SetLength(temp, 20);
+  sd.DoFinal(temp, 0);
+
+  CheckTrue(TArrayUtils.AreEqual(temp, sd.DoFinal),
+    Format('DoFinal(temp, 0) <> temp := DoFinal() %s', [sd.AlgorithmName]));
+
+  try
+    TShortenedDigest.Create(Nil, 20);
+    Fail('Nil parameter not caught');
+  except
+    on e: EArgumentNilCryptoLibException do
+    begin
+      // expected
+    end;
+
+  end;
+
+  try
+    TShortenedDigest.Create(TDigestUtilities.GetDigest('SHA-1'), 50);
+    Fail('short digest not caught');
+  except
+    on e: EArgumentCryptoLibException do
+    begin
+      // expected
+    end;
+
+  end;
+
+end;
+
+procedure TTestShortenedDigest.SetUp;
+begin
+  inherited;
+
+end;
+
+procedure TTestShortenedDigest.TearDown;
+begin
+  inherited;
+
+end;
+
+procedure TTestShortenedDigest.TestShortenedDigest;
+begin
+  DoTestShortenedDigest();
+end;
+
+initialization
+
+// Register any test cases with the test runner
+
+{$IFDEF FPC}
+  RegisterTest(TTestShortenedDigest);
+{$ELSE}
+  RegisterTest(TTestShortenedDigest.Suite);
+{$ENDIF FPC}
+
+end.

+ 39 - 0
CryptoLib.Tests/src/Utils/ClpIShortenedDigest.pas

@@ -0,0 +1,39 @@
+{ *********************************************************************************** }
+{ *                              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 ClpIShortenedDigest;
+
+interface
+
+{$IFDEF FPC}
+{$MODE DELPHI}
+{$ENDIF FPC}
+
+uses
+  ClpIDigest,
+  ClpCryptoLibTypes;
+
+type
+
+  IShortenedDigest = interface(IDigest)
+    ['{E19D250B-CAE0-4959-9211-80853FCF4ADD}']
+
+  end;
+
+implementation
+
+end.

+ 168 - 0
CryptoLib.Tests/src/Utils/ClpShortenedDigest.pas

@@ -0,0 +1,168 @@
+{ *                              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 ClpShortenedDigest;
+
+interface
+
+{$IFDEF FPC}
+{$MODE DELPHI}
+{$ENDIF FPC}
+
+uses
+  SysUtils,
+  HlpIHash,
+  ClpIDigest,
+  ClpIShortenedDigest,
+  ClpCryptoLibTypes;
+
+resourcestring
+  SBaseDigestNil = 'BaseDigest Nil';
+  SBaseDigestSizeInsufficient =
+    'BaseDigest output not large enough to support length';
+
+type
+
+  /// <summary>
+  /// Wrapper class that reduces the output length of a particular digest to
+  /// only the first n bytes of the digest function.
+  /// </summary>
+  TShortenedDigest = class sealed(TInterfacedObject, IShortenedDigest)
+
+  strict private
+  var
+    FBaseDigest: IDigest;
+    FLength: Int32;
+
+    function GetAlgorithmName: String; inline;
+
+  public
+
+    /// <summary>
+    /// Base constructor.
+    /// </summary>
+    /// <param name="baseDigest">
+    /// underlying digest to use.
+    /// </param>
+    /// <param name="length">
+    /// length in bytes of the output of doFinal.
+    /// </param>
+    /// <exception cref="EArgumentCryptoLibException">
+    /// if length is greater than baseDigest.GetDigestSize().
+    /// </exception>
+    /// <exception cref="ClpCryptoLibTypes|EArgumentNilCryptoLibException">
+    /// if baseDigest is null.
+    /// </exception>
+    constructor Create(const baseDigest: IDigest; length: Int32);
+
+    function GetDigestSize(): Int32;
+
+    function GetByteLength(): Int32;
+
+    function GetUnderlyingIHash: IHash;
+
+    procedure Update(input: Byte);
+
+    procedure BlockUpdate(const input: TCryptoLibByteArray; inOff, len: Int32);
+
+    function DoFinal(const output: TCryptoLibByteArray; outOff: Int32)
+      : Int32; overload;
+    function DoFinal: TCryptoLibByteArray; overload;
+
+    procedure Reset();
+
+    property AlgorithmName: String read GetAlgorithmName;
+
+  end;
+
+implementation
+
+{ TShortenedDigest }
+
+constructor TShortenedDigest.Create(const baseDigest: IDigest; length: Int32);
+begin
+  if (baseDigest = Nil) then
+  begin
+    raise EArgumentNilCryptoLibException.CreateRes(@SBaseDigestNil);
+  end;
+
+  if (length > baseDigest.GetDigestSize()) then
+  begin
+    raise EArgumentCryptoLibException.CreateRes(@SBaseDigestSizeInsufficient);
+  end;
+
+  Inherited Create();
+  FBaseDigest := baseDigest;
+  FLength := length;
+end;
+
+function TShortenedDigest.GetAlgorithmName: String;
+begin
+  result := Format('%s(%d)', [FBaseDigest.AlgorithmName, FLength * 8]);;
+end;
+
+function TShortenedDigest.GetByteLength: Int32;
+begin
+  result := FBaseDigest.GetByteLength();
+end;
+
+function TShortenedDigest.GetDigestSize: Int32;
+begin
+  result := FLength;
+end;
+
+function TShortenedDigest.GetUnderlyingIHash: IHash;
+begin
+  result := FBaseDigest.GetUnderlyingIHash;
+end;
+
+procedure TShortenedDigest.Update(input: Byte);
+begin
+  FBaseDigest.Update(input);
+end;
+
+procedure TShortenedDigest.BlockUpdate(const input: TCryptoLibByteArray;
+  inOff, len: Int32);
+begin
+  FBaseDigest.BlockUpdate(input, inOff, len);
+end;
+
+function TShortenedDigest.DoFinal(const output: TCryptoLibByteArray;
+  outOff: Int32): Int32;
+var
+  tmp: TCryptoLibByteArray;
+begin
+  System.SetLength(tmp, FBaseDigest.GetDigestSize());
+
+  FBaseDigest.DoFinal(tmp, 0);
+
+  System.Move(tmp[0], output[outOff], FLength * System.SizeOf(Byte));
+
+  result := FLength;
+end;
+
+function TShortenedDigest.DoFinal: TCryptoLibByteArray;
+begin
+  System.SetLength(result, FLength);
+  DoFinal(result, 0);
+end;
+
+procedure TShortenedDigest.Reset;
+begin
+  FBaseDigest.Reset();
+end;
+
+end.

+ 36 - 36
CryptoLib/src/Asn1/TeleTrust/ClpTeleTrusTNamedCurves.pas

@@ -325,42 +325,6 @@ implementation
 
 { TeleTrusTNamedCurves }
 
-class procedure TTeleTrusTNamedCurves.Boot;
-begin
-  FobjIds := TDictionary<String, IDerObjectIdentifier>.Create();
-  Fnames := TDictionary<IDerObjectIdentifier, String>.Create();
-  Fcurves := TDictionary<IDerObjectIdentifier, IX9ECParametersHolder>.Create();
-
-  DefineCurve('brainpoolP160r1', TTeleTrusTObjectIdentifiers.BrainpoolP160R1,
-    TBrainpoolP160r1Holder.Instance);
-  DefineCurve('brainpoolP160t1', TTeleTrusTObjectIdentifiers.BrainpoolP160T1,
-    TBrainpoolP160t1Holder.Instance);
-  DefineCurve('brainpoolP192r1', TTeleTrusTObjectIdentifiers.BrainpoolP192R1,
-    TBrainpoolP160t1Holder.Instance);
-  DefineCurve('brainpoolP192t1', TTeleTrusTObjectIdentifiers.BrainpoolP192T1,
-    TBrainpoolP192t1Holder.Instance);
-  DefineCurve('brainpoolP224r1', TTeleTrusTObjectIdentifiers.BrainpoolP224R1,
-    TBrainpoolP224r1Holder.Instance);
-  DefineCurve('brainpoolP224t1', TTeleTrusTObjectIdentifiers.BrainpoolP224T1,
-    TBrainpoolP224t1Holder.Instance);
-  DefineCurve('brainpoolP256r1', TTeleTrusTObjectIdentifiers.BrainpoolP256R1,
-    TBrainpoolP256r1Holder.Instance);
-  DefineCurve('brainpoolP256t1', TTeleTrusTObjectIdentifiers.BrainpoolP256T1,
-    TBrainpoolP256t1Holder.Instance);
-  DefineCurve('brainpoolP320r1', TTeleTrusTObjectIdentifiers.BrainpoolP320R1,
-    TBrainpoolP320r1Holder.Instance);
-  DefineCurve('brainpoolP320t1', TTeleTrusTObjectIdentifiers.BrainpoolP320T1,
-    TBrainpoolP320t1Holder.Instance);
-  DefineCurve('brainpoolP384r1', TTeleTrusTObjectIdentifiers.BrainpoolP384R1,
-    TBrainpoolP384r1Holder.Instance);
-  DefineCurve('brainpoolP384t1', TTeleTrusTObjectIdentifiers.BrainpoolP384T1,
-    TBrainpoolP384t1Holder.Instance);
-  DefineCurve('brainpoolP512r1', TTeleTrusTObjectIdentifiers.BrainpoolP512R1,
-    TBrainpoolP512r1Holder.Instance);
-  DefineCurve('brainpoolP512t1', TTeleTrusTObjectIdentifiers.BrainpoolP512T1,
-    TBrainpoolP512t1Holder.Instance);
-end;
-
 class function TTeleTrusTNamedCurves.ConfigureCurve(const curve: IECCurve)
   : IECCurve;
 begin
@@ -441,6 +405,42 @@ begin
   result := Fnames.Values.ToArray();
 end;
 
+class procedure TTeleTrusTNamedCurves.Boot;
+begin
+  FobjIds := TDictionary<String, IDerObjectIdentifier>.Create();
+  Fnames := TDictionary<IDerObjectIdentifier, String>.Create();
+  Fcurves := TDictionary<IDerObjectIdentifier, IX9ECParametersHolder>.Create();
+
+  DefineCurve('brainpoolP160r1', TTeleTrusTObjectIdentifiers.BrainpoolP160R1,
+    TBrainpoolP160r1Holder.Instance);
+  DefineCurve('brainpoolP160t1', TTeleTrusTObjectIdentifiers.BrainpoolP160T1,
+    TBrainpoolP160t1Holder.Instance);
+  DefineCurve('brainpoolP192r1', TTeleTrusTObjectIdentifiers.BrainpoolP192R1,
+    TBrainpoolP160t1Holder.Instance);
+  DefineCurve('brainpoolP192t1', TTeleTrusTObjectIdentifiers.BrainpoolP192T1,
+    TBrainpoolP192t1Holder.Instance);
+  DefineCurve('brainpoolP224r1', TTeleTrusTObjectIdentifiers.BrainpoolP224R1,
+    TBrainpoolP224r1Holder.Instance);
+  DefineCurve('brainpoolP224t1', TTeleTrusTObjectIdentifiers.BrainpoolP224T1,
+    TBrainpoolP224t1Holder.Instance);
+  DefineCurve('brainpoolP256r1', TTeleTrusTObjectIdentifiers.BrainpoolP256R1,
+    TBrainpoolP256r1Holder.Instance);
+  DefineCurve('brainpoolP256t1', TTeleTrusTObjectIdentifiers.BrainpoolP256T1,
+    TBrainpoolP256t1Holder.Instance);
+  DefineCurve('brainpoolP320r1', TTeleTrusTObjectIdentifiers.BrainpoolP320R1,
+    TBrainpoolP320r1Holder.Instance);
+  DefineCurve('brainpoolP320t1', TTeleTrusTObjectIdentifiers.BrainpoolP320T1,
+    TBrainpoolP320t1Holder.Instance);
+  DefineCurve('brainpoolP384r1', TTeleTrusTObjectIdentifiers.BrainpoolP384R1,
+    TBrainpoolP384r1Holder.Instance);
+  DefineCurve('brainpoolP384t1', TTeleTrusTObjectIdentifiers.BrainpoolP384T1,
+    TBrainpoolP384t1Holder.Instance);
+  DefineCurve('brainpoolP512r1', TTeleTrusTObjectIdentifiers.BrainpoolP512R1,
+    TBrainpoolP512r1Holder.Instance);
+  DefineCurve('brainpoolP512t1', TTeleTrusTObjectIdentifiers.BrainpoolP512T1,
+    TBrainpoolP512t1Holder.Instance);
+end;
+
 { TeleTrusTNamedCurves.TBrainpoolP160r1Holder }
 
 function TTeleTrusTNamedCurves.TBrainpoolP160r1Holder.CreateParameters

+ 12 - 1
CryptoLib/src/Crypto/Digests/ClpDigest.pas

@@ -110,8 +110,19 @@ implementation
 { TDigest }
 
 function TDigest.GetAlgorithmName: string;
+var
+  LName: String;
+  LowPoint, HighPoint: Int32;
 begin
-  result := FHash.Name;
+  LName := FHash.Name;
+{$IFDEF DELPHIXE3_UP}
+  LowPoint := System.Low(LName);
+  HighPoint := System.High(LName);
+{$ELSE}
+  LowPoint := 1;
+  HighPoint := System.Length(LName);
+{$ENDIF DELPHIXE3_UP}
+  result := Copy(LName, LowPoint + 1, HighPoint - 1);
 end;
 
 function TDigest.GetByteLength: Int32;

+ 63 - 0
CryptoLib/src/Crypto/Generators/ClpKdf1BytesGenerator.pas

@@ -0,0 +1,63 @@
+{ *********************************************************************************** }
+{ *                              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 ClpKdf1BytesGenerator;
+
+{$I ..\..\Include\CryptoLib.inc}
+
+interface
+
+uses
+  ClpIDigest,
+  ClpBaseKdfBytesGenerator,
+  ClpIKdf1BytesGenerator;
+
+type
+
+  /// <summary>
+  /// <para>
+  /// KDF1 generator for derived keys and ivs as defined by IEEE
+  /// P1363a/ISO 18033
+  /// </para>
+  /// <para>
+  /// This implementation is based on IEEE P1363/ISO 18033.
+  /// </para>
+  /// </summary>
+  TKdf1BytesGenerator = class(TBaseKdfBytesGenerator, IKdf1BytesGenerator)
+
+  public
+
+    /// <summary>
+    /// Construct a KDF1 bytes generator.
+    /// </summary>
+    /// <param name="digest">
+    /// the digest to be used as the source of derived keys.
+    /// </param>
+    constructor Create(const digest: IDigest);
+
+  end;
+
+implementation
+
+{ TKdf1BytesGenerator }
+
+constructor TKdf1BytesGenerator.Create(const digest: IDigest);
+begin
+  Inherited Create(0, digest);
+end;
+
+end.

+ 1 - 5
CryptoLib/src/Crypto/Parameters/ClpHkdfParameters.pas

@@ -153,11 +153,7 @@ begin
     Fsalt := System.Copy(salt);
   end;
 
-  if (info = Nil) then
-  begin
-    System.SetLength(Finfo, 0);
-  end
-  else
+  if info <> Nil then
   begin
     Finfo := System.Copy(info);
   end;

+ 36 - 0
CryptoLib/src/Interfaces/ClpIKdf1BytesGenerator.pas

@@ -0,0 +1,36 @@
+{ *********************************************************************************** }
+{ *                              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 ClpIKdf1BytesGenerator;
+
+{$I ..\Include\CryptoLib.inc}
+
+interface
+
+uses
+  ClpIBaseKdfBytesGenerator;
+
+type
+
+  IKdf1BytesGenerator = interface(IBaseKdfBytesGenerator)
+    ['{FD2AF455-8C5D-4860-A1D5-B70E5D417841}']
+
+  end;
+
+implementation
+
+end.

+ 3 - 1
CryptoLib/src/Packages/Delphi/CryptoLib4PascalPackage.dpk

@@ -367,6 +367,8 @@ contains
   ClpOidTokenizer in '..\..\Asn1\ClpOidTokenizer.pas',
   ClpValidityPrecompInfo in '..\..\Math\EC\Multiplier\ClpValidityPrecompInfo.pas',
   ClpTeleTrusTNamedCurves in '..\..\Asn1\TeleTrust\ClpTeleTrusTNamedCurves.pas',
-  ClpAgreementUtilities in '..\..\Security\ClpAgreementUtilities.pas';
+  ClpAgreementUtilities in '..\..\Security\ClpAgreementUtilities.pas',
+  ClpIKdf1BytesGenerator in '..\..\Interfaces\ClpIKdf1BytesGenerator.pas',
+  ClpKdf1BytesGenerator in '..\..\Crypto\Generators\ClpKdf1BytesGenerator.pas';
 
 end.

+ 9 - 1
CryptoLib/src/Packages/FPC/CryptoLib4PascalPackage.lpk

@@ -25,7 +25,7 @@
  Acknowledgements: 
 Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring the development of this library "/>
     <Version Major="3" Minor="1"/>
-    <Files Count="335">
+    <Files Count="337">
       <Item1>
         <Filename Value="..\..\Asn1\ClpOidTokenizer.pas"/>
         <UnitName Value="ClpOidTokenizer"/>
@@ -1368,6 +1368,14 @@ Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring the devel
         <Filename Value="..\..\Security\ClpAgreementUtilities.pas"/>
         <UnitName Value="ClpAgreementUtilities"/>
       </Item335>
+      <Item336>
+        <Filename Value="..\..\Interfaces\ClpIKdf1BytesGenerator.pas"/>
+        <UnitName Value="ClpIKdf1BytesGenerator"/>
+      </Item336>
+      <Item337>
+        <Filename Value="..\..\Crypto\Generators\ClpKdf1BytesGenerator.pas"/>
+        <UnitName Value="ClpKdf1BytesGenerator"/>
+      </Item337>
     </Files>
     <RequiredPkgs Count="3">
       <Item1>

+ 2 - 1
CryptoLib/src/Packages/FPC/CryptoLib4PascalPackage.pas

@@ -119,7 +119,8 @@ uses
   ClpEd25519Blake2BKeyPairGenerator, ClpEd25519KeyPairGenerator, 
   ClpX25519KeyPairGenerator, ClpEd25519PhBlake2BSigner, ClpEd25519PhSigner, 
   ClpEd25519Signer, ClpEd25519CtxBlake2BSigner, ClpEd25519CtxSigner, 
-  ClpEd25519Blake2BSigner, ClpTeleTrusTNamedCurves, ClpAgreementUtilities;
+  ClpEd25519Blake2BSigner, ClpTeleTrusTNamedCurves, ClpAgreementUtilities, 
+  ClpIKdf1BytesGenerator, ClpKdf1BytesGenerator;
 
 implementation