Browse Source

add more unit tests

- add more HMAC Tests
- add more AES Tests
Ugochukwu Mmaduekwe 7 years ago
parent
commit
d6977be9b8

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

@@ -459,7 +459,15 @@ uses
   ClpNat320 in '..\..\CryptoLib\src\Math\Raw\ClpNat320.pas',
   ClpNat320 in '..\..\CryptoLib\src\Math\Raw\ClpNat320.pas',
   ClpNat256 in '..\..\CryptoLib\src\Math\Raw\ClpNat256.pas',
   ClpNat256 in '..\..\CryptoLib\src\Math\Raw\ClpNat256.pas',
   ClpAesLightEngine in '..\..\CryptoLib\src\Crypto\Engines\ClpAesLightEngine.pas',
   ClpAesLightEngine in '..\..\CryptoLib\src\Crypto\Engines\ClpAesLightEngine.pas',
-  ClpIAesLightEngine in '..\..\CryptoLib\src\Interfaces\ClpIAesLightEngine.pas';
+  ClpIAesLightEngine in '..\..\CryptoLib\src\Interfaces\ClpIAesLightEngine.pas',
+  BlockCipherMonteCarloTests in '..\src\Crypto\BlockCipherMonteCarloTests.pas',
+  SHA1HMacTests in '..\src\Crypto\SHA1HMacTests.pas',
+  SHA224HMacTests in '..\src\Crypto\SHA224HMacTests.pas',
+  SHA256HMacTests in '..\src\Crypto\SHA256HMacTests.pas',
+  SHA384HMacTests in '..\src\Crypto\SHA384HMacTests.pas',
+  SHA512HMacTests in '..\src\Crypto\SHA512HMacTests.pas',
+  RIPEMD128HMacTests in '..\src\Crypto\RIPEMD128HMacTests.pas',
+  RIPEMD160HMacTests in '..\src\Crypto\RIPEMD160HMacTests.pas';
 
 
 begin
 begin
 
 

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

@@ -36,7 +36,7 @@
         <PackageName Value="FCL"/>
         <PackageName Value="FCL"/>
       </Item4>
       </Item4>
     </RequiredPackages>
     </RequiredPackages>
-    <Units Count="33">
+    <Units Count="41">
       <Unit0>
       <Unit0>
         <Filename Value="CryptoLib.lpr"/>
         <Filename Value="CryptoLib.lpr"/>
         <IsPartOfProject Value="True"/>
         <IsPartOfProject Value="True"/>
@@ -170,6 +170,38 @@
         <Filename Value="..\src\Crypto\DSATests.pas"/>
         <Filename Value="..\src\Crypto\DSATests.pas"/>
         <IsPartOfProject Value="True"/>
         <IsPartOfProject Value="True"/>
       </Unit32>
       </Unit32>
+      <Unit33>
+        <Filename Value="..\src\Crypto\BlockCipherMonteCarloTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit33>
+      <Unit34>
+        <Filename Value="..\src\Crypto\SHA1HMacTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit34>
+      <Unit35>
+        <Filename Value="..\src\Crypto\SHA224HMacTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit35>
+      <Unit36>
+        <Filename Value="..\src\Crypto\SHA256HMacTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit36>
+      <Unit37>
+        <Filename Value="..\src\Crypto\SHA384HMacTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit37>
+      <Unit38>
+        <Filename Value="..\src\Crypto\SHA512HMacTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit38>
+      <Unit39>
+        <Filename Value="..\src\Crypto\RIPEMD128HMacTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit39>
+      <Unit40>
+        <Filename Value="..\src\Crypto\RIPEMD160HMacTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit40>
     </Units>
     </Units>
   </ProjectOptions>
   </ProjectOptions>
   <CompilerOptions>
   <CompilerOptions>

+ 8 - 0
CryptoLib.Tests/FreePascal.Tests/CryptoLib.lpr

@@ -24,10 +24,18 @@ uses
   FixedPointTests,
   FixedPointTests,
   AESTests,
   AESTests,
   BlockCipherVectorTests,
   BlockCipherVectorTests,
+  BlockCipherMonteCarloTests,
   AESTestVectors,
   AESTestVectors,
   AESSICTests,
   AESSICTests,
   IESCipherTests,
   IESCipherTests,
   MD5HMacTests,
   MD5HMacTests,
+  SHA1HMacTests,
+  SHA224HMacTests,
+  SHA256HMacTests,
+  SHA384HMacTests,
+  SHA512HMacTests,
+  RIPEMD128HMacTests,
+  RIPEMD160HMacTests,
   HMacTests,
   HMacTests,
   Pkcs5Tests,
   Pkcs5Tests,
   HkdfGeneratorTests,
   HkdfGeneratorTests,

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

@@ -37,7 +37,7 @@
         <PackageName Value="FCL"/>
         <PackageName Value="FCL"/>
       </Item2>
       </Item2>
     </RequiredPackages>
     </RequiredPackages>
-    <Units Count="33">
+    <Units Count="41">
       <Unit0>
       <Unit0>
         <Filename Value="CryptoLibConsole.lpr"/>
         <Filename Value="CryptoLibConsole.lpr"/>
         <IsPartOfProject Value="True"/>
         <IsPartOfProject Value="True"/>
@@ -170,6 +170,38 @@
         <Filename Value="..\src\Crypto\DSATests.pas"/>
         <Filename Value="..\src\Crypto\DSATests.pas"/>
         <IsPartOfProject Value="True"/>
         <IsPartOfProject Value="True"/>
       </Unit32>
       </Unit32>
+      <Unit33>
+        <Filename Value="..\src\Crypto\BlockCipherMonteCarloTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit33>
+      <Unit34>
+        <Filename Value="..\src\Crypto\SHA1HMacTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit34>
+      <Unit35>
+        <Filename Value="..\src\Crypto\SHA224HMacTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit35>
+      <Unit36>
+        <Filename Value="..\src\Crypto\SHA256HMacTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit36>
+      <Unit37>
+        <Filename Value="..\src\Crypto\SHA384HMacTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit37>
+      <Unit38>
+        <Filename Value="..\src\Crypto\SHA512HMacTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit38>
+      <Unit39>
+        <Filename Value="..\src\Crypto\RIPEMD128HMacTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit39>
+      <Unit40>
+        <Filename Value="..\src\Crypto\RIPEMD160HMacTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit40>
     </Units>
     </Units>
   </ProjectOptions>
   </ProjectOptions>
   <CompilerOptions>
   <CompilerOptions>

+ 8 - 0
CryptoLib.Tests/FreePascal.Tests/CryptoLibConsole.lpr

@@ -22,10 +22,18 @@ uses
   FixedPointTests,
   FixedPointTests,
   AESTests,
   AESTests,
   BlockCipherVectorTests,
   BlockCipherVectorTests,
+  BlockCipherMonteCarloTests,
   AESTestVectors,
   AESTestVectors,
   AESSICTests,
   AESSICTests,
   IESCipherTests,
   IESCipherTests,
   MD5HMacTests,
   MD5HMacTests,
+  SHA1HMacTests,
+  SHA224HMacTests,
+  SHA256HMacTests,
+  SHA384HMacTests,
+  SHA512HMacTests,
+  RIPEMD128HMacTests,
+  RIPEMD160HMacTests,
   HMacTests,
   HMacTests,
   Pkcs5Tests,
   Pkcs5Tests,
   HkdfGeneratorTests,
   HkdfGeneratorTests,

+ 34 - 1
CryptoLib.Tests/src/Crypto/AESTestVectors.pas

@@ -34,7 +34,9 @@ type
     class var
     class var
 
 
       FBlockCipherVectorKeys, FBlockCipherVectorInputs,
       FBlockCipherVectorKeys, FBlockCipherVectorInputs,
-      FBlockCipherVectorOutputs, FOfficialVectorKeys_AES_CBC,
+      FBlockCipherVectorOutputs, FBlockCipherMonteCarloIterations,
+      FBlockCipherMonteCarloKeys, FBlockCipherMonteCarloInputs,
+      FBlockCipherMonteCarloOutputs, FOfficialVectorKeys_AES_CBC,
       FOfficialVectorIVs_AES_CBC, FOfficialVectorInputs_AES_CBC,
       FOfficialVectorIVs_AES_CBC, FOfficialVectorInputs_AES_CBC,
       FOfficialVectorOutputs_AES_CBC, FOfficialVectorKeys_AES_CFB,
       FOfficialVectorOutputs_AES_CBC, FOfficialVectorKeys_AES_CFB,
       FOfficialVectorIVs_AES_CFB, FOfficialVectorInputs_AES_CFB,
       FOfficialVectorIVs_AES_CFB, FOfficialVectorInputs_AES_CFB,
@@ -84,6 +86,37 @@ begin
 
 
     'DDC6BF790C15760D8D9AEB6F9A75FD4E');
     'DDC6BF790C15760D8D9AEB6F9A75FD4E');
 
 
+  FBlockCipherMonteCarloIterations := TCryptoLibStringArray.Create('10000',
+    '10000', '10000', '10000', '10000', '10000', '10000', '10000', '10000',
+    '10000', '10000', '10000');
+
+  FBlockCipherMonteCarloKeys := TCryptoLibStringArray.Create
+    ('00000000000000000000000000000000', '5F060D3716B345C253F6749ABAC10917',
+    'AAFE47EE82411A2BF3F6752AE8D7831138F041560631B114',
+    '28E79E2AFC5F7745FCCABE2F6257C2EF4C4EDFB37324814ED4137C288711A386',
+    '00000000000000000000000000000000', '5F060D3716B345C253F6749ABAC10917',
+    'AAFE47EE82411A2BF3F6752AE8D7831138F041560631B114',
+    '28E79E2AFC5F7745FCCABE2F6257C2EF4C4EDFB37324814ED4137C288711A386',
+    '00000000000000000000000000000000', '5F060D3716B345C253F6749ABAC10917',
+    'AAFE47EE82411A2BF3F6752AE8D7831138F041560631B114',
+    '28E79E2AFC5F7745FCCABE2F6257C2EF4C4EDFB37324814ED4137C288711A386');
+
+  FBlockCipherMonteCarloInputs := TCryptoLibStringArray.Create
+    ('00000000000000000000000000000000', '355F697E8B868B65B25A04E18D782AFA',
+    'F3F6752AE8D7831138F041560631B114', 'C737317FE0846F132B23C8C2A672CE22',
+    '00000000000000000000000000000000', '355F697E8B868B65B25A04E18D782AFA',
+    'F3F6752AE8D7831138F041560631B114', 'C737317FE0846F132B23C8C2A672CE22',
+    '00000000000000000000000000000000', '355F697E8B868B65B25A04E18D782AFA',
+    'F3F6752AE8D7831138F041560631B114', 'C737317FE0846F132B23C8C2A672CE22');
+
+  FBlockCipherMonteCarloOutputs := TCryptoLibStringArray.Create
+    ('C34C052CC0DA8D73451AFE5F03BE297F', 'ACC863637868E3E068D2FD6E3508454A',
+    '77BA00ED5412DFF27C8ED91F3C376172', 'E58B82BFBA53C0040DC610C642121168',
+    'C34C052CC0DA8D73451AFE5F03BE297F', 'ACC863637868E3E068D2FD6E3508454A',
+    '77BA00ED5412DFF27C8ED91F3C376172', 'E58B82BFBA53C0040DC610C642121168',
+    'C34C052CC0DA8D73451AFE5F03BE297F', 'ACC863637868E3E068D2FD6E3508454A',
+    '77BA00ED5412DFF27C8ED91F3C376172', 'E58B82BFBA53C0040DC610C642121168');
+
   // test vectors gotten from here
   // test vectors gotten from here
   // https://github.com/ircmaxell/quality-checker/blob/master/tmp/gh_18/PHP-PasswordLib-master/test/Data/Vectors/aes-cbc.test-vectors
   // https://github.com/ircmaxell/quality-checker/blob/master/tmp/gh_18/PHP-PasswordLib-master/test/Data/Vectors/aes-cbc.test-vectors
 
 

+ 194 - 0
CryptoLib.Tests/src/Crypto/BlockCipherMonteCarloTests.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 BlockCipherMonteCarloTests;
+
+interface
+
+{$IFDEF FPC}
+{$MODE DELPHI}
+{$ENDIF FPC}
+
+uses
+  SysUtils,
+{$IFDEF FPC}
+  fpcunit,
+  testregistry,
+{$ELSE}
+  TestFramework,
+{$ENDIF FPC}
+  AESTestVectors,
+  ClpIBlockCipher,
+  ClpICipherParameters,
+  ClpAesEngine,
+  ClpIAesEngine,
+  ClpAesLightEngine,
+  ClpIAesLightEngine,
+  ClpKeyParameter,
+  ClpIKeyParameter,
+  ClpBufferedBlockCipher,
+  ClpIBufferedBlockCipher,
+  ClpHex,
+  ClpArrayUtils,
+  ClpCryptoLibTypes;
+
+type
+
+  TCryptoLibTestCase = class abstract(TTestCase)
+
+  end;
+
+type
+
+  /// <summary>
+  /// a basic test that takes a cipher, key parameter, and an input and
+  /// output string. This test wraps the engine in a buffered block cipher
+  /// with padding disabled.
+  /// </summary>
+  TTestBlockCipherMonteCarlo = class(TCryptoLibTestCase)
+  private
+
+    procedure DoBlockCipherMonteCarloTest(const iteration: string;
+      const engine: IBlockCipher; const param: ICipherParameters;
+      const input, output: String);
+
+  protected
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+
+    procedure TestBlockCipherAESEngine;
+    procedure TestBlockCipherAESLightEngine;
+
+  end;
+
+implementation
+
+{ TTestBlockCipherMonteCarlo }
+
+procedure TTestBlockCipherMonteCarlo.DoBlockCipherMonteCarloTest(const iteration
+  : string; const engine: IBlockCipher; const param: ICipherParameters;
+  const input, output: String);
+var
+  cipher: IBufferedBlockCipher;
+  len1, len2, i, iterations: Int32;
+  LInput, LOutput, outBytes: TBytes;
+begin
+  LInput := THex.Decode(input);
+  LOutput := THex.Decode(output);
+  iterations := StrToInt(iteration);
+
+  cipher := TBufferedBlockCipher.Create(engine);
+
+  cipher.Init(true, param);
+
+  System.SetLength(outBytes, System.Length(LInput));
+
+  System.Move(LInput[0], outBytes[0], System.Length(outBytes) *
+    System.SizeOf(Byte));
+
+  i := 0;
+  while i <> iterations do
+  begin
+    len1 := cipher.ProcessBytes(outBytes, 0, System.Length(outBytes),
+      outBytes, 0);
+
+    cipher.DoFinal(outBytes, len1);
+    System.Inc(i);
+  end;
+
+  if (not TArrayUtils.AreEqual(outBytes, LOutput)) then
+  begin
+    Fail(Format('Encryption Failed - Expected %s but got %s',
+      [THex.Encode(LOutput), THex.Encode(outBytes)]));
+  end;
+
+  cipher.Init(false, param);
+
+  i := 0;
+  while i <> iterations do
+  begin
+    len2 := cipher.ProcessBytes(outBytes, 0, System.Length(outBytes),
+      outBytes, 0);
+
+    cipher.DoFinal(outBytes, len2);
+    System.Inc(i);
+  end;
+
+  if (not TArrayUtils.AreEqual(LInput, outBytes)) then
+  begin
+    Fail(Format('Decryption Failed - Expected %s but got %s',
+      [THex.Encode(LInput), THex.Encode(outBytes)]));
+  end;
+end;
+
+procedure TTestBlockCipherMonteCarlo.SetUp;
+begin
+  inherited;
+end;
+
+procedure TTestBlockCipherMonteCarlo.TearDown;
+begin
+  inherited;
+
+end;
+
+procedure TTestBlockCipherMonteCarlo.TestBlockCipherAESEngine;
+var
+  i: Int32;
+begin
+  for i := System.Low(TAESTestVectors.FBlockCipherMonteCarloKeys)
+    to System.High(TAESTestVectors.FBlockCipherMonteCarloKeys) do
+  begin
+    DoBlockCipherMonteCarloTest(TAESTestVectors.FBlockCipherMonteCarloIterations
+      [i], TAesEngine.Create() as IAesEngine,
+      TKeyParameter.Create
+      (THex.Decode(TAESTestVectors.FBlockCipherMonteCarloKeys[i]))
+      as IKeyParameter, TAESTestVectors.FBlockCipherMonteCarloInputs[i],
+      TAESTestVectors.FBlockCipherMonteCarloOutputs[i]);
+  end;
+
+end;
+
+procedure TTestBlockCipherMonteCarlo.TestBlockCipherAESLightEngine;
+var
+  i: Int32;
+begin
+  for i := System.Low(TAESTestVectors.FBlockCipherMonteCarloKeys)
+    to System.High(TAESTestVectors.FBlockCipherMonteCarloKeys) do
+  begin
+    DoBlockCipherMonteCarloTest(TAESTestVectors.FBlockCipherMonteCarloIterations
+      [i], TAesLightEngine.Create() as IAesLightEngine,
+      TKeyParameter.Create
+      (THex.Decode(TAESTestVectors.FBlockCipherMonteCarloKeys[i]))
+      as IKeyParameter, TAESTestVectors.FBlockCipherMonteCarloInputs[i],
+      TAESTestVectors.FBlockCipherMonteCarloOutputs[i]);
+  end;
+
+end;
+
+initialization
+
+// Register any test cases with the test runner
+
+{$IFDEF FPC}
+  RegisterTest(TTestBlockCipherMonteCarlo);
+{$ELSE}
+  RegisterTest(TTestBlockCipherMonteCarlo.Suite);
+{$ENDIF FPC}
+
+end.

+ 52 - 6
CryptoLib.Tests/src/Crypto/BlockCipherVectorTests.pas

@@ -36,6 +36,8 @@ uses
   ClpICipherParameters,
   ClpICipherParameters,
   ClpAesEngine,
   ClpAesEngine,
   ClpIAesEngine,
   ClpIAesEngine,
+  ClpAesLightEngine,
+  ClpIAesLightEngine,
   ClpKeyParameter,
   ClpKeyParameter,
   ClpIKeyParameter,
   ClpIKeyParameter,
   ClpParametersWithIV,
   ClpParametersWithIV,
@@ -62,7 +64,7 @@ type
   TTestBlockCipherVector = class(TCryptoLibTestCase)
   TTestBlockCipherVector = class(TCryptoLibTestCase)
   private
   private
 
 
-    procedure doBlockCipherVectorTest(const engine: IBlockCipher;
+    procedure DoBlockCipherVectorTest(const engine: IBlockCipher;
       const param: ICipherParameters; const input, output: String);
       const param: ICipherParameters; const input, output: String);
 
 
   protected
   protected
@@ -71,6 +73,7 @@ type
   published
   published
 
 
     procedure TestBlockCipherAESEngine;
     procedure TestBlockCipherAESEngine;
+    procedure TestBlockCipherAESLightEngine;
     procedure TestBadParameters;
     procedure TestBadParameters;
 
 
   end;
   end;
@@ -79,7 +82,7 @@ implementation
 
 
 { TTestBlockCipherVector }
 { TTestBlockCipherVector }
 
 
-procedure TTestBlockCipherVector.doBlockCipherVectorTest
+procedure TTestBlockCipherVector.DoBlockCipherVectorTest
   (const engine: IBlockCipher; const param: ICipherParameters;
   (const engine: IBlockCipher; const param: ICipherParameters;
   const input, output: String);
   const input, output: String);
 var
 var
@@ -96,9 +99,7 @@ begin
 
 
   System.SetLength(outBytes, System.Length(LInput));
   System.SetLength(outBytes, System.Length(LInput));
 
 
-  // len1 := cipher.ProcessBytes(LInput, 0, System.Length(LInput), outBytes, 0);
-  len1 := cipher.ProcessBytes(LInput, 0,
-    cipher.GetOutputSize(System.Length(LInput)), outBytes, 0);
+  len1 := cipher.ProcessBytes(LInput, 0, System.Length(LInput), outBytes, 0);
 
 
   cipher.DoFinal(outBytes, len1);
   cipher.DoFinal(outBytes, len1);
 
 
@@ -136,6 +137,7 @@ procedure TTestBlockCipherVector.TestBadParameters;
 var
 var
   dudKey, iv: TBytes;
   dudKey, iv: TBytes;
   engine: IAesEngine;
   engine: IAesEngine;
+  engine2: IAesLightEngine;
 begin
 begin
 
 
   engine := TAesEngine.Create();
   engine := TAesEngine.Create();
@@ -166,6 +168,35 @@ begin
     end;
     end;
 
 
   end;
   end;
+
+  engine2 := TAesLightEngine.Create();
+  //
+  // init tests
+  //
+
+  try
+    System.SetLength(dudKey, 6);
+    engine2.Init(true, TKeyParameter.Create(dudKey) as IKeyParameter);
+    Fail('failed key length check');
+  except
+    on e: EArgumentCryptoLibException do
+    begin
+      // expected
+    end;
+
+  end;
+
+  try
+    System.SetLength(iv, 16);
+    engine2.Init(true, TParametersWithIV.Create(nil, iv) as IParametersWithIV);
+    Fail('failed parameter check');
+  except
+    on e: EArgumentCryptoLibException do
+    begin
+      // expected
+    end;
+
+  end;
 end;
 end;
 
 
 procedure TTestBlockCipherVector.TestBlockCipherAESEngine;
 procedure TTestBlockCipherVector.TestBlockCipherAESEngine;
@@ -175,7 +206,22 @@ begin
   for I := System.Low(TAESTestVectors.FBlockCipherVectorKeys)
   for I := System.Low(TAESTestVectors.FBlockCipherVectorKeys)
     to System.High(TAESTestVectors.FBlockCipherVectorKeys) do
     to System.High(TAESTestVectors.FBlockCipherVectorKeys) do
   begin
   begin
-    doBlockCipherVectorTest(TAesEngine.Create() as IAesEngine,
+    DoBlockCipherVectorTest(TAesEngine.Create() as IAesEngine,
+      TKeyParameter.Create(THex.Decode(TAESTestVectors.FBlockCipherVectorKeys[I]
+      )) as IKeyParameter, TAESTestVectors.FBlockCipherVectorInputs[I],
+      TAESTestVectors.FBlockCipherVectorOutputs[I]);
+  end;
+
+end;
+
+procedure TTestBlockCipherVector.TestBlockCipherAESLightEngine;
+var
+  I: Int32;
+begin
+  for I := System.Low(TAESTestVectors.FBlockCipherVectorKeys)
+    to System.High(TAESTestVectors.FBlockCipherVectorKeys) do
+  begin
+    DoBlockCipherVectorTest(TAesLightEngine.Create() as IAesLightEngine,
       TKeyParameter.Create(THex.Decode(TAESTestVectors.FBlockCipherVectorKeys[I]
       TKeyParameter.Create(THex.Decode(TAESTestVectors.FBlockCipherVectorKeys[I]
       )) as IKeyParameter, TAESTestVectors.FBlockCipherVectorInputs[I],
       )) as IKeyParameter, TAESTestVectors.FBlockCipherVectorInputs[I],
       TAESTestVectors.FBlockCipherVectorOutputs[I]);
       TAESTestVectors.FBlockCipherVectorOutputs[I]);

+ 162 - 0
CryptoLib.Tests/src/Crypto/RIPEMD128HMacTests.pas

@@ -0,0 +1,162 @@
+{ *********************************************************************************** }
+{ *                              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 RIPEMD128HMacTests;
+
+interface
+
+{$IFDEF FPC}
+{$MODE DELPHI}
+{$ENDIF FPC}
+
+uses
+  SysUtils,
+{$IFDEF FPC}
+  fpcunit,
+  testregistry,
+{$ELSE}
+  TestFramework,
+{$ENDIF FPC}
+  ClpKeyParameter,
+  ClpHMac,
+  ClpIMac,
+  ClpDigestUtilities,
+  ClpHex,
+  ClpArrayUtils,
+  ClpStringUtils,
+  ClpCryptoLibTypes;
+
+type
+
+  TCryptoLibTestCase = class abstract(TTestCase)
+
+  end;
+
+type
+
+  /// <summary>
+  /// RIPEMD128 HMac Test, test vectors from RFC 2202
+  /// </summary>
+  TTestRIPEMD128HMac = class(TCryptoLibTestCase)
+  private
+  var
+    Fkeys, Fdigests, Fmessages: TCryptoLibStringArray;
+  protected
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+
+    procedure TestRIPEMD128HMac;
+
+  end;
+
+implementation
+
+{ TTestRIPEMD128HMac }
+
+procedure TTestRIPEMD128HMac.SetUp;
+begin
+  inherited;
+  Fkeys := TCryptoLibStringArray.Create('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b',
+    '4a656665', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
+    '0102030405060708090a0b0c0d0e0f10111213141516171819',
+    '0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c',
+    'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
+    'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
+
+  Fdigests := TCryptoLibStringArray.Create('fbf61f9492aa4bbf81c172e84e0734db',
+    '875f828862b6b334b427c55f9f7ff09b', '09f0b2846d2f543da363cbec8d62a38d',
+    'bdbbd7cf03e44b5aa60af815be4d2294', 'e79808f24b25fd031c155f0d551d9a3a',
+    'dc732928de98104a1f59d373c150acbb', '5c6bec96793e16d40690c237635f30c5');
+
+  Fmessages := TCryptoLibStringArray.Create('Hi There',
+    'what do ya want for nothing?',
+    '0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd',
+    '0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd',
+    'Test With Truncation',
+    'Test Using Larger Than Block-Size Key - Hash Key First',
+    'Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data');
+end;
+
+procedure TTestRIPEMD128HMac.TearDown;
+begin
+  inherited;
+
+end;
+
+procedure TTestRIPEMD128HMac.TestRIPEMD128HMac;
+var
+  hmac: IMac;
+  resBuf, m, m2: TBytes;
+  i, vector: Int32;
+begin
+  hmac := THMac.Create(TDigestUtilities.GetDigest('RIPEMD128'));
+  System.SetLength(resBuf, hmac.GetMacSize());
+
+  for i := 0 to System.Pred(System.Length(Fmessages)) do
+  begin
+    m := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[i]));
+    if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
+    begin
+      m := THex.Decode(System.Copy(Fmessages[i], 3,
+        System.Length(Fmessages[i]) - 2));
+    end;
+    hmac.Init(TKeyParameter.Create(THex.Decode(Fkeys[i])));
+    hmac.BlockUpdate(m, 0, System.Length(m));
+    hmac.DoFinal(resBuf, 0);
+
+    if (not TArrayUtils.AreEqual(resBuf, THex.Decode(Fdigests[i]))) then
+    begin
+      Fail('Vector ' + IntToStr(i) + ' failed');
+    end;
+  end;
+
+  // test reset
+  vector := 0; // vector used for test
+  m2 := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[vector]));
+
+  if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
+  begin
+    m2 := THex.Decode(System.Copy(Fmessages[vector], 3,
+      System.Length(Fmessages[vector]) - 2));
+  end;
+
+  hmac.Init(TKeyParameter.Create(THex.Decode(Fkeys[vector])));
+  hmac.BlockUpdate(m2, 0, System.Length(m2));
+  hmac.DoFinal(resBuf, 0);
+  hmac.Reset();
+  hmac.BlockUpdate(m2, 0, System.Length(m2));
+  hmac.DoFinal(resBuf, 0);
+
+  if (not TArrayUtils.AreEqual(resBuf, THex.Decode(Fdigests[vector]))) then
+  begin
+    Fail('Reset with vector ' + IntToStr(vector) + ' failed');
+  end;
+
+end;
+
+initialization
+
+// Register any test cases with the test runner
+
+{$IFDEF FPC}
+  RegisterTest(TTestRIPEMD128HMac);
+{$ELSE}
+  RegisterTest(TTestRIPEMD128HMac.Suite);
+{$ENDIF FPC}
+
+end.

+ 167 - 0
CryptoLib.Tests/src/Crypto/RIPEMD160HMacTests.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 RIPEMD160HMacTests;
+
+interface
+
+{$IFDEF FPC}
+{$MODE DELPHI}
+{$ENDIF FPC}
+
+uses
+  SysUtils,
+{$IFDEF FPC}
+  fpcunit,
+  testregistry,
+{$ELSE}
+  TestFramework,
+{$ENDIF FPC}
+  ClpKeyParameter,
+  ClpHMac,
+  ClpIMac,
+  ClpDigestUtilities,
+  ClpHex,
+  ClpArrayUtils,
+  ClpStringUtils,
+  ClpCryptoLibTypes;
+
+type
+
+  TCryptoLibTestCase = class abstract(TTestCase)
+
+  end;
+
+type
+
+  /// <summary>
+  /// RIPEMD160 HMac Test, test vectors from RFC 2202
+  /// </summary>
+  TTestRIPEMD160HMac = class(TCryptoLibTestCase)
+  private
+  var
+    Fkeys, Fdigests, Fmessages: TCryptoLibStringArray;
+  protected
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+
+    procedure TestRIPEMD160HMac;
+
+  end;
+
+implementation
+
+{ TTestRIPEMD160HMac }
+
+procedure TTestRIPEMD160HMac.SetUp;
+begin
+  inherited;
+  Fkeys := TCryptoLibStringArray.Create
+    ('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', '4a656665',
+    'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
+    '0102030405060708090a0b0c0d0e0f10111213141516171819',
+    '0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c',
+    'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
+    'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
+
+  Fdigests := TCryptoLibStringArray.Create
+    ('24cb4bd67d20fc1a5d2ed7732dcc39377f0a5668',
+    'dda6c0213a485a9e24f4742064a7f033b43c4069',
+    'b0b105360de759960ab4f35298e116e295d8e7c1',
+    'd5ca862f4d21d5e610e18b4cf1beb97a4365ecf4',
+    '7619693978f91d90539ae786500ff3d8e0518e39',
+    '6466ca07ac5eac29e1bd523e5ada7605b791fd8b',
+    '69ea60798d71616cce5fd0871e23754cd75d5a0a');
+
+  Fmessages := TCryptoLibStringArray.Create('Hi There',
+    'what do ya want for nothing?',
+    '0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd',
+    '0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd',
+    'Test With Truncation',
+    'Test Using Larger Than Block-Size Key - Hash Key First',
+    'Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data');
+end;
+
+procedure TTestRIPEMD160HMac.TearDown;
+begin
+  inherited;
+
+end;
+
+procedure TTestRIPEMD160HMac.TestRIPEMD160HMac;
+var
+  hmac: IMac;
+  resBuf, m, m2: TBytes;
+  i, vector: Int32;
+begin
+  hmac := THMac.Create(TDigestUtilities.GetDigest('RIPEMD160'));
+  System.SetLength(resBuf, hmac.GetMacSize());
+
+  for i := 0 to System.Pred(System.Length(Fmessages)) do
+  begin
+    m := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[i]));
+    if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
+    begin
+      m := THex.Decode(System.Copy(Fmessages[i], 3,
+        System.Length(Fmessages[i]) - 2));
+    end;
+    hmac.Init(TKeyParameter.Create(THex.Decode(Fkeys[i])));
+    hmac.BlockUpdate(m, 0, System.Length(m));
+    hmac.DoFinal(resBuf, 0);
+
+    if (not TArrayUtils.AreEqual(resBuf, THex.Decode(Fdigests[i]))) then
+    begin
+      Fail('Vector ' + IntToStr(i) + ' failed');
+    end;
+  end;
+
+  // test reset
+  vector := 0; // vector used for test
+  m2 := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[vector]));
+
+  if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
+  begin
+    m2 := THex.Decode(System.Copy(Fmessages[vector], 3,
+      System.Length(Fmessages[vector]) - 2));
+  end;
+
+  hmac.Init(TKeyParameter.Create(THex.Decode(Fkeys[vector])));
+  hmac.BlockUpdate(m2, 0, System.Length(m2));
+  hmac.DoFinal(resBuf, 0);
+  hmac.Reset();
+  hmac.BlockUpdate(m2, 0, System.Length(m2));
+  hmac.DoFinal(resBuf, 0);
+
+  if (not TArrayUtils.AreEqual(resBuf, THex.Decode(Fdigests[vector]))) then
+  begin
+    Fail('Reset with vector ' + IntToStr(vector) + ' failed');
+  end;
+
+end;
+
+initialization
+
+// Register any test cases with the test runner
+
+{$IFDEF FPC}
+  RegisterTest(TTestRIPEMD160HMac);
+{$ELSE}
+  RegisterTest(TTestRIPEMD160HMac.Suite);
+{$ENDIF FPC}
+
+end.

+ 168 - 0
CryptoLib.Tests/src/Crypto/SHA1HMacTests.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 SHA1HMacTests;
+
+interface
+
+{$IFDEF FPC}
+{$MODE DELPHI}
+{$ENDIF FPC}
+
+uses
+  SysUtils,
+{$IFDEF FPC}
+  fpcunit,
+  testregistry,
+{$ELSE}
+  TestFramework,
+{$ENDIF FPC}
+  ClpKeyParameter,
+  ClpHMac,
+  ClpIMac,
+  ClpDigestUtilities,
+  ClpHex,
+  ClpArrayUtils,
+  ClpStringUtils,
+  ClpCryptoLibTypes;
+
+type
+
+  TCryptoLibTestCase = class abstract(TTestCase)
+
+  end;
+
+type
+
+  /// <summary>
+  /// SHA1 HMac Test, test vectors from RFC 2202
+  /// </summary>
+  TTestSHA1HMac = class(TCryptoLibTestCase)
+  private
+  var
+    Fkeys, Fdigests, Fmessages: TCryptoLibStringArray;
+  protected
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+
+    procedure TestSHA1HMac;
+
+  end;
+
+implementation
+
+{ TTestSHA1HMac }
+
+procedure TTestSHA1HMac.SetUp;
+begin
+  inherited;
+  Fkeys := TCryptoLibStringArray.Create
+    ('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', '4a656665',
+    'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
+    '0102030405060708090a0b0c0d0e0f10111213141516171819',
+    '0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c',
+    'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
+    'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
+  Fdigests := TCryptoLibStringArray.Create
+    ('b617318655057264e28bc0b6fb378c8ef146be00',
+    'effcdf6ae5eb2fa2d27416d5f184df9c259a7c79',
+    '125d7342b9ac11cd91a39af48aa17b4f63f175d3',
+    '4c9007f4026250c6bc8414f9bf50c86c2d7235da',
+    '4c1a03424b55e07fe7f27be1d58bb9324a9a5a04',
+    'aa4ae5e15272d00e95705637ce8a3b55ed402112',
+    'e8e99d0f45237d786d6bbaa7965c7808bbff1a91',
+    '4c1a03424b55e07fe7f27be1d58bb9324a9a5a04',
+    'aa4ae5e15272d00e95705637ce8a3b55ed402112',
+    'e8e99d0f45237d786d6bbaa7965c7808bbff1a91');
+  Fmessages := TCryptoLibStringArray.Create('Hi There',
+    'what do ya want for nothing?',
+    '0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd',
+    '0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd',
+    'Test With Truncation',
+    'Test Using Larger Than Block-Size Key - Hash Key First',
+    'Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data');
+end;
+
+procedure TTestSHA1HMac.TearDown;
+begin
+  inherited;
+
+end;
+
+procedure TTestSHA1HMac.TestSHA1HMac;
+var
+  hmac: IMac;
+  resBuf, m, m2: TBytes;
+  i, vector: Int32;
+begin
+  hmac := THMac.Create(TDigestUtilities.GetDigest('SHA-1'));
+  System.SetLength(resBuf, hmac.GetMacSize());
+
+  for i := 0 to System.Pred(System.Length(Fmessages)) do
+  begin
+    m := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[i]));
+    if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
+    begin
+      m := THex.Decode(System.Copy(Fmessages[i], 3,
+        System.Length(Fmessages[i]) - 2));
+    end;
+    hmac.Init(TKeyParameter.Create(THex.Decode(Fkeys[i])));
+    hmac.BlockUpdate(m, 0, System.Length(m));
+    hmac.DoFinal(resBuf, 0);
+
+    if (not TArrayUtils.AreEqual(resBuf, THex.Decode(Fdigests[i]))) then
+    begin
+      Fail('Vector ' + IntToStr(i) + ' failed');
+    end;
+  end;
+
+  // test reset
+  vector := 0; // vector used for test
+  m2 := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[vector]));
+
+  if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
+  begin
+    m2 := THex.Decode(System.Copy(Fmessages[vector], 3,
+      System.Length(Fmessages[vector]) - 2));
+  end;
+
+  hmac.Init(TKeyParameter.Create(THex.Decode(Fkeys[vector])));
+  hmac.BlockUpdate(m2, 0, System.Length(m2));
+  hmac.DoFinal(resBuf, 0);
+  hmac.Reset();
+  hmac.BlockUpdate(m2, 0, System.Length(m2));
+  hmac.DoFinal(resBuf, 0);
+
+  if (not TArrayUtils.AreEqual(resBuf, THex.Decode(Fdigests[vector]))) then
+  begin
+    Fail('Reset with vector ' + IntToStr(vector) + ' failed');
+  end;
+
+end;
+
+initialization
+
+// Register any test cases with the test runner
+
+{$IFDEF FPC}
+  RegisterTest(TTestSHA1HMac);
+{$ELSE}
+  RegisterTest(TTestSHA1HMac.Suite);
+{$ENDIF FPC}
+
+end.

+ 169 - 0
CryptoLib.Tests/src/Crypto/SHA224HMacTests.pas

@@ -0,0 +1,169 @@
+{ *********************************************************************************** }
+{ *                              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 SHA224HMacTests;
+
+interface
+
+{$IFDEF FPC}
+{$MODE DELPHI}
+{$ENDIF FPC}
+
+uses
+  SysUtils,
+{$IFDEF FPC}
+  fpcunit,
+  testregistry,
+{$ELSE}
+  TestFramework,
+{$ENDIF FPC}
+  ClpKeyParameter,
+  ClpHMac,
+  ClpIMac,
+  ClpDigestUtilities,
+  ClpHex,
+  ClpArrayUtils,
+  ClpStringUtils,
+  ClpCryptoLibTypes;
+
+type
+
+  TCryptoLibTestCase = class abstract(TTestCase)
+
+  end;
+
+type
+
+  /// <summary>
+  /// SHA224 HMac Test, test vectors from RFC 2202
+  /// </summary>
+  TTestSHA224HMac = class(TCryptoLibTestCase)
+  private
+  var
+    Fkeys, Fdigests, Fmessages: TCryptoLibStringArray;
+  protected
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+
+    procedure TestSHA224HMac;
+
+  end;
+
+implementation
+
+{ TTestSHA224HMac }
+
+procedure TTestSHA224HMac.SetUp;
+begin
+  inherited;
+  Fkeys := TCryptoLibStringArray.Create
+    ('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', '4a656665',
+    'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
+    '0102030405060708090a0b0c0d0e0f10111213141516171819',
+    '0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c',
+    'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
+    + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
+    'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
+    + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
+
+  Fdigests := TCryptoLibStringArray.Create
+    ('896fb1128abbdf196832107cd49df33f47b4b1169912ba4f53684b22',
+    'a30e01098bc6dbbf45690f3a7e9e6d0f8bbea2a39e6148008fd05e44',
+    '7fb3cb3588c6c1f6ffa9694d7d6ad2649365b0c1f65d69d1ec8333ea',
+    '6c11506874013cac6a2abc1bb382627cec6a90d86efc012de7afec5a',
+    '0e2aea68a90c8d37c988bcdb9fca6fa8099cd857c7ec4a1815cac54c',
+    '95e9a0db962095adaebe9b2d6f0dbce2d499f112f2d2b7273fa6870e',
+    '3a854166ac5d9f023f54d517d0b39dbd946770db9c2b95c9f6f565d1');
+
+  Fmessages := TCryptoLibStringArray.Create('Hi There',
+    'what do ya want for nothing?',
+    '0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd',
+    '0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd',
+    'Test With Truncation',
+    'Test Using Larger Than Block-Size Key - Hash Key First',
+    'This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.');
+end;
+
+procedure TTestSHA224HMac.TearDown;
+begin
+  inherited;
+
+end;
+
+procedure TTestSHA224HMac.TestSHA224HMac;
+var
+  hmac: IMac;
+  resBuf, m, m2: TBytes;
+  i, vector: Int32;
+begin
+  hmac := THMac.Create(TDigestUtilities.GetDigest('SHA-224'));
+  System.SetLength(resBuf, hmac.GetMacSize());
+
+  for i := 0 to System.Pred(System.Length(Fmessages)) do
+  begin
+    m := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[i]));
+    if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
+    begin
+      m := THex.Decode(System.Copy(Fmessages[i], 3,
+        System.Length(Fmessages[i]) - 2));
+    end;
+    hmac.Init(TKeyParameter.Create(THex.Decode(Fkeys[i])));
+    hmac.BlockUpdate(m, 0, System.Length(m));
+    hmac.DoFinal(resBuf, 0);
+
+    if (not TArrayUtils.AreEqual(resBuf, THex.Decode(Fdigests[i]))) then
+    begin
+      Fail('Vector ' + IntToStr(i) + ' failed');
+    end;
+  end;
+
+  // test reset
+  vector := 0; // vector used for test
+  m2 := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[vector]));
+
+  if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
+  begin
+    m2 := THex.Decode(System.Copy(Fmessages[vector], 3,
+      System.Length(Fmessages[vector]) - 2));
+  end;
+
+  hmac.Init(TKeyParameter.Create(THex.Decode(Fkeys[vector])));
+  hmac.BlockUpdate(m2, 0, System.Length(m2));
+  hmac.DoFinal(resBuf, 0);
+  hmac.Reset();
+  hmac.BlockUpdate(m2, 0, System.Length(m2));
+  hmac.DoFinal(resBuf, 0);
+
+  if (not TArrayUtils.AreEqual(resBuf, THex.Decode(Fdigests[vector]))) then
+  begin
+    Fail('Reset with vector ' + IntToStr(vector) + ' failed');
+  end;
+
+end;
+
+initialization
+
+// Register any test cases with the test runner
+
+{$IFDEF FPC}
+  RegisterTest(TTestSHA224HMac);
+{$ELSE}
+  RegisterTest(TTestSHA224HMac.Suite);
+{$ENDIF FPC}
+
+end.

+ 169 - 0
CryptoLib.Tests/src/Crypto/SHA256HMacTests.pas

@@ -0,0 +1,169 @@
+{ *********************************************************************************** }
+{ *                              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 SHA256HMacTests;
+
+interface
+
+{$IFDEF FPC}
+{$MODE DELPHI}
+{$ENDIF FPC}
+
+uses
+  SysUtils,
+{$IFDEF FPC}
+  fpcunit,
+  testregistry,
+{$ELSE}
+  TestFramework,
+{$ENDIF FPC}
+  ClpKeyParameter,
+  ClpHMac,
+  ClpIMac,
+  ClpDigestUtilities,
+  ClpHex,
+  ClpArrayUtils,
+  ClpStringUtils,
+  ClpCryptoLibTypes;
+
+type
+
+  TCryptoLibTestCase = class abstract(TTestCase)
+
+  end;
+
+type
+
+  /// <summary>
+  /// SHA256 HMac Test, test vectors from RFC 2202
+  /// </summary>
+  TTestSHA256HMac = class(TCryptoLibTestCase)
+  private
+  var
+    Fkeys, Fdigests, Fmessages: TCryptoLibStringArray;
+  protected
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+
+    procedure TestSHA256HMac;
+
+  end;
+
+implementation
+
+{ TTestSHA256HMac }
+
+procedure TTestSHA256HMac.SetUp;
+begin
+  inherited;
+  Fkeys := TCryptoLibStringArray.Create
+    ('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', '4a656665',
+    'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
+    '0102030405060708090a0b0c0d0e0f10111213141516171819',
+    '0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c',
+    'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
+    + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
+    'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
+    + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
+
+  Fdigests := TCryptoLibStringArray.Create
+    ('b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7',
+    '5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843',
+    '773ea91e36800e46854db8ebd09181a72959098b3ef8c122d9635514ced565fe',
+    '82558a389a443c0ea4cc819899f2083a85f0faa3e578f8077a2e3ff46729665b',
+    'a3b6167473100ee06e0c796c2955552bfa6f7c0a6a8aef8b93f860aab0cd20c5',
+    '60e431591ee0b67f0d8a26aacbf5b77f8e0bc6213728c5140546040f0ee37f54',
+    '9b09ffa71b942fcb27635fbcd5b0e944bfdc63644f0713938a7f51535c3a35e2');
+
+  Fmessages := TCryptoLibStringArray.Create('Hi There',
+    'what do ya want for nothing?',
+    '0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd',
+    '0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd',
+    'Test With Truncation',
+    'Test Using Larger Than Block-Size Key - Hash Key First',
+    'This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.');
+end;
+
+procedure TTestSHA256HMac.TearDown;
+begin
+  inherited;
+
+end;
+
+procedure TTestSHA256HMac.TestSHA256HMac;
+var
+  hmac: IMac;
+  resBuf, m, m2: TBytes;
+  i, vector: Int32;
+begin
+  hmac := THMac.Create(TDigestUtilities.GetDigest('SHA-256'));
+  System.SetLength(resBuf, hmac.GetMacSize());
+
+  for i := 0 to System.Pred(System.Length(Fmessages)) do
+  begin
+    m := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[i]));
+    if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
+    begin
+      m := THex.Decode(System.Copy(Fmessages[i], 3,
+        System.Length(Fmessages[i]) - 2));
+    end;
+    hmac.Init(TKeyParameter.Create(THex.Decode(Fkeys[i])));
+    hmac.BlockUpdate(m, 0, System.Length(m));
+    hmac.DoFinal(resBuf, 0);
+
+    if (not TArrayUtils.AreEqual(resBuf, THex.Decode(Fdigests[i]))) then
+    begin
+      Fail('Vector ' + IntToStr(i) + ' failed');
+    end;
+  end;
+
+  // test reset
+  vector := 0; // vector used for test
+  m2 := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[vector]));
+
+  if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
+  begin
+    m2 := THex.Decode(System.Copy(Fmessages[vector], 3,
+      System.Length(Fmessages[vector]) - 2));
+  end;
+
+  hmac.Init(TKeyParameter.Create(THex.Decode(Fkeys[vector])));
+  hmac.BlockUpdate(m2, 0, System.Length(m2));
+  hmac.DoFinal(resBuf, 0);
+  hmac.Reset();
+  hmac.BlockUpdate(m2, 0, System.Length(m2));
+  hmac.DoFinal(resBuf, 0);
+
+  if (not TArrayUtils.AreEqual(resBuf, THex.Decode(Fdigests[vector]))) then
+  begin
+    Fail('Reset with vector ' + IntToStr(vector) + ' failed');
+  end;
+
+end;
+
+initialization
+
+// Register any test cases with the test runner
+
+{$IFDEF FPC}
+  RegisterTest(TTestSHA256HMac);
+{$ELSE}
+  RegisterTest(TTestSHA256HMac.Suite);
+{$ENDIF FPC}
+
+end.

+ 169 - 0
CryptoLib.Tests/src/Crypto/SHA384HMacTests.pas

@@ -0,0 +1,169 @@
+{ *********************************************************************************** }
+{ *                              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 SHA384HMacTests;
+
+interface
+
+{$IFDEF FPC}
+{$MODE DELPHI}
+{$ENDIF FPC}
+
+uses
+  SysUtils,
+{$IFDEF FPC}
+  fpcunit,
+  testregistry,
+{$ELSE}
+  TestFramework,
+{$ENDIF FPC}
+  ClpKeyParameter,
+  ClpHMac,
+  ClpIMac,
+  ClpDigestUtilities,
+  ClpHex,
+  ClpArrayUtils,
+  ClpStringUtils,
+  ClpCryptoLibTypes;
+
+type
+
+  TCryptoLibTestCase = class abstract(TTestCase)
+
+  end;
+
+type
+
+  /// <summary>
+  /// SHA384 HMac Test, test vectors from RFC 2202
+  /// </summary>
+  TTestSHA384HMac = class(TCryptoLibTestCase)
+  private
+  var
+    Fkeys, Fdigests, Fmessages: TCryptoLibStringArray;
+  protected
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+
+    procedure TestSHA384HMac;
+
+  end;
+
+implementation
+
+{ TTestSHA384HMac }
+
+procedure TTestSHA384HMac.SetUp;
+begin
+  inherited;
+  Fkeys := TCryptoLibStringArray.Create
+    ('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', '4a656665',
+    'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
+    '0102030405060708090a0b0c0d0e0f10111213141516171819',
+    '0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c',
+    'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
+    + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
+    'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
+    + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
+
+  Fdigests := TCryptoLibStringArray.Create
+    ('afd03944d84895626b0825f4ab46907f15f9dadbe4101ec682aa034c7cebc59cfaea9ea9076ede7f4af152e8b2fa9cb6',
+    'af45d2e376484031617f78d2b58a6b1b9c7ef464f5a01b47e42ec3736322445e8e2240ca5e69e2c78b3239ecfab21649',
+    '88062608d3e6ad8a0aa2ace014c8a86f0aa635d947ac9febe83ef4e55966144b2a5ab39dc13814b94e3ab6e101a34f27',
+    '3e8a69b7783c25851933ab6290af6ca77a9981480850009cc5577c6e1f573b4e6801dd23c4a7d679ccf8a386c674cffb',
+    '3abf34c3503b2a23a46efc619baef897f4c8e42c934ce55ccbae9740fcbc1af4ca62269e2a37cd88ba926341efe4aeea',
+    '4ece084485813e9088d2c63a041bc5b44f9ef1012a2b588f3cd11f05033ac4c60c2ef6ab4030fe8296248df163f44952',
+    '6617178e941f020d351e2f254e8fd32c602420feb0b8fb9adccebb82461e99c5a678cc31e799176d3860e6110c46523e');
+
+  Fmessages := TCryptoLibStringArray.Create('Hi There',
+    'what do ya want for nothing?',
+    '0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd',
+    '0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd',
+    'Test With Truncation',
+    'Test Using Larger Than Block-Size Key - Hash Key First',
+    'This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.');
+end;
+
+procedure TTestSHA384HMac.TearDown;
+begin
+  inherited;
+
+end;
+
+procedure TTestSHA384HMac.TestSHA384HMac;
+var
+  hmac: IMac;
+  resBuf, m, m2: TBytes;
+  i, vector: Int32;
+begin
+  hmac := THMac.Create(TDigestUtilities.GetDigest('SHA-384'));
+  System.SetLength(resBuf, hmac.GetMacSize());
+
+  for i := 0 to System.Pred(System.Length(Fmessages)) do
+  begin
+    m := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[i]));
+    if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
+    begin
+      m := THex.Decode(System.Copy(Fmessages[i], 3,
+        System.Length(Fmessages[i]) - 2));
+    end;
+    hmac.Init(TKeyParameter.Create(THex.Decode(Fkeys[i])));
+    hmac.BlockUpdate(m, 0, System.Length(m));
+    hmac.DoFinal(resBuf, 0);
+
+    if (not TArrayUtils.AreEqual(resBuf, THex.Decode(Fdigests[i]))) then
+    begin
+      Fail('Vector ' + IntToStr(i) + ' failed');
+    end;
+  end;
+
+  // test reset
+  vector := 0; // vector used for test
+  m2 := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[vector]));
+
+  if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
+  begin
+    m2 := THex.Decode(System.Copy(Fmessages[vector], 3,
+      System.Length(Fmessages[vector]) - 2));
+  end;
+
+  hmac.Init(TKeyParameter.Create(THex.Decode(Fkeys[vector])));
+  hmac.BlockUpdate(m2, 0, System.Length(m2));
+  hmac.DoFinal(resBuf, 0);
+  hmac.Reset();
+  hmac.BlockUpdate(m2, 0, System.Length(m2));
+  hmac.DoFinal(resBuf, 0);
+
+  if (not TArrayUtils.AreEqual(resBuf, THex.Decode(Fdigests[vector]))) then
+  begin
+    Fail('Reset with vector ' + IntToStr(vector) + ' failed');
+  end;
+
+end;
+
+initialization
+
+// Register any test cases with the test runner
+
+{$IFDEF FPC}
+  RegisterTest(TTestSHA384HMac);
+{$ELSE}
+  RegisterTest(TTestSHA384HMac.Suite);
+{$ENDIF FPC}
+
+end.

+ 169 - 0
CryptoLib.Tests/src/Crypto/SHA512HMacTests.pas

@@ -0,0 +1,169 @@
+{ *********************************************************************************** }
+{ *                              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 SHA512HMacTests;
+
+interface
+
+{$IFDEF FPC}
+{$MODE DELPHI}
+{$ENDIF FPC}
+
+uses
+  SysUtils,
+{$IFDEF FPC}
+  fpcunit,
+  testregistry,
+{$ELSE}
+  TestFramework,
+{$ENDIF FPC}
+  ClpKeyParameter,
+  ClpHMac,
+  ClpIMac,
+  ClpDigestUtilities,
+  ClpHex,
+  ClpArrayUtils,
+  ClpStringUtils,
+  ClpCryptoLibTypes;
+
+type
+
+  TCryptoLibTestCase = class abstract(TTestCase)
+
+  end;
+
+type
+
+  /// <summary>
+  /// SHA512 HMac Test, test vectors from RFC 2202
+  /// </summary>
+  TTestSHA512HMac = class(TCryptoLibTestCase)
+  private
+  var
+    Fkeys, Fdigests, Fmessages: TCryptoLibStringArray;
+  protected
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+
+    procedure TestSHA512HMac;
+
+  end;
+
+implementation
+
+{ TTestSHA512HMac }
+
+procedure TTestSHA512HMac.SetUp;
+begin
+  inherited;
+  Fkeys := TCryptoLibStringArray.Create
+    ('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', '4a656665',
+    'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
+    '0102030405060708090a0b0c0d0e0f10111213141516171819',
+    '0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c',
+    'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
+    + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
+    'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
+    + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
+
+  Fdigests := TCryptoLibStringArray.Create
+    ('87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cdedaa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854',
+    '164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea2505549758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737',
+    'fa73b0089d56a284efb0f0756c890be9b1b5dbdd8ee81a3655f83e33b2279d39bf3e848279a722c806b485a47e67c807b946a337bee8942674278859e13292fb',
+    'b0ba465637458c6990e5a8c5f61d4af7e576d97ff94b872de76f8050361ee3dba91ca5c11aa25eb4d679275cc5788063a5f19741120c4f2de2adebeb10a298dd',
+    '415fad6271580a531d4179bc891d87a650188707922a4fbb36663a1eb16da008711c5b50ddd0fc235084eb9d3364a1454fb2ef67cd1d29fe6773068ea266e96b',
+    '80b24263c7c1a3ebb71493c1dd7be8b49b46d1f41b4aeec1121b013783f8f3526b56d037e05f2598bd0fd2215d6a1e5295e64f73f63f0aec8b915a985d786598',
+    'e37b6a775dc87dbaa4dfa9f96e5e3ffddebd71f8867289865df5a32d20cdc944b6022cac3c4982b10d5eeb55c3e4de15134676fb6de0446065c97440fa8c6a58');
+
+  Fmessages := TCryptoLibStringArray.Create('Hi There',
+    'what do ya want for nothing?',
+    '0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd',
+    '0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd',
+    'Test With Truncation',
+    'Test Using Larger Than Block-Size Key - Hash Key First',
+    'This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.');
+end;
+
+procedure TTestSHA512HMac.TearDown;
+begin
+  inherited;
+
+end;
+
+procedure TTestSHA512HMac.TestSHA512HMac;
+var
+  hmac: IMac;
+  resBuf, m, m2: TBytes;
+  i, vector: Int32;
+begin
+  hmac := THMac.Create(TDigestUtilities.GetDigest('SHA-512'));
+  System.SetLength(resBuf, hmac.GetMacSize());
+
+  for i := 0 to System.Pred(System.Length(Fmessages)) do
+  begin
+    m := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[i]));
+    if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
+    begin
+      m := THex.Decode(System.Copy(Fmessages[i], 3,
+        System.Length(Fmessages[i]) - 2));
+    end;
+    hmac.Init(TKeyParameter.Create(THex.Decode(Fkeys[i])));
+    hmac.BlockUpdate(m, 0, System.Length(m));
+    hmac.DoFinal(resBuf, 0);
+
+    if (not TArrayUtils.AreEqual(resBuf, THex.Decode(Fdigests[i]))) then
+    begin
+      Fail('Vector ' + IntToStr(i) + ' failed');
+    end;
+  end;
+
+  // test reset
+  vector := 0; // vector used for test
+  m2 := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[vector]));
+
+  if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
+  begin
+    m2 := THex.Decode(System.Copy(Fmessages[vector], 3,
+      System.Length(Fmessages[vector]) - 2));
+  end;
+
+  hmac.Init(TKeyParameter.Create(THex.Decode(Fkeys[vector])));
+  hmac.BlockUpdate(m2, 0, System.Length(m2));
+  hmac.DoFinal(resBuf, 0);
+  hmac.Reset();
+  hmac.BlockUpdate(m2, 0, System.Length(m2));
+  hmac.DoFinal(resBuf, 0);
+
+  if (not TArrayUtils.AreEqual(resBuf, THex.Decode(Fdigests[vector]))) then
+  begin
+    Fail('Reset with vector ' + IntToStr(vector) + ' failed');
+  end;
+
+end;
+
+initialization
+
+// Register any test cases with the test runner
+
+{$IFDEF FPC}
+  RegisterTest(TTestSHA512HMac);
+{$ELSE}
+  RegisterTest(TTestSHA512HMac.Suite);
+{$ENDIF FPC}
+
+end.