Browse Source

Merge branch 'master' into travis

Ugochukwu Mmaduekwe 7 years ago
parent
commit
ce4b402a25
48 changed files with 1147 additions and 130 deletions
  1. 12 10
      CryptoLib.Samples/src/UsageExamples.pas
  2. 6 1
      CryptoLib.Tests/Delphi.Tests/CryptoLib.Tests.dpr
  3. 21 1
      CryptoLib.Tests/FreePascal.Tests/CryptoLib.Tests.lpi
  4. 5 0
      CryptoLib.Tests/FreePascal.Tests/CryptoLib.lpr
  5. 24 1
      CryptoLib.Tests/FreePascal.Tests/CryptoLibConsole.Tests.lpi
  6. 5 0
      CryptoLib.Tests/FreePascal.Tests/CryptoLibConsole.lpr
  7. 1 3
      CryptoLib.Tests/src/Asn1/DerApplicationSpecificTests.pas
  8. 202 0
      CryptoLib.Tests/src/Asn1/EnumeratedTests.pas
  9. 3 1
      CryptoLib.Tests/src/Asn1/EqualsAndHashCodeTests.pas
  10. 96 0
      CryptoLib.Tests/src/Asn1/ParseTests.pas
  11. 189 0
      CryptoLib.Tests/src/Asn1/ParsingTests.pas
  12. 171 0
      CryptoLib.Tests/src/Asn1/StringTests.pas
  13. 201 0
      CryptoLib.Tests/src/Asn1/TagTests.pas
  14. 14 12
      CryptoLib.Tests/src/Crypto/DSATests.pas
  15. 2 1
      CryptoLib.Tests/src/Crypto/HMacTests.pas
  16. 3 2
      CryptoLib.Tests/src/Crypto/MD5HMacTests.pas
  17. 23 14
      CryptoLib.Tests/src/Crypto/Pkcs5Tests.pas
  18. 3 2
      CryptoLib.Tests/src/Crypto/RIPEMD128HMacTests.pas
  19. 3 2
      CryptoLib.Tests/src/Crypto/RIPEMD160HMacTests.pas
  20. 3 2
      CryptoLib.Tests/src/Crypto/SHA1HMacTests.pas
  21. 3 2
      CryptoLib.Tests/src/Crypto/SHA224HMacTests.pas
  22. 3 2
      CryptoLib.Tests/src/Crypto/SHA256HMacTests.pas
  23. 3 2
      CryptoLib.Tests/src/Crypto/SHA384HMacTests.pas
  24. 3 2
      CryptoLib.Tests/src/Crypto/SHA512HMacTests.pas
  25. 4 3
      CryptoLib.Tests/src/Math/ECNRTests.pas
  26. 2 1
      CryptoLib.Tests/src/Math/IESCipherTests.pas
  27. 4 3
      CryptoLib.Tests/src/Others/ECDsa5Tests.pas
  28. 10 5
      CryptoLib.Tests/src/Others/ECSchnorrTests.pas
  29. 3 2
      CryptoLib.Tests/src/Others/NamedCurveTests.pas
  30. 2 1
      CryptoLib/src/Asn1/ClpAsn1InputStream.pas
  31. 8 2
      CryptoLib/src/Asn1/ClpAsn1Object.pas
  32. 1 0
      CryptoLib/src/Asn1/ClpAsn1StreamParser.pas
  33. 8 0
      CryptoLib/src/Asn1/ClpBerTaggedObjectParser.pas
  34. 4 3
      CryptoLib/src/Asn1/ClpDerGeneralString.pas
  35. 3 2
      CryptoLib/src/Asn1/ClpDerGraphicString.pas
  36. 4 3
      CryptoLib/src/Asn1/ClpDerIA5String.pas
  37. 4 3
      CryptoLib/src/Asn1/ClpDerNumericString.pas
  38. 4 3
      CryptoLib/src/Asn1/ClpDerPrintableString.pas
  39. 4 3
      CryptoLib/src/Asn1/ClpDerT61String.pas
  40. 4 10
      CryptoLib/src/Asn1/ClpDerUtf8String.pas
  41. 3 2
      CryptoLib/src/Asn1/ClpDerVideotexString.pas
  42. 4 3
      CryptoLib/src/Asn1/ClpDerVisibleString.pas
  43. 1 1
      CryptoLib/src/Crypto/Engines/ClpIESEngine.pas
  44. 0 2
      CryptoLib/src/Interfaces/ClpIDerUtf8String.pas
  45. 7 7
      CryptoLib/src/Utils/ClpArrayUtils.pas
  46. 30 8
      CryptoLib/src/Utils/ClpConverters.pas
  47. 2 1
      CryptoLib/src/Utils/ClpCryptoLibTypes.pas
  48. 32 2
      README.md

+ 12 - 10
CryptoLib.Samples/src/UsageExamples.pas

@@ -83,7 +83,8 @@ uses
   ClpArrayUtils,
   ClpArrayUtils,
   ClpHex,
   ClpHex,
   // ClpSecNamedCurves,
   // ClpSecNamedCurves,
-  ClpCustomNamedCurves;
+  ClpCustomNamedCurves,
+  ClpConverters;
 
 
 type
 type
   TUsageExamples = class sealed(TObject)
   TUsageExamples = class sealed(TObject)
@@ -243,7 +244,8 @@ begin
   // First read the magic text and the salt - if any
   // First read the magic text and the salt - if any
   Chopped := System.Copy(CipherText, 0, SALT_MAGIC_LEN);
   Chopped := System.Copy(CipherText, 0, SALT_MAGIC_LEN);
   if (System.Length(CipherText) >= SALT_MAGIC_LEN) and
   if (System.Length(CipherText) >= SALT_MAGIC_LEN) and
-    (TArrayUtils.AreEqual(Chopped, TEncoding.UTF8.GetBytes(SALT_MAGIC))) then
+    (TArrayUtils.AreEqual(Chopped, TConverters.ConvertStringToBytes(SALT_MAGIC,
+    TEncoding.UTF8))) then
   begin
   begin
     System.Move(CipherText[SALT_MAGIC_LEN], SaltBytes[0], SALT_SIZE);
     System.Move(CipherText[SALT_MAGIC_LEN], SaltBytes[0], SALT_SIZE);
     If not EVP_GetKeyIV(PasswordBytes, SaltBytes, KeyBytes, IVBytes) then
     If not EVP_GetKeyIV(PasswordBytes, SaltBytes, KeyBytes, IVBytes) then
@@ -306,8 +308,8 @@ begin
 
 
   LBufStart := 0;
   LBufStart := 0;
 
 
-  System.Move(TEncoding.UTF8.GetBytes(SALT_MAGIC)[0], Buf[LBufStart],
-    SALT_MAGIC_LEN * System.SizeOf(Byte));
+  System.Move(TConverters.ConvertStringToBytes(SALT_MAGIC, TEncoding.UTF8)[0],
+    Buf[LBufStart], SALT_MAGIC_LEN * System.SizeOf(Byte));
   System.Inc(LBufStart, SALT_MAGIC_LEN);
   System.Inc(LBufStart, SALT_MAGIC_LEN);
   System.Move(SaltBytes[0], Buf[LBufStart],
   System.Move(SaltBytes[0], Buf[LBufStart],
     PKCS5_SALT_LEN * System.SizeOf(Byte));
     PKCS5_SALT_LEN * System.SizeOf(Byte));
@@ -330,8 +332,8 @@ var
   PlainText, PasswordBytes, CipherText, DecryptedCipherText: TBytes;
   PlainText, PasswordBytes, CipherText, DecryptedCipherText: TBytes;
 begin
 begin
 
 
-  PlainText := TEncoding.UTF8.GetBytes(inputmessage);
-  PasswordBytes := TEncoding.UTF8.GetBytes(password);
+  PlainText := TConverters.ConvertStringToBytes(inputmessage, TEncoding.UTF8);
+  PasswordBytes := TConverters.ConvertStringToBytes(password, TEncoding.UTF8);
   CipherText := TUsageExamples.AES256CBCPascalCoinEncrypt(PlainText,
   CipherText := TUsageExamples.AES256CBCPascalCoinEncrypt(PlainText,
     PasswordBytes);
     PasswordBytes);
 
 
@@ -472,8 +474,8 @@ begin
     Writeln('ECIES PascalCoin Existing Payload Compatability Decrypt Was Successful '
     Writeln('ECIES PascalCoin Existing Payload Compatability Decrypt Was Successful '
       + sLineBreak);
       + sLineBreak);
 
 
-    Writeln('Decrypted Payload Message Is "' + TEncoding.UTF8.GetString
-      (DecryptedCipherText) + '"');
+    Writeln('Decrypted Payload Message Is "' + TConverters.ConvertBytesToString
+      (DecryptedCipherText, TEncoding.UTF8) + '"');
     Exit;
     Exit;
 
 
   end;
   end;
@@ -490,7 +492,7 @@ var
   KeyPair: IAsymmetricCipherKeyPair;
   KeyPair: IAsymmetricCipherKeyPair;
 begin
 begin
   KeyPair := GetECKeyPair;
   KeyPair := GetECKeyPair;
-  PlainText := TEncoding.UTF8.GetBytes(input);
+  PlainText := TConverters.ConvertStringToBytes(input, TEncoding.UTF8);
   CipherText := TUsageExamples.ECIESPascalCoinEncrypt(KeyPair.Public,
   CipherText := TUsageExamples.ECIESPascalCoinEncrypt(KeyPair.Public,
     PlainText);
     PlainText);
 
 
@@ -544,7 +546,7 @@ begin
 
 
   Writeln('Signer Name is: ' + Signer.AlgorithmName + sLineBreak);
   Writeln('Signer Name is: ' + Signer.AlgorithmName + sLineBreak);
 
 
-  &message := TEncoding.UTF8.GetBytes(TextToSign);
+  &message := TConverters.ConvertStringToBytes(TextToSign, TEncoding.UTF8);
 
 
   // Sign
   // Sign
   Signer.Init(True, PrivateKey);
   Signer.Init(True, PrivateKey);

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

@@ -508,7 +508,12 @@ uses
   ClpSecP256R1Point in '..\..\CryptoLib\src\Math\EC\Custom\Sec\ClpSecP256R1Point.pas',
   ClpSecP256R1Point in '..\..\CryptoLib\src\Math\EC\Custom\Sec\ClpSecP256R1Point.pas',
   ClpISecP256R1Curve in '..\..\CryptoLib\src\Interfaces\ClpISecP256R1Curve.pas',
   ClpISecP256R1Curve in '..\..\CryptoLib\src\Interfaces\ClpISecP256R1Curve.pas',
   ClpSecP256R1Curve in '..\..\CryptoLib\src\Math\EC\Custom\Sec\ClpSecP256R1Curve.pas',
   ClpSecP256R1Curve in '..\..\CryptoLib\src\Math\EC\Custom\Sec\ClpSecP256R1Curve.pas',
-  SecP256R1FieldTests in '..\src\Math\EC\Custom\Sec\SecP256R1FieldTests.pas';
+  SecP256R1FieldTests in '..\src\Math\EC\Custom\Sec\SecP256R1FieldTests.pas',
+  TagTests in '..\src\Asn1\TagTests.pas',
+  StringTests in '..\src\Asn1\StringTests.pas',
+  ParsingTests in '..\src\Asn1\ParsingTests.pas',
+  ParseTests in '..\src\Asn1\ParseTests.pas',
+  EnumeratedTests in '..\src\Asn1\EnumeratedTests.pas';
 
 
 begin
 begin
 
 

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

@@ -36,7 +36,7 @@
         <PackageName Value="FCL"/>
         <PackageName Value="FCL"/>
       </Item4>
       </Item4>
     </RequiredPackages>
     </RequiredPackages>
-    <Units Count="42">
+    <Units Count="47">
       <Unit0>
       <Unit0>
         <Filename Value="CryptoLib.lpr"/>
         <Filename Value="CryptoLib.lpr"/>
         <IsPartOfProject Value="True"/>
         <IsPartOfProject Value="True"/>
@@ -206,6 +206,26 @@
         <Filename Value="..\src\Math\EC\Custom\Sec\SecP256R1FieldTests.pas"/>
         <Filename Value="..\src\Math\EC\Custom\Sec\SecP256R1FieldTests.pas"/>
         <IsPartOfProject Value="True"/>
         <IsPartOfProject Value="True"/>
       </Unit41>
       </Unit41>
+      <Unit42>
+        <Filename Value="..\src\Asn1\EnumeratedTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit42>
+      <Unit43>
+        <Filename Value="..\src\Asn1\ParseTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit43>
+      <Unit44>
+        <Filename Value="..\src\Asn1\ParsingTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit44>
+      <Unit45>
+        <Filename Value="..\src\Asn1\StringTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit45>
+      <Unit46>
+        <Filename Value="..\src\Asn1\TagTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit46>
     </Units>
     </Units>
   </ProjectOptions>
   </ProjectOptions>
   <CompilerOptions>
   <CompilerOptions>

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

@@ -10,6 +10,11 @@ uses
   DerApplicationSpecificTests,
   DerApplicationSpecificTests,
   EqualsAndHashCodeTests,
   EqualsAndHashCodeTests,
   OIDTests,
   OIDTests,
+  EnumeratedTests,
+  ParsingTests,
+  ParseTests,
+  StringTests,
+  TagTests,
   BigIntegerTests,
   BigIntegerTests,
   ECAlgorithmsTests,
   ECAlgorithmsTests,
   ECPointTests,
   ECPointTests,

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

@@ -17,6 +17,9 @@
       <Version Value="2"/>
       <Version Value="2"/>
     </PublishOptions>
     </PublishOptions>
     <RunParams>
     <RunParams>
+      <local>
+        <CommandLineParams Value="--format=plain --all --progress"/>
+      </local>
       <FormatVersion Value="2"/>
       <FormatVersion Value="2"/>
       <Modes Count="1">
       <Modes Count="1">
         <Mode0 Name="default">
         <Mode0 Name="default">
@@ -34,7 +37,7 @@
         <PackageName Value="FCL"/>
         <PackageName Value="FCL"/>
       </Item2>
       </Item2>
     </RequiredPackages>
     </RequiredPackages>
-    <Units Count="42">
+    <Units Count="47">
       <Unit0>
       <Unit0>
         <Filename Value="CryptoLibConsole.lpr"/>
         <Filename Value="CryptoLibConsole.lpr"/>
         <IsPartOfProject Value="True"/>
         <IsPartOfProject Value="True"/>
@@ -203,6 +206,26 @@
         <Filename Value="..\src\Math\EC\Custom\Sec\SecP256R1FieldTests.pas"/>
         <Filename Value="..\src\Math\EC\Custom\Sec\SecP256R1FieldTests.pas"/>
         <IsPartOfProject Value="True"/>
         <IsPartOfProject Value="True"/>
       </Unit41>
       </Unit41>
+      <Unit42>
+        <Filename Value="..\src\Asn1\EnumeratedTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit42>
+      <Unit43>
+        <Filename Value="..\src\Asn1\ParseTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit43>
+      <Unit44>
+        <Filename Value="..\src\Asn1\ParsingTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit44>
+      <Unit45>
+        <Filename Value="..\src\Asn1\StringTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit45>
+      <Unit46>
+        <Filename Value="..\src\Asn1\TagTests.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit46>
     </Units>
     </Units>
   </ProjectOptions>
   </ProjectOptions>
   <CompilerOptions>
   <CompilerOptions>

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

@@ -8,6 +8,11 @@ uses
   DerApplicationSpecificTests,
   DerApplicationSpecificTests,
   EqualsAndHashCodeTests,
   EqualsAndHashCodeTests,
   OIDTests,
   OIDTests,
+  EnumeratedTests,
+  ParsingTests,
+  ParseTests,
+  StringTests,
+  TagTests,
   BigIntegerTests,
   BigIntegerTests,
   ECAlgorithmsTests,
   ECAlgorithmsTests,
   ECPointTests,
   ECPointTests,

+ 1 - 3
CryptoLib.Tests/src/Asn1/DerApplicationSpecificTests.pas

@@ -60,12 +60,11 @@ type
   var
   var
     FimpData, FcertData, FsampleData: TCryptoLibByteArray;
     FimpData, FcertData, FsampleData: TCryptoLibByteArray;
 
 
-    procedure TestTaggedObject();
-
   protected
   protected
     procedure SetUp; override;
     procedure SetUp; override;
     procedure TearDown; override;
     procedure TearDown; override;
   published
   published
+    procedure TestTaggedObject();
     procedure TestDerApplicationSpecific;
     procedure TestDerApplicationSpecific;
 
 
   end;
   end;
@@ -110,7 +109,6 @@ var
   appSpec, tagged, certObj: IDerApplicationSpecific;
   appSpec, tagged, certObj: IDerApplicationSpecific;
   recVal, val: IDerInteger;
   recVal, val: IDerInteger;
 begin
 begin
-  TestTaggedObject();
 
 
   appSpec := TAsn1Object.FromByteArray(FsampleData) as IDerApplicationSpecific;
   appSpec := TAsn1Object.FromByteArray(FsampleData) as IDerApplicationSpecific;
 
 

+ 202 - 0
CryptoLib.Tests/src/Asn1/EnumeratedTests.pas

@@ -0,0 +1,202 @@
+{ *********************************************************************************** }
+{ *                              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 EnumeratedTests;
+
+interface
+
+{$IFDEF FPC}
+{$MODE DELPHI}
+{$ENDIF FPC}
+
+uses
+  SysUtils,
+{$IFDEF FPC}
+  fpcunit,
+  testregistry,
+{$ELSE}
+  TestFramework,
+{$ENDIF FPC}
+  ClpIProxiedInterface,
+  ClpAsn1Object,
+  ClpIDerSequence,
+  ClpIDerEnumerated,
+  ClpIDerBoolean,
+  ClpIDerObjectIdentifier,
+  ClpHex;
+
+type
+
+  TCryptoLibTestCase = class abstract(TTestCase)
+
+  end;
+
+type
+
+  /// <summary>
+  /// Tests used to verify correct decoding of the ENUMERATED type.
+  /// </summary>
+  TTestEnumerated = class(TCryptoLibTestCase)
+  var
+  private
+    FMultipleSingleByteItems, FMultipleDoubleByteItems,
+      FMultipleTripleByteItems: TBytes;
+
+  protected
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+    /// <summary>
+    /// Makes sure multiple identically sized values are parsed correctly.
+    /// </summary>
+    procedure TestReadingMultipleSingleByteItems;
+    /// <summary>
+    /// Makes sure multiple identically sized values are parsed correctly.
+    /// </summary>
+    procedure TestReadingMultipleDoubleByteItems;
+    /// <summary>
+    /// Makes sure multiple identically sized values are parsed correctly.
+    /// </summary>
+    procedure TestReadingMultipleTripleByteItems;
+
+  end;
+
+implementation
+
+{ TTestEnumerated }
+
+procedure TTestEnumerated.SetUp;
+begin
+  inherited;
+  /// <summary>
+  /// Test vector used to test decoding of multiple items.
+  /// </summary>
+  /// <remarks>This sample uses an ENUMERATED and a BOOLEAN.</remarks>
+  FMultipleSingleByteItems := THex.Decode('30060a01010101ff');
+  /// <summary>
+  /// Test vector used to test decoding of multiple items.
+  /// </summary>
+  /// <remarks>This sample uses two ENUMERATEDs.</remarks>
+  FMultipleDoubleByteItems := THex.Decode('30080a0201010a020202');
+  /// <summary>
+  /// Test vector used to test decoding of multiple items.
+  /// </summary>
+  /// <remarks>This sample uses an ENUMERATED and an OBJECT IDENTIFIER.</remarks>
+  FMultipleTripleByteItems := THex.Decode('300a0a0301010106032b0601');
+end;
+
+procedure TTestEnumerated.TearDown;
+begin
+  inherited;
+
+end;
+
+procedure TTestEnumerated.TestReadingMultipleSingleByteItems;
+var
+  obj: IAsn1Object;
+  sequence: IDerSequence;
+  enumerated: IDerEnumerated;
+  boolean: IDerBoolean;
+begin
+  obj := TAsn1Object.FromByteArray(FMultipleSingleByteItems);
+
+  CheckTrue(Supports(obj, IDerSequence), 'Null ASN.1 SEQUENCE');
+
+  sequence := obj as IDerSequence;
+
+  CheckEquals(2, sequence.Count, '2 items expected');
+
+  enumerated := sequence[0] as IDerEnumerated;
+
+  CheckNotNull(enumerated, 'ENUMERATED expected');
+
+  CheckEquals(1, enumerated.Value.Int32Value, 'Unexpected ENUMERATED value');
+
+  boolean := sequence[1] as IDerBoolean;
+
+  CheckNotNull(boolean, 'BOOLEAN expected');
+
+  CheckTrue(boolean.IsTrue, 'Unexpected BOOLEAN value');
+end;
+
+procedure TTestEnumerated.TestReadingMultipleDoubleByteItems;
+var
+  obj: IAsn1Object;
+  sequence: IDerSequence;
+  enumerated, enumerated2: IDerEnumerated;
+begin
+  obj := TAsn1Object.FromByteArray(FMultipleDoubleByteItems);
+
+  CheckTrue(Supports(obj, IDerSequence), 'Null ASN.1 SEQUENCE');
+
+  sequence := obj as IDerSequence;
+
+  CheckEquals(2, sequence.Count, '2 items expected');
+
+  enumerated := sequence[0] as IDerEnumerated;
+
+  CheckNotNull(enumerated, 'ENUMERATED expected');
+
+  CheckEquals(257, enumerated.Value.Int32Value, 'Unexpected ENUMERATED value');
+
+  enumerated2 := sequence[1] as IDerEnumerated;
+
+  CheckNotNull(enumerated2, 'ENUMERATED expected');
+
+  CheckEquals(514, enumerated2.Value.Int32Value, 'Unexpected ENUMERATED value');
+end;
+
+procedure TTestEnumerated.TestReadingMultipleTripleByteItems;
+var
+  obj: IAsn1Object;
+  sequence: IDerSequence;
+  enumerated: IDerEnumerated;
+  objectId: IDerObjectIdentifier;
+begin
+  obj := TAsn1Object.FromByteArray(FMultipleTripleByteItems);
+
+  CheckTrue(Supports(obj, IDerSequence), 'Null ASN.1 SEQUENCE');
+
+  sequence := obj as IDerSequence;
+
+  CheckEquals(2, sequence.Count, '2 items expected');
+
+  enumerated := sequence[0] as IDerEnumerated;
+
+  CheckNotNull(enumerated, 'ENUMERATED expected');
+
+  CheckEquals(65793, enumerated.Value.Int32Value,
+    'Unexpected ENUMERATED value');
+
+  objectId := sequence[1] as IDerObjectIdentifier;
+
+  CheckNotNull(objectId, 'OBJECT IDENTIFIER expected');
+
+  CheckEquals('1.3.6.1', objectId.Id, 'Unexpected OBJECT IDENTIFIER value');
+end;
+
+initialization
+
+// Register any test cases with the test runner
+
+{$IFDEF FPC}
+  RegisterTest(TTestEnumerated);
+{$ELSE}
+  RegisterTest(TTestEnumerated.Suite);
+{$ENDIF FPC}
+
+end.

+ 3 - 1
CryptoLib.Tests/src/Asn1/EqualsAndHashCodeTests.pas

@@ -34,6 +34,7 @@ uses
 {$ENDIF FPC}
 {$ENDIF FPC}
   ClpHex,
   ClpHex,
   ClpCryptoLibTypes,
   ClpCryptoLibTypes,
+  ClpConverters,
   ClpIProxiedInterface,
   ClpIProxiedInterface,
   ClpBerOctetString,
   ClpBerOctetString,
   ClpBerSequence,
   ClpBerSequence,
@@ -118,7 +119,8 @@ begin
     TDerUtf8String.Create('hello world'),
     TDerUtf8String.Create('hello world'),
     TDerVisibleString.Create('hello world'),
     TDerVisibleString.Create('hello world'),
     TDerGraphicString.Create(THex.Decode('deadbeef')),
     TDerGraphicString.Create(THex.Decode('deadbeef')),
-    TDerVideotexString.Create(TEncoding.ASCII.GetBytes('Hello World')),
+    TDerVideotexString.Create(TConverters.ConvertStringToBytes('Hello World',
+    TEncoding.ANSI)),
 
 
     TBerTaggedObject.Create(0, TDerPrintableString.Create('hello world')
     TBerTaggedObject.Create(0, TDerPrintableString.Create('hello world')
     as IDerPrintableString),
     as IDerPrintableString),

+ 96 - 0
CryptoLib.Tests/src/Asn1/ParseTests.pas

@@ -0,0 +1,96 @@
+{ *********************************************************************************** }
+{ *                              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 ParseTests;
+
+interface
+
+{$IFDEF FPC}
+{$MODE DELPHI}
+{$ENDIF FPC}
+
+uses
+  SysUtils,
+{$IFDEF FPC}
+  fpcunit,
+  testregistry,
+{$ELSE}
+  TestFramework,
+{$ENDIF FPC}
+  ClpAsn1StreamParser,
+  ClpIAsn1StreamParser,
+  ClpIAsn1TaggedObjectParser,
+  ClpHex;
+
+type
+
+  TCryptoLibTestCase = class abstract(TTestCase)
+
+  end;
+
+type
+  TTestParse = class(TCryptoLibTestCase)
+  var
+  private
+    FlongTagged: TBytes;
+
+  protected
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+    procedure TestParse;
+
+  end;
+
+implementation
+
+{ TTestParse }
+
+procedure TTestParse.SetUp;
+begin
+  inherited;
+  FlongTagged := THex.Decode('9f1f023330');
+end;
+
+procedure TTestParse.TearDown;
+begin
+  inherited;
+
+end;
+
+procedure TTestParse.TestParse;
+var
+  aIn: IAsn1StreamParser;
+  tagged: IAsn1TaggedObjectParser;
+begin
+  aIn := TAsn1StreamParser.Create(FlongTagged);
+  tagged := aIn.ReadObject() as IAsn1TaggedObjectParser;
+
+  CheckEquals(31, tagged.TagNo);
+end;
+
+initialization
+
+// Register any test cases with the test runner
+
+{$IFDEF FPC}
+  RegisterTest(TTestParse);
+{$ELSE}
+  RegisterTest(TTestParse.Suite);
+{$ENDIF FPC}
+
+end.

+ 189 - 0
CryptoLib.Tests/src/Asn1/ParsingTests.pas

@@ -0,0 +1,189 @@
+{ *********************************************************************************** }
+{ *                              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 ParsingTests;
+
+interface
+
+{$IFDEF FPC}
+{$MODE DELPHI}
+{$ENDIF FPC}
+
+uses
+  SysUtils,
+{$IFDEF FPC}
+  fpcunit,
+  testregistry,
+{$ELSE}
+  TestFramework,
+{$ENDIF FPC}
+  ClpAsn1StreamParser,
+  ClpIAsn1StreamParser,
+  ClpAsn1InputStream,
+  ClpBase64,
+  ClpCryptoLibTypes;
+
+type
+
+  TCryptoLibTestCase = class abstract(TTestCase)
+
+  end;
+
+type
+  TTestParsing = class(TCryptoLibTestCase)
+  var
+  private
+    FStreams: TCryptoLibStringArray;
+
+  protected
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+    procedure TestParsing;
+    procedure TestInputStream;
+
+  end;
+
+implementation
+
+{ TTestParsing }
+
+procedure TTestParsing.SetUp;
+begin
+  inherited;
+      FStreams := TCryptoLibStringArray.Create(
+			'oRNphCO0F+jcMQKC1uMO8qFBPikDDYmtfVGeB45xvbfj1qu696YGjdW2igRnePYM/KkQtADG7gMHIhqBRcl7dBtkejNeolOklPNA3NgsACTiVN9JFUsYq0a5842+TU+U2/' + '6Kt/D0kvz0WmwWFRPHWEWVM9PYOWabGsh28Iucc6s7eEqmr8NEzWUx/jM3dmjpFYVpSpxt2KbbT+yUO0EqFQyy8hQ7JvKRgv1AoWQfPjMsfjkKgxnA8DjenmwXaZnDaKEvQIKQl46L1Yyu3boN082SQliSJMJVgNuNNLFIt5QSUdG1ant5O6f9Yr0niAkAoqGzmqz+LZE1S7RrGHWiQ3DowE9' + 'NzviBuaAoI4WdCn1ClMwb9fdEmBMU4C7DJSgs3qaJzPUuaAT9vU3GhZqZ0wcTV5DHxSRzGLqg9JEJRi4qyeuG3Qkg3YBtathl+FiLJ7mVoO3dFIccRuuqp2MpMhfuP1DxHLNLNiUZEhLMQ0CLTGabUISBuyQudVFlKBZIpcLD0k7fKpMPuywrYiDrTinMc2ZP3fOGevoR5fnZ6kZAE5oMTtMNokzBuctGqVapblXNrVMLYbriT538oYz5',
+			'KEKVhHxtyUR9D3v5K4IJbVQLAMiVKoK9z7wFWUjzvLFNLg9C/r8zKfBa3YgZrt0Nq64+MxBePMbiNLCnfditc2qUcQZUHnvNnhwT6uGK37JmXg7MvQiKwvi31EIYt6ghqB' + 'ZVs1iaqc0ep7wuQ16uwSQMlaDdXc9Qf1L0dGO/6eLyREz+p4UR4NOXK+GooQLfMxYL40zJlYcwNyR0rigvIr84WP2IMS2hZjqXtyS6HMM4yUv70hkIorjr7+JC4GtU1MyWuPuNSAGen0AZTaEEXd5sMbqXMqWg3jeM4mzRH1Kb3WdAChO5vMJZPBj9jZZKgXzmxkUh5GlIhUdYgztoNceBzQ3' + 'PIc7slCDUw9I2PjB87xsfy7jA5tFtFADs2EUyxUTMCuhilP664jSHgwbrr80k9Xc4sU+MCwCq2nQmcZYcPgKb4M31VJMlKwnZF3JUU2Jtqgg4gbErw58YoBwSkEcMJ2Juhiyx9U36MzxHs9OcTURfpsilMy+mDL8arCDx1knM1KkAHCLjWuJI+p1PvuIypgCwVc+MtGfd7wW8iR1JPJLBiuoZyNJ+xx9htd/HVB+rLtB57H8Gz8W+R00f',
+			'Ol9I/rXMwbLpxTY97v70B+HCl2+cojz2574x/cC56A7KGVF13La8RdzOOvSkl338ct9T/blEFa6QwNz3GmF+MoPdH9lncwz+tqixIqGU02Bp5swH0qjbp/Yjaeq91eR6B+' + '9fl+KKrpglBr8S1BrI4Ey5v3AxxJdCWP8Gd+6Sp15/HMYanwlHBpCsW4+Kq8sGJoJXUXpQ/GBUJKs+WjX1zE6PsvF7/B8cByuqE3NJt7x4Oa+qZtF8qNc0CFDNj31Yhdt7JkAoD30IAd+ue9OhImQMCWwFwySRIRJXU3865K2dBR+VhLuI2aKzLh7MlgVKJk6b2P/ZIkc86ksR1sOUiHrs9EdoYuIs' + 'sAgMc8QGzn4VN8lxopdzQYVG6pbXGS/VQlHkGdyLd+OHt4srz/NTUWiOquVTRxa6GgtlBFfIXikPTb+iT2pZKyKUlBvpgo0BY9vVUadsteHAI5qrFZBrL5ecK/Qtl9hf/M8qEjyjt2aCXe9B96Hg2QR5A53qW2PJW5VzS0AeB3g+zJSPCTpygrBs20q5Xrna0ux2l17r6HT9Q/AXIOkwPZUXXn0d02igS4D6Hxrg3Fhdp+OTXL8G',
+			'o3eXWpwAGmUkxHEKm/pGkDb1ZQQctCQ06lltZjeMXDp9AkowmA0KXjPQCQwyWE/nqEvk2g/58AxNU0TWSujo5uU0h4/hdMZ7Mrj33NSskWvDpKe7lE5tUjPi74Rmc5RRS+' + '1T/EQobpNxoic3+tTO7NBbZfJtcUYeZ3jqxL+3YQL3PrGe/Zpno9TnQW8mWbbhKhDRtKY4p3Pgk9hPSpJCM9xYo3EMAOAIiH2P6RKH6uX/gSaUY2b6DE/TT0V6v/jdSmYM4+cnYiTyJCi5txI35jfCqIlVCXJd7klirvUMg9SXBhGR25AgQ5Z8yjd7lbB8FvD8JQAXZrp6xiHxbLIW7G11fWEo7RGL' + 'FtALI6H38Ud0vKjsEN7N5AibJcxS2A/CWk9R00sTHRBHFUP8o5mz8nE7FeCiwJPs/+tCt04nGb9wxBFMsmWcPEDfIzphCaO6U/D/tQHlA846gbKoikv/6LI0ussSR/i85XBclNcvzTctxylSbCR02lZ+go6fe5rmMouiel/0Tndz8t1YpQGilVeOQ3mqAFyAJk3dgfTNKZuOhNzVIZ5GWScKQ5ZtNcWrg6siR+6YwKvLiRb/TJZk',
+			'PwRUnW4yU8PI7ggbI1BIO9fcTup8optkqCirodyHCiqsPOMZ4g28bJ2+kpfQRujWGlKFYQzA1ZT32s9hdci+fvXPX0KAjcUgcxsGzMABFbEm04BwDF2WLgg9s4/x71r5Jr' + 'gME1S08I3mCo4N0eFHWDeLJL1b5YNNo6tfO5V2WpIE867N9zdAgvp1gijVjUNWqEB3A/NLb3reLMu2hYgqRFTCVBfcFclD46k0XEfUJqwWdQhOz92WNl/3g53bjKX1hDZgjLIzK6m+SU6+J/h4NidrS7E0gOBevZW8gRYdKMVqNWxzUfxv6kgG+kIeF9JqMcO6jdh/Zu/0tpZoHFeCweZ1jT1eEtlt' + 'Fu1FcTTPc1UT0pT+ZNVgefrBONoGnvn8+dBjPese6F2TmRCExJq9taKlIh/kHdkbpaa7vwrBpYRgVGfARPyM9SSCaE7pVBDuwkFeYiGU4tamm5Gq10ojRQgetJ3UOg/PGTJcxo97GBiG5zAST9NdHdgK3eI4FAbWpGwmWxNpPWOst0a7zuGKAzYU+1IQh8XA3IgJ2vy3+w0JihU6G+12LUzsL2aQtpG7d1PqLhwOqHq3Qqv3SDsB',
+			'ZIAKizvGzbvqvqOlxOeVgHGHV9TfKNjjqyzbCj8tggv2yp7kkq1D3yRlC349tuul3zN9g4u83Ctio9Gg3HiLzMULxoOImF/hKRDhJpPLbLm0jSq1fyF+N7/YvyLeFhGoPh' + 'YEBUihDcxo1NIcWy66aBt3EuOlTyDQWrDe0Za3mrTrrl10uLHVKcQMgeD+UMgjQqmHzQJR8wdNjHPKHWVvZEdiwI031nV2giHJHXv08Jvf4vmw4dAlH2drCl6cBgg33jy7ohK8IiXz6eCw6iY9Ri8YaMzxOhgE2BOHzEz5ZC2hilL4xO/ambTER4bhb4+9VTUIehHP18FcXm8TKPQRMqyKP2fMlzWW' + '3/uelYfPP5SHlyLAULa1KjDCkLIDunEKZDpv2ljGB6JPrTlNwFsvlZcihfOAwjbr2jW3MwP704OA8xzd/dynBU47unIZEu0LAvQ3TUz3PLga0GGO1LZGtg0Foo9zFG2wuVCdgYHmozOQ+8I3gRguW1CjGy7ZCTBuN1GZ510ERhae+bRQtldHsLeiHTghnkU1xEX1+W0iEf3csDYrgpuq3NaBYRGirovDiPBYFHmru0AMclhFnpcX',
+			'uG0wQ55kMlfZtJFAqTl0bnYW/oy9NFOi0e4FqAYwsvMxGO4JtGzXgkVwEUAC0AUDItRUjxBl+TkoPTYaprgn0M/NQvKPpXJ+yzI7Ssi+F2alLR0T6eF/4rQ32AVjnANJag' + 'hXZm0ZKduckbhSxk5lilJVJRuzXKchZRtlPluvlj448bq+iThktsEQoNP8NMpi7n/EVxovp+dow4Q6t7msSRP4cGXtyYoWKbf/7e5XzBKOZZ1/f3s86uJke4dcKIaljpJfBrtuFxZC6NYXzX6PkoDoBgqQ8RBrxsX54S9cBDAPxxmkq8zviAOW3oqPMULGGmQzHBiRwE8oeDFoMnzF5aR/lkbNuTLO' + 'xhbIkosgLWlDNVEFYx9bVhdLzO7VwaAK829dimlPOo5loKB7Pd2G7ekRKXwu7wNvJBq8KRkhtLKbKoS8D6TaRWUMb9VBJ1CMy4mrw+YwTmAKURQ6Dko9J/RgzRg5Y/sUlwdMYS9HOnvKiTVu5I/ha35wwkhIPVm+FCn05tstntZaXXXu4xExHeugAKNBhkcc/SQt+GFdxXDd+R4C2LfKxGDSyZKVTFYojHTdZUo8Gx6SZLY6b2SZ',
+			'sH0kIwIq1THAfTLfqUKJfG1YauCQKPc9/mk3l39yK6zgxSpCH2IjZIwhhJtGm3F+8PTneT725OuyR617nxqrgqMGkkZkyY4DA5CjsikpBo5mo8TspX1g+vtXXtxymJMTMo' + '8JwX3nSH4gSb3vPia+gwOW2TcJmxVdp3ITPA4gJpMfqoMBqRM+eDWO6QXW5ijVL4+wnp40u5bU4fQLVzpg25+QGLqBHD6PZTQaN6F9Vy5XpsAGDlncCklVuX3Lkp3Xb9cTiNa/4ii04uwZqx0juszjwFAMPPb6u56crvN1x4FXfXzabWECHbdQLlKazowvU9bEnqG2i4H44Ae+v8Iw8HK5mbZ6ercL' + 'TD9oPgs7Ogal037l2WwLApUz/fmD5fV8SxHh+vKDpfOzv6xcQxynS82jAJw9AdUwE/4ndGzzHPIu2M81gbAgZQ02EurMMU62hYgiXeridrtyh+H5R+CiwQdEyX7/op6WVihsYj2O3O/1hgjhGQRFD6sGwnko50jgWRxaMMfJGNlyGoT8WT5k931jU7547u7Ovr7XP/t8r3G7ceCiCcYjQgdwXdvIStzPvvV7Yy02isZjiJF8TLJQ',
+			'tycxf1mOz1yLE6cT/ZlCxMeTxlEEHFeIdw0+nF/40Tsw4vLco+4kR2A6cVml611CSpN6l/RMKk2LnAkprrbJ/Uam902WBnQ+I6Vsl6GkFFq7362bdixojqMFVKYytXLCT8' + 'I78f6s8M6a3jSALQloD6Ftvn+cc+cctO3weaaaPgAlrz+f2MFs8bqpnLQYbbY/JS9IAYJFH+yVtLz7eKcedEp9JMlJ3/43szU2fDN9ZMxBoQnxEmF3WZv6GF0WRc8VhTblXRgk4mlz6Fu3IXvwW/rbn+VCYYIk/XaVLrxFAnnw6mBozAF7vmV0OrIYBlSDU8rMb+F7AvE7pwErO9TJtCE8IUvQf8Ts' + 'JYRoYv21/X57pzcBedtqVeU3DnTlmESHxG6H1uJbadSFLWSxKS4svfp8T9FWqX5815yD/UplAKEIeorLTAlPIC2ASKDU6SQW260biNAfY8FYQCWa8btaTwFuY8NMwSHzyqgU0aoPKnagi/4hOIWNO5rZ8Xcnzx+ELtEl33hQnzc4OUlT5eeVYQWkz2IWVQ6Re4JWF3L4OXzNZWgefKGMzZU6IHoBeCgfi+popLRJpaOx0dcvwGjk',
+			'oDsoFvUA+sGOoMyZY6w1UhY3NBkeoozzjEkDSRN1golyXJ1dC5CtYNEjvAJYKj+sqNwg9mBlYyybYpnI3GSP125zMeBHPCoy5CoNOkJW4OH/oLyjVeQbFNic/b2Jcz6lTg' + 'uYhep8hq9EM2XuFV8T1rm5+4ucI7fH1UiOqRZyuHBAJ0Cna5kv6D3efsa9rd+swybiMIUjmPWpyxzNOOihCYuf4JqRh/D5eZKm6x0Zj2uRhTAYYxI7Q3czd0R9490ufG8VbF8ASBMireMONNNAA/OZCpxJh6xnIANBqV6YDeysws3NBWY2QuNumvg5Kr3/g+VMzJHi4wGuJjraKWi9+ylMfelHF5h/' + 'h+pAQVxCotq8JU3OTnMUW4rQp2a8BR5S+mZqPSPlb87tDG9r0+yqb1uO4UIo71C7Xxwoq4M0tXjk6mSmtP/sm+Lh14qfUzKRhTHVdz91TK104mbTJNXbK+jGPD/2BJO9fiaXY8IYanpfDLBfJo06VYbm6HehRZTwnDHnN50j7ki4aMS3COZvffjRInXD8dS5h9zmtKNpoqg//lPg4gpS+4Th2sJ3SGtBV0Ne89r7AfZMAVa26PMK',
+			'MIDLuZTrtZnEBOB6l14iSEyokAg5Wf5JviumhfPeL7WSFTHfOodU2hrvhyvM6oAlRHY1blTj7mw+Tcf9Tmc+/FHT6PGu0NT5UAqaqChX0gS9jizgAE2Yfhd4X/DoeQySMA' + 'ixKuhu8TbvDxb54jeW9+7LVkmlntJ/0SkMgsT+WQ31OfpwDmEGDczYc+Ol14aJS+EW+rnGv9d38bo/cy+EnpNh8iV2rGGoC8fDzFHKU4gqGFSZF/tnD2OfCne0Vjr/GD6kyp2MVcHig19DBg2toGRkHnuY5kLkwOanztXA80IaAmv8e6s62U8CE8ozUZeDBcvBigEkSGx79Vsyiks8+9Kq9xLHLeS5' + 'kRT6zSl8whe8U1fIfrgic34KPlozcQVahwCru1XWyQ+9uevih8x4zMftkJ3JBZhPrnlgtx9McntH/Ss9fdUEkNwWpDnq8Xby8/5gMMMwQ13XDB73vqqteDiltMq8i7LRez4iIHfSBBfIkZIzMZAblQXaSm029iBcAAUes7wcGHUl7KOpRy18jNtI3+h7e1Ri6sT2vJYQaove0nzZ5xAjpBKnbJX+lpGVlI00fC2YSTfyNqFA0jkL',
+			'MG4QbKLbQR3enPn6Z/kEUtHrzWBIqYKR7Gvs5QHLPF6417p1O58suZq38Bb8dO5udtgOqNEVAPGmOuidYygWWfWOP5ReggTUk5XlrkvRxCU0MHWbkSKkJ+T4nLjozreqTJ' + '0io41sFVrpxuOugAvXJ6QtMmixSABUaNgU9SkkWf9pOEiJI8dfND51HxJCbXHwsMCMBp5FbaMZmlWPwirRdAox4wbLk9ZLmoWUcorUjdaWhKvT/LnjMgPmwnwwKpN/4MOnRDdAPdzXX3aWHdkzpfsQnqt3UJsTsSaJlzeUja5C5L4CXGyt99qmfcwB8OB9TL4EYTIl3maD/gUWBfckOsji8x2E2c2i' + 'uKKrcmMmcChYr4wCjtTjEeVKOAZ2m9mU2MKc2z2hDw3AuZxsY6aOtdAjnrwl5QXGRg9I5LVl5SI5RwnLwk90pJzDGuSSCtSmzh9DUZ4WpfN+1393aTGRqCMOsB4KxbXjspUbVMFJbnXXlsSNWaoFTpHjK6b6Ghi2/re7KJpoKElM3nGs3qvxdvGTKu7LKr/sgKDL6uQLRKoyk8AHSIGX9c8ZUTk7Sq9jV9p4QfV1WFVpaBxSsEmw',
+			'MR0BACgWKis9/AKwG9/ARgGWJn1aM3nU8YXzWG+b7aeRUkVCjl4WxeL38E3FAMLW4UcyLzxeb+CskOqhPPTglmxhK7jQcrNILsWcZvdZfApYIvk5uKqA5FKuUuL48uvD0a' + 'KGRENe/VEUFlkQru5YX4Xnp+ZThrJJlgn7ANat/qAdP6ULEcLaOQlLYcGRh5ttsJTRT4+cZQggTJjWt+9idUQ66HfC6zQ1qHcMuochy7GHiUmNXAs0AgwOF9Jwet/Qh74KGMtmppJ9gkEqiYECFQA2gVgKc1AufHJS6S6Re72FfH/UkL41L2hvlwktkD5/hZrUZ1R+RG12Eip2zKgus4g/aGl0V8B/' + 'JvkcnFUsZJ6uxs24arOBDJOuzzxky5F5B/hwVGPEdcfHunqndUcx26/KCK72hOljlqTXl8yEbXlcMqVFNByZLr7TnGzGGUlO7kuHPW/ItZUJvrHokpsLLrb3ZhEZ8pTQd75gFcf0Ve8CYzEtk2ISHtNJQV6Iz4AZHWssU6F6YWM/OlJz5JGTtPHfGMJXgl4oxbBjeenS3JQ0X7vWXYMwPe3U1dat6m5hrRC1KzI6e6w+gPDtF8GQ',
+//		 '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'
+);
+
+end;
+
+procedure TTestParsing.TearDown;
+begin
+  inherited;
+
+end;
+
+procedure TTestParsing.TestInputStream;
+var
+  stream: String;
+  aIn: TAsn1InputStream;
+  obj: IInterface;
+begin
+  for stream in FStreams do
+  begin
+    aIn := TAsn1InputStream.Create(TBase64.Decode(stream));
+
+    try
+
+      try
+
+        obj := aIn.ReadObject();
+        while obj <> Nil do
+        begin
+
+          obj := aIn.ReadObject();
+        end;
+        Fail('bad stream parsed successfully!');
+
+      except
+        on e: EIOCryptoLibException do
+        begin
+          // ignore
+        end;
+
+        on e: EAsn1ParsingCryptoLibException do
+        begin
+          // ignore
+        end;
+
+        on e: EAsn1CryptoLibException do
+        begin
+          // ignore
+        end;
+
+      end;
+    finally
+      aIn.Free;
+    end;
+  end;
+
+end;
+
+procedure TTestParsing.TestParsing;
+var
+  stream: String;
+  aIn: IAsn1StreamParser;
+  obj: IInterface;
+begin
+  for stream in FStreams do
+  begin
+    aIn := TAsn1StreamParser.Create(TBase64.Decode(stream));
+
+    try
+
+      obj := aIn.ReadObject();
+      while obj <> Nil do
+      begin
+
+        obj := aIn.ReadObject();
+      end;
+      Fail('bad stream parsed successfully!');
+
+    except
+      on e: EIOCryptoLibException do
+      begin
+        // ignore
+      end;
+
+      on e: EAsn1CryptoLibException do
+      begin
+        // ignore
+      end;
+
+    end;
+  end;
+
+end;
+
+initialization
+
+// Register any test cases with the test runner
+
+{$IFDEF FPC}
+  RegisterTest(TTestParsing);
+{$ELSE}
+  RegisterTest(TTestParsing.Suite);
+{$ENDIF FPC}
+
+end.

+ 171 - 0
CryptoLib.Tests/src/Asn1/StringTests.pas

@@ -0,0 +1,171 @@
+{ *********************************************************************************** }
+{ *                              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 StringTests;
+
+interface
+
+{$IFDEF FPC}
+{$MODE DELPHI}
+{$ENDIF FPC}
+
+uses
+  SysUtils,
+{$IFDEF FPC}
+  fpcunit,
+  testregistry,
+{$ELSE}
+  TestFramework,
+{$ENDIF FPC}
+  ClpDerBitString,
+  ClpIDerBitString,
+  ClpDerUniversalString,
+  ClpIDerUniversalString,
+  ClpDerT61String,
+  ClpIDerT61String,
+  ClpConverters;
+
+type
+
+  TCryptoLibTestCase = class abstract(TTestCase)
+
+  end;
+
+type
+
+  /// <summary>
+  /// X.690 test example
+  /// </summary>
+  TTestString = class(TCryptoLibTestCase)
+
+  protected
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+    procedure TestString;
+
+  end;
+
+implementation
+
+{ TTestString }
+
+procedure TTestString.SetUp;
+begin
+  inherited;
+
+end;
+
+procedure TTestString.TearDown;
+begin
+  inherited;
+
+end;
+
+procedure TTestString.TestString;
+var
+  bs: IDerBitString;
+  us: IDerUniversalString;
+  t61: IDerT61String;
+  t61Bytes: TBytes;
+  t61String: string;
+  LEncoding: TEncoding;
+begin
+  bs := TDerBitString.Create(TBytes.Create($01, $23, $45, $67, $89, $AB,
+    $CD, $EF));
+
+  if (not(bs.GetString() = ('#0309000123456789ABCDEF'))) then
+  begin
+    Fail('DerBitString.GetString() result incorrect');
+  end;
+
+  if (not(bs.ToString() = ('#0309000123456789ABCDEF'))) then
+  begin
+    Fail('DerBitString.ToString() result incorrect');
+  end;
+
+  bs := TDerBitString.Create(TBytes.Create($FE, $DC, $BA, $98, $76, $54,
+    $32, $10));
+
+  if (not(bs.GetString() = ('#030900FEDCBA9876543210'))) then
+  begin
+    Fail('DerBitString.GetString() result incorrect');
+  end;
+
+  if (not(bs.ToString() = ('#030900FEDCBA9876543210'))) then
+  begin
+    Fail('DerBitString.ToString() result incorrect');
+  end;
+
+  us := TDerUniversalString.Create(TBytes.Create($01, $23, $45, $67, $89, $AB,
+    $CD, $EF));
+
+  if (not(us.GetString() = ('#1C080123456789ABCDEF'))) then
+  begin
+    Fail('DerUniversalString.GetString() result incorrect');
+  end;
+
+  if (not(us.ToString() = ('#1C080123456789ABCDEF'))) then
+  begin
+    Fail('DerUniversalString.ToString() result incorrect');
+  end;
+
+  us := TDerUniversalString.Create(TBytes.Create($FE, $DC, $BA, $98, $76, $54,
+    $32, $10));
+
+  if (not(us.GetString() = ('#1C08FEDCBA9876543210'))) then
+  begin
+    Fail('DerUniversalString.GetString() result incorrect');
+  end;
+
+  if (not(us.ToString() = ('#1C08FEDCBA9876543210'))) then
+  begin
+    Fail('DerUniversalString.ToString() result incorrect');
+  end;
+
+  t61Bytes := TBytes.Create($FF, $FE, $FD, $FC, $FB, $FA, $F9, $F8);
+  LEncoding := TEncoding.GetEncoding('iso-8859-1');
+  try
+    t61String := TConverters.ConvertBytesToString(t61Bytes, LEncoding);
+  finally
+    LEncoding.Free;
+  end;
+
+  t61 := TDerT61String.Create(t61Bytes);
+
+  if (not(t61.GetString() = (t61String))) then
+  begin
+    Fail('DerT61String.GetString() result incorrect');
+  end;
+
+  if (not(t61.ToString() = (t61String))) then
+  begin
+    Fail('DerT61String.ToString() result incorrect');
+  end;
+end;
+
+initialization
+
+// Register any test cases with the test runner
+
+{$IFDEF FPC}
+  RegisterTest(TTestString);
+{$ELSE}
+  RegisterTest(TTestString.Suite);
+{$ENDIF FPC}
+
+end.

+ 201 - 0
CryptoLib.Tests/src/Asn1/TagTests.pas

@@ -0,0 +1,201 @@
+{ *********************************************************************************** }
+{ *                              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 TagTests;
+
+interface
+
+{$IFDEF FPC}
+{$MODE DELPHI}
+{$ENDIF FPC}
+
+uses
+  SysUtils,
+{$IFDEF FPC}
+  fpcunit,
+  testregistry,
+{$ELSE}
+  TestFramework,
+{$ENDIF FPC}
+  ClpAsn1Object,
+  ClpAsn1InputStream,
+  ClpDerApplicationSpecific,
+  ClpIDerApplicationSpecific,
+  ClpIAsn1TaggedObject,
+  ClpSecureRandom,
+  ClpISecureRandom,
+  ClpBits,
+  ClpHex,
+  ClpBase64,
+  ClpCryptoLibTypes;
+
+type
+
+  TCryptoLibTestCase = class abstract(TTestCase)
+
+  end;
+
+type
+
+  /// <summary>
+  /// X.690 test example
+  /// </summary>
+  TTestTag = class(TCryptoLibTestCase)
+  private
+
+  var
+    FlongAppSpecificTag, FlongTagged: TCryptoLibByteArray;
+
+  protected
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+    procedure TestTag;
+
+  end;
+
+implementation
+
+{ TTestTag }
+
+procedure TTestTag.SetUp;
+begin
+  inherited;
+  FlongAppSpecificTag := THex.Decode('5F610101');
+
+  FlongTagged := TBase64.Decode
+    ('ZSRzIp8gEEZFRENCQTk4NzY1NDMyMTCfIQwyMDA2MDQwMTEyMzSUCCAFERVz' +
+    'A4kCAHEXGBkalAggBRcYGRqUCCAFZS6QAkRFkQlURUNITklLRVKSBQECAwQF' +
+    'kxAREhMUFRYXGBkalAggBREVcwOJAgBxFxgZGpQIIAUXGBkalAggBWUukAJE' +
+    'RZEJVEVDSE5JS0VSkgUBAgMEBZMQERITFBUWFxgZGpQIIAURFXMDiQIAcRcY' +
+    'GRqUCCAFFxgZGpQIIAVlLpACREWRCVRFQ0hOSUtFUpIFAQIDBAWTEBESExQV' +
+    'FhcYGRqUCCAFERVzA4kCAHEXGBkalAggBRcYGRqUCCAFFxgZGpQIIAUXGBka' + 'lAg=');
+
+end;
+
+procedure TTestTag.TearDown;
+begin
+  inherited;
+
+end;
+
+procedure TTestTag.TestTag;
+var
+  aIn: TAsn1InputStream;
+  app: IDerApplicationSpecific;
+  tagged: IAsn1TaggedObject;
+  sr: ISecureRandom;
+  TestTag, I: Int32;
+begin
+
+  aIn := TAsn1InputStream.Create(FlongTagged);
+  try
+    app := aIn.ReadObject() as IDerApplicationSpecific;
+  finally
+    aIn.Free;
+  end;
+
+  aIn := TAsn1InputStream.Create(app.GetContents());
+  try
+    app := aIn.ReadObject() as IDerApplicationSpecific;
+  finally
+    aIn.Free;
+  end;
+
+  aIn := TAsn1InputStream.Create(app.GetContents());
+  try
+    tagged := aIn.ReadObject() as IAsn1TaggedObject;
+
+    if (tagged.TagNo <> 32) then
+    begin
+      Fail('unexpected tag value found - not 32');
+    end;
+
+    tagged := TAsn1Object.FromByteArray(tagged.GetEncoded())
+      as IAsn1TaggedObject;
+
+    if (tagged.TagNo <> 32) then
+    begin
+      Fail('unexpected tag value found on recode - not 32');
+    end;
+
+    tagged := aIn.ReadObject() as IAsn1TaggedObject;
+
+  finally
+    aIn.Free;
+  end;
+
+  if (tagged.TagNo <> 33) then
+  begin
+    Fail('unexpected tag value found - not 33');
+  end;
+
+  tagged := TAsn1Object.FromByteArray(tagged.GetEncoded()) as IAsn1TaggedObject;
+
+  if (tagged.TagNo <> 33) then
+  begin
+    Fail('unexpected tag value found on recode - not 33');
+  end;
+
+  aIn := TAsn1InputStream.Create(FlongAppSpecificTag);
+  try
+    app := aIn.ReadObject() as IDerApplicationSpecific;
+  finally
+    aIn.Free;
+  end;
+
+  if (app.ApplicationTag <> 97) then
+  begin
+    Fail('incorrect tag number read');
+  end;
+
+  app := TAsn1Object.FromByteArray(app.GetEncoded()) as IDerApplicationSpecific;
+
+  if (app.ApplicationTag <> 97) then
+  begin
+    Fail('incorrect tag number read on recode');
+  end;
+
+  sr := TSecureRandom.Create();
+
+  for I := 0 to System.Pred(100) do
+  begin
+    TestTag := TBits.Asr32(sr.NextInt32() and System.High(Int32), sr.Next(26));
+    app := TDerApplicationSpecific.Create(TestTag, TBytes.Create(1));
+    app := TAsn1Object.FromByteArray(app.GetEncoded())
+      as IDerApplicationSpecific;
+
+    if (app.ApplicationTag <> TestTag) then
+    begin
+      Fail(Format
+        ('incorrect tag number read on recode (random test value: " %d ")',
+        [TestTag]));
+    end;
+  end;
+end;
+
+initialization
+
+// Register any test cases with the test runner
+
+{$IFDEF FPC}
+  RegisterTest(TTestTag);
+{$ELSE}
+  RegisterTest(TTestTag.Suite);
+{$ENDIF FPC}
+
+end.

+ 14 - 12
CryptoLib.Tests/src/Crypto/DSATests.pas

@@ -84,6 +84,7 @@ uses
   ClpSecureRandom,
   ClpSecureRandom,
   ClpFixedSecureRandom,
   ClpFixedSecureRandom,
   ClpIFixedSecureRandom,
   ClpIFixedSecureRandom,
+  ClpConverters,
   ClpCryptoLibTypes;
   ClpCryptoLibTypes;
 
 
 type
 type
@@ -205,7 +206,8 @@ begin
 
 
   if (not TArrayUtils.AreEqual(sigBytes, sig)) then
   if (not TArrayUtils.AreEqual(sigBytes, sig)) then
   begin
   begin
-    Fail(String(TEncoding.UTF8.GetString(&message)) + ' signature incorrect');
+    Fail(TConverters.ConvertBytesToString(&message, TEncoding.UTF8) +
+      ' signature incorrect');
   end;
   end;
 
 
   sgr.Init(false, vKey);
   sgr.Init(false, vKey);
@@ -214,7 +216,8 @@ begin
 
 
   if (not(sgr.VerifySignature(sigBytes))) then
   if (not(sgr.VerifySignature(sigBytes))) then
   begin
   begin
-    Fail(String(TEncoding.UTF8.GetString(&message)) + ' verification failed');
+    Fail(TConverters.ConvertBytesToString(&message, TEncoding.UTF8) +
+      ' verification failed');
   end;
   end;
 end;
 end;
 
 
@@ -970,7 +973,7 @@ begin
   sgr.Init(true, TParametersWithRandom.Create(sKey, k)
   sgr.Init(true, TParametersWithRandom.Create(sKey, k)
     as IParametersWithRandom);
     as IParametersWithRandom);
 
 
-  &message := TEncoding.ASCII.GetBytes('abc');
+  &message := TConverters.ConvertStringToBytes('abc', TEncoding.ASCII);
 
 
   sgr.BlockUpdate(&message, 0, System.Length(&message));
   sgr.BlockUpdate(&message, 0, System.Length(&message));
 
 
@@ -1429,16 +1432,13 @@ begin
 
 
   sgr := TSignerUtilities.GetSigner('ECDSA');
   sgr := TSignerUtilities.GetSigner('ECDSA');
 
 
-  // KeyFactory f = KeyFactory.GetInstance('ECDSA');
-  // PrivateKey sKey = f.generatePrivate(priKey);
-  // PublicKey vKey = f.generatePublic(pubKey);
   sKey := priKey;
   sKey := priKey;
   vKey := pubKey;
   vKey := pubKey;
 
 
   sgr.Init(true, TParametersWithRandom.Create(sKey, k)
   sgr.Init(true, TParametersWithRandom.Create(sKey, k)
     as IParametersWithRandom);
     as IParametersWithRandom);
 
 
-  &message := TEncoding.ASCII.GetBytes('abc');
+  &message := TConverters.ConvertStringToBytes('abc', TEncoding.ASCII);
 
 
   sgr.BlockUpdate(&message, 0, System.Length(&message));
   sgr.BlockUpdate(&message, 0, System.Length(&message));
 
 
@@ -1691,7 +1691,7 @@ begin
   sgr.Init(true, TParametersWithRandom.Create(sKey, k)
   sgr.Init(true, TParametersWithRandom.Create(sKey, k)
     as IParametersWithRandom);
     as IParametersWithRandom);
 
 
-  &message := TEncoding.ASCII.GetBytes('abc');
+  &message := TConverters.ConvertStringToBytes('abc', TEncoding.ASCII);
 
 
   sgr.BlockUpdate(&message, 0, System.Length(&message));
   sgr.BlockUpdate(&message, 0, System.Length(&message));
 
 
@@ -1853,20 +1853,22 @@ begin
 
 
   sgr := TSignerUtilities.GetSigner('NONEwithECDSA');
   sgr := TSignerUtilities.GetSigner('NONEwithECDSA');
 
 
-  &message := TEncoding.UTF8.GetBytes('abc');
+  &message := TConverters.ConvertStringToBytes('abc', TEncoding.UTF8);
   sig := THex.Decode
   sig := THex.Decode
     ('3040021e2cb7f36803ebb9c427c58d8265f11fc5084747133078fc279de874fbecb0021e64cb19604be06c57e761b3de5518f71de0f6e0cd2df677cec8a6ffcb690d');
     ('3040021e2cb7f36803ebb9c427c58d8265f11fc5084747133078fc279de874fbecb0021e64cb19604be06c57e761b3de5518f71de0f6e0cd2df677cec8a6ffcb690d');
 
 
   DoCheckMessage(sgr, priKey, pubKey, &message, sig);
   DoCheckMessage(sgr, priKey, pubKey, &message, sig);
 
 
-  &message := TEncoding.UTF8.GetBytes('abcdefghijklmnopqrstuvwxyz');
+  &message := TConverters.ConvertStringToBytes('abcdefghijklmnopqrstuvwxyz',
+    TEncoding.UTF8);
   sig := THex.Decode
   sig := THex.Decode
     ('3040021e2cb7f36803ebb9c427c58d8265f11fc5084747133078fc279de874fbecb0021e43fd65b3363d76aabef8630572257dbb67c82818ad9fad31256539b1b02c');
     ('3040021e2cb7f36803ebb9c427c58d8265f11fc5084747133078fc279de874fbecb0021e43fd65b3363d76aabef8630572257dbb67c82818ad9fad31256539b1b02c');
 
 
   DoCheckMessage(sgr, priKey, pubKey, &message, sig);
   DoCheckMessage(sgr, priKey, pubKey, &message, sig);
 
 
-  &message := TEncoding.UTF8.GetBytes
-    ('a very very long message gauranteed to cause an overflow');
+  &message := TConverters.ConvertStringToBytes
+    ('a very very long message gauranteed to cause an overflow',
+    TEncoding.UTF8);
   sig := THex.Decode
   sig := THex.Decode
     ('3040021e2cb7f36803ebb9c427c58d8265f11fc5084747133078fc279de874fbecb0021e7d5be84b22937a1691859a3c6fe45ed30b108574431d01b34025825ec17a');
     ('3040021e2cb7f36803ebb9c427c58d8265f11fc5084747133078fc279de874fbecb0021e7d5be84b22937a1691859a3c6fe45ed30b108574431d01b34025825ec17a');
 
 

+ 2 - 1
CryptoLib.Tests/src/Crypto/HMacTests.pas

@@ -44,6 +44,7 @@ uses
   ClpRosstandartObjectIdentifiers,
   ClpRosstandartObjectIdentifiers,
   ClpHex,
   ClpHex,
   ClpArrayUtils,
   ClpArrayUtils,
+  ClpConverters,
   ClpCryptoLibTypes;
   ClpCryptoLibTypes;
 
 
 type
 type
@@ -165,7 +166,7 @@ procedure TTestHMac.SetUp;
 begin
 begin
   inherited;
   inherited;
   FkeyBytes := THex.Decode('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b');
   FkeyBytes := THex.Decode('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b');
-  Fmessage := TEncoding.ASCII.GetBytes('Hi There');
+  Fmessage := TConverters.ConvertStringToBytes('Hi There', TEncoding.ASCII);
   Foutput1 := THex.Decode('b617318655057264e28bc0b6fb378c8ef146be00');
   Foutput1 := THex.Decode('b617318655057264e28bc0b6fb378c8ef146be00');
   FoutputMD5 := THex.Decode('5ccec34ea9656392457fa1ac27f08fbc');
   FoutputMD5 := THex.Decode('5ccec34ea9656392457fa1ac27f08fbc');
   FoutputMD2 := THex.Decode('dc1923ef5f161d35bef839ca8c807808');
   FoutputMD2 := THex.Decode('dc1923ef5f161d35bef839ca8c807808');

+ 3 - 2
CryptoLib.Tests/src/Crypto/MD5HMacTests.pas

@@ -38,6 +38,7 @@ uses
   ClpHex,
   ClpHex,
   ClpArrayUtils,
   ClpArrayUtils,
   ClpStringUtils,
   ClpStringUtils,
+  ClpConverters,
   ClpCryptoLibTypes;
   ClpCryptoLibTypes;
 
 
 type
 type
@@ -110,7 +111,7 @@ begin
 
 
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   begin
   begin
-    m := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[i]));
+    m := TConverters.ConvertStringToBytes(Fmessages[i], TEncoding.ASCII);
     if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
     if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
     begin
     begin
       m := THex.Decode(System.Copy(Fmessages[i], 3,
       m := THex.Decode(System.Copy(Fmessages[i], 3,
@@ -128,7 +129,7 @@ begin
 
 
   // test reset
   // test reset
   vector := 0; // vector used for test
   vector := 0; // vector used for test
-  m2 := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[vector]));
+  m2 := TConverters.ConvertStringToBytes(Fmessages[vector], TEncoding.ASCII);
 
 
   if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
   if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
   begin
   begin

+ 23 - 14
CryptoLib.Tests/src/Crypto/Pkcs5Tests.pas

@@ -37,6 +37,7 @@ uses
   ClpDigestUtilities,
   ClpDigestUtilities,
   ClpHex,
   ClpHex,
   ClpArrayUtils,
   ClpArrayUtils,
+  ClpConverters,
   ClpCryptoLibTypes;
   ClpCryptoLibTypes;
 
 
 type
 type
@@ -100,7 +101,8 @@ begin
   SaltBytes := THex.Decode('1234567878563412');
   SaltBytes := THex.Decode('1234567878563412');
 
 
   PasswordString := 'password';
   PasswordString := 'password';
-  PasswordBytes := TEncoding.UTF8.GetBytes(UnicodeString(PasswordString));
+  PasswordBytes := TConverters.ConvertStringToBytes(PasswordString,
+    TEncoding.UTF8);
   generator := TPkcs5S2ParametersGenerator.Create
   generator := TPkcs5S2ParametersGenerator.Create
     (TDigestUtilities.GetDigest('SHA-1'));
     (TDigestUtilities.GetDigest('SHA-1'));
 
 
@@ -114,7 +116,8 @@ begin
 
 
   PasswordString :=
   PasswordString :=
     'All n-entities must communicate with other n-entities via n-1 entiteeheehees';
     'All n-entities must communicate with other n-entities via n-1 entiteeheehees';
-  PasswordBytes := TEncoding.UTF8.GetBytes(UnicodeString(PasswordString));
+  PasswordBytes := TConverters.ConvertStringToBytes(PasswordString,
+    TEncoding.UTF8);
 
 
   generator.Init(PasswordBytes, SaltBytes, 500);
   generator.Init(PasswordBytes, SaltBytes, 500);
 
 
@@ -140,10 +143,11 @@ begin
     (TDigestUtilities.GetDigest('SHA-1'));
     (TDigestUtilities.GetDigest('SHA-1'));
 
 
   PasswordString := 'password';
   PasswordString := 'password';
-  PasswordBytes := TEncoding.UTF8.GetBytes(UnicodeString(PasswordString));
+  PasswordBytes := TConverters.ConvertStringToBytes(PasswordString,
+    TEncoding.UTF8);
 
 
   SaltString := 'salt';
   SaltString := 'salt';
-  SaltBytes := TEncoding.UTF8.GetBytes(UnicodeString(SaltString));
+  SaltBytes := TConverters.ConvertStringToBytes(SaltString, TEncoding.UTF8);
 
 
   // 1
   // 1
 
 
@@ -218,10 +222,11 @@ begin
   // 5
   // 5
 
 
   PasswordString := 'passwordPASSWORDpassword';
   PasswordString := 'passwordPASSWORDpassword';
-  PasswordBytes := TEncoding.UTF8.GetBytes(UnicodeString(PasswordString));
+  PasswordBytes := TConverters.ConvertStringToBytes(PasswordString,
+    TEncoding.UTF8);
 
 
   SaltString := 'saltSALTsaltSALTsaltSALTsaltSALTsalt';
   SaltString := 'saltSALTsaltSALTsaltSALTsaltSALTsalt';
-  SaltBytes := TEncoding.UTF8.GetBytes(UnicodeString(SaltString));
+  SaltBytes := TConverters.ConvertStringToBytes(SaltString, TEncoding.UTF8);
 
 
   iteration_count := 4096;
   iteration_count := 4096;
 
 
@@ -243,10 +248,11 @@ begin
 
 
   PasswordString := 'pass' + Char(0) + 'word';
   PasswordString := 'pass' + Char(0) + 'word';
   // Char(0) represents #0 (null char)
   // Char(0) represents #0 (null char)
-  PasswordBytes := TEncoding.UTF8.GetBytes(UnicodeString(PasswordString));
+  PasswordBytes := TConverters.ConvertStringToBytes(PasswordString,
+    TEncoding.UTF8);
 
 
   SaltString := 'sa' + Char(0) + 'lt'; // Char(0) represents #0 (null char)
   SaltString := 'sa' + Char(0) + 'lt'; // Char(0) represents #0 (null char)
-  SaltBytes := TEncoding.UTF8.GetBytes(UnicodeString(SaltString));
+  SaltBytes := TConverters.ConvertStringToBytes(SaltString, TEncoding.UTF8);
 
 
   iteration_count := 4096;
   iteration_count := 4096;
 
 
@@ -279,10 +285,11 @@ begin
     (TDigestUtilities.GetDigest('SHA-256'));
     (TDigestUtilities.GetDigest('SHA-256'));
 
 
   PasswordString := 'password';
   PasswordString := 'password';
-  PasswordBytes := TEncoding.UTF8.GetBytes(UnicodeString(PasswordString));
+  PasswordBytes := TConverters.ConvertStringToBytes(PasswordString,
+    TEncoding.UTF8);
 
 
   SaltString := 'salt';
   SaltString := 'salt';
-  SaltBytes := TEncoding.UTF8.GetBytes(UnicodeString(SaltString));
+  SaltBytes := TConverters.ConvertStringToBytes(SaltString, TEncoding.UTF8);
 
 
   // 1
   // 1
 
 
@@ -361,10 +368,11 @@ begin
   // 5
   // 5
 
 
   PasswordString := 'passwordPASSWORDpassword';
   PasswordString := 'passwordPASSWORDpassword';
-  PasswordBytes := TEncoding.UTF8.GetBytes(UnicodeString(PasswordString));
+  PasswordBytes := TConverters.ConvertStringToBytes(PasswordString,
+    TEncoding.UTF8);
 
 
   SaltString := 'saltSALTsaltSALTsaltSALTsaltSALTsalt';
   SaltString := 'saltSALTsaltSALTsaltSALTsaltSALTsalt';
-  SaltBytes := TEncoding.UTF8.GetBytes(UnicodeString(SaltString));
+  SaltBytes := TConverters.ConvertStringToBytes(SaltString, TEncoding.UTF8);
 
 
   iteration_count := 4096;
   iteration_count := 4096;
 
 
@@ -388,10 +396,11 @@ begin
 
 
   PasswordString := 'pass' + Char(0) + 'word';
   PasswordString := 'pass' + Char(0) + 'word';
   // Char(0) represents #0 (null char)
   // Char(0) represents #0 (null char)
-  PasswordBytes := TEncoding.UTF8.GetBytes(UnicodeString(PasswordString));
+  PasswordBytes := TConverters.ConvertStringToBytes(PasswordString,
+    TEncoding.UTF8);
 
 
   SaltString := 'sa' + Char(0) + 'lt'; // Char(0) represents #0 (null char)
   SaltString := 'sa' + Char(0) + 'lt'; // Char(0) represents #0 (null char)
-  SaltBytes := TEncoding.UTF8.GetBytes(UnicodeString(SaltString));
+  SaltBytes := TConverters.ConvertStringToBytes(SaltString, TEncoding.UTF8);
 
 
   iteration_count := 4096;
   iteration_count := 4096;
 
 

+ 3 - 2
CryptoLib.Tests/src/Crypto/RIPEMD128HMacTests.pas

@@ -38,6 +38,7 @@ uses
   ClpHex,
   ClpHex,
   ClpArrayUtils,
   ClpArrayUtils,
   ClpStringUtils,
   ClpStringUtils,
+  ClpConverters,
   ClpCryptoLibTypes;
   ClpCryptoLibTypes;
 
 
 type
 type
@@ -109,7 +110,7 @@ begin
 
 
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   begin
   begin
-    m := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[i]));
+    m := TConverters.ConvertStringToBytes(Fmessages[i], TEncoding.ASCII);
     if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
     if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
     begin
     begin
       m := THex.Decode(System.Copy(Fmessages[i], 3,
       m := THex.Decode(System.Copy(Fmessages[i], 3,
@@ -127,7 +128,7 @@ begin
 
 
   // test reset
   // test reset
   vector := 0; // vector used for test
   vector := 0; // vector used for test
-  m2 := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[vector]));
+  m2 := TConverters.ConvertStringToBytes(Fmessages[vector], TEncoding.ASCII);
 
 
   if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
   if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
   begin
   begin

+ 3 - 2
CryptoLib.Tests/src/Crypto/RIPEMD160HMacTests.pas

@@ -38,6 +38,7 @@ uses
   ClpHex,
   ClpHex,
   ClpArrayUtils,
   ClpArrayUtils,
   ClpStringUtils,
   ClpStringUtils,
+  ClpConverters,
   ClpCryptoLibTypes;
   ClpCryptoLibTypes;
 
 
 type
 type
@@ -114,7 +115,7 @@ begin
 
 
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   begin
   begin
-    m := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[i]));
+    m := TConverters.ConvertStringToBytes(Fmessages[i], TEncoding.ASCII);
     if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
     if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
     begin
     begin
       m := THex.Decode(System.Copy(Fmessages[i], 3,
       m := THex.Decode(System.Copy(Fmessages[i], 3,
@@ -132,7 +133,7 @@ begin
 
 
   // test reset
   // test reset
   vector := 0; // vector used for test
   vector := 0; // vector used for test
-  m2 := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[vector]));
+  m2 := TConverters.ConvertStringToBytes(Fmessages[vector], TEncoding.ASCII);
 
 
   if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
   if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
   begin
   begin

+ 3 - 2
CryptoLib.Tests/src/Crypto/SHA1HMacTests.pas

@@ -38,6 +38,7 @@ uses
   ClpHex,
   ClpHex,
   ClpArrayUtils,
   ClpArrayUtils,
   ClpStringUtils,
   ClpStringUtils,
+  ClpConverters,
   ClpCryptoLibTypes;
   ClpCryptoLibTypes;
 
 
 type
 type
@@ -115,7 +116,7 @@ begin
 
 
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   begin
   begin
-    m := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[i]));
+    m := TConverters.ConvertStringToBytes(Fmessages[i], TEncoding.ASCII);
     if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
     if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
     begin
     begin
       m := THex.Decode(System.Copy(Fmessages[i], 3,
       m := THex.Decode(System.Copy(Fmessages[i], 3,
@@ -133,7 +134,7 @@ begin
 
 
   // test reset
   // test reset
   vector := 0; // vector used for test
   vector := 0; // vector used for test
-  m2 := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[vector]));
+  m2 := TConverters.ConvertStringToBytes(Fmessages[vector], TEncoding.ASCII);
 
 
   if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
   if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
   begin
   begin

+ 3 - 2
CryptoLib.Tests/src/Crypto/SHA224HMacTests.pas

@@ -38,6 +38,7 @@ uses
   ClpHex,
   ClpHex,
   ClpArrayUtils,
   ClpArrayUtils,
   ClpStringUtils,
   ClpStringUtils,
+  ClpConverters,
   ClpCryptoLibTypes;
   ClpCryptoLibTypes;
 
 
 type
 type
@@ -116,7 +117,7 @@ begin
 
 
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   begin
   begin
-    m := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[i]));
+    m := TConverters.ConvertStringToBytes(Fmessages[i], TEncoding.ASCII);
     if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
     if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
     begin
     begin
       m := THex.Decode(System.Copy(Fmessages[i], 3,
       m := THex.Decode(System.Copy(Fmessages[i], 3,
@@ -134,7 +135,7 @@ begin
 
 
   // test reset
   // test reset
   vector := 0; // vector used for test
   vector := 0; // vector used for test
-  m2 := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[vector]));
+  m2 := TConverters.ConvertStringToBytes(Fmessages[vector], TEncoding.ASCII);
 
 
   if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
   if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
   begin
   begin

+ 3 - 2
CryptoLib.Tests/src/Crypto/SHA256HMacTests.pas

@@ -38,6 +38,7 @@ uses
   ClpHex,
   ClpHex,
   ClpArrayUtils,
   ClpArrayUtils,
   ClpStringUtils,
   ClpStringUtils,
+  ClpConverters,
   ClpCryptoLibTypes;
   ClpCryptoLibTypes;
 
 
 type
 type
@@ -116,7 +117,7 @@ begin
 
 
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   begin
   begin
-    m := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[i]));
+    m := TConverters.ConvertStringToBytes(Fmessages[i], TEncoding.ASCII);
     if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
     if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
     begin
     begin
       m := THex.Decode(System.Copy(Fmessages[i], 3,
       m := THex.Decode(System.Copy(Fmessages[i], 3,
@@ -134,7 +135,7 @@ begin
 
 
   // test reset
   // test reset
   vector := 0; // vector used for test
   vector := 0; // vector used for test
-  m2 := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[vector]));
+  m2 := TConverters.ConvertStringToBytes(Fmessages[vector], TEncoding.ASCII);
 
 
   if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
   if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
   begin
   begin

+ 3 - 2
CryptoLib.Tests/src/Crypto/SHA384HMacTests.pas

@@ -38,6 +38,7 @@ uses
   ClpHex,
   ClpHex,
   ClpArrayUtils,
   ClpArrayUtils,
   ClpStringUtils,
   ClpStringUtils,
+  ClpConverters,
   ClpCryptoLibTypes;
   ClpCryptoLibTypes;
 
 
 type
 type
@@ -116,7 +117,7 @@ begin
 
 
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   begin
   begin
-    m := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[i]));
+    m := TConverters.ConvertStringToBytes(Fmessages[i], TEncoding.ASCII);
     if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
     if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
     begin
     begin
       m := THex.Decode(System.Copy(Fmessages[i], 3,
       m := THex.Decode(System.Copy(Fmessages[i], 3,
@@ -134,7 +135,7 @@ begin
 
 
   // test reset
   // test reset
   vector := 0; // vector used for test
   vector := 0; // vector used for test
-  m2 := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[vector]));
+  m2 := TConverters.ConvertStringToBytes(Fmessages[vector], TEncoding.ASCII);
 
 
   if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
   if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
   begin
   begin

+ 3 - 2
CryptoLib.Tests/src/Crypto/SHA512HMacTests.pas

@@ -38,6 +38,7 @@ uses
   ClpHex,
   ClpHex,
   ClpArrayUtils,
   ClpArrayUtils,
   ClpStringUtils,
   ClpStringUtils,
+  ClpConverters,
   ClpCryptoLibTypes;
   ClpCryptoLibTypes;
 
 
 type
 type
@@ -116,7 +117,7 @@ begin
 
 
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   begin
   begin
-    m := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[i]));
+    m := TConverters.ConvertStringToBytes(Fmessages[i], TEncoding.ASCII);
     if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
     if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
     begin
     begin
       m := THex.Decode(System.Copy(Fmessages[i], 3,
       m := THex.Decode(System.Copy(Fmessages[i], 3,
@@ -134,7 +135,7 @@ begin
 
 
   // test reset
   // test reset
   vector := 0; // vector used for test
   vector := 0; // vector used for test
-  m2 := TEncoding.ASCII.GetBytes(UnicodeString(Fmessages[vector]));
+  m2 := TConverters.ConvertStringToBytes(Fmessages[vector], TEncoding.ASCII);
 
 
   if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
   if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
   begin
   begin

+ 4 - 3
CryptoLib.Tests/src/Math/ECNRTests.pas

@@ -54,6 +54,7 @@ uses
   ClpDigestUtilities,
   ClpDigestUtilities,
   ClpSignerUtilities,
   ClpSignerUtilities,
   ClpBigInteger,
   ClpBigInteger,
+  ClpConverters,
   ClpCryptoLibTypes;
   ClpCryptoLibTypes;
 
 
 type
 type
@@ -252,7 +253,7 @@ begin
     parameters);
     parameters);
 
 
   sgr := TSignerUtilities.GetSigner('SHA1withECNR');
   sgr := TSignerUtilities.GetSigner('SHA1withECNR');
-  &message := TEncoding.UTF8.GetBytes('abc');
+  &message := TConverters.ConvertStringToBytes('abc', TEncoding.UTF8);
 
 
   DoCheckSignature(192, priKey, pubKey, sgr, k, &message, r, s);
   DoCheckSignature(192, priKey, pubKey, sgr, k, &message, r, s);
 end;
 end;
@@ -393,7 +394,7 @@ begin
     parameters);
     parameters);
 
 
   sgr := TSignerUtilities.GetSigner('SHA1withECNR');
   sgr := TSignerUtilities.GetSigner('SHA1withECNR');
-  &message := TEncoding.UTF8.GetBytes('abc');
+  &message := TConverters.ConvertStringToBytes('abc', TEncoding.UTF8);
 
 
   DoCheckSignature(239, priKey, pubKey, sgr, k, &message, r, s);
   DoCheckSignature(239, priKey, pubKey, sgr, k, &message, r, s);
 end;
 end;
@@ -459,7 +460,7 @@ begin
     parameters);
     parameters);
 
 
   sgr := TSignerUtilities.GetSigner('SHA512withECNR');
   sgr := TSignerUtilities.GetSigner('SHA512withECNR');
-  &message := TEncoding.UTF8.GetBytes('abc');
+  &message := TConverters.ConvertStringToBytes('abc', TEncoding.UTF8);
 
 
   DoCheckSignature(521, priKey, pubKey, sgr, k, &message, r, s);
   DoCheckSignature(521, priKey, pubKey, sgr, k, &message, r, s);
 end;
 end;

+ 2 - 1
CryptoLib.Tests/src/Math/IESCipherTests.pas

@@ -73,6 +73,7 @@ uses
   ClpHex,
   ClpHex,
   ClpDigestUtilities,
   ClpDigestUtilities,
   ClpMacUtilities,
   ClpMacUtilities,
+  ClpConverters,
   ClpArrayUtils;
   ClpArrayUtils;
 
 
 type
 type
@@ -116,7 +117,7 @@ var
   PlainTextBytes, CipherTextBytes, DecryptionResultBytes: TBytes;
   PlainTextBytes, CipherTextBytes, DecryptionResultBytes: TBytes;
   CipherEncrypt, CipherDecrypt: IIESCipher;
   CipherEncrypt, CipherDecrypt: IIESCipher;
 begin
 begin
-  PlainTextBytes := TEncoding.UTF8.GetBytes(UnicodeString(PlainText));
+  PlainTextBytes := TConverters.ConvertStringToBytes(PlainText, TEncoding.UTF8);
   // Encryption
   // Encryption
   CipherEncrypt := TIESCipher.Create(GetECIESAES256CBCEngine);
   CipherEncrypt := TIESCipher.Create(GetECIESAES256CBCEngine);
   CipherEncrypt.Init(True, KeyPair.Public as IECPublicKeyParameters,
   CipherEncrypt.Init(True, KeyPair.Public as IECPublicKeyParameters,

+ 4 - 3
CryptoLib.Tests/src/Others/ECDsa5Tests.pas

@@ -56,7 +56,8 @@ uses
   ClpAsn1Object,
   ClpAsn1Object,
   ClpISigner,
   ClpISigner,
   ClpIAsn1Sequence,
   ClpIAsn1Sequence,
-  ClpIDerInteger;
+  ClpIDerInteger,
+  ClpConverters;
 
 
 type
 type
 
 
@@ -217,7 +218,7 @@ begin
   sgr.Init(true, TParametersWithRandom.Create(sKey, k)
   sgr.Init(true, TParametersWithRandom.Create(sKey, k)
     as IParametersWithRandom);
     as IParametersWithRandom);
 
 
-  &message := TEncoding.UTF8.GetBytes('abc');
+  &message := TConverters.ConvertStringToBytes('abc', TEncoding.UTF8);
 
 
   sgr.BlockUpdate(&message, 0, System.Length(&message));
   sgr.BlockUpdate(&message, 0, System.Length(&message));
 
 
@@ -310,7 +311,7 @@ begin
   sgr.Init(true, TParametersWithRandom.Create(sKey, k)
   sgr.Init(true, TParametersWithRandom.Create(sKey, k)
     as IParametersWithRandom);
     as IParametersWithRandom);
 
 
-  &message := TEncoding.UTF8.GetBytes('abc');
+  &message := TConverters.ConvertStringToBytes('abc', TEncoding.UTF8);
 
 
   sgr.BlockUpdate(&message, 0, System.Length(&message));
   sgr.BlockUpdate(&message, 0, System.Length(&message));
 
 

+ 10 - 5
CryptoLib.Tests/src/Others/ECSchnorrTests.pas

@@ -54,7 +54,8 @@ uses
   ClpSecNamedCurves,
   ClpSecNamedCurves,
   ClpCryptoLibTypes,
   ClpCryptoLibTypes,
   ClpBigInteger,
   ClpBigInteger,
-  ClpSignerUtilities;
+  ClpSignerUtilities,
+  ClpConverters;
 
 
 type
 type
 
 
@@ -134,7 +135,8 @@ begin
 
 
   signer.Init(true, privParams);
   signer.Init(true, privParams);
 
 
-  &message := TEncoding.UTF8.GetBytes('PascalECSCHNORR');
+  &message := TConverters.ConvertStringToBytes('PascalECSCHNORR',
+    TEncoding.UTF8);
 
 
   signer.BlockUpdate(&message, 0, System.Length(&message));
   signer.BlockUpdate(&message, 0, System.Length(&message));
 
 
@@ -182,7 +184,8 @@ begin
 
 
   signer.Init(true, privParams);
   signer.Init(true, privParams);
 
 
-  &message := TEncoding.UTF8.GetBytes('PascalECSCHNORR');
+  &message := TConverters.ConvertStringToBytes('PascalECSCHNORR',
+    TEncoding.UTF8);
 
 
   signer.BlockUpdate(&message, 0, System.Length(&message));
   signer.BlockUpdate(&message, 0, System.Length(&message));
 
 
@@ -230,7 +233,8 @@ begin
 
 
   signer.Init(true, privParams);
   signer.Init(true, privParams);
 
 
-  &message := TEncoding.UTF8.GetBytes('PascalECSCHNORR');
+  &message := TConverters.ConvertStringToBytes('PascalECSCHNORR',
+    TEncoding.UTF8);
 
 
   signer.BlockUpdate(&message, 0, System.Length(&message));
   signer.BlockUpdate(&message, 0, System.Length(&message));
 
 
@@ -278,7 +282,8 @@ begin
 
 
   signer.Init(true, privParams);
   signer.Init(true, privParams);
 
 
-  &message := TEncoding.UTF8.GetBytes('PascalECSCHNORR');
+  &message := TConverters.ConvertStringToBytes('PascalECSCHNORR',
+    TEncoding.UTF8);
 
 
   signer.BlockUpdate(&message, 0, System.Length(&message));
   signer.BlockUpdate(&message, 0, System.Length(&message));
 
 

+ 3 - 2
CryptoLib.Tests/src/Others/NamedCurveTests.pas

@@ -48,6 +48,7 @@ uses
   ClpIAsymmetricCipherKeyPairGenerator,
   ClpIAsymmetricCipherKeyPairGenerator,
   ClpIAsymmetricCipherKeyPair,
   ClpIAsymmetricCipherKeyPair,
   ClpIECKeyGenerationParameters,
   ClpIECKeyGenerationParameters,
+  ClpConverters,
   ClpCryptoLibTypes;
   ClpCryptoLibTypes;
 
 
 resourcestring
 resourcestring
@@ -101,7 +102,7 @@ begin
 
 
   sgr.Init(true, sKey);
   sgr.Init(true, sKey);
 
 
-  &message := TEncoding.UTF8.GetBytes('abc');
+  &message := TConverters.ConvertStringToBytes('abc', TEncoding.UTF8);
 
 
   sgr.BlockUpdate(&message, 0, System.Length(&message));
   sgr.BlockUpdate(&message, 0, System.Length(&message));
 
 
@@ -152,7 +153,7 @@ end;
 //
 //
 // sgr.Init(true, sKey);
 // sgr.Init(true, sKey);
 //
 //
-// &message := TEncoding.UTF8.GetBytes('abc');
+// &message := TConverters.ConvertStringToBytes('abc', TEncoding.UTF8);
 //
 //
 // sgr.BlockUpdate(&message, 0, System.Length(&message));
 // sgr.BlockUpdate(&message, 0, System.Length(&message));
 //
 //

+ 2 - 1
CryptoLib/src/Asn1/ClpAsn1InputStream.pas

@@ -353,7 +353,7 @@ end;
 destructor TAsn1InputStream.Destroy;
 destructor TAsn1InputStream.Destroy;
 begin
 begin
   FStream.Free;
   FStream.Free;
-  inherited Destroy; // dont free
+  inherited Destroy;
 end;
 end;
 
 
 constructor TAsn1InputStream.Create(const inputStream: TStream; limit: Int32);
 constructor TAsn1InputStream.Create(const inputStream: TStream; limit: Int32);
@@ -659,6 +659,7 @@ begin
         end;
         end;
     else
     else
       begin
       begin
+        defIn.Free; // free the stream incase an unsupported tag is encountered.
         raise EIOCryptoLibException.CreateResFmt(@SUnknownTag, [tagNo]);
         raise EIOCryptoLibException.CreateResFmt(@SUnknownTag, [tagNo]);
       end;
       end;
 
 

+ 8 - 2
CryptoLib/src/Asn1/ClpAsn1Object.pas

@@ -114,7 +114,10 @@ begin
       input.Free;
       input.Free;
     end;
     end;
   except
   except
-    raise EIOCryptoLibException.CreateRes(@SUnRecognizedObjectByteArray);
+    on e: EInvalidCastCryptoLibException do
+    begin
+      raise EIOCryptoLibException.CreateRes(@SUnRecognizedObjectByteArray);
+    end;
   end;
   end;
 end;
 end;
 
 
@@ -127,7 +130,10 @@ begin
     try
     try
       result := asn1Stream.ReadObject();
       result := asn1Stream.ReadObject();
     except
     except
-      raise EIOCryptoLibException.CreateRes(@SUnRecognizedObjectStream);
+      on e: EInvalidCastCryptoLibException do
+      begin
+        raise EIOCryptoLibException.CreateRes(@SUnRecognizedObjectStream);
+      end;
     end;
     end;
   finally
   finally
     asn1Stream.Free;
     asn1Stream.Free;

+ 1 - 0
CryptoLib/src/Asn1/ClpAsn1StreamParser.pas

@@ -375,6 +375,7 @@ begin
         end;
         end;
     else
     else
       begin
       begin
+        defIn.Free; // free the stream incase an unsupported tag is encountered.
         raise EIOCryptoLibException.CreateResFmt(@SUnknownTag, [tagNo]);
         raise EIOCryptoLibException.CreateResFmt(@SUnknownTag, [tagNo]);
       end;
       end;
 
 

+ 8 - 0
CryptoLib/src/Asn1/ClpBerTaggedObjectParser.pas

@@ -49,6 +49,8 @@ type
     constructor Create(constructed: Boolean; tagNumber: Int32;
     constructor Create(constructed: Boolean; tagNumber: Int32;
       const parser: IAsn1StreamParser);
       const parser: IAsn1StreamParser);
 
 
+    destructor Destroy; override;
+
     function GetObjectParser(tag: Int32; isExplicit: Boolean)
     function GetObjectParser(tag: Int32; isExplicit: Boolean)
       : IAsn1Convertible; inline;
       : IAsn1Convertible; inline;
 
 
@@ -71,6 +73,12 @@ begin
   F_parser := parser;
   F_parser := parser;
 end;
 end;
 
 
+destructor TBerTaggedObjectParser.Destroy;
+begin
+  F_parser := Nil;
+  inherited Destroy;
+end;
+
 function TBerTaggedObjectParser.GetIsConstructed: Boolean;
 function TBerTaggedObjectParser.GetIsConstructed: Boolean;
 begin
 begin
   result := F_constructed;
   result := F_constructed;

+ 4 - 3
CryptoLib/src/Asn1/ClpDerGeneralString.pas

@@ -30,7 +30,8 @@ uses
   ClpIProxiedInterface,
   ClpIProxiedInterface,
   ClpCryptoLibTypes,
   ClpCryptoLibTypes,
   ClpIAsn1TaggedObject,
   ClpIAsn1TaggedObject,
-  ClpIDerGeneralString;
+  ClpIDerGeneralString,
+  ClpConverters;
 
 
 resourcestring
 resourcestring
   SIllegalObject = 'Illegal Object in GetInstance: %s';
   SIllegalObject = 'Illegal Object in GetInstance: %s';
@@ -81,7 +82,7 @@ end;
 
 
 function TDerGeneralString.GetOctets: TCryptoLibByteArray;
 function TDerGeneralString.GetOctets: TCryptoLibByteArray;
 begin
 begin
-  result := TEncoding.ASCII.GetBytes(UnicodeString(Str));
+  result := TConverters.ConvertStringToBytes(Str, TEncoding.ASCII);
 end;
 end;
 
 
 function TDerGeneralString.Asn1Equals(const asn1Object: IAsn1Object): Boolean;
 function TDerGeneralString.Asn1Equals(const asn1Object: IAsn1Object): Boolean;
@@ -100,7 +101,7 @@ end;
 
 
 constructor TDerGeneralString.Create(const Str: TCryptoLibByteArray);
 constructor TDerGeneralString.Create(const Str: TCryptoLibByteArray);
 begin
 begin
-  Create(String(TEncoding.ASCII.GetString(Str)));
+  Create(TConverters.ConvertBytesToString(Str, TEncoding.ASCII));
 end;
 end;
 
 
 constructor TDerGeneralString.Create(const Str: String);
 constructor TDerGeneralString.Create(const Str: String);

+ 3 - 2
CryptoLib/src/Asn1/ClpDerGraphicString.pas

@@ -31,7 +31,8 @@ uses
   ClpIProxiedInterface,
   ClpIProxiedInterface,
   ClpIDerGraphicString,
   ClpIDerGraphicString,
   ClpIAsn1TaggedObject,
   ClpIAsn1TaggedObject,
-  ClpDerStringBase;
+  ClpDerStringBase,
+  ClpConverters;
 
 
 resourcestring
 resourcestring
   SIllegalObject = 'Illegal Object in GetInstance: %s';
   SIllegalObject = 'Illegal Object in GetInstance: %s';
@@ -193,7 +194,7 @@ end;
 
 
 function TDerGraphicString.GetString: String;
 function TDerGraphicString.GetString: String;
 begin
 begin
-  result := String(TEncoding.ASCII.GetString(mString));
+  result := TConverters.ConvertBytesToString(mString, TEncoding.ANSI);
 end;
 end;
 
 
 end.
 end.

+ 4 - 3
CryptoLib/src/Asn1/ClpDerIA5String.pas

@@ -31,7 +31,8 @@ uses
   ClpIProxiedInterface,
   ClpIProxiedInterface,
   ClpCryptoLibTypes,
   ClpCryptoLibTypes,
   ClpIAsn1TaggedObject,
   ClpIAsn1TaggedObject,
-  ClpIDerIA5String;
+  ClpIDerIA5String,
+  ClpConverters;
 
 
 resourcestring
 resourcestring
   SIllegalObject = 'Illegal Object in GetInstance: %s';
   SIllegalObject = 'Illegal Object in GetInstance: %s';
@@ -140,7 +141,7 @@ end;
 
 
 function TDerIA5String.GetOctets: TCryptoLibByteArray;
 function TDerIA5String.GetOctets: TCryptoLibByteArray;
 begin
 begin
-  result := TEncoding.ASCII.GetBytes(UnicodeString(Str));
+  result := TConverters.ConvertStringToBytes(Str, TEncoding.ASCII);
 end;
 end;
 
 
 class function TDerIA5String.IsIA5String(const Str: String): Boolean;
 class function TDerIA5String.IsIA5String(const Str: String): Boolean;
@@ -180,7 +181,7 @@ end;
 
 
 constructor TDerIA5String.Create(const Str: TCryptoLibByteArray);
 constructor TDerIA5String.Create(const Str: TCryptoLibByteArray);
 begin
 begin
-  Create(String(TEncoding.ASCII.GetString(Str)), false);
+  Create(TConverters.ConvertBytesToString(Str, TEncoding.ASCII), false);
 end;
 end;
 
 
 constructor TDerIA5String.Create(const Str: String);
 constructor TDerIA5String.Create(const Str: String);

+ 4 - 3
CryptoLib/src/Asn1/ClpDerNumericString.pas

@@ -30,7 +30,8 @@ uses
   ClpIProxiedInterface,
   ClpIProxiedInterface,
   ClpCryptoLibTypes,
   ClpCryptoLibTypes,
   ClpIAsn1TaggedObject,
   ClpIAsn1TaggedObject,
-  ClpIDerNumericString;
+  ClpIDerNumericString,
+  ClpConverters;
 
 
 resourcestring
 resourcestring
   SIllegalObject = 'Illegal Object in GetInstance: %s';
   SIllegalObject = 'Illegal Object in GetInstance: %s';
@@ -142,7 +143,7 @@ end;
 
 
 function TDerNumericString.GetOctets: TCryptoLibByteArray;
 function TDerNumericString.GetOctets: TCryptoLibByteArray;
 begin
 begin
-  result := TEncoding.ASCII.GetBytes(UnicodeString(Str));
+  result := TConverters.ConvertStringToBytes(Str, TEncoding.ASCII);
 end;
 end;
 
 
 class function TDerNumericString.IsNumericString(const Str: String): Boolean;
 class function TDerNumericString.IsNumericString(const Str: String): Boolean;
@@ -179,7 +180,7 @@ end;
 
 
 constructor TDerNumericString.Create(const Str: TCryptoLibByteArray);
 constructor TDerNumericString.Create(const Str: TCryptoLibByteArray);
 begin
 begin
-  Create(String(TEncoding.ASCII.GetString(Str)), false);
+  Create(TConverters.ConvertBytesToString(Str, TEncoding.ASCII), false);
 end;
 end;
 
 
 constructor TDerNumericString.Create(const Str: String);
 constructor TDerNumericString.Create(const Str: String);

+ 4 - 3
CryptoLib/src/Asn1/ClpDerPrintableString.pas

@@ -31,7 +31,8 @@ uses
   ClpIProxiedInterface,
   ClpIProxiedInterface,
   ClpCryptoLibTypes,
   ClpCryptoLibTypes,
   ClpIAsn1TaggedObject,
   ClpIAsn1TaggedObject,
-  ClpIDerPrintableString;
+  ClpIDerPrintableString,
+  ClpConverters;
 
 
 resourcestring
 resourcestring
   SIllegalObject = 'Illegal Object in GetInstance: %s';
   SIllegalObject = 'Illegal Object in GetInstance: %s';
@@ -149,7 +150,7 @@ end;
 
 
 function TDerPrintableString.GetOctets: TCryptoLibByteArray;
 function TDerPrintableString.GetOctets: TCryptoLibByteArray;
 begin
 begin
-  result := TEncoding.ASCII.GetBytes(UnicodeString(Str));
+  result := TConverters.ConvertStringToBytes(Str, TEncoding.ASCII);
 end;
 end;
 
 
 class function TDerPrintableString.IsPrintableString(const Str: String)
 class function TDerPrintableString.IsPrintableString(const Str: String)
@@ -203,7 +204,7 @@ end;
 
 
 constructor TDerPrintableString.Create(const Str: TCryptoLibByteArray);
 constructor TDerPrintableString.Create(const Str: TCryptoLibByteArray);
 begin
 begin
-  Create(String(TEncoding.ASCII.GetString(Str)), false);
+  Create(TConverters.ConvertBytesToString(Str, TEncoding.ASCII), false);
 end;
 end;
 
 
 constructor TDerPrintableString.Create(const Str: String);
 constructor TDerPrintableString.Create(const Str: String);

+ 4 - 3
CryptoLib/src/Asn1/ClpDerT61String.pas

@@ -30,7 +30,8 @@ uses
   ClpIProxiedInterface,
   ClpIProxiedInterface,
   ClpCryptoLibTypes,
   ClpCryptoLibTypes,
   ClpIAsn1TaggedObject,
   ClpIAsn1TaggedObject,
-  ClpIDerT61String;
+  ClpIDerT61String,
+  ClpConverters;
 
 
 resourcestring
 resourcestring
   SIllegalObject = 'Illegal Object in GetInstance: %s';
   SIllegalObject = 'Illegal Object in GetInstance: %s';
@@ -113,7 +114,7 @@ end;
 
 
 function TDerT61String.GetOctets: TCryptoLibByteArray;
 function TDerT61String.GetOctets: TCryptoLibByteArray;
 begin
 begin
-  result := TEncoding.ASCII.GetBytes(UnicodeString(Str));
+  result := TConverters.ConvertStringToBytes(Str, TEncoding.ANSI);
 end;
 end;
 
 
 function TDerT61String.Asn1Equals(const asn1Object: IAsn1Object): Boolean;
 function TDerT61String.Asn1Equals(const asn1Object: IAsn1Object): Boolean;
@@ -132,7 +133,7 @@ end;
 
 
 constructor TDerT61String.Create(const Str: TCryptoLibByteArray);
 constructor TDerT61String.Create(const Str: TCryptoLibByteArray);
 begin
 begin
-  Create(String(TEncoding.ASCII.GetString(Str)));
+  Create(TConverters.ConvertBytesToString(Str, TEncoding.ANSI));
 end;
 end;
 
 
 constructor TDerT61String.Create(const Str: String);
 constructor TDerT61String.Create(const Str: String);

+ 4 - 10
CryptoLib/src/Asn1/ClpDerUtf8String.pas

@@ -30,7 +30,8 @@ uses
   ClpIProxiedInterface,
   ClpIProxiedInterface,
   ClpCryptoLibTypes,
   ClpCryptoLibTypes,
   ClpIAsn1TaggedObject,
   ClpIAsn1TaggedObject,
-  ClpIDerUtf8String;
+  ClpIDerUtf8String,
+  ClpConverters;
 
 
 resourcestring
 resourcestring
   SIllegalObject = 'Illegal Object in GetInstance: %s';
   SIllegalObject = 'Illegal Object in GetInstance: %s';
@@ -66,8 +67,6 @@ type
 
 
     function GetString(): String; override;
     function GetString(): String; override;
 
 
-    function GetOctets(): TCryptoLibByteArray; inline;
-
     procedure Encode(const derOut: IDerOutputStream); override;
     procedure Encode(const derOut: IDerOutputStream); override;
 
 
     /// <summary>
     /// <summary>
@@ -111,11 +110,6 @@ begin
   result := FStr;
   result := FStr;
 end;
 end;
 
 
-function TDerUtf8String.GetOctets: TCryptoLibByteArray;
-begin
-  result := TEncoding.ASCII.GetBytes(UnicodeString(Str));
-end;
-
 function TDerUtf8String.Asn1Equals(const asn1Object: IAsn1Object): Boolean;
 function TDerUtf8String.Asn1Equals(const asn1Object: IAsn1Object): Boolean;
 var
 var
   other: IDerUtf8String;
   other: IDerUtf8String;
@@ -132,7 +126,7 @@ end;
 
 
 constructor TDerUtf8String.Create(const Str: TCryptoLibByteArray);
 constructor TDerUtf8String.Create(const Str: TCryptoLibByteArray);
 begin
 begin
-  Create(String(TEncoding.UTF8.GetString(Str)));
+  Create(TConverters.ConvertBytesToString(Str, TEncoding.UTF8));
 end;
 end;
 
 
 constructor TDerUtf8String.Create(const Str: String);
 constructor TDerUtf8String.Create(const Str: String);
@@ -149,7 +143,7 @@ end;
 procedure TDerUtf8String.Encode(const derOut: IDerOutputStream);
 procedure TDerUtf8String.Encode(const derOut: IDerOutputStream);
 begin
 begin
   derOut.WriteEncoded(TAsn1Tags.Utf8String,
   derOut.WriteEncoded(TAsn1Tags.Utf8String,
-    TEncoding.UTF8.GetBytes(UnicodeString(Str)));
+    TConverters.ConvertStringToBytes(Str, TEncoding.UTF8));
 end;
 end;
 
 
 class function TDerUtf8String.GetInstance(const obj: TObject): IDerUtf8String;
 class function TDerUtf8String.GetInstance(const obj: TObject): IDerUtf8String;

+ 3 - 2
CryptoLib/src/Asn1/ClpDerVideotexString.pas

@@ -31,7 +31,8 @@ uses
   ClpIProxiedInterface,
   ClpIProxiedInterface,
   ClpIDerVideotexString,
   ClpIDerVideotexString,
   ClpIAsn1TaggedObject,
   ClpIAsn1TaggedObject,
-  ClpDerStringBase;
+  ClpDerStringBase,
+  ClpConverters;
 
 
 resourcestring
 resourcestring
   SIllegalObject = 'Illegal Object in GetInstance: %s';
   SIllegalObject = 'Illegal Object in GetInstance: %s';
@@ -193,7 +194,7 @@ end;
 
 
 function TDerVideotexString.GetString: String;
 function TDerVideotexString.GetString: String;
 begin
 begin
-  result := String(TEncoding.ASCII.GetString(mString));
+  result := TConverters.ConvertBytesToString(mString, TEncoding.ANSI)
 end;
 end;
 
 
 end.
 end.

+ 4 - 3
CryptoLib/src/Asn1/ClpDerVisibleString.pas

@@ -31,7 +31,8 @@ uses
   ClpIProxiedInterface,
   ClpIProxiedInterface,
   ClpCryptoLibTypes,
   ClpCryptoLibTypes,
   ClpIAsn1TaggedObject,
   ClpIAsn1TaggedObject,
-  ClpIDerVisibleString;
+  ClpIDerVisibleString,
+  ClpConverters;
 
 
 resourcestring
 resourcestring
   SIllegalObject = 'Illegal Object in GetInstance: %s';
   SIllegalObject = 'Illegal Object in GetInstance: %s';
@@ -115,7 +116,7 @@ end;
 
 
 function TDerVisibleString.GetOctets: TCryptoLibByteArray;
 function TDerVisibleString.GetOctets: TCryptoLibByteArray;
 begin
 begin
-  result := TEncoding.ASCII.GetBytes(UnicodeString(Str));
+  result := TConverters.ConvertStringToBytes(Str, TEncoding.ASCII);
 end;
 end;
 
 
 function TDerVisibleString.Asn1Equals(const asn1Object: IAsn1Object): Boolean;
 function TDerVisibleString.Asn1Equals(const asn1Object: IAsn1Object): Boolean;
@@ -139,7 +140,7 @@ end;
 
 
 constructor TDerVisibleString.Create(const Str: TCryptoLibByteArray);
 constructor TDerVisibleString.Create(const Str: TCryptoLibByteArray);
 begin
 begin
-  Create(String(TEncoding.ASCII.GetString(Str)));
+  Create(TConverters.ConvertBytesToString(Str, TEncoding.ASCII));
 end;
 end;
 
 
 constructor TDerVisibleString.Create(const Str: String);
 constructor TDerVisibleString.Create(const Str: String);

+ 1 - 1
CryptoLib/src/Crypto/Engines/ClpIESEngine.pas

@@ -584,7 +584,7 @@ begin
   // Create input to KDF.
   // Create input to KDF.
   if (System.Length(FV) <> 0) then
   if (System.Length(FV) <> 0) then
   begin
   begin
-    VZ := TArrayUtils.AddByteArray(FV, BigZ);
+    VZ := TArrayUtils.Concatenate(FV, BigZ);
     System.FillChar(BigZ[0], System.Length(BigZ) * System.SizeOf(Byte),
     System.FillChar(BigZ[0], System.Length(BigZ) * System.SizeOf(Byte),
       Byte(0));
       Byte(0));
     BigZ := VZ;
     BigZ := VZ;

+ 0 - 2
CryptoLib/src/Interfaces/ClpIDerUtf8String.pas

@@ -34,8 +34,6 @@ type
 
 
     property Str: String read GetStr;
     property Str: String read GetStr;
 
 
-    function GetOctets(): TCryptoLibByteArray;
-
   end;
   end;
 
 
 implementation
 implementation

+ 7 - 7
CryptoLib/src/Utils/ClpArrayUtils.pas

@@ -37,13 +37,13 @@ type
 
 
   public
   public
 
 
-    class function AddStringArray(const A, B: TCryptoLibStringArray)
-      : TCryptoLibStringArray; static;
+    class function Concatenate(const A, B: TCryptoLibStringArray)
+      : TCryptoLibStringArray; overload; static;
 
 
-    class function AddByteArray(const A, B: TCryptoLibByteArray)
+    class function Concatenate(const A, B: TCryptoLibByteArray)
       : TCryptoLibByteArray; overload; static; inline;
       : TCryptoLibByteArray; overload; static; inline;
 
 
-    class function AddByteArray(const A: TCryptoLibByteArray;
+    class function Concatenate(const A: TCryptoLibByteArray;
       const Others: TCryptoLibMatrixByteArray): TCryptoLibByteArray;
       const Others: TCryptoLibMatrixByteArray): TCryptoLibByteArray;
       overload; static;
       overload; static;
 
 
@@ -99,7 +99,7 @@ begin
   Result := newLength;
   Result := newLength;
 end;
 end;
 
 
-class function TArrayUtils.AddByteArray(const A, B: TCryptoLibByteArray)
+class function TArrayUtils.Concatenate(const A, B: TCryptoLibByteArray)
   : TCryptoLibByteArray;
   : TCryptoLibByteArray;
 var
 var
   l: Int32;
   l: Int32;
@@ -110,7 +110,7 @@ begin
   System.Move(B[0], Result[l], System.Length(B) * System.SizeOf(Byte));
   System.Move(B[0], Result[l], System.Length(B) * System.SizeOf(Byte));
 end;
 end;
 
 
-class function TArrayUtils.AddByteArray(const A: TCryptoLibByteArray;
+class function TArrayUtils.Concatenate(const A: TCryptoLibByteArray;
   const Others: TCryptoLibMatrixByteArray): TCryptoLibByteArray;
   const Others: TCryptoLibMatrixByteArray): TCryptoLibByteArray;
 var
 var
   len, Idx, Pos: Int32;
   len, Idx, Pos: Int32;
@@ -134,7 +134,7 @@ begin
   end;
   end;
 end;
 end;
 
 
-class function TArrayUtils.AddStringArray(const A, B: TCryptoLibStringArray)
+class function TArrayUtils.Concatenate(const A, B: TCryptoLibStringArray)
   : TCryptoLibStringArray;
   : TCryptoLibStringArray;
 var
 var
   i, l: Int32;
   i, l: Int32;

+ 30 - 8
CryptoLib/src/Utils/ClpConverters.pas

@@ -108,10 +108,13 @@ type
       a_out: TCryptoLibByteArray; a_index: Int32); overload; static; inline;
       a_out: TCryptoLibByteArray; a_index: Int32); overload; static; inline;
 
 
     class function ConvertStringToBytes(const a_in: String;
     class function ConvertStringToBytes(const a_in: String;
-      a_encoding: TEncoding): TCryptoLibByteArray; overload; static; inline;
+      a_encoding: TEncoding): TCryptoLibByteArray; overload; static;
 
 
-    class function ConvertHexStringToBytes(a_in: String): TCryptoLibByteArray;
-      static; inline;
+    class function ConvertBytesToString(const a_in: TCryptoLibByteArray;
+      const a_encoding: TEncoding): String; overload; static;
+
+    class function ConvertHexStringToBytes(const a_in: String)
+      : TCryptoLibByteArray; static; inline;
 
 
     class function ConvertBytesToHexString(const a_in: TCryptoLibByteArray;
     class function ConvertBytesToHexString(const a_in: TCryptoLibByteArray;
       a_group: Boolean): String; static;
       a_group: Boolean): String; static;
@@ -450,16 +453,19 @@ begin
   result := hex;
   result := hex;
 end;
 end;
 
 
-class function TConverters.ConvertHexStringToBytes(a_in: String)
+class function TConverters.ConvertHexStringToBytes(const a_in: String)
   : TCryptoLibByteArray;
   : TCryptoLibByteArray;
+var
+  l_in: string;
 begin
 begin
-  a_in := StringReplace(a_in, '-', '', [rfIgnoreCase, rfReplaceAll]);
+  l_in := a_in;
+  l_in := StringReplace(l_in, '-', '', [rfIgnoreCase, rfReplaceAll]);
 
 
 {$IFDEF DEBUG}
 {$IFDEF DEBUG}
-  System.Assert(System.length(a_in) and 1 = 0);
+  System.Assert(System.length(l_in) and 1 = 0);
 {$ENDIF DEBUG}
 {$ENDIF DEBUG}
-  System.SetLength(result, System.length(a_in) shr 1);
-  HexToBin(PChar(a_in), @result[0], System.length(result));
+  System.SetLength(result, System.length(l_in) shr 1);
+  HexToBin(PChar(l_in), @result[0], System.length(result));
 
 
 end;
 end;
 
 
@@ -479,6 +485,22 @@ begin
 {$ENDIF FPC}
 {$ENDIF FPC}
 end;
 end;
 
 
+class function TConverters.ConvertBytesToString(const a_in: TCryptoLibByteArray;
+  const a_encoding: TEncoding): String;
+begin
+
+  if a_encoding = Nil then
+  begin
+    raise EArgumentNilCryptoLibException.CreateRes(@SEncodingInstanceNil);
+  end;
+
+{$IFDEF FPC}
+  result := String(a_encoding.GetString(a_in));
+{$ELSE}
+  result := a_encoding.GetString(a_in);
+{$ENDIF FPC}
+end;
+
 class function TConverters.SplitString(const S: String; Delimiter: Char)
 class function TConverters.SplitString(const S: String; Delimiter: Char)
   : TCryptoLibStringArray;
   : TCryptoLibStringArray;
 var
 var

+ 2 - 1
CryptoLib/src/Utils/ClpCryptoLibTypes.pas

@@ -32,6 +32,7 @@ type
   PUInt64 = ^UInt64;
   PUInt64 = ^UInt64;
 {$ENDIF FPC}
 {$ENDIF FPC}
   ECryptoLibException = class(Exception);
   ECryptoLibException = class(Exception);
+  EInvalidCastCryptoLibException = class(EInvalidCast);
   EArithmeticCryptoLibException = class(ECryptoLibException);
   EArithmeticCryptoLibException = class(ECryptoLibException);
   EInvalidOperationCryptoLibException = class(ECryptoLibException);
   EInvalidOperationCryptoLibException = class(ECryptoLibException);
   EInvalidParameterCryptoLibException = class(ECryptoLibException);
   EInvalidParameterCryptoLibException = class(ECryptoLibException);
@@ -45,7 +46,7 @@ type
   EFormatCryptoLibException = class(ECryptoLibException);
   EFormatCryptoLibException = class(ECryptoLibException);
   ENotImplementedCryptoLibException = class(ECryptoLibException);
   ENotImplementedCryptoLibException = class(ECryptoLibException);
   ENotSupportedCryptoLibException = class(ECryptoLibException);
   ENotSupportedCryptoLibException = class(ECryptoLibException);
-  EEndOfStreamCryptoLibException = class(ECryptoLibException);
+  EEndOfStreamCryptoLibException = class(EIOCryptoLibException);
   EStreamOverflowCryptoLibException = class(ECryptoLibException);
   EStreamOverflowCryptoLibException = class(ECryptoLibException);
   EAsn1CryptoLibException = class(ECryptoLibException);
   EAsn1CryptoLibException = class(ECryptoLibException);
   EAsn1ParsingCryptoLibException = class(ECryptoLibException);
   EAsn1ParsingCryptoLibException = class(ECryptoLibException);

+ 32 - 2
README.md

@@ -1,11 +1,41 @@
 # CryptoLib4Pascal
 # CryptoLib4Pascal
 CryptoLib4Pascal is a Cryptographic Package for Delphi/FreePascal Compilers that provides at the moment support for creating, signing and verifying DSA, ECDSA, ECNR and ECSchnorr signatures using various curves and hashes, AES Encryption and Decryption (With various modes and paddings) and ECIES.
 CryptoLib4Pascal is a Cryptographic Package for Delphi/FreePascal Compilers that provides at the moment support for creating, signing and verifying DSA, ECDSA, ECNR and ECSchnorr signatures using various curves and hashes, AES Encryption and Decryption (With various modes and paddings) and ECIES.
 
 
-**Supported Algorithms:**
+**Supported Elliptic Curves:**
+
+Curves are grouped in three different classes.
+1. NistNamed Curves
+2. SecNamed Curves (these are bare generic implementation of curves (at the moment, not as optimized as their CustomNamed Curves Counterparts))
+3. CustomNamed Curves. (these are specially optimized implementations of curves found in the previous two.)
+
+**NistNamed Curves:**
+```
+K-283, B-283, B-409, B-233, K-163, P-521, K-233, K-409, P-192, P-384, P-224, P-256, B-163, B-571, K-571.
+```
+
+**SecNamed Curves:**
+```
+sect131r1, secp160k1, sect193r1, secp384r1, secp128r1, sect163k1, sect193r2, sect239k1, sect409r1, secp256r1,
+secp521r1, sect131r2, secp112r1, sect113r2, sect163r1, secp224k1, secp224r1, sect283k1, sect233k1, sect283r1,
+sect409k1, sect571k1, secp192r1, sect233r1, secp256k1, sect571r1, secp192k1, secp160r1, sect113r1, secp160r2,
+secp112r2, sect163r2, secp128r2.
+```
+
+**CustomNamed Curves:**
 
 
-    Supported Elliptic Curves at the moment are secp256k1, sect283k1, secp384r1 and secp521r1.
+| curve name | alias(es) |
+|--------|--------|
+|  **secp256k1**      |        |
+|  **secp256r1**      |   **P-256**    |
+|  **secp384r1**      |   **P-384**    |
+|  **secp521r1**      |   **P-521**    |
+|  **sect283k1**      |   **K-283**    |
+
+
+**Supported Algorithms:**
     
     
     Supported signing algorithms 
     Supported signing algorithms 
+    
     ECDSA
     ECDSA
     NONEwithECDSA, SHA-1withECDSA, SHA-224withECDSA, 
     NONEwithECDSA, SHA-1withECDSA, SHA-224withECDSA, 
     SHA-256withECDSA, SHA-384withECDSA, SHA-512withECDSA and RIPEMD160withECDSA
     SHA-256withECDSA, SHA-384withECDSA, SHA-512withECDSA and RIPEMD160withECDSA