diff options
Diffstat (limited to 'crypto/src/asn1/cms/OtherKeyAttribute.cs')
-rw-r--r-- | crypto/src/asn1/cms/OtherKeyAttribute.cs | 54 |
1 files changed, 34 insertions, 20 deletions
diff --git a/crypto/src/asn1/cms/OtherKeyAttribute.cs b/crypto/src/asn1/cms/OtherKeyAttribute.cs index 52f013950..901009209 100644 --- a/crypto/src/asn1/cms/OtherKeyAttribute.cs +++ b/crypto/src/asn1/cms/OtherKeyAttribute.cs @@ -23,34 +23,46 @@ namespace Org.BouncyCastle.Asn1.Cms #pragma warning restore CS0618 // Type or member is obsolete } - private DerObjectIdentifier keyAttrId; - private Asn1Encodable keyAttr; + public static OtherKeyAttribute GetOptional(Asn1Encodable element) + { + if (element == null) + throw new ArgumentNullException(nameof(element)); + + if (element is OtherKeyAttribute otherKeyAttribute) + return otherKeyAttribute; + + Asn1Sequence asn1Sequence = Asn1Sequence.GetOptional(element); + if (asn1Sequence != null) +#pragma warning disable CS0618 // Type or member is obsolete + return new OtherKeyAttribute(asn1Sequence); +#pragma warning restore CS0618 // Type or member is obsolete + + return null; + } + + private readonly DerObjectIdentifier m_keyAttrId; + private readonly Asn1Encodable m_keyAttr; [Obsolete("Use 'GetInstance' instead")] - public OtherKeyAttribute( - Asn1Sequence seq) + public OtherKeyAttribute(Asn1Sequence seq) { - keyAttrId = (DerObjectIdentifier) seq[0]; - keyAttr = seq[1]; + int count = seq.Count; + if (count < 1 || count > 2) + throw new ArgumentException("Bad sequence size: " + count, nameof(seq)); + + m_keyAttrId = DerObjectIdentifier.GetInstance(seq[0]); + m_keyAttr = count == 1 ? null : seq[1]; } - public OtherKeyAttribute( - DerObjectIdentifier keyAttrId, - Asn1Encodable keyAttr) + public OtherKeyAttribute(DerObjectIdentifier keyAttrId, Asn1Encodable keyAttr) { - this.keyAttrId = keyAttrId; - this.keyAttr = keyAttr; + m_keyAttrId = keyAttrId ?? throw new ArgumentNullException(nameof(keyAttrId)); + m_keyAttr = keyAttr; } - public DerObjectIdentifier KeyAttrId - { - get { return keyAttrId; } - } + public DerObjectIdentifier KeyAttrId => m_keyAttrId; - public Asn1Encodable KeyAttr - { - get { return keyAttr; } - } + public Asn1Encodable KeyAttr => m_keyAttr; /** * Produce an object suitable for an Asn1OutputStream. @@ -63,7 +75,9 @@ namespace Org.BouncyCastle.Asn1.Cms */ public override Asn1Object ToAsn1Object() { - return new DerSequence(keyAttrId, keyAttr); + return m_keyAttr == null + ? new DerSequence(m_keyAttrId) + : new DerSequence(m_keyAttrId, m_keyAttr); } } } |