Explorar el Código

update some utilities

Ugochukwu Mmaduekwe hace 2 semanas
padre
commit
6c0fd5306f
Se han modificado 100 ficheros con 1115 adiciones y 1397 borrados
  1. 4 4
      CryptoLib.Samples/src/UsageExamples.pas
  2. 3 4
      CryptoLib.Tests/Delphi.Tests/CryptoLib.Tests.dpr
  3. 1 1
      CryptoLib.Tests/src/Asn1/PKCS/Pkcs10CertRequestTests.pas
  4. 1 1
      CryptoLib.Tests/src/Asn1/PrivateKeyInfoTests.pas
  5. 2 2
      CryptoLib.Tests/src/Asn1/X509/DeltaCertificateTests.pas
  6. 1 1
      CryptoLib.Tests/src/Asn1/X509/GeneralNameTests.pas
  7. 1 1
      CryptoLib.Tests/src/Asn1/X509/SubjectKeyIdentifierTests.pas
  8. 1 1
      CryptoLib.Tests/src/Asn1/X509/X509AltTests.pas
  9. 1 1
      CryptoLib.Tests/src/Asn1/X509/X509ExtensionsTests.pas
  10. 1 1
      CryptoLib.Tests/src/Asn1/X509/X509NameTests.pas
  11. 3 3
      CryptoLib.Tests/src/Crypto/MD5HMacTests.pas
  12. 2 2
      CryptoLib.Tests/src/Crypto/PssTests.pas
  13. 3 3
      CryptoLib.Tests/src/Crypto/RIPEMD128HMacTests.pas
  14. 3 3
      CryptoLib.Tests/src/Crypto/RIPEMD160HMacTests.pas
  15. 5 5
      CryptoLib.Tests/src/Crypto/RSATests.pas
  16. 3 3
      CryptoLib.Tests/src/Crypto/SHA1HMacTests.pas
  17. 3 3
      CryptoLib.Tests/src/Crypto/SHA224HMacTests.pas
  18. 3 3
      CryptoLib.Tests/src/Crypto/SHA256HMacTests.pas
  19. 3 3
      CryptoLib.Tests/src/Crypto/SHA384HMacTests.pas
  20. 3 3
      CryptoLib.Tests/src/Crypto/SHA512HMacTests.pas
  21. 2 2
      CryptoLib.Tests/src/Crypto/X931SignerTests.pas
  22. 4 4
      CryptoLib.Tests/src/CryptoLibTestBase.pas
  23. 2 2
      CryptoLib/src/Asn1/ClpAsn1Dumper.pas
  24. 102 101
      CryptoLib/src/Asn1/ClpAsn1Objects.pas
  25. 5 5
      CryptoLib/src/Asn1/ClpAsn1Streams.pas
  26. 3 3
      CryptoLib/src/Asn1/ClpAsn1Utilities.pas
  27. 3 3
      CryptoLib/src/Asn1/Pkcs/ClpPkcsAsn1Objects.pas
  28. 6 5
      CryptoLib/src/Asn1/X500/Style/ClpIetfUtilities.pas
  29. 45 24
      CryptoLib/src/Asn1/X509/ClpX509Asn1Objects.pas
  30. 2 2
      CryptoLib/src/Asn1/X509/ClpX509ExtensionUtilities.pas
  31. 4 4
      CryptoLib/src/Crypto/Ciphers/ClpBlockCipherModes.pas
  32. 2 2
      CryptoLib/src/Crypto/Ciphers/ClpBufferedBlockCipher.pas
  33. 2 2
      CryptoLib/src/Crypto/Ciphers/ClpCipherUtilities.pas
  34. 4 4
      CryptoLib/src/Crypto/Engines/ClpAesEngine.pas
  35. 4 4
      CryptoLib/src/Crypto/Engines/ClpAesLightEngine.pas
  36. 3 3
      CryptoLib/src/Crypto/Engines/ClpBlowfishEngine.pas
  37. 5 5
      CryptoLib/src/Crypto/Engines/ClpChaChaEngine.pas
  38. 8 8
      CryptoLib/src/Crypto/Engines/ClpIESEngine.pas
  39. 4 4
      CryptoLib/src/Crypto/Engines/ClpPascalCoinIESEngine.pas
  40. 3 3
      CryptoLib/src/Crypto/Engines/ClpRijndaelEngine.pas
  41. 6 6
      CryptoLib/src/Crypto/Engines/ClpSalsa20Engine.pas
  42. 8 8
      CryptoLib/src/Crypto/Engines/ClpSpeckEngine.pas
  43. 8 8
      CryptoLib/src/Crypto/Engines/ClpSpeckLegacyEngine.pas
  44. 5 5
      CryptoLib/src/Crypto/Engines/ClpXSalsa20Engine.pas
  45. 2 2
      CryptoLib/src/Crypto/Generators/ClpArgon2ParametersGenerator.pas
  46. 2 2
      CryptoLib/src/Crypto/Generators/ClpGeneratorUtilities.pas
  47. 3 3
      CryptoLib/src/Crypto/Generators/ClpPkcs5S2ParametersGenerator.pas
  48. 3 3
      CryptoLib/src/Crypto/Generators/ClpScryptParametersGenerator.pas
  49. 8 7
      CryptoLib/src/Crypto/Macs/ClpMacUtilities.pas
  50. 2 2
      CryptoLib/src/Crypto/Operators/ClpDefaultVerifierResult.pas
  51. 3 3
      CryptoLib/src/Crypto/Parameters/ClpDHValidationParameters.pas
  52. 3 3
      CryptoLib/src/Crypto/Parameters/ClpDsaValidationParameters.pas
  53. 3 3
      CryptoLib/src/Crypto/Parameters/ClpEd25519PrivateKeyParameters.pas
  54. 3 3
      CryptoLib/src/Crypto/Parameters/ClpEd25519PublicKeyParameters.pas
  55. 2 2
      CryptoLib/src/Crypto/Parameters/ClpKeyParameter.pas
  56. 3 3
      CryptoLib/src/Crypto/Parameters/ClpParametersWithIV.pas
  57. 3 3
      CryptoLib/src/Crypto/Parameters/ClpX25519PrivateKeyParameters.pas
  58. 3 3
      CryptoLib/src/Crypto/Parameters/ClpX25519PublicKeyParameters.pas
  59. 6 5
      CryptoLib/src/Crypto/Randoms/ClpSecureRandom.pas
  60. 15 6
      CryptoLib/src/Crypto/Signers/ClpECSchnorrSipaSigner.pas
  61. 2 2
      CryptoLib/src/Crypto/Signers/ClpGenericSigner.pas
  62. 4 4
      CryptoLib/src/Crypto/Signers/ClpRsaDigestSigner.pas
  63. 24 24
      CryptoLib/src/Crypto/Signers/ClpSignerUtilities.pas
  64. 5 5
      CryptoLib/src/Crypto/Signers/ClpX931Signer.pas
  65. 3 3
      CryptoLib/src/Crypto/Signers/SignerCalculators/ClpHMacDsaKCalculator.pas
  66. 4 4
      CryptoLib/src/Crypto/Signers/SignerEncodings/ClpSignersEncodings.pas
  67. 467 0
      CryptoLib/src/GeneralUtilities/ClpArrayUtilities.pas
  68. 0 566
      CryptoLib/src/GeneralUtilities/ClpArrayUtils.pas
  69. 14 33
      CryptoLib/src/GeneralUtilities/ClpCollectionUtilities.pas
  70. 4 3
      CryptoLib/src/GeneralUtilities/ClpCryptoLibComparers.pas
  71. 3 2
      CryptoLib/src/GeneralUtilities/ClpEnumUtilities.pas
  72. 85 0
      CryptoLib/src/GeneralUtilities/ClpPlatformUtilities.pas
  73. 77 54
      CryptoLib/src/GeneralUtilities/ClpStringUtilities.pas
  74. 0 233
      CryptoLib/src/GeneralUtilities/ClpStringUtils.pas
  75. 0 75
      CryptoLib/src/GeneralUtilities/ClpTimes.pas
  76. 1 1
      CryptoLib/src/Interfaces/Asn1/X509/ClpIX509Asn1Objects.pas
  77. 3 3
      CryptoLib/src/Math/ClpBigInteger.pas
  78. 4 4
      CryptoLib/src/Math/EC/ClpECC.pas
  79. 2 2
      CryptoLib/src/Math/EC/Custom/Djb/ClpCurve25519Custom.pas
  80. 2 2
      CryptoLib/src/Math/EC/Custom/Sec/ClpSecP256K1Custom.pas
  81. 2 2
      CryptoLib/src/Math/EC/Custom/Sec/ClpSecP256R1Custom.pas
  82. 2 2
      CryptoLib/src/Math/EC/Custom/Sec/ClpSecP384R1Custom.pas
  83. 2 2
      CryptoLib/src/Math/EC/Custom/Sec/ClpSecP521R1Custom.pas
  84. 2 2
      CryptoLib/src/Math/EC/Custom/Sec/ClpSecT283Custom.pas
  85. 2 2
      CryptoLib/src/Math/EC/Rfc7748/ClpX25519.pas
  86. 2 2
      CryptoLib/src/Math/EC/Rfc7748/ClpX25519Field.pas
  87. 5 5
      CryptoLib/src/Math/EC/Rfc8032/ClpEd25519.pas
  88. 3 3
      CryptoLib/src/Math/Field/ClpGF2Polynomial.pas
  89. 3 3
      CryptoLib/src/Math/Raw/ClpNat.pas
  90. 2 2
      CryptoLib/src/Math/Raw/ClpNat192.pas
  91. 2 2
      CryptoLib/src/Math/Raw/ClpNat256.pas
  92. 8 7
      CryptoLib/src/Net/ClpIPAddressUtilities.pas
  93. 8 8
      CryptoLib/src/Pem/ClpPemObjects.pas
  94. 5 5
      CryptoLib/src/Rngs/Providers/ClpAesRandomProvider.pas
  95. 2 2
      CryptoLib/src/Rngs/Providers/ClpAppleRandomProvider.pas
  96. 2 2
      CryptoLib/src/Rngs/Providers/ClpGenericBSDRandomProvider.pas
  97. 2 2
      CryptoLib/src/Rngs/Providers/ClpLinuxRandomProvider.pas
  98. 2 2
      CryptoLib/src/Rngs/Providers/ClpSolarisRandomProvider.pas
  99. 2 2
      CryptoLib/src/Rngs/Providers/ClpUnixRandomProvider.pas
  100. 2 2
      CryptoLib/src/Rngs/Providers/ClpWindowsRandomProvider.pas

+ 4 - 4
CryptoLib.Samples/src/UsageExamples.pas

@@ -79,7 +79,7 @@ uses
   ClpCipherUtilities,
   ClpGeneratorUtilities,
   ClpIAsymmetricCipherKeyPairGenerator,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpEncoders,
   // ClpSecNamedCurves,
   ClpCustomNamedCurves,
@@ -255,7 +255,7 @@ 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, TConverters.ConvertStringToBytes(SALT_MAGIC,
+    (TArrayUtilities.AreEqual<Byte>(Chopped, TConverters.ConvertStringToBytes(SALT_MAGIC,
     TEncoding.UTF8))) then
   begin
     System.Move(CipherText[SALT_MAGIC_LEN], SaltBytes[0], SALT_SIZE);
@@ -351,7 +351,7 @@ begin
   if TUsageExamples.AES256CBCPascalCoinDecrypt(CipherText, PasswordBytes,
     DecryptedCipherText) then
   begin
-    if TArrayUtils.AreEqual(PlainText, DecryptedCipherText) then
+    if TArrayUtilities.AreEqual<Byte>(PlainText, DecryptedCipherText) then
     begin
       Writeln('AES_256_CBC PascalCoin Compatability Encrypt, Decrypt Was Successful '
         + sLineBreak);
@@ -508,7 +508,7 @@ begin
   if TUsageExamples.ECIESPascalCoinDecrypt(KeyPair.Private, CipherText,
     DecryptedCipherText) then
   begin
-    if TArrayUtils.AreEqual(PlainText, DecryptedCipherText) then
+    if TArrayUtilities.AreEqual<Byte>(PlainText, DecryptedCipherText) then
     begin
       Writeln('ECIES PascalCoin Compatability Encrypt, Decrypt Was Successful '
         + sLineBreak);

+ 3 - 4
CryptoLib.Tests/Delphi.Tests/CryptoLib.Tests.dpr

@@ -32,7 +32,7 @@ uses
   ClpAgreementUtilities in '..\..\CryptoLib\src\Crypto\Agreements\ClpAgreementUtilities.pas',
   ClpAlgorithmIdentifier in '..\..\CryptoLib\src\Asn1\X509\ClpAlgorithmIdentifier.pas',
   ClpArgon2ParametersGenerator in '..\..\CryptoLib\src\Crypto\Generators\ClpArgon2ParametersGenerator.pas',
-  ClpArrayUtils in '..\..\CryptoLib\src\GeneralUtilities\ClpArrayUtils.pas',
+  ClpArrayUtilities in '..\..\CryptoLib\src\GeneralUtilities\ClpArrayUtilities.pas',
   ClpAsn1DigestFactory in '..\..\CryptoLib\src\Crypto\Operators\ClpAsn1DigestFactory.pas',
   ClpAsn1Dumper in '..\..\CryptoLib\src\Asn1\ClpAsn1Dumper.pas',
   ClpAsn1Objects in '..\..\CryptoLib\src\Asn1\ClpAsn1Objects.pas',
@@ -409,7 +409,7 @@ uses
   ClpPkcs5S2ParametersGenerator in '..\..\CryptoLib\src\Crypto\Generators\ClpPkcs5S2ParametersGenerator.pas',
   ClpPkcsAsn1Objects in '..\..\CryptoLib\src\Asn1\Pkcs\ClpPkcsAsn1Objects.pas',
   ClpPkcsObjectIdentifiers in '..\..\CryptoLib\src\Asn1\Pkcs\ClpPkcsObjectIdentifiers.pas',
-  ClpPlatform in '..\..\CryptoLib\src\GeneralUtilities\ClpPlatform.pas',
+  ClpPlatformUtilities in '..\..\CryptoLib\src\GeneralUtilities\ClpPlatformUtilities.pas',
   ClpPrehash in '..\..\CryptoLib\src\Crypto\Digests\ClpPrehash.pas',
   ClpPrimeField in '..\..\CryptoLib\src\Math\Field\ClpPrimeField.pas',
   ClpPrivateKeyFactory in '..\..\CryptoLib\src\Factories\ClpPrivateKeyFactory.pas',
@@ -456,11 +456,10 @@ uses
   ClpSpeckLegacyEngine in '..\..\CryptoLib\src\Crypto\Engines\ClpSpeckLegacyEngine.pas',
   ClpStreams in '..\..\CryptoLib\src\IO\ClpStreams.pas',
   ClpStreamUtilities in '..\..\CryptoLib\src\IO\ClpStreamUtilities.pas',
-  ClpStringUtils in '..\..\CryptoLib\src\GeneralUtilities\ClpStringUtils.pas',
+  ClpStringUtilities in '..\..\CryptoLib\src\GeneralUtilities\ClpStringUtilities.pas',
   ClpSubjectPublicKeyInfoFactory in '..\..\CryptoLib\src\Factories\ClpSubjectPublicKeyInfoFactory.pas',
   ClpTeleTrusTNamedCurves in '..\..\CryptoLib\src\Asn1\TeleTrust\ClpTeleTrusTNamedCurves.pas',
   ClpTeleTrusTObjectIdentifiers in '..\..\CryptoLib\src\Asn1\TeleTrust\ClpTeleTrusTObjectIdentifiers.pas',
-  ClpTimes in '..\..\CryptoLib\src\GeneralUtilities\ClpTimes.pas',
   ClpTnaf in '..\..\CryptoLib\src\Math\EC\Abc\ClpTnaf.pas',
   ClpV1TbsCertificateGenerator in '..\..\CryptoLib\src\Asn1\X509\ClpV1TbsCertificateGenerator.pas',
   ClpV2AttributeCertificateInfoGenerator in '..\..\CryptoLib\src\Asn1\X509\ClpV2AttributeCertificateInfoGenerator.pas',

+ 1 - 1
CryptoLib.Tests/src/Asn1/PKCS/Pkcs10CertRequestTests.pas

@@ -33,7 +33,7 @@ uses
 {$ENDIF FPC}
   ClpPkcsAsn1Objects,
   ClpIPkcsAsn1Objects,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes,
   CryptoLibTestBase;
 

+ 1 - 1
CryptoLib.Tests/src/Asn1/PrivateKeyInfoTests.pas

@@ -34,7 +34,7 @@ uses
   ClpIAsn1Objects,
   ClpPkcsAsn1Objects,
   ClpIPkcsAsn1Objects,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes,
   CryptoLibTestBase;
 

+ 2 - 2
CryptoLib.Tests/src/Asn1/X509/DeltaCertificateTests.pas

@@ -41,7 +41,7 @@ uses
   ClpDeltaCertificateTool,
   ClpPemObjects,
   ClpIPemObjects,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes,
   ClpBigInteger,
   ClpGeneratorUtilities,
@@ -189,7 +189,7 @@ begin
   Check(LBaseCert.IsSignatureValid(LEcRootCert.GetPublicKey), 'base signed by ec_dsa_root');
   LDeltaCert := TDeltaCertificateTool.ExtractDeltaCertificate(LBaseCert);
   LExtCert := ReadCert(FDeltaEcDsaDualSigEe);
-  Check(TArrayUtils.AreEqual(LExtCert.GetEncoded, LDeltaCert.GetEncoded), 'delta equals ec_dsa_dual_sig_ee');
+  Check(TArrayUtilities.AreEqual<Byte>(LExtCert.GetEncoded, LDeltaCert.GetEncoded), 'delta equals ec_dsa_dual_sig_ee');
   Check(LDeltaCert.IsSignatureValid(LEcRootCert.GetPublicKey), 'delta signed by ec_dsa_root');
 end;
 

+ 1 - 1
CryptoLib.Tests/src/Asn1/X509/GeneralNameTests.pas

@@ -33,7 +33,7 @@ uses
 {$ENDIF FPC}
   ClpX509Asn1Objects,
   ClpIX509Asn1Objects,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes,
   CryptoLibTestBase;
 

+ 1 - 1
CryptoLib.Tests/src/Asn1/X509/SubjectKeyIdentifierTests.pas

@@ -34,7 +34,7 @@ uses
   ClpX509Asn1Objects,
   ClpIX509Asn1Objects,
   ClpX509ExtensionUtilities,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes,
   CryptoLibTestBase;
 

+ 1 - 1
CryptoLib.Tests/src/Asn1/X509/X509AltTests.pas

@@ -38,7 +38,7 @@ uses
   ClpPkcsObjectIdentifiers,
   ClpAsn1Objects,
   ClpIAsn1Objects,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes,
   CryptoLibTestBase;
 

+ 1 - 1
CryptoLib.Tests/src/Asn1/X509/X509ExtensionsTests.pas

@@ -38,7 +38,7 @@ uses
   ClpIX509Extension,
   ClpAsn1Objects,
   ClpIAsn1Objects,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes,
   CryptoLibTestBase;
 

+ 1 - 1
CryptoLib.Tests/src/Asn1/X509/X509NameTests.pas

@@ -36,7 +36,7 @@ uses
   ClpIX509Asn1Objects,
   ClpAsn1Objects,
   ClpIAsn1Objects,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes,
   CryptoLibTestBase;
 

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

@@ -35,7 +35,7 @@ uses
   ClpHMac,
   ClpIMac,
   ClpDigestUtilities,
-  ClpStringUtils,
+  ClpStringUtilities,
   ClpConverters,
   ClpCryptoLibTypes,
   CryptoLibTestBase;
@@ -105,7 +105,7 @@ begin
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   begin
     m := TConverters.ConvertStringToBytes(Fmessages[i], TEncoding.ASCII);
-    if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
+    if (TStringUtilities.StartsWith(Fmessages[i], '0x', True)) then
     begin
       m := DecodeHex(System.Copy(Fmessages[i], 3,
         System.Length(Fmessages[i]) - 2));
@@ -124,7 +124,7 @@ begin
   vector := 0; // vector used for test
   m2 := TConverters.ConvertStringToBytes(Fmessages[vector], TEncoding.ASCII);
 
-  if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
+  if (TStringUtilities.StartsWith(Fmessages[vector], '0x', True)) then
   begin
     m2 := DecodeHex(System.Copy(Fmessages[vector], 3,
       System.Length(Fmessages[vector]) - 2));

+ 2 - 2
CryptoLib.Tests/src/Crypto/PssTests.pas

@@ -55,7 +55,7 @@ uses
   ClpISecureRandom,
   ClpSecureRandom,
   ClpConverters,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpEncoders,
   ClpCryptoLibTypes,
   CryptoLibTestBase;
@@ -291,7 +291,7 @@ begin
   eng.BlockUpdate(msg, 0, System.Length(msg));
   s := eng.GenerateSignature();
 
-  CheckTrue(TArrayUtils.AreEqual(s, sig),
+  CheckTrue(TArrayUtilities.AreEqual<Byte>(s, sig),
     Format('Test %d: PSS signature generation failed', [id]));
 
   eng.Init(False, pub);

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

@@ -35,7 +35,7 @@ uses
   ClpHMac,
   ClpIMac,
   ClpDigestUtilities,
-  ClpStringUtils,
+  ClpStringUtilities,
   ClpConverters,
   ClpCryptoLibTypes,
   CryptoLibTestBase;
@@ -104,7 +104,7 @@ begin
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   begin
     m := TConverters.ConvertStringToBytes(Fmessages[i], TEncoding.ASCII);
-    if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
+    if (TStringUtilities.StartsWith(Fmessages[i], '0x', True)) then
     begin
       m := DecodeHex(System.Copy(Fmessages[i], 3,
         System.Length(Fmessages[i]) - 2));
@@ -123,7 +123,7 @@ begin
   vector := 0; // vector used for test
   m2 := TConverters.ConvertStringToBytes(Fmessages[vector], TEncoding.ASCII);
 
-  if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
+  if (TStringUtilities.StartsWith(Fmessages[vector], '0x', True)) then
   begin
     m2 := DecodeHex(System.Copy(Fmessages[vector], 3,
       System.Length(Fmessages[vector]) - 2));

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

@@ -35,7 +35,7 @@ uses
   ClpHMac,
   ClpIMac,
   ClpDigestUtilities,
-  ClpStringUtils,
+  ClpStringUtilities,
   ClpConverters,
   ClpCryptoLibTypes,
   CryptoLibTestBase;
@@ -109,7 +109,7 @@ begin
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   begin
     m := TConverters.ConvertStringToBytes(Fmessages[i], TEncoding.ASCII);
-    if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
+    if (TStringUtilities.StartsWith(Fmessages[i], '0x', True)) then
     begin
       m := DecodeHex(System.Copy(Fmessages[i], 3,
         System.Length(Fmessages[i]) - 2));
@@ -128,7 +128,7 @@ begin
   vector := 0; // vector used for test
   m2 := TConverters.ConvertStringToBytes(Fmessages[vector], TEncoding.ASCII);
 
-  if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
+  if (TStringUtilities.StartsWith(Fmessages[vector], '0x', True)) then
   begin
     m2 := DecodeHex(System.Copy(Fmessages[vector], 3,
       System.Length(Fmessages[vector]) - 2));

+ 5 - 5
CryptoLib.Tests/src/Crypto/RSATests.pas

@@ -53,7 +53,7 @@ uses
   ClpISecureRandom,
   ClpSecureRandom,
   ClpConverters,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes,
   CryptoLibTestBase;
 
@@ -215,7 +215,7 @@ begin
   engine.Init(False, privParams);
   decrypted := engine.ProcessBlock(encrypted, 0, System.Length(encrypted));
 
-  CheckTrue(TArrayUtils.AreEqual(input, decrypted), 'RSA round-trip failed');
+  CheckTrue(TArrayUtilities.AreEqual<Byte>(input, decrypted), 'RSA round-trip failed');
 end;
 
 procedure TTestRSA.DoTestPkcs1Encoding;
@@ -241,7 +241,7 @@ begin
   engine.Init(False, privParams);
   decrypted := engine.ProcessBlock(encrypted, 0, System.Length(encrypted));
 
-  CheckTrue(TArrayUtils.AreEqual(input, decrypted), 'PKCS1 round-trip failed');
+  CheckTrue(TArrayUtilities.AreEqual<Byte>(input, decrypted), 'PKCS1 round-trip failed');
 end;
 
 procedure TTestRSA.DoTestOaepEncoding;
@@ -267,7 +267,7 @@ begin
   engine.Init(False, privParams);
   decrypted := engine.ProcessBlock(encrypted, 0, System.Length(encrypted));
 
-  CheckTrue(TArrayUtils.AreEqual(input, decrypted), 'OAEP round-trip failed');
+  CheckTrue(TArrayUtilities.AreEqual<Byte>(input, decrypted), 'OAEP round-trip failed');
 end;
 
 procedure TTestRSA.DoTestKeyGeneration;
@@ -308,7 +308,7 @@ begin
   engine.Init(False, privKey);
   decrypted := engine.ProcessBlock(encrypted, 0, System.Length(encrypted));
 
-  CheckTrue(TArrayUtils.AreEqual(input, decrypted), 'Generated key round-trip failed');
+  CheckTrue(TArrayUtilities.AreEqual<Byte>(input, decrypted), 'Generated key round-trip failed');
 end;
 
 procedure TTestRSA.DoTestRsaSignature;

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

@@ -35,7 +35,7 @@ uses
   ClpHMac,
   ClpIMac,
   ClpDigestUtilities,
-  ClpStringUtils,
+  ClpStringUtilities,
   ClpConverters,
   ClpCryptoLibTypes,
   CryptoLibTestBase;
@@ -110,7 +110,7 @@ begin
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   begin
     m := TConverters.ConvertStringToBytes(Fmessages[i], TEncoding.ASCII);
-    if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
+    if (TStringUtilities.StartsWith(Fmessages[i], '0x', True)) then
     begin
       m := DecodeHex(System.Copy(Fmessages[i], 3,
         System.Length(Fmessages[i]) - 2));
@@ -129,7 +129,7 @@ begin
   vector := 0; // vector used for test
   m2 := TConverters.ConvertStringToBytes(Fmessages[vector], TEncoding.ASCII);
 
-  if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
+  if (TStringUtilities.StartsWith(Fmessages[vector], '0x', True)) then
   begin
     m2 := DecodeHex(System.Copy(Fmessages[vector], 3,
       System.Length(Fmessages[vector]) - 2));

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

@@ -35,7 +35,7 @@ uses
   ClpHMac,
   ClpIMac,
   ClpDigestUtilities,
-  ClpStringUtils,
+  ClpStringUtilities,
   ClpConverters,
   ClpCryptoLibTypes,
   CryptoLibTestBase;
@@ -111,7 +111,7 @@ begin
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   begin
     m := TConverters.ConvertStringToBytes(Fmessages[i], TEncoding.ASCII);
-    if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
+    if (TStringUtilities.StartsWith(Fmessages[i], '0x', True)) then
     begin
       m := DecodeHex(System.Copy(Fmessages[i], 3,
         System.Length(Fmessages[i]) - 2));
@@ -130,7 +130,7 @@ begin
   vector := 0; // vector used for test
   m2 := TConverters.ConvertStringToBytes(Fmessages[vector], TEncoding.ASCII);
 
-  if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
+  if (TStringUtilities.StartsWith(Fmessages[vector], '0x', True)) then
   begin
     m2 := DecodeHex(System.Copy(Fmessages[vector], 3,
       System.Length(Fmessages[vector]) - 2));

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

@@ -35,7 +35,7 @@ uses
   ClpHMac,
   ClpIMac,
   ClpDigestUtilities,
-  ClpStringUtils,
+  ClpStringUtilities,
   ClpConverters,
   ClpCryptoLibTypes,
   CryptoLibTestBase;
@@ -111,7 +111,7 @@ begin
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   begin
     m := TConverters.ConvertStringToBytes(Fmessages[i], TEncoding.ASCII);
-    if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
+    if (TStringUtilities.StartsWith(Fmessages[i], '0x', True)) then
     begin
       m := DecodeHex(System.Copy(Fmessages[i], 3,
         System.Length(Fmessages[i]) - 2));
@@ -130,7 +130,7 @@ begin
   vector := 0; // vector used for test
   m2 := TConverters.ConvertStringToBytes(Fmessages[vector], TEncoding.ASCII);
 
-  if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
+  if (TStringUtilities.StartsWith(Fmessages[vector], '0x', True)) then
   begin
     m2 := DecodeHex(System.Copy(Fmessages[vector], 3,
       System.Length(Fmessages[vector]) - 2));

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

@@ -35,7 +35,7 @@ uses
   ClpHMac,
   ClpIMac,
   ClpDigestUtilities,
-  ClpStringUtils,
+  ClpStringUtilities,
   ClpConverters,
   ClpCryptoLibTypes,
   CryptoLibTestBase;
@@ -111,7 +111,7 @@ begin
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   begin
     m := TConverters.ConvertStringToBytes(Fmessages[i], TEncoding.ASCII);
-    if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
+    if (TStringUtilities.StartsWith(Fmessages[i], '0x', True)) then
     begin
       m := DecodeHex(System.Copy(Fmessages[i], 3,
         System.Length(Fmessages[i]) - 2));
@@ -130,7 +130,7 @@ begin
   vector := 0; // vector used for test
   m2 := TConverters.ConvertStringToBytes(Fmessages[vector], TEncoding.ASCII);
 
-  if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
+  if (TStringUtilities.StartsWith(Fmessages[vector], '0x', True)) then
   begin
     m2 := DecodeHex(System.Copy(Fmessages[vector], 3,
       System.Length(Fmessages[vector]) - 2));

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

@@ -35,7 +35,7 @@ uses
   ClpHMac,
   ClpIMac,
   ClpDigestUtilities,
-  ClpStringUtils,
+  ClpStringUtilities,
   ClpConverters,
   ClpCryptoLibTypes,
   CryptoLibTestBase;
@@ -111,7 +111,7 @@ begin
   for i := 0 to System.Pred(System.Length(Fmessages)) do
   begin
     m := TConverters.ConvertStringToBytes(Fmessages[i], TEncoding.ASCII);
-    if (TStringUtils.BeginsWith(Fmessages[i], '0x', True)) then
+    if (TStringUtilities.StartsWith(Fmessages[i], '0x', True)) then
     begin
       m := DecodeHex(System.Copy(Fmessages[i], 3,
         System.Length(Fmessages[i]) - 2));
@@ -130,7 +130,7 @@ begin
   vector := 0; // vector used for test
   m2 := TConverters.ConvertStringToBytes(Fmessages[vector], TEncoding.ASCII);
 
-  if (TStringUtils.BeginsWith(Fmessages[vector], '0x', True)) then
+  if (TStringUtilities.StartsWith(Fmessages[vector], '0x', True)) then
   begin
     m2 := DecodeHex(System.Copy(Fmessages[vector], 3,
       System.Length(Fmessages[vector]) - 2));

+ 2 - 2
CryptoLib.Tests/src/Crypto/X931SignerTests.pas

@@ -43,7 +43,7 @@ uses
   ClpIDigest,
   ClpISigner,
   ClpEncoders,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes,
   CryptoLibTestBase;
 
@@ -230,7 +230,7 @@ begin
 
   LS := LSigner.GenerateSignature();
 
-  CheckTrue(TArrayUtils.AreEqual(LSig, LS), 'RSA X931 sig test 3 failed.');
+  CheckTrue(TArrayUtilities.AreEqual<Byte>(LSig, LS), 'RSA X931 sig test 3 failed.');
 
   LSigner.Init(False, LRsaPublic);
 

+ 4 - 4
CryptoLib.Tests/src/CryptoLibTestBase.pas

@@ -17,7 +17,7 @@ uses
   TestFramework,
 {$ENDIF FPC}
   ClpEncoders,
-  ClpArrayUtils;
+  ClpArrayUtilities;
 
 type
 
@@ -61,17 +61,17 @@ end;
 function TCryptoLibAlgorithmTestCase.Prepend(const data: TBytes;
   b: Byte): TBytes;
 begin
-  result := TArrayUtils.Prepend(data, b);
+  result := TArrayUtilities.Prepend<Byte>(data, b);
 end;
 
 procedure TCryptoLibAlgorithmTestCase.ZeroFill(const data: TBytes);
 begin
-  TArrayUtils.ZeroFill(data);
+  TArrayUtilities.Fill<Byte>(data, 0, System.Length(data), Byte(0));
 end;
 
 function TCryptoLibAlgorithmTestCase.AreEqual(const A, b: TBytes): Boolean;
 begin
-  result := TArrayUtils.AreEqual(A, b);
+  result := TArrayUtilities.AreEqual<Byte>(A, b);
 end;
 
 end.

+ 2 - 2
CryptoLib/src/Asn1/ClpAsn1Dumper.pas

@@ -31,7 +31,7 @@ uses
   ClpAsn1Streams,
   ClpEncoders,
   ClpCryptoLibTypes,
-  ClpArrayUtils;
+  ClpArrayUtilities;
 
 type
   /// <summary>
@@ -353,7 +353,7 @@ begin
     LChunk := Math.Min(LRemaining, SampleSize);
 
     ABuf.Append(LIndent);
-    ABuf.Append(THex.Encode(TArrayUtils.CopyOfRange(ABytes, I, I + LChunk)));
+    ABuf.Append(THex.Encode(TArrayUtilities.CopyOfRange<Byte>(ABytes, I, I + LChunk)));
     J := LChunk;
     while J < SampleSize do
     begin

+ 102 - 101
CryptoLib/src/Asn1/ClpAsn1Objects.pas

@@ -33,10 +33,11 @@ uses
   ClpIAsn1Objects,
   ClpAsn1Streams,
   ClpAsn1Utilities,
-  ClpPlatform,
+  ClpPlatformUtilities,
   ClpStreams,
   ClpStreamUtilities,
-  ClpArrayUtils,
+  ClpArrayUtilities,
+  ClpStringUtilities,
   ClpEncoders,
   ClpConverters,
   ClpCollectionUtilities,
@@ -5010,7 +5011,7 @@ begin
     try
       LD1 := GetEncoded();
       LD2 := AAsn1Object.GetEncoded();
-      Result := TArrayUtils.AreEqual(LD1, LD2);
+      Result := TArrayUtilities.AreEqual<Byte>(LD1, LD2);
       Exit;
     except
       on E: Exception do
@@ -5372,7 +5373,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TAsn1TaggedObject.GetInstance(const AObj: IAsn1Object): IAsn1TaggedObject;
@@ -5883,7 +5884,7 @@ end;
 
 function TAsn1Sequence.ToString(): String;
 begin
-  Result := TCollectionUtilities.ToString<IAsn1Encodable>(FElements,
+  Result := TArrayUtilities.ToString<IAsn1Encodable>(FElements,
     function(AElement: IAsn1Encodable): String
     var
       LObj: IAsn1Object;
@@ -5928,7 +5929,7 @@ end;
 
 function TAsn1Sequence.MapElements<TResult>(const AFunc: TFunc<IAsn1Encodable, TResult>): TCryptoLibGenericArray<TResult>;
 begin
-  Result := TCollectionUtilities.Map<IAsn1Encodable, TResult>(FElements, AFunc);
+  Result := TArrayUtilities.Map<IAsn1Encodable, TResult>(FElements, AFunc);
 end;
 
 class function TAsn1Sequence.GetInstance(const AObj: TObject): IAsn1Sequence;
@@ -5957,7 +5958,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.CreateFmt('illegal object in GetInstance: %s', [TPlatform.GetTypeName(AObj)]);
+  raise EArgumentCryptoLibException.CreateFmt('illegal object in GetInstance: %s', [TPlatformUtilities.GetTypeName(AObj)]);
 end;
 
 class function TAsn1Sequence.GetInstance(const AObj: IAsn1Object): IAsn1Sequence;
@@ -6175,7 +6176,7 @@ begin
     Result := GetEmpty();
     Exit;
   end;
-  LMapped := TCollectionUtilities.Map<IAsn1Encodable, IAsn1Encodable>(ASequence.Elements, AFunc);
+  LMapped := TArrayUtilities.Map<IAsn1Encodable, IAsn1Encodable>(ASequence.Elements, AFunc);
   Result := WithElements(LMapped);
 end;
 
@@ -6188,7 +6189,7 @@ begin
     Result := GetEmpty();
     Exit;
   end;
-  LMapped := TCollectionUtilities.Map<T, IAsn1Encodable>(ATs, AFunc);
+  LMapped := TArrayUtilities.Map<T, IAsn1Encodable>(ATs, AFunc);
   Result := WithElements(LMapped);
 end;
 
@@ -6390,7 +6391,7 @@ begin
     Result := GetEmpty();
     Exit;
   end;
-  LMapped := TCollectionUtilities.Map<IAsn1Encodable, IAsn1Encodable>(ASequence.Elements, AFunc);
+  LMapped := TArrayUtilities.Map<IAsn1Encodable, IAsn1Encodable>(ASequence.Elements, AFunc);
   Result := WithElements(LMapped);
 end;
 
@@ -6403,7 +6404,7 @@ begin
     Result := GetEmpty();
     Exit;
   end;
-  LMapped := TCollectionUtilities.Map<T, IAsn1Encodable>(ATs, AFunc);
+  LMapped := TArrayUtilities.Map<T, IAsn1Encodable>(ATs, AFunc);
   Result := WithElements(LMapped);
 end;
 
@@ -6652,7 +6653,7 @@ end;
 
 function TAsn1Set.MapElements<TResult>(const AFunc: TFunc<IAsn1Encodable, TResult>): TCryptoLibGenericArray<TResult>;
 begin
-  Result := TCollectionUtilities.Map<IAsn1Encodable, TResult>(FElements, AFunc);
+  Result := TArrayUtilities.Map<IAsn1Encodable, TResult>(FElements, AFunc);
 end;
 
 function TAsn1Set.ToArray(): TCryptoLibGenericArray<IAsn1Encodable>;
@@ -6662,7 +6663,7 @@ end;
 
 function TAsn1Set.ToString(): String;
 begin
-  Result := TCollectionUtilities.ToString<IAsn1Encodable>(FElements,
+  Result := TArrayUtilities.ToString<IAsn1Encodable>(FElements,
     function(AElement: IAsn1Encodable): String
     var
       LObj: IAsn1Object;
@@ -6703,7 +6704,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TAsn1Set.GetInstance(const AObj: IAsn1Object): IAsn1Set;
@@ -6877,7 +6878,7 @@ begin
     Result := GetEmpty();
     Exit;
   end;
-  LMapped := TCollectionUtilities.Map<T, IAsn1Encodable>(ATs, AFunc);
+  LMapped := TArrayUtilities.Map<T, IAsn1Encodable>(ATs, AFunc);
   Result := TDerSet.Create(LMapped);
 end;
 
@@ -7001,7 +7002,7 @@ begin
     Result := GetEmpty();
     Exit;
   end;
-  LMapped := TCollectionUtilities.Map<T, IAsn1Encodable>(ATs, AFunc);
+  LMapped := TArrayUtilities.Map<T, IAsn1Encodable>(ATs, AFunc);
   Result := TDLSet.Create(False, LMapped); // isSorted = False, need to sort
 end;
 
@@ -7169,7 +7170,7 @@ begin
     Result := GetEmpty();
     Exit;
   end;
-  LMapped := TCollectionUtilities.Map<IAsn1Encodable, IAsn1Encodable>(ASequence.Elements, AFunc);
+  LMapped := TArrayUtilities.Map<IAsn1Encodable, IAsn1Encodable>(ASequence.Elements, AFunc);
   Result := WithElements(LMapped);
 end;
 
@@ -7182,7 +7183,7 @@ begin
     Result := GetEmpty();
     Exit;
   end;
-  LMapped := TCollectionUtilities.Map<T, IAsn1Encodable>(ATs, AFunc);
+  LMapped := TArrayUtilities.Map<T, IAsn1Encodable>(ATs, AFunc);
   Result := WithElements(LMapped);
 end;
 
@@ -7327,7 +7328,7 @@ begin
     Result := GetEmpty();
     Exit;
   end;
-  LMapped := TCollectionUtilities.Map<T, IAsn1Encodable>(ATs, AFunc);
+  LMapped := TArrayUtilities.Map<T, IAsn1Encodable>(ATs, AFunc);
   Result := TBerSet.Create(False, LMapped); // isSorted = False
 end;
 
@@ -8326,12 +8327,12 @@ begin
     Result := False;
     Exit;
   end;
-  Result := TArrayUtils.AreEqual(GetOctets(), LThat.GetOctets());
+  Result := TArrayUtilities.AreEqual<Byte>(GetOctets(), LThat.GetOctets());
 end;
 
 function TAsn1OctetString.Asn1GetHashCode(): Int32;
 begin
-  Result := TArrayUtils.GetArrayHashCode(GetOctets());
+  Result := TArrayUtilities.GetArrayHashCode(GetOctets());
 end;
 
 class function TAsn1OctetString.GetInstance(const AObj: TObject): IAsn1OctetString;
@@ -8360,7 +8361,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.CreateFmt('illegal object in GetInstance: %s', [TPlatform.GetTypeName(AObj)]);
+  raise EArgumentCryptoLibException.CreateFmt('illegal object in GetInstance: %s', [TPlatformUtilities.GetTypeName(AObj)]);
 end;
 
 class function TAsn1OctetString.GetInstance(const ABytes: TCryptoLibByteArray): IAsn1OctetString;
@@ -8473,7 +8474,7 @@ begin
   if System.Length(AContents) < 1 then
     Result := FEmpty
   else
-    Result := TDerOctetString.Create(TArrayUtils.CopyOf(AContents, System.Length(AContents)));
+    Result := TDerOctetString.Create(TArrayUtilities.CopyOf<Byte>(AContents, System.Length(AContents)));
 end;
 
 class function TDerOctetString.FromContentsOptional(const AContents: TCryptoLibByteArray): IDerOctetString;
@@ -8486,7 +8487,7 @@ begin
   if System.Length(AContents) < 1 then
     Result := FEmpty
   else
-    Result := TDerOctetString.Create(TArrayUtils.CopyOf(AContents, System.Length(AContents)));
+    Result := TDerOctetString.Create(TArrayUtilities.CopyOf<Byte>(AContents, System.Length(AContents)));
 end;
 
 class function TDerOctetString.WithContents(const AContents: TCryptoLibByteArray): IDerOctetString;
@@ -8732,7 +8733,7 @@ end;
 constructor TDerBitString.CreateEmpty();
 begin
   inherited Create;
-  FContents := TArrayUtils.Prepend(nil, Byte(0));
+  FContents := TArrayUtilities.Prepend<Byte>(nil, Byte(0));
 end;
 
 constructor TDerBitString.Create(const AData: TCryptoLibByteArray);
@@ -8769,7 +8770,7 @@ begin
     raise EArgumentCryptoLibException.Create('must be in the range 0 to 7');
   if (System.Length(AData) = 0) and (APadBits <> 0) then
     raise EArgumentCryptoLibException.Create('if ''data'' is empty, ''padBits'' must be 0');
-  FContents := TArrayUtils.Prepend(AData, Byte(APadBits));
+  FContents := TArrayUtilities.Prepend<Byte>(AData, Byte(APadBits));
 end;
 
 function TDerBitString.Asn1Equals(const AAsn1Object: IAsn1Object): Boolean;
@@ -8836,7 +8837,7 @@ begin
   LLastDer := Byte(FContents[LLast] and ($FF shl LPadBits));
 
   // Calculate hash code for bytes 0 to LLast-1
-  Result := TArrayUtils.GetArrayHashCode(FContents, 0, LLast);
+  Result := TArrayUtilities.GetArrayHashCode(FContents, 0, LLast);
   
   // Add the masked last byte
   Result := Result * 257;
@@ -8871,7 +8872,7 @@ begin
   if System.Length(FContents) = 1 then
     Result := TAsn1OctetString.EmptyOctets
   else
-    Result := TArrayUtils.CopyOfRange(FContents, 1, System.Length(FContents));
+    Result := TArrayUtilities.CopyOfRange<Byte>(FContents, 1, System.Length(FContents));
 end;
 
 function TDerBitString.GetBytes(): TCryptoLibByteArray;
@@ -8882,7 +8883,7 @@ begin
     Result := TAsn1OctetString.EmptyOctets
   else
   begin
-    Result := TArrayUtils.CopyOfRange(FContents, 1, System.Length(FContents));
+    Result := TArrayUtilities.CopyOfRange<Byte>(FContents, 1, System.Length(FContents));
     LPadBits := FContents[0];
     if LPadBits > 0 then
       Result[System.Length(Result) - 1] := Result[System.Length(Result) - 1] and Byte($FF shl LPadBits);
@@ -9039,7 +9040,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TDerBitString.GetInstance(const AObj: IAsn1Object): IDerBitString;
@@ -9801,7 +9802,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TDerBmpString.GetInstance(const AObj: IAsn1Object): IDerBmpString;
@@ -9979,7 +9980,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TDerBoolean.GetInstance(const AObj: IAsn1Convertible): IDerBoolean;
@@ -10010,7 +10011,7 @@ begin
   if Supports(AObj, IDerBoolean, Result) then
     Exit;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj as TObject));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj as TObject));
 end;
 
 class function TDerBoolean.GetInstance(const ABytes: TCryptoLibByteArray): IDerBoolean;
@@ -10150,7 +10151,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TDerEnumerated.GetInstance(const AObj: IAsn1Object): IDerEnumerated;
@@ -10353,12 +10354,12 @@ begin
     Exit;
   end;
   LThatContents := LThat.Bytes;
-  Result := TArrayUtils.AreEqual(FContents, LThatContents);
+  Result := TArrayUtilities.AreEqual<Byte>(FContents, LThatContents);
 end;
 
 function TDerEnumerated.Asn1GetHashCode(): Int32;
 begin
-  Result := TArrayUtils.GetArrayHashCode(FContents);
+  Result := TArrayUtilities.GetArrayHashCode(FContents);
 end;
 
 class function TDerEnumerated.FromOctetString(const AContents: TCryptoLibByteArray): IAsn1Object;
@@ -10445,7 +10446,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TAsn1Null.GetInstance(const AObj: IAsn1Object): IAsn1Null;
@@ -10603,7 +10604,7 @@ var
 begin
   CheckContentsLength(System.Length(AContents));
 
-  LIndex := UInt32(TArrayUtils.GetArrayHashCode(AContents));
+  LIndex := UInt32(TArrayUtilities.GetArrayHashCode(AContents));
   LIndex := LIndex xor (LIndex shr 20);
   LIndex := LIndex xor (LIndex shr 10);
   LIndex := LIndex and 1023;
@@ -10612,7 +10613,7 @@ begin
     System.SetLength(FCache, 1024);
 
   LOriginalEntry := FCache[LIndex];
-  if (LOriginalEntry <> nil) and TArrayUtils.AreEqual(AContents, LOriginalEntry.Contents) then
+  if (LOriginalEntry <> nil) and TArrayUtilities.AreEqual<Byte>(AContents, LOriginalEntry.Contents) then
   begin
     Result := LOriginalEntry;
     Exit;
@@ -10629,7 +10630,7 @@ begin
   LExchangedEntry := FCache[LIndex];
   if LExchangedEntry <> LOriginalEntry then
   begin
-    if (LExchangedEntry <> nil) and TArrayUtils.AreEqual(AContents, LExchangedEntry.Contents) then
+    if (LExchangedEntry <> nil) and TArrayUtilities.AreEqual<Byte>(AContents, LExchangedEntry.Contents) then
     begin
       Result := LExchangedEntry;
       Exit;
@@ -10690,7 +10691,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TDerObjectIdentifier.GetInstance(const AObj: IAsn1Object): IDerObjectIdentifier;
@@ -10704,7 +10705,7 @@ begin
   if Supports(AObj, IDerObjectIdentifier, Result) then
     Exit;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj as TObject));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj as TObject));
 end;
 
 class function TDerObjectIdentifier.GetInstance(const AObj: IAsn1Convertible): IDerObjectIdentifier;
@@ -10804,12 +10805,12 @@ begin
     Result := False;
     Exit;
   end;
-  Result := TArrayUtils.AreEqual(FContents, LThat.Contents);
+  Result := TArrayUtilities.AreEqual<Byte>(FContents, LThat.Contents);
 end;
 
 function TDerObjectIdentifier.Asn1GetHashCode(): Int32;
 begin
-  Result := TArrayUtils.GetArrayHashCode(FContents);
+  Result := TArrayUtilities.GetArrayHashCode(FContents);
 end;
 
 function TDerObjectIdentifier.GetContents(): TCryptoLibByteArray;
@@ -10841,13 +10842,13 @@ begin
       LSubID := LSubID * 10;
       LSubID := LSubID + (Ord(ABranchID[2]) - Ord('0'));
     end;
-    LContents := TArrayUtils.Append(FContents, Byte(LSubID));
+    LContents := TArrayUtilities.Append<Byte>(FContents, Byte(LSubID));
   end
   else
   begin
     LContents := TAsn1RelativeOid.ParseIdentifier(ABranchID);
     CheckContentsLength(System.Length(FContents) + System.Length(LContents));
-    LContents := TArrayUtils.Concatenate(FContents, LContents);
+    LContents := TArrayUtilities.Concatenate<Byte>(FContents, LContents);
   end;
 
   LRootID := GetID();
@@ -10864,7 +10865,7 @@ begin
   LStemLength := System.Length(LStemContents);
   // Compare the first LStemLength bytes of both arrays
   Result := (System.Length(FContents) > LStemLength) and
-    TArrayUtils.AreEqual(System.Copy(FContents, 0, LStemLength), System.Copy(LStemContents, 0, LStemLength));
+    TArrayUtilities.AreEqual<Byte>(System.Copy(FContents, 0, LStemLength), System.Copy(LStemContents, 0, LStemLength));
 end;
 
 function TDerObjectIdentifier.ToString(): String;
@@ -11134,12 +11135,12 @@ begin
     Result := False;
     Exit;
   end;
-  Result := TArrayUtils.AreEqual(FContents, LThat.Contents);
+  Result := TArrayUtilities.AreEqual<Byte>(FContents, LThat.Contents);
 end;
 
 function TAsn1RelativeOid.Asn1GetHashCode(): Int32;
 begin
-  Result := TArrayUtils.GetArrayHashCode(FContents);
+  Result := TArrayUtilities.GetArrayHashCode(FContents);
 end;
 
 class constructor TAsn1RelativeOid.Create;
@@ -11203,7 +11204,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TAsn1RelativeOid.GetInstance(const AObj: IAsn1Object): IAsn1RelativeOid;
@@ -11538,13 +11539,13 @@ begin
       LSubID := LSubID * 10;
       LSubID := LSubID + (Ord(ABranchID[2]) - Ord('0'));
     end;
-    LContents := TArrayUtils.Append(FContents, Byte(LSubID));
+    LContents := TArrayUtilities.Append<Byte>(FContents, Byte(LSubID));
   end
   else
   begin
     LBranchContents := ParseIdentifier(ABranchID);
     CheckContentsLength(System.Length(FContents) + System.Length(LBranchContents));
-    LContents := TArrayUtils.Concatenate(FContents, LBranchContents);
+    LContents := TArrayUtilities.Concatenate<Byte>(FContents, LBranchContents);
   end;
 
   LRootID := GetID();
@@ -11586,7 +11587,7 @@ var
 begin
   CheckContentsLength(System.Length(AContents));
 
-  LIndex := UInt32(TArrayUtils.GetArrayHashCode(AContents));
+  LIndex := UInt32(TArrayUtilities.GetArrayHashCode(AContents));
   LIndex := LIndex xor (LIndex shr 24);
   LIndex := LIndex xor (LIndex shr 12);
   LIndex := LIndex xor (LIndex shr 6);
@@ -11596,7 +11597,7 @@ begin
     System.SetLength(FCache, 64);
 
   LOriginalEntry := FCache[LIndex];
-  if (LOriginalEntry <> nil) and TArrayUtils.AreEqual(AContents, LOriginalEntry.Contents) then
+  if (LOriginalEntry <> nil) and TArrayUtilities.AreEqual<Byte>(AContents, LOriginalEntry.Contents) then
   begin
     Result := LOriginalEntry;
     Exit;
@@ -11613,7 +11614,7 @@ begin
   LExchangedEntry := FCache[LIndex];
   if LExchangedEntry <> LOriginalEntry then
   begin
-    if (LExchangedEntry <> nil) and TArrayUtils.AreEqual(AContents, LExchangedEntry.Contents) then
+    if (LExchangedEntry <> nil) and TArrayUtilities.AreEqual<Byte>(AContents, LExchangedEntry.Contents) then
     begin
       Result := LExchangedEntry;
       Exit;
@@ -11696,7 +11697,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TAsn1GeneralizedTime.GetInstance(const AObj: IAsn1Object): IAsn1GeneralizedTime;
@@ -11710,7 +11711,7 @@ begin
   if Supports(AObj, IAsn1GeneralizedTime, Result) then
     Exit;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj as TObject));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj as TObject));
 end;
 
 class function TAsn1GeneralizedTime.GetInstance(const AObj: IAsn1Convertible): IAsn1GeneralizedTime;
@@ -11780,7 +11781,7 @@ begin
   // TODO Performance
   LThisContents := GetContents(TAsn1OutputStream.EncodingDer);
   LThatContents := LThat.GetContents(TAsn1OutputStream.EncodingDer);
-  Result := TArrayUtils.AreEqual(LThisContents, LThatContents);
+  Result := TArrayUtilities.AreEqual<Byte>(LThisContents, LThatContents);
 end;
 
 function TAsn1GeneralizedTime.Asn1GetHashCode(): Int32;
@@ -11789,7 +11790,7 @@ var
 begin
   // TODO Performance
   LContents := GetContents(TAsn1OutputStream.EncodingDer);
-  Result := TArrayUtils.GetArrayHashCode(LContents);
+  Result := TArrayUtilities.GetArrayHashCode(LContents);
 end;
 
 function TAsn1GeneralizedTime.GetEncoding(AEncoding: Int32): IAsn1Encoding;
@@ -11927,9 +11928,9 @@ class function TAsn1GeneralizedTime.IndexOfSign(const AStr: String; AStartIndex:
 var
   LIndex: Int32;
 begin
-  LIndex := TPlatform.IndexOf(AStr, '+', AStartIndex);
+  LIndex := TStringUtilities.IndexOf(AStr, '+', AStartIndex);
   if LIndex = 0 then
-    LIndex := TPlatform.IndexOf(AStr, '-', AStartIndex);
+    LIndex := TStringUtilities.IndexOf(AStr, '-', AStartIndex);
     Result := LIndex;
 end;
 
@@ -12057,7 +12058,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TAsn1UtcTime.GetInstance(const AObj: IAsn1Object): IAsn1UtcTime;
@@ -12071,7 +12072,7 @@ begin
   if Supports(AObj, IAsn1UtcTime, Result) then
     Exit;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj as TObject));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj as TObject));
 end;
 
 class function TAsn1UtcTime.GetInstance(const AObj: IAsn1Convertible): IAsn1UtcTime;
@@ -12159,7 +12160,7 @@ begin
   // TODO Performance
   LThisContents := GetContents(TAsn1OutputStream.EncodingDer);
   LThatContents := LThat.GetContents(TAsn1OutputStream.EncodingDer);
-  Result := TArrayUtils.AreEqual(LThisContents, LThatContents);
+  Result := TArrayUtilities.AreEqual<Byte>(LThisContents, LThatContents);
 end;
 
 function TAsn1UtcTime.Asn1GetHashCode(): Int32;
@@ -12168,7 +12169,7 @@ var
 begin
   // TODO Performance
   LContents := GetContents(TAsn1OutputStream.EncodingDer);
-  Result := TArrayUtils.GetArrayHashCode(LContents);
+  Result := TArrayUtilities.GetArrayHashCode(LContents);
 end;
 
 function TAsn1UtcTime.GetEncoding(AEncoding: Int32): IAsn1Encoding;
@@ -12432,7 +12433,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TAsn1ObjectDescriptor.GetInstance(const AObj: IAsn1Object): IAsn1ObjectDescriptor;
@@ -12446,7 +12447,7 @@ begin
   if Supports(AObj, IAsn1ObjectDescriptor, Result) then
     Exit;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj as TObject));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj as TObject));
 end;
 
 class function TAsn1ObjectDescriptor.GetInstance(const AObj: IAsn1Convertible): IAsn1ObjectDescriptor;
@@ -12602,7 +12603,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TDerUtf8String.GetInstance(const AObj: IAsn1Object): IDerUtf8String;
@@ -12706,12 +12707,12 @@ begin
     Result := False;
     Exit;
   end;
-  Result := TArrayUtils.AreEqual(FContents, LThat.Contents);
+  Result := TArrayUtilities.AreEqual<Byte>(FContents, LThat.Contents);
 end;
 
 function TDerUtf8String.Asn1GetHashCode(): Int32;
 begin
-  Result := TArrayUtils.GetArrayHashCode(FContents);
+  Result := TArrayUtilities.GetArrayHashCode(FContents);
 end;
 
 class function TDerUtf8String.CreatePrimitive(const AContents: TCryptoLibByteArray): IAsn1Object;
@@ -12771,7 +12772,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TDerGeneralString.GetInstance(const AObj: IAsn1Object): IDerGeneralString;
@@ -12875,12 +12876,12 @@ begin
     Result := False;
     Exit;
   end;
-  Result := TArrayUtils.AreEqual(FContents, LThat.Contents);
+  Result := TArrayUtilities.AreEqual<Byte>(FContents, LThat.Contents);
 end;
 
 function TDerGeneralString.Asn1GetHashCode(): Int32;
 begin
-  Result := TArrayUtils.GetArrayHashCode(FContents);
+  Result := TArrayUtilities.GetArrayHashCode(FContents);
 end;
 
 class function TDerGeneralString.CreatePrimitive(const AContents: TCryptoLibByteArray): IAsn1Object;
@@ -12932,7 +12933,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TDerGraphicString.GetInstance(const AObj: IAsn1Object): IDerGraphicString;
@@ -13036,12 +13037,12 @@ begin
     Result := False;
     Exit;
   end;
-  Result := TArrayUtils.AreEqual(FContents, LThat.Contents);
+  Result := TArrayUtilities.AreEqual<Byte>(FContents, LThat.Contents);
 end;
 
 function TDerGraphicString.Asn1GetHashCode(): Int32;
 begin
-  Result := TArrayUtils.GetArrayHashCode(FContents);
+  Result := TArrayUtilities.GetArrayHashCode(FContents);
 end;
 
 class function TDerGraphicString.CreatePrimitive(const AContents: TCryptoLibByteArray): IAsn1Object;
@@ -13125,7 +13126,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TDerIA5String.GetInstance(const AObj: IAsn1Object): IDerIA5String;
@@ -13229,12 +13230,12 @@ begin
     Result := False;
     Exit;
   end;
-  Result := TArrayUtils.AreEqual(FContents, LThat.Contents);
+  Result := TArrayUtilities.AreEqual<Byte>(FContents, LThat.Contents);
 end;
 
 function TDerIA5String.Asn1GetHashCode(): Int32;
 begin
-  Result := TArrayUtils.GetArrayHashCode(FContents);
+  Result := TArrayUtilities.GetArrayHashCode(FContents);
 end;
 
 class function TDerIA5String.CreatePrimitive(const AContents: TCryptoLibByteArray): IAsn1Object;
@@ -13340,7 +13341,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TDerNumericString.GetInstance(const AObj: IAsn1Object): IDerNumericString;
@@ -13444,12 +13445,12 @@ begin
     Result := False;
     Exit;
   end;
-  Result := TArrayUtils.AreEqual(FContents, LThat.Contents);
+  Result := TArrayUtilities.AreEqual<Byte>(FContents, LThat.Contents);
 end;
 
 function TDerNumericString.Asn1GetHashCode(): Int32;
 begin
-  Result := TArrayUtils.GetArrayHashCode(FContents);
+  Result := TArrayUtilities.GetArrayHashCode(FContents);
 end;
 
 class function TDerNumericString.CreatePrimitive(const AContents: TCryptoLibByteArray): IAsn1Object;
@@ -13509,7 +13510,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TDerPrintableString.GetInstance(const AObj: IAsn1Object): IDerPrintableString;
@@ -13613,12 +13614,12 @@ begin
     Result := False;
     Exit;
   end;
-  Result := TArrayUtils.AreEqual(FContents, LThat.Contents);
+  Result := TArrayUtilities.AreEqual<Byte>(FContents, LThat.Contents);
 end;
 
 function TDerPrintableString.Asn1GetHashCode(): Int32;
 begin
-  Result := TArrayUtils.GetArrayHashCode(FContents);
+  Result := TArrayUtilities.GetArrayHashCode(FContents);
 end;
 
 class function TDerPrintableString.CreatePrimitive(const AContents: TCryptoLibByteArray): IAsn1Object;
@@ -13723,7 +13724,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TDerT61String.GetInstance(const AObj: IAsn1Object): IDerT61String;
@@ -13827,12 +13828,12 @@ begin
     Result := False;
     Exit;
   end;
-  Result := TArrayUtils.AreEqual(FContents, LThat.Contents);
+  Result := TArrayUtilities.AreEqual<Byte>(FContents, LThat.Contents);
 end;
 
 function TDerT61String.Asn1GetHashCode(): Int32;
 begin
-  Result := TArrayUtils.GetArrayHashCode(FContents);
+  Result := TArrayUtilities.GetArrayHashCode(FContents);
 end;
 
 class function TDerT61String.CreatePrimitive(const AContents: TCryptoLibByteArray): IAsn1Object;
@@ -13884,7 +13885,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TDerUniversalString.GetInstance(const AObj: IAsn1Object): IDerUniversalString;
@@ -14004,12 +14005,12 @@ begin
     Result := False;
     Exit;
   end;
-  Result := TArrayUtils.AreEqual(FContents, LThat.Contents);
+  Result := TArrayUtilities.AreEqual<Byte>(FContents, LThat.Contents);
 end;
 
 function TDerUniversalString.Asn1GetHashCode(): Int32;
 begin
-  Result := TArrayUtils.GetArrayHashCode(FContents);
+  Result := TArrayUtilities.GetArrayHashCode(FContents);
 end;
 
 class function TDerUniversalString.CreatePrimitive(const AContents: TCryptoLibByteArray): IAsn1Object;
@@ -14095,7 +14096,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TDerVideotexString.GetInstance(const AObj: IAsn1Object): IDerVideotexString;
@@ -14199,12 +14200,12 @@ begin
     Result := False;
     Exit;
   end;
-  Result := TArrayUtils.AreEqual(FContents, LThat.Contents);
+  Result := TArrayUtilities.AreEqual<Byte>(FContents, LThat.Contents);
 end;
 
 function TDerVideotexString.Asn1GetHashCode(): Int32;
 begin
-  Result := TArrayUtils.GetArrayHashCode(FContents);
+  Result := TArrayUtilities.GetArrayHashCode(FContents);
 end;
 
 class function TDerVideotexString.CreatePrimitive(const AContents: TCryptoLibByteArray): IAsn1Object;
@@ -14264,7 +14265,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('illegal object in GetInstance: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TDerVisibleString.GetInstance(const AObj: IAsn1Object): IDerVisibleString;
@@ -14368,12 +14369,12 @@ begin
     Result := False;
     Exit;
   end;
-  Result := TArrayUtils.AreEqual(FContents, LThat.Contents);
+  Result := TArrayUtilities.AreEqual<Byte>(FContents, LThat.Contents);
 end;
 
 function TDerVisibleString.Asn1GetHashCode(): Int32;
 begin
-  Result := TArrayUtils.GetArrayHashCode(FContents);
+  Result := TArrayUtilities.GetArrayHashCode(FContents);
 end;
 
 class function TDerVisibleString.CreatePrimitive(const AContents: TCryptoLibByteArray): IAsn1Object;
@@ -14481,12 +14482,12 @@ begin
     Result := False;
     Exit;
   end;
-  Result := TArrayUtils.AreEqual(FBytes, LThat.Bytes);
+  Result := TArrayUtilities.AreEqual<Byte>(FBytes, LThat.Bytes);
 end;
 
 function TDerInteger.Asn1GetHashCode(): Int32;
 begin
-  Result := TArrayUtils.GetArrayHashCode(FBytes);
+  Result := TArrayUtilities.GetArrayHashCode(FBytes);
 end;
 
 function TDerInteger.GetBytes(): TCryptoLibByteArray;
@@ -14619,7 +14620,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.CreateFmt('illegal object in GetInstance: %s', [TPlatform.GetTypeName(AObj)]);
+  raise EArgumentCryptoLibException.CreateFmt('illegal object in GetInstance: %s', [TPlatformUtilities.GetTypeName(AObj)]);
 end;
 
 class function TDerInteger.GetInstance(const AObj: IAsn1Object): IDerInteger;
@@ -15371,7 +15372,7 @@ begin
   if (FPlatformType <> nil) and LObj.InheritsFrom(FPlatformType) then
     Result := AAsn1Object
   else
-    raise EInvalidOperationCryptoLibException.CreateFmt('unexpected object: %s', [TPlatform.GetTypeName(LObj)]);
+    raise EInvalidOperationCryptoLibException.CreateFmt('unexpected object: %s', [TPlatformUtilities.GetTypeName(LObj)]);
 end;
 
 function TAsn1UniversalType.FromImplicitPrimitive(const AOctetString: IDerOctetString): IAsn1Object;

+ 5 - 5
CryptoLib/src/Asn1/ClpAsn1Streams.pas

@@ -27,7 +27,7 @@ uses
   SysUtils,
   ClpIAsn1Objects,
   ClpBits,
-  ClpPlatform,
+  ClpPlatformUtilities,
   ClpCryptoLibTypes,
   ClpStreams,
   ClpStreamUtilities;
@@ -1157,7 +1157,7 @@ begin
   else
   begin
     raise EIOCryptoLibException.CreateFmt('unknown object encountered: %s',
-      [TPlatform.GetTypeName(LAsn1Obj as TObject)]);
+      [TPlatformUtilities.GetTypeName(LAsn1Obj as TObject)]);
   end;
 end;
 
@@ -1311,7 +1311,7 @@ begin
   if not Supports(LAsn1Obj, IAsn1OctetStringParser, Result) then
   begin
     raise EIOCryptoLibException.CreateFmt('unknown object encountered: %s',
-      [TPlatform.GetTypeName(LAsn1Obj as TObject)]);
+      [TPlatformUtilities.GetTypeName(LAsn1Obj as TObject)]);
   end;
 end;
 
@@ -1807,7 +1807,7 @@ begin
   begin
     if not Supports(AContentsElements[I], IDerBitString, LBitString) then
       raise EAsn1CryptoLibException.CreateFmt('unknown object encountered in constructed BIT STRING: %s',
-        [TPlatform.GetTypeName(AContentsElements[I] as TObject)]);
+        [TPlatformUtilities.GetTypeName(AContentsElements[I] as TObject)]);
     LBitStrings[I] := LBitString;
   end;
 
@@ -1827,7 +1827,7 @@ begin
   begin
     if not Supports(AContentsElements[I], IAsn1OctetString, LOctetString) then
       raise EAsn1CryptoLibException.CreateFmt('unknown object encountered in constructed OCTET STRING: %s',
-        [TPlatform.GetTypeName(AContentsElements[I] as TObject)]);
+        [TPlatformUtilities.GetTypeName(AContentsElements[I] as TObject)]);
     LOctetStrings[I] := LOctetString;
   end;
 

+ 3 - 3
CryptoLib/src/Asn1/ClpAsn1Utilities.pas

@@ -25,7 +25,7 @@ uses
   SysUtils,
   TypInfo,
   ClpIAsn1Objects,
-  ClpPlatform,
+  ClpPlatformUtilities,
   ClpCryptoLibTypes;
 
 type
@@ -394,7 +394,7 @@ begin
     end;
   end;
 
-  raise EArgumentCryptoLibException.Create('Invalid object: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('Invalid object: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TAsn1Utilities.GetInstanceChoice<TChoice>(const AObj: IAsn1Object;
@@ -417,7 +417,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('Invalid object: ' + TPlatform.GetTypeName(AObj as TObject));
+  raise EArgumentCryptoLibException.Create('Invalid object: ' + TPlatformUtilities.GetTypeName(AObj as TObject));
 end;
 
 class function TAsn1Utilities.GetInstanceChoice<TChoice>(const ABytes: TCryptoLibByteArray;

+ 3 - 3
CryptoLib/src/Asn1/Pkcs/ClpPkcsAsn1Objects.pas

@@ -34,7 +34,7 @@ uses
   ClpOiwObjectIdentifiers,
   ClpCryptoLibTypes,
   ClpAsn1Utilities,
-  ClpPlatform;
+  ClpPlatformUtilities;
 
 resourcestring
   SBadSequenceSize = 'Bad sequence size: %d';
@@ -1387,7 +1387,7 @@ begin
   if Supports(AObj, IContentInfo, Result) then
     Exit;
 
-  raise EArgumentCryptoLibException.CreateFmt('illegal object in GetInstance: %s', [TPlatform.GetTypeName(AObj)]);
+  raise EArgumentCryptoLibException.CreateFmt('illegal object in GetInstance: %s', [TPlatformUtilities.GetTypeName(AObj)]);
 end;
 
 class function TContentInfo.GetInstance(const AObj: IAsn1Convertible): IContentInfo;
@@ -1496,7 +1496,7 @@ begin
   if Supports(AObj, ISignedData, Result) then
     Exit;
 
-  raise EArgumentCryptoLibException.CreateFmt('illegal object in GetInstance: %s', [TPlatform.GetTypeName(AObj)]);
+  raise EArgumentCryptoLibException.CreateFmt('illegal object in GetInstance: %s', [TPlatformUtilities.GetTypeName(AObj)]);
 end;
 
 class function TSignedData.GetInstance(const AObj: IAsn1Convertible): ISignedData;

+ 6 - 5
CryptoLib/src/Asn1/X500/Style/ClpIetfUtilities.pas

@@ -27,7 +27,8 @@ uses
   ClpAsn1Objects,
   ClpIAsn1Objects,
   ClpCryptoLibTypes,
-  ClpPlatform,
+  ClpStringUtilities,
+  ClpPlatformUtilities,
   ClpEncoders;
 
 type
@@ -115,9 +116,9 @@ begin
     Exit;
   end;
 
-  if (TPlatform.IndexOf(AElt, '\') = 0) and (TPlatform.IndexOf(AElt, '"') = 0) then
+  if (TStringUtilities.IndexOf(AElt, '\') = 0) and (TStringUtilities.IndexOf(AElt, '"') = 0) then
   begin
-    Result := TPlatform.Trim(AElt);
+    Result := TStringUtilities.Trim(AElt);
     Exit;
   end;
 
@@ -287,14 +288,14 @@ var
   LStr: IAsn1String;
   LStart, LEnd: Int32;
 begin
-  LV := TPlatform.Trim(TPlatform.ToLowerInvariant(AStr));
+  LV := TStringUtilities.Trim(TStringUtilities.ToLowerInvariant(AStr));
 
   if (System.Length(LV) > 0) and (LV[1] = '#') then
   begin
     LObj := DecodeObject(LV);
     if Supports(LObj, IAsn1String, LStr) then
     begin
-      LV := TPlatform.Trim(TPlatform.ToLowerInvariant(LStr.GetString()));
+      LV := TStringUtilities.Trim(TStringUtilities.ToLowerInvariant(LStr.GetString()));
     end;
   end;
 

+ 45 - 24
CryptoLib/src/Asn1/X509/ClpX509Asn1Objects.pas

@@ -41,10 +41,11 @@ uses
   ClpBigInteger,
   ClpBigIntegers,
   ClpCryptoLibTypes,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpAsn1Utilities,
   ClpCollectionUtilities,
-  ClpPlatform,
+  ClpStringUtilities,
+  ClpPlatformUtilities,
   ClpIPAddressUtilities,
   ClpRfc5280Asn1Utilities,
   ClpDateTimeUtilities,
@@ -2081,7 +2082,7 @@ end;
 
 function TDigestInfo.GetDigestBytes: TCryptoLibByteArray;
 begin
-  Result := TArrayUtils.Clone(FDigest.GetOctets());
+  Result := System.Copy(FDigest.GetOctets());
 end;
 
 function TDigestInfo.ToAsn1Object: IAsn1Object;
@@ -2826,7 +2827,7 @@ begin
     raise EArgumentNilCryptoLibException.Create(SInvalidKeyIdentifier);
   end;
 
-  FKeyIdentifier := TArrayUtils.Clone(AKeyID);
+  FKeyIdentifier := System.Copy(AKeyID);
 end;
 
 constructor TSubjectKeyIdentifier.Create(const AKeyID: IAsn1OctetString);
@@ -2836,7 +2837,7 @@ end;
 
 function TSubjectKeyIdentifier.GetKeyIdentifier: TCryptoLibByteArray;
 begin
-  Result := TArrayUtils.Clone(FKeyIdentifier);
+  Result := System.Copy(FKeyIdentifier);
 end;
 
 function TSubjectKeyIdentifier.ToAsn1Object: IAsn1Object;
@@ -4015,7 +4016,7 @@ var
 begin
   if TIPAddressUtilities.IsValidIPv6WithNetmask(AIp) or TIPAddressUtilities.IsValidIPv6(AIp) then
   begin
-    LSlashIndex := TPlatform.IndexOf(AIp, '/');
+    LSlashIndex := TStringUtilities.IndexOf(AIp, '/');
 
     if LSlashIndex = 0 then
     begin
@@ -4031,7 +4032,7 @@ begin
       LParsedIp := ParseIPv6(System.Copy(AIp, 1, LSlashIndex - 1));
       CopyInts(LParsedIp, LAddr, 0);
       LMask := System.Copy(AIp, LSlashIndex + 1, System.Length(AIp) - LSlashIndex);
-      if TPlatform.IndexOf(LMask, ':') > 0 then
+      if TStringUtilities.IndexOf(LMask, ':') > 0 then
       begin
         LParsedIp := ParseIPv6(LMask);
       end
@@ -4045,7 +4046,7 @@ begin
   end
   else if TIPAddressUtilities.IsValidIPv4WithNetmask(AIp) or TIPAddressUtilities.IsValidIPv4(AIp) then
   begin
-    LSlashIndex := TPlatform.IndexOf(AIp, '/');
+    LSlashIndex := TStringUtilities.IndexOf(AIp, '/');
 
     if LSlashIndex = 0 then
     begin
@@ -4059,7 +4060,7 @@ begin
       // LSlashIndex is 1-based position of '/', copy from start to slash (exclusive)
       ParseIPv4(System.Copy(AIp, 1, LSlashIndex - 1), LAddr, 0);
       LMask := System.Copy(AIp, LSlashIndex + 1, System.Length(AIp) - LSlashIndex);
-      if TPlatform.IndexOf(LMask, '.') > 0 then
+      if TStringUtilities.IndexOf(LMask, '.') > 0 then
       begin
         ParseIPv4(LMask, LAddr, 4);
       end
@@ -4155,11 +4156,11 @@ var
   LTokens: TCryptoLibStringArray;
 begin
   LProcessedIp := AIp;
-  if TPlatform.StartsWith(LProcessedIp, '::') then
+  if TStringUtilities.StartsWith(LProcessedIp, '::') then
   begin
     LProcessedIp := System.Copy(LProcessedIp, 2, System.Length(LProcessedIp) - 1);
   end
-  else if TPlatform.EndsWith(LProcessedIp, '::') then
+  else if TStringUtilities.EndsWith(LProcessedIp, '::') then
   begin
     LProcessedIp := System.Copy(LProcessedIp, 1, System.Length(LProcessedIp) - 1);
   end;
@@ -4201,7 +4202,7 @@ begin
     end
     else
     begin
-      if TPlatform.IndexOf(LSegment, '.') = 0 then
+      if TStringUtilities.IndexOf(LSegment, '.') = 0 then
       begin
         // Parse as hex
         LVal[LIndex] := StrToInt('$' + LSegment);
@@ -4371,13 +4372,17 @@ begin
     if ANames[I] = nil then
       raise EArgumentNilCryptoLibException.Create('names cannot contain null');
   end;
-  FNames := TArrayUtils.Clone<IGeneralName>(ANames);
+  FNames := TArrayUtilities.Clone<IGeneralName>(ANames,
+    function(A: IGeneralName): IGeneralName
+    begin
+      Result := A;
+    end);
 end;
 
 constructor TGeneralNames.Create(const ASeq: IAsn1Sequence);
 begin
   inherited Create();
-  FNames := TCollectionUtilities.Map<IAsn1Encodable, IGeneralName>(ASeq.Elements,
+  FNames := TArrayUtilities.Map<IAsn1Encodable, IGeneralName>(ASeq.Elements,
     function(AElement: IAsn1Encodable): IGeneralName
     begin
       Result := TGeneralName.GetInstance(AElement);
@@ -4391,7 +4396,11 @@ end;
 
 function TGeneralNames.GetNames: TCryptoLibGenericArray<IGeneralName>;
 begin
-  Result := TArrayUtils.Clone<IGeneralName>(FNames);
+  Result := TArrayUtilities.Clone<IGeneralName>(FNames,
+    function(A: IGeneralName): IGeneralName
+    begin
+      Result := A;
+    end);
 end;
 
 function TGeneralNames.ToAsn1Object: IAsn1Object;
@@ -4872,7 +4881,7 @@ begin
     Exit;
   end;
 
-  raise EArgumentCryptoLibException.Create('unknown object in factory: ' + TPlatform.GetTypeName(AObj));
+  raise EArgumentCryptoLibException.Create('unknown object in factory: ' + TPlatformUtilities.GetTypeName(AObj));
 end;
 
 class function TX509Extensions.GetInstance(const AObj: IAsn1Convertible): IX509Extensions;
@@ -5577,9 +5586,13 @@ var
 begin
   inherited Create();
   FConverter := CreateDefaultConverter();
-  FOids := TArrayUtils.Clone<IDerObjectIdentifier>(AOids);
-  FValues := TArrayUtils.Clone(AValues);
-  FValueList := TArrayUtils.Clone(AValues);
+  FOids := TArrayUtilities.Clone<IDerObjectIdentifier>(AOids,
+    function(A: IDerObjectIdentifier): IDerObjectIdentifier
+    begin
+      Result := A;
+    end);
+  FValues := System.Copy(AValues);
+  FValueList := System.Copy(AValues);
   // Initialize FAdded array - all false for direct constructor
   System.SetLength(FAdded, System.Length(FOids));
   for I := 0 to System.Length(FAdded) - 1 do
@@ -5590,12 +5603,16 @@ end;
 
 function TX509Name.GetOids: TCryptoLibGenericArray<IDerObjectIdentifier>;
 begin
-  Result := TArrayUtils.Clone<IDerObjectIdentifier>(FOids);
+  Result := TArrayUtilities.Clone<IDerObjectIdentifier>(FOids,
+    function(A: IDerObjectIdentifier): IDerObjectIdentifier
+    begin
+      Result := A;
+    end);
 end;
 
 function TX509Name.GetValues: TCryptoLibStringArray;
 begin
-  Result := TArrayUtils.Clone(FValues);
+  Result := System.Copy(FValues);
 end;
 
 function TX509Name.GetValueList: TCryptoLibStringArray;
@@ -5949,7 +5966,7 @@ class function TX509Name.DecodeOid(const AName: String;
 var
   LOid: IDerObjectIdentifier;
 begin
-  if (System.Length(AName) >= 4) and TPlatform.StartsWith(AName, 'OID.', True) then
+  if (System.Length(AName) >= 4) and TStringUtilities.StartsWith(AName, 'OID.', True) then
   begin
     // Skip "OID." (4 characters), copy rest of string
     Result := TDerObjectIdentifier.Create(System.Copy(AName, 5, System.Length(AName) - 4));
@@ -6104,7 +6121,11 @@ end;
 
 function TX509Name.GetOidList: TCryptoLibGenericArray<IDerObjectIdentifier>;
 begin
-  Result := TArrayUtils.Clone<IDerObjectIdentifier>(FOids);
+  Result := TArrayUtilities.Clone<IDerObjectIdentifier>(FOids,
+    function(A: IDerObjectIdentifier): IDerObjectIdentifier
+    begin
+      Result := A;
+    end);
 end;
 
 function TX509Name.GetValueList(const AOid: IDerObjectIdentifier): TCryptoLibStringArray;
@@ -6120,7 +6141,7 @@ begin
       if (AOid = nil) or AOid.Equals(FOids[I]) then
       begin
         LValue := FValues[I];
-        if TPlatform.StartsWith(LValue, '\#') then
+        if TStringUtilities.StartsWith(LValue, '\#') then
         begin
           // Skip '\' at position 1, copy rest of string
           LValue := System.Copy(LValue, 2, System.Length(LValue) - 1);

+ 2 - 2
CryptoLib/src/Asn1/X509/ClpX509ExtensionUtilities.pas

@@ -31,7 +31,7 @@ uses
   ClpDigestUtilities,
   ClpBigInteger,
   ClpCryptoLibTypes,
-  ClpArrayUtils;
+  ClpArrayUtilities;
 
 type
   /// <summary>
@@ -182,7 +182,7 @@ var
   LId: TCryptoLibByteArray;
 begin
   LSha1 := CalculateSha1(ASpki);
-  LId := TArrayUtils.CopyOfRange(LSha1, System.Length(LSha1) - 8, System.Length(LSha1));
+  LId := TArrayUtilities.CopyOfRange<Byte>(LSha1, System.Length(LSha1) - 8, System.Length(LSha1));
   LId[0] := LId[0] and $0F;
   LId[0] := LId[0] or $40;
   Result := TSubjectKeyIdentifier.Create(LId);

+ 4 - 4
CryptoLib/src/Crypto/Ciphers/ClpBlockCipherModes.pas

@@ -28,7 +28,7 @@ uses
   ClpBufferedBlockCipher,
   ClpICipherParameters,
   ClpIParametersWithIV,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes,
   ClpIBlockCipherModes;
 
@@ -789,7 +789,7 @@ end;
 procedure TCbcBlockCipher.Reset;
 begin
   System.Move(FIV[0], FcbcV[0], System.Length(FIV));
-  TArrayUtils.ZeroFill(FcbcNextV);
+  TArrayUtilities.Fill<Byte>(FcbcNextV, 0, System.Length(FcbcNextV), Byte(0));
 
   Fcipher.Reset();
 end;
@@ -1005,7 +1005,7 @@ begin
     diff := System.Length(FIV) - System.Length(iv);
 
     System.Move(iv[0], FIV[diff], System.Length(iv) * System.SizeOf(Byte));
-    TArrayUtils.Fill(FIV, 0, diff, Byte(0));
+    TArrayUtilities.Fill<Byte>(FIV, 0, diff, Byte(0));
 
     Lparameters := ivParam.parameters;
   end;
@@ -1179,7 +1179,7 @@ end;
 
 procedure TSicBlockCipher.Reset;
 begin
-  TArrayUtils.ZeroFill(Fcounter);
+  TArrayUtilities.Fill<Byte>(Fcounter, 0, System.Length(Fcounter), Byte(0));
   System.Move(FIV[0], Fcounter[0], System.Length(FIV) * System.SizeOf(Byte));
 
   Fcipher.Reset();

+ 2 - 2
CryptoLib/src/Crypto/Ciphers/ClpBufferedBlockCipher.pas

@@ -29,7 +29,7 @@ uses
   ClpIBufferedBlockCipher,
   ClpICipherParameters,
   ClpIParametersWithRandom,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 resourcestring
@@ -540,7 +540,7 @@ end;
 
 procedure TBufferedBlockCipher.Reset;
 begin
-  TArrayUtils.ZeroFill(Fbuf);
+  TArrayUtilities.Fill<Byte>(Fbuf, 0, System.Length(Fbuf), Byte(0));
   FbufOff := 0;
 
   Fcipher.Reset();

+ 2 - 2
CryptoLib/src/Crypto/Ciphers/ClpCipherUtilities.pas

@@ -38,7 +38,7 @@ uses
   ClpIStreamCipher,
   ClpNistObjectIdentifiers,
   ClpPkcsObjectIdentifiers,
-  ClpStringUtils,
+  ClpStringUtilities,
   ClpPaddingModes,
   ClpIPaddingModes,
   ClpBlockCipherModes,
@@ -262,7 +262,7 @@ var
   LPadding: IBlockCipherPadding;
 begin
   Result := nil;
-  LParts := TStringUtils.SplitString(AMechanism, '/');
+  LParts := TStringUtilities.SplitString(AMechanism, '/');
   if System.Length(LParts) < 1 then
     Exit;
 

+ 4 - 4
CryptoLib/src/Crypto/Engines/ClpAesEngine.pas

@@ -30,7 +30,7 @@ uses
   ClpCheck,
   ClpBits,
   ClpConverters,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 resourcestring
@@ -500,7 +500,7 @@ begin
   keyLen := System.Length(key);
   if ((keyLen < 16) or (keyLen > 32) or ((keyLen and 7) <> 0)) then
   begin
-    TArrayUtils.ZeroFill(key);
+    TArrayUtilities.Fill<Byte>(key, 0, System.Length(key), Byte(0));
     raise EArgumentCryptoLibException.CreateRes(@SInvalidKeyLength);
   end;
 
@@ -678,7 +678,7 @@ begin
       end
   else
     begin
-      TArrayUtils.ZeroFill(key);
+      TArrayUtilities.Fill<Byte>(key, 0, System.Length(key), Byte(0));
       raise EInvalidOperationCryptoLibException.CreateRes(@SInvalidOperation);
     end;
   end;
@@ -699,7 +699,7 @@ begin
 
   result := bigW;
 
-  TArrayUtils.ZeroFill(key);
+  TArrayUtilities.Fill<Byte>(key, 0, System.Length(key), Byte(0));
 end;
 
 function TAesEngine.GetAlgorithmName: String;

+ 4 - 4
CryptoLib/src/Crypto/Engines/ClpAesLightEngine.pas

@@ -30,7 +30,7 @@ uses
   ClpCheck,
   ClpBits,
   ClpConverters,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 resourcestring
@@ -426,7 +426,7 @@ begin
   keyLen := System.Length(key);
   if ((keyLen < 16) or (keyLen > 32) or ((keyLen and 7) <> 0)) then
   begin
-    TArrayUtils.ZeroFill(key);
+    TArrayUtilities.Fill<Byte>(key, 0, System.Length(key), Byte(0));
     raise EArgumentCryptoLibException.CreateRes(@SInvalidKeyLength);
   end;
 
@@ -604,7 +604,7 @@ begin
       end
   else
     begin
-      TArrayUtils.ZeroFill(key);
+      TArrayUtilities.Fill<Byte>(key, 0, System.Length(key), Byte(0));
       raise EInvalidOperationCryptoLibException.CreateRes(@SInvalidOperation);
     end;
   end;
@@ -625,7 +625,7 @@ begin
 
   result := bigW;
 
-  TArrayUtils.ZeroFill(key);
+  TArrayUtilities.Fill<Byte>(key, 0, System.Length(key), Byte(0));
 end;
 
 function TAesLightEngine.GetAlgorithmName: String;

+ 3 - 3
CryptoLib/src/Crypto/Engines/ClpBlowfishEngine.pas

@@ -29,7 +29,7 @@ uses
   ClpIBlowfishEngine,
   ClpCheck,
   ClpConverters,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 resourcestring
@@ -327,7 +327,7 @@ begin
   if ((keyLength < 4) or (keyLength > 56) or (((keyLength * 8) and 7) <> 0))
   then
   begin
-    TArrayUtils.ZeroFill(key);
+    TArrayUtilities.Fill<Byte>(key, 0, System.Length(key), Byte(0));
     raise EArgumentCryptoLibException.CreateRes(@SInvalidKeyLength);
   end;
 
@@ -413,7 +413,7 @@ begin
   ProcessTable(FS1[SBOX_SK - 2], FS1[SBOX_SK - 1], FS2);
   ProcessTable(FS2[SBOX_SK - 2], FS2[SBOX_SK - 1], FS3);
 
-  TArrayUtils.ZeroFill(key);
+  TArrayUtilities.Fill<Byte>(key, 0, System.Length(key), Byte(0));
 end;
 
 procedure TBlowfishEngine.EncryptBlock(const src: TCryptoLibByteArray;

+ 5 - 5
CryptoLib/src/Crypto/Engines/ClpChaChaEngine.pas

@@ -27,7 +27,7 @@ uses
   ClpIChaChaEngine,
   ClpSalsa20Engine,
   ClpConverters,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 type
@@ -243,8 +243,8 @@ begin
   begin
     if not(Byte(System.Length(keyBytes)) in [16, 32]) then
     begin
-      TArrayUtils.ZeroFill(keyBytes);
-      TArrayUtils.ZeroFill(ivBytes);
+      TArrayUtilities.Fill<Byte>(keyBytes, 0, System.Length(keyBytes), Byte(0));
+      TArrayUtilities.Fill<Byte>(ivBytes, 0, System.Length(ivBytes), Byte(0));
       raise EArgumentCryptoLibException.CreateResFmt(@SInvalidKeySize,
         [AlgorithmName]);
     end;
@@ -263,8 +263,8 @@ begin
   TConverters.le32_copy(PByte(ivBytes), 0, PCardinal(FEngineState),
     14 * System.SizeOf(UInt32), 2 * System.SizeOf(UInt32));
 
-  TArrayUtils.ZeroFill(keyBytes);
-  TArrayUtils.ZeroFill(ivBytes);
+  TArrayUtilities.Fill<Byte>(keyBytes, 0, System.Length(keyBytes), Byte(0));
+  TArrayUtilities.Fill<Byte>(ivBytes, 0, System.Length(ivBytes), Byte(0));
 end;
 
 end.

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

@@ -43,7 +43,7 @@ uses
   ClpIKdfParameters,
   ClpIIESWithCipherParameters,
   ClpConverters,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpBigInteger,
   ClpBigIntegers,
   ClpCryptoLibTypes;
@@ -358,7 +358,7 @@ begin
 
   // Verify the MAC.
   endPoint := inOff + inLen;
-  T1 := TArrayUtils.CopyOfRange(in_enc, endPoint - Fmac.GetMacSize, endPoint);
+  T1 := TArrayUtilities.CopyOfRange<Byte>(in_enc, endPoint - Fmac.GetMacSize, endPoint);
   System.SetLength(T2, System.Length(T1));
 
   Fmac.Init((TKeyParameter.Create(K2) as IKeyParameter) as ICipherParameters);
@@ -368,7 +368,7 @@ begin
 
   T2 := SimilarMacCompute(p2, L2);
 
-  if (not TArrayUtils.ConstantTimeAreEqual(T1, T2)) then
+  if not TArrayUtilities.FixedTimeEquals(T1, T2) then
   begin
     raise EInvalidCipherTextCryptoLibException.CreateRes(@SInvalidMAC);
   end;
@@ -382,7 +382,7 @@ begin
   begin
     len := len + Fcipher.DoFinal(M, len);
 
-    Result := TArrayUtils.CopyOfRange(M, 0, len);
+    Result := TArrayUtilities.CopyOfRange<Byte>(M, 0, len);
     Exit;
   end;
 end;
@@ -591,7 +591,7 @@ begin
         end;
 
         encLength := (inLen - (bIn.Size - bIn.Position));
-        FV := TArrayUtils.CopyOfRange(&in, inOff, inOff + encLength);
+        FV := TArrayUtilities.CopyOfRange<Byte>(&in, inOff, inOff + encLength);
 
       finally
         bIn.Free;
@@ -607,8 +607,8 @@ begin
   // Create input to KDF.
   if (System.Length(FV) <> 0) then
   begin
-    VZ := TArrayUtils.Concatenate(FV, BigZ);
-    TArrayUtils.ZeroFill(BigZ);
+    VZ := TArrayUtilities.Concatenate<Byte>(FV, BigZ);
+    TArrayUtilities.Fill<Byte>(BigZ, 0, System.Length(BigZ), Byte(0));
     BigZ := VZ;
   end;
 
@@ -629,7 +629,7 @@ begin
     end;
 
   finally
-    TArrayUtils.ZeroFill(BigZ);
+    TArrayUtilities.Fill<Byte>(BigZ, 0, System.Length(BigZ), Byte(0));
   end;
 end;
 

+ 4 - 4
CryptoLib/src/Crypto/Engines/ClpPascalCoinIESEngine.pas

@@ -35,7 +35,7 @@ uses
   ClpKdfParameters,
   ClpIKdfParameters,
   ClpIESEngine,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpBigInteger,
   ClpBigIntegers,
   ClpCryptoLibTypes;
@@ -141,7 +141,7 @@ begin
 
   T2 := Fmac.DoFinal();
 
-  if (not TArrayUtils.ConstantTimeAreEqual(T1, T2)) then
+  if not TArrayUtilities.FixedTimeEquals(T1, T2) then
   begin
     raise EInvalidCipherTextCryptoLibException.CreateRes(@SInvalidMAC);
   end;
@@ -281,7 +281,7 @@ begin
         end;
 
         encLength := (inLen - (bIn.Size - bIn.Position));
-        FV := TArrayUtils.CopyOfRange(&in, inOff + SECURE_HEAD_SIZE,
+        FV := TArrayUtilities.CopyOfRange<Byte>(&in, inOff + SECURE_HEAD_SIZE,
           inOff + encLength);
 
       finally
@@ -313,7 +313,7 @@ begin
     end;
 
   finally
-    TArrayUtils.ZeroFill(BigZ);
+    TArrayUtilities.Fill<Byte>(BigZ, 0, System.Length(BigZ), Byte(0));
   end;
 end;
 

+ 3 - 3
CryptoLib/src/Crypto/Engines/ClpRijndaelEngine.pas

@@ -28,7 +28,7 @@ uses
   ClpIRijndaelEngine,
   ClpIKeyParameter,
   ClpICipherParameters,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 resourcestring
@@ -547,7 +547,7 @@ begin
       KC := 8
   else
     begin
-      TArrayUtils.ZeroFill(key);
+      TArrayUtilities.Fill<Byte>(key, 0, System.Length(key), Byte(0));
       raise EArgumentCryptoLibException.CreateRes(@SInvalidKeyLength);
     end;
   end;
@@ -657,7 +657,7 @@ begin
   end;
   result := W;
 
-  TArrayUtils.ZeroFill(key);
+  TArrayUtilities.Fill<Byte>(key, 0, System.Length(key), Byte(0));
 end;
 
 procedure TRijndaelEngine.PackBlock(const bytes: TCryptoLibByteArray;

+ 6 - 6
CryptoLib/src/Crypto/Engines/ClpSalsa20Engine.pas

@@ -31,7 +31,7 @@ uses
   ClpICipherParameters,
   ClpIParametersWithIV,
   ClpConverters,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 resourcestring
@@ -216,7 +216,7 @@ begin
   iv := ivParams.GetIV();
   if ((iv = Nil) or (System.Length(iv) <> NonceSize)) then
   begin
-    TArrayUtils.ZeroFill(iv);
+    TArrayUtilities.Fill<Byte>(iv, 0, System.Length(iv), Byte(0));
     raise EArgumentCryptoLibException.CreateResFmt(@SInvalidIV,
       [AlgorithmName, NonceSize]);
   end;
@@ -478,8 +478,8 @@ begin
   begin
     if not(Byte(System.Length(keyBytes)) in [16, 32]) then
     begin
-      TArrayUtils.ZeroFill(keyBytes);
-      TArrayUtils.ZeroFill(ivBytes);
+      TArrayUtilities.Fill<Byte>(keyBytes, 0, System.Length(keyBytes), Byte(0));
+      TArrayUtilities.Fill<Byte>(ivBytes, 0, System.Length(ivBytes), Byte(0));
       raise EArgumentCryptoLibException.CreateResFmt(@SInvalidKeySize,
         [AlgorithmName]);
     end;
@@ -504,8 +504,8 @@ begin
 
   if (Self.ClassType = TSalsa20Engine) then
   begin
-    TArrayUtils.ZeroFill(keyBytes);
-    TArrayUtils.ZeroFill(ivBytes);
+    TArrayUtilities.Fill<Byte>(keyBytes, 0, System.Length(keyBytes), Byte(0));
+    TArrayUtilities.Fill<Byte>(ivBytes, 0, System.Length(ivBytes), Byte(0));
   end;
 
 end;

+ 8 - 8
CryptoLib/src/Crypto/Engines/ClpSpeckEngine.pas

@@ -28,7 +28,7 @@ uses
   ClpIBlockCipher,
   ClpICipherParameters,
   ClpIKeyParameter,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 resourcestring
@@ -817,7 +817,7 @@ begin
 
   end;
 
-  TArrayUtils.ZeroFill(keyBytes);
+  TArrayUtilities.Fill<Byte>(keyBytes, 0, System.Length(keyBytes), Byte(0));
 end;
 
 { TSpeckUInt64Engine }
@@ -981,7 +981,7 @@ begin
 
   end;
 
-  TArrayUtils.ZeroFill(keyBytes);
+  TArrayUtilities.Fill<Byte>(keyBytes, 0, System.Length(keyBytes), Byte(0));
 end;
 
 { TSpeck32Engine }
@@ -1003,7 +1003,7 @@ begin
   keyBytesSize := System.Length(keyBytes);
   if (keyBytesSize <> 8) then
   begin
-    TArrayUtils.ZeroFill(keyBytes);
+    TArrayUtilities.Fill<Byte>(keyBytes, 0, System.Length(keyBytes), Byte(0));
     raise EArgumentCryptoLibException.CreateResFmt(@SSpeck32InvalidKeySize,
       [keyBytesSize * 8]);
   end;
@@ -1028,7 +1028,7 @@ begin
   keyBytesSize := System.Length(keyBytes);
   if not(keyBytesSize in [9, 12]) then
   begin
-    TArrayUtils.ZeroFill(keyBytes);
+    TArrayUtilities.Fill<Byte>(keyBytes, 0, System.Length(keyBytes), Byte(0));
     raise EArgumentCryptoLibException.CreateResFmt(@SSpeck48InvalidKeySize,
       [keyBytesSize * 8]);
   end;
@@ -1053,7 +1053,7 @@ begin
   keyBytesSize := System.Length(keyBytes);
   if not(keyBytesSize in [12, 16]) then
   begin
-    TArrayUtils.ZeroFill(keyBytes);
+    TArrayUtilities.Fill<Byte>(keyBytes, 0, System.Length(keyBytes), Byte(0));
     raise EArgumentCryptoLibException.CreateResFmt(@SSpeck64InvalidKeySize,
       [keyBytesSize * 8]);
   end;
@@ -1078,7 +1078,7 @@ begin
   keyBytesSize := System.Length(keyBytes);
   if not(keyBytesSize in [12, 18]) then
   begin
-    TArrayUtils.ZeroFill(keyBytes);
+    TArrayUtilities.Fill<Byte>(keyBytes, 0, System.Length(keyBytes), Byte(0));
     raise EArgumentCryptoLibException.CreateResFmt(@SSpeck96InvalidKeySize,
       [keyBytesSize * 8]);
   end;
@@ -1103,7 +1103,7 @@ begin
   keyBytesSize := System.Length(keyBytes);
   if not(keyBytesSize in [16, 24, 32]) then
   begin
-    TArrayUtils.ZeroFill(keyBytes);
+    TArrayUtilities.Fill<Byte>(keyBytes, 0, System.Length(keyBytes), Byte(0));
     raise EArgumentCryptoLibException.CreateResFmt(@SSpeck128InvalidKeySize,
       [keyBytesSize * 8]);
   end;

+ 8 - 8
CryptoLib/src/Crypto/Engines/ClpSpeckLegacyEngine.pas

@@ -28,7 +28,7 @@ uses
   ClpIBlockCipher,
   ClpICipherParameters,
   ClpIKeyParameter,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 resourcestring
@@ -817,7 +817,7 @@ begin
 
   end;
 
-  TArrayUtils.ZeroFill(keyBytes);
+  TArrayUtilities.Fill<Byte>(keyBytes, 0, System.Length(keyBytes), Byte(0));
 end;
 
 { TSpeckUInt64LegacyEngine }
@@ -984,7 +984,7 @@ begin
 
   end;
 
-  TArrayUtils.ZeroFill(keyBytes);
+  TArrayUtilities.Fill<Byte>(keyBytes, 0, System.Length(keyBytes), Byte(0));
 end;
 
 { TSpeck32LegacyEngine }
@@ -1007,7 +1007,7 @@ begin
   keyBytesSize := System.Length(keyBytes);
   if (keyBytesSize <> 8) then
   begin
-    TArrayUtils.ZeroFill(keyBytes);
+    TArrayUtilities.Fill<Byte>(keyBytes, 0, System.Length(keyBytes), Byte(0));
     raise EArgumentCryptoLibException.CreateResFmt
       (@SSpeck32LegacyInvalidKeySize, [keyBytesSize * 8]);
   end;
@@ -1033,7 +1033,7 @@ begin
   keyBytesSize := System.Length(keyBytes);
   if not(keyBytesSize in [9, 12]) then
   begin
-    TArrayUtils.ZeroFill(keyBytes);
+    TArrayUtilities.Fill<Byte>(keyBytes, 0, System.Length(keyBytes), Byte(0));
     raise EArgumentCryptoLibException.CreateResFmt
       (@SSpeck48LegacyInvalidKeySize, [keyBytesSize * 8]);
   end;
@@ -1059,7 +1059,7 @@ begin
   keyBytesSize := System.Length(keyBytes);
   if not(keyBytesSize in [12, 16]) then
   begin
-    TArrayUtils.ZeroFill(keyBytes);
+    TArrayUtilities.Fill<Byte>(keyBytes, 0, System.Length(keyBytes), Byte(0));
     raise EArgumentCryptoLibException.CreateResFmt
       (@SSpeck64LegacyInvalidKeySize, [keyBytesSize * 8]);
   end;
@@ -1085,7 +1085,7 @@ begin
   keyBytesSize := System.Length(keyBytes);
   if not(keyBytesSize in [12, 18]) then
   begin
-    TArrayUtils.ZeroFill(keyBytes);
+    TArrayUtilities.Fill<Byte>(keyBytes, 0, System.Length(keyBytes), Byte(0));
     raise EArgumentCryptoLibException.CreateResFmt
       (@SSpeck96LegacyInvalidKeySize, [keyBytesSize * 8]);
   end;
@@ -1111,7 +1111,7 @@ begin
   keyBytesSize := System.Length(keyBytes);
   if not(keyBytesSize in [16, 24, 32]) then
   begin
-    TArrayUtils.ZeroFill(keyBytes);
+    TArrayUtilities.Fill<Byte>(keyBytes, 0, System.Length(keyBytes), Byte(0));
     raise EArgumentCryptoLibException.CreateResFmt
       (@SSpeck128LegacyInvalidKeySize, [keyBytesSize * 8]);
   end;

+ 5 - 5
CryptoLib/src/Crypto/Engines/ClpXSalsa20Engine.pas

@@ -26,7 +26,7 @@ uses
   ClpSalsa20Engine,
   ClpIXSalsa20Engine,
   ClpConverters,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 resourcestring
@@ -80,8 +80,8 @@ begin
 
   if (System.Length(keyBytes) <> 32) then
   begin
-    TArrayUtils.ZeroFill(keyBytes);
-    TArrayUtils.ZeroFill(ivBytes);
+    TArrayUtilities.Fill<Byte>(keyBytes, 0, System.Length(keyBytes), Byte(0));
+    TArrayUtilities.Fill<Byte>(ivBytes, 0, System.Length(ivBytes), Byte(0));
     raise EArgumentCryptoLibException.CreateResFmt(@SInvalidKeySize,
       [AlgorithmName]);
   end;
@@ -114,8 +114,8 @@ begin
     PCardinal(FEngineState), 6 * System.SizeOf(UInt32),
     2 * System.SizeOf(UInt32));
 
-  TArrayUtils.ZeroFill(keyBytes);
-  TArrayUtils.ZeroFill(ivBytes);
+  TArrayUtilities.Fill<Byte>(keyBytes, 0, System.Length(keyBytes), Byte(0));
+  TArrayUtilities.Fill<Byte>(ivBytes, 0, System.Length(ivBytes), Byte(0));
 end;
 
 end.

+ 2 - 2
CryptoLib/src/Crypto/Generators/ClpArgon2ParametersGenerator.pas

@@ -34,7 +34,7 @@ uses
   ClpIKeyParameter,
   ClpParametersWithIV,
   ClpParameterUtilities,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 resourcestring
@@ -137,7 +137,7 @@ implementation
 
 procedure TArgon2ParametersGenerator.Clear();
 begin
-  TArrayUtils.ZeroFill(FPassword);
+  TArrayUtilities.Fill<Byte>(FPassword, 0, System.Length(FPassword), Byte(0));
 
   if FArgon2Parameters <> Nil then
   begin

+ 2 - 2
CryptoLib/src/Crypto/Generators/ClpGeneratorUtilities.pas

@@ -50,7 +50,7 @@ uses
   ClpRosstandartObjectIdentifiers,
   ClpRsaKeyPairGenerator,
   ClpSecObjectIdentifiers,
-  ClpStringUtils,
+  ClpStringUtilities,
   ClpX25519KeyPairGenerator,
   ClpX9ObjectIdentifiers;
 
@@ -378,7 +378,7 @@ begin
     Result := TRsaKeyPairGenerator.Create() as IRsaKeyPairGenerator;
     Exit;
   end;
-  if TStringUtils.BeginsWith(LCanonicalName, 'EC', True) then
+  if TStringUtilities.StartsWith(LCanonicalName, 'EC', True) then
   begin
     Result := TECKeyPairGenerator.Create(LCanonicalName) as IECKeyPairGenerator;
     Exit;

+ 3 - 3
CryptoLib/src/Crypto/Generators/ClpPkcs5S2ParametersGenerator.pas

@@ -33,7 +33,7 @@ uses
   ClpParametersWithIV,
   ClpParameterUtilities,
   ClpPbeParametersGenerator,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 type
@@ -136,8 +136,8 @@ implementation
 
 procedure TPkcs5S2ParametersGenerator.Clear();
 begin
-  TArrayUtils.ZeroFill(FPassword);
-  TArrayUtils.ZeroFill(FSalt);
+  TArrayUtilities.Fill<Byte>(FPassword, 0, System.Length(FPassword), Byte(0));
+  TArrayUtilities.Fill<Byte>(FSalt, 0, System.Length(FSalt), Byte(0));
 
   if FPBKDF2_HMAC <> Nil then
   begin

+ 3 - 3
CryptoLib/src/Crypto/Generators/ClpScryptParametersGenerator.pas

@@ -32,7 +32,7 @@ uses
   ClpIKeyParameter,
   ClpParametersWithIV,
   ClpParameterUtilities,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 type
@@ -122,8 +122,8 @@ implementation
 
 procedure TScryptParametersGenerator.Clear();
 begin
-  TArrayUtils.ZeroFill(FPassword);
-  TArrayUtils.ZeroFill(FSalt);
+  TArrayUtilities.Fill<Byte>(FPassword, 0, System.Length(FPassword), Byte(0));
+  TArrayUtilities.Fill<Byte>(FSalt, 0, System.Length(FSalt), Byte(0));
 
   if FPBKDF_Scrypt <> Nil then
   begin

+ 8 - 7
CryptoLib/src/Crypto/Macs/ClpMacUtilities.pas

@@ -39,7 +39,8 @@ uses
   ClpPkcsObjectIdentifiers,
   ClpRosstandartObjectIdentifiers,
   ClpHMac,
-  ClpPlatform;
+  ClpStringUtilities,
+  ClpPlatformUtilities;
 
 resourcestring
   SOidNil = 'OID Cannot be Nil';
@@ -150,15 +151,15 @@ var
 begin
   Result := nil;
   LMechanism := AMechanism;
-  if TPlatform.StartsWith(LMechanism, 'PBEWITH') then
-    LMechanism := TPlatform.Substring(LMechanism, System.Length('PBEWITH') + 1);
+  if TStringUtilities.StartsWith(LMechanism, 'PBEWITH') then
+    LMechanism := TStringUtilities.Substring(LMechanism, System.Length('PBEWITH') + 1);
 
-  if TPlatform.StartsWith(LMechanism, 'HMAC') then
+  if TStringUtilities.StartsWith(LMechanism, 'HMAC') then
   begin
-    if TPlatform.StartsWith(LMechanism, 'HMAC-') or TPlatform.StartsWith(LMechanism, 'HMAC/') then
-      LDigestName := TPlatform.Substring(LMechanism, 6)
+    if TStringUtilities.StartsWith(LMechanism, 'HMAC-') or TStringUtilities.StartsWith(LMechanism, 'HMAC/') then
+      LDigestName := TStringUtilities.Substring(LMechanism, 6)
     else
-      LDigestName := TPlatform.Substring(LMechanism, 5);
+      LDigestName := TStringUtilities.Substring(LMechanism, 5);
     if LDigestName = 'SHA512-224' then
       LDigestName := 'SHA-512/224'
     else if LDigestName = 'SHA512-256' then

+ 2 - 2
CryptoLib/src/Crypto/Operators/ClpDefaultVerifierResult.pas

@@ -25,7 +25,7 @@ uses
   ClpIVerifier,
   ClpISigner,
   ClpCryptoLibTypes,
-  ClpArrayUtils;
+  ClpArrayUtilities;
 
 type
   /// <summary>
@@ -63,7 +63,7 @@ function TDefaultVerifierResult.IsVerified(const ASource: TCryptoLibByteArray; A
 var
   LSignature: TCryptoLibByteArray;
 begin
-  LSignature := TArrayUtils.CopyOfRange(ASource, AOff, AOff + ALength);
+  LSignature := TArrayUtilities.CopyOfRange<Byte>(ASource, AOff, AOff + ALength);
   Result := FSigner.VerifySignature(LSignature);
 end;
 

+ 3 - 3
CryptoLib/src/Crypto/Parameters/ClpDHValidationParameters.pas

@@ -23,7 +23,7 @@ interface
 
 uses
   ClpIDHValidationParameters,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 resourcestring
@@ -80,7 +80,7 @@ begin
     result := True;
     Exit;
   end;
-  result := (counter = other.counter) and TArrayUtils.AreEqual(seed,
+  result := (counter = other.counter) and TArrayUtilities.AreEqual<Byte>(seed,
     other.seed);
 end;
 
@@ -92,7 +92,7 @@ end;
 function TDHValidationParameters.GetHashCode: {$IFDEF DELPHI}Int32; {$ELSE}PtrInt;
 {$ENDIF DELPHI}
 begin
-  result := counter xor TArrayUtils.GetArrayHashCode(seed);
+  result := counter xor TArrayUtilities.GetArrayHashCode(seed);
 end;
 
 function TDHValidationParameters.GetSeed: TCryptoLibByteArray;

+ 3 - 3
CryptoLib/src/Crypto/Parameters/ClpDsaValidationParameters.pas

@@ -23,7 +23,7 @@ interface
 
 uses
   ClpIDsaValidationParameters,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 resourcestring
@@ -93,7 +93,7 @@ begin
     result := True;
     Exit;
   end;
-  result := (counter = other.counter) and TArrayUtils.AreEqual(seed,
+  result := (counter = other.counter) and TArrayUtilities.AreEqual<Byte>(seed,
     other.seed);
 end;
 
@@ -105,7 +105,7 @@ end;
 function TDsaValidationParameters.GetHashCode: {$IFDEF DELPHI}Int32; {$ELSE}PtrInt;
 {$ENDIF DELPHI}
 begin
-  result := counter xor TArrayUtils.GetArrayHashCode(seed);
+  result := counter xor TArrayUtilities.GetArrayHashCode(seed);
 end;
 
 function TDsaValidationParameters.GetSeed: TCryptoLibByteArray;

+ 3 - 3
CryptoLib/src/Crypto/Parameters/ClpEd25519PrivateKeyParameters.pas

@@ -30,7 +30,7 @@ uses
   ClpIEd25519PrivateKeyParameters,
   ClpIEd25519PublicKeyParameters,
   ClpEd25519PublicKeyParameters,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpAsn1Objects,
   ClpStreams,
   ClpStreamUtilities,
@@ -150,13 +150,13 @@ begin
     result := false;
     Exit;
   end;
-  result := TArrayUtils.ConstantTimeAreEqual(FData, other.GetEncoded())
+  result := TArrayUtilities.FixedTimeEquals(FData, other.GetEncoded())
 end;
 
 function TEd25519PrivateKeyParameters.GetHashCode: {$IFDEF DELPHI}Int32; {$ELSE}PtrInt;
 {$ENDIF DELPHI}
 begin
-  result := TArrayUtils.GetArrayHashCode(FData);
+  result := TArrayUtilities.GetArrayHashCode(FData);
 end;
 
 procedure TEd25519PrivateKeyParameters.Sign

+ 3 - 3
CryptoLib/src/Crypto/Parameters/ClpEd25519PublicKeyParameters.pas

@@ -26,7 +26,7 @@ uses
   ClpEd25519,
   ClpAsymmetricKeyParameter,
   ClpIEd25519PublicKeyParameters,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpAsn1Objects,
   ClpStreams,
   ClpStreamUtilities,
@@ -108,13 +108,13 @@ begin
     result := false;
     Exit;
   end;
-  result := TArrayUtils.ConstantTimeAreEqual(FData, other.GetEncoded())
+  result := TArrayUtilities.FixedTimeEquals(FData, other.GetEncoded())
 end;
 
 function TEd25519PublicKeyParameters.GetHashCode: {$IFDEF DELPHI}Int32; {$ELSE}PtrInt;
 {$ENDIF DELPHI}
 begin
-  result := TArrayUtils.GetArrayHashCode(FData);
+  result := TArrayUtilities.GetArrayHashCode(FData);
 end;
 
 end.

+ 2 - 2
CryptoLib/src/Crypto/Parameters/ClpKeyParameter.pas

@@ -24,7 +24,7 @@ interface
 uses
   ClpIKeyParameter,
   ClpICipherParameters,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 resourcestring
@@ -67,7 +67,7 @@ end;
 
 procedure TKeyParameter.Clear;
 begin
-  TArrayUtils.ZeroFill(Fkey);
+  TArrayUtilities.Fill<Byte>(Fkey, 0, System.Length(Fkey), Byte(0));
 end;
 
 constructor TKeyParameter.Create(const key: TCryptoLibByteArray;

+ 3 - 3
CryptoLib/src/Crypto/Parameters/ClpParametersWithIV.pas

@@ -24,7 +24,7 @@ interface
 uses
   ClpIParametersWithIV,
   ClpICipherParameters,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 resourcestring
@@ -66,7 +66,7 @@ end;
 
 procedure TParametersWithIV.Clear;
 begin
-  TArrayUtils.ZeroFill(Fiv);
+  TArrayUtilities.Fill<Byte>(Fiv, 0, System.Length(Fiv), Byte(0));
 end;
 
 constructor TParametersWithIV.Create(const parameters: ICipherParameters;
@@ -80,7 +80,7 @@ begin
   end;
 
   Fparameters := parameters;
-  Fiv := TArrayUtils.CopyOfRange(iv, ivOff, ivOff + ivLen);
+  Fiv := TArrayUtilities.CopyOfRange<Byte>(iv, ivOff, ivOff + ivLen);
 end;
 
 destructor TParametersWithIV.Destroy;

+ 3 - 3
CryptoLib/src/Crypto/Parameters/ClpX25519PrivateKeyParameters.pas

@@ -29,7 +29,7 @@ uses
   ClpIX25519PrivateKeyParameters,
   ClpIX25519PublicKeyParameters,
   ClpX25519PublicKeyParameters,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpAsn1Objects,
   ClpStreams,
   ClpStreamUtilities,
@@ -148,13 +148,13 @@ begin
     result := false;
     Exit;
   end;
-  result := TArrayUtils.ConstantTimeAreEqual(FData, other.GetEncoded())
+  result := TArrayUtilities.FixedTimeEquals(FData, other.GetEncoded())
 end;
 
 function TX25519PrivateKeyParameters.GetHashCode: {$IFDEF DELPHI}Int32; {$ELSE}PtrInt;
 {$ENDIF DELPHI}
 begin
-  result := TArrayUtils.GetArrayHashCode(FData);
+  result := TArrayUtilities.GetArrayHashCode(FData);
 end;
 
 end.

+ 3 - 3
CryptoLib/src/Crypto/Parameters/ClpX25519PublicKeyParameters.pas

@@ -26,7 +26,7 @@ uses
   ClpX25519,
   ClpAsymmetricKeyParameter,
   ClpIX25519PublicKeyParameters,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpAsn1Objects,
   ClpStreams,
   ClpStreamUtilities,
@@ -108,13 +108,13 @@ begin
     result := false;
     Exit;
   end;
-  result := TArrayUtils.ConstantTimeAreEqual(FData, other.GetEncoded())
+  result := TArrayUtilities.FixedTimeEquals(FData, other.GetEncoded())
 end;
 
 function TX25519PublicKeyParameters.GetHashCode: {$IFDEF DELPHI}Int32; {$ELSE}PtrInt;
 {$ENDIF DELPHI}
 begin
-  result := TArrayUtils.GetArrayHashCode(FData);
+  result := TArrayUtilities.GetArrayHashCode(FData);
 end;
 
 end.

+ 6 - 5
CryptoLib/src/Crypto/Randoms/ClpSecureRandom.pas

@@ -34,12 +34,13 @@ uses
   ClpRandom,
   ClpOSRandomProvider,
   ClpDigestUtilities,
+  ClpStringUtilities,
   ClpCryptoApiRandomGenerator,
   ClpICryptoApiRandomGenerator,
   ClpDigestRandomGenerator,
   ClpIDigestRandomGenerator,
   ClpISecureRandom,
-  ClpPlatform;
+  ClpPlatformUtilities;
 
 resourcestring
   SUnRecognisedPRNGAlgorithm = 'Unrecognised PRNG Algorithm: %s "algorithm"';
@@ -339,14 +340,14 @@ var
   LPrng: IDigestRandomGenerator;
   LPrngIndex: Int32;
 begin
-  LUpper := TPlatform.ToUpperInvariant(AAlgorithm);
+  LUpper := TStringUtilities.ToUpperInvariant(AAlgorithm);
 
-  if TPlatform.EndsWith(LUpper, 'PRNG', True) then
+  if TStringUtilities.EndsWith(LUpper, 'PRNG', True) then
   begin
-    LPrngIndex := TPlatform.LastIndexOf(LUpper, 'PRNG');
+    LPrngIndex := TStringUtilities.LastIndexOf(LUpper, 'PRNG');
     if LPrngIndex > 0 then
     begin
-      LDigestName := TPlatform.Substring(LUpper, 1, LPrngIndex - 1);
+      LDigestName := TStringUtilities.Substring(LUpper, 1, LPrngIndex - 1);
     end
     else
     begin

+ 15 - 6
CryptoLib/src/Crypto/Signers/ClpECSchnorrSipaSigner.pas

@@ -38,7 +38,7 @@ uses
   ClpECAlgorithms,
   ClpDigestUtilities,
   ClpParameterUtilities,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 resourcestring
@@ -128,7 +128,7 @@ begin
 
   LPrivateKey := (FKey as IECPrivateKeyParameters).D;
 
-  LInput := TArrayUtils.Concatenate(TBigIntegers.BigIntegerToBytes(LPrivateKey,
+  LInput := TArrayUtilities.Concatenate<Byte>(TBigIntegers.BigIntegerToBytes(LPrivateKey,
     LNumBytes), AMessage);
 
   LK := TBigInteger.Create(1, TDigestUtilities.DoFinal(FDigest, LInput)).&Mod(LN);
@@ -148,8 +148,13 @@ begin
   end;
 
   LP := G.Multiply(LPrivateKey);
-  LKeyPrefixedM := TArrayUtils.Concatenate(TBigIntegers.BigIntegerToBytes(LXr,
-    LNumBytes), TCryptoLibMatrixByteArray.Create(LP.GetEncoded(true), AMessage));
+
+  LKeyPrefixedM := TArrayUtilities.Concatenate<Byte>
+  ([
+    TBigIntegers.BigIntegerToBytes(LXr, LNumBytes),
+    LP.GetEncoded(true),
+    AMessage
+  ]);
 
   LE := TBigInteger.Create(1, TDigestUtilities.DoFinal(FDigest,
     LKeyPrefixedM)).&Mod(LN);
@@ -267,8 +272,12 @@ begin
   LPublicKey := (FKey as IECPublicKeyParameters);
   LPublicKeyBytes := LPublicKey.Q.GetEncoded(true);
 
-  LInput := TArrayUtils.Concatenate(TBigIntegers.BigIntegerToBytes(ARSig,
-    LNumBytes), TCryptoLibMatrixByteArray.Create(LPublicKeyBytes, AMessage));
+  LInput := TArrayUtilities.Concatenate<Byte>
+  ([
+    TBigIntegers.BigIntegerToBytes(ARSig, LNumBytes),
+    LPublicKeyBytes,
+    AMessage
+  ]);
 
   LE := TBigInteger.Create(1, TDigestUtilities.DoFinal(FDigest, LInput)).&Mod(LN);
   LQ := LPublicKey.Q.Normalize();

+ 2 - 2
CryptoLib/src/Crypto/Signers/ClpGenericSigner.pas

@@ -31,7 +31,7 @@ uses
   ClpIGenericSigner,
   ClpParameterUtilities,
   ClpDigestUtilities,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 resourcestring
@@ -173,7 +173,7 @@ begin
       LSig := LTmp;
     end;
 
-    Result := TArrayUtils.ConstantTimeAreEqual(LSig, LHash);
+    Result := TArrayUtilities.FixedTimeEquals(LSig, LHash);
   except
     Result := False;
   end;

+ 4 - 4
CryptoLib/src/Crypto/Signers/ClpRsaDigestSigner.pas

@@ -48,7 +48,7 @@ uses
   ClpNistObjectIdentifiers,
   ClpPkcsObjectIdentifiers,
   ClpTeleTrusTObjectIdentifiers,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 resourcestring
@@ -320,12 +320,12 @@ begin
 
   if FDigestAlgID = nil then
   begin
-    Result := TArrayUtils.ConstantTimeAreEqual(LSig, CheckDerEncoded(LHash));
+    Result := TArrayUtilities.FixedTimeEquals(LSig, CheckDerEncoded(LHash));
     Exit;
   end;
 
   LExpected := DerEncode(FDigestAlgID, LHash);
-  if TArrayUtils.ConstantTimeAreEqual(LSig, LExpected) then
+  if TArrayUtilities.FixedTimeEquals(LSig, LExpected) then
   begin
     Result := True;
     Exit;
@@ -335,7 +335,7 @@ begin
   if TryGetAltAlgID(FDigestAlgID, LAltAlgID) then
   begin
     LExpected := DerEncode(LAltAlgID, LHash);
-    if TArrayUtils.ConstantTimeAreEqual(LSig, LExpected) then
+    if TArrayUtilities.FixedTimeEquals(LSig, LExpected) then
     begin
       Result := True;
       Exit;

+ 24 - 24
CryptoLib/src/Crypto/Signers/ClpSignerUtilities.pas

@@ -76,9 +76,9 @@ uses
   ClpPkcs1Encoding,
   ClpIPkcs1Encoding,
   ClpPkcsObjectIdentifiers,
-  ClpStringUtils,
+  ClpStringUtilities,
   ClpCryptoLibTypes,
-  ClpPlatform,
+  ClpPlatformUtilities,
   ClpPkcsAsn1Objects,
   ClpX509Asn1Objects;
 
@@ -779,7 +779,7 @@ begin
 
   LMechanism := GetMechanism(AAlgorithm);
   if LMechanism = '' then
-    LMechanism := TPlatform.ToUpperInvariant(AAlgorithm);
+    LMechanism := TStringUtilities.ToUpperInvariant(AAlgorithm);
 
   LSigner := GetSignerForMechanism(LMechanism);
   if LSigner <> nil then
@@ -830,9 +830,9 @@ begin
     Exit;
   end;
 
-  if TPlatform.EndsWith(AMechanism, 'withRSAandMGF1') then
+  if TStringUtilities.EndsWith(AMechanism, 'withRSAandMGF1') then
   begin
-    LDigestName := TPlatform.Substring(AMechanism, 1, TPlatform.LastIndexOf(AMechanism, 'with') - 1);
+    LDigestName := TStringUtilities.Substring(AMechanism, 1, TStringUtilities.LastIndexOf(AMechanism, 'with') - 1);
     Result := GetPssX509Parameters(LDigestName);
     Exit;
   end;
@@ -872,7 +872,7 @@ begin
   Result := nil;
 
   // EdDSA algorithms
-  if TPlatform.StartsWith(AMechanism, 'Ed') then
+  if TStringUtilities.StartsWith(AMechanism, 'Ed') then
   begin
     if AMechanism = 'Ed25519' then
     begin
@@ -912,69 +912,69 @@ begin
     Exit;
   end;
 
-  if TPlatform.EndsWith(AMechanism, 'withRSA') then
+  if TStringUtilities.EndsWith(AMechanism, 'withRSA') then
   begin
-    LDigestName := TPlatform.Substring(AMechanism, 1, TPlatform.LastIndexOf(AMechanism, 'with') - 1);
+    LDigestName := TStringUtilities.Substring(AMechanism, 1, TStringUtilities.LastIndexOf(AMechanism, 'with') - 1);
     LDigest := TDigestUtilities.GetDigest(LDigestName);
     Result := TRsaDigestSigner.Create(LDigest);
     Exit;
   end;
 
-  if TPlatform.EndsWith(AMechanism, 'withRSAandMGF1') then
+  if TStringUtilities.EndsWith(AMechanism, 'withRSAandMGF1') then
   begin
-    LDigestName := TPlatform.Substring(AMechanism, 1, TPlatform.LastIndexOf(AMechanism, 'with') - 1);
+    LDigestName := TStringUtilities.Substring(AMechanism, 1, TStringUtilities.LastIndexOf(AMechanism, 'with') - 1);
     LDigest := TDigestUtilities.GetDigest(LDigestName);
     Result := TPssSigner.Create(TRsaBlindedEngine.Create() as IRsaBlindedEngine, LDigest);
     Exit;
   end;
 
-  if TPlatform.EndsWith(AMechanism, 'withDSA') then
+  if TStringUtilities.EndsWith(AMechanism, 'withDSA') then
   begin
-    LDigestName := TPlatform.Substring(AMechanism, 1, TPlatform.LastIndexOf(AMechanism, 'with') - 1);
+    LDigestName := TStringUtilities.Substring(AMechanism, 1, TStringUtilities.LastIndexOf(AMechanism, 'with') - 1);
     LDigest := TDigestUtilities.GetDigest(LDigestName);
     Result := TDsaDigestSigner.Create(TDsaSigner.Create() as IDsaSigner, LDigest);
     Exit;
   end;
 
-  if TPlatform.EndsWith(AMechanism, 'withECDSA') then
+  if TStringUtilities.EndsWith(AMechanism, 'withECDSA') then
   begin
-    LDigestName := TPlatform.Substring(AMechanism, 1, TPlatform.LastIndexOf(AMechanism, 'with') - 1);
+    LDigestName := TStringUtilities.Substring(AMechanism, 1, TStringUtilities.LastIndexOf(AMechanism, 'with') - 1);
     LDigest := TDigestUtilities.GetDigest(LDigestName);
     Result := TDsaDigestSigner.Create(TECDsaSigner.Create() as IECDsaSigner, LDigest);
     Exit;
   end;
 
-  if TPlatform.EndsWith(AMechanism, 'withCVC-ECDSA') or TPlatform.EndsWith(AMechanism, 'withPLAIN-ECDSA') then
+  if TStringUtilities.EndsWith(AMechanism, 'withCVC-ECDSA') or TStringUtilities.EndsWith(AMechanism, 'withPLAIN-ECDSA') then
   begin
-    LDigestName := TPlatform.Substring(AMechanism, 1, TPlatform.LastIndexOf(AMechanism, 'with') - 1);
+    LDigestName := TStringUtilities.Substring(AMechanism, 1, TStringUtilities.LastIndexOf(AMechanism, 'with') - 1);
     LDigest := TDigestUtilities.GetDigest(LDigestName);
     Result := TDsaDigestSigner.Create(TECDsaSigner.Create() as IECDsaSigner, LDigest, TPlainDsaEncoding.Instance);
     Exit;
   end;
 
-  if TPlatform.EndsWith(AMechanism, 'withECNR') then
+  if TStringUtilities.EndsWith(AMechanism, 'withECNR') then
   begin
-    LDigestName := TPlatform.Substring(AMechanism, 1, TPlatform.LastIndexOf(AMechanism, 'with') - 1);
+    LDigestName := TStringUtilities.Substring(AMechanism, 1, TStringUtilities.LastIndexOf(AMechanism, 'with') - 1);
     LDigest := TDigestUtilities.GetDigest(LDigestName);
     Result := TDsaDigestSigner.Create(TECNRSigner.Create() as IECNRSigner, LDigest);
     Exit;
   end;
 
   // X9.31 section
-  if TPlatform.EndsWith(AMechanism, '/X9.31') then
+  if TStringUtilities.EndsWith(AMechanism, '/X9.31') then
   begin
-    LX931 := TPlatform.Substring(AMechanism, 1, System.Length(AMechanism) - System.Length('/X9.31'));
-    LWithPos := TPlatform.IndexOf(LX931, 'WITH');
+    LX931 := TStringUtilities.Substring(AMechanism, 1, System.Length(AMechanism) - System.Length('/X9.31'));
+    LWithPos := TStringUtilities.IndexOf(LX931, 'WITH');
     if LWithPos > 0 then
     begin
       LEndPos := LWithPos + System.Length('WITH');
 
-      LCipherName := TPlatform.Substring(LX931, LEndPos, System.Length(LX931) - LEndPos + 1);
+      LCipherName := TStringUtilities.Substring(LX931, LEndPos, System.Length(LX931) - LEndPos + 1);
       if LCipherName = 'RSA' then
       begin
         LCipher := TRsaBlindedEngine.Create();
 
-        LDigestName := TPlatform.Substring(LX931, 1, LWithPos - 1);
+        LDigestName := TStringUtilities.Substring(LX931, 1, LWithPos - 1);
         LDigest := TDigestUtilities.GetDigest(LDigestName);
 
         Result := TX931Signer.Create(LCipher, LDigest);
@@ -1009,7 +1009,7 @@ begin
 
   LMechanism := GetMechanism(AAlgorithm);
   if LMechanism = '' then
-    LMechanism := TPlatform.ToUpperInvariant(AAlgorithm);
+    LMechanism := TStringUtilities.ToUpperInvariant(AAlgorithm);
 
   Result := InitSignerForMechanism(LMechanism, AForSigning, APrivateKey, ARandom);
 end;

+ 5 - 5
CryptoLib/src/Crypto/Signers/ClpX931Signer.pas

@@ -32,7 +32,7 @@ uses
   ClpParameterUtilities,
   ClpBigInteger,
   ClpBigIntegers,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 resourcestring
@@ -184,7 +184,7 @@ begin
 
   LT := TBigInteger.Create(1, FCipher.ProcessBlock(FBlock, 0,
     System.Length(FBlock)));
-  TArrayUtils.Fill(FBlock, 0, System.Length(FBlock), Byte($00));
+  TArrayUtilities.Fill<Byte>(FBlock, 0, System.Length(FBlock), Byte($00));
 
   LT := LT.Min(FKParam.Modulus.Subtract(LT));
 
@@ -230,10 +230,10 @@ begin
   System.SetLength(LFBlock, System.Length(FBlock));
   LFBlock := TBigIntegers.AsUnsignedByteArray(System.Length(FBlock), LF);
 
-  LRv := TArrayUtils.ConstantTimeAreEqual(FBlock, LFBlock);
+  LRv := TArrayUtilities.FixedTimeEquals(FBlock, LFBlock);
 
-  TArrayUtils.Fill(FBlock, 0, System.Length(FBlock), Byte($00));
-  TArrayUtils.Fill(LFBlock, 0, System.Length(LFBlock), Byte($00));
+  TArrayUtilities.Fill<Byte>(FBlock, 0, System.Length(FBlock), Byte($00));
+  TArrayUtilities.Fill<Byte>(LFBlock, 0, System.Length(LFBlock), Byte($00));
 
   Result := LRv;
 end;

+ 3 - 3
CryptoLib/src/Crypto/Signers/SignerCalculators/ClpHMacDsaKCalculator.pas

@@ -33,7 +33,7 @@ uses
   ClpIKeyParameter,
   ClpIDsaKCalculator,
   ClpIHMacDsaKCalculator,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 {$IFNDEF _FIXINSIGHT_}
@@ -127,8 +127,8 @@ var
   LSize: Int32;
 begin
   FN := AN;
-  TArrayUtils.Fill(FV, 0, System.Length(FV), Byte($01));
-  TArrayUtils.ZeroFill(FK);
+  TArrayUtilities.Fill<Byte>(FV, 0, System.Length(FV), Byte($01));
+  TArrayUtilities.Fill<Byte>(FK, 0, System.Length(FK), Byte(0));
 
   LSize := TBigIntegers.GetUnsignedByteLength(AN);
   System.SetLength(LX, LSize);

+ 4 - 4
CryptoLib/src/Crypto/Signers/SignerEncodings/ClpSignersEncodings.pas

@@ -27,7 +27,7 @@ uses
   ClpBigInteger,
   ClpISignersEncodings,
   ClpIAsn1Objects,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpBigIntegers,
   ClpCryptoLibTypes;
 
@@ -145,7 +145,7 @@ begin
     LR := DecodeValue(AN, LSeq, 0);
     LS := DecodeValue(AN, LSeq, 1);
     LExpectedEncoding := Encode(AN, LR, LS);
-    if (TArrayUtils.AreEqual(LExpectedEncoding, AEncoding)) then
+    if TArrayUtilities.AreEqual<Byte>(LExpectedEncoding, AEncoding) then
     begin
       Result := TCryptoLibGenericArray<TBigInteger>.Create(LR, LS);
       Exit;
@@ -240,7 +240,7 @@ begin
   LBsOff := Max(0, System.Length(LBs) - ALength);
   LBsLen := System.Length(LBs) - LBsOff;
   LPos := ALength - LBsLen;
-  TArrayUtils.Fill(ABuf, AOff, AOff + LPos, Byte(0));
+  TArrayUtilities.Fill<Byte>(ABuf, AOff, AOff + LPos, Byte(0));
   System.Move(LBs[LBsOff], ABuf[AOff + LPos], LBsLen * System.SizeOf(Byte));
 end;
 
@@ -308,7 +308,7 @@ begin
   LBsOff := Max(0, System.Length(LBs) - ALength);
   LBsLen := System.Length(LBs) - LBsOff;
   LPos := ALength - LBsLen;
-  TArrayUtils.Fill(ABuf, AOff, AOff + LPos, Byte(0));
+  TArrayUtilities.Fill<Byte>(ABuf, AOff, AOff + LPos, Byte(0));
   System.Move(LBs[LBsOff], ABuf[AOff + LPos], LBsLen * System.SizeOf(Byte));
 end;
 

+ 467 - 0
CryptoLib/src/GeneralUtilities/ClpArrayUtilities.pas

@@ -0,0 +1,467 @@
+{ *********************************************************************************** }
+{ *                              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 ClpArrayUtilities;
+
+{$I ..\Include\CryptoLib.inc}
+
+interface
+
+uses
+  SysUtils,
+  Math,
+  Generics.Defaults,
+  ClpCryptoLibTypes;
+
+resourcestring
+  SInvalidLength = '%d " > " %d';
+
+type
+  TArrayUtilities = class sealed(TObject)
+
+  strict private
+    class function GetLength(AFrom, ATo: Int32): Int32; static; inline;
+
+  public
+
+    class function AreEqual<T>(const A, B: TCryptoLibGenericArray<T>;
+      const AComparer: IEqualityComparer<T> = nil): Boolean; static;
+
+    class function Concatenate<T>(const A, B: TCryptoLibGenericArray<T>)
+      : TCryptoLibGenericArray<T>; overload; static;
+
+    class function Concatenate<T>(const AArrays: array of TCryptoLibGenericArray<T>)
+      : TCryptoLibGenericArray<T>; overload; static;
+
+    class function AreAllZeroes(const ABuf: TCryptoLibByteArray; AOff, ALen: Int32)
+      : Boolean; static;
+
+    class function GetArrayHashCode(const AData: TCryptoLibByteArray): Int32;
+      overload; static;
+    class function GetArrayHashCode(const AData: TCryptoLibByteArray;
+      AOff, ALen: Int32): Int32; overload; static;
+
+    class function GetArrayHashCode(const AData: TCryptoLibInt32Array): Int32;
+      overload; static;
+
+    class function GetArrayHashCode(const AData: TCryptoLibUInt32Array): Int32;
+      overload; static;
+
+    class function GetArrayHashCode(const AData: TCryptoLibUInt32Array;
+      AOff, ALen: Int32): Int32; overload; static;
+
+    class function GetArrayHashCode(const AData: TCryptoLibUInt64Array;
+      AOff, ALen: Int32): Int32; overload; static;
+
+    class function Prepend<T>(const A: TCryptoLibGenericArray<T>; const B: T)
+      : TCryptoLibGenericArray<T>; static;
+
+    class function Append<T>(const A: TCryptoLibGenericArray<T>; const B: T)
+      : TCryptoLibGenericArray<T>; static;
+
+    class function CopyOf<T>(const AData: TCryptoLibGenericArray<T>; ANewLength: Int32)
+      : TCryptoLibGenericArray<T>; static;
+
+    class function CopyOfRange<T>(const AData: TCryptoLibGenericArray<T>;
+      AFrom, ATo: Int32): TCryptoLibGenericArray<T>; static;
+
+    class function FixedTimeEquals(const AAr1, AAr2: TCryptoLibByteArray)
+      : Boolean; static;
+
+    class procedure Fill<T>(ABuf: TCryptoLibGenericArray<T>; AFrom, ATo: Int32;
+      const AFiller: T); static;
+
+    class function Clone<T>(const AData: TCryptoLibGenericArray<T>; const ACloneFunc: TFunc<T, T>): TCryptoLibGenericArray<T>; static;
+
+    class function NoZeroes(const AData: TCryptoLibByteArray): Boolean; static;
+
+    class function Exists<T>(const AData: TCryptoLibGenericArray<T>;
+      const APredicate: TFunc<T, Boolean>): Boolean; static;
+
+    class function Map<T, TResult>(const AData: TCryptoLibGenericArray<T>;
+      const AFunc: TFunc<T, TResult>): TCryptoLibGenericArray<TResult>; static;
+
+    class function ToString<T>(const AData: TCryptoLibGenericArray<T>;
+      const AConverter: TFunc<T, String>): String; reintroduce; overload; static;
+
+  end;
+
+implementation
+
+{ TArrayUtilities }
+
+class function TArrayUtilities.GetLength(AFrom, ATo: Int32): Int32;
+var
+  LNewLength: Int32;
+begin
+  LNewLength := ATo - AFrom;
+  if LNewLength < 0 then
+    raise EArgumentCryptoLibException.CreateResFmt(@SInvalidLength, [AFrom, ATo]);
+  Result := LNewLength;
+end;
+
+class function TArrayUtilities.NoZeroes(const AData: TCryptoLibByteArray): Boolean;
+var
+  I: Int32;
+begin
+  Result := True;
+  for I := System.Low(AData) to System.High(AData) do
+  begin
+    if AData[I] = 0 then
+    begin
+      Result := False;
+      Exit;
+    end;
+  end;
+end;
+
+class function TArrayUtilities.AreEqual<T>(const A, B: TCryptoLibGenericArray<T>;
+  const AComparer: IEqualityComparer<T>): Boolean;
+var
+  I: Int32;
+  LComparer: IEqualityComparer<T>;
+begin
+  if System.Length(A) <> System.Length(B) then
+    Exit(False);
+  if AComparer = nil then
+    LComparer := TEqualityComparer<T>.Default
+  else
+    LComparer := AComparer;
+  for I := System.Low(A) to System.High(A) do
+    if not LComparer.Equals(A[I], B[I]) then
+      Exit(False);
+  Result := True;
+end;
+
+class function TArrayUtilities.Concatenate<T>(const A, B: TCryptoLibGenericArray<T>)
+  : TCryptoLibGenericArray<T>;
+var
+  I, LLenA, LLenB: Int32;
+begin
+  LLenA := System.Length(A);
+  LLenB := System.Length(B);
+  System.SetLength(Result, LLenA + LLenB);
+  for I := 0 to LLenA - 1 do
+    Result[I] := A[I];
+  for I := 0 to LLenB - 1 do
+    Result[LLenA + I] := B[I];
+end;
+
+class function TArrayUtilities.Concatenate<T>(const AArrays: array of TCryptoLibGenericArray<T>)
+  : TCryptoLibGenericArray<T>;
+var
+  J, LIdx, LPos, LLen, LArrLen: Int32;
+  LArr: TCryptoLibGenericArray<T>;
+begin
+  LLen := 0;
+  for LIdx := System.Low(AArrays) to System.High(AArrays) do
+    LLen := LLen + System.Length(AArrays[LIdx]);
+  System.SetLength(Result, LLen);
+  LPos := 0;
+  for LIdx := System.Low(AArrays) to System.High(AArrays) do
+  begin
+    LArr := AArrays[LIdx];
+    LArrLen := System.Length(LArr);
+    for J := 0 to LArrLen - 1 do
+    begin
+      Result[LPos] := LArr[J];
+      System.Inc(LPos);
+    end;
+  end;
+end;
+
+class function TArrayUtilities.AreAllZeroes(const ABuf: TCryptoLibByteArray;
+  AOff, ALen: Int32): Boolean;
+var
+  LBits: UInt32;
+  I: Int32;
+begin
+  LBits := 0;
+  for I := 0 to System.Pred(ALen) do
+    LBits := LBits or UInt32(ABuf[AOff + I]);
+  Result := LBits = 0;
+end;
+
+class function TArrayUtilities.FixedTimeEquals(const AAr1,
+  AAr2: TCryptoLibByteArray): Boolean;
+var
+  I: Int32;
+  LDiff: UInt32;
+begin
+  LDiff := UInt32(System.Length(AAr1)) xor UInt32(System.Length(AAr2));
+  I := 0;
+  while (I <= System.High(AAr1)) and (I <= System.High(AAr2)) do
+  begin
+    LDiff := LDiff or (UInt32(AAr1[I] xor AAr2[I]));
+    System.Inc(I);
+  end;
+  Result := LDiff = 0;
+end;
+
+class function TArrayUtilities.CopyOf<T>(const AData: TCryptoLibGenericArray<T>;
+  ANewLength: Int32): TCryptoLibGenericArray<T>;
+var
+  I, LCount: Int32;
+begin
+  if AData = nil then
+    Exit(nil);
+  System.SetLength(Result, ANewLength);
+  LCount := Min(ANewLength, System.Length(AData));
+  for I := 0 to LCount - 1 do
+    Result[I] := AData[I];
+end;
+
+class function TArrayUtilities.CopyOfRange<T>(const AData: TCryptoLibGenericArray<T>;
+  AFrom, ATo: Int32): TCryptoLibGenericArray<T>;
+var
+  I, LNewLength, LCount: Int32;
+begin
+  if AData = nil then
+    Exit(nil);
+  LNewLength := GetLength(AFrom, ATo);
+  System.SetLength(Result, LNewLength);
+  LCount := Min(LNewLength, System.Length(AData) - AFrom);
+  for I := 0 to LCount - 1 do
+    Result[I] := AData[AFrom + I];
+end;
+
+class procedure TArrayUtilities.Fill<T>(ABuf: TCryptoLibGenericArray<T>;
+  AFrom, ATo: Int32; const AFiller: T);
+var
+  I: Int32;
+begin
+  if ABuf = nil then
+    Exit;
+  for I := AFrom to ATo - 1 do
+    ABuf[I] := AFiller;
+end;
+
+class function TArrayUtilities.GetArrayHashCode(const AData: TCryptoLibByteArray): Int32;
+var
+  I, LHc: Int32;
+begin
+  if AData = nil then
+    Exit(0);
+  I := System.Length(AData);
+  LHc := I + 1;
+  System.Dec(I);
+  while I >= 0 do
+  begin
+    LHc := LHc * 257;
+    LHc := LHc xor AData[I];
+    System.Dec(I);
+  end;
+  Result := LHc;
+end;
+
+class function TArrayUtilities.GetArrayHashCode(const AData: TCryptoLibByteArray;
+  AOff, ALen: Int32): Int32;
+var
+  I, LHc: Int32;
+begin
+  if AData = nil then
+    Exit(0);
+  I := ALen;
+  LHc := I + 1;
+  System.Dec(I);
+  while I >= 0 do
+  begin
+    LHc := LHc * 257;
+    LHc := LHc xor AData[AOff + I];
+    System.Dec(I);
+  end;
+  Result := LHc;
+end;
+
+class function TArrayUtilities.GetArrayHashCode(const AData: TCryptoLibInt32Array): Int32;
+var
+  I, LHc: Int32;
+begin
+  if AData = nil then
+    Exit(0);
+  I := System.Length(AData);
+  LHc := I + 1;
+  System.Dec(I);
+  while I >= 0 do
+  begin
+    LHc := LHc * 257;
+    LHc := LHc xor AData[I];
+    System.Dec(I);
+  end;
+  Result := LHc;
+end;
+
+class function TArrayUtilities.GetArrayHashCode(const AData: TCryptoLibUInt32Array): Int32;
+var
+  I, LHc: Int32;
+begin
+  if AData = nil then
+    Exit(0);
+  I := System.Length(AData);
+  LHc := I + 1;
+  System.Dec(I);
+  while I >= 0 do
+  begin
+    LHc := LHc * 257;
+    LHc := LHc xor Int32(AData[I]);
+    System.Dec(I);
+  end;
+  Result := LHc;
+end;
+
+class function TArrayUtilities.GetArrayHashCode(const AData: TCryptoLibUInt32Array;
+  AOff, ALen: Int32): Int32;
+var
+  I, LHc: Int32;
+begin
+  if AData = nil then
+    Exit(0);
+  I := ALen;
+  LHc := I + 1;
+  System.Dec(I);
+  while I >= 0 do
+  begin
+    LHc := LHc * 257;
+    LHc := LHc xor Int32(AData[AOff + I]);
+    System.Dec(I);
+  end;
+  Result := LHc;
+end;
+
+class function TArrayUtilities.GetArrayHashCode(const AData: TCryptoLibUInt64Array;
+  AOff, ALen: Int32): Int32;
+var
+  I, LHc: Int32;
+  LDi: UInt64;
+begin
+  if AData = nil then
+    Exit(0);
+  I := ALen;
+  LHc := I + 1;
+  System.Dec(I);
+  while I >= 0 do
+  begin
+    LDi := AData[AOff + I];
+    LHc := LHc * 257;
+    LHc := LHc xor Int32(LDi);
+    LHc := LHc * 257;
+    LHc := LHc xor Int32(LDi shr 32);
+    System.Dec(I);
+  end;
+  Result := LHc;
+end;
+
+class function TArrayUtilities.Prepend<T>(const A: TCryptoLibGenericArray<T>; const B: T)
+  : TCryptoLibGenericArray<T>;
+var
+  I, LLength: Int32;
+begin
+  if A = nil then
+  begin
+    System.SetLength(Result, 1);
+    Result[0] := B;
+    Exit;
+  end;
+  LLength := System.Length(A);
+  System.SetLength(Result, LLength + 1);
+  Result[0] := B;
+  for I := 0 to LLength - 1 do
+    Result[I + 1] := A[I];
+end;
+
+class function TArrayUtilities.Append<T>(const A: TCryptoLibGenericArray<T>; const B: T)
+  : TCryptoLibGenericArray<T>;
+var
+  I, LLength: Int32;
+begin
+  if A = nil then
+  begin
+    System.SetLength(Result, 1);
+    Result[0] := B;
+    Exit;
+  end;
+  LLength := System.Length(A);
+  System.SetLength(Result, LLength + 1);
+  for I := 0 to LLength - 1 do
+    Result[I] := A[I];
+  Result[LLength] := B;
+end;
+
+class function TArrayUtilities.Clone<T>(const AData: TCryptoLibGenericArray<T>; const ACloneFunc: TFunc<T, T>): TCryptoLibGenericArray<T>;
+var
+  I: Int32;
+begin
+  if (AData = nil) or (System.Length(AData) = 0) then
+    Exit(nil);
+  System.SetLength(Result, System.Length(AData));
+  for I := 0 to System.High(AData) do
+    Result[I] := ACloneFunc(AData[I]);
+end;
+
+class function TArrayUtilities.Exists<T>(const AData: TCryptoLibGenericArray<T>;
+  const APredicate: TFunc<T, Boolean>): Boolean;
+var
+  I: Int32;
+begin
+  if (AData = nil) or (System.Length(AData) = 0) or (not Assigned(APredicate)) then
+    Exit(False);
+  for I := System.Low(AData) to System.High(AData) do
+    if APredicate(AData[I]) then
+      Exit(True);
+  Result := False;
+end;
+
+class function TArrayUtilities.Map<T, TResult>(const AData: TCryptoLibGenericArray<T>;
+  const AFunc: TFunc<T, TResult>): TCryptoLibGenericArray<TResult>;
+var
+  I, LCount: Int32;
+begin
+  LCount := System.Length(AData);
+  System.SetLength(Result, LCount);
+  for I := 0 to LCount - 1 do
+    Result[I] := AFunc(AData[I]);
+end;
+
+class function TArrayUtilities.ToString<T>(const AData: TCryptoLibGenericArray<T>;
+  const AConverter: TFunc<T, String>): String;
+var
+  I, LCount: Int32;
+  LSB: TStringBuilder;
+begin
+  LCount := System.Length(AData);
+  if LCount = 0 then
+  begin
+    Result := '[]';
+    Exit;
+  end;
+  LSB := TStringBuilder.Create;
+  try
+    LSB.Append('[');
+    LSB.Append(AConverter(AData[0]));
+    for I := 1 to LCount - 1 do
+    begin
+      LSB.Append(', ');
+      LSB.Append(AConverter(AData[I]));
+    end;
+    LSB.Append(']');
+    Result := LSB.ToString;
+  finally
+    LSB.Free;
+  end;
+end;
+
+end.

+ 0 - 566
CryptoLib/src/GeneralUtilities/ClpArrayUtils.pas

@@ -1,566 +0,0 @@
-{ *********************************************************************************** }
-{ *                              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 ClpArrayUtils;
-
-{$I ..\Include\CryptoLib.inc}
-
-interface
-
-uses
-  SysUtils,
-  Math,
-  ClpCryptoLibTypes;
-
-resourcestring
-  SInvalidLength = '%d " > " %d';
-
-type
-  TArrayUtils = class sealed(TObject)
-
-  strict private
-    class function GetLength(from, &to: Int32): Int32; static; inline;
-
-  public
-
-    class function Concatenate(const A, B: TCryptoLibStringArray)
-      : TCryptoLibStringArray; overload; static;
-
-    class function Concatenate(const A, B: TCryptoLibByteArray)
-      : TCryptoLibByteArray; overload; static; inline;
-
-    class function Concatenate(const A: TCryptoLibByteArray;
-      const Others: TCryptoLibMatrixByteArray): TCryptoLibByteArray;
-      overload; static;
-
-    class function AreEqual(const A, B: TCryptoLibByteArray): Boolean;
-      overload; static;
-
-    class function AreEqual(const A, B: TCryptoLibInt32Array): Boolean;
-      overload; static;
-
-    class function AreAllZeroes(const buf: TCryptoLibByteArray; off, len: Int32)
-      : Boolean; static;
-
-    class function GetArrayHashCode(const data: TCryptoLibByteArray): Int32;
-      overload; static;
-    class function GetArrayHashCode(const data: TCryptoLibByteArray;
-      off, len: Int32): Int32; overload; static;
-
-    class function GetArrayHashCode(const data: TCryptoLibInt32Array): Int32;
-      overload; static;
-
-    class function GetArrayHashCode(const data: TCryptoLibUInt32Array): Int32;
-      overload; static;
-
-    class function GetArrayHashCode(const data: TCryptoLibUInt32Array;
-      off, len: Int32): Int32; overload; static;
-
-    class function GetArrayHashCode(const data: TCryptoLibUInt64Array;
-      off, len: Int32): Int32; overload; static;
-
-    class function Prepend(const A: TCryptoLibByteArray; B: Byte)
-      : TCryptoLibByteArray; static;
-
-    class function Append(const A: TCryptoLibByteArray; B: Byte)
-      : TCryptoLibByteArray; static;
-
-    class function CopyOf(const data: TCryptoLibByteArray; newLength: Int32)
-      : TCryptoLibByteArray; static;
-
-    class function CopyOfRange(const data: TCryptoLibByteArray;
-      from, &to: Int32): TCryptoLibByteArray; static;
-
-    class function ConstantTimeAreEqual(const a_ar1, a_ar2: TCryptoLibByteArray)
-      : Boolean; static;
-
-    class procedure Fill(const buf: TCryptoLibByteArray; from, &to: Int32;
-      filler: Byte); overload; static;
-
-    class procedure Fill(const buf: TCryptoLibInt32Array; from, &to: Int32;
-      filler: Int32); overload; static;
-
-    class procedure Fill(const buf: TCryptoLibUInt32Array; from, &to: Int32;
-      filler: UInt32); overload; static;
-
-    class procedure ZeroFill(const buf: TCryptoLibByteArray); static;
-
-    class function Clone(const AData: TCryptoLibByteArray): TCryptoLibByteArray; overload; static;
-    class function Clone(const AData: TCryptoLibStringArray): TCryptoLibStringArray; overload; static;
-    class function Clone<T>(const AData: TCryptoLibGenericArray<T>): TCryptoLibGenericArray<T>; overload; static;
-    class function Clone<T>(const AData: TCryptoLibGenericArray<T>; const ACloneFunc: TFunc<T, T>): TCryptoLibGenericArray<T>; overload; static;
-
-    class function NoZeroes(const data: TCryptoLibByteArray): Boolean; static;
-
-  end;
-
-implementation
-
-{ TArrayUtils }
-
-class function TArrayUtils.GetLength(from, &to: Int32): Int32;
-var
-  newLength: Int32;
-begin
-  newLength := &to - from;
-  if (newLength < 0) then
-  begin
-    raise EArgumentCryptoLibException.CreateResFmt(@SInvalidLength,
-      [from, &to]);
-  end;
-  Result := newLength;
-end;
-
-class function TArrayUtils.NoZeroes(const data: TCryptoLibByteArray): Boolean;
-var
-  i: Int32;
-begin
-  Result := true;
-  for i := System.Low(data) to System.High(data) do
-  begin
-    if data[i] = 0 then
-    begin
-      Result := false;
-      Exit;
-    end;
-  end;
-end;
-
-class function TArrayUtils.Concatenate(const A, B: TCryptoLibByteArray)
-  : TCryptoLibByteArray;
-var
-  l: Int32;
-begin
-  l := System.Length(A);
-  System.SetLength(Result, l + System.Length(B));
-  System.Move(A[0], Result[0], l * System.SizeOf(Byte));
-  System.Move(B[0], Result[l], System.Length(B) * System.SizeOf(Byte));
-end;
-
-class function TArrayUtils.Concatenate(const A: TCryptoLibByteArray;
-  const Others: TCryptoLibMatrixByteArray): TCryptoLibByteArray;
-var
-  len, Idx, Pos: Int32;
-  temp: TCryptoLibByteArray;
-begin
-  len := 0;
-  for Idx := System.Low(Others) to System.High(Others) do
-  begin
-    len := len + System.Length(Others[Idx]);
-  end;
-  len := len + System.Length(A);
-  System.SetLength(Result, len);
-  System.Move(A[0], Result[0], System.Length(A) * System.SizeOf(Byte));
-  Pos := System.Length(A);
-  for Idx := System.Low(Others) to System.High(Others) do
-  begin
-    temp := Others[Idx];
-    System.Move(temp[0], Result[Pos], System.Length(temp) *
-      System.SizeOf(Byte));
-    Pos := Pos + System.Length(temp);
-  end;
-end;
-
-class function TArrayUtils.Concatenate(const A, B: TCryptoLibStringArray)
-  : TCryptoLibStringArray;
-var
-  i, l: Int32;
-begin
-  l := System.Length(A);
-  System.SetLength(Result, l + System.Length(B));
-  for i := System.Low(A) to System.High(A) do
-  begin
-    Result[i] := A[i];
-  end;
-
-  for i := System.Low(B) to System.High(B) do
-  begin
-    Result[l + i] := B[i];
-  end;
-end;
-
-class function TArrayUtils.AreEqual(const A, B: TCryptoLibByteArray): Boolean;
-begin
-  if System.Length(A) <> System.Length(B) then
-  begin
-    Result := false;
-    Exit;
-  end;
-
-  Result := CompareMem(A, B, System.Length(A) * System.SizeOf(Byte));
-end;
-
-class function TArrayUtils.AreAllZeroes(const buf: TCryptoLibByteArray;
-  off, len: Int32): Boolean;
-var
-  bits: UInt32;
-  i: Int32;
-begin
-  bits := 0;
-  for i := 0 to System.Pred(len) do
-  begin
-    bits := bits or (buf[off + i]);
-  end;
-  Result := bits = 0;
-end;
-
-class function TArrayUtils.AreEqual(const A, B: TCryptoLibInt32Array): Boolean;
-begin
-  if System.Length(A) <> System.Length(B) then
-  begin
-    Result := false;
-    Exit;
-  end;
-
-  Result := CompareMem(A, B, System.Length(A) * System.SizeOf(Int32));
-end;
-
-{$B+}
-
-class function TArrayUtils.ConstantTimeAreEqual(const a_ar1,
-  a_ar2: TCryptoLibByteArray): Boolean;
-var
-  i: Int32;
-  diff: UInt32;
-
-begin
-  diff := UInt32(System.Length(a_ar1)) xor UInt32(System.Length(a_ar2));
-
-  i := 0;
-
-  while (i <= System.High(a_ar1)) and (i <= System.High(a_ar2)) do
-  begin
-    diff := diff or (UInt32(a_ar1[i] xor a_ar2[i]));
-    System.Inc(i);
-  end;
-
-  Result := diff = 0;
-end;
-
-{$B-}
-
-class function TArrayUtils.CopyOf(const data: TCryptoLibByteArray;
-  newLength: Int32): TCryptoLibByteArray;
-begin
-  System.SetLength(Result, newLength);
-  if (newLength < System.Length(data)) then
-  begin
-    System.Move(data[0], Result[0], newLength * System.SizeOf(Byte));
-  end
-  else
-  begin
-    System.Move(data[0], Result[0], System.Length(data) * System.SizeOf(Byte));
-  end;
-end;
-
-class function TArrayUtils.CopyOfRange(const data: TCryptoLibByteArray;
-  from, &to: Int32): TCryptoLibByteArray;
-var
-  newLength: Int32;
-begin
-  newLength := GetLength(from, &to);
-  System.SetLength(Result, newLength);
-  System.Move(data[from], Result[0], Min(newLength, System.Length(data) - from)
-    * System.SizeOf(Byte));
-end;
-
-class procedure TArrayUtils.Fill(const buf: TCryptoLibByteArray;
-  from, &to: Int32; filler: Byte);
-begin
-  if buf <> Nil then
-  begin
-    System.FillChar(buf[from], (&to - from) * System.SizeOf(Byte), filler);
-  end;
-end;
-
-class procedure TArrayUtils.Fill(const buf: TCryptoLibInt32Array;
-  from, &to: Int32; filler: Int32);
-begin
-  if buf <> Nil then
-  begin
-    while from < &to do
-    begin
-      buf[from] := filler;
-      System.Inc(from);
-    end;
-  end;
-end;
-
-class procedure TArrayUtils.Fill(const buf: TCryptoLibUInt32Array;
-  from, &to: Int32; filler: UInt32);
-begin
-  if buf <> Nil then
-  begin
-{$IFDEF FPC}
-    System.FillDWord(buf[from], (&to - from), filler);
-{$ELSE}
-    while from < &to do
-    begin
-      buf[from] := filler;
-      System.Inc(from);
-    end;
-{$ENDIF}
-  end;
-end;
-
-class procedure TArrayUtils.ZeroFill(const buf: TCryptoLibByteArray);
-begin
-  TArrayUtils.Fill(buf, 0, System.Length(buf), Byte(0));
-end;
-
-class function TArrayUtils.GetArrayHashCode(const data
-  : TCryptoLibByteArray): Int32;
-var
-  i, hc: Int32;
-begin
-  if data = Nil then
-  begin
-    Result := 0;
-    Exit;
-  end;
-
-  i := System.Length(data);
-  hc := i + 1;
-
-  System.Dec(i);
-  while (i >= 0) do
-  begin
-    hc := hc * 257;
-    hc := hc xor data[i];
-    System.Dec(i);
-  end;
-  Result := hc;
-end;
-
-class function TArrayUtils.GetArrayHashCode(const data: TCryptoLibByteArray;
-  off, len: Int32): Int32;
-var
-  i, hc: Int32;
-begin
-  if data = Nil then
-  begin
-    Result := 0;
-    Exit;
-  end;
-
-  i := len;
-  hc := i + 1;
-
-  System.Dec(i);
-  while (i >= 0) do
-  begin
-    hc := hc * 257;
-    hc := hc xor data[off + i];
-    System.Dec(i);
-  end;
-  Result := hc;
-end;
-
-class function TArrayUtils.GetArrayHashCode(const data
-  : TCryptoLibInt32Array): Int32;
-var
-  i, hc: Int32;
-begin
-  if data = Nil then
-  begin
-    Result := 0;
-    Exit;
-  end;
-
-  i := System.Length(data);
-  hc := i + 1;
-
-  System.Dec(i);
-  while (i >= 0) do
-  begin
-    hc := hc * 257;
-    hc := hc xor data[i];
-    System.Dec(i);
-  end;
-  Result := hc;
-end;
-
-class function TArrayUtils.GetArrayHashCode(const data
-  : TCryptoLibUInt32Array): Int32;
-var
-  i, hc: Int32;
-begin
-  if data = Nil then
-  begin
-    Result := 0;
-    Exit;
-  end;
-
-  i := System.Length(data);
-  hc := i + 1;
-
-  System.Dec(i);
-  while (i >= 0) do
-  begin
-    hc := hc * 257;
-    hc := hc xor Int32(data[i]);
-    System.Dec(i);
-  end;
-  Result := hc;
-end;
-
-class function TArrayUtils.GetArrayHashCode(const data: TCryptoLibUInt32Array;
-  off, len: Int32): Int32;
-var
-  i, hc: Int32;
-begin
-  if data = Nil then
-  begin
-    Result := 0;
-    Exit;
-  end;
-
-  i := len;
-  hc := i + 1;
-
-  System.Dec(i);
-  while (i >= 0) do
-  begin
-    hc := hc * 257;
-    hc := hc xor Int32(data[off + i]);
-    System.Dec(i);
-  end;
-  Result := hc;
-end;
-
-class function TArrayUtils.GetArrayHashCode(const data: TCryptoLibUInt64Array;
-  off, len: Int32): Int32;
-var
-  i, hc: Int32;
-  di: UInt64;
-begin
-  if data = Nil then
-  begin
-    Result := 0;
-    Exit;
-  end;
-
-  i := len;
-  hc := i + 1;
-
-  System.Dec(i);
-  while (i >= 0) do
-  begin
-    di := data[off + i];
-    hc := hc * 257;
-    hc := hc xor Int32(di);
-    hc := hc * 257;
-    hc := hc xor Int32(di shr 32);
-    System.Dec(i);
-  end;
-  Result := hc;
-end;
-
-class function TArrayUtils.Prepend(const A: TCryptoLibByteArray; B: Byte)
-  : TCryptoLibByteArray;
-var
-  &length: Int32;
-begin
-  if (A = Nil) then
-  begin
-    Result := TCryptoLibByteArray.Create(B);
-    Exit;
-  end;
-
-  Length := System.Length(A);
-  System.SetLength(Result, Length + 1);
-  System.Move(A[0], Result[1], Length * System.SizeOf(Byte));
-  Result[0] := B;
-end;
-
-class function TArrayUtils.Append(const A: TCryptoLibByteArray; B: Byte)
-  : TCryptoLibByteArray;
-var
-  &length: Int32;
-begin
-  if (A = Nil) then
-  begin
-    Result := TCryptoLibByteArray.Create(B);
-    Exit;
-  end;
-
-  Length := System.Length(A);
-  System.SetLength(Result, Length + 1);
-  System.Move(A[0], Result[0], Length * System.SizeOf(Byte));
-  Result[Length] := B;
-end;
-
-class function TArrayUtils.Clone(const AData: TCryptoLibByteArray): TCryptoLibByteArray;
-begin
-  if AData = nil then
-    Result := nil
-  else
-  begin
-    System.SetLength(Result, System.Length(AData));
-    System.Move(AData[0], Result[0], System.Length(AData) * System.SizeOf(Byte));
-  end;
-end;
-
-class function TArrayUtils.Clone(const AData: TCryptoLibStringArray): TCryptoLibStringArray;
-var
-  I: Int32;
-begin
-  if AData = nil then
-    Result := nil
-  else
-  begin
-    System.SetLength(Result, System.Length(AData));
-    for I := 0 to System.High(AData) do
-    begin
-      Result[I] := AData[I];
-    end;
-  end;
-end;
-
-class function TArrayUtils.Clone<T>(const AData: TCryptoLibGenericArray<T>): TCryptoLibGenericArray<T>;
-var
-  I: Int32;
-begin
-  if (AData = nil) or (System.Length(AData) = 0) then
-    Result := nil
-  else
-  begin
-    System.SetLength(Result, System.Length(AData));
-    for I := 0 to System.High(AData) do
-    begin
-      Result[I] := AData[I];
-    end;
-  end;
-end;
-
-class function TArrayUtils.Clone<T>(const AData: TCryptoLibGenericArray<T>; const ACloneFunc: TFunc<T, T>): TCryptoLibGenericArray<T>;
-var
-  I: Int32;
-begin
-  if (AData = nil) or (System.Length(AData) = 0) then
-    Result := nil
-  else
-  begin
-    System.SetLength(Result, System.Length(AData));
-    for I := 0 to System.High(AData) do
-    begin
-      Result[I] := ACloneFunc(AData[I]);
-    end;
-  end;
-end;
-
-end.

+ 14 - 33
CryptoLib/src/GeneralUtilities/ClpCollectionUtilities.pas

@@ -33,18 +33,13 @@ type
   TCollectionUtilities = class sealed(TObject)
   public
     /// <summary>
-    /// Map an array or collection using a function.
-    /// </summary>
-    class function Map<T, TResult>(const ATs: TCryptoLibGenericArray<T>;
-      const AFunc: TFunc<T, TResult>): TCryptoLibGenericArray<TResult>; static;
-    /// <summary>
     /// Convert a collection to an array.
     /// </summary>
     class function ToArray<T>(const AC: TList<T>): TCryptoLibGenericArray<T>; static;
     /// <summary>
-    /// Convert a collection to a string representation using a converter function.
+    /// Convert a list to a string representation using a converter function.
     /// </summary>
-    class function ToString<T>(const AC: TCryptoLibGenericArray<T>;
+    class function ToString<T>(const AC: TList<T>;
       const AConverter: TFunc<T, String>): String; reintroduce; overload; static;
     /// <summary>
     /// Create a proxy array from an enumerable collection (like TDictionary.Keys).
@@ -64,19 +59,6 @@ implementation
 
 { TCollectionUtilities }
 
-class function TCollectionUtilities.Map<T, TResult>(const ATs: TCryptoLibGenericArray<T>;
-  const AFunc: TFunc<T, TResult>): TCryptoLibGenericArray<TResult>;
-var
-  LCount, I: Int32;
-begin
-  LCount := System.Length(ATs);
-  System.SetLength(Result, LCount);
-  for I := 0 to LCount - 1 do
-  begin
-    Result[I] := AFunc(ATs[I]);
-  end;
-end;
-
 class function TCollectionUtilities.ToArray<T>(const AC: TList<T>): TCryptoLibGenericArray<T>;
 var
   LCount, I: Int32;
@@ -89,32 +71,31 @@ begin
   end;
 end;
 
-class function TCollectionUtilities.ToString<T>(const AC: TCryptoLibGenericArray<T>;
+class function TCollectionUtilities.ToString<T>(const AC: TList<T>;
   const AConverter: TFunc<T, String>): String;
 var
-  LCount, I: Int32;
-  SB: TStringBuilder;
+  I, LCount: Int32;
+  LSB: TStringBuilder;
 begin
-  LCount := System.Length(AC);
+  LCount := AC.Count;
   if LCount = 0 then
   begin
     Result := '[]';
     Exit;
   end;
-
-  SB := TStringBuilder.Create;
+  LSB := TStringBuilder.Create;
   try
-    SB.Append('[');
-    SB.Append(AConverter(AC[0]));
+    LSB.Append('[');
+    LSB.Append(AConverter(AC[0]));
     for I := 1 to LCount - 1 do
     begin
-      SB.Append(', ');
-      SB.Append(AConverter(AC[I]));
+      LSB.Append(', ');
+      LSB.Append(AConverter(AC[I]));
     end;
-    SB.Append(']');
-    Result := SB.ToString();
+    LSB.Append(']');
+    Result := LSB.ToString;
   finally
-    SB.Free;
+    LSB.Free;
   end;
 end;
 

+ 4 - 3
CryptoLib/src/GeneralUtilities/ClpCryptoLibComparers.pas

@@ -24,7 +24,8 @@ interface
 uses
   Generics.Defaults,
   ClpIAsn1Objects,
-  ClpPlatform;
+  ClpStringUtilities,
+  ClpPlatformUtilities;
 
 type
   /// <summary>
@@ -172,7 +173,7 @@ end;
 function TOrdinalIgnoreCaseEqualityComparer.Equals(const ALeft, ARight: String): Boolean;
 begin
   // Use ordinal case-insensitive comparison (invariant culture)
-  Result := TPlatform.EqualsIgnoreCase(ALeft, ARight);
+  Result := TStringUtilities.EqualsIgnoreCase(ALeft, ARight);
 end;
 
 function TOrdinalIgnoreCaseEqualityComparer.GetHashCode(const AValue: String): Integer;
@@ -187,7 +188,7 @@ begin
   end;
   
   // Convert to lowercase using invariant culture for consistent hashing
-  LLowerValue := TPlatform.ToLowerInvariant(AValue);
+  LLowerValue := TStringUtilities.ToLowerInvariant(AValue);
   
   // Compute hash code from lowercase string
   // Using a simple hash algorithm (FNV-1a style)

+ 3 - 2
CryptoLib/src/GeneralUtilities/ClpEnumUtilities.pas

@@ -25,7 +25,8 @@ uses
   SysUtils,
   TypInfo,
   ClpDateTimeUtilities,
-  ClpPlatform,
+  ClpPlatformUtilities,
+  ClpStringUtilities,
   ClpCryptoLibTypes;
 
 type
@@ -137,7 +138,7 @@ begin
     Exit;
   end;
   // Only parse single named constants: non-empty, first char a letter, no comma
-  if (System.Length(S) = 0) or (TPlatform.IndexOf(S, ',') > 0) then
+  if (System.Length(S) = 0) or (TStringUtilities.IndexOf(S, ',') > 0) then
   begin
     Result := False;
     Exit;

+ 85 - 0
CryptoLib/src/GeneralUtilities/ClpPlatformUtilities.pas

@@ -0,0 +1,85 @@
+{ *********************************************************************************** }
+{ *                              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 ClpPlatformUtilities;
+
+{$I ..\Include\CryptoLib.inc}
+
+interface
+
+uses
+  SysUtils;
+
+type
+  /// <summary>
+  /// Platform utility class with static methods.
+  /// </summary>
+  TPlatformUtilities = class sealed(TObject)
+  public
+    /// <summary>
+    /// Get the type name of an object.
+    /// </summary>
+    class function GetTypeName(AObj: TObject): String; overload; static;
+    class function GetTypeName(AClass: TClass): String; overload; static;
+    /// <summary>
+    /// Get an environment variable value.
+    /// </summary>
+    class function GetEnvironmentVariable(const AVariable: String): String; static;
+    /// <summary>
+    /// Check if the current process is 64-bit.
+    /// </summary>
+    class function Is64BitProcess: Boolean; static;
+  end;
+
+implementation
+
+{ TPlatformUtilities }
+
+class function TPlatformUtilities.GetTypeName(AObj: TObject): String;
+begin
+  if AObj = nil then
+    Result := 'nil'
+  else
+    Result := AObj.ClassName;
+end;
+
+class function TPlatformUtilities.GetTypeName(AClass: TClass): String;
+begin
+  if AClass = nil then
+    Result := 'nil'
+  else
+    Result := AClass.ClassName;
+end;
+
+class function TPlatformUtilities.GetEnvironmentVariable(const AVariable: String): String;
+begin
+  try
+    Result := SysUtils.GetEnvironmentVariable(AVariable);
+  except
+    // We don't have the required permission to read this environment variable,
+    // which is fine, just act as if it's not set
+    Result := '';
+  end;
+end;
+
+class function TPlatformUtilities.Is64BitProcess: Boolean;
+begin
+  // Check if SizeOf(Pointer) is 8 bytes (64-bit) or 4 bytes (32-bit)
+  Result := SizeOf(Pointer) = 8;
+end;
+
+end.

+ 77 - 54
CryptoLib/src/GeneralUtilities/ClpPlatform.pas → CryptoLib/src/GeneralUtilities/ClpStringUtilities.pas

@@ -15,30 +15,33 @@
 
 (* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
 
-unit ClpPlatform;
+unit ClpStringUtilities;
 
 {$I ..\Include\CryptoLib.inc}
 
 interface
 
 uses
-  SysUtils;
+  SysUtils,
+  StrUtils,
+  ClpBits,
+  ClpCryptoLibTypes;
 
 type
   /// <summary>
-  /// Platform utility class with static methods.
+  /// String utility class with static methods.
   /// </summary>
-  TPlatform = class sealed(TObject)
+  TStringUtilities = class sealed(TObject)
   public
     /// <summary>
-    /// Get the type name of an object.
+    /// Get hash code for a string.
     /// </summary>
-    class function GetTypeName(AObj: TObject): String; overload; static;
-    class function GetTypeName(AClass: TClass): String; overload; static;
+    class function GetStringHashCode(const AInput: string): Int32; static;
     /// <summary>
-    /// Get an environment variable value.
+    /// Split a string by delimiter into an array.
     /// </summary>
-    class function GetEnvironmentVariable(const AVariable: String): String; static;
+    class function SplitString(const AInput: string; ADelimiter: Char)
+      : TCryptoLibStringArray; static;
     /// <summary>
     /// Compare two strings ignoring case.
     /// </summary>
@@ -105,59 +108,85 @@ type
     /// If ACount is less than or equal to 0, returns an empty string.
     /// </summary>
     class function Substring(const AStr: String; AStartIndex: Int32; ACount: Int32): String; overload; static;
-    /// <summary>
-    /// Check if the current process is 64-bit.
-    /// </summary>
-    class function Is64BitProcess: Boolean; static;
   end;
 
 implementation
 
-{ TPlatform }
+{ TStringUtilities }
 
-class function TPlatform.GetTypeName(AObj: TObject): String;
+class function TStringUtilities.GetStringHashCode(const AInput: string): Int32;
+var
+  LLowPoint, LHighPoint: Int32;
+  LResult: UInt32;
 begin
-  if AObj = nil then
-    Result := 'nil'
-  else
-    Result := AObj.ClassName;
-end;
+  LResult := 0;
 
-class function TPlatform.GetTypeName(AClass: TClass): String;
-begin
-  if AClass = nil then
-    Result := 'nil'
-  else
-    Result := AClass.ClassName;
+  LLowPoint := 1;
+  LHighPoint := System.Length(AInput);
+
+  while LLowPoint <= LHighPoint do
+  begin
+    LResult := TBits.RotateLeft32(LResult, 5);
+    LResult := LResult xor UInt32(AInput[LLowPoint]);
+    System.Inc(LLowPoint);
+  end;
+  Result := Int32(LResult);
 end;
 
-class function TPlatform.GetEnvironmentVariable(const AVariable: String): String;
+class function TStringUtilities.SplitString(const AInput: string; ADelimiter: Char)
+  : TCryptoLibStringArray;
+var
+  LPosStart, LPosDel, LSplitPoints, I, LLowPoint, LHighPoint, LLen: Int32;
 begin
-  try
-    Result := SysUtils.GetEnvironmentVariable(AVariable);
-  except
-    // We don't have the required permission to read this environment variable,
-    // which is fine, just act as if it's not set
-    Result := '';
+  Result := nil;
+  if AInput <> '' then
+  begin
+    { Determine the length of the resulting array }
+    LLowPoint := 1;
+    LHighPoint := System.Length(AInput);
+
+    LSplitPoints := 0;
+    for I := LLowPoint to LHighPoint do
+    begin
+      if (ADelimiter = AInput[I]) then
+        System.Inc(LSplitPoints);
+    end;
+
+    System.SetLength(Result, LSplitPoints + 1);
+
+    { Split the string and fill the resulting array }
+
+    I := 0;
+    LLen := System.Length(ADelimiter);
+    LPosStart := 1;
+    LPosDel := System.Pos(ADelimiter, AInput);
+    while LPosDel > 0 do
+    begin
+      Result[I] := System.Copy(AInput, LPosStart, LPosDel - LPosStart);
+      LPosStart := LPosDel + LLen;
+      LPosDel := PosEx(ADelimiter, AInput, LPosStart);
+      System.Inc(I);
+    end;
+    Result[I] := System.Copy(AInput, LPosStart, System.Length(AInput));
   end;
 end;
 
-class function TPlatform.EqualsIgnoreCase(const A, B: String): Boolean;
+class function TStringUtilities.EqualsIgnoreCase(const A, B: String): Boolean;
 begin
   Result := SameText(A, B);
 end;
 
-class function TPlatform.Trim(const AStr: String): String;
+class function TStringUtilities.Trim(const AStr: String): String;
 begin
   Result := SysUtils.Trim(AStr);
 end;
 
-class function TPlatform.StartsWith(const ASource: String; const APrefix: String): Boolean;
+class function TStringUtilities.StartsWith(const ASource: String; const APrefix: String): Boolean;
 begin
   Result := StartsWith(ASource, APrefix, False);
 end;
 
-class function TPlatform.StartsWith(const ASource, APrefix: String; AIgnoreCase: Boolean): Boolean;
+class function TStringUtilities.StartsWith(const ASource, APrefix: String; AIgnoreCase: Boolean): Boolean;
 var
   LPrefixLen, LSourceLen: Int32;
   LSubStr: String;
@@ -176,22 +205,22 @@ begin
     Result := (LSubStr = APrefix);
 end;
 
-class function TPlatform.ToLowerInvariant(const AStr: String): String;
+class function TStringUtilities.ToLowerInvariant(const AStr: String): String;
 begin
   Result := LowerCase(AStr);
 end;
 
-class function TPlatform.ToUpperInvariant(const AStr: String): String;
+class function TStringUtilities.ToUpperInvariant(const AStr: String): String;
 begin
   Result := UpperCase(AStr);
 end;
 
-class function TPlatform.IndexOf(const ASource: String; AValue: Char): Int32;
+class function TStringUtilities.IndexOf(const ASource: String; AValue: Char): Int32;
 begin
   Result := System.Pos(AValue, ASource);
 end;
 
-class function TPlatform.IndexOf(const ASource: String; AValue: Char; AStartIndex: Int32): Int32;
+class function TStringUtilities.IndexOf(const ASource: String; AValue: Char; AStartIndex: Int32): Int32;
 var
   LPos: Int32;
   LSubStr: String;
@@ -212,12 +241,12 @@ begin
     Result := 0;
 end;
 
-class function TPlatform.IndexOf(const ASource: String; const AValue: String): Int32;
+class function TStringUtilities.IndexOf(const ASource: String; const AValue: String): Int32;
 begin
   Result := System.Pos(AValue, ASource);
 end;
 
-class function TPlatform.IndexOf(const ASource: String; const AValue: String; AStartIndex: Int32): Int32;
+class function TStringUtilities.IndexOf(const ASource: String; const AValue: String; AStartIndex: Int32): Int32;
 var
   LPos: Int32;
   LSubStr: String;
@@ -238,12 +267,12 @@ begin
     Result := 0;
 end;
 
-class function TPlatform.EndsWith(const ASource: String; const ASuffix: String): Boolean;
+class function TStringUtilities.EndsWith(const ASource: String; const ASuffix: String): Boolean;
 begin
   Result := EndsWith(ASource, ASuffix, False);
 end;
 
-class function TPlatform.EndsWith(const ASource: String; const ASuffix: String; AIgnoreCase: Boolean): Boolean;
+class function TStringUtilities.EndsWith(const ASource: String; const ASuffix: String; AIgnoreCase: Boolean): Boolean;
 var
   LSourceLen, LSuffixLen: Int32;
   LSubStr: String;
@@ -262,7 +291,7 @@ begin
     Result := (LSubStr = ASuffix);
 end;
 
-class function TPlatform.LastIndexOf(const ASource: String; const AValue: String): Int32;
+class function TStringUtilities.LastIndexOf(const ASource: String; const AValue: String): Int32;
 var
   I, LSourceLen, LValueLen: Int32;
   LSubStr: String;
@@ -290,7 +319,7 @@ begin
   Result := 0;  // Not found
 end;
 
-class function TPlatform.Substring(const AStr: String; AStartIndex: Int32): String;
+class function TStringUtilities.Substring(const AStr: String; AStartIndex: Int32): String;
 var
   LLen: Int32;
 begin
@@ -298,7 +327,7 @@ begin
   Result := Substring(AStr, AStartIndex, LLen - AStartIndex + 1);
 end;
 
-class function TPlatform.Substring(const AStr: String; AStartIndex: Int32;
+class function TStringUtilities.Substring(const AStr: String; AStartIndex: Int32;
   ACount: Int32): String;
 var
   LLen: Int32;
@@ -323,10 +352,4 @@ begin
   Result := System.Copy(AStr, AStartIndex, LActualCount);
 end;
 
-class function TPlatform.Is64BitProcess: Boolean;
-begin
-  // Check if SizeOf(Pointer) is 8 bytes (64-bit) or 4 bytes (32-bit)
-  Result := SizeOf(Pointer) = 8;
-end;
-
 end.

+ 0 - 233
CryptoLib/src/GeneralUtilities/ClpStringUtils.pas

@@ -1,233 +0,0 @@
-{ *********************************************************************************** }
-{ *                              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 ClpStringUtils;
-
-{$I ..\Include\CryptoLib.inc}
-
-interface
-
-uses
-  SysUtils,
-  StrUtils,
-  ClpBits,
-  ClpCryptoLibTypes;
-
-type
-  TStringUtils = class sealed(TObject)
-  public
-    class function GetStringHashCode(const Input: string): Int32; static;
-    class function SplitString(const Input: string; Delimiter: Char)
-      : TCryptoLibStringArray; static;
-    class function BeginsWith(const Input, SubString: string;
-      IgnoreCase: Boolean; Offset: Int32 = 1): Boolean; static;
-
-    class function EndsWith(const Input, SubString: String; IgnoreCase: Boolean)
-      : Boolean; static;
-
-    class function LastIndexOf(const Input, SubString: string;
-      IgnoreCase: Boolean): Int32; overload; static; inline;
-
-    class function LastIndexOf(const Input, SubString: string;
-      StartIndex, Count: Int32; IgnoreCase: Boolean): Int32; overload; static;
-
-    class function StringToCharArray(const S: String)
-      : TCryptoLibCharArray; static;
-
-  end;
-
-implementation
-
-{ TStringUtils }
-
-class function TStringUtils.EndsWith(const Input, SubString: String;
-  IgnoreCase: Boolean): Boolean;
-var
-  SubStringLength: Int32;
-  TempString: String;
-begin
-  SubStringLength := System.Length(SubString);
-  Result := SubStringLength > 0;
-  if Result then
-  begin
-    TempString := System.Copy(Input, System.Length(Input) - SubStringLength + 1,
-      SubStringLength);
-    Result := System.Length(TempString) = SubStringLength;
-    if Result then
-    begin
-      if IgnoreCase then
-      begin
-        Result := CompareText(TempString, SubString) = 0
-      end
-      else
-      begin
-        Result := TempString = SubString;
-      end;
-    end;
-  end;
-end;
-
-class function TStringUtils.GetStringHashCode(const Input: string): Int32;
-var
-  LowPoint, HighPoint: Int32;
-  LResult: UInt32;
-begin
-  LResult := 0;
-
-  LowPoint := 1;
-  HighPoint := System.Length(Input);
-
-  while LowPoint <= HighPoint do
-  begin
-    LResult := TBits.RotateLeft32(LResult, 5);
-    LResult := LResult xor UInt32(Input[LowPoint]);
-    System.Inc(LowPoint);
-  end;
-  Result := Int32(LResult);
-end;
-
-class function TStringUtils.LastIndexOf(const Input, SubString: string;
-  StartIndex, Count: Int32; IgnoreCase: Boolean): Int32;
-var
-  I, L, LS, M: Int32;
-  S: String;
-  P: PChar;
-
-begin
-  Result := -1;
-  LS := System.Length(Input);
-  L := System.Length(SubString);
-  if (L = 0) or (L > LS) then
-  begin
-    Exit;
-  end;
-  P := PChar(SubString);
-  S := Input;
-  I := StartIndex + 1; // 1 based
-  if (I > LS) then
-  begin
-    I := LS;
-  end;
-  I := I - L + 1;
-  M := StartIndex - Count + 1; // 1 based
-  if M < 1 then
-  begin
-    M := 1;
-  end;
-
-  while (Result = -1) and (I >= M) do
-  begin
-    if IgnoreCase then
-    begin
-      if (StrLiComp(PChar(@S[I]), P, L) = 0) then
-      begin
-        Result := I - 1;
-      end;
-    end
-    else
-    begin
-      if (StrLComp(PChar(@S[I]), P, L) = 0) then
-      begin
-        Result := I - 1;
-      end;
-    end;
-    Dec(I);
-  end;
-end;
-
-class function TStringUtils.LastIndexOf(const Input, SubString: string;
-  IgnoreCase: Boolean): Int32;
-begin
-  Result := LastIndexOf(Input, SubString, System.Length(Input) - 1,
-    System.Length(Input), IgnoreCase);
-end;
-
-class function TStringUtils.SplitString(const Input: string; Delimiter: Char)
-  : TCryptoLibStringArray;
-var
-  PosStart, PosDel, SplitPoints, I, LowPoint, HighPoint, Len: Int32;
-begin
-  Result := Nil;
-  if Input <> '' then
-  begin
-    { Determine the length of the resulting array }
-    LowPoint := 1;
-    HighPoint := System.Length(Input);
-
-    SplitPoints := 0;
-    for I := LowPoint to HighPoint do
-    begin
-      if (Delimiter = Input[I]) then
-        System.Inc(SplitPoints);
-    end;
-
-    System.SetLength(Result, SplitPoints + 1);
-
-    { Split the string and fill the resulting array }
-
-    I := 0;
-    Len := System.Length(Delimiter);
-    PosStart := 1;
-    PosDel := System.Pos(Delimiter, Input);
-    while PosDel > 0 do
-    begin
-      Result[I] := System.Copy(Input, PosStart, PosDel - PosStart);
-      PosStart := PosDel + Len;
-      PosDel := PosEx(Delimiter, Input, PosStart);
-      System.Inc(I);
-    end;
-    Result[I] := System.Copy(Input, PosStart, System.Length(Input));
-  end;
-end;
-
-class function TStringUtils.StringToCharArray(const S: String)
-  : TCryptoLibCharArray;
-begin
-  Result := Nil;
-  if System.Length(S) > 0 then
-  begin
-    System.SetLength(Result, System.Length(S) + 1);
-    StrPLCopy(PChar(Result), S, System.Length(Result));
-    System.SetLength(Result, System.Length(S)); // to remove the null terminator
-  end;
-end;
-
-class function TStringUtils.BeginsWith(const Input, SubString: string;
-  IgnoreCase: Boolean; Offset: Int32): Boolean;
-var
-  L: Int32;
-  PtrInput, PtrSubString: PChar;
-begin
-  L := System.Length(SubString);
-  Result := L > 0;
-  PtrInput := PChar(Input);
-  System.Inc(PtrInput, Offset - 1);
-  PtrSubString := PChar(SubString);
-  if Result then
-  begin
-    if IgnoreCase then
-    begin
-      Result := StrLiComp(PtrSubString, PtrInput, L) = 0
-    end
-    else
-    begin
-      Result := StrLComp(PtrSubString, PtrInput, L) = 0
-    end;
-  end;
-end;
-
-end.

+ 0 - 75
CryptoLib/src/GeneralUtilities/ClpTimes.pas

@@ -1,75 +0,0 @@
-{ *********************************************************************************** }
-{ *                              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 ClpTimes;
-
-{$I ..\Include\CryptoLib.inc}
-
-interface
-
-uses
-  SysUtils,
-  DateUtils;
-
-type
-  TTimes = class sealed(TObject)
-
-  strict private
-  const
-    NanosecondsPerTick = Int64(100);
-    TicksMask = UInt64($3FFFFFFFFFFFFFFF);
-
-    // Returns the tick count for this DateTime. The returned value is
-    // the number of 100-nanosecond intervals that have elapsed since 1/1/0001
-    // 12:00am.
-    //
-    class function Ticks(): Int64; static; inline;
-
-    class function Now(): TDateTime; static; inline;
-
-  public
-
-    class function NanoTime(): Int64; static; inline;
-
-  end;
-
-implementation
-
-{ TTimes }
-
-class function TTimes.Now: TDateTime;
-begin
-  Result := SysUtils.Now;
-end;
-
-class function TTimes.Ticks: Int64;
-var
-  dt: TDateTime;
-  value: UInt64;
-begin
-  dt := EncodeDateTime(1, 1, 1, 0, 0, 0, 0);
-  value := UInt64(((MilliSecondsBetween(Now, dt) * 10000)));
-
-  Result := Int64(value and TicksMask);
-end;
-
-class function TTimes.NanoTime: Int64;
-begin
-  Result := Ticks * NanosecondsPerTick;
-end;
-
-end.

+ 1 - 1
CryptoLib/src/Interfaces/Asn1/X509/ClpIX509Asn1Objects.pas

@@ -26,7 +26,7 @@ uses
   ClpIX509Extension,
   ClpBigInteger,
   ClpCryptoLibTypes,
-  ClpArrayUtils;
+  ClpArrayUtilities;
 
 type
   // Forward declarations

+ 3 - 3
CryptoLib/src/Math/ClpBigInteger.pas

@@ -29,7 +29,7 @@ uses
   Generics.Collections,
   ClpISecureRandom,
   ClpIRandom,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 resourcestring
@@ -3866,7 +3866,7 @@ begin
 
   if (xyCmp = 0) then
   begin
-    TArrayUtils.Fill(x, xStart, System.length(x), Int32(0));
+    TArrayUtilities.Fill<Int32>(x, xStart, System.Length(x), Int32(0));
   end;
 
   Result := x;
@@ -4881,7 +4881,7 @@ begin
   if (xyCmp = 0) then
   begin
     AddMagnitudes(Count, One.Fmagnitude);
-    TArrayUtils.Fill(x, xStart, System.length(x), Int32(0));
+    TArrayUtilities.Fill<Int32>(x, xStart, System.Length(x), Int32(0));
   end;
 
   Result := Count;

+ 4 - 4
CryptoLib/src/Math/EC/ClpECC.pas

@@ -28,7 +28,7 @@ uses
   Generics.Collections,
   ClpNat,
   ClpMod,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpIPreCompCallback,
   ClpCryptoLibTypes,
   ClpBigInteger,
@@ -1591,7 +1591,7 @@ begin
     raise EArgumentCryptoLibException.CreateRes(@SIncorrectRepresentation);
   end;
 
-  if ((aF2m.m <> bF2m.m) or (not TArrayUtils.AreEqual(aF2m.ks, bF2m.ks))) then
+  if ((aF2m.m <> bF2m.m) or (not TArrayUtilities.AreEqual<Int32>(aF2m.ks, bF2m.ks))) then
   begin
     raise EArgumentCryptoLibException.CreateRes(@SInvalidFieldElements);
   end;
@@ -1678,7 +1678,7 @@ begin
     Exit;
   end;
   result := ((m = other.m) and (Representation = other.Representation) and
-    TArrayUtils.AreEqual(ks, other.ks) and (x.Equals(other.x)));
+    TArrayUtilities.AreEqual<Int32>(ks, other.ks) and (x.Equals(other.x)));
 end;
 
 function TF2mFieldElement.GetBitLength: Int32;
@@ -1699,7 +1699,7 @@ end;
 function TF2mFieldElement.GetHashCode: {$IFDEF DELPHI}Int32; {$ELSE}PtrInt;
 {$ENDIF DELPHI}
 begin
-  result := Fx.GetHashCode() xor Fm xor TArrayUtils.GetArrayHashCode(FKs);
+  result := Fx.GetHashCode() xor Fm xor TArrayUtilities.GetArrayHashCode(FKs);
 end;
 
 function TF2mFieldElement.GetIsOne: Boolean;

+ 2 - 2
CryptoLib/src/Math/EC/Custom/Djb/ClpCurve25519Custom.pas

@@ -32,7 +32,7 @@ uses
   ClpECCurveConstants,
   ClpBits,
   ClpEncoders,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 resourcestring
@@ -656,7 +656,7 @@ end;
 function TCurve25519FieldElement.GetHashCode: {$IFDEF DELPHI}Int32; {$ELSE}PtrInt;
 {$ENDIF DELPHI}
 begin
-  result := Q.GetHashCode() xor TArrayUtils.GetArrayHashCode(Fx, 0, 8);
+  result := Q.GetHashCode() xor TArrayUtilities.GetArrayHashCode(Fx, 0, 8);
 end;
 
 function TCurve25519FieldElement.GetIsOne: Boolean;

+ 2 - 2
CryptoLib/src/Math/EC/Custom/Sec/ClpSecP256K1Custom.pas

@@ -29,7 +29,7 @@ uses
   ClpNat256,
   ClpECC,
   ClpBigInteger,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes,
   ClpECCurveConstants,
   ClpIECC,
@@ -545,7 +545,7 @@ end;
 function TSecP256K1FieldElement.GetHashCode: {$IFDEF DELPHI}Int32; {$ELSE}PtrInt;
 {$ENDIF DELPHI}
 begin
-  result := Q.GetHashCode() xor TArrayUtils.GetArrayHashCode(Fx, 0, 8);
+  result := Q.GetHashCode() xor TArrayUtilities.GetArrayHashCode(Fx, 0, 8);
 end;
 
 function TSecP256K1FieldElement.GetIsOne: Boolean;

+ 2 - 2
CryptoLib/src/Math/EC/Custom/Sec/ClpSecP256R1Custom.pas

@@ -29,7 +29,7 @@ uses
   ClpNat256,
   ClpECC,
   ClpBigInteger,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes,
   ClpECCurveConstants,
   ClpIECC,
@@ -695,7 +695,7 @@ end;
 function TSecP256R1FieldElement.GetHashCode: {$IFDEF DELPHI}Int32; {$ELSE}PtrInt;
 {$ENDIF DELPHI}
 begin
-  result := Q.GetHashCode() xor TArrayUtils.GetArrayHashCode(Fx, 0, 8);
+  result := Q.GetHashCode() xor TArrayUtilities.GetArrayHashCode(Fx, 0, 8);
 end;
 
 function TSecP256R1FieldElement.GetIsOne: Boolean;

+ 2 - 2
CryptoLib/src/Math/EC/Custom/Sec/ClpSecP384R1Custom.pas

@@ -29,7 +29,7 @@ uses
   ClpNat384,
   ClpECC,
   ClpBigInteger,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes,
   ClpECCurveConstants,
   ClpIECC,
@@ -677,7 +677,7 @@ end;
 function TSecP384R1FieldElement.GetHashCode: {$IFDEF DELPHI}Int32; {$ELSE}PtrInt;
 {$ENDIF DELPHI}
 begin
-  result := Q.GetHashCode() xor TArrayUtils.GetArrayHashCode(Fx, 0, 12);
+  result := Q.GetHashCode() xor TArrayUtilities.GetArrayHashCode(Fx, 0, 12);
 end;
 
 function TSecP384R1FieldElement.GetIsOne: Boolean;

+ 2 - 2
CryptoLib/src/Math/EC/Custom/Sec/ClpSecP521R1Custom.pas

@@ -29,7 +29,7 @@ uses
   ClpNat512,
   ClpECC,
   ClpBigInteger,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpIECC,
   ClpCryptoLibTypes,
   ClpECCurveConstants,
@@ -518,7 +518,7 @@ end;
 function TSecP521R1FieldElement.GetHashCode: {$IFDEF DELPHI}Int32; {$ELSE}PtrInt;
 {$ENDIF DELPHI}
 begin
-  result := Q.GetHashCode() xor TArrayUtils.GetArrayHashCode(Fx, 0, 17);
+  result := Q.GetHashCode() xor TArrayUtilities.GetArrayHashCode(Fx, 0, 17);
 end;
 
 function TSecP521R1FieldElement.GetIsOne: Boolean;

+ 2 - 2
CryptoLib/src/Math/EC/Custom/Sec/ClpSecT283Custom.pas

@@ -29,7 +29,7 @@ uses
   ClpECC,
   ClpInterleave,
   ClpBigInteger,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpIECC,
   ClpMultipliers,
   ClpCryptoLibTypes,
@@ -901,7 +901,7 @@ end;
 function TSecT283FieldElement.GetHashCode: {$IFDEF DELPHI}Int32; {$ELSE}PtrInt;
 {$ENDIF DELPHI}
 begin
-  result := 2831275 xor TArrayUtils.GetArrayHashCode(Fx, 0, 5);
+  result := 2831275 xor TArrayUtilities.GetArrayHashCode(Fx, 0, 5);
 end;
 
 function TSecT283FieldElement.GetIsOne: Boolean;

+ 2 - 2
CryptoLib/src/Math/EC/Rfc7748/ClpX25519.pas

@@ -25,7 +25,7 @@ uses
   ClpISecureRandom,
   ClpX25519Field,
   ClpEd25519,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpConverters,
   ClpCryptoLibTypes;
 
@@ -80,7 +80,7 @@ class function TX25519.CalculateAgreement(const k: TCryptoLibByteArray;
   const r: TCryptoLibByteArray; rOff: Int32): Boolean;
 begin
   ScalarMult(k, kOff, u, uOff, r, rOff);
-  result := not TArrayUtils.AreAllZeroes(r, rOff, PointSize);
+  result := not TArrayUtilities.AreAllZeroes(r, rOff, PointSize);
 end;
 
 class function TX25519.Decode32(const bs: TCryptoLibByteArray;

+ 2 - 2
CryptoLib/src/Math/EC/Rfc7748/ClpX25519Field.pas

@@ -24,7 +24,7 @@ interface
 uses
   ClpBits,
   ClpConverters,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 type
@@ -942,7 +942,7 @@ end;
 
 class procedure TX25519Field.Zero(const z: TCryptoLibInt32Array);
 begin
-  TArrayUtils.Fill(z, 0, Size, Int32(0));
+  TArrayUtilities.Fill<Int32>(z, 0, Size, Int32(0));
 end;
 
 end.

+ 5 - 5
CryptoLib/src/Math/EC/Rfc8032/ClpEd25519.pas

@@ -33,7 +33,7 @@ uses
   ClpIEd25519,
   ClpX25519Field,
   ClpConverters,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 resourcestring
@@ -889,7 +889,7 @@ var
   U, V: TCryptoLibInt32Array;
   x_0: Int32;
 begin
-  py := TArrayUtils.CopyOfRange(p, pOff, pOff + PointBytes);
+  py := TArrayUtilities.CopyOfRange<Byte>(p, pOff, pOff + PointBytes);
   if (not CheckPointVar(py)) then
   begin
     result := false;
@@ -1190,8 +1190,8 @@ begin
     raise EArgumentCryptoLibException.CreateRes(@SInvalidCtx);
   end;
 
-  r := TArrayUtils.CopyOfRange(sig, sigOff, sigOff + PointBytes);
-  s := TArrayUtils.CopyOfRange(sig, sigOff + PointBytes,
+  r := TArrayUtilities.CopyOfRange<Byte>(sig, sigOff, sigOff + PointBytes);
+  s := TArrayUtilities.CopyOfRange<Byte>(sig, sigOff + PointBytes,
     sigOff + SignatureSize);
 
   if (not CheckPointVar(r)) then
@@ -1239,7 +1239,7 @@ begin
   EncodePoint(pR, check, 0);
 
   result := (EncodePoint(pR, check, 0) <> 0) and
-    (TArrayUtils.ConstantTimeAreEqual(check, r));
+    (TArrayUtilities.FixedTimeEquals(check, r));
 end;
 
 class procedure TEd25519.PointAddPrecomp(var p: TPointPrecomp;

+ 3 - 3
CryptoLib/src/Math/Field/ClpGF2Polynomial.pas

@@ -23,7 +23,7 @@ interface
 
 uses
   ClpCryptoLibTypes,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpIGF2Polynomial,
   ClpIPolynomial;
 
@@ -77,7 +77,7 @@ begin
     Result := false;
     Exit;
   end;
-  Result := TArrayUtils.AreEqual(Fexponents, other.exponents);
+  Result := TArrayUtilities.AreEqual<Int32>(Fexponents, other.exponents);
 end;
 
 function TGF2Polynomial.Equals(other: TObject): Boolean;
@@ -103,7 +103,7 @@ end;
 function TGF2Polynomial.GetHashCode: {$IFDEF DELPHI}Int32; {$ELSE}PtrInt;
 {$ENDIF DELPHI}
 begin
-  Result := TArrayUtils.GetArrayHashCode(Fexponents);
+  Result := TArrayUtilities.GetArrayHashCode(Fexponents);
 end;
 
 end.

+ 3 - 3
CryptoLib/src/Math/Raw/ClpNat.pas

@@ -25,7 +25,7 @@ uses
   ClpConverters,
   ClpBits,
   ClpBigInteger,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 type
@@ -2320,13 +2320,13 @@ end;
 
 class procedure TNat.Zero(len: Int32; const z: TCryptoLibUInt32Array);
 begin
-  TArrayUtils.Fill(z, 0, len, UInt32(0));
+  TArrayUtilities.Fill<UInt32>(z, 0, len, UInt32(0));
 end;
 
 class procedure TNat.Zero(len: Int32; const z: TCryptoLibUInt32Array;
   zOff: Int32);
 begin
-  TArrayUtils.Fill(z, zOff, zOff + len, UInt32(0));
+  TArrayUtilities.Fill<UInt32>(z, zOff, zOff + len, UInt32(0));
 end;
 
 end.

+ 2 - 2
CryptoLib/src/Math/Raw/ClpNat192.pas

@@ -26,7 +26,7 @@ uses
   ClpNat,
   ClpBigInteger,
   ClpConverters,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 type
@@ -1421,7 +1421,7 @@ end;
 
 class procedure TNat192.Zero(const z: TCryptoLibUInt32Array);
 begin
-  TArrayUtils.Fill(z, 0, 6, UInt32(0));
+  TArrayUtilities.Fill<UInt32>(z, 0, 6, UInt32(0));
 end;
 
 end.

+ 2 - 2
CryptoLib/src/Math/Raw/ClpNat256.pas

@@ -26,7 +26,7 @@ uses
   ClpConverters,
   ClpBits,
   ClpBigInteger,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpCryptoLibTypes;
 
 type
@@ -1775,7 +1775,7 @@ end;
 
 class procedure TNat256.Zero(const z: TCryptoLibUInt32Array);
 begin
-  TArrayUtils.Fill(z, 0, 8, UInt32(0));
+  TArrayUtilities.Fill<UInt32>(z, 0, 8, UInt32(0));
 end;
 
 end.

+ 8 - 7
CryptoLib/src/Net/ClpIPAddressUtilities.pas

@@ -23,7 +23,8 @@ interface
 
 uses
   SysUtils,
-  ClpPlatform;
+  ClpStringUtilities,
+  ClpPlatformUtilities;
 
 type
   /// <summary>
@@ -97,8 +98,8 @@ begin
   LPos := 1; // 1-based position
   for LOctetIndex := 0 to 2 do
   begin
-    // TPlatform.IndexOf returns 1-based index (0 if not found)
-    LEnd := TPlatform.IndexOf(AAddress, '.', LPos);
+    // TStringUtilities.IndexOf returns 1-based index (0 if not found)
+    LEnd := TStringUtilities.IndexOf(AAddress, '.', LPos);
     if LEnd = 0 then
     begin
       Result := False;
@@ -124,7 +125,7 @@ var
   LIndex: Int32;
   LBefore, LAfter: String;
 begin
-  LIndex := TPlatform.IndexOf(AAddress, '/');
+  LIndex := TStringUtilities.IndexOf(AAddress, '/');
   if LIndex = 0 then
   begin
     Result := False;
@@ -165,7 +166,7 @@ begin
   LPos := 1; // 1-based position
   while LPos <= System.Length(LTemp) do
   begin
-    LEnd := TPlatform.IndexOf(LTemp, ':', LPos);
+    LEnd := TStringUtilities.IndexOf(LTemp, ':', LPos);
     if LEnd = 0 then
       Break;
 
@@ -181,7 +182,7 @@ begin
       LValue := System.Copy(LTemp, LPos, LEnd - LPos);
 
       // Check if this is the last segment and contains IPv4 notation
-      if (LEnd = System.Length(LTemp)) and (TPlatform.IndexOf(LValue, '.') > 0) then
+      if (LEnd = System.Length(LTemp)) and (TStringUtilities.IndexOf(LValue, '.') > 0) then
       begin
         // Add an extra one as address covers 2 words
         System.Inc(LSegmentCount);
@@ -227,7 +228,7 @@ var
   LIndex: Int32;
   LBefore, LAfter: String;
 begin
-  LIndex := TPlatform.IndexOf(AAddress, '/');
+  LIndex := TStringUtilities.IndexOf(AAddress, '/');
   if LIndex = 0 then
   begin
     Result := False;

+ 8 - 8
CryptoLib/src/Pem/ClpPemObjects.pas

@@ -28,9 +28,9 @@ uses
   ClpIPemObjects,
   ClpCryptoLibTypes,
   ClpEncoders,
-  ClpPlatform,
+  ClpPlatformUtilities,
   ClpStreams,
-  ClpStringUtils,
+  ClpStringUtilities,
   ClpConverters,
   ClpAsn1Objects,
   ClpIAsn1Objects,
@@ -191,7 +191,7 @@ begin
   if AStr = '' then
     Result := 1
   else
-    Result := TStringUtils.GetStringHashCode(AStr);
+    Result := TStringUtilities.GetStringHashCode(AStr);
 end;
 
 function TPemHeader.GetHashCode(): {$IFDEF DELPHI}Int32; {$ELSE}PtrInt; {$ENDIF DELPHI}
@@ -491,7 +491,7 @@ begin
   if not BufferUntilStopChar('-', False) then
     raise EIOCryptoLibException.Create('ran out of data before consuming type');
 
-  LType := TPlatform.Trim(BufferedString());
+  LType := TStringUtilities.Trim(BufferedString());
 
   // Consume dashes after type.
   if not ConsumeDash() then
@@ -508,7 +508,7 @@ begin
       if not BufferUntilStopChar(':', False) then
         raise EIOCryptoLibException.Create('ran out of data reading header key value');
 
-      LKey := TPlatform.Trim(BufferedString());
+      LKey := TStringUtilities.Trim(BufferedString());
 
       LC := ReadChar();
       if LC <> Ord(':') then
@@ -521,7 +521,7 @@ begin
 
       SkipWhiteSpace();
 
-      LValue := TPlatform.Trim(BufferedString());
+      LValue := TStringUtilities.Trim(BufferedString());
       LHeaders.Add(TPemHeader.Create(LKey, LValue));
     end;
 
@@ -764,7 +764,7 @@ begin
         Exit;
       end;
 
-      if TPlatform.StartsWith(LLine, FHeader1) or TPlatform.StartsWith(LLine, FHeader2) then
+      if TStringUtilities.StartsWith(LLine, FHeader1) or TStringUtilities.StartsWith(LLine, FHeader2) then
         Break;
     end;
 
@@ -777,7 +777,7 @@ begin
         Exit;
       end;
 
-      if TPlatform.StartsWith(LLine, FFooter1) or TPlatform.StartsWith(LLine, FFooter2) then
+      if TStringUtilities.StartsWith(LLine, FFooter1) or TStringUtilities.StartsWith(LLine, FFooter2) then
         Break;
 
       LPemBuf.Append(LLine);

+ 5 - 5
CryptoLib/src/Rngs/Providers/ClpAesRandomProvider.pas

@@ -31,7 +31,7 @@ uses
   ClpIBufferedCipher,
   ClpIBufferedBlockCipher,
   ClpBufferedBlockCipher,
-  ClpArrayUtils,
+  ClpArrayUtilities,
   ClpOSRandomProvider,
   ClpIRandomSourceProvider,
   ClpCryptoLibTypes;
@@ -201,7 +201,7 @@ begin
   FReseedAfterBytes := AReseedAfterBytes;
   ValidateAESRNGSeedLength(FAESRNGSeedLength);
   DoSeed(LAESRNGSeed);
-  TArrayUtils.ZeroFill(LAESRNGSeed); // clear key from memory
+  TArrayUtilities.Fill<Byte>(LAESRNGSeed, 0, System.Length(LAESRNGSeed), Byte(0)); // clear key from memory
 end;
 
 constructor TAesRandomProvider.Create(AAesRngSeedLength, AReseedAfterBytes: Int32);
@@ -211,7 +211,7 @@ begin
   System.SetLength(LSeed, AAesRngSeedLength);
   GetRawEntropy(LSeed); // pure entropy from OS
   Create(LSeed, AReseedAfterBytes);
-  TArrayUtils.ZeroFill(LSeed); // clear seed from memory
+  TArrayUtilities.Fill<Byte>(LSeed, 0, System.Length(LSeed), Byte(0)); // clear seed from memory
 end;
 
 destructor TAesRandomProvider.Destroy;
@@ -236,7 +236,7 @@ begin
     System.SetLength(LSeed, FAESRNGSeedLength);
     GetRawEntropy(LSeed); // pure entropy from OS
     DoSeed(LSeed);
-    TArrayUtils.ZeroFill(LSeed); // clear seed from memory
+    TArrayUtilities.Fill<Byte>(LSeed, 0, System.Length(LSeed), Byte(0)); // clear seed from memory
   end;
 
   LDatum := 0;
@@ -270,7 +270,7 @@ procedure TAesRandomProvider.GetNonZeroBytes(const AData: TCryptoLibByteArray);
 begin
   repeat
     GetBytes(AData);
-  until (TArrayUtils.NoZeroes(AData));
+  until (TArrayUtilities.NoZeroes(AData));
 end;
 
 function TAesRandomProvider.GetIsAvailable: Boolean;

+ 2 - 2
CryptoLib/src/Rngs/Providers/ClpAppleRandomProvider.pas

@@ -114,7 +114,7 @@ function SecRandomCopyBytes(rnd: SecRandomRef; count: LongWord; bytes: PByte)
 implementation
 
 uses
-  ClpArrayUtils;
+  ClpArrayUtilities;
 
 { TAppleRandomProvider }
 
@@ -245,7 +245,7 @@ procedure TAppleRandomProvider.GetNonZeroBytes(const AData: TCryptoLibByteArray)
 begin
   repeat
     GetBytes(AData);
-  until (TArrayUtils.NoZeroes(AData));
+  until (TArrayUtilities.NoZeroes(AData));
 end;
 
 function TAppleRandomProvider.GetIsAvailable: Boolean;

+ 2 - 2
CryptoLib/src/Rngs/Providers/ClpGenericBSDRandomProvider.pas

@@ -58,7 +58,7 @@ procedure arc4random_buf(bytes: PByte; count: LongWord); cdecl;
 implementation
 
 uses
-  ClpArrayUtils;
+  ClpArrayUtilities;
 
 { TGenericBSDRandomProvider }
 
@@ -103,7 +103,7 @@ procedure TGenericBSDRandomProvider.GetNonZeroBytes(const AData: TCryptoLibByteA
 begin
   repeat
     GetBytes(AData);
-  until (TArrayUtils.NoZeroes(AData));
+  until (TArrayUtilities.NoZeroes(AData));
 end;
 
 function TGenericBSDRandomProvider.GetIsAvailable: Boolean;

+ 2 - 2
CryptoLib/src/Rngs/Providers/ClpLinuxRandomProvider.pas

@@ -98,7 +98,7 @@ type
 implementation
 
 uses
-  ClpArrayUtils;
+  ClpArrayUtilities;
 
 { TLinuxRandomProvider }
 
@@ -254,7 +254,7 @@ procedure TLinuxRandomProvider.GetNonZeroBytes(const AData: TCryptoLibByteArray)
 begin
   repeat
     GetBytes(AData);
-  until (TArrayUtils.NoZeroes(AData));
+  until (TArrayUtilities.NoZeroes(AData));
 end;
 
 function TLinuxRandomProvider.GetIsAvailable: Boolean;

+ 2 - 2
CryptoLib/src/Rngs/Providers/ClpSolarisRandomProvider.pas

@@ -93,7 +93,7 @@ type
 implementation
 
 uses
-  ClpArrayUtils;
+  ClpArrayUtilities;
 
 { TSolarisRandomProvider }
 
@@ -257,7 +257,7 @@ procedure TSolarisRandomProvider.GetNonZeroBytes(const AData: TCryptoLibByteArra
 begin
   repeat
     GetBytes(AData);
-  until (TArrayUtils.NoZeroes(AData));
+  until (TArrayUtilities.NoZeroes(AData));
 end;
 
 function TSolarisRandomProvider.GetIsAvailable: Boolean;

+ 2 - 2
CryptoLib/src/Rngs/Providers/ClpUnixRandomProvider.pas

@@ -67,7 +67,7 @@ type
 implementation
 
 uses
-  ClpArrayUtils;
+  ClpArrayUtilities;
 
 { TUnixRandomProvider }
 
@@ -163,7 +163,7 @@ procedure TUnixRandomProvider.GetNonZeroBytes(const AData: TCryptoLibByteArray);
 begin
   repeat
     GetBytes(AData);
-  until (TArrayUtils.NoZeroes(AData));
+  until (TArrayUtilities.NoZeroes(AData));
 end;
 
 function TUnixRandomProvider.GetIsAvailable: Boolean;

+ 2 - 2
CryptoLib/src/Rngs/Providers/ClpWindowsRandomProvider.pas

@@ -104,7 +104,7 @@ type
 implementation
 
 uses
-  ClpArrayUtils;
+  ClpArrayUtilities;
 
 { TWindowsRandomProvider }
 
@@ -298,7 +298,7 @@ procedure TWindowsRandomProvider.GetNonZeroBytes(const AData: TCryptoLibByteArra
 begin
   repeat
     GetBytes(AData);
-  until (TArrayUtils.NoZeroes(AData));
+  until (TArrayUtilities.NoZeroes(AData));
 end;
 
 function TWindowsRandomProvider.GetIsAvailable: Boolean;

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio