From 931946b3426d1c13c30c09aef87102a129a4a04a Mon Sep 17 00:00:00 2001 From: Peter Dettman Date: Wed, 19 Jul 2023 14:55:27 +0700 Subject: Refactoring in Cms --- crypto/src/asn1/cms/Evidence.cs | 88 ++++++++++++------------ crypto/src/asn1/cms/OriginatorIdentifierOrKey.cs | 67 ++++++------------ crypto/src/asn1/cms/OriginatorPublicKey.cs | 77 +++++++-------------- crypto/src/asn1/x509/SubjectPublicKeyInfo.cs | 80 +++++++++------------ crypto/src/cms/KeyAgreeRecipientInfoGenerator.cs | 14 ++-- crypto/src/cms/KeyAgreeRecipientInformation.cs | 10 ++- crypto/src/openssl/PEMReader.cs | 2 +- 7 files changed, 133 insertions(+), 205 deletions(-) diff --git a/crypto/src/asn1/cms/Evidence.cs b/crypto/src/asn1/cms/Evidence.cs index 54d498cb9..19dab50c2 100644 --- a/crypto/src/asn1/cms/Evidence.cs +++ b/crypto/src/asn1/cms/Evidence.cs @@ -1,5 +1,6 @@ using System; +using Org.BouncyCastle.Asn1.Tsp; using Org.BouncyCastle.Utilities; namespace Org.BouncyCastle.Asn1.Cms @@ -7,67 +8,68 @@ namespace Org.BouncyCastle.Asn1.Cms public class Evidence : Asn1Encodable, IAsn1Choice { - private TimeStampTokenEvidence tstEvidence; - private Asn1Sequence otherEvidence; + public static Evidence GetInstance(object obj) + { + if (obj == null) + return null; + if (obj is Evidence evidence) + return evidence; + if (obj is Asn1TaggedObject taggedObject) + return new Evidence(Asn1Utilities.CheckTagClass(taggedObject, Asn1Tags.ContextSpecific)); + + throw new ArgumentException("Unknown object in GetInstance: " + Platform.GetTypeName(obj), nameof(obj)); + } - public Evidence(TimeStampTokenEvidence tstEvidence) + public static Evidence GetInstance(Asn1TaggedObject obj, bool isExplicit) + { + return Asn1Utilities.GetInstanceFromChoice(obj, isExplicit, GetInstance); + } + + private readonly TimeStampTokenEvidence m_tstEvidence; + private readonly EvidenceRecord m_ersEvidence; + private readonly Asn1Sequence m_otherEvidence; + + public Evidence(TimeStampTokenEvidence tstEvidence) { - this.tstEvidence = tstEvidence; + m_tstEvidence = tstEvidence; } - private Evidence(Asn1TaggedObject tagged) + public Evidence(EvidenceRecord ersEvidence) + { + m_ersEvidence = ersEvidence; + } + + private Evidence(Asn1TaggedObject tagged) { if (tagged.TagNo == 0) { - this.tstEvidence = TimeStampTokenEvidence.GetInstance(tagged, false); + m_tstEvidence = TimeStampTokenEvidence.GetInstance(tagged, false); + } + else if (tagged.TagNo == 1) + { + m_ersEvidence = EvidenceRecord.GetInstance(tagged, false); } - //else if (tagged.TagNo == 1) - //{ - // this.ersEvidence = EvidenceRecord.GetInstance(tagged, false); - //} else if (tagged.TagNo == 2) { - this.otherEvidence = Asn1Sequence.GetInstance(tagged, false); + m_otherEvidence = Asn1Sequence.GetInstance(tagged, false); } else { - throw new ArgumentException("unknown tag in Evidence", "tagged"); + throw new ArgumentException("unknown tag in Evidence", nameof(tagged)); } } - public static Evidence GetInstance(object obj) - { - if (obj is Evidence evidence) - return evidence; - - if (obj is Asn1TaggedObject taggedObject) - return new Evidence(Asn1Utilities.CheckTagClass(taggedObject, Asn1Tags.ContextSpecific)); + public virtual TimeStampTokenEvidence TstEvidence => m_tstEvidence; - throw new ArgumentException("Unknown object in GetInstance: " + Platform.GetTypeName(obj), "obj"); - } + public virtual EvidenceRecord ErsEvidence => m_ersEvidence; - public static Evidence GetInstance(Asn1TaggedObject obj, bool isExplicit) + public override Asn1Object ToAsn1Object() { - return Asn1Utilities.GetInstanceFromChoice(obj, isExplicit, GetInstance); + if (m_tstEvidence != null) + return new DerTaggedObject(false, 0, m_tstEvidence); + if (m_ersEvidence != null) + return new DerTaggedObject(false, 1, m_ersEvidence); + return new DerTaggedObject(false, 2, m_otherEvidence); } - - public virtual TimeStampTokenEvidence TstEvidence - { - get { return tstEvidence; } - } - - //public EvidenceRecord ErsEvidence - //{ - // get { return ersEvidence; } - //} - - public override Asn1Object ToAsn1Object() - { - if (tstEvidence != null) - return new DerTaggedObject(false, 0, tstEvidence); - //if (ersEvidence != null) - // return new DerTaggedObject(false, 1, ersEvidence); - return new DerTaggedObject(false, 2, otherEvidence); - } - } + } } diff --git a/crypto/src/asn1/cms/OriginatorIdentifierOrKey.cs b/crypto/src/asn1/cms/OriginatorIdentifierOrKey.cs index 12b1f518d..69b860f5f 100644 --- a/crypto/src/asn1/cms/OriginatorIdentifierOrKey.cs +++ b/crypto/src/asn1/cms/OriginatorIdentifierOrKey.cs @@ -8,8 +8,7 @@ namespace Org.BouncyCastle.Asn1.Cms public class OriginatorIdentifierOrKey : Asn1Encodable, IAsn1Choice { - public static OriginatorIdentifierOrKey GetInstance( - object o) + public static OriginatorIdentifierOrKey GetInstance(object o) { if (o == null) return null; @@ -20,14 +19,17 @@ namespace Org.BouncyCastle.Asn1.Cms if (o is IssuerAndSerialNumber issuerAndSerialNumber) return new OriginatorIdentifierOrKey(issuerAndSerialNumber); - if (o is SubjectKeyIdentifier subjectKeyIdentifier) - return new OriginatorIdentifierOrKey(subjectKeyIdentifier); - - if (o is OriginatorPublicKey originatorPublicKey) - return new OriginatorIdentifierOrKey(originatorPublicKey); + if (o is Asn1Sequence sequence) + return new OriginatorIdentifierOrKey(IssuerAndSerialNumber.GetInstance(sequence)); if (o is Asn1TaggedObject taggedObject) - return new OriginatorIdentifierOrKey(Asn1Utilities.CheckTagClass(taggedObject, Asn1Tags.ContextSpecific)); + { + if (taggedObject.HasContextTag(0)) + return new OriginatorIdentifierOrKey(SubjectKeyIdentifier.GetInstance(taggedObject, false)); + + if (taggedObject.HasContextTag(1)) + return new OriginatorIdentifierOrKey(OriginatorPublicKey.GetInstance(taggedObject, false)); + } throw new ArgumentException("Invalid OriginatorIdentifierOrKey: " + Platform.GetTypeName(o)); } @@ -37,55 +39,33 @@ namespace Org.BouncyCastle.Asn1.Cms return Asn1Utilities.GetInstanceFromChoice(o, explicitly, GetInstance); } - private readonly Asn1Encodable id; + private readonly Asn1Encodable m_id; public OriginatorIdentifierOrKey(IssuerAndSerialNumber id) { - this.id = id; + m_id = id; } public OriginatorIdentifierOrKey(SubjectKeyIdentifier id) { - this.id = new DerTaggedObject(false, 0, id); + m_id = new DerTaggedObject(false, 0, id); } public OriginatorIdentifierOrKey(OriginatorPublicKey id) { - this.id = new DerTaggedObject(false, 1, id); + m_id = new DerTaggedObject(false, 1, id); } - private OriginatorIdentifierOrKey(Asn1TaggedObject id) - { - // TODO Add validation - this.id = id; - } - - public Asn1Encodable ID - { - get { return id; } - } - - public IssuerAndSerialNumber IssuerAndSerialNumber - { - get - { - if (id is IssuerAndSerialNumber) - { - return (IssuerAndSerialNumber)id; - } + public Asn1Encodable ID => m_id; - return null; - } - } + public IssuerAndSerialNumber IssuerAndSerialNumber => m_id as IssuerAndSerialNumber; public SubjectKeyIdentifier SubjectKeyIdentifier { get { - if (id is Asn1TaggedObject && ((Asn1TaggedObject)id).TagNo == 0) - { - return SubjectKeyIdentifier.GetInstance((Asn1TaggedObject)id, false); - } + if (m_id is Asn1TaggedObject taggedObject && taggedObject.HasContextTag(0)) + return SubjectKeyIdentifier.GetInstance(taggedObject, false); return null; } @@ -95,10 +75,8 @@ namespace Org.BouncyCastle.Asn1.Cms { get { - if (id is Asn1TaggedObject && ((Asn1TaggedObject)id).TagNo == 1) - { - return OriginatorPublicKey.GetInstance((Asn1TaggedObject)id, false); - } + if (m_id is Asn1TaggedObject taggedObject && taggedObject.HasContextTag(1)) + return OriginatorPublicKey.GetInstance(taggedObject, false); return null; } @@ -116,9 +94,6 @@ namespace Org.BouncyCastle.Asn1.Cms * SubjectKeyIdentifier ::= OCTET STRING * */ - public override Asn1Object ToAsn1Object() - { - return id.ToAsn1Object(); - } + public override Asn1Object ToAsn1Object() => m_id.ToAsn1Object(); } } diff --git a/crypto/src/asn1/cms/OriginatorPublicKey.cs b/crypto/src/asn1/cms/OriginatorPublicKey.cs index 83db619ea..8c7c6b50f 100644 --- a/crypto/src/asn1/cms/OriginatorPublicKey.cs +++ b/crypto/src/asn1/cms/OriginatorPublicKey.cs @@ -1,73 +1,47 @@ -using System; - using Org.BouncyCastle.Asn1.X509; -using Org.BouncyCastle.Utilities; namespace Org.BouncyCastle.Asn1.Cms { public class OriginatorPublicKey : Asn1Encodable { - private readonly AlgorithmIdentifier mAlgorithm; - private readonly DerBitString mPublicKey; - - public OriginatorPublicKey( - AlgorithmIdentifier algorithm, - byte[] publicKey) + public static OriginatorPublicKey GetInstance(object obj) { - this.mAlgorithm = algorithm; - this.mPublicKey = new DerBitString(publicKey); + if (obj == null) + return null; + if (obj is OriginatorPublicKey originatorPublicKey) + return originatorPublicKey; + return new OriginatorPublicKey(Asn1Sequence.GetInstance(obj)); } - private OriginatorPublicKey(Asn1Sequence seq) + public static OriginatorPublicKey GetInstance(Asn1TaggedObject obj, bool explicitly) { - this.mAlgorithm = AlgorithmIdentifier.GetInstance(seq[0]); - this.mPublicKey = DerBitString.GetInstance(seq[1]); + return GetInstance(Asn1Sequence.GetInstance(obj, explicitly)); } - /** - * return an OriginatorPublicKey object from a tagged object. - * - * @param obj the tagged object holding the object we want. - * @param explicitly true if the object is meant to be explicitly - * tagged false otherwise. - * @exception ArgumentException if the object held by the - * tagged object cannot be converted. - */ - public static OriginatorPublicKey GetInstance( - Asn1TaggedObject obj, - bool explicitly) + private readonly AlgorithmIdentifier m_algorithm; + private readonly DerBitString m_publicKey; + + public OriginatorPublicKey(AlgorithmIdentifier algorithm, byte[] publicKey) + : this(algorithm, new DerBitString(publicKey)) { - return GetInstance(Asn1Sequence.GetInstance(obj, explicitly)); } - /** - * return an OriginatorPublicKey object from the given object. - * - * @param obj the object we want converted. - * @exception ArgumentException if the object cannot be converted. - */ - public static OriginatorPublicKey GetInstance( - object obj) + public OriginatorPublicKey(AlgorithmIdentifier algorithm, DerBitString publicKey) { - if (obj == null || obj is OriginatorPublicKey) - return (OriginatorPublicKey)obj; - - if (obj is Asn1Sequence) - return new OriginatorPublicKey(Asn1Sequence.GetInstance(obj)); + m_algorithm = algorithm; + m_publicKey = publicKey; + } - throw new ArgumentException("Invalid OriginatorPublicKey: " + Platform.GetTypeName(obj)); + private OriginatorPublicKey(Asn1Sequence seq) + { + m_algorithm = AlgorithmIdentifier.GetInstance(seq[0]); + m_publicKey = DerBitString.GetInstance(seq[1]); } - public AlgorithmIdentifier Algorithm - { - get { return mAlgorithm; } - } + public AlgorithmIdentifier Algorithm => m_algorithm; - public DerBitString PublicKey - { - get { return mPublicKey; } - } + public DerBitString PublicKey => m_publicKey; /** * Produce an object suitable for an Asn1OutputStream. @@ -78,9 +52,6 @@ namespace Org.BouncyCastle.Asn1.Cms * } * */ - public override Asn1Object ToAsn1Object() - { - return new DerSequence(mAlgorithm, mPublicKey); - } + public override Asn1Object ToAsn1Object() => new DerSequence(m_algorithm, m_publicKey); } } diff --git a/crypto/src/asn1/x509/SubjectPublicKeyInfo.cs b/crypto/src/asn1/x509/SubjectPublicKeyInfo.cs index 234990fc7..5faab82d0 100644 --- a/crypto/src/asn1/x509/SubjectPublicKeyInfo.cs +++ b/crypto/src/asn1/x509/SubjectPublicKeyInfo.cs @@ -11,66 +11,59 @@ namespace Org.BouncyCastle.Asn1.X509 public class SubjectPublicKeyInfo : Asn1Encodable { - private readonly AlgorithmIdentifier algID; - private readonly DerBitString keyData; - - public static SubjectPublicKeyInfo GetInstance( - Asn1TaggedObject obj, - bool explicitly) + public static SubjectPublicKeyInfo GetInstance(object obj) { - return GetInstance(Asn1Sequence.GetInstance(obj, explicitly)); + if (obj == null) + return null; + if (obj is SubjectPublicKeyInfo subjectPublicKeyInfo) + return subjectPublicKeyInfo; + return new SubjectPublicKeyInfo(Asn1Sequence.GetInstance(obj)); } - public static SubjectPublicKeyInfo GetInstance( - object obj) + public static SubjectPublicKeyInfo GetInstance(Asn1TaggedObject obj, bool explicitly) { - if (obj is SubjectPublicKeyInfo) - return (SubjectPublicKeyInfo) obj; + return new SubjectPublicKeyInfo(Asn1Sequence.GetInstance(obj, explicitly)); + } - if (obj != null) - return new SubjectPublicKeyInfo(Asn1Sequence.GetInstance(obj)); + private readonly AlgorithmIdentifier m_algID; + private readonly DerBitString m_keyData; - return null; + public SubjectPublicKeyInfo(AlgorithmIdentifier algID, DerBitString publicKey) + { + m_algID = algID; + m_keyData = publicKey; } - public SubjectPublicKeyInfo( - AlgorithmIdentifier algID, - Asn1Encodable publicKey) + public SubjectPublicKeyInfo(AlgorithmIdentifier algID, Asn1Encodable publicKey) { - this.keyData = new DerBitString(publicKey); - this.algID = algID; + m_algID = algID; + m_keyData = new DerBitString(publicKey); } - public SubjectPublicKeyInfo( - AlgorithmIdentifier algID, - byte[] publicKey) + public SubjectPublicKeyInfo(AlgorithmIdentifier algID, byte[] publicKey) { - this.keyData = new DerBitString(publicKey); - this.algID = algID; + m_algID = algID; + m_keyData = new DerBitString(publicKey); } #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER public SubjectPublicKeyInfo(AlgorithmIdentifier algID, ReadOnlySpan publicKey) { - this.keyData = new DerBitString(publicKey); - this.algID = algID; + m_algID = algID; + m_keyData = new DerBitString(publicKey); } #endif - private SubjectPublicKeyInfo( - Asn1Sequence seq) + private SubjectPublicKeyInfo(Asn1Sequence seq) { - if (seq.Count != 2) + if (seq.Count != 2) throw new ArgumentException("Bad sequence size: " + seq.Count, "seq"); - this.algID = AlgorithmIdentifier.GetInstance(seq[0]); - this.keyData = DerBitString.GetInstance(seq[1]); + m_algID = AlgorithmIdentifier.GetInstance(seq[0]); + m_keyData = DerBitString.GetInstance(seq[1]); } - public AlgorithmIdentifier AlgorithmID - { - get { return algID; } - } + public AlgorithmIdentifier AlgorithmID => m_algID; /** * for when the public key is an encoded object - if the bitstring @@ -79,18 +72,12 @@ namespace Org.BouncyCastle.Asn1.X509 * @exception IOException - if the bit string doesn't represent a Der * encoded object. */ - public Asn1Object ParsePublicKey() - { - return Asn1Object.FromByteArray(keyData.GetOctets()); - } + public Asn1Object ParsePublicKey() => Asn1Object.FromByteArray(m_keyData.GetOctets()); - /** + /** * for when the public key is raw bits... */ - public DerBitString PublicKeyData - { - get { return keyData; } - } + public DerBitString PublicKeyData => m_keyData; /** * Produce an object suitable for an Asn1OutputStream. @@ -100,9 +87,6 @@ namespace Org.BouncyCastle.Asn1.X509 * publicKey BIT STRING } * */ - public override Asn1Object ToAsn1Object() - { - return new DerSequence(algID, keyData); - } + public override Asn1Object ToAsn1Object() => new DerSequence(m_algID, m_keyData); } } diff --git a/crypto/src/cms/KeyAgreeRecipientInfoGenerator.cs b/crypto/src/cms/KeyAgreeRecipientInfoGenerator.cs index 479aa50cb..97fbd115b 100644 --- a/crypto/src/cms/KeyAgreeRecipientInfoGenerator.cs +++ b/crypto/src/cms/KeyAgreeRecipientInfoGenerator.cs @@ -146,12 +146,10 @@ namespace Org.BouncyCastle.Cms new DerSequence(recipientEncryptedKeys))); } - private static OriginatorPublicKey CreateOriginatorPublicKey(AsymmetricKeyParameter publicKey) - { - SubjectPublicKeyInfo spki = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey); - return new OriginatorPublicKey( - new AlgorithmIdentifier(spki.AlgorithmID.Algorithm, DerNull.Instance), - spki.PublicKeyData.GetBytes()); - } - } + private static OriginatorPublicKey CreateOriginatorPublicKey(AsymmetricKeyParameter publicKey) => + CreateOriginatorPublicKey(SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey)); + + private static OriginatorPublicKey CreateOriginatorPublicKey(SubjectPublicKeyInfo originatorKeyInfo) => + new OriginatorPublicKey(originatorKeyInfo.AlgorithmID, originatorKeyInfo.PublicKeyData); + } } diff --git a/crypto/src/cms/KeyAgreeRecipientInformation.cs b/crypto/src/cms/KeyAgreeRecipientInformation.cs index cc1823cc6..32679803d 100644 --- a/crypto/src/cms/KeyAgreeRecipientInformation.cs +++ b/crypto/src/cms/KeyAgreeRecipientInformation.cs @@ -104,14 +104,12 @@ namespace Org.BouncyCastle.Cms return GetPublicKeyFromOriginatorID(origID); } - private AsymmetricKeyParameter GetPublicKeyFromOriginatorPublicKey( - AsymmetricKeyParameter receiverPrivateKey, - OriginatorPublicKey originatorPublicKey) + private AsymmetricKeyParameter GetPublicKeyFromOriginatorPublicKey(AsymmetricKeyParameter receiverPrivateKey, + OriginatorPublicKey originatorPublicKey) { PrivateKeyInfo privInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(receiverPrivateKey); - SubjectPublicKeyInfo pubInfo = new SubjectPublicKeyInfo( - privInfo.PrivateKeyAlgorithm, - originatorPublicKey.PublicKey.GetBytes()); + SubjectPublicKeyInfo pubInfo = new SubjectPublicKeyInfo(privInfo.PrivateKeyAlgorithm, + originatorPublicKey.PublicKey); return PublicKeyFactory.CreateKey(pubInfo); } diff --git a/crypto/src/openssl/PEMReader.cs b/crypto/src/openssl/PEMReader.cs index cb6950c47..b963ed56a 100644 --- a/crypto/src/openssl/PEMReader.cs +++ b/crypto/src/openssl/PEMReader.cs @@ -321,7 +321,7 @@ namespace Org.BouncyCastle.OpenSsl DerBitString pubKey = pKey.GetPublicKey(); if (pubKey != null) { - SubjectPublicKeyInfo pubInfo = new SubjectPublicKeyInfo(algId, pubKey.GetBytes()); + SubjectPublicKeyInfo pubInfo = new SubjectPublicKeyInfo(algId, pubKey); // TODO Are the keys returned here ECDSA, as Java version forces? pubSpec = PublicKeyFactory.CreateKey(pubInfo); -- cgit 1.4.1