From e5d77a0741bcc55088054b2ad4a91ab0508ac092 Mon Sep 17 00:00:00 2001 From: Peter Dettman Date: Thu, 20 Jul 2023 19:01:12 +0700 Subject: Refactoring in Asn1.Cms --- crypto/src/asn1/cms/Attribute.cs | 34 +++++------- crypto/src/asn1/cms/Attributes.cs | 4 +- crypto/src/asn1/cms/AuthEnvelopedData.cs | 56 ++++++------------- crypto/src/asn1/cms/AuthenticatedData.cs | 59 ++++++-------------- crypto/src/asn1/cms/CcmParameters.cs | 8 +-- crypto/src/asn1/cms/CmsAlgorithmProtection.cs | 23 ++++---- crypto/src/asn1/cms/CompressedData.cs | 53 ++++++------------ crypto/src/asn1/cms/ContentInfo.cs | 25 ++++----- crypto/src/asn1/cms/EncryptedContentInfo.cs | 35 +++++------- crypto/src/asn1/cms/EncryptedData.cs | 32 +++++------ crypto/src/asn1/cms/EnvelopedData.cs | 48 +++++------------ crypto/src/asn1/cms/GcmParameters.cs | 8 +-- crypto/src/asn1/cms/IssuerAndSerialNumber.cs | 53 +++++++++--------- crypto/src/asn1/cms/KEKIdentifier.cs | 52 ++++++------------ crypto/src/asn1/cms/KEKRecipientInfo.cs | 53 ++++++------------ crypto/src/asn1/cms/KeyAgreeRecipientIdentifier.cs | 62 +++++++++------------- crypto/src/asn1/cms/KeyAgreeRecipientInfo.cs | 55 ++++++------------- crypto/src/asn1/cms/KeyTransRecipientInfo.cs | 33 +++++------- crypto/src/asn1/cms/MetaData.cs | 27 +++++----- crypto/src/asn1/cms/OriginatorIdentifierOrKey.cs | 2 +- crypto/src/asn1/cms/OriginatorInfo.cs | 50 ++++++----------- crypto/src/asn1/cms/OriginatorPublicKey.cs | 2 +- crypto/src/asn1/cms/OtherKeyAttribute.cs | 34 +++++------- crypto/src/asn1/cms/OtherRecipientInfo.cs | 49 +++++------------ crypto/src/asn1/cms/OtherRevocationInfoFormat.cs | 43 +++++---------- crypto/src/asn1/cms/PasswordRecipientInfo.cs | 53 ++++++------------ crypto/src/asn1/cms/RecipientEncryptedKey.cs | 62 ++++++---------------- crypto/src/asn1/cms/RecipientIdentifier.cs | 13 +++-- crypto/src/asn1/cms/RecipientInfo.cs | 39 ++++++++------ crypto/src/asn1/cms/RecipientKeyIdentifier.cs | 50 ++++++----------- crypto/src/asn1/cms/SCVPReqRes.cs | 25 +++++---- crypto/src/asn1/cms/SignedData.cs | 23 ++++---- crypto/src/asn1/cms/SignerIdentifier.cs | 50 ++++++++--------- crypto/src/asn1/cms/SignerInfo.cs | 28 +++++----- crypto/src/asn1/cms/TimeStampAndCRL.cs | 31 +++++------ crypto/src/asn1/cms/TimeStampTokenEvidence.cs | 38 ++++++------- crypto/src/asn1/cms/TimeStampedData.cs | 27 +++++----- crypto/src/asn1/cms/ecc/MQVuserKeyingMaterial.cs | 56 ++++++------------- crypto/src/cms/CMSUtils.cs | 2 +- crypto/src/cms/KeyTransRecipientInfoGenerator.cs | 2 +- crypto/src/cms/SignerInfoGenerator.cs | 3 +- .../operators/CmsKeyTransRecipientInfoGenerator.cs | 2 +- 42 files changed, 530 insertions(+), 874 deletions(-) diff --git a/crypto/src/asn1/cms/Attribute.cs b/crypto/src/asn1/cms/Attribute.cs index 69ac44148..d42aefccb 100644 --- a/crypto/src/asn1/cms/Attribute.cs +++ b/crypto/src/asn1/cms/Attribute.cs @@ -1,33 +1,25 @@ -using System; - -using Org.BouncyCastle.Utilities; - namespace Org.BouncyCastle.Asn1.Cms { public class Attribute : Asn1Encodable { - private DerObjectIdentifier attrType; - private Asn1Set attrValues; - - /** - * return an Attribute object from the given object. - * - * @param o the object we want converted. - * @exception ArgumentException if the object cannot be converted. - */ - public static Attribute GetInstance( - object obj) + public static Attribute GetInstance(object obj) { - if (obj == null || obj is Attribute) - return (Attribute) obj; - - if (obj is Asn1Sequence) - return new Attribute((Asn1Sequence) obj); + if (obj == null) + return null; + if (obj is Attribute attribute) + return attribute; + return new Attribute(Asn1Sequence.GetInstance(obj)); + } - throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj"); + public static Attribute GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) + { + return new Attribute(Asn1Sequence.GetInstance(taggedObject, declaredExplicit)); } + private DerObjectIdentifier attrType; + private Asn1Set attrValues; + public Attribute( Asn1Sequence seq) { diff --git a/crypto/src/asn1/cms/Attributes.cs b/crypto/src/asn1/cms/Attributes.cs index 010684158..6e3691870 100644 --- a/crypto/src/asn1/cms/Attributes.cs +++ b/crypto/src/asn1/cms/Attributes.cs @@ -1,5 +1,3 @@ -using System; - namespace Org.BouncyCastle.Asn1.Cms { public class Attributes @@ -16,7 +14,7 @@ namespace Org.BouncyCastle.Asn1.Cms public static Attributes GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) { - return GetInstance(Asn1Set.GetInstance(taggedObject, declaredExplicit)); + return new Attributes(Asn1Set.GetInstance(taggedObject, declaredExplicit)); } private readonly Asn1Set m_attributes; diff --git a/crypto/src/asn1/cms/AuthEnvelopedData.cs b/crypto/src/asn1/cms/AuthEnvelopedData.cs index 8f980e6ec..bbcde8180 100644 --- a/crypto/src/asn1/cms/AuthEnvelopedData.cs +++ b/crypto/src/asn1/cms/AuthEnvelopedData.cs @@ -1,13 +1,25 @@ using System; -using Org.BouncyCastle.Utilities; - namespace Org.BouncyCastle.Asn1.Cms { - public class AuthEnvelopedData + public class AuthEnvelopedData : Asn1Encodable { - private DerInteger version; + public static AuthEnvelopedData GetInstance(object obj) + { + if (obj == null) + return null; + if (obj is AuthEnvelopedData authEnvelopedData) + return authEnvelopedData; + return new AuthEnvelopedData(Asn1Sequence.GetInstance(obj)); + } + + public static AuthEnvelopedData GetInstance(Asn1TaggedObject obj, bool isExplicit) + { + return new AuthEnvelopedData(Asn1Sequence.GetInstance(obj, isExplicit)); + } + + private DerInteger version; private OriginatorInfo originatorInfo; private Asn1Set recipientInfos; private EncryptedContentInfo authEncryptedContentInfo; @@ -100,41 +112,7 @@ namespace Org.BouncyCastle.Asn1.Cms } } - /** - * return an AuthEnvelopedData object from a tagged object. - * - * @param obj the tagged object holding the object we want. - * @param isExplicit true if the object is meant to be explicitly - * tagged false otherwise. - * @throws ArgumentException if the object held by the - * tagged object cannot be converted. - */ - public static AuthEnvelopedData GetInstance( - Asn1TaggedObject obj, - bool isExplicit) - { - return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit)); - } - - /** - * return an AuthEnvelopedData object from the given object. - * - * @param obj the object we want converted. - * @throws ArgumentException if the object cannot be converted. - */ - public static AuthEnvelopedData GetInstance( - object obj) - { - if (obj == null || obj is AuthEnvelopedData) - return (AuthEnvelopedData)obj; - - if (obj is Asn1Sequence) - return new AuthEnvelopedData((Asn1Sequence)obj); - - throw new ArgumentException("Invalid AuthEnvelopedData: " + Platform.GetTypeName(obj)); - } - - public DerInteger Version + public DerInteger Version { get { return version; } } diff --git a/crypto/src/asn1/cms/AuthenticatedData.cs b/crypto/src/asn1/cms/AuthenticatedData.cs index 709617063..47db0fa16 100644 --- a/crypto/src/asn1/cms/AuthenticatedData.cs +++ b/crypto/src/asn1/cms/AuthenticatedData.cs @@ -1,14 +1,27 @@ using System; using Org.BouncyCastle.Asn1.X509; -using Org.BouncyCastle.Utilities; namespace Org.BouncyCastle.Asn1.Cms { - public class AuthenticatedData + public class AuthenticatedData : Asn1Encodable { - private DerInteger version; + public static AuthenticatedData GetInstance(object obj) + { + if (obj == null) + return null; + if (obj is AuthenticatedData authenticatedData) + return authenticatedData; + return new AuthenticatedData(Asn1Sequence.GetInstance(obj)); + } + + public static AuthenticatedData GetInstance(Asn1TaggedObject obj, bool isExplicit) + { + return new AuthenticatedData(Asn1Sequence.GetInstance(obj, isExplicit)); + } + + private DerInteger version; private OriginatorInfo originatorInfo; private Asn1Set recipientInfos; private AlgorithmIdentifier macAlgorithm; @@ -88,45 +101,7 @@ namespace Org.BouncyCastle.Asn1.Cms } } - /** - * return an AuthenticatedData object from a tagged object. - * - * @param obj the tagged object holding the object we want. - * @param isExplicit true if the object is meant to be explicitly - * tagged false otherwise. - * @throws ArgumentException if the object held by the - * tagged object cannot be converted. - */ - public static AuthenticatedData GetInstance( - Asn1TaggedObject obj, - bool isExplicit) - { - return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit)); - } - - /** - * return an AuthenticatedData object from the given object. - * - * @param obj the object we want converted. - * @throws ArgumentException if the object cannot be converted. - */ - public static AuthenticatedData GetInstance( - object obj) - { - if (obj == null || obj is AuthenticatedData) - { - return (AuthenticatedData)obj; - } - - if (obj is Asn1Sequence) - { - return new AuthenticatedData((Asn1Sequence)obj); - } - - throw new ArgumentException("Invalid AuthenticatedData: " + Platform.GetTypeName(obj)); - } - - public DerInteger Version + public DerInteger Version { get { return version; } } diff --git a/crypto/src/asn1/cms/CcmParameters.cs b/crypto/src/asn1/cms/CcmParameters.cs index c9588adca..bd725721b 100644 --- a/crypto/src/asn1/cms/CcmParameters.cs +++ b/crypto/src/asn1/cms/CcmParameters.cs @@ -9,9 +9,6 @@ namespace Org.BouncyCastle.Asn1.Cms { private const int DefaultIcvLen = 12; - private readonly byte[] m_nonce; - private readonly int m_icvLen; - public static CcmParameters GetInstance(object obj) { if (obj == null) @@ -23,9 +20,12 @@ namespace Org.BouncyCastle.Asn1.Cms public static CcmParameters GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) { - return GetInstance(Asn1Sequence.GetInstance(taggedObject, declaredExplicit)); + return new CcmParameters(Asn1Sequence.GetInstance(taggedObject, declaredExplicit)); } + private readonly byte[] m_nonce; + private readonly int m_icvLen; + private CcmParameters(Asn1Sequence seq) { int count = seq.Count; diff --git a/crypto/src/asn1/cms/CmsAlgorithmProtection.cs b/crypto/src/asn1/cms/CmsAlgorithmProtection.cs index 9d21e53ff..cb7a23f84 100644 --- a/crypto/src/asn1/cms/CmsAlgorithmProtection.cs +++ b/crypto/src/asn1/cms/CmsAlgorithmProtection.cs @@ -23,6 +23,20 @@ namespace Org.BouncyCastle.Asn1.Cms public class CmsAlgorithmProtection : Asn1Encodable { + public static CmsAlgorithmProtection GetInstance(object obj) + { + if (obj == null) + return null; + if (obj is CmsAlgorithmProtection cmsAlgorithmProtection) + return cmsAlgorithmProtection; + return new CmsAlgorithmProtection(Asn1Sequence.GetInstance(obj)); + } + + public static CmsAlgorithmProtection GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) + { + return new CmsAlgorithmProtection(Asn1Sequence.GetInstance(taggedObject, declaredExplicit)); + } + public static readonly int Signature = 1; public static readonly int Mac = 2; @@ -78,15 +92,6 @@ namespace Org.BouncyCastle.Asn1.Cms } } - public static CmsAlgorithmProtection GetInstance(object obj) - { - if (obj == null) - return null; - if (obj is CmsAlgorithmProtection cmsAlgorithmProtection) - return cmsAlgorithmProtection; - return new CmsAlgorithmProtection(Asn1Sequence.GetInstance(obj)); - } - public AlgorithmIdentifier DigestAlgorithm => digestAlgorithm; public AlgorithmIdentifier MacAlgorithm => macAlgorithm; diff --git a/crypto/src/asn1/cms/CompressedData.cs b/crypto/src/asn1/cms/CompressedData.cs index 154ed35c0..e6ca41687 100644 --- a/crypto/src/asn1/cms/CompressedData.cs +++ b/crypto/src/asn1/cms/CompressedData.cs @@ -1,7 +1,4 @@ -using System; - using Org.BouncyCastle.Asn1.X509; -using Org.BouncyCastle.Utilities; namespace Org.BouncyCastle.Asn1.Cms { @@ -18,6 +15,20 @@ namespace Org.BouncyCastle.Asn1.Cms public class CompressedData : Asn1Encodable { + public static CompressedData GetInstance(object obj) + { + if (obj == null) + return null; + if (obj is CompressedData compressedData) + return compressedData; + return new CompressedData(Asn1Sequence.GetInstance(obj)); + } + + public static CompressedData GetInstance(Asn1TaggedObject ato, bool explicitly) + { + return new CompressedData(Asn1Sequence.GetInstance(ato, explicitly)); + } + private DerInteger version; private AlgorithmIdentifier compressionAlgorithm; private ContentInfo encapContentInfo; @@ -39,41 +50,7 @@ namespace Org.BouncyCastle.Asn1.Cms this.encapContentInfo = ContentInfo.GetInstance(seq[2]); } - /** - * return a CompressedData object from a tagged object. - * - * @param ato 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 CompressedData GetInstance( - Asn1TaggedObject ato, - bool explicitly) - { - return GetInstance(Asn1Sequence.GetInstance(ato, explicitly)); - } - - /** - * return a CompressedData object from the given object. - * - * @param _obj the object we want converted. - * @exception ArgumentException if the object cannot be converted. - */ - public static CompressedData GetInstance( - object obj) - { - if (obj == null || obj is CompressedData) - return (CompressedData)obj; - - if (obj is Asn1Sequence) - return new CompressedData((Asn1Sequence) obj); - - throw new ArgumentException("Invalid CompressedData: " + Platform.GetTypeName(obj)); - } - - public DerInteger Version + public DerInteger Version { get { return version; } } diff --git a/crypto/src/asn1/cms/ContentInfo.cs b/crypto/src/asn1/cms/ContentInfo.cs index c8f9fc65b..952884901 100644 --- a/crypto/src/asn1/cms/ContentInfo.cs +++ b/crypto/src/asn1/cms/ContentInfo.cs @@ -1,32 +1,27 @@ using System; -using Org.BouncyCastle.Utilities; - namespace Org.BouncyCastle.Asn1.Cms { public class ContentInfo : Asn1Encodable { - private readonly DerObjectIdentifier contentType; - private readonly Asn1Encodable content; - - public static ContentInfo GetInstance( - object obj) + public static ContentInfo GetInstance(object obj) { - if (obj == null || obj is ContentInfo) - return (ContentInfo) obj; - - if (obj is Asn1Sequence) - return new ContentInfo((Asn1Sequence) obj); - - throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj)); + if (obj == null) + return null; + if (obj is ContentInfo contentInfo) + return contentInfo; + return new ContentInfo(Asn1Sequence.GetInstance(obj)); } public static ContentInfo GetInstance(Asn1TaggedObject obj, bool isExplicit) { - return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit)); + return new ContentInfo(Asn1Sequence.GetInstance(obj, isExplicit)); } + private readonly DerObjectIdentifier contentType; + private readonly Asn1Encodable content; + private ContentInfo( Asn1Sequence seq) { diff --git a/crypto/src/asn1/cms/EncryptedContentInfo.cs b/crypto/src/asn1/cms/EncryptedContentInfo.cs index 999f2a01e..2d4a744a3 100644 --- a/crypto/src/asn1/cms/EncryptedContentInfo.cs +++ b/crypto/src/asn1/cms/EncryptedContentInfo.cs @@ -1,13 +1,24 @@ -using System; - using Org.BouncyCastle.Asn1.X509; -using Org.BouncyCastle.Utilities; namespace Org.BouncyCastle.Asn1.Cms { public class EncryptedContentInfo : Asn1Encodable { + public static EncryptedContentInfo GetInstance(object obj) + { + if (obj == null) + return null; + if (obj is EncryptedContentInfo encryptedContentInfo) + return encryptedContentInfo; + return new EncryptedContentInfo(Asn1Sequence.GetInstance(obj)); + } + + public static EncryptedContentInfo GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) + { + return new EncryptedContentInfo(Asn1Sequence.GetInstance(taggedObject, declaredExplicit)); + } + private DerObjectIdentifier contentType; private AlgorithmIdentifier contentEncryptionAlgorithm; private Asn1OctetString encryptedContent; @@ -35,24 +46,6 @@ namespace Org.BouncyCastle.Asn1.Cms } } - /** - * return an EncryptedContentInfo object from the given object. - * - * @param obj the object we want converted. - * @exception ArgumentException if the object cannot be converted. - */ - public static EncryptedContentInfo GetInstance( - object obj) - { - if (obj == null || obj is EncryptedContentInfo) - return (EncryptedContentInfo)obj; - - if (obj is Asn1Sequence) - return new EncryptedContentInfo((Asn1Sequence)obj); - - throw new ArgumentException("Invalid EncryptedContentInfo: " + Platform.GetTypeName(obj)); - } - public DerObjectIdentifier ContentType { get { return contentType; } diff --git a/crypto/src/asn1/cms/EncryptedData.cs b/crypto/src/asn1/cms/EncryptedData.cs index b8492d14b..a79f8119b 100644 --- a/crypto/src/asn1/cms/EncryptedData.cs +++ b/crypto/src/asn1/cms/EncryptedData.cs @@ -1,27 +1,27 @@ using System; -using Org.BouncyCastle.Utilities; - namespace Org.BouncyCastle.Asn1.Cms { - public class EncryptedData + public class EncryptedData : Asn1Encodable { - private readonly DerInteger version; - private readonly EncryptedContentInfo encryptedContentInfo; - private readonly Asn1Set unprotectedAttrs; - - public static EncryptedData GetInstance( - object obj) + public static EncryptedData GetInstance(object obj) + { + if (obj == null) + return null; + if (obj is EncryptedData encryptedData) + return encryptedData; + return new EncryptedData(Asn1Sequence.GetInstance(obj)); + } + + public static EncryptedData GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) { - if (obj is EncryptedData) - return (EncryptedData) obj; + return new EncryptedData(Asn1Sequence.GetInstance(taggedObject, declaredExplicit)); + } - if (obj is Asn1Sequence) - return new EncryptedData((Asn1Sequence) obj); - - throw new ArgumentException("Invalid EncryptedData: " + Platform.GetTypeName(obj)); - } + private readonly DerInteger version; + private readonly EncryptedContentInfo encryptedContentInfo; + private readonly Asn1Set unprotectedAttrs; public EncryptedData( EncryptedContentInfo encInfo) diff --git a/crypto/src/asn1/cms/EnvelopedData.cs b/crypto/src/asn1/cms/EnvelopedData.cs index 85216a2e8..1b88d7791 100644 --- a/crypto/src/asn1/cms/EnvelopedData.cs +++ b/crypto/src/asn1/cms/EnvelopedData.cs @@ -1,10 +1,22 @@ -using System; - namespace Org.BouncyCastle.Asn1.Cms { public class EnvelopedData : Asn1Encodable { + public static EnvelopedData GetInstance(object obj) + { + if (obj == null) + return null; + if (obj is EnvelopedData envelopedData) + return envelopedData; + return new EnvelopedData(Asn1Sequence.GetInstance(obj)); + } + + public static EnvelopedData GetInstance(Asn1TaggedObject obj, bool explicitly) + { + return new EnvelopedData(Asn1Sequence.GetInstance(obj, explicitly)); + } + private DerInteger version; private OriginatorInfo originatorInfo; private Asn1Set recipientInfos; @@ -60,38 +72,6 @@ namespace Org.BouncyCastle.Asn1.Cms } } - /** - * return an EnvelopedData 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 EnvelopedData GetInstance( - Asn1TaggedObject obj, - bool explicitly) - { - return GetInstance(Asn1Sequence.GetInstance(obj, explicitly)); - } - - /** - * return an EnvelopedData object from the given object. - * - * @param obj the object we want converted. - * @exception ArgumentException if the object cannot be converted. - */ - public static EnvelopedData GetInstance( - object obj) - { - if (obj is EnvelopedData) - return (EnvelopedData)obj; - if (obj == null) - return null; - return new EnvelopedData(Asn1Sequence.GetInstance(obj)); - } - public DerInteger Version { get { return version; } diff --git a/crypto/src/asn1/cms/GcmParameters.cs b/crypto/src/asn1/cms/GcmParameters.cs index bc86d27fa..06b4b88ca 100644 --- a/crypto/src/asn1/cms/GcmParameters.cs +++ b/crypto/src/asn1/cms/GcmParameters.cs @@ -9,9 +9,6 @@ namespace Org.BouncyCastle.Asn1.Cms { private const int DefaultIcvLen = 12; - private readonly byte[] m_nonce; - private readonly int m_icvLen; - public static GcmParameters GetInstance(object obj) { if (obj == null) @@ -23,9 +20,12 @@ namespace Org.BouncyCastle.Asn1.Cms public static GcmParameters GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) { - return GetInstance(Asn1Sequence.GetInstance(taggedObject, declaredExplicit)); + return new GcmParameters(Asn1Sequence.GetInstance(taggedObject, declaredExplicit)); } + private readonly byte[] m_nonce; + private readonly int m_icvLen; + private GcmParameters(Asn1Sequence seq) { int count = seq.Count; diff --git a/crypto/src/asn1/cms/IssuerAndSerialNumber.cs b/crypto/src/asn1/cms/IssuerAndSerialNumber.cs index 8e31eb0e4..dcd489336 100644 --- a/crypto/src/asn1/cms/IssuerAndSerialNumber.cs +++ b/crypto/src/asn1/cms/IssuerAndSerialNumber.cs @@ -1,5 +1,3 @@ -using System; - using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Math; @@ -8,54 +6,51 @@ namespace Org.BouncyCastle.Asn1.Cms public class IssuerAndSerialNumber : Asn1Encodable { - private X509Name name; - private DerInteger serialNumber; - public static IssuerAndSerialNumber GetInstance(object obj) { if (obj == null) return null; - IssuerAndSerialNumber existing = obj as IssuerAndSerialNumber; - if (existing != null) - return existing; + if (obj is IssuerAndSerialNumber issuerAndSerialNumber) + return issuerAndSerialNumber; return new IssuerAndSerialNumber(Asn1Sequence.GetInstance(obj)); } - private IssuerAndSerialNumber(Asn1Sequence seq) + public static IssuerAndSerialNumber GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) { - this.name = X509Name.GetInstance(seq[0]); - this.serialNumber = (DerInteger) seq[1]; + return new IssuerAndSerialNumber(Asn1Sequence.GetInstance(taggedObject, declaredExplicit)); } - public IssuerAndSerialNumber( - X509Name name, - BigInteger serialNumber) - { - this.name = name; - this.serialNumber = new DerInteger(serialNumber); - } + private X509Name m_name; + private DerInteger m_serialNumber; - public IssuerAndSerialNumber( - X509Name name, - DerInteger serialNumber) + private IssuerAndSerialNumber(Asn1Sequence seq) { - this.name = name; - this.serialNumber = serialNumber; + m_name = X509Name.GetInstance(seq[0]); + m_serialNumber = DerInteger.GetInstance(seq[1]); } - public X509Name Name + public IssuerAndSerialNumber(X509Name name, BigInteger serialNumber) { - get { return name; } + m_name = name; + m_serialNumber = new DerInteger(serialNumber); } - public DerInteger SerialNumber + public IssuerAndSerialNumber(X509Name name, DerInteger serialNumber) { - get { return serialNumber; } + m_name = name; + m_serialNumber = serialNumber; } - public override Asn1Object ToAsn1Object() + public IssuerAndSerialNumber(X509CertificateStructure x509CertificateStructure) { - return new DerSequence(name, serialNumber); + m_name = x509CertificateStructure.Issuer; + m_serialNumber = x509CertificateStructure.SerialNumber; } + + public X509Name Name => m_name; + + public DerInteger SerialNumber => m_serialNumber; + + public override Asn1Object ToAsn1Object() => new DerSequence(m_name, m_serialNumber); } } diff --git a/crypto/src/asn1/cms/KEKIdentifier.cs b/crypto/src/asn1/cms/KEKIdentifier.cs index 70ae8c438..09676fd0e 100644 --- a/crypto/src/asn1/cms/KEKIdentifier.cs +++ b/crypto/src/asn1/cms/KEKIdentifier.cs @@ -1,12 +1,24 @@ using System; -using Org.BouncyCastle.Utilities; - namespace Org.BouncyCastle.Asn1.Cms { public class KekIdentifier : Asn1Encodable { + public static KekIdentifier GetInstance(object obj) + { + if (obj == null) + return null; + if (obj is KekIdentifier kekIdentifier) + return kekIdentifier; + return new KekIdentifier(Asn1Sequence.GetInstance(obj)); + } + + public static KekIdentifier GetInstance(Asn1TaggedObject obj, bool explicitly) + { + return new KekIdentifier(Asn1Sequence.GetInstance(obj, explicitly)); + } + private Asn1OctetString keyIdentifier; private Asn1GeneralizedTime date; private OtherKeyAttribute other; @@ -48,41 +60,7 @@ namespace Org.BouncyCastle.Asn1.Cms } } - /** - * return a KekIdentifier 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 KekIdentifier GetInstance( - Asn1TaggedObject obj, - bool explicitly) - { - return GetInstance(Asn1Sequence.GetInstance(obj, explicitly)); - } - - /** - * return a KekIdentifier object from the given object. - * - * @param obj the object we want converted. - * @exception ArgumentException if the object cannot be converted. - */ - public static KekIdentifier GetInstance( - object obj) - { - if (obj == null || obj is KekIdentifier) - return (KekIdentifier)obj; - - if (obj is Asn1Sequence) - return new KekIdentifier((Asn1Sequence)obj); - - throw new ArgumentException("Invalid KekIdentifier: " + Platform.GetTypeName(obj)); - } - - public Asn1OctetString KeyIdentifier + public Asn1OctetString KeyIdentifier { get { return keyIdentifier; } } diff --git a/crypto/src/asn1/cms/KEKRecipientInfo.cs b/crypto/src/asn1/cms/KEKRecipientInfo.cs index 810e7fc97..6ab5f264f 100644 --- a/crypto/src/asn1/cms/KEKRecipientInfo.cs +++ b/crypto/src/asn1/cms/KEKRecipientInfo.cs @@ -1,13 +1,24 @@ -using System; - using Org.BouncyCastle.Asn1.X509; -using Org.BouncyCastle.Utilities; namespace Org.BouncyCastle.Asn1.Cms { public class KekRecipientInfo : Asn1Encodable { + public static KekRecipientInfo GetInstance(object obj) + { + if (obj == null) + return null; + if (obj is KekRecipientInfo kekRecipientInfo) + return kekRecipientInfo; + return new KekRecipientInfo(Asn1Sequence.GetInstance(obj)); + } + + public static KekRecipientInfo GetInstance(Asn1TaggedObject obj, bool explicitly) + { + return new KekRecipientInfo(Asn1Sequence.GetInstance(obj, explicitly)); + } + private DerInteger version; private KekIdentifier kekID; private AlgorithmIdentifier keyEncryptionAlgorithm; @@ -33,41 +44,7 @@ namespace Org.BouncyCastle.Asn1.Cms encryptedKey = (Asn1OctetString) seq[3]; } - /** - * return a KekRecipientInfo 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 KekRecipientInfo GetInstance( - Asn1TaggedObject obj, - bool explicitly) - { - return GetInstance(Asn1Sequence.GetInstance(obj, explicitly)); - } - - /** - * return a KekRecipientInfo object from the given object. - * - * @param obj the object we want converted. - * @exception ArgumentException if the object cannot be converted. - */ - public static KekRecipientInfo GetInstance( - object obj) - { - if (obj == null || obj is KekRecipientInfo) - return (KekRecipientInfo)obj; - - if(obj is Asn1Sequence) - return new KekRecipientInfo((Asn1Sequence)obj); - - throw new ArgumentException("Invalid KekRecipientInfo: " + Platform.GetTypeName(obj)); - } - - public DerInteger Version + public DerInteger Version { get { return version; } } diff --git a/crypto/src/asn1/cms/KeyAgreeRecipientIdentifier.cs b/crypto/src/asn1/cms/KeyAgreeRecipientIdentifier.cs index 0256c2dc2..9e6e3bd5a 100644 --- a/crypto/src/asn1/cms/KeyAgreeRecipientIdentifier.cs +++ b/crypto/src/asn1/cms/KeyAgreeRecipientIdentifier.cs @@ -4,48 +4,36 @@ using Org.BouncyCastle.Utilities; namespace Org.BouncyCastle.Asn1.Cms { - public class KeyAgreeRecipientIdentifier + public class KeyAgreeRecipientIdentifier : Asn1Encodable, IAsn1Choice { - /** - * return an KeyAgreeRecipientIdentifier object from a tagged object. - * - * @param obj the tagged object holding the object we want. - * @param isExplicit 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 KeyAgreeRecipientIdentifier GetInstance( - Asn1TaggedObject obj, - bool isExplicit) - { - return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit)); - } - - /** - * return an KeyAgreeRecipientIdentifier object from the given object. - * - * @param obj the object we want converted. - * @exception ArgumentException if the object cannot be converted. - */ - public static KeyAgreeRecipientIdentifier GetInstance( - object obj) - { - if (obj == null || obj is KeyAgreeRecipientIdentifier) - return (KeyAgreeRecipientIdentifier)obj; + public static KeyAgreeRecipientIdentifier GetInstance(object obj) + { + if (obj == null) + return null; - if (obj is Asn1Sequence) - return new KeyAgreeRecipientIdentifier(IssuerAndSerialNumber.GetInstance(obj)); + if (obj is KeyAgreeRecipientIdentifier keyAgreeRecipientIdentifier) + return keyAgreeRecipientIdentifier; - if (obj is Asn1TaggedObject && ((Asn1TaggedObject)obj).TagNo == 0) - { - return new KeyAgreeRecipientIdentifier(RecipientKeyIdentifier.GetInstance( - (Asn1TaggedObject)obj, false)); - } + if (obj is IssuerAndSerialNumber issuerAndSerialNumber) + return new KeyAgreeRecipientIdentifier(issuerAndSerialNumber); + + if (obj is Asn1Sequence sequence) + return new KeyAgreeRecipientIdentifier(IssuerAndSerialNumber.GetInstance(sequence)); + + if (obj is Asn1TaggedObject taggedObject) + { + if (taggedObject.HasContextTag(0)) + return new KeyAgreeRecipientIdentifier(RecipientKeyIdentifier.GetInstance(taggedObject, false)); + } - throw new ArgumentException("Invalid KeyAgreeRecipientIdentifier: " + Platform.GetTypeName(obj), "obj"); - } + throw new ArgumentException("Invalid KeyAgreeRecipientIdentifier: " + Platform.GetTypeName(obj), nameof(obj)); + } + + public static KeyAgreeRecipientIdentifier GetInstance(Asn1TaggedObject obj, bool isExplicit) + { + return Asn1Utilities.GetInstanceFromChoice(obj, isExplicit, GetInstance); + } private readonly IssuerAndSerialNumber issuerSerial; private readonly RecipientKeyIdentifier rKeyID; diff --git a/crypto/src/asn1/cms/KeyAgreeRecipientInfo.cs b/crypto/src/asn1/cms/KeyAgreeRecipientInfo.cs index be2d76e2c..77f3f3748 100644 --- a/crypto/src/asn1/cms/KeyAgreeRecipientInfo.cs +++ b/crypto/src/asn1/cms/KeyAgreeRecipientInfo.cs @@ -1,13 +1,24 @@ -using System; - using Org.BouncyCastle.Asn1.X509; -using Org.BouncyCastle.Utilities; namespace Org.BouncyCastle.Asn1.Cms { public class KeyAgreeRecipientInfo : Asn1Encodable { + public static KeyAgreeRecipientInfo GetInstance(object obj) + { + if (obj == null) + return null; + if (obj is KeyAgreeRecipientInfo keyAgreeRecipientInfo) + return keyAgreeRecipientInfo; + return new KeyAgreeRecipientInfo(Asn1Sequence.GetInstance(obj)); + } + + public static KeyAgreeRecipientInfo GetInstance(Asn1TaggedObject obj, bool explicitly) + { + return new KeyAgreeRecipientInfo(Asn1Sequence.GetInstance(obj, explicitly)); + } + private DerInteger version; private OriginatorIdentifierOrKey originator; private Asn1OctetString ukm; @@ -45,43 +56,7 @@ namespace Org.BouncyCastle.Asn1.Cms recipientEncryptedKeys = (Asn1Sequence)seq[index++]; } - /** - * return a KeyAgreeRecipientInfo 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 KeyAgreeRecipientInfo GetInstance( - Asn1TaggedObject obj, - bool explicitly) - { - return GetInstance(Asn1Sequence.GetInstance(obj, explicitly)); - } - - /** - * return a KeyAgreeRecipientInfo object from the given object. - * - * @param obj the object we want converted. - * @exception ArgumentException if the object cannot be converted. - */ - public static KeyAgreeRecipientInfo GetInstance( - object obj) - { - if (obj == null || obj is KeyAgreeRecipientInfo) - return (KeyAgreeRecipientInfo)obj; - - if (obj is Asn1Sequence) - return new KeyAgreeRecipientInfo((Asn1Sequence)obj); - - throw new ArgumentException( - "Illegal object in KeyAgreeRecipientInfo: " + Platform.GetTypeName(obj)); - - } - - public DerInteger Version + public DerInteger Version { get { return version; } } diff --git a/crypto/src/asn1/cms/KeyTransRecipientInfo.cs b/crypto/src/asn1/cms/KeyTransRecipientInfo.cs index 5e4fd22b4..c33ab8b73 100644 --- a/crypto/src/asn1/cms/KeyTransRecipientInfo.cs +++ b/crypto/src/asn1/cms/KeyTransRecipientInfo.cs @@ -8,6 +8,20 @@ namespace Org.BouncyCastle.Asn1.Cms public class KeyTransRecipientInfo : Asn1Encodable { + public static KeyTransRecipientInfo GetInstance(object obj) + { + if (obj == null) + return null; + if (obj is KeyTransRecipientInfo keyTransRecipientInfo) + return keyTransRecipientInfo; + return new KeyTransRecipientInfo(Asn1Sequence.GetInstance(obj)); + } + + public static KeyTransRecipientInfo GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) + { + return new KeyTransRecipientInfo(Asn1Sequence.GetInstance(taggedObject, declaredExplicit)); + } + private DerInteger version; private RecipientIdentifier rid; private AlgorithmIdentifier keyEncryptionAlgorithm; @@ -41,25 +55,6 @@ namespace Org.BouncyCastle.Asn1.Cms this.encryptedKey = (Asn1OctetString) seq[3]; } - /** - * return a KeyTransRecipientInfo object from the given object. - * - * @param obj the object we want converted. - * @exception ArgumentException if the object cannot be converted. - */ - public static KeyTransRecipientInfo GetInstance( - object obj) - { - if (obj == null || obj is KeyTransRecipientInfo) - return (KeyTransRecipientInfo) obj; - - if(obj is Asn1Sequence) - return new KeyTransRecipientInfo((Asn1Sequence) obj); - - throw new ArgumentException( - "Illegal object in KeyTransRecipientInfo: " + Platform.GetTypeName(obj)); - } - public DerInteger Version { get { return version; } diff --git a/crypto/src/asn1/cms/MetaData.cs b/crypto/src/asn1/cms/MetaData.cs index 6435d4d2e..a0d783d59 100644 --- a/crypto/src/asn1/cms/MetaData.cs +++ b/crypto/src/asn1/cms/MetaData.cs @@ -5,7 +5,21 @@ namespace Org.BouncyCastle.Asn1.Cms public class MetaData : Asn1Encodable { - private DerBoolean hashProtected; + public static MetaData GetInstance(object obj) + { + if (obj == null) + return null; + if (obj is MetaData metaData) + return metaData; + return new MetaData(Asn1Sequence.GetInstance(obj)); + } + + public static MetaData GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) + { + return new MetaData(Asn1Sequence.GetInstance(taggedObject, declaredExplicit)); + } + + private DerBoolean hashProtected; private DerUtf8String fileName; private DerIA5String mediaType; private Attributes otherMetaData; @@ -44,17 +58,6 @@ namespace Org.BouncyCastle.Asn1.Cms } } - public static MetaData GetInstance(object obj) - { - if (obj is MetaData) - return (MetaData)obj; - - if (obj != null) - return new MetaData(Asn1Sequence.GetInstance(obj)); - - return null; - } - /** *
 		 * MetaData ::= SEQUENCE {
diff --git a/crypto/src/asn1/cms/OriginatorIdentifierOrKey.cs b/crypto/src/asn1/cms/OriginatorIdentifierOrKey.cs
index 69b860f5f..6d127ccc3 100644
--- a/crypto/src/asn1/cms/OriginatorIdentifierOrKey.cs
+++ b/crypto/src/asn1/cms/OriginatorIdentifierOrKey.cs
@@ -31,7 +31,7 @@ namespace Org.BouncyCastle.Asn1.Cms
                     return new OriginatorIdentifierOrKey(OriginatorPublicKey.GetInstance(taggedObject, false));
             }
 
-            throw new ArgumentException("Invalid OriginatorIdentifierOrKey: " + Platform.GetTypeName(o));
+            throw new ArgumentException("Invalid OriginatorIdentifierOrKey: " + Platform.GetTypeName(o), nameof(o));
         }
 
         public static OriginatorIdentifierOrKey GetInstance(Asn1TaggedObject o, bool explicitly)
diff --git a/crypto/src/asn1/cms/OriginatorInfo.cs b/crypto/src/asn1/cms/OriginatorInfo.cs
index c11e01dfe..e98fd0640 100644
--- a/crypto/src/asn1/cms/OriginatorInfo.cs
+++ b/crypto/src/asn1/cms/OriginatorInfo.cs
@@ -7,6 +7,20 @@ namespace Org.BouncyCastle.Asn1.Cms
     public class OriginatorInfo
         : Asn1Encodable
     {
+        public static OriginatorInfo GetInstance(object obj)
+        {
+            if (obj == null)
+                return null;
+            if (obj is OriginatorInfo originatorInfo)
+                return originatorInfo;
+            return new OriginatorInfo(Asn1Sequence.GetInstance(obj));
+        }
+
+        public static OriginatorInfo GetInstance(Asn1TaggedObject obj, bool explicitly)
+        {
+            return new OriginatorInfo(Asn1Sequence.GetInstance(obj, explicitly));
+        }
+
         private Asn1Set certs;
         private Asn1Set crls;
 
@@ -48,41 +62,7 @@ namespace Org.BouncyCastle.Asn1.Cms
             }
         }
 
-		/**
-         * return an OriginatorInfo 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 OriginatorInfo GetInstance(
-            Asn1TaggedObject	obj,
-            bool				explicitly)
-        {
-            return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
-        }
-
-		/**
-         * return an OriginatorInfo object from the given object.
-         *
-         * @param obj the object we want converted.
-         * @exception ArgumentException if the object cannot be converted.
-         */
-        public static OriginatorInfo GetInstance(
-            object obj)
-        {
-            if (obj == null || obj is OriginatorInfo)
-                return (OriginatorInfo)obj;
-
-			if (obj is Asn1Sequence)
-                return new OriginatorInfo((Asn1Sequence)obj);
-
-            throw new ArgumentException("Invalid OriginatorInfo: " + Platform.GetTypeName(obj));
-        }
-
-		public Asn1Set Certificates
+        public Asn1Set Certificates
 		{
 			get { return certs; }
 		}
diff --git a/crypto/src/asn1/cms/OriginatorPublicKey.cs b/crypto/src/asn1/cms/OriginatorPublicKey.cs
index 8c7c6b50f..6ed017877 100644
--- a/crypto/src/asn1/cms/OriginatorPublicKey.cs
+++ b/crypto/src/asn1/cms/OriginatorPublicKey.cs
@@ -16,7 +16,7 @@ namespace Org.BouncyCastle.Asn1.Cms
 
         public static OriginatorPublicKey GetInstance(Asn1TaggedObject obj, bool explicitly)
         {
-            return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
+            return new OriginatorPublicKey(Asn1Sequence.GetInstance(obj, explicitly));
         }
 
         private readonly AlgorithmIdentifier m_algorithm;
diff --git a/crypto/src/asn1/cms/OtherKeyAttribute.cs b/crypto/src/asn1/cms/OtherKeyAttribute.cs
index 285c88154..7c85de86e 100644
--- a/crypto/src/asn1/cms/OtherKeyAttribute.cs
+++ b/crypto/src/asn1/cms/OtherKeyAttribute.cs
@@ -1,33 +1,25 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
 namespace Org.BouncyCastle.Asn1.Cms
 {
     public class OtherKeyAttribute
         : Asn1Encodable
     {
-        private DerObjectIdentifier	keyAttrId;
-        private Asn1Encodable		keyAttr;
-
-		/**
-         * return an OtherKeyAttribute object from the given object.
-         *
-         * @param o the object we want converted.
-         * @exception ArgumentException if the object cannot be converted.
-         */
-        public static OtherKeyAttribute GetInstance(
-            object obj)
+        public static OtherKeyAttribute GetInstance(object obj)
         {
-            if (obj == null || obj is OtherKeyAttribute)
-                return (OtherKeyAttribute) obj;
-
-			if (obj is Asn1Sequence)
-                return new OtherKeyAttribute((Asn1Sequence) obj);
+            if (obj == null)
+                return null;
+            if (obj is OtherKeyAttribute otherKeyAttribute)
+                return otherKeyAttribute;
+            return new OtherKeyAttribute(Asn1Sequence.GetInstance(obj));
+        }
 
-            throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
+        public static OtherKeyAttribute GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
+        {
+            return new OtherKeyAttribute(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));
         }
 
+        private DerObjectIdentifier	keyAttrId;
+        private Asn1Encodable		keyAttr;
+
 		public OtherKeyAttribute(
             Asn1Sequence seq)
         {
diff --git a/crypto/src/asn1/cms/OtherRecipientInfo.cs b/crypto/src/asn1/cms/OtherRecipientInfo.cs
index eb5f6202e..989b6183e 100644
--- a/crypto/src/asn1/cms/OtherRecipientInfo.cs
+++ b/crypto/src/asn1/cms/OtherRecipientInfo.cs
@@ -1,10 +1,22 @@
-using System;
-
 namespace Org.BouncyCastle.Asn1.Cms
 {
     public class OtherRecipientInfo
         : Asn1Encodable
     {
+        public static OtherRecipientInfo GetInstance(object obj)
+        {
+            if (obj == null)
+                return null;
+            if (obj is OtherRecipientInfo otherRecipientInfo)
+                return otherRecipientInfo;
+            return new OtherRecipientInfo(Asn1Sequence.GetInstance(obj));
+        }
+
+        public static OtherRecipientInfo GetInstance(Asn1TaggedObject obj, bool explicitly)
+        {
+            return new OtherRecipientInfo(Asn1Sequence.GetInstance(obj, explicitly));
+        }
+
         private readonly DerObjectIdentifier oriType;
         private readonly Asn1Encodable oriValue;
 
@@ -22,39 +34,6 @@ namespace Org.BouncyCastle.Asn1.Cms
             oriValue = seq[1];
         }
 
-        /**
-         * return a OtherRecipientInfo 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 OtherRecipientInfo GetInstance(
-            Asn1TaggedObject	obj,
-            bool				explicitly)
-        {
-            return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
-        }
-
-        /**
-         * return a OtherRecipientInfo object from the given object.
-         *
-         * @param obj the object we want converted.
-         * @exception ArgumentException if the object cannot be converted.
-         */
-        public static OtherRecipientInfo GetInstance(
-            object obj)
-        {
-            if (obj == null)
-                return null;
-            OtherRecipientInfo existing = obj as OtherRecipientInfo;
-            if (existing != null)
-                return existing;
-            return new OtherRecipientInfo(Asn1Sequence.GetInstance(obj));
-        }
-
         public virtual DerObjectIdentifier OriType
         {
             get { return oriType; }
diff --git a/crypto/src/asn1/cms/OtherRevocationInfoFormat.cs b/crypto/src/asn1/cms/OtherRevocationInfoFormat.cs
index f6335cdac..d39f14aa8 100644
--- a/crypto/src/asn1/cms/OtherRevocationInfoFormat.cs
+++ b/crypto/src/asn1/cms/OtherRevocationInfoFormat.cs
@@ -3,6 +3,20 @@
     public class OtherRevocationInfoFormat
         : Asn1Encodable
     {
+        public static OtherRevocationInfoFormat GetInstance(object obj)
+        {
+            if (obj == null)
+                return null;
+            if (obj is OtherRevocationInfoFormat otherRevocationInfoFormat)
+                return otherRevocationInfoFormat;
+            return new OtherRevocationInfoFormat(Asn1Sequence.GetInstance(obj));
+        }
+
+        public static OtherRevocationInfoFormat GetInstance(Asn1TaggedObject obj, bool isExplicit)
+        {
+            return new OtherRevocationInfoFormat(Asn1Sequence.GetInstance(obj, isExplicit));
+        }
+
         private readonly DerObjectIdentifier otherRevInfoFormat;
         private readonly Asn1Encodable otherRevInfo;
 
@@ -20,35 +34,6 @@
             otherRevInfo = seq[1];
         }
 
-        /**
-         * return a OtherRevocationInfoFormat object from a tagged object.
-         *
-         * @param obj the tagged object holding the object we want.
-         * @param explicit true if the object is meant to be explicitly
-         *              tagged false otherwise.
-         * @exception IllegalArgumentException if the object held by the
-         *          tagged object cannot be converted.
-         */
-        public static OtherRevocationInfoFormat GetInstance(Asn1TaggedObject obj, bool isExplicit)
-        {
-            return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
-        }
-
-        /**
-         * return a OtherRevocationInfoFormat object from the given object.
-         *
-         * @param obj the object we want converted.
-         * @exception IllegalArgumentException if the object cannot be converted.
-         */
-        public static OtherRevocationInfoFormat GetInstance(object obj)
-        {
-            if (obj is OtherRevocationInfoFormat otherRevocationInfoFormat)
-                return otherRevocationInfoFormat;
-            if (obj != null)
-                return new OtherRevocationInfoFormat(Asn1Sequence.GetInstance(obj));
-            return null;
-        }
-
         public virtual DerObjectIdentifier InfoFormat
         {
             get { return otherRevInfoFormat; }
diff --git a/crypto/src/asn1/cms/PasswordRecipientInfo.cs b/crypto/src/asn1/cms/PasswordRecipientInfo.cs
index 9fb639bf3..c25d61a46 100644
--- a/crypto/src/asn1/cms/PasswordRecipientInfo.cs
+++ b/crypto/src/asn1/cms/PasswordRecipientInfo.cs
@@ -1,13 +1,24 @@
-using System;
-
 using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
 
 namespace Org.BouncyCastle.Asn1.Cms
 {
     public class PasswordRecipientInfo
         : Asn1Encodable
     {
+        public static PasswordRecipientInfo GetInstance(object obj)
+        {
+            if (obj == null)
+                return null;
+            if (obj is PasswordRecipientInfo passwordRecipientInfo)
+                return passwordRecipientInfo;
+            return new PasswordRecipientInfo(Asn1Sequence.GetInstance(obj));
+        }
+
+        public static PasswordRecipientInfo GetInstance(Asn1TaggedObject obj, bool explicitly)
+        {
+            return new PasswordRecipientInfo(Asn1Sequence.GetInstance(obj, explicitly));
+        }
+
         private readonly DerInteger				version;
         private readonly AlgorithmIdentifier	keyDerivationAlgorithm;
         private readonly AlgorithmIdentifier	keyEncryptionAlgorithm;
@@ -50,41 +61,7 @@ namespace Org.BouncyCastle.Asn1.Cms
             }
         }
 
-		/**
-         * return a PasswordRecipientInfo 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 PasswordRecipientInfo GetInstance(
-            Asn1TaggedObject	obj,
-            bool				explicitly)
-        {
-            return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
-        }
-
-		/**
-         * return a PasswordRecipientInfo object from the given object.
-         *
-         * @param obj the object we want converted.
-         * @exception ArgumentException if the object cannot be converted.
-         */
-        public static PasswordRecipientInfo GetInstance(
-            object obj)
-        {
-            if (obj == null || obj is PasswordRecipientInfo)
-                return (PasswordRecipientInfo) obj;
-
-			if (obj is Asn1Sequence)
-                return new PasswordRecipientInfo((Asn1Sequence) obj);
-
-            throw new ArgumentException("Invalid PasswordRecipientInfo: " + Platform.GetTypeName(obj));
-        }
-
-		public DerInteger Version
+        public DerInteger Version
 		{
 			get { return version; }
 		}
diff --git a/crypto/src/asn1/cms/RecipientEncryptedKey.cs b/crypto/src/asn1/cms/RecipientEncryptedKey.cs
index 1afba4ab1..0e0214909 100644
--- a/crypto/src/asn1/cms/RecipientEncryptedKey.cs
+++ b/crypto/src/asn1/cms/RecipientEncryptedKey.cs
@@ -1,13 +1,23 @@
-using System;
-
-using Org.BouncyCastle.Utilities;
-
 namespace Org.BouncyCastle.Asn1.Cms
 {
-	public class RecipientEncryptedKey
+    public class RecipientEncryptedKey
 		: Asn1Encodable
 	{
-		private readonly KeyAgreeRecipientIdentifier identifier;
+        public static RecipientEncryptedKey GetInstance(object obj)
+        {
+            if (obj == null)
+                return null;
+            if (obj is RecipientEncryptedKey recipientEncryptedKey)
+                return recipientEncryptedKey;
+            return new RecipientEncryptedKey(Asn1Sequence.GetInstance(obj));
+        }
+
+        public static RecipientEncryptedKey GetInstance(Asn1TaggedObject obj, bool isExplicit)
+        {
+            return new RecipientEncryptedKey(Asn1Sequence.GetInstance(obj, isExplicit));
+        }
+
+        private readonly KeyAgreeRecipientIdentifier identifier;
 		private readonly Asn1OctetString encryptedKey;
 
 		private RecipientEncryptedKey(
@@ -17,45 +27,7 @@ namespace Org.BouncyCastle.Asn1.Cms
 			encryptedKey = (Asn1OctetString) seq[1];
 		}
 
-		/**
-		 * return an RecipientEncryptedKey object from a tagged object.
-		 *
-		 * @param obj the tagged object holding the object we want.
-		 * @param isExplicit 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 RecipientEncryptedKey GetInstance(
-			Asn1TaggedObject	obj,
-			bool				isExplicit)
-		{
-			return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
-		}
-
-		/**
-		 * return a RecipientEncryptedKey object from the given object.
-		 *
-		 * @param obj the object we want converted.
-		 * @exception ArgumentException if the object cannot be converted.
-		 */
-		public static RecipientEncryptedKey GetInstance(
-			object obj)
-		{
-			if (obj == null || obj is RecipientEncryptedKey)
-			{
-				return (RecipientEncryptedKey) obj;
-			}
-
-			if (obj is Asn1Sequence)
-			{
-				return new RecipientEncryptedKey((Asn1Sequence) obj);
-			}
-
-			throw new ArgumentException("Invalid RecipientEncryptedKey: " + Platform.GetTypeName(obj), "obj");
-		}
-
-		public RecipientEncryptedKey(
+        public RecipientEncryptedKey(
 			KeyAgreeRecipientIdentifier	id,
 			Asn1OctetString				encryptedKey)
 		{
diff --git a/crypto/src/asn1/cms/RecipientIdentifier.cs b/crypto/src/asn1/cms/RecipientIdentifier.cs
index 22ac76340..de9fd5e75 100644
--- a/crypto/src/asn1/cms/RecipientIdentifier.cs
+++ b/crypto/src/asn1/cms/RecipientIdentifier.cs
@@ -7,12 +7,6 @@ namespace Org.BouncyCastle.Asn1.Cms
     public class RecipientIdentifier
         : Asn1Encodable, IAsn1Choice
     {
-        /**
-         * return a RecipientIdentifier object from the given object.
-         *
-         * @param o the object we want converted.
-         * @exception ArgumentException if the object cannot be converted.
-         */
         public static RecipientIdentifier GetInstance(object o)
         {
             if (o == null)
@@ -26,7 +20,12 @@ namespace Org.BouncyCastle.Asn1.Cms
             if (o is Asn1Object asn1Object)
                 return new RecipientIdentifier(asn1Object);
 
-            throw new ArgumentException("Illegal object in RecipientIdentifier: " + Platform.GetTypeName(o));
+            throw new ArgumentException("Illegal object in RecipientIdentifier: " + Platform.GetTypeName(o), nameof(o));
+        }
+
+        public static RecipientIdentifier GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
+        {
+            return Asn1Utilities.GetInstanceFromChoice(taggedObject, declaredExplicit, GetInstance);
         }
 
         private readonly Asn1Encodable m_id;
diff --git a/crypto/src/asn1/cms/RecipientInfo.cs b/crypto/src/asn1/cms/RecipientInfo.cs
index 3f5ccea5b..ff93258b6 100644
--- a/crypto/src/asn1/cms/RecipientInfo.cs
+++ b/crypto/src/asn1/cms/RecipientInfo.cs
@@ -7,6 +7,28 @@ namespace Org.BouncyCastle.Asn1.Cms
     public class RecipientInfo
         : Asn1Encodable, IAsn1Choice
     {
+        public static RecipientInfo GetInstance(object o)
+        {
+            if (o == null)
+                return null;
+
+            if (o is RecipientInfo recipientInfo)
+                return recipientInfo;
+
+            if (o is Asn1Sequence sequence)
+                return new RecipientInfo(sequence);
+
+            if (o is Asn1TaggedObject taggedObject)
+                return new RecipientInfo(taggedObject);
+
+            throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(o), nameof(o));
+        }
+
+        public static RecipientInfo GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
+        {
+            return Asn1Utilities.GetInstanceFromChoice(taggedObject, declaredExplicit, GetInstance);
+        }
+
         internal Asn1Encodable info;
 
 		public RecipientInfo(
@@ -45,23 +67,6 @@ namespace Org.BouncyCastle.Asn1.Cms
             this.info = info;
         }
 
-		public static RecipientInfo GetInstance(object o)
-        {
-			if (o == null)
-				return null;
-
-            if (o is RecipientInfo recipientInfo)
-                return recipientInfo;
-
-			if (o is Asn1Sequence sequence)
-                return new RecipientInfo(sequence);
-
-			if (o is Asn1TaggedObject taggedObject)
-                return new RecipientInfo(taggedObject);
-
-            throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(o));
-        }
-
 		public DerInteger Version
         {
 			get
diff --git a/crypto/src/asn1/cms/RecipientKeyIdentifier.cs b/crypto/src/asn1/cms/RecipientKeyIdentifier.cs
index 60a6151bf..9a340b24f 100644
--- a/crypto/src/asn1/cms/RecipientKeyIdentifier.cs
+++ b/crypto/src/asn1/cms/RecipientKeyIdentifier.cs
@@ -7,6 +7,20 @@ namespace Org.BouncyCastle.Asn1.Cms
     public class RecipientKeyIdentifier
         : Asn1Encodable
     {
+        public static RecipientKeyIdentifier GetInstance(object obj)
+        {
+            if (obj == null)
+                return null;
+            if (obj is RecipientKeyIdentifier recipientKeyIdentifier)
+                return recipientKeyIdentifier;
+            return new RecipientKeyIdentifier(Asn1Sequence.GetInstance(obj));
+        }
+
+        public static RecipientKeyIdentifier GetInstance(Asn1TaggedObject ato, bool explicitly)
+        {
+            return new RecipientKeyIdentifier(Asn1Sequence.GetInstance(ato, explicitly));
+        }
+
         private Asn1OctetString      subjectKeyIdentifier;
         private Asn1GeneralizedTime  date;
         private OtherKeyAttribute    other;
@@ -64,41 +78,7 @@ namespace Org.BouncyCastle.Asn1.Cms
             }
         }
 
-		/**
-         * return a RecipientKeyIdentifier object from a tagged object.
-         *
-         * @param _ato the tagged object holding the object we want.
-         * @param _explicit 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 RecipientKeyIdentifier GetInstance(
-			Asn1TaggedObject	ato,
-			bool				explicitly)
-		{
-            return GetInstance(Asn1Sequence.GetInstance(ato, explicitly));
-        }
-
-		/**
-         * return a RecipientKeyIdentifier object from the given object.
-         *
-         * @param _obj the object we want converted.
-         * @exception ArgumentException if the object cannot be converted.
-         */
-        public static RecipientKeyIdentifier GetInstance(
-			object obj)
-		{
-            if (obj == null || obj is RecipientKeyIdentifier)
-                return (RecipientKeyIdentifier) obj;
-
-			if (obj is Asn1Sequence)
-				return new RecipientKeyIdentifier((Asn1Sequence) obj);
-
-            throw new ArgumentException("Invalid RecipientKeyIdentifier: " + Platform.GetTypeName(obj));
-        }
-
-		public Asn1OctetString SubjectKeyIdentifier
+        public Asn1OctetString SubjectKeyIdentifier
 		{
 			get { return subjectKeyIdentifier; }
 		}
diff --git a/crypto/src/asn1/cms/SCVPReqRes.cs b/crypto/src/asn1/cms/SCVPReqRes.cs
index 8b5f858a6..ec36ff9fa 100644
--- a/crypto/src/asn1/cms/SCVPReqRes.cs
+++ b/crypto/src/asn1/cms/SCVPReqRes.cs
@@ -1,22 +1,25 @@
-using System;
-
-namespace Org.BouncyCastle.Asn1.Cms
+namespace Org.BouncyCastle.Asn1.Cms
 {
     public class ScvpReqRes
         : Asn1Encodable
     {
-        private readonly ContentInfo request;
-        private readonly ContentInfo response;
+        public static ScvpReqRes GetInstance(object obj)
+        {
+            if (obj == null)
+                return null;
+            if (obj is ScvpReqRes scvpReqRes)
+                return scvpReqRes;
+            return new ScvpReqRes(Asn1Sequence.GetInstance(obj));
+        }
 
-        public static ScvpReqRes GetInstance(object  obj)
+        public static ScvpReqRes GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
         {
-            if (obj is ScvpReqRes)
-                return (ScvpReqRes)obj;
-            if (obj != null)
-                return new ScvpReqRes(Asn1Sequence.GetInstance(obj));
-            return null;
+            return new ScvpReqRes(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));
         }
 
+        private readonly ContentInfo request;
+        private readonly ContentInfo response;
+
         private ScvpReqRes(Asn1Sequence seq)
         {
             if (seq[0] is Asn1TaggedObject taggedObject)
diff --git a/crypto/src/asn1/cms/SignedData.cs b/crypto/src/asn1/cms/SignedData.cs
index 9018bc6fd..858715ad6 100644
--- a/crypto/src/asn1/cms/SignedData.cs
+++ b/crypto/src/asn1/cms/SignedData.cs
@@ -8,6 +8,20 @@ namespace Org.BouncyCastle.Asn1.Cms
     public class SignedData
         : Asn1Encodable
     {
+        public static SignedData GetInstance(object obj)
+        {
+            if (obj == null)
+                return null;
+            if (obj is SignedData signedData)
+                return signedData;
+            return new SignedData(Asn1Sequence.GetInstance(obj));
+        }
+
+        public static SignedData GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
+        {
+            return new SignedData(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));
+        }
+
         private static readonly DerInteger Version1 = new DerInteger(1);
         private static readonly DerInteger Version3 = new DerInteger(3);
         private static readonly DerInteger Version4 = new DerInteger(4);
@@ -22,15 +36,6 @@ namespace Org.BouncyCastle.Asn1.Cms
         private readonly bool			certsBer;
         private readonly bool		    crlsBer;
 
-        public static SignedData GetInstance(object obj)
-        {
-            if (obj is SignedData signedData)
-                return signedData;
-            if (obj == null)
-                return null;
-            return new SignedData(Asn1Sequence.GetInstance(obj));
-        }
-
         public SignedData(
             Asn1Set     digestAlgorithms,
             ContentInfo contentInfo,
diff --git a/crypto/src/asn1/cms/SignerIdentifier.cs b/crypto/src/asn1/cms/SignerIdentifier.cs
index 9edf6a8c8..17f3f08c2 100644
--- a/crypto/src/asn1/cms/SignerIdentifier.cs
+++ b/crypto/src/asn1/cms/SignerIdentifier.cs
@@ -7,6 +7,31 @@ namespace Org.BouncyCastle.Asn1.Cms
     public class SignerIdentifier
         : Asn1Encodable, IAsn1Choice
     {
+        public static SignerIdentifier GetInstance(object o)
+        {
+            if (o == null)
+                return null;
+
+            if (o is SignerIdentifier signerIdentifier)
+                return signerIdentifier;
+
+            if (o is IssuerAndSerialNumber issuerAndSerialNumber)
+                return new SignerIdentifier(issuerAndSerialNumber);
+
+            if (o is Asn1OctetString octetString)
+                return new SignerIdentifier(octetString);
+
+            if (o is Asn1Object asn1Object)
+                return new SignerIdentifier(asn1Object);
+
+            throw new ArgumentException("Illegal object in SignerIdentifier: " + Platform.GetTypeName(o), nameof(o));
+        }
+
+        public static SignerIdentifier GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
+        {
+            return Asn1Utilities.GetInstanceFromChoice(taggedObject, declaredExplicit, GetInstance);
+        }
+
         private Asn1Encodable id;
 
 		public SignerIdentifier(
@@ -27,31 +52,6 @@ namespace Org.BouncyCastle.Asn1.Cms
             this.id = id;
         }
 
-		/**
-         * return a SignerIdentifier object from the given object.
-         *
-         * @param o the object we want converted.
-         * @exception ArgumentException if the object cannot be converted.
-         */
-        public static SignerIdentifier GetInstance(
-            object o)
-        {
-            if (o == null || o is SignerIdentifier)
-                return (SignerIdentifier) o;
-
-			if (o is IssuerAndSerialNumber)
-                return new SignerIdentifier((IssuerAndSerialNumber) o);
-
-			if (o is Asn1OctetString)
-                return new SignerIdentifier((Asn1OctetString) o);
-
-			if (o is Asn1Object)
-                return new SignerIdentifier((Asn1Object) o);
-
-			throw new ArgumentException(
-                "Illegal object in SignerIdentifier: " + Platform.GetTypeName(o));
-        }
-
 		public bool IsTagged
 		{
 			get { return (id is Asn1TaggedObject); }
diff --git a/crypto/src/asn1/cms/SignerInfo.cs b/crypto/src/asn1/cms/SignerInfo.cs
index dbd0125c4..bce33e699 100644
--- a/crypto/src/asn1/cms/SignerInfo.cs
+++ b/crypto/src/asn1/cms/SignerInfo.cs
@@ -1,13 +1,24 @@
-using System;
-
 using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
 
 namespace Org.BouncyCastle.Asn1.Cms
 {
     public class SignerInfo
         : Asn1Encodable
     {
+        public static SignerInfo GetInstance(object obj)
+        {
+            if (obj == null)
+                return null;
+            if (obj is SignerInfo signerInfo)
+                return signerInfo;
+            return new SignerInfo(Asn1Sequence.GetInstance(obj));
+        }
+
+        public static SignerInfo GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
+        {
+            return new SignerInfo(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));
+        }
+
         private DerInteger              version;
         private SignerIdentifier        sid;
         private AlgorithmIdentifier     digAlgorithm;
@@ -16,17 +27,6 @@ namespace Org.BouncyCastle.Asn1.Cms
         private Asn1OctetString         encryptedDigest;
         private Asn1Set                 unauthenticatedAttributes;
 
-        public static SignerInfo GetInstance(object obj)
-        {
-            if (obj == null || obj is SignerInfo)
-                return (SignerInfo) obj;
-
-            if (obj is Asn1Sequence)
-                return new SignerInfo((Asn1Sequence) obj);
-
-            throw new ArgumentException("Unknown object in factory: " + Platform.GetTypeName(obj), "obj");
-        }
-
         public SignerInfo(
             SignerIdentifier        sid,
             AlgorithmIdentifier     digAlgorithm,
diff --git a/crypto/src/asn1/cms/TimeStampAndCRL.cs b/crypto/src/asn1/cms/TimeStampAndCRL.cs
index 4cb5f2a52..c0cd48905 100644
--- a/crypto/src/asn1/cms/TimeStampAndCRL.cs
+++ b/crypto/src/asn1/cms/TimeStampAndCRL.cs
@@ -1,11 +1,23 @@
-using System;
-
 namespace Org.BouncyCastle.Asn1.Cms
 {
-	public class TimeStampAndCrl
+    public class TimeStampAndCrl
 		: Asn1Encodable
 	{
-		private ContentInfo timeStamp;
+        public static TimeStampAndCrl GetInstance(object obj)
+        {
+			if (obj == null)
+				return null;
+            if (obj is TimeStampAndCrl timeStampAndCrl)
+                return timeStampAndCrl;
+            return new TimeStampAndCrl(Asn1Sequence.GetInstance(obj));
+        }
+
+        public static TimeStampAndCrl GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
+        {
+            return new TimeStampAndCrl(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));
+        }
+
+        private ContentInfo timeStamp;
 		private X509.CertificateList crl;
 
 		public TimeStampAndCrl(ContentInfo timeStamp)
@@ -22,17 +34,6 @@ namespace Org.BouncyCastle.Asn1.Cms
 			}
 		}
 
-		public static TimeStampAndCrl GetInstance(object obj)
-		{
-			if (obj is TimeStampAndCrl)
-				return (TimeStampAndCrl)obj;
-
-			if (obj != null)
-				return new TimeStampAndCrl(Asn1Sequence.GetInstance(obj));
-
-			return null;
-		}
-
 		public virtual ContentInfo TimeStampToken
 		{
 			get { return this.timeStamp; }
diff --git a/crypto/src/asn1/cms/TimeStampTokenEvidence.cs b/crypto/src/asn1/cms/TimeStampTokenEvidence.cs
index 8625d058e..6ac1eb11d 100644
--- a/crypto/src/asn1/cms/TimeStampTokenEvidence.cs
+++ b/crypto/src/asn1/cms/TimeStampTokenEvidence.cs
@@ -1,11 +1,23 @@
-using System;
-
 namespace Org.BouncyCastle.Asn1.Cms
 {
-	public class TimeStampTokenEvidence
+    public class TimeStampTokenEvidence
 		: Asn1Encodable
 	{
-		private TimeStampAndCrl[] timeStampAndCrls;
+        public static TimeStampTokenEvidence GetInstance(object obj)
+        {
+			if (obj == null)
+				return null;
+			if (obj is TimeStampTokenEvidence timeStampTokenEvidence)
+				return timeStampTokenEvidence;
+            return new TimeStampTokenEvidence(Asn1Sequence.GetInstance(obj));
+        }
+
+        public static TimeStampTokenEvidence GetInstance(Asn1TaggedObject tagged, bool isExplicit)
+        {
+            return new TimeStampTokenEvidence(Asn1Sequence.GetInstance(tagged, isExplicit));
+        }
+
+        private TimeStampAndCrl[] timeStampAndCrls;
 
 		public TimeStampTokenEvidence(TimeStampAndCrl[] timeStampAndCrls)
 		{
@@ -29,23 +41,7 @@ namespace Org.BouncyCastle.Asn1.Cms
 			}
 		}
 
-		public static TimeStampTokenEvidence GetInstance(Asn1TaggedObject tagged, bool isExplicit)
-		{
-			return GetInstance(Asn1Sequence.GetInstance(tagged, isExplicit));
-		}
-
-		public static TimeStampTokenEvidence GetInstance(object obj)
-		{
-			if (obj is TimeStampTokenEvidence)
-				return (TimeStampTokenEvidence)obj;
-
-			if (obj != null)
-				return new TimeStampTokenEvidence(Asn1Sequence.GetInstance(obj));
-
-			return null;
-		}
-
-		public virtual TimeStampAndCrl[] ToTimeStampAndCrlArray()
+        public virtual TimeStampAndCrl[] ToTimeStampAndCrlArray()
 		{
 			return (TimeStampAndCrl[])timeStampAndCrls.Clone();
 		}
diff --git a/crypto/src/asn1/cms/TimeStampedData.cs b/crypto/src/asn1/cms/TimeStampedData.cs
index f90e5b086..4d9136ea0 100644
--- a/crypto/src/asn1/cms/TimeStampedData.cs
+++ b/crypto/src/asn1/cms/TimeStampedData.cs
@@ -5,7 +5,21 @@ namespace Org.BouncyCastle.Asn1.Cms
 	public class TimeStampedData
 		: Asn1Encodable
 	{
-		private DerInteger version;
+        public static TimeStampedData GetInstance(object obj)
+        {
+			if (obj == null)
+				return null;
+			if (obj is TimeStampedData timeStampedData)
+				return timeStampedData;
+            return new TimeStampedData(Asn1Sequence.GetInstance(obj));
+        }
+
+        public static TimeStampedData GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
+        {
+            return new TimeStampedData(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));
+        }
+
+        private DerInteger version;
 		private DerIA5String dataUri;
 		private MetaData metaData;
 		private Asn1OctetString content;
@@ -43,17 +57,6 @@ namespace Org.BouncyCastle.Asn1.Cms
 			this.temporalEvidence = Evidence.GetInstance(seq[index]);
 		}
 
-		public static TimeStampedData GetInstance(object obj)
-		{
-			if (obj is TimeStampedData)
-				return (TimeStampedData)obj;
-
-			if (obj != null)
-				return new TimeStampedData(Asn1Sequence.GetInstance(obj));
-
-			return null;
-		}
-
 		public virtual DerIA5String DataUri
 		{
 			get { return dataUri; }
diff --git a/crypto/src/asn1/cms/ecc/MQVuserKeyingMaterial.cs b/crypto/src/asn1/cms/ecc/MQVuserKeyingMaterial.cs
index 3a4761e78..047017351 100644
--- a/crypto/src/asn1/cms/ecc/MQVuserKeyingMaterial.cs
+++ b/crypto/src/asn1/cms/ecc/MQVuserKeyingMaterial.cs
@@ -7,7 +7,21 @@ namespace Org.BouncyCastle.Asn1.Cms.Ecc
 	public class MQVuserKeyingMaterial
 		: Asn1Encodable
 	{
-		private OriginatorPublicKey	ephemeralPublicKey;
+        public static MQVuserKeyingMaterial GetInstance(object obj)
+        {
+			if (obj == null)
+				return null;
+			if (obj is MQVuserKeyingMaterial mqvUserKeyingMaterial)
+				return mqvUserKeyingMaterial;
+            return new MQVuserKeyingMaterial(Asn1Sequence.GetInstance(obj));
+        }
+
+        public static MQVuserKeyingMaterial GetInstance(Asn1TaggedObject obj, bool isExplicit)
+        {
+            return new MQVuserKeyingMaterial(Asn1Sequence.GetInstance(obj, isExplicit));
+        }
+
+        private OriginatorPublicKey	ephemeralPublicKey;
 		private Asn1OctetString		addedukm;
 
 		public MQVuserKeyingMaterial(
@@ -34,45 +48,7 @@ namespace Org.BouncyCastle.Asn1.Cms.Ecc
 			}
 		}
 
-		/**
-		 * return an AuthEnvelopedData object from a tagged object.
-		 *
-		 * @param obj      the tagged object holding the object we want.
-		 * @param isExplicit true if the object is meant to be explicitly
-		 *                 tagged false otherwise.
-		 * @throws ArgumentException if the object held by the
-		 *                                  tagged object cannot be converted.
-		 */
-		public static MQVuserKeyingMaterial GetInstance(
-			Asn1TaggedObject	obj,
-			bool				isExplicit)
-		{
-			return GetInstance(Asn1Sequence.GetInstance(obj, isExplicit));
-		}
-
-		/**
-		 * return an AuthEnvelopedData object from the given object.
-		 *
-		 * @param obj the object we want converted.
-		 * @throws ArgumentException if the object cannot be converted.
-		 */
-		public static MQVuserKeyingMaterial GetInstance(
-			object	obj)
-		{
-			if (obj == null || obj is MQVuserKeyingMaterial)
-			{
-				return (MQVuserKeyingMaterial)obj;
-			}
-
-			if (obj is Asn1Sequence)
-			{
-				return new MQVuserKeyingMaterial((Asn1Sequence)obj);
-			}
-
-            throw new ArgumentException("Invalid MQVuserKeyingMaterial: " + Platform.GetTypeName(obj));
-		}
-		
-		public OriginatorPublicKey EphemeralPublicKey
+        public OriginatorPublicKey EphemeralPublicKey
 		{
 			get { return ephemeralPublicKey; }
 		}
diff --git a/crypto/src/cms/CMSUtils.cs b/crypto/src/cms/CMSUtils.cs
index 56509ed7f..d84c0afd7 100644
--- a/crypto/src/cms/CMSUtils.cs
+++ b/crypto/src/cms/CMSUtils.cs
@@ -187,7 +187,7 @@ namespace Org.BouncyCastle.Cms
 		internal static IssuerAndSerialNumber GetIssuerAndSerialNumber(X509Certificate cert)
 		{
 			TbsCertificateStructure tbsCert = GetTbsCertificateStructure(cert);
-			return new IssuerAndSerialNumber(tbsCert.Issuer, tbsCert.SerialNumber.Value);
+			return new IssuerAndSerialNumber(tbsCert.Issuer, tbsCert.SerialNumber);
 		}
 
         internal static Asn1.Cms.AttributeTable ParseAttributeTable(Asn1SetParser parser)
diff --git a/crypto/src/cms/KeyTransRecipientInfoGenerator.cs b/crypto/src/cms/KeyTransRecipientInfoGenerator.cs
index 9a2cbc5b0..a998ac90f 100644
--- a/crypto/src/cms/KeyTransRecipientInfoGenerator.cs
+++ b/crypto/src/cms/KeyTransRecipientInfoGenerator.cs
@@ -19,7 +19,7 @@ namespace Org.BouncyCastle.Cms
         private Asn1OctetString m_subjectKeyIdentifier;
 
         public KeyTransRecipientInfoGenerator(X509Certificate recipCert, IKeyWrapper keyWrapper)
-            : this(new IssuerAndSerialNumber(recipCert.IssuerDN, new DerInteger(recipCert.SerialNumber)), keyWrapper)
+            : this(new IssuerAndSerialNumber(recipCert.CertificateStructure), keyWrapper)
         {
         }
 
diff --git a/crypto/src/cms/SignerInfoGenerator.cs b/crypto/src/cms/SignerInfoGenerator.cs
index 2fa185885..04c437614 100644
--- a/crypto/src/cms/SignerInfoGenerator.cs
+++ b/crypto/src/cms/SignerInfoGenerator.cs
@@ -130,8 +130,7 @@ namespace Org.BouncyCastle.Cms
          */
         public SignerInfoGenerator Build(ISignatureFactory contentSigner, X509Certificate certificate)
         {
-            SignerIdentifier sigId = new SignerIdentifier(new IssuerAndSerialNumber(certificate.IssuerDN,
-                new DerInteger(certificate.SerialNumber)));
+            SignerIdentifier sigId = new SignerIdentifier(new IssuerAndSerialNumber(certificate.CertificateStructure));
 
             SignerInfoGenerator sigInfoGen = CreateGenerator(contentSigner, sigId);
 
diff --git a/crypto/src/crypto/operators/CmsKeyTransRecipientInfoGenerator.cs b/crypto/src/crypto/operators/CmsKeyTransRecipientInfoGenerator.cs
index 0165f6af0..e733bb018 100644
--- a/crypto/src/crypto/operators/CmsKeyTransRecipientInfoGenerator.cs
+++ b/crypto/src/crypto/operators/CmsKeyTransRecipientInfoGenerator.cs
@@ -14,7 +14,7 @@ namespace Org.BouncyCastle.Operators
         : KeyTransRecipientInfoGenerator
     {
         public CmsKeyTransRecipientInfoGenerator(X509Certificate recipCert, IKeyWrapper keyWrapper)
-            : base(new Asn1.Cms.IssuerAndSerialNumber(recipCert.IssuerDN, new DerInteger(recipCert.SerialNumber)), keyWrapper)
+            : base(new Asn1.Cms.IssuerAndSerialNumber(recipCert.CertificateStructure), keyWrapper)
         {
         }
 
-- 
cgit 1.4.1