summary refs log tree commit diff
path: root/crypto/src/asn1/pkcs/SafeBag.cs
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/src/asn1/pkcs/SafeBag.cs')
-rw-r--r--crypto/src/asn1/pkcs/SafeBag.cs75
1 files changed, 34 insertions, 41 deletions
diff --git a/crypto/src/asn1/pkcs/SafeBag.cs b/crypto/src/asn1/pkcs/SafeBag.cs
index 8b35a6717..9f8dbb8cc 100644
--- a/crypto/src/asn1/pkcs/SafeBag.cs
+++ b/crypto/src/asn1/pkcs/SafeBag.cs
@@ -1,7 +1,5 @@
 using System;
 
-using Org.BouncyCastle.Asn1;
-
 namespace Org.BouncyCastle.Asn1.Pkcs
 {
     public class SafeBag
@@ -9,65 +7,60 @@ namespace Org.BouncyCastle.Asn1.Pkcs
     {
         public static SafeBag GetInstance(object obj)
         {
-            if (obj is SafeBag)
-                return (SafeBag)obj;
             if (obj == null)
                 return null;
+            if (obj is SafeBag safeBag)
+                return safeBag;
             return new SafeBag(Asn1Sequence.GetInstance(obj));
         }
 
-        private readonly DerObjectIdentifier bagID;
-        private readonly Asn1Object bagValue;
-        private readonly Asn1Set bagAttributes;
+        public static SafeBag GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
+        {
+            return new SafeBag(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));
+        }
+
+        private readonly DerObjectIdentifier m_bagID;
+        private readonly Asn1Object m_bagValue;
+        private readonly Asn1Set m_bagAttributes;
 
-		public SafeBag(
-            DerObjectIdentifier	oid,
-            Asn1Object			obj)
+        private SafeBag(Asn1Sequence seq)
         {
-            this.bagID = oid;
-            this.bagValue = obj;
-            this.bagAttributes = null;
+            int count = seq.Count, pos = 0;
+            if (count < 2 || count > 3)
+                throw new ArgumentException("Bad sequence size: " + count, nameof(seq));
+
+            m_bagID = DerObjectIdentifier.GetInstance(seq[pos++]);
+            m_bagValue = Asn1TaggedObject.GetInstance(seq[pos++], Asn1Tags.ContextSpecific, 0)
+                .GetExplicitBaseObject().ToAsn1Object();
+            m_bagAttributes = Asn1Utilities.ReadOptional(seq, ref pos, Asn1Set.GetOptional);
+
+            if (pos != count)
+                throw new ArgumentException("Unexpected elements in sequence", nameof(seq));
         }
 
-		public SafeBag(
-            DerObjectIdentifier	oid,
-            Asn1Object			obj,
-            Asn1Set				bagAttributes)
+        public SafeBag(DerObjectIdentifier oid, Asn1Object obj)
+            : this(oid, obj, null)
         {
-            this.bagID = oid;
-            this.bagValue = obj;
-            this.bagAttributes = bagAttributes;
         }
 
-		private SafeBag(Asn1Sequence seq)
+        public SafeBag(DerObjectIdentifier oid, Asn1Object obj, Asn1Set bagAttributes)
         {
-            this.bagID = (DerObjectIdentifier)seq[0];
-            this.bagValue = ((Asn1TaggedObject)seq[1]).GetExplicitBaseObject().ToAsn1Object();
-            if (seq.Count == 3)
-            {
-                this.bagAttributes = (Asn1Set)seq[2];
-            }
+            m_bagID = oid ?? throw new ArgumentNullException(nameof(oid));
+            m_bagValue = obj ?? throw new ArgumentNullException(nameof(obj));
+            m_bagAttributes = bagAttributes;
         }
 
-		public DerObjectIdentifier BagID
-		{
-			get { return bagID; }
-		}
+        public DerObjectIdentifier BagID => m_bagID;
 
-		public Asn1Object BagValue
-		{
-			get { return bagValue; }
-		}
+        public Asn1Object BagValue => m_bagValue;
 
-		public Asn1Set BagAttributes
-		{
-			get { return bagAttributes; }
-		}
+        public Asn1Set BagAttributes => m_bagAttributes;
 
         public override Asn1Object ToAsn1Object()
         {
-            Asn1EncodableVector v = new Asn1EncodableVector(bagID, new DerTaggedObject(0, bagValue));
-            v.AddOptional(bagAttributes);
+            Asn1EncodableVector v = new Asn1EncodableVector(3);
+            v.Add(m_bagID, new DerTaggedObject(0, m_bagValue));
+            v.AddOptional(m_bagAttributes);
             return new DerSequence(v);
         }
     }