Browse Source

some refactorings.

Ugochukwu Mmaduekwe 7 years ago
parent
commit
3b4ff2409f
29 changed files with 164 additions and 110 deletions
  1. 12 10
      CryptoLib.Samples/src/UsageExamples.pas
  2. 2 1
      CryptoLib.Tests/src/Asn1/EqualsAndHashCodeTests.pas
  3. 14 12
      CryptoLib.Tests/src/Crypto/DSATests.pas
  4. 2 1
      CryptoLib.Tests/src/Crypto/HMacTests.pas
  5. 3 2
      CryptoLib.Tests/src/Crypto/MD5HMacTests.pas
  6. 23 14
      CryptoLib.Tests/src/Crypto/Pkcs5Tests.pas
  7. 3 2
      CryptoLib.Tests/src/Crypto/RIPEMD128HMacTests.pas
  8. 3 2
      CryptoLib.Tests/src/Crypto/RIPEMD160HMacTests.pas
  9. 3 2
      CryptoLib.Tests/src/Crypto/SHA1HMacTests.pas
  10. 3 2
      CryptoLib.Tests/src/Crypto/SHA224HMacTests.pas
  11. 3 2
      CryptoLib.Tests/src/Crypto/SHA256HMacTests.pas
  12. 3 2
      CryptoLib.Tests/src/Crypto/SHA384HMacTests.pas
  13. 3 2
      CryptoLib.Tests/src/Crypto/SHA512HMacTests.pas
  14. 4 3
      CryptoLib.Tests/src/Math/ECNRTests.pas
  15. 2 1
      CryptoLib.Tests/src/Math/IESCipherTests.pas
  16. 4 3
      CryptoLib.Tests/src/Others/ECDsa5Tests.pas
  17. 10 5
      CryptoLib.Tests/src/Others/ECSchnorrTests.pas
  18. 3 2
      CryptoLib.Tests/src/Others/NamedCurveTests.pas
  19. 4 3
      CryptoLib/src/Asn1/ClpDerGeneralString.pas
  20. 3 2
      CryptoLib/src/Asn1/ClpDerGraphicString.pas
  21. 4 3
      CryptoLib/src/Asn1/ClpDerIA5String.pas
  22. 4 3
      CryptoLib/src/Asn1/ClpDerNumericString.pas
  23. 4 3
      CryptoLib/src/Asn1/ClpDerPrintableString.pas
  24. 4 3
      CryptoLib/src/Asn1/ClpDerT61String.pas
  25. 4 10
      CryptoLib/src/Asn1/ClpDerUtf8String.pas
  26. 3 2
      CryptoLib/src/Asn1/ClpDerVideotexString.pas
  27. 4 3
      CryptoLib/src/Asn1/ClpDerVisibleString.pas
  28. 0 2
      CryptoLib/src/Interfaces/ClpIDerUtf8String.pas
  29. 30 8
      CryptoLib/src/Utils/ClpConverters.pas

+ 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);

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

@@ -34,6 +34,7 @@ uses
 {$ENDIF FPC}
   ClpHex,
   ClpCryptoLibTypes,
+  ClpConverters,
   ClpIProxiedInterface,
   ClpBerOctetString,
   ClpBerSequence,
@@ -118,7 +119,7 @@ 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.ASCII)),
 
     TBerTaggedObject.Create(0, TDerPrintableString.Create('hello world')
     as IDerPrintableString),

+ 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));
 //

+ 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.ASCII);
 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.ASCII);
 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.ASCII));
 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.ASCII)
 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);

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

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

+ 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