diff --git a/CryptoLib.Benchmark/Delphi/CryptoLib.BenchmarkConsole.dpr b/CryptoLib.Benchmark/Delphi/CryptoLib.BenchmarkConsole.dpr
index 29d99518..d696b5ef 100644
--- a/CryptoLib.Benchmark/Delphi/CryptoLib.BenchmarkConsole.dpr
+++ b/CryptoLib.Benchmark/Delphi/CryptoLib.BenchmarkConsole.dpr
@@ -694,6 +694,10 @@ uses
ClpIAsymmetricKeyEntry in '..\..\CryptoLib\src\Interfaces\Pkcs\ClpIAsymmetricKeyEntry.pas',
ClpDefaultDigestAlgorithmFinder in '..\..\CryptoLib\src\Crypto\Operators\ClpDefaultDigestAlgorithmFinder.pas',
ClpIDigestAlgorithmFinder in '..\..\CryptoLib\src\Interfaces\Crypto\Operators\ClpIDigestAlgorithmFinder.pas',
+ ClpDefaultMacAlgorithmFinder in '..\..\CryptoLib\src\Crypto\Operators\ClpDefaultMacAlgorithmFinder.pas',
+ ClpIMacAlgorithmFinder in '..\..\CryptoLib\src\Interfaces\Crypto\Operators\ClpIMacAlgorithmFinder.pas',
+ ClpDefaultSignatureAlgorithmFinder in '..\..\CryptoLib\src\Crypto\Operators\ClpDefaultSignatureAlgorithmFinder.pas',
+ ClpISignatureAlgorithmFinder in '..\..\CryptoLib\src\Interfaces\Crypto\Operators\ClpISignatureAlgorithmFinder.pas',
ClpPkcs12Utilities in '..\..\CryptoLib\src\Pkcs\ClpPkcs12Utilities.pas',
ClpPkcs12StoreBuilder in '..\..\CryptoLib\src\Pkcs\ClpPkcs12StoreBuilder.pas',
ClpIPkcs12StoreBuilder in '..\..\CryptoLib\src\Interfaces\Pkcs\ClpIPkcs12StoreBuilder.pas',
diff --git a/CryptoLib.Examples/Delphi.Examples/CryptoLib.Examples.dpr b/CryptoLib.Examples/Delphi.Examples/CryptoLib.Examples.dpr
index 970d37bb..483feedd 100644
--- a/CryptoLib.Examples/Delphi.Examples/CryptoLib.Examples.dpr
+++ b/CryptoLib.Examples/Delphi.Examples/CryptoLib.Examples.dpr
@@ -699,6 +699,10 @@ uses
ClpIAsymmetricKeyEntry in '..\..\CryptoLib\src\Interfaces\Pkcs\ClpIAsymmetricKeyEntry.pas',
ClpDefaultDigestAlgorithmFinder in '..\..\CryptoLib\src\Crypto\Operators\ClpDefaultDigestAlgorithmFinder.pas',
ClpIDigestAlgorithmFinder in '..\..\CryptoLib\src\Interfaces\Crypto\Operators\ClpIDigestAlgorithmFinder.pas',
+ ClpDefaultMacAlgorithmFinder in '..\..\CryptoLib\src\Crypto\Operators\ClpDefaultMacAlgorithmFinder.pas',
+ ClpIMacAlgorithmFinder in '..\..\CryptoLib\src\Interfaces\Crypto\Operators\ClpIMacAlgorithmFinder.pas',
+ ClpDefaultSignatureAlgorithmFinder in '..\..\CryptoLib\src\Crypto\Operators\ClpDefaultSignatureAlgorithmFinder.pas',
+ ClpISignatureAlgorithmFinder in '..\..\CryptoLib\src\Interfaces\Crypto\Operators\ClpISignatureAlgorithmFinder.pas',
ClpPkcs12Utilities in '..\..\CryptoLib\src\Pkcs\ClpPkcs12Utilities.pas',
ClpPkcs12StoreBuilder in '..\..\CryptoLib\src\Pkcs\ClpPkcs12StoreBuilder.pas',
ClpIPkcs12StoreBuilder in '..\..\CryptoLib\src\Interfaces\Pkcs\ClpIPkcs12StoreBuilder.pas',
diff --git a/CryptoLib.Tests/Delphi.Tests/CryptoLib.Tests.dpr b/CryptoLib.Tests/Delphi.Tests/CryptoLib.Tests.dpr
index 23b6f716..20c47a31 100644
--- a/CryptoLib.Tests/Delphi.Tests/CryptoLib.Tests.dpr
+++ b/CryptoLib.Tests/Delphi.Tests/CryptoLib.Tests.dpr
@@ -710,6 +710,10 @@ uses
ClpIAsymmetricKeyEntry in '..\..\CryptoLib\src\Interfaces\Pkcs\ClpIAsymmetricKeyEntry.pas',
ClpDefaultDigestAlgorithmFinder in '..\..\CryptoLib\src\Crypto\Operators\ClpDefaultDigestAlgorithmFinder.pas',
ClpIDigestAlgorithmFinder in '..\..\CryptoLib\src\Interfaces\Crypto\Operators\ClpIDigestAlgorithmFinder.pas',
+ ClpDefaultMacAlgorithmFinder in '..\..\CryptoLib\src\Crypto\Operators\ClpDefaultMacAlgorithmFinder.pas',
+ ClpIMacAlgorithmFinder in '..\..\CryptoLib\src\Interfaces\Crypto\Operators\ClpIMacAlgorithmFinder.pas',
+ ClpDefaultSignatureAlgorithmFinder in '..\..\CryptoLib\src\Crypto\Operators\ClpDefaultSignatureAlgorithmFinder.pas',
+ ClpISignatureAlgorithmFinder in '..\..\CryptoLib\src\Interfaces\Crypto\Operators\ClpISignatureAlgorithmFinder.pas',
ClpPkcs12Utilities in '..\..\CryptoLib\src\Pkcs\ClpPkcs12Utilities.pas',
ClpPkcs12StoreBuilder in '..\..\CryptoLib\src\Pkcs\ClpPkcs12StoreBuilder.pas',
ClpIPkcs12StoreBuilder in '..\..\CryptoLib\src\Interfaces\Pkcs\ClpIPkcs12StoreBuilder.pas',
@@ -819,6 +823,7 @@ uses
RSATests in '..\src\Crypto\RSATests.pas',
RSABlindedTests in '..\src\Crypto\RSABlindedTests.pas',
RSADigestSignerTests in '..\src\Crypto\RSADigestSignerTests.pas',
+ AlgorithmFinderTests in '..\src\Crypto\AlgorithmFinderTests.pas',
ISO9796Tests in '..\src\Crypto\ISO9796Tests.pas',
PssTests in '..\src\Crypto\PssTests.pas',
PrivateKeyInfoTests in '..\src\Asn1\PrivateKeyInfoTests.pas',
diff --git a/CryptoLib.Tests/FreePascal.Tests/CryptoLib.Tests.lpi b/CryptoLib.Tests/FreePascal.Tests/CryptoLib.Tests.lpi
index fb330183..666c4ac2 100644
--- a/CryptoLib.Tests/FreePascal.Tests/CryptoLib.Tests.lpi
+++ b/CryptoLib.Tests/FreePascal.Tests/CryptoLib.Tests.lpi
@@ -79,7 +79,7 @@
-
+
@@ -693,6 +693,10 @@
+
+
+
+
diff --git a/CryptoLib.Tests/FreePascal.Tests/CryptoLib.lpr b/CryptoLib.Tests/FreePascal.Tests/CryptoLib.lpr
index bbb3e122..a14c7473 100644
--- a/CryptoLib.Tests/FreePascal.Tests/CryptoLib.lpr
+++ b/CryptoLib.Tests/FreePascal.Tests/CryptoLib.lpr
@@ -36,9 +36,9 @@
CryptoIOSinkTests, OaepTests, RijndaelTests, BlowfishTests, Poly1305Tests,
MacTests, ChaCha20Poly1305Tests, OcbTests, CcmTests, EaxTests, CMacTests,
AeadTestUtilities, GcmReorderTests, GCMTests, GcmSivTests, GMacTests,
- Pkcs12Tests, Bip327MuSig2Tests, Bip340SchnorrTests, CryptoLibTestBase,
- SimdSelectSlotTests, PkcsEncryptedPrivateKeyInfoTests, Pkcs12StoreTests,
- OpenSslReaderTests, OpenSslWriterTests, X509CertGenTests,
+ Pkcs12Tests, Bip327MuSig2Tests, Bip340SchnorrTests, AlgorithmFinderTests,
+ CryptoLibTestBase, SimdSelectSlotTests, PkcsEncryptedPrivateKeyInfoTests,
+ Pkcs12StoreTests, OpenSslReaderTests, OpenSslWriterTests, X509CertGenTests,
X509CertificatePairTests, X509UtilitiesTests, ClpFixedSecureRandom,
ClpShortenedDigest, ClpCertTestUtilities, ClpFusedKernelToggle, Int32Tests,
Int64Tests, IPAddressUtilitiesTests, PemReaderTests;
diff --git a/CryptoLib.Tests/FreePascal.Tests/CryptoLibConsole.lpi b/CryptoLib.Tests/FreePascal.Tests/CryptoLibConsole.lpi
index 4b02f0a9..0aef5427 100644
--- a/CryptoLib.Tests/FreePascal.Tests/CryptoLibConsole.lpi
+++ b/CryptoLib.Tests/FreePascal.Tests/CryptoLibConsole.lpi
@@ -39,7 +39,7 @@
-
+
@@ -652,6 +652,10 @@
+
+
+
+
diff --git a/CryptoLib.Tests/FreePascal.Tests/CryptoLibConsole.lpr b/CryptoLib.Tests/FreePascal.Tests/CryptoLibConsole.lpr
index 1f25a2a0..63e8f6b5 100644
--- a/CryptoLib.Tests/FreePascal.Tests/CryptoLibConsole.lpr
+++ b/CryptoLib.Tests/FreePascal.Tests/CryptoLibConsole.lpr
@@ -37,11 +37,12 @@
BlowfishTests, CcmTests, ChaCha20Poly1305Tests, CMacTests, EaxTests, OcbTests,
MacTests, Poly1305Tests, AeadTestUtilities, GcmReorderTests, GCMTests,
GcmSivTests, GMacTests, Pkcs12Tests, Bip327MuSig2Tests, Bip340SchnorrTests,
- CryptoLibTestBase, SimdSelectSlotTests, PkcsEncryptedPrivateKeyInfoTests,
- Pkcs12StoreTests, OpenSslReaderTests, OpenSslWriterTests, X509CertGenTests,
- X509CertificatePairTests, X509UtilitiesTests, ClpFixedSecureRandom,
- ClpShortenedDigest, ClpCertTestUtilities, ClpFusedKernelToggle, Int32Tests,
- Int64Tests, IPAddressUtilitiesTests, PemReaderTests;
+ AlgorithmFinderTests, CryptoLibTestBase, SimdSelectSlotTests,
+ PkcsEncryptedPrivateKeyInfoTests, Pkcs12StoreTests, OpenSslReaderTests,
+ OpenSslWriterTests, X509CertGenTests, X509CertificatePairTests,
+ X509UtilitiesTests, ClpFixedSecureRandom, ClpShortenedDigest,
+ ClpCertTestUtilities, ClpFusedKernelToggle, Int32Tests, Int64Tests,
+ IPAddressUtilitiesTests, PemReaderTests;
type
diff --git a/CryptoLib.Tests/src/Crypto/AlgorithmFinderTests.pas b/CryptoLib.Tests/src/Crypto/AlgorithmFinderTests.pas
new file mode 100644
index 00000000..59892a9d
--- /dev/null
+++ b/CryptoLib.Tests/src/Crypto/AlgorithmFinderTests.pas
@@ -0,0 +1,251 @@
+{ *********************************************************************************** }
+{ * CryptoLib Library * }
+{ * Author - Ugochukwu Mmaduekwe * }
+{ * Github Repository * }
+{ * * }
+{ * 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 * }
+{ * the development of this library * }
+{ * ******************************************************************************* * }
+
+(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
+
+unit AlgorithmFinderTests;
+
+interface
+
+{$IFDEF FPC}
+{$MODE DELPHI}
+{$ENDIF FPC}
+
+uses
+ SysUtils,
+{$IFDEF FPC}
+ fpcunit,
+ testregistry,
+{$ELSE}
+ TestFramework,
+{$ENDIF FPC}
+ ClpAsn1Objects,
+ ClpIAsn1Objects,
+ ClpIX509Asn1Objects,
+ ClpX509Asn1Objects,
+ ClpPkcsObjectIdentifiers,
+ ClpNistObjectIdentifiers,
+ ClpOiwObjectIdentifiers,
+ ClpEdECObjectIdentifiers,
+ ClpX9ObjectIdentifiers,
+ ClpPkcsRsaAsn1Objects,
+ ClpIPkcsRsaAsn1Objects,
+ ClpDefaultDigestAlgorithmFinder,
+ ClpIDigestAlgorithmFinder,
+ ClpDefaultMacAlgorithmFinder,
+ ClpIMacAlgorithmFinder,
+ ClpDefaultSignatureAlgorithmFinder,
+ ClpISignatureAlgorithmFinder,
+ ClpX509Utilities,
+ ClpCryptoLibTypes,
+ CryptoLibTestBase;
+
+type
+ TAlgorithmFinderTest = class(TCryptoLibAlgorithmTestCase)
+ published
+ procedure TestDigestFindByName;
+ procedure TestDigestFindBySignatureAlgorithm;
+ procedure TestDigestFindByOid;
+ procedure TestDigestFindPssDelegation;
+ procedure TestDigestFindUnknownName;
+ procedure TestDigestFindNilOid;
+ procedure TestMacFindKnown;
+ procedure TestMacFindUnknown;
+ procedure TestSignatureFindKnown;
+ procedure TestSignatureFindPss;
+ procedure TestSignatureFindEd25519;
+ procedure TestSignatureFindEcdsa;
+ procedure TestSignatureFindUnknown;
+ end;
+
+implementation
+
+{ TAlgorithmFinderTest }
+
+procedure TAlgorithmFinderTest.TestDigestFindByName;
+var
+ LDigestAlg: IAlgorithmIdentifier;
+begin
+ LDigestAlg := TDefaultDigestAlgorithmFinder.Instance.Find('SHA-256');
+ CheckNotNull(LDigestAlg, 'digest algorithm should not be nil');
+ CheckTrue(LDigestAlg.Algorithm.Equals(TNistObjectIdentifiers.IdSha256),
+ 'SHA-256 digest OID mismatch');
+end;
+
+procedure TAlgorithmFinderTest.TestDigestFindBySignatureAlgorithm;
+var
+ LSignatureAlg, LDigestAlg: IAlgorithmIdentifier;
+begin
+ LSignatureAlg := TAlgorithmIdentifier.Create(TPkcsObjectIdentifiers.Sha256WithRsaEncryption,
+ TDerNull.Instance);
+ LDigestAlg := TDefaultDigestAlgorithmFinder.Instance.Find(LSignatureAlg);
+ CheckNotNull(LDigestAlg, 'digest algorithm should not be nil');
+ CheckTrue(LDigestAlg.Algorithm.Equals(TNistObjectIdentifiers.IdSha256),
+ 'signature-to-digest OID mismatch');
+end;
+
+procedure TAlgorithmFinderTest.TestDigestFindByOid;
+var
+ LDigestAlg: IAlgorithmIdentifier;
+begin
+ LDigestAlg := TDefaultDigestAlgorithmFinder.Instance.Find(TNistObjectIdentifiers.IdSha384);
+ CheckNotNull(LDigestAlg, 'digest algorithm should not be nil');
+ CheckTrue(LDigestAlg.Algorithm.Equals(TNistObjectIdentifiers.IdSha384),
+ 'digest OID mismatch');
+end;
+
+procedure TAlgorithmFinderTest.TestDigestFindPssDelegation;
+var
+ LHashAlgId, LSignatureAlg, LDigestAlg: IAlgorithmIdentifier;
+ LPssParams: IRsassaPssParameters;
+begin
+ LHashAlgId := TAlgorithmIdentifier.Create(TNistObjectIdentifiers.IdSha256, TDerNull.Instance);
+ LPssParams := TRsassaPssParameters.Create(LHashAlgId,
+ TAlgorithmIdentifier.Create(TPkcsObjectIdentifiers.IdMgf1, LHashAlgId) as IAlgorithmIdentifier,
+ TDerInteger.Create(32) as IDerInteger, TRsassaPssParameters.DefaultTrailerField);
+ LSignatureAlg := TAlgorithmIdentifier.Create(TPkcsObjectIdentifiers.IdRsassaPss, LPssParams);
+ LDigestAlg := TDefaultDigestAlgorithmFinder.Instance.Find(LSignatureAlg);
+ CheckNotNull(LDigestAlg, 'PSS digest algorithm should not be nil');
+ CheckTrue(LDigestAlg.Algorithm.Equals(TNistObjectIdentifiers.IdSha256),
+ 'PSS digest OID mismatch');
+end;
+
+procedure TAlgorithmFinderTest.TestDigestFindUnknownName;
+var
+ LDigestAlg: IAlgorithmIdentifier;
+begin
+ LDigestAlg := TDefaultDigestAlgorithmFinder.Instance.Find('UNKNOWN-DIGEST-NAME');
+ CheckNull(LDigestAlg, 'unknown digest name should return nil');
+end;
+
+procedure TAlgorithmFinderTest.TestDigestFindNilOid;
+var
+ LNilOid: IDerObjectIdentifier;
+begin
+ LNilOid := nil;
+ try
+ TDefaultDigestAlgorithmFinder.Instance.Find(LNilOid);
+ Fail('expected EArgumentNilCryptoLibException');
+ except
+ on E: EArgumentNilCryptoLibException do
+ CheckEquals('digestOid', E.Message);
+ end;
+end;
+
+procedure TAlgorithmFinderTest.TestMacFindKnown;
+var
+ LMacAlg: IAlgorithmIdentifier;
+begin
+ LMacAlg := TDefaultMacAlgorithmFinder.Instance.Find('HMACSHA256');
+ CheckNotNull(LMacAlg, 'HMACSHA256 should not be nil');
+ CheckTrue(LMacAlg.Algorithm.Equals(TPkcsObjectIdentifiers.IdHmacWithSha256),
+ 'HMACSHA256 OID mismatch');
+ CheckTrue(LMacAlg.Parameters.Equals(TDerNull.Instance), 'HMACSHA256 params should be NULL');
+
+ LMacAlg := TDefaultMacAlgorithmFinder.Instance.Find('HMACSHA1');
+ CheckNotNull(LMacAlg, 'HMACSHA1 should not be nil');
+ CheckTrue(LMacAlg.Algorithm.Equals(TOiwObjectIdentifiers.IdSha1),
+ 'HMACSHA1 OID mismatch');
+ CheckTrue(TX509Utilities.IsAbsentParameters(LMacAlg.Parameters),
+ 'HMACSHA1 params should be absent');
+
+ LMacAlg := TDefaultMacAlgorithmFinder.Instance.Find('HMACSHA3-512');
+ CheckNotNull(LMacAlg, 'HMACSHA3-512 should not be nil');
+ CheckTrue(LMacAlg.Algorithm.Equals(TNistObjectIdentifiers.IdHMacWithSha3_512),
+ 'HMACSHA3-512 OID mismatch');
+ CheckTrue(TX509Utilities.IsAbsentParameters(LMacAlg.Parameters),
+ 'HMACSHA3-512 params should be absent');
+end;
+
+procedure TAlgorithmFinderTest.TestMacFindUnknown;
+var
+ LMacAlg: IAlgorithmIdentifier;
+begin
+ LMacAlg := TDefaultMacAlgorithmFinder.Instance.Find('HMACUNKNOWN');
+ CheckNull(LMacAlg, 'unknown MAC name should return nil');
+end;
+
+procedure TAlgorithmFinderTest.TestSignatureFindKnown;
+var
+ LSignatureAlg: IAlgorithmIdentifier;
+begin
+ LSignatureAlg := TDefaultSignatureAlgorithmFinder.Instance.Find('SHA256WITHRSA');
+ CheckNotNull(LSignatureAlg, 'SHA256WITHRSA should not be nil');
+ CheckTrue(LSignatureAlg.Algorithm.Equals(TPkcsObjectIdentifiers.Sha256WithRsaEncryption),
+ 'SHA256WITHRSA OID mismatch');
+ CheckTrue(LSignatureAlg.Parameters.Equals(TDerNull.Instance),
+ 'SHA256WITHRSA params should be NULL');
+end;
+
+procedure TAlgorithmFinderTest.TestSignatureFindPss;
+var
+ LSignatureAlg: IAlgorithmIdentifier;
+ LPssParams: IRsassaPssParameters;
+begin
+ LSignatureAlg := TDefaultSignatureAlgorithmFinder.Instance.Find('SHA256WITHRSAANDMGF1');
+ CheckNotNull(LSignatureAlg, 'SHA256WITHRSAANDMGF1 should not be nil');
+ CheckTrue(LSignatureAlg.Algorithm.Equals(TPkcsObjectIdentifiers.IdRsassaPss),
+ 'SHA256WITHRSAANDMGF1 OID mismatch');
+ LPssParams := TRsassaPssParameters.GetInstance(LSignatureAlg.Parameters);
+ CheckNotNull(LPssParams, 'PSS parameters should not be nil');
+ CheckTrue(LPssParams.HashAlgorithm.Algorithm.Equals(TNistObjectIdentifiers.IdSha256),
+ 'PSS hash algorithm mismatch');
+ CheckEquals(32, LPssParams.SaltLength.IntValueExact, 'PSS salt length mismatch');
+end;
+
+procedure TAlgorithmFinderTest.TestSignatureFindEd25519;
+var
+ LSignatureAlg: IAlgorithmIdentifier;
+begin
+ LSignatureAlg := TDefaultSignatureAlgorithmFinder.Instance.Find('Ed25519');
+ CheckNotNull(LSignatureAlg, 'Ed25519 should not be nil');
+ CheckTrue(LSignatureAlg.Algorithm.Equals(TEdECObjectIdentifiers.IdEd25519),
+ 'Ed25519 OID mismatch');
+ CheckTrue(TX509Utilities.IsAbsentParameters(LSignatureAlg.Parameters),
+ 'Ed25519 params should be absent');
+end;
+
+procedure TAlgorithmFinderTest.TestSignatureFindEcdsa;
+var
+ LSignatureAlg: IAlgorithmIdentifier;
+begin
+ LSignatureAlg := TDefaultSignatureAlgorithmFinder.Instance.Find('SHA256WITHECDSA');
+ CheckNotNull(LSignatureAlg, 'SHA256WITHECDSA should not be nil');
+ CheckTrue(LSignatureAlg.Algorithm.Equals(TX9ObjectIdentifiers.ECDsaWithSha256),
+ 'SHA256WITHECDSA OID mismatch');
+ CheckTrue(TX509Utilities.IsAbsentParameters(LSignatureAlg.Parameters),
+ 'SHA256WITHECDSA params should be absent');
+end;
+
+procedure TAlgorithmFinderTest.TestSignatureFindUnknown;
+begin
+ try
+ TDefaultSignatureAlgorithmFinder.Instance.Find('UNKNOWN-SIGNATURE-NAME');
+ Fail('expected EArgumentCryptoLibException');
+ except
+ on E: EArgumentCryptoLibException do
+ CheckTrue(Pos('Unknown signature name:', E.Message) > 0,
+ 'Wrong exception message: ' + E.Message);
+ end;
+end;
+
+initialization
+
+{$IFDEF FPC}
+ RegisterTest(TAlgorithmFinderTest);
+{$ELSE}
+ RegisterTest(TAlgorithmFinderTest.Suite);
+{$ENDIF FPC}
+
+end.
diff --git a/CryptoLib.Tests/src/Crypto/RSATests.pas b/CryptoLib.Tests/src/Crypto/RSATests.pas
index 4b2f9374..09810829 100644
--- a/CryptoLib.Tests/src/Crypto/RSATests.pas
+++ b/CryptoLib.Tests/src/Crypto/RSATests.pas
@@ -471,7 +471,7 @@ procedure TTestRSA.TestMaxSizeRejectsOversizedModulus;
procedure TTestRSA.TestMaxMRTestsZeroSkipsCompositeCheck;
var
LOldMaxSize, LOldMaxMRTests: Int32;
- LParams: TRsaKeyParameters;
+ LParams: IRsaKeyParameters;
begin
LOldMaxSize := TRsaKeyParameters.MaxSize;
LOldMaxMRTests := TRsaKeyParameters.MaxMRTests;
@@ -488,7 +488,7 @@ procedure TTestRSA.TestMaxMRTestsZeroSkipsCompositeCheck;
procedure TTestRSA.TestMaxSizeMaxMRTestsUnsetDefault;
var
LOldMaxSize, LOldMaxMRTests: Int32;
- LParams: TRsaKeyParameters;
+ LParams: IRsaKeyParameters;
begin
LOldMaxSize := TRsaKeyParameters.MaxSize;
LOldMaxMRTests := TRsaKeyParameters.MaxMRTests;
diff --git a/CryptoLib/src/Asn1/Rosstandart/ClpRosstandartObjectIdentifiers.pas b/CryptoLib/src/Asn1/Rosstandart/ClpRosstandartObjectIdentifiers.pas
index 51bcb97b..900fc865 100644
--- a/CryptoLib/src/Asn1/Rosstandart/ClpRosstandartObjectIdentifiers.pas
+++ b/CryptoLib/src/Asn1/Rosstandart/ClpRosstandartObjectIdentifiers.pas
@@ -32,7 +32,7 @@ TRosstandartObjectIdentifiers = class abstract(TObject)
FRosstandart, FIdTc26, FIdTc26Gost3411_12_256, FIdTc26Gost3411_12_512,
FIdTc26HmacGost3411_12_256, FIdTc26HmacGost3411_12_512,
FIdTc26Gost3410_12_256, FIdTc26Gost3410_12_512,
- FIdTc26SignwithdigestGost3410_12_256, FIdTc26SignwithdigestGost3410_12_512,
+ FIdTc26SignWithDigestGost3410_12_256, FIdTc26SignWithDigestGost3410_12_512,
FIdTc26Agreement, FIdTc26AgreementGost3410_12_256, FIdTc26AgreementGost3410_12_512,
FIdTc26Gost3410_12_256ParamSet, FIdTc26Gost3410_12_256ParamSetA,
FIdTc26Gost3410_12_256ParamSetB, FIdTc26Gost3410_12_256ParamSetC,
@@ -48,8 +48,8 @@ TRosstandartObjectIdentifiers = class abstract(TObject)
class function GetIdTc26HmacGost3411_12_512: IDerObjectIdentifier; static; inline;
class function GetIdTc26Gost3410_12_256: IDerObjectIdentifier; static; inline;
class function GetIdTc26Gost3410_12_512: IDerObjectIdentifier; static; inline;
- class function GetIdTc26SignwithdigestGost3410_12_256: IDerObjectIdentifier; static; inline;
- class function GetIdTc26SignwithdigestGost3410_12_512: IDerObjectIdentifier; static; inline;
+ class function GetIdTc26SignWithDigestGost3410_12_256: IDerObjectIdentifier; static; inline;
+ class function GetIdTc26SignWithDigestGost3410_12_512: IDerObjectIdentifier; static; inline;
class function GetIdTc26Agreement: IDerObjectIdentifier; static; inline;
class function GetIdTc26AgreementGost3410_12_256: IDerObjectIdentifier; static; inline;
class function GetIdTc26AgreementGost3410_12_512: IDerObjectIdentifier; static; inline;
@@ -74,8 +74,8 @@ TRosstandartObjectIdentifiers = class abstract(TObject)
class property IdTc26HmacGost3411_12_512: IDerObjectIdentifier read GetIdTc26HmacGost3411_12_512;
class property IdTc26Gost3410_12_256: IDerObjectIdentifier read GetIdTc26Gost3410_12_256;
class property IdTc26Gost3410_12_512: IDerObjectIdentifier read GetIdTc26Gost3410_12_512;
- class property IdTc26SignwithdigestGost3410_12_256: IDerObjectIdentifier read GetIdTc26SignwithdigestGost3410_12_256;
- class property IdTc26SignwithdigestGost3410_12_512: IDerObjectIdentifier read GetIdTc26SignwithdigestGost3410_12_512;
+ class property IdTc26SignWithDigestGost3410_12_256: IDerObjectIdentifier read GetIdTc26SignWithDigestGost3410_12_256;
+ class property IdTc26SignWithDigestGost3410_12_512: IDerObjectIdentifier read GetIdTc26SignWithDigestGost3410_12_512;
class property IdTc26Agreement: IDerObjectIdentifier read GetIdTc26Agreement;
class property IdTc26AgreementGost3410_12_256: IDerObjectIdentifier read GetIdTc26AgreementGost3410_12_256;
class property IdTc26AgreementGost3410_12_512: IDerObjectIdentifier read GetIdTc26AgreementGost3410_12_512;
@@ -114,8 +114,8 @@ class procedure TRosstandartObjectIdentifiers.Boot;
FIdTc26HmacGost3411_12_512 := FIdTc26.Branch('1.4.2');
FIdTc26Gost3410_12_256 := FIdTc26.Branch('1.1.1');
FIdTc26Gost3410_12_512 := FIdTc26.Branch('1.1.2');
- FIdTc26SignwithdigestGost3410_12_256 := FIdTc26.Branch('1.3.2');
- FIdTc26SignwithdigestGost3410_12_512 := FIdTc26.Branch('1.3.3');
+ FIdTc26SignWithDigestGost3410_12_256 := FIdTc26.Branch('1.3.2');
+ FIdTc26SignWithDigestGost3410_12_512 := FIdTc26.Branch('1.3.3');
FIdTc26Agreement := FIdTc26.Branch('1.6');
FIdTc26AgreementGost3410_12_256 := FIdTc26Agreement.Branch('1');
FIdTc26AgreementGost3410_12_512 := FIdTc26Agreement.Branch('2');
@@ -234,14 +234,14 @@ class function TRosstandartObjectIdentifiers.GetIdTc26HmacGost3411_12_512: IDerO
Result := FIdTc26HmacGost3411_12_512;
end;
-class function TRosstandartObjectIdentifiers.GetIdTc26SignwithdigestGost3410_12_256: IDerObjectIdentifier;
+class function TRosstandartObjectIdentifiers.GetIdTc26SignWithDigestGost3410_12_256: IDerObjectIdentifier;
begin
- Result := FIdTc26SignwithdigestGost3410_12_256;
+ Result := FIdTc26SignWithDigestGost3410_12_256;
end;
-class function TRosstandartObjectIdentifiers.GetIdTc26SignwithdigestGost3410_12_512: IDerObjectIdentifier;
+class function TRosstandartObjectIdentifiers.GetIdTc26SignWithDigestGost3410_12_512: IDerObjectIdentifier;
begin
- Result := FIdTc26SignwithdigestGost3410_12_512;
+ Result := FIdTc26SignWithDigestGost3410_12_512;
end;
class function TRosstandartObjectIdentifiers.GetRosstandart: IDerObjectIdentifier;
diff --git a/CryptoLib/src/Crypto/Operators/ClpDefaultDigestAlgorithmFinder.pas b/CryptoLib/src/Crypto/Operators/ClpDefaultDigestAlgorithmFinder.pas
index d12abec8..196d2e13 100644
--- a/CryptoLib/src/Crypto/Operators/ClpDefaultDigestAlgorithmFinder.pas
+++ b/CryptoLib/src/Crypto/Operators/ClpDefaultDigestAlgorithmFinder.pas
@@ -170,8 +170,8 @@ class procedure TDefaultDigestAlgorithmFinder.Boot;
FDigestOids.Add(TCryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94, TCryptoProObjectIdentifiers.GostR3411);
FDigestOids.Add(TCryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001, TCryptoProObjectIdentifiers.GostR3411);
- FDigestOids.Add(TRosstandartObjectIdentifiers.IdTc26SignwithdigestGost3410_12_256, TRosstandartObjectIdentifiers.IdTc26Gost3411_12_256);
- FDigestOids.Add(TRosstandartObjectIdentifiers.IdTc26SignwithdigestGost3410_12_512, TRosstandartObjectIdentifiers.IdTc26Gost3411_12_512);
+ FDigestOids.Add(TRosstandartObjectIdentifiers.IdTc26SignWithDigestGost3410_12_256, TRosstandartObjectIdentifiers.IdTc26Gost3411_12_256);
+ FDigestOids.Add(TRosstandartObjectIdentifiers.IdTc26SignWithDigestGost3410_12_512, TRosstandartObjectIdentifiers.IdTc26Gost3411_12_512);
FDigestOids.Add(TX509ObjectIdentifiers.IdRsassaPssShake128, TNistObjectIdentifiers.IdShake128);
FDigestOids.Add(TX509ObjectIdentifiers.IdRsassaPssShake256, TNistObjectIdentifiers.IdShake256);
diff --git a/CryptoLib/src/Crypto/Operators/ClpDefaultMacAlgorithmFinder.pas b/CryptoLib/src/Crypto/Operators/ClpDefaultMacAlgorithmFinder.pas
new file mode 100644
index 00000000..2a896da4
--- /dev/null
+++ b/CryptoLib/src/Crypto/Operators/ClpDefaultMacAlgorithmFinder.pas
@@ -0,0 +1,111 @@
+{ *********************************************************************************** }
+{ * CryptoLib Library * }
+{ * Author - Ugochukwu Mmaduekwe * }
+{ * Github Repository * }
+{ * * }
+{ * 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 * }
+{ * the development of this library * }
+{ * ******************************************************************************* * }
+
+(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
+
+unit ClpDefaultMacAlgorithmFinder;
+
+{$I ..\..\Include\CryptoLib.inc}
+
+interface
+
+uses
+ Generics.Collections,
+ ClpAsn1Objects,
+ ClpIX509Asn1Objects,
+ ClpX509Asn1Objects,
+ ClpOiwObjectIdentifiers,
+ ClpPkcsObjectIdentifiers,
+ ClpNistObjectIdentifiers,
+ ClpCollectionUtilities,
+ ClpCryptoLibComparers,
+ ClpIMacAlgorithmFinder,
+ ClpCryptoLibTypes;
+
+type
+ ///
+ /// Default implementation of IMacAlgorithmFinder that maps MAC names to algorithm identifiers.
+ ///
+ TDefaultMacAlgorithmFinder = class sealed(TInterfacedObject, IMacAlgorithmFinder)
+ strict private
+ class var
+ FInstance: IMacAlgorithmFinder;
+ FMacNameToAlgIDs: TDictionary;
+ class procedure Boot; static;
+ class constructor Create;
+ class destructor Destroy;
+ public
+ class property Instance: IMacAlgorithmFinder read FInstance;
+ function Find(const AMacName: String): IAlgorithmIdentifier;
+ end;
+
+implementation
+
+{ TDefaultMacAlgorithmFinder }
+
+class constructor TDefaultMacAlgorithmFinder.Create;
+begin
+ Boot;
+end;
+
+class destructor TDefaultMacAlgorithmFinder.Destroy;
+begin
+ FInstance := nil;
+ FMacNameToAlgIDs.Free;
+end;
+
+class procedure TDefaultMacAlgorithmFinder.Boot;
+begin
+ FMacNameToAlgIDs := TDictionary.Create(
+ TCryptoLibComparers.OrdinalIgnoreCaseEqualityComparer);
+
+ FMacNameToAlgIDs.Add('HMACSHA1',
+ TAlgorithmIdentifier.Create(TOiwObjectIdentifiers.IdSha1) as IAlgorithmIdentifier);
+ FMacNameToAlgIDs.Add('HMACSHA224',
+ TAlgorithmIdentifier.Create(TPkcsObjectIdentifiers.IdHmacWithSha224, TDerNull.Instance)
+ as IAlgorithmIdentifier);
+ FMacNameToAlgIDs.Add('HMACSHA256',
+ TAlgorithmIdentifier.Create(TPkcsObjectIdentifiers.IdHmacWithSha256, TDerNull.Instance)
+ as IAlgorithmIdentifier);
+ FMacNameToAlgIDs.Add('HMACSHA384',
+ TAlgorithmIdentifier.Create(TPkcsObjectIdentifiers.IdHmacWithSha384, TDerNull.Instance)
+ as IAlgorithmIdentifier);
+ FMacNameToAlgIDs.Add('HMACSHA512',
+ TAlgorithmIdentifier.Create(TPkcsObjectIdentifiers.IdHmacWithSha512, TDerNull.Instance)
+ as IAlgorithmIdentifier);
+ FMacNameToAlgIDs.Add('HMACSHA512-224',
+ TAlgorithmIdentifier.Create(TPkcsObjectIdentifiers.IdHmacWithSha512_224, TDerNull.Instance)
+ as IAlgorithmIdentifier);
+ FMacNameToAlgIDs.Add('HMACSHA512-256',
+ TAlgorithmIdentifier.Create(TPkcsObjectIdentifiers.IdHmacWithSha512_256, TDerNull.Instance)
+ as IAlgorithmIdentifier);
+ FMacNameToAlgIDs.Add('HMACSHA3-224',
+ TAlgorithmIdentifier.Create(TNistObjectIdentifiers.IdHMacWithSha3_224) as IAlgorithmIdentifier);
+ FMacNameToAlgIDs.Add('HMACSHA3-256',
+ TAlgorithmIdentifier.Create(TNistObjectIdentifiers.IdHMacWithSha3_256) as IAlgorithmIdentifier);
+ FMacNameToAlgIDs.Add('HMACSHA3-384',
+ TAlgorithmIdentifier.Create(TNistObjectIdentifiers.IdHMacWithSha3_384) as IAlgorithmIdentifier);
+ FMacNameToAlgIDs.Add('HMACSHA3-512',
+ TAlgorithmIdentifier.Create(TNistObjectIdentifiers.IdHMacWithSha3_512) as IAlgorithmIdentifier);
+
+ FInstance := TDefaultMacAlgorithmFinder.Create;
+end;
+
+function TDefaultMacAlgorithmFinder.Find(const AMacName: String): IAlgorithmIdentifier;
+begin
+ Result := TCollectionUtilities.GetValueOrNull(
+ FMacNameToAlgIDs, AMacName);
+end;
+
+end.
diff --git a/CryptoLib/src/Crypto/Operators/ClpDefaultSignatureAlgorithmFinder.pas b/CryptoLib/src/Crypto/Operators/ClpDefaultSignatureAlgorithmFinder.pas
new file mode 100644
index 00000000..cdd6ff80
--- /dev/null
+++ b/CryptoLib/src/Crypto/Operators/ClpDefaultSignatureAlgorithmFinder.pas
@@ -0,0 +1,515 @@
+{ *********************************************************************************** }
+{ * CryptoLib Library * }
+{ * Author - Ugochukwu Mmaduekwe * }
+{ * Github Repository * }
+{ * * }
+{ * 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 * }
+{ * the development of this library * }
+{ * ******************************************************************************* * }
+
+(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
+
+unit ClpDefaultSignatureAlgorithmFinder;
+
+{$I ..\..\Include\CryptoLib.inc}
+
+interface
+
+uses
+ SysUtils,
+ Generics.Collections,
+ ClpIAsn1Core,
+ ClpAsn1Objects,
+ ClpIAsn1Objects,
+ ClpIX509Asn1Objects,
+ ClpX509Asn1Objects,
+ ClpPkcsObjectIdentifiers,
+ ClpIPkcsRsaAsn1Objects,
+ ClpPkcsRsaAsn1Objects,
+ ClpX9ObjectIdentifiers,
+ ClpNistObjectIdentifiers,
+ ClpTeleTrusTObjectIdentifiers,
+ ClpOiwObjectIdentifiers,
+ ClpCryptoProObjectIdentifiers,
+ ClpRosstandartObjectIdentifiers,
+ ClpBsiObjectIdentifiers,
+ ClpEdECObjectIdentifiers,
+ ClpX509ObjectIdentifiers,
+ ClpEacObjectIdentifiers,
+ ClpMiscObjectIdentifiers,
+ ClpAsn1Comparers,
+ ClpCryptoLibComparers,
+ ClpISignatureAlgorithmFinder,
+ ClpCryptoLibTypes;
+
+type
+ ///
+ /// Default implementation of ISignatureAlgorithmFinder that maps signature names
+ /// to algorithm identifiers.
+ ///
+ TDefaultSignatureAlgorithmFinder = class sealed(TInterfacedObject, ISignatureAlgorithmFinder)
+ strict private
+ class var
+ FInstance: ISignatureAlgorithmFinder;
+ FAlgorithms: TDictionary;
+ FNoParams: TDictionary;
+ FParameters: TDictionary;
+ FPkcs15RsaEncryption: TDictionary;
+ FDigestOids: TDictionary;
+ class procedure AddAlgorithm(const AName: String; const AOid: IDerObjectIdentifier); overload; static;
+ class procedure AddAlgorithm(const AName: String; const AOid: IDerObjectIdentifier;
+ AIsNoParams: Boolean); overload; static;
+ class procedure AddAlgorithm(const AName: String; const AOid: IDerObjectIdentifier;
+ const ADigestOid: IDerObjectIdentifier; AIsNoParams: Boolean); overload; static;
+ class procedure AddDigestOid(const ASignatureOid, ADigestOid: IDerObjectIdentifier); static;
+ class procedure AddPkcs15RsaEncryption(const AOid: IDerObjectIdentifier); static;
+ class procedure AddNoParams(const AOid: IDerObjectIdentifier); static;
+ class procedure AddParameters(const AAlgorithmName: String;
+ const AParameters: IAsn1Encodable); static;
+ class function CreatePssParams(const ADigAlgID: IAlgorithmIdentifier;
+ ASaltSize: Int32): IRsassaPssParameters; static;
+ class procedure Boot; static;
+ class constructor Create;
+ class destructor Destroy;
+ public
+ class property Instance: ISignatureAlgorithmFinder read FInstance;
+ function Find(const ASignatureName: String): IAlgorithmIdentifier;
+ end;
+
+implementation
+
+{ TDefaultSignatureAlgorithmFinder }
+
+class constructor TDefaultSignatureAlgorithmFinder.Create;
+begin
+ Boot;
+end;
+
+class destructor TDefaultSignatureAlgorithmFinder.Destroy;
+begin
+ FInstance := nil;
+ FAlgorithms.Free;
+ FNoParams.Free;
+ FParameters.Free;
+ FPkcs15RsaEncryption.Free;
+ FDigestOids.Free;
+end;
+
+class procedure TDefaultSignatureAlgorithmFinder.AddAlgorithm(const AName: String;
+ const AOid: IDerObjectIdentifier);
+begin
+ FAlgorithms.Add(AName, AOid);
+end;
+
+class procedure TDefaultSignatureAlgorithmFinder.AddAlgorithm(const AName: String;
+ const AOid: IDerObjectIdentifier; AIsNoParams: Boolean);
+begin
+ AddAlgorithm(AName, AOid, nil, AIsNoParams);
+end;
+
+class procedure TDefaultSignatureAlgorithmFinder.AddAlgorithm(const AName: String;
+ const AOid: IDerObjectIdentifier; const ADigestOid: IDerObjectIdentifier; AIsNoParams: Boolean);
+begin
+ if AName = '' then
+ raise EArgumentNilCryptoLibException.Create('name');
+ if AOid = nil then
+ raise EArgumentNilCryptoLibException.Create('oid');
+
+ AddAlgorithm(AName, AOid);
+
+ if ADigestOid <> nil then
+ AddDigestOid(AOid, ADigestOid);
+ if AIsNoParams then
+ AddNoParams(AOid);
+end;
+
+class procedure TDefaultSignatureAlgorithmFinder.AddDigestOid(const ASignatureOid,
+ ADigestOid: IDerObjectIdentifier);
+begin
+ FDigestOids.Add(ASignatureOid, ADigestOid);
+end;
+
+class procedure TDefaultSignatureAlgorithmFinder.AddPkcs15RsaEncryption(
+ const AOid: IDerObjectIdentifier);
+begin
+ if not FPkcs15RsaEncryption.ContainsKey(AOid) then
+ FPkcs15RsaEncryption.Add(AOid, 0);
+end;
+
+class procedure TDefaultSignatureAlgorithmFinder.AddNoParams(const AOid: IDerObjectIdentifier);
+begin
+ if not FNoParams.ContainsKey(AOid) then
+ FNoParams.Add(AOid, TAlgorithmIdentifier.Create(AOid) as IAlgorithmIdentifier);
+end;
+
+class procedure TDefaultSignatureAlgorithmFinder.AddParameters(const AAlgorithmName: String;
+ const AParameters: IAsn1Encodable);
+begin
+ if AParameters = nil then
+ raise EArgumentCryptoLibException.Create('use ''NoParams'' instead for absent parameters');
+ FParameters.Add(AAlgorithmName, AParameters);
+end;
+
+class function TDefaultSignatureAlgorithmFinder.CreatePssParams(
+ const ADigAlgID: IAlgorithmIdentifier; ASaltSize: Int32): IRsassaPssParameters;
+var
+ LHashAlgId: IAlgorithmIdentifier;
+ LMgfAlgId: IAlgorithmIdentifier;
+ LSaltLength: IDerInteger;
+begin
+ LHashAlgId := ADigAlgID;
+ LMgfAlgId := TAlgorithmIdentifier.Create(TPkcsObjectIdentifiers.IdMgf1, LHashAlgId);
+ LSaltLength := TDerInteger.Create(ASaltSize);
+ Result := TRsassaPssParameters.Create(LHashAlgId, LMgfAlgId, LSaltLength,
+ TRsassaPssParameters.DefaultTrailerField);
+end;
+
+class procedure TDefaultSignatureAlgorithmFinder.Boot;
+var
+ LSha1AlgId, LSha224AlgId, LSha256AlgId, LSha384AlgId, LSha512AlgId: IAlgorithmIdentifier;
+ LSha3_224AlgId, LSha3_256AlgId, LSha3_384AlgId, LSha3_512AlgId: IAlgorithmIdentifier;
+begin
+ FAlgorithms := TDictionary.Create(
+ TCryptoLibComparers.OrdinalIgnoreCaseEqualityComparer);
+ FNoParams := TDictionary.Create(
+ TAsn1Comparers.OidEqualityComparer);
+ FParameters := TDictionary.Create(
+ TCryptoLibComparers.OrdinalIgnoreCaseEqualityComparer);
+ FPkcs15RsaEncryption := TDictionary.Create(
+ TAsn1Comparers.OidEqualityComparer);
+ FDigestOids := TDictionary.Create(
+ TAsn1Comparers.OidEqualityComparer);
+
+ AddAlgorithm('MD2WITHRSAENCRYPTION', TPkcsObjectIdentifiers.MD2WithRsaEncryption);
+ AddAlgorithm('MD2WITHRSA', TPkcsObjectIdentifiers.MD2WithRsaEncryption);
+ AddAlgorithm('MD5WITHRSAENCRYPTION', TPkcsObjectIdentifiers.MD5WithRsaEncryption);
+ AddAlgorithm('MD5WITHRSA', TPkcsObjectIdentifiers.MD5WithRsaEncryption);
+ AddAlgorithm('SHA1WITHRSAENCRYPTION', TPkcsObjectIdentifiers.Sha1WithRsaEncryption);
+ AddAlgorithm('SHA-1WITHRSAENCRYPTION', TPkcsObjectIdentifiers.Sha1WithRsaEncryption);
+ AddAlgorithm('SHA1WITHRSA', TPkcsObjectIdentifiers.Sha1WithRsaEncryption);
+ AddAlgorithm('SHA-1WITHRSA', TPkcsObjectIdentifiers.Sha1WithRsaEncryption);
+ AddAlgorithm('SHA224WITHRSAENCRYPTION', TPkcsObjectIdentifiers.Sha224WithRsaEncryption);
+ AddAlgorithm('SHA-224WITHRSAENCRYPTION', TPkcsObjectIdentifiers.Sha224WithRsaEncryption);
+ AddAlgorithm('SHA224WITHRSA', TPkcsObjectIdentifiers.Sha224WithRsaEncryption);
+ AddAlgorithm('SHA-224WITHRSA', TPkcsObjectIdentifiers.Sha224WithRsaEncryption);
+ AddAlgorithm('SHA256WITHRSAENCRYPTION', TPkcsObjectIdentifiers.Sha256WithRsaEncryption);
+ AddAlgorithm('SHA-256WITHRSAENCRYPTION', TPkcsObjectIdentifiers.Sha256WithRsaEncryption);
+ AddAlgorithm('SHA256WITHRSA', TPkcsObjectIdentifiers.Sha256WithRsaEncryption);
+ AddAlgorithm('SHA-256WITHRSA', TPkcsObjectIdentifiers.Sha256WithRsaEncryption);
+ AddAlgorithm('SHA384WITHRSAENCRYPTION', TPkcsObjectIdentifiers.Sha384WithRsaEncryption);
+ AddAlgorithm('SHA-384WITHRSAENCRYPTION', TPkcsObjectIdentifiers.Sha384WithRsaEncryption);
+ AddAlgorithm('SHA384WITHRSA', TPkcsObjectIdentifiers.Sha384WithRsaEncryption);
+ AddAlgorithm('SHA-384WITHRSA', TPkcsObjectIdentifiers.Sha384WithRsaEncryption);
+ AddAlgorithm('SHA512WITHRSAENCRYPTION', TPkcsObjectIdentifiers.Sha512WithRsaEncryption);
+ AddAlgorithm('SHA-512WITHRSAENCRYPTION', TPkcsObjectIdentifiers.Sha512WithRsaEncryption);
+ AddAlgorithm('SHA512WITHRSA', TPkcsObjectIdentifiers.Sha512WithRsaEncryption);
+ AddAlgorithm('SHA-512WITHRSA', TPkcsObjectIdentifiers.Sha512WithRsaEncryption);
+ AddAlgorithm('SHA512(224)WITHRSAENCRYPTION', TPkcsObjectIdentifiers.Sha512_224WithRSAEncryption);
+ AddAlgorithm('SHA-512(224)WITHRSAENCRYPTION', TPkcsObjectIdentifiers.Sha512_224WithRSAEncryption);
+ AddAlgorithm('SHA512(224)WITHRSA', TPkcsObjectIdentifiers.Sha512_224WithRSAEncryption);
+ AddAlgorithm('SHA-512(224)WITHRSA', TPkcsObjectIdentifiers.Sha512_224WithRSAEncryption);
+ AddAlgorithm('SHA512(256)WITHRSAENCRYPTION', TPkcsObjectIdentifiers.Sha512_256WithRSAEncryption);
+ AddAlgorithm('SHA-512(256)WITHRSAENCRYPTION', TPkcsObjectIdentifiers.Sha512_256WithRSAEncryption);
+ AddAlgorithm('SHA512(256)WITHRSA', TPkcsObjectIdentifiers.Sha512_256WithRSAEncryption);
+ AddAlgorithm('SHA-512(256)WITHRSA', TPkcsObjectIdentifiers.Sha512_256WithRSAEncryption);
+ AddAlgorithm('SHA1WITHRSAANDMGF1', TPkcsObjectIdentifiers.IdRsassaPss);
+ AddAlgorithm('SHA224WITHRSAANDMGF1', TPkcsObjectIdentifiers.IdRsassaPss);
+ AddAlgorithm('SHA256WITHRSAANDMGF1', TPkcsObjectIdentifiers.IdRsassaPss);
+ AddAlgorithm('SHA384WITHRSAANDMGF1', TPkcsObjectIdentifiers.IdRsassaPss);
+ AddAlgorithm('SHA512WITHRSAANDMGF1', TPkcsObjectIdentifiers.IdRsassaPss);
+ AddAlgorithm('SHA3-224WITHRSAANDMGF1', TPkcsObjectIdentifiers.IdRsassaPss);
+ AddAlgorithm('SHA3-256WITHRSAANDMGF1', TPkcsObjectIdentifiers.IdRsassaPss);
+ AddAlgorithm('SHA3-384WITHRSAANDMGF1', TPkcsObjectIdentifiers.IdRsassaPss);
+ AddAlgorithm('SHA3-512WITHRSAANDMGF1', TPkcsObjectIdentifiers.IdRsassaPss);
+ AddAlgorithm('RIPEMD160WITHRSAENCRYPTION', TTeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD160);
+ AddAlgorithm('RIPEMD160WITHRSA', TTeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD160);
+ AddAlgorithm('RIPEMD128WITHRSAENCRYPTION', TTeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD128);
+ AddAlgorithm('RIPEMD128WITHRSA', TTeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD128);
+ AddAlgorithm('RIPEMD256WITHRSAENCRYPTION', TTeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD256);
+ AddAlgorithm('RIPEMD256WITHRSA', TTeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD256);
+
+ AddAlgorithm('SHA1WITHDSA', TX9ObjectIdentifiers.IdDsaWithSha1);
+ AddAlgorithm('SHA-1WITHDSA', TX9ObjectIdentifiers.IdDsaWithSha1);
+ AddAlgorithm('DSAWITHSHA1', TX9ObjectIdentifiers.IdDsaWithSha1);
+ AddAlgorithm('SHA224WITHDSA', TNistObjectIdentifiers.DsaWithSha224);
+ AddAlgorithm('SHA256WITHDSA', TNistObjectIdentifiers.DsaWithSha256);
+ AddAlgorithm('SHA384WITHDSA', TNistObjectIdentifiers.DsaWithSha384);
+ AddAlgorithm('SHA512WITHDSA', TNistObjectIdentifiers.DsaWithSha512);
+
+ AddAlgorithm('SHA3-224WITHDSA', TNistObjectIdentifiers.IdDsaWithSha3_224);
+ AddAlgorithm('SHA3-256WITHDSA', TNistObjectIdentifiers.IdDsaWithSha3_256);
+ AddAlgorithm('SHA3-384WITHDSA', TNistObjectIdentifiers.IdDsaWithSha3_384);
+ AddAlgorithm('SHA3-512WITHDSA', TNistObjectIdentifiers.IdDsaWithSha3_512);
+
+ AddAlgorithm('SHA1WITHECDSA', TX9ObjectIdentifiers.ECDsaWithSha1);
+ AddAlgorithm('ECDSAWITHSHA1', TX9ObjectIdentifiers.ECDsaWithSha1);
+ AddAlgorithm('SHA224WITHECDSA', TX9ObjectIdentifiers.ECDsaWithSha224);
+ AddAlgorithm('SHA256WITHECDSA', TX9ObjectIdentifiers.ECDsaWithSha256);
+ AddAlgorithm('SHA384WITHECDSA', TX9ObjectIdentifiers.ECDsaWithSha384);
+ AddAlgorithm('SHA512WITHECDSA', TX9ObjectIdentifiers.ECDsaWithSha512);
+
+ AddAlgorithm('SHA3-224WITHECDSA', TNistObjectIdentifiers.IdECDsaWithSha3_224);
+ AddAlgorithm('SHA3-256WITHECDSA', TNistObjectIdentifiers.IdECDsaWithSha3_256);
+ AddAlgorithm('SHA3-384WITHECDSA', TNistObjectIdentifiers.IdECDsaWithSha3_384);
+ AddAlgorithm('SHA3-512WITHECDSA', TNistObjectIdentifiers.IdECDsaWithSha3_512);
+
+ AddAlgorithm('SHA3-224WITHRSA', TNistObjectIdentifiers.IdRsassaPkcs1V15WithSha3_224);
+ AddAlgorithm('SHA3-256WITHRSA', TNistObjectIdentifiers.IdRsassaPkcs1V15WithSha3_256);
+ AddAlgorithm('SHA3-384WITHRSA', TNistObjectIdentifiers.IdRsassaPkcs1V15WithSha3_384);
+ AddAlgorithm('SHA3-512WITHRSA', TNistObjectIdentifiers.IdRsassaPkcs1V15WithSha3_512);
+ AddAlgorithm('SHA3-224WITHRSAENCRYPTION', TNistObjectIdentifiers.IdRsassaPkcs1V15WithSha3_224);
+ AddAlgorithm('SHA3-256WITHRSAENCRYPTION', TNistObjectIdentifiers.IdRsassaPkcs1V15WithSha3_256);
+ AddAlgorithm('SHA3-384WITHRSAENCRYPTION', TNistObjectIdentifiers.IdRsassaPkcs1V15WithSha3_384);
+ AddAlgorithm('SHA3-512WITHRSAENCRYPTION', TNistObjectIdentifiers.IdRsassaPkcs1V15WithSha3_512);
+
+ AddAlgorithm('GOST3411WITHGOST3410', TCryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94);
+ AddAlgorithm('GOST3411WITHGOST3410-94', TCryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94);
+ AddAlgorithm('GOST3411WITHECGOST3410', TCryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001);
+ AddAlgorithm('GOST3411WITHECGOST3410-2001', TCryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001);
+ AddAlgorithm('GOST3411WITHGOST3410-2001', TCryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001);
+ AddAlgorithm('GOST3411WITHECGOST3410-2012-256',
+ TRosstandartObjectIdentifiers.IdTc26SignWithDigestGost3410_12_256);
+ AddAlgorithm('GOST3411WITHECGOST3410-2012-512',
+ TRosstandartObjectIdentifiers.IdTc26SignWithDigestGost3410_12_512);
+ AddAlgorithm('GOST3411WITHGOST3410-2012-256',
+ TRosstandartObjectIdentifiers.IdTc26SignWithDigestGost3410_12_256);
+ AddAlgorithm('GOST3411WITHGOST3410-2012-512',
+ TRosstandartObjectIdentifiers.IdTc26SignWithDigestGost3410_12_512);
+ AddAlgorithm('GOST3411-2012-256WITHECGOST3410-2012-256',
+ TRosstandartObjectIdentifiers.IdTc26SignWithDigestGost3410_12_256);
+ AddAlgorithm('GOST3411-2012-512WITHECGOST3410-2012-512',
+ TRosstandartObjectIdentifiers.IdTc26SignWithDigestGost3410_12_512);
+ AddAlgorithm('GOST3411-2012-256WITHGOST3410-2012-256',
+ TRosstandartObjectIdentifiers.IdTc26SignWithDigestGost3410_12_256);
+ AddAlgorithm('GOST3411-2012-512WITHGOST3410-2012-512',
+ TRosstandartObjectIdentifiers.IdTc26SignWithDigestGost3410_12_512);
+ AddAlgorithm('GOST3411-2012-256WITHECGOST3410',
+ TRosstandartObjectIdentifiers.IdTc26SignWithDigestGost3410_12_256);
+ AddAlgorithm('GOST3411-2012-512WITHECGOST3410',
+ TRosstandartObjectIdentifiers.IdTc26SignWithDigestGost3410_12_512);
+
+ AddAlgorithm('SHA1WITHCVC-ECDSA', TEacObjectIdentifiers.IdTAEcdsaSha1);
+ AddAlgorithm('SHA224WITHCVC-ECDSA', TEacObjectIdentifiers.IdTAEcdsaSha224);
+ AddAlgorithm('SHA256WITHCVC-ECDSA', TEacObjectIdentifiers.IdTAEcdsaSha256);
+ AddAlgorithm('SHA384WITHCVC-ECDSA', TEacObjectIdentifiers.IdTAEcdsaSha384);
+ AddAlgorithm('SHA512WITHCVC-ECDSA', TEacObjectIdentifiers.IdTAEcdsaSha512);
+
+ AddAlgorithm('SHA1WITHPLAIN-ECDSA', TBsiObjectIdentifiers.EcdsaPlainSha1);
+ AddAlgorithm('SHA224WITHPLAIN-ECDSA', TBsiObjectIdentifiers.EcdsaPlainSha224);
+ AddAlgorithm('SHA256WITHPLAIN-ECDSA', TBsiObjectIdentifiers.EcdsaPlainSha256);
+ AddAlgorithm('SHA384WITHPLAIN-ECDSA', TBsiObjectIdentifiers.EcdsaPlainSha384);
+ AddAlgorithm('SHA512WITHPLAIN-ECDSA', TBsiObjectIdentifiers.EcdsaPlainSha512);
+ AddAlgorithm('RIPEMD160WITHPLAIN-ECDSA', TBsiObjectIdentifiers.EcdsaPlainRipeMD160);
+
+ AddAlgorithm('SHA3-224WITHPLAIN-ECDSA', TBsiObjectIdentifiers.EcdsaPlainSha3_224);
+ AddAlgorithm('SHA3-256WITHPLAIN-ECDSA', TBsiObjectIdentifiers.EcdsaPlainSha3_256);
+ AddAlgorithm('SHA3-384WITHPLAIN-ECDSA', TBsiObjectIdentifiers.EcdsaPlainSha3_384);
+ AddAlgorithm('SHA3-512WITHPLAIN-ECDSA', TBsiObjectIdentifiers.EcdsaPlainSha3_512);
+
+ AddAlgorithm('SHAKE128WITHRSAPSS', TX509ObjectIdentifiers.IdRsassaPssShake128);
+ AddAlgorithm('SHAKE256WITHRSAPSS', TX509ObjectIdentifiers.IdRsassaPssShake256);
+ AddAlgorithm('SHAKE128WITHRSASSA-PSS', TX509ObjectIdentifiers.IdRsassaPssShake128);
+ AddAlgorithm('SHAKE256WITHRSASSA-PSS', TX509ObjectIdentifiers.IdRsassaPssShake256);
+ AddAlgorithm('SHAKE128WITHECDSA', TX509ObjectIdentifiers.IdEcdsaWithShake128);
+ AddAlgorithm('SHAKE256WITHECDSA', TX509ObjectIdentifiers.IdEcdsaWithShake256);
+
+ //
+ // According to RFC 3279, the ASN.1 encoding SHALL (id-dsa-with-sha1) or MUST (ecdsa-with-SHA*) omit the parameters field.
+ // The parameters field SHALL be NULL for RSA based signature algorithms.
+ //
+
+ AddNoParams(TX9ObjectIdentifiers.IdDsaWithSha1);
+ AddNoParams(TNistObjectIdentifiers.DsaWithSha224);
+ AddNoParams(TNistObjectIdentifiers.DsaWithSha256);
+ AddNoParams(TNistObjectIdentifiers.DsaWithSha384);
+ AddNoParams(TNistObjectIdentifiers.DsaWithSha512);
+
+ AddNoParams(TNistObjectIdentifiers.IdDsaWithSha3_224);
+ AddNoParams(TNistObjectIdentifiers.IdDsaWithSha3_256);
+ AddNoParams(TNistObjectIdentifiers.IdDsaWithSha3_384);
+ AddNoParams(TNistObjectIdentifiers.IdDsaWithSha3_512);
+
+ AddNoParams(TX9ObjectIdentifiers.ECDsaWithSha1);
+ AddNoParams(TOiwObjectIdentifiers.DsaWithSha1);
+ AddNoParams(TX9ObjectIdentifiers.ECDsaWithSha224);
+ AddNoParams(TX9ObjectIdentifiers.ECDsaWithSha256);
+ AddNoParams(TX9ObjectIdentifiers.ECDsaWithSha384);
+ AddNoParams(TX9ObjectIdentifiers.ECDsaWithSha512);
+
+ AddNoParams(TNistObjectIdentifiers.IdECDsaWithSha3_224);
+ AddNoParams(TNistObjectIdentifiers.IdECDsaWithSha3_256);
+ AddNoParams(TNistObjectIdentifiers.IdECDsaWithSha3_384);
+ AddNoParams(TNistObjectIdentifiers.IdECDsaWithSha3_512);
+
+ AddNoParams(TBsiObjectIdentifiers.EcdsaPlainSha1);
+ AddNoParams(TBsiObjectIdentifiers.EcdsaPlainSha224);
+ AddNoParams(TBsiObjectIdentifiers.EcdsaPlainSha256);
+ AddNoParams(TBsiObjectIdentifiers.EcdsaPlainSha384);
+ AddNoParams(TBsiObjectIdentifiers.EcdsaPlainSha512);
+
+ AddNoParams(TBsiObjectIdentifiers.EcdsaPlainSha3_224);
+ AddNoParams(TBsiObjectIdentifiers.EcdsaPlainSha3_256);
+ AddNoParams(TBsiObjectIdentifiers.EcdsaPlainSha3_384);
+ AddNoParams(TBsiObjectIdentifiers.EcdsaPlainSha3_512);
+
+ //
+ // RFC 4491
+ //
+ AddNoParams(TCryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94);
+ AddNoParams(TCryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001);
+ AddNoParams(TRosstandartObjectIdentifiers.IdTc26SignWithDigestGost3410_12_256);
+ AddNoParams(TRosstandartObjectIdentifiers.IdTc26SignWithDigestGost3410_12_512);
+
+ AddNoParams(TX509ObjectIdentifiers.IdRsassaPssShake128);
+ AddNoParams(TX509ObjectIdentifiers.IdRsassaPssShake256);
+ AddNoParams(TX509ObjectIdentifiers.IdEcdsaWithShake128);
+ AddNoParams(TX509ObjectIdentifiers.IdEcdsaWithShake256);
+
+ //
+ // PKCS 1.5 encrypted algorithms
+ //
+ AddPkcs15RsaEncryption(TPkcsObjectIdentifiers.Sha1WithRsaEncryption);
+ AddPkcs15RsaEncryption(TPkcsObjectIdentifiers.Sha224WithRsaEncryption);
+ AddPkcs15RsaEncryption(TPkcsObjectIdentifiers.Sha256WithRsaEncryption);
+ AddPkcs15RsaEncryption(TPkcsObjectIdentifiers.Sha384WithRsaEncryption);
+ AddPkcs15RsaEncryption(TPkcsObjectIdentifiers.Sha512WithRsaEncryption);
+ AddPkcs15RsaEncryption(TPkcsObjectIdentifiers.Sha512_224WithRSAEncryption);
+ AddPkcs15RsaEncryption(TPkcsObjectIdentifiers.Sha512_256WithRSAEncryption);
+ AddPkcs15RsaEncryption(TTeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD128);
+ AddPkcs15RsaEncryption(TTeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD160);
+ AddPkcs15RsaEncryption(TTeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD256);
+ AddPkcs15RsaEncryption(TNistObjectIdentifiers.IdRsassaPkcs1V15WithSha3_224);
+ AddPkcs15RsaEncryption(TNistObjectIdentifiers.IdRsassaPkcs1V15WithSha3_256);
+ AddPkcs15RsaEncryption(TNistObjectIdentifiers.IdRsassaPkcs1V15WithSha3_384);
+ AddPkcs15RsaEncryption(TNistObjectIdentifiers.IdRsassaPkcs1V15WithSha3_512);
+
+ //
+ // explicit params
+ //
+ LSha1AlgId := TAlgorithmIdentifier.Create(TOiwObjectIdentifiers.IdSha1, TDerNull.Instance);
+ AddParameters('SHA1WITHRSAANDMGF1', CreatePssParams(LSha1AlgId, 20));
+
+ LSha224AlgId := TAlgorithmIdentifier.Create(TNistObjectIdentifiers.IdSha224, TDerNull.Instance);
+ AddParameters('SHA224WITHRSAANDMGF1', CreatePssParams(LSha224AlgId, 28));
+
+ LSha256AlgId := TAlgorithmIdentifier.Create(TNistObjectIdentifiers.IdSha256, TDerNull.Instance);
+ AddParameters('SHA256WITHRSAANDMGF1', CreatePssParams(LSha256AlgId, 32));
+
+ LSha384AlgId := TAlgorithmIdentifier.Create(TNistObjectIdentifiers.IdSha384, TDerNull.Instance);
+ AddParameters('SHA384WITHRSAANDMGF1', CreatePssParams(LSha384AlgId, 48));
+
+ LSha512AlgId := TAlgorithmIdentifier.Create(TNistObjectIdentifiers.IdSha512, TDerNull.Instance);
+ AddParameters('SHA512WITHRSAANDMGF1', CreatePssParams(LSha512AlgId, 64));
+
+ LSha3_224AlgId := TAlgorithmIdentifier.Create(TNistObjectIdentifiers.IdSha3_224, TDerNull.Instance);
+ AddParameters('SHA3-224WITHRSAANDMGF1', CreatePssParams(LSha3_224AlgId, 28));
+
+ LSha3_256AlgId := TAlgorithmIdentifier.Create(TNistObjectIdentifiers.IdSha3_256, TDerNull.Instance);
+ AddParameters('SHA3-256WITHRSAANDMGF1', CreatePssParams(LSha3_256AlgId, 32));
+
+ LSha3_384AlgId := TAlgorithmIdentifier.Create(TNistObjectIdentifiers.IdSha3_384, TDerNull.Instance);
+ AddParameters('SHA3-384WITHRSAANDMGF1', CreatePssParams(LSha3_384AlgId, 48));
+
+ LSha3_512AlgId := TAlgorithmIdentifier.Create(TNistObjectIdentifiers.IdSha3_512, TDerNull.Instance);
+ AddParameters('SHA3-512WITHRSAANDMGF1', CreatePssParams(LSha3_512AlgId, 64));
+
+ //
+ // digests
+ //
+ AddDigestOid(TPkcsObjectIdentifiers.Sha224WithRsaEncryption, TNistObjectIdentifiers.IdSha224);
+ AddDigestOid(TPkcsObjectIdentifiers.Sha256WithRsaEncryption, TNistObjectIdentifiers.IdSha256);
+ AddDigestOid(TPkcsObjectIdentifiers.Sha384WithRsaEncryption, TNistObjectIdentifiers.IdSha384);
+ AddDigestOid(TPkcsObjectIdentifiers.Sha512WithRsaEncryption, TNistObjectIdentifiers.IdSha512);
+ AddDigestOid(TPkcsObjectIdentifiers.Sha512_224WithRSAEncryption, TNistObjectIdentifiers.IdSha512_224);
+ AddDigestOid(TPkcsObjectIdentifiers.Sha512_256WithRSAEncryption, TNistObjectIdentifiers.IdSha512_256);
+ AddDigestOid(TNistObjectIdentifiers.IdRsassaPkcs1V15WithSha3_224, TNistObjectIdentifiers.IdSha3_224);
+ AddDigestOid(TNistObjectIdentifiers.IdRsassaPkcs1V15WithSha3_256, TNistObjectIdentifiers.IdSha3_256);
+ AddDigestOid(TNistObjectIdentifiers.IdRsassaPkcs1V15WithSha3_384, TNistObjectIdentifiers.IdSha3_384);
+ AddDigestOid(TNistObjectIdentifiers.IdRsassaPkcs1V15WithSha3_512, TNistObjectIdentifiers.IdSha3_512);
+
+ AddDigestOid(TPkcsObjectIdentifiers.MD2WithRsaEncryption, TPkcsObjectIdentifiers.MD2);
+ AddDigestOid(TPkcsObjectIdentifiers.MD4WithRsaEncryption, TPkcsObjectIdentifiers.MD4);
+ AddDigestOid(TPkcsObjectIdentifiers.MD5WithRsaEncryption, TPkcsObjectIdentifiers.MD5);
+ AddDigestOid(TPkcsObjectIdentifiers.Sha1WithRsaEncryption, TOiwObjectIdentifiers.IdSha1);
+ AddDigestOid(TTeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD128,
+ TTeleTrusTObjectIdentifiers.RipeMD128);
+ AddDigestOid(TTeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD160,
+ TTeleTrusTObjectIdentifiers.RipeMD160);
+ AddDigestOid(TTeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD256,
+ TTeleTrusTObjectIdentifiers.RipeMD256);
+ AddDigestOid(TCryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94,
+ TCryptoProObjectIdentifiers.GostR3411);
+ AddDigestOid(TCryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001,
+ TCryptoProObjectIdentifiers.GostR3411);
+ AddDigestOid(TRosstandartObjectIdentifiers.IdTc26SignWithDigestGost3410_12_256,
+ TRosstandartObjectIdentifiers.IdTc26Gost3411_12_256);
+ AddDigestOid(TRosstandartObjectIdentifiers.IdTc26SignWithDigestGost3410_12_512,
+ TRosstandartObjectIdentifiers.IdTc26Gost3411_12_512);
+
+ AddDigestOid(TX9ObjectIdentifiers.IdDsaWithSha1, TOiwObjectIdentifiers.IdSha1);
+ AddDigestOid(TOiwObjectIdentifiers.DsaWithSha1, TOiwObjectIdentifiers.IdSha1);
+ AddDigestOid(TNistObjectIdentifiers.DsaWithSha224, TNistObjectIdentifiers.IdSha224);
+ AddDigestOid(TNistObjectIdentifiers.DsaWithSha256, TNistObjectIdentifiers.IdSha256);
+ AddDigestOid(TNistObjectIdentifiers.DsaWithSha384, TNistObjectIdentifiers.IdSha384);
+ AddDigestOid(TNistObjectIdentifiers.DsaWithSha512, TNistObjectIdentifiers.IdSha512);
+
+ AddDigestOid(TNistObjectIdentifiers.IdDsaWithSha3_224, TNistObjectIdentifiers.IdSha3_224);
+ AddDigestOid(TNistObjectIdentifiers.IdDsaWithSha3_256, TNistObjectIdentifiers.IdSha3_256);
+ AddDigestOid(TNistObjectIdentifiers.IdDsaWithSha3_384, TNistObjectIdentifiers.IdSha3_384);
+ AddDigestOid(TNistObjectIdentifiers.IdDsaWithSha3_512, TNistObjectIdentifiers.IdSha3_512);
+
+ AddDigestOid(TX9ObjectIdentifiers.ECDsaWithSha1, TOiwObjectIdentifiers.IdSha1);
+ AddDigestOid(TX9ObjectIdentifiers.ECDsaWithSha224, TNistObjectIdentifiers.IdSha224);
+ AddDigestOid(TX9ObjectIdentifiers.ECDsaWithSha256, TNistObjectIdentifiers.IdSha256);
+ AddDigestOid(TX9ObjectIdentifiers.ECDsaWithSha384, TNistObjectIdentifiers.IdSha384);
+ AddDigestOid(TX9ObjectIdentifiers.ECDsaWithSha512, TNistObjectIdentifiers.IdSha512);
+
+ AddDigestOid(TNistObjectIdentifiers.IdECDsaWithSha3_224, TNistObjectIdentifiers.IdSha3_224);
+ AddDigestOid(TNistObjectIdentifiers.IdECDsaWithSha3_256, TNistObjectIdentifiers.IdSha3_256);
+ AddDigestOid(TNistObjectIdentifiers.IdECDsaWithSha3_384, TNistObjectIdentifiers.IdSha3_384);
+ AddDigestOid(TNistObjectIdentifiers.IdECDsaWithSha3_512, TNistObjectIdentifiers.IdSha3_512);
+
+ AddDigestOid(TX509ObjectIdentifiers.IdRsassaPssShake128, TNistObjectIdentifiers.IdShake128);
+ AddDigestOid(TX509ObjectIdentifiers.IdRsassaPssShake256, TNistObjectIdentifiers.IdShake256);
+ AddDigestOid(TX509ObjectIdentifiers.IdEcdsaWithShake128, TNistObjectIdentifiers.IdShake128);
+ AddDigestOid(TX509ObjectIdentifiers.IdEcdsaWithShake256, TNistObjectIdentifiers.IdShake256);
+
+ //
+ // EdDSA
+ //
+ AddAlgorithm('Ed25519', TEdECObjectIdentifiers.IdEd25519, nil, True);
+ AddAlgorithm('Ed448', TEdECObjectIdentifiers.IdEd448, nil, True);
+
+ FInstance := TDefaultSignatureAlgorithmFinder.Create;
+end;
+
+function TDefaultSignatureAlgorithmFinder.Find(const ASignatureName: String): IAlgorithmIdentifier;
+var
+ LSigOid: IDerObjectIdentifier;
+ LNoParamsAlgID: IAlgorithmIdentifier;
+ LExplicitParams: IAsn1Encodable;
+begin
+ if not FAlgorithms.TryGetValue(ASignatureName, LSigOid) then
+ raise EArgumentCryptoLibException.CreateFmt('Unknown signature name: %s', [ASignatureName]);
+
+ if FNoParams.TryGetValue(LSigOid, LNoParamsAlgID) then
+ begin
+ Result := LNoParamsAlgID;
+ Exit;
+ end;
+
+ if FParameters.TryGetValue(ASignatureName, LExplicitParams) then
+ begin
+ Result := TAlgorithmIdentifier.Create(LSigOid, LExplicitParams);
+ Exit;
+ end;
+
+ Result := TAlgorithmIdentifier.Create(LSigOid, TDerNull.Instance);
+end;
+
+end.
diff --git a/CryptoLib/src/Interfaces/Crypto/Operators/ClpIMacAlgorithmFinder.pas b/CryptoLib/src/Interfaces/Crypto/Operators/ClpIMacAlgorithmFinder.pas
new file mode 100644
index 00000000..32cbda9f
--- /dev/null
+++ b/CryptoLib/src/Interfaces/Crypto/Operators/ClpIMacAlgorithmFinder.pas
@@ -0,0 +1,43 @@
+{ *********************************************************************************** }
+{ * CryptoLib Library * }
+{ * Author - Ugochukwu Mmaduekwe * }
+{ * Github Repository * }
+{ * * }
+{ * 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 * }
+{ * the development of this library * }
+{ * ******************************************************************************* * }
+
+(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
+
+unit ClpIMacAlgorithmFinder;
+
+{$I ..\..\..\Include\CryptoLib.inc}
+
+interface
+
+uses
+ ClpIX509Asn1Objects;
+
+type
+ ///
+ /// Finder for MAC algorithm identifiers from MAC algorithm names.
+ ///
+ IMacAlgorithmFinder = interface
+ ['{47533909-145A-4A4D-92E1-7CA040A4F151}']
+
+ ///
+ /// Find the MAC algorithm identifier that matches with the passed in MAC name.
+ ///
+ /// the name of the MAC algorithm of interest.
+ /// an algorithm identifier for the MAC name, or nil if not found.
+ function Find(const AMacName: String): IAlgorithmIdentifier;
+ end;
+
+implementation
+
+end.
diff --git a/CryptoLib/src/Interfaces/Crypto/Operators/ClpISignatureAlgorithmFinder.pas b/CryptoLib/src/Interfaces/Crypto/Operators/ClpISignatureAlgorithmFinder.pas
new file mode 100644
index 00000000..3d998d23
--- /dev/null
+++ b/CryptoLib/src/Interfaces/Crypto/Operators/ClpISignatureAlgorithmFinder.pas
@@ -0,0 +1,43 @@
+{ *********************************************************************************** }
+{ * CryptoLib Library * }
+{ * Author - Ugochukwu Mmaduekwe * }
+{ * Github Repository * }
+{ * * }
+{ * 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 * }
+{ * the development of this library * }
+{ * ******************************************************************************* * }
+
+(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
+
+unit ClpISignatureAlgorithmFinder;
+
+{$I ..\..\..\Include\CryptoLib.inc}
+
+interface
+
+uses
+ ClpIX509Asn1Objects;
+
+type
+ ///
+ /// Finder for signature algorithm identifiers from signature algorithm names.
+ ///
+ ISignatureAlgorithmFinder = interface
+ ['{6FB0D062-E975-4502-8946-49F1986E66B1}']
+
+ ///
+ /// Find the signature algorithm identifier that matches with the passed in signature name.
+ ///
+ /// the name of the signature algorithm of interest.
+ /// an algorithm identifier for the signature name.
+ function Find(const ASignatureName: String): IAlgorithmIdentifier;
+ end;
+
+implementation
+
+end.
diff --git a/CryptoLib/src/Packages/Delphi/CryptoLib4PascalPackage.dpk b/CryptoLib/src/Packages/Delphi/CryptoLib4PascalPackage.dpk
index 415d0c71..a4fe0c19 100644
--- a/CryptoLib/src/Packages/Delphi/CryptoLib4PascalPackage.dpk
+++ b/CryptoLib/src/Packages/Delphi/CryptoLib4PascalPackage.dpk
@@ -705,6 +705,10 @@ contains
ClpIAsymmetricKeyEntry in '..\..\Interfaces\Pkcs\ClpIAsymmetricKeyEntry.pas',
ClpDefaultDigestAlgorithmFinder in '..\..\Crypto\Operators\ClpDefaultDigestAlgorithmFinder.pas',
ClpIDigestAlgorithmFinder in '..\..\Interfaces\Crypto\Operators\ClpIDigestAlgorithmFinder.pas',
+ ClpDefaultMacAlgorithmFinder in '..\..\Crypto\Operators\ClpDefaultMacAlgorithmFinder.pas',
+ ClpIMacAlgorithmFinder in '..\..\Interfaces\Crypto\Operators\ClpIMacAlgorithmFinder.pas',
+ ClpDefaultSignatureAlgorithmFinder in '..\..\Crypto\Operators\ClpDefaultSignatureAlgorithmFinder.pas',
+ ClpISignatureAlgorithmFinder in '..\..\Interfaces\Crypto\Operators\ClpISignatureAlgorithmFinder.pas',
ClpPkcs12Utilities in '..\..\Pkcs\ClpPkcs12Utilities.pas',
ClpPkcs12StoreBuilder in '..\..\Pkcs\ClpPkcs12StoreBuilder.pas',
ClpIPkcs12StoreBuilder in '..\..\Interfaces\Pkcs\ClpIPkcs12StoreBuilder.pas',
diff --git a/CryptoLib/src/Packages/FPC/CryptoLib4PascalPackage.lpk b/CryptoLib/src/Packages/FPC/CryptoLib4PascalPackage.lpk
index 40948280..1b069d1b 100644
--- a/CryptoLib/src/Packages/FPC/CryptoLib4PascalPackage.lpk
+++ b/CryptoLib/src/Packages/FPC/CryptoLib4PascalPackage.lpk
@@ -26,7 +26,7 @@
Acknowledgements:
Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring the development of this library "/>
-
+
@@ -2800,6 +2800,22 @@ Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring the devel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/CryptoLib/src/Packages/FPC/CryptoLib4PascalPackage.pas b/CryptoLib/src/Packages/FPC/CryptoLib4PascalPackage.pas
index ffad6c5f..74f0598f 100644
--- a/CryptoLib/src/Packages/FPC/CryptoLib4PascalPackage.pas
+++ b/CryptoLib/src/Packages/FPC/CryptoLib4PascalPackage.pas
@@ -225,7 +225,9 @@ interface
ClpPclmulGcmSivKernel, ClpFusedKernelDefaults, ClpXChaCha20Engine,
ClpIXChaCha20Engine, ClpXChaCha20Poly1305, ClpIXChaCha20Poly1305,
ClpDigestStream, ClpMacSink, ClpMacStream, ClpSignerStream,
- ClpDefaultMacCalculator, ClpDefaultMacResult;
+ ClpDefaultMacCalculator, ClpDefaultMacResult, ClpIMacAlgorithmFinder,
+ ClpDefaultMacAlgorithmFinder, ClpISignatureAlgorithmFinder,
+ ClpDefaultSignatureAlgorithmFinder;
implementation