From 8403b2552fbf65a960deb4f86c9ffbc49c79d31d Mon Sep 17 00:00:00 2001 From: MW Date: Sat, 19 Jan 2019 13:41:32 +1100 Subject: Provider logic for transformation names. --- crypto/src/crypto/operators/Asn1KeyWrapper.cs | 96 ++++++++++++++++++++-- .../operators/CmsKeyTransRecipientInfoGenerator.cs | 2 + crypto/test/src/crmf/test/CrmfTest.cs | 4 +- 3 files changed, 92 insertions(+), 10 deletions(-) diff --git a/crypto/src/crypto/operators/Asn1KeyWrapper.cs b/crypto/src/crypto/operators/Asn1KeyWrapper.cs index 3fe8de8d5..8f77201ca 100644 --- a/crypto/src/crypto/operators/Asn1KeyWrapper.cs +++ b/crypto/src/crypto/operators/Asn1KeyWrapper.cs @@ -1,53 +1,133 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Text; using Org.BouncyCastle.X509; using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Asn1.X509; +using Org.BouncyCastle.Crypto.Digests; using Org.BouncyCastle.Crypto.Encodings; using Org.BouncyCastle.Crypto.Engines; +using Org.BouncyCastle.Utilities; namespace Org.BouncyCastle.Crypto.Operators { + + public class KeyWrapperUtil + { + // + // Provider + // + private static readonly IDictionary providerMap = Platform.CreateHashtable(); + + static KeyWrapperUtil() + { + providerMap["RSA/NONE/OAEPPADDING"] = new WrapperCreator(RsaOaepWrapper.Rsa_None_OaepPadding); + providerMap["RSA/NONE/OAEPWITHSHA256ANDMGF1PADDING"] = new WrapperCreator(RsaOaepWrapper.Rsa_None_OaepWithSha256andMGF1Padding); + } + + public static IKeyWrapper WrapperForName(string algorithm) + { + WrapperProvider provider = (WrapperProvider)providerMap[Strings.ToUpperCase(algorithm)]; + + if (provider == null) + { + throw new ArgumentException("could not resolve " + algorithm + " to a KeyWrapper"); + } + + return (IKeyWrapper)provider.createWrapper(); + } + + public static IKeyUnwrapper UnWrapperForName(string algorithm) + { + WrapperProvider provider = (WrapperProvider)providerMap[Strings.ToUpperCase(algorithm)]; + if (provider == null) + { + throw new ArgumentException("could not resolve " + algorithm + " to a KeyUnWrapper"); + } + + return (IKeyUnwrapper)provider.createWrapper(); + } + } + + public class Asn1KeyWrapper : IKeyWrapper { private X509Certificate cert; private string algorithm; + private IKeyWrapper wrapper; + + public Asn1KeyWrapper(string algorithm, X509Certificate cert) { this.algorithm = algorithm; this.cert = cert; + wrapper = KeyWrapperUtil.WrapperForName(algorithm); } public object AlgorithmDetails { - get - { - throw new NotImplementedException(); - } + get { return wrapper.AlgorithmDetails; } } public IBlockResult Wrap(byte[] keyData) { - throw new NotImplementedException(); + return wrapper.Wrap(keyData); } } - internal interface WapperProvider + internal delegate object WrapperCreatorDelegate(); + + /// + /// Wraps delegate and implements the WrapperProvider Interface. + /// + internal class WrapperCreator : WrapperProvider + { + private readonly WrapperCreatorDelegate creator; + + public WrapperCreator(WrapperCreatorDelegate creator) + { + this.creator = creator; + } + + + public object createWrapper() + { + return this.creator.Invoke(); + } + } + + + + internal interface WrapperProvider { object createWrapper(); } + + internal class RsaOaepWrapper : IKeyWrapper, IKeyUnwrapper { + + internal static object Rsa_None_OaepPadding() + { + return new RsaOaepWrapper(new Sha1Digest(),PkcsObjectIdentifiers.IdRsaesOaep); + } + + internal static object Rsa_None_OaepWithSha256andMGF1Padding() + { + return new RsaOaepWrapper(new Sha256Digest(), PkcsObjectIdentifiers.IdRsaesOaep); + } + + private readonly AlgorithmIdentifier algId; private readonly IAsymmetricBlockCipher engine; - RsaOaepWrapper(IDigest digest, DerObjectIdentifier digestOid) + public RsaOaepWrapper(IDigest digest, DerObjectIdentifier digestOid) { - AlgorithmIdentifier digestAlgId = new AlgorithmIdentifier(digestOid, DerNull.Instance); + AlgorithmIdentifier digestAlgId = new AlgorithmIdentifier(digestOid, DerNull.Instance); this.algId = new AlgorithmIdentifier( PkcsObjectIdentifiers.IdRsaesOaep, diff --git a/crypto/src/crypto/operators/CmsKeyTransRecipientInfoGenerator.cs b/crypto/src/crypto/operators/CmsKeyTransRecipientInfoGenerator.cs index 048014f22..997231b6e 100644 --- a/crypto/src/crypto/operators/CmsKeyTransRecipientInfoGenerator.cs +++ b/crypto/src/crypto/operators/CmsKeyTransRecipientInfoGenerator.cs @@ -13,6 +13,8 @@ namespace Org.BouncyCastle.Operators public CmsKeyTransRecipientInfoGenerator(X509Certificate recipCert, IKeyWrapper keyWrapper): base(new Asn1.Cms.IssuerAndSerialNumber(recipCert.IssuerDN, new DerInteger(recipCert.SerialNumber))) { this.keyWrapper = keyWrapper; + this.RecipientCert = recipCert; + this.RecipientPublicKey = recipCert.GetPublicKey(); } public CmsKeyTransRecipientInfoGenerator(byte[] subjectKeyID, IKeyWrapper keyWrapper) : base(subjectKeyID) diff --git a/crypto/test/src/crmf/test/CrmfTest.cs b/crypto/test/src/crmf/test/CrmfTest.cs index 7d459ee79..5e05695f4 100644 --- a/crypto/test/src/crmf/test/CrmfTest.cs +++ b/crypto/test/src/crmf/test/CrmfTest.cs @@ -40,7 +40,7 @@ namespace Org.BouncyCastle.Crmf.Tests TestBasicMessageWithArchiveControl(); TestBasicMessageWithArchiveControlJVMGenerated(); } - + [Test] public void TestFromJVM() { @@ -103,7 +103,7 @@ namespace Org.BouncyCastle.Crmf.Tests SignatureAlgorithm = "Sha1WithRSAEncryption" }; - var cert = tcb.Build(rsaKeyPair.Private); + var cert = tcb.Build(rsaKeyPair.Private); var publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(rsaKeyPair.Public); var privateInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(rsaKeyPair.Private); -- cgit 1.4.1