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

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

@@ -36,7 +36,7 @@
         <PackageName Value="FCL"/>
       </Item4>
     </RequiredPackages>
-    <Units Count="42">
+    <Units Count="47">
       <Unit0>
         <Filename Value="CryptoLib.lpr"/>
         <IsPartOfProject Value="True"/>
@@ -206,6 +206,26 @@
         <Filename Value="..\src\Math\EC\Custom\Sec\SecP256R1FieldTests.pas"/>
         <IsPartOfProject Value="True"/>
       </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>
   </ProjectOptions>
   <CompilerOptions>

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

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

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

@@ -17,6 +17,9 @@
       <Version Value="2"/>
     </PublishOptions>
     <RunParams>
+      <local>
+        <CommandLineParams Value="--format=plain --all --progress"/>
+      </local>
       <FormatVersion Value="2"/>
       <Modes Count="1">
         <Mode0 Name="default">
@@ -34,7 +37,7 @@
         <PackageName Value="FCL"/>
       </Item2>
     </RequiredPackages>
-    <Units Count="42">
+    <Units Count="47">
       <Unit0>
         <Filename Value="CryptoLibConsole.lpr"/>
         <IsPartOfProject Value="True"/>
@@ -203,6 +206,26 @@
         <Filename Value="..\src\Math\EC\Custom\Sec\SecP256R1FieldTests.pas"/>
         <IsPartOfProject Value="True"/>
       </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>
   </ProjectOptions>
   <CompilerOptions>

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

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

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

@@ -60,12 +60,11 @@ type
   var
     FimpData, FcertData, FsampleData: TCryptoLibByteArray;
 
-    procedure TestTaggedObject();
-
   protected
     procedure SetUp; override;
     procedure TearDown; override;
   published
+    procedure TestTaggedObject();
     procedure TestDerApplicationSpecific;
 
   end;
@@ -110,7 +109,6 @@ var
   appSpec, tagged, certObj: IDerApplicationSpecific;
   recVal, val: IDerInteger;
 begin
-  TestTaggedObject();
 
   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}
   ClpHex,
   ClpCryptoLibTypes,
+  ClpConverters,
   ClpIProxiedInterface,
   ClpBerOctetString,
   ClpBerSequence,
@@ -118,7 +119,8 @@ begin
     TDerUtf8String.Create('hello world'),
     TDerVisibleString.Create('hello world'),
     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')
     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(
+			'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',
+//		 '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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,
   ClpFixedSecureRandom,
   ClpIFixedSecureRandom,
+  ClpConverters,
   ClpCryptoLibTypes;
 
 type
@@ -205,7 +206,8 @@ begin
 
   if (not TArrayUtils.AreEqual(sigBytes, sig)) then
   begin
-    Fail(String(TEncoding.UTF8.GetString(&message)) + ' signature incorrect');
+    Fail(TConverters.ConvertBytesToString(&message, TEncoding.UTF8) +
+      ' signature incorrect');
   end;
 
   sgr.Init(false, vKey);
@@ -214,7 +216,8 @@ begin
 
   if (not(sgr.VerifySignature(sigBytes))) then
   begin
-    Fail(String(TEncoding.UTF8.GetString(&message)) + ' verification failed');
+    Fail(TConverters.ConvertBytesToString(&message, TEncoding.UTF8) +
+      ' verification failed');
   end;
 end;
 
@@ -970,7 +973,7 @@ begin
   sgr.Init(true, TParametersWithRandom.Create(sKey, k)
     as IParametersWithRandom);
 
-  &message := TEncoding.ASCII.GetBytes('abc');
+  &message := TConverters.ConvertStringToBytes('abc', TEncoding.ASCII);
 
   sgr.BlockUpdate(&message, 0, System.Length(&message));
 
@@ -1429,16 +1432,13 @@ begin
 
   sgr := TSignerUtilities.GetSigner('ECDSA');
 
-  // KeyFactory f = KeyFactory.GetInstance('ECDSA');
-  // PrivateKey sKey = f.generatePrivate(priKey);
-  // PublicKey vKey = f.generatePublic(pubKey);
   sKey := priKey;
   vKey := pubKey;
 
   sgr.Init(true, TParametersWithRandom.Create(sKey, k)
     as IParametersWithRandom);
 
-  &message := TEncoding.ASCII.GetBytes('abc');
+  &message := TConverters.ConvertStringToBytes('abc', TEncoding.ASCII);
 
   sgr.BlockUpdate(&message, 0, System.Length(&message));
 
@@ -1691,7 +1691,7 @@ begin
   sgr.Init(true, TParametersWithRandom.Create(sKey, k)
     as IParametersWithRandom);
 
-  &message := TEncoding.ASCII.GetBytes('abc');
+  &message := TConverters.ConvertStringToBytes('abc', TEncoding.ASCII);
 
   sgr.BlockUpdate(&message, 0, System.Length(&message));
 
@@ -1853,20 +1853,22 @@ begin
 
   sgr := TSignerUtilities.GetSigner('NONEwithECDSA');
 
-  &message := TEncoding.UTF8.GetBytes('abc');
+  &message := TConverters.ConvertStringToBytes('abc', TEncoding.UTF8);
   sig := THex.Decode
     ('3040021e2cb7f36803ebb9c427c58d8265f11fc5084747133078fc279de874fbecb0021e64cb19604be06c57e761b3de5518f71de0f6e0cd2df677cec8a6ffcb690d');
 
   DoCheckMessage(sgr, priKey, pubKey, &message, sig);
 
-  &message := TEncoding.UTF8.GetBytes('abcdefghijklmnopqrstuvwxyz');
+  &message := TConverters.ConvertStringToBytes('abcdefghijklmnopqrstuvwxyz',
+    TEncoding.UTF8);
   sig := THex.Decode
     ('3040021e2cb7f36803ebb9c427c58d8265f11fc5084747133078fc279de874fbecb0021e43fd65b3363d76aabef8630572257dbb67c82818ad9fad31256539b1b02c');
 
   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
     ('3040021e2cb7f36803ebb9c427c58d8265f11fc5084747133078fc279de874fbecb0021e7d5be84b22937a1691859a3c6fe45ed30b108574431d01b34025825ec17a');
 

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

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

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

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

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

@@ -37,6 +37,7 @@ uses
   ClpDigestUtilities,
   ClpHex,
   ClpArrayUtils,
+  ClpConverters,
   ClpCryptoLibTypes;
 
 type
@@ -100,7 +101,8 @@ begin
   SaltBytes := THex.Decode('1234567878563412');
 
   PasswordString := 'password';
-  PasswordBytes := TEncoding.UTF8.GetBytes(UnicodeString(PasswordString));
+  PasswordBytes := TConverters.ConvertStringToBytes(PasswordString,
+    TEncoding.UTF8);
   generator := TPkcs5S2ParametersGenerator.Create
     (TDigestUtilities.GetDigest('SHA-1'));
 
@@ -114,7 +116,8 @@ begin
 
   PasswordString :=
     '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);
 
@@ -140,10 +143,11 @@ begin
     (TDigestUtilities.GetDigest('SHA-1'));
 
   PasswordString := 'password';
-  PasswordBytes := TEncoding.UTF8.GetBytes(UnicodeString(PasswordString));
+  PasswordBytes := TConverters.ConvertStringToBytes(PasswordString,
+    TEncoding.UTF8);
 
   SaltString := 'salt';
-  SaltBytes := TEncoding.UTF8.GetBytes(UnicodeString(SaltString));
+  SaltBytes := TConverters.ConvertStringToBytes(SaltString, TEncoding.UTF8);
 
   // 1
 
@@ -218,10 +222,11 @@ begin
   // 5
 
   PasswordString := 'passwordPASSWORDpassword';
-  PasswordBytes := TEncoding.UTF8.GetBytes(UnicodeString(PasswordString));
+  PasswordBytes := TConverters.ConvertStringToBytes(PasswordString,
+    TEncoding.UTF8);
 
   SaltString := 'saltSALTsaltSALTsaltSALTsaltSALTsalt';
-  SaltBytes := TEncoding.UTF8.GetBytes(UnicodeString(SaltString));
+  SaltBytes := TConverters.ConvertStringToBytes(SaltString, TEncoding.UTF8);
 
   iteration_count := 4096;
 
@@ -243,10 +248,11 @@ begin
 
   PasswordString := 'pass' + Char(0) + 'word';
   // 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)
-  SaltBytes := TEncoding.UTF8.GetBytes(UnicodeString(SaltString));
+  SaltBytes := TConverters.ConvertStringToBytes(SaltString, TEncoding.UTF8);
 
   iteration_count := 4096;
 
@@ -279,10 +285,11 @@ begin
     (TDigestUtilities.GetDigest('SHA-256'));
 
   PasswordString := 'password';
-  PasswordBytes := TEncoding.UTF8.GetBytes(UnicodeString(PasswordString));
+  PasswordBytes := TConverters.ConvertStringToBytes(PasswordString,
+    TEncoding.UTF8);
 
   SaltString := 'salt';
-  SaltBytes := TEncoding.UTF8.GetBytes(UnicodeString(SaltString));
+  SaltBytes := TConverters.ConvertStringToBytes(SaltString, TEncoding.UTF8);
 
   // 1
 
@@ -361,10 +368,11 @@ begin
   // 5
 
   PasswordString := 'passwordPASSWORDpassword';
-  PasswordBytes := TEncoding.UTF8.GetBytes(UnicodeString(PasswordString));
+  PasswordBytes := TConverters.ConvertStringToBytes(PasswordString,
+    TEncoding.UTF8);
 
   SaltString := 'saltSALTsaltSALTsaltSALTsaltSALTsalt';
-  SaltBytes := TEncoding.UTF8.GetBytes(UnicodeString(SaltString));
+  SaltBytes := TConverters.ConvertStringToBytes(SaltString, TEncoding.UTF8);
 
   iteration_count := 4096;
 
@@ -388,10 +396,11 @@ begin
 
   PasswordString := 'pass' + Char(0) + 'word';
   // 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)
-  SaltBytes := TEncoding.UTF8.GetBytes(UnicodeString(SaltString));
+  SaltBytes := TConverters.ConvertStringToBytes(SaltString, TEncoding.UTF8);
 
   iteration_count := 4096;
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@@ -108,10 +108,13 @@ type
       a_out: TCryptoLibByteArray; a_index: Int32); overload; static; inline;
 
     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;
       a_group: Boolean): String; static;
@@ -450,16 +453,19 @@ begin
   result := hex;
 end;
 
-class function TConverters.ConvertHexStringToBytes(a_in: String)
+class function TConverters.ConvertHexStringToBytes(const a_in: String)
   : TCryptoLibByteArray;
+var
+  l_in: string;
 begin
-  a_in := StringReplace(a_in, '-', '', [rfIgnoreCase, rfReplaceAll]);
+  l_in := a_in;
+  l_in := StringReplace(l_in, '-', '', [rfIgnoreCase, rfReplaceAll]);
 
 {$IFDEF DEBUG}
-  System.Assert(System.length(a_in) and 1 = 0);
+  System.Assert(System.length(l_in) and 1 = 0);
 {$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;
 
@@ -479,6 +485,22 @@ begin
 {$ENDIF FPC}
 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)
   : TCryptoLibStringArray;
 var

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

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

+ 32 - 2
README.md

@@ -1,11 +1,41 @@
 # 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.
 
-**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 
+    
     ECDSA
     NONEwithECDSA, SHA-1withECDSA, SHA-224withECDSA, 
     SHA-256withECDSA, SHA-384withECDSA, SHA-512withECDSA and RIPEMD160withECDSA