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