summary refs log tree commit diff
path: root/crypto/src/asn1/cms/OtherKeyAttribute.cs
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/src/asn1/cms/OtherKeyAttribute.cs')
-rw-r--r--crypto/src/asn1/cms/OtherKeyAttribute.cs54
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);
         }
     }
 }