summary refs log tree commit diff
path: root/crypto/src/asn1/isismtt/x509/AdmissionSyntax.cs
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/src/asn1/isismtt/x509/AdmissionSyntax.cs')
-rw-r--r--crypto/src/asn1/isismtt/x509/AdmissionSyntax.cs87
1 files changed, 34 insertions, 53 deletions
diff --git a/crypto/src/asn1/isismtt/x509/AdmissionSyntax.cs b/crypto/src/asn1/isismtt/x509/AdmissionSyntax.cs
index d7f4779d6..5df8e27c6 100644
--- a/crypto/src/asn1/isismtt/x509/AdmissionSyntax.cs
+++ b/crypto/src/asn1/isismtt/x509/AdmissionSyntax.cs
@@ -1,7 +1,6 @@
 using System;
 
 using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
 
 namespace Org.BouncyCastle.Asn1.IsisMtt.X509
 {
@@ -115,24 +114,23 @@ namespace Org.BouncyCastle.Asn1.IsisMtt.X509
     public class AdmissionSyntax
         : Asn1Encodable
     {
-        private readonly GeneralName admissionAuthority;
-        private readonly Asn1Sequence contentsOfAdmissions;
-
-        public static AdmissionSyntax GetInstance(
-            object obj)
+        public static AdmissionSyntax GetInstance(object obj)
         {
-            if (obj == null || obj is AdmissionSyntax)
-            {
-                return (AdmissionSyntax)obj;
-            }
+            if (obj == null)
+                return null;
+            if (obj is AdmissionSyntax admissionSyntax)
+                return admissionSyntax;
+            return new AdmissionSyntax(Asn1Sequence.GetInstance(obj));
+        }
 
-            if (obj is Asn1Sequence)
-            {
-                return new AdmissionSyntax((Asn1Sequence)obj);
-            }
+        public static AdmissionSyntax GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) =>
+            new AdmissionSyntax(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));
 
-            throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
-        }
+        public static AdmissionSyntax GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit) =>
+            new AdmissionSyntax(Asn1Sequence.GetTagged(taggedObject, declaredExplicit));
+
+        private readonly GeneralName m_admissionAuthority;
+        private readonly Asn1Sequence m_contentsOfAdmissions;
 
         /**
         * Constructor from Asn1Sequence.
@@ -174,18 +172,15 @@ namespace Org.BouncyCastle.Asn1.IsisMtt.X509
         */
         private AdmissionSyntax(Asn1Sequence seq)
         {
-            switch (seq.Count)
-            {
-            case 1:
-                this.contentsOfAdmissions = Asn1Sequence.GetInstance(seq[0]);
-                break;
-            case 2:
-                admissionAuthority = GeneralName.GetInstance(seq[0]);
-                contentsOfAdmissions = Asn1Sequence.GetInstance(seq[1]);
-                break;
-            default:
-                throw new ArgumentException("Bad sequence size: " + seq.Count);
-            }
+            int count = seq.Count, pos = 0;
+            if (count < 1 || count > 2)
+                throw new ArgumentException("Bad sequence size: " + count, nameof(seq));
+
+            m_admissionAuthority = Asn1Utilities.ReadOptional(seq, ref pos, GeneralName.GetOptional);
+            m_contentsOfAdmissions = Asn1Sequence.GetInstance(seq[pos++]);
+
+            if (pos != count)
+                throw new ArgumentException("Unexpected elements in sequence", nameof(seq));
         }
 
         /**
@@ -194,14 +189,17 @@ namespace Org.BouncyCastle.Asn1.IsisMtt.X509
         * @param admissionAuthority   The admission authority.
         * @param contentsOfAdmissions The admissions.
         */
-        public AdmissionSyntax(
-            GeneralName admissionAuthority,
-            Asn1Sequence contentsOfAdmissions)
+        public AdmissionSyntax(GeneralName admissionAuthority, Asn1Sequence contentsOfAdmissions)
         {
-            this.admissionAuthority = admissionAuthority;
-            this.contentsOfAdmissions = contentsOfAdmissions;
+            m_admissionAuthority = admissionAuthority;
+            m_contentsOfAdmissions = contentsOfAdmissions ?? throw new ArgumentNullException(nameof(contentsOfAdmissions));
         }
 
+        public virtual GeneralName AdmissionAuthority => m_admissionAuthority;
+
+        public virtual Admissions[] GetContentsOfAdmissions() =>
+            m_contentsOfAdmissions.MapElements(Admissions.GetInstance);
+
         /**
         * Produce an object suitable for an Asn1OutputStream.
         * <p/>
@@ -242,26 +240,9 @@ namespace Org.BouncyCastle.Asn1.IsisMtt.X509
         */
         public override Asn1Object ToAsn1Object()
         {
-            Asn1EncodableVector v = new Asn1EncodableVector(2);
-            v.AddOptional(admissionAuthority);
-            v.Add(contentsOfAdmissions);
-            return new DerSequence(v);
-        }
-
-        /**
-        * @return Returns the admissionAuthority if present, null otherwise.
-        */
-        public virtual GeneralName AdmissionAuthority
-        {
-            get { return admissionAuthority; }
-        }
-
-        /**
-        * @return Returns the contentsOfAdmissions.
-        */
-        public virtual Admissions[] GetContentsOfAdmissions()
-        {
-            return contentsOfAdmissions.MapElements(Admissions.GetInstance);
+            return m_admissionAuthority == null
+                ?  new DerSequence(m_contentsOfAdmissions)
+                :  new DerSequence(m_admissionAuthority, m_contentsOfAdmissions);
         }
     }
 }