From 2337fe276d9abf4e382c5e373c70aa144554d8c1 Mon Sep 17 00:00:00 2001 From: Peter Dettman Date: Sun, 26 May 2024 23:37:18 +0700 Subject: Refactoring in ASN.1 classes --- crypto/src/asn1/Asn1Utilities.cs | 5 ++-- crypto/src/asn1/DERExternal.cs | 2 +- crypto/src/asn1/cmp/CertStatus.cs | 2 +- crypto/src/asn1/cmp/CrlSource.cs | 2 +- crypto/src/asn1/cmp/OobCertHash.cs | 2 +- crypto/src/asn1/cms/EncryptedData.cs | 27 +++++++++++----------- crypto/src/asn1/crmf/PKIPublicationInfo.cs | 8 +------ crypto/src/asn1/ocsp/CertStatus.cs | 2 +- crypto/src/asn1/pkcs/PBES2Parameters.cs | 2 +- crypto/src/asn1/tsp/ArchiveTimeStamp.cs | 9 ++------ crypto/src/asn1/x509/IssuerSerial.cs | 37 +++++++++++------------------- crypto/src/asn1/x509/PolicyInformation.cs | 25 +++++++++++--------- crypto/src/asn1/x509/X509Extensions.cs | 9 ++++---- crypto/src/asn1/x509/X509Name.cs | 4 ++-- 14 files changed, 58 insertions(+), 78 deletions(-) diff --git a/crypto/src/asn1/Asn1Utilities.cs b/crypto/src/asn1/Asn1Utilities.cs index ea61ab01a..d3b6c2f00 100644 --- a/crypto/src/asn1/Asn1Utilities.cs +++ b/crypto/src/asn1/Asn1Utilities.cs @@ -668,8 +668,9 @@ namespace Org.BouncyCastle.Asn1 sequence[sequencePosition] is Asn1TaggedObject taggedObject && taggedObject.HasTag(tagClass, tagNo)) { + var result = constructor(taggedObject, state); sequencePosition++; - return constructor(taggedObject, state); + return result; } return null; @@ -691,8 +692,8 @@ namespace Org.BouncyCastle.Asn1 sequence[sequencePosition] is Asn1TaggedObject taggedObject && taggedObject.HasTag(tagClass, tagNo)) { - sequencePosition++; result = constructor(taggedObject, state); + sequencePosition++; return true; } diff --git a/crypto/src/asn1/DERExternal.cs b/crypto/src/asn1/DERExternal.cs index 975cd1665..be1223f98 100644 --- a/crypto/src/asn1/DERExternal.cs +++ b/crypto/src/asn1/DERExternal.cs @@ -262,7 +262,7 @@ namespace Org.BouncyCastle.Asn1 case 2: return DerBitString.GetInstance(encoding, false); default: - throw new ArgumentException("invalid tag: " + Asn1Utilities.GetTagText(encoding), nameof(encoding)); + throw new ArgumentException("unknown tag: " + Asn1Utilities.GetTagText(encoding), nameof(encoding)); } } diff --git a/crypto/src/asn1/cmp/CertStatus.cs b/crypto/src/asn1/cmp/CertStatus.cs index 29db607d7..488f78376 100644 --- a/crypto/src/asn1/cmp/CertStatus.cs +++ b/crypto/src/asn1/cmp/CertStatus.cs @@ -44,7 +44,7 @@ namespace Org.BouncyCastle.Asn1.Cmp if (p is Asn1TaggedObject dto) { if (!dto.HasContextTag(0)) - throw new ArgumentException("unknown tag " + Asn1Utilities.GetTagText(dto)); + throw new ArgumentException("unknown tag: " + Asn1Utilities.GetTagText(dto)); m_hashAlg = AlgorithmIdentifier.GetInstance(dto, true); } diff --git a/crypto/src/asn1/cmp/CrlSource.cs b/crypto/src/asn1/cmp/CrlSource.cs index 61fc96b32..4b6b396d9 100644 --- a/crypto/src/asn1/cmp/CrlSource.cs +++ b/crypto/src/asn1/cmp/CrlSource.cs @@ -48,7 +48,7 @@ namespace Org.BouncyCastle.Asn1.Cmp } else { - throw new ArgumentException("unknown tag " + Asn1Utilities.GetTagText(taggedObject), + throw new ArgumentException("unknown tag: " + Asn1Utilities.GetTagText(taggedObject), nameof(taggedObject)); } } diff --git a/crypto/src/asn1/cmp/OobCertHash.cs b/crypto/src/asn1/cmp/OobCertHash.cs index 1e6224612..209113167 100644 --- a/crypto/src/asn1/cmp/OobCertHash.cs +++ b/crypto/src/asn1/cmp/OobCertHash.cs @@ -58,7 +58,7 @@ namespace Org.BouncyCastle.Asn1.Cmp } else { - throw new ArgumentException("unknown tag " + Asn1Utilities.GetTagText(tObj)); + throw new ArgumentException("unknown tag: " + Asn1Utilities.GetTagText(tObj)); } } } diff --git a/crypto/src/asn1/cms/EncryptedData.cs b/crypto/src/asn1/cms/EncryptedData.cs index a79f8119b..4136994e6 100644 --- a/crypto/src/asn1/cms/EncryptedData.cs +++ b/crypto/src/asn1/cms/EncryptedData.cs @@ -41,24 +41,23 @@ namespace Org.BouncyCastle.Asn1.Cms this.unprotectedAttrs = unprotectedAttrs; } - private EncryptedData( - Asn1Sequence seq) + private EncryptedData(Asn1Sequence seq) { - if (seq == null) - throw new ArgumentNullException("seq"); - if (seq.Count < 2 || seq.Count > 3) - throw new ArgumentException("Bad sequence size: " + seq.Count, "seq"); + int count = seq.Count; + if (count < 2 || count > 3) + throw new ArgumentException("Bad sequence size: " + count, nameof(seq)); - this.version = DerInteger.GetInstance(seq[0]); - this.encryptedContentInfo = EncryptedContentInfo.GetInstance(seq[1]); + int pos = 0; - if (seq.Count > 2) - { - this.unprotectedAttrs = Asn1Set.GetInstance((Asn1TaggedObject)seq[2], false); - } - } + this.version = DerInteger.GetInstance(seq[pos++]); + this.encryptedContentInfo = EncryptedContentInfo.GetInstance(seq[pos++]); + this.unprotectedAttrs = Asn1Utilities.ReadOptionalContextTagged(seq, ref pos, 0, false, Asn1Set.GetInstance); + + if (pos != count) + throw new ArgumentException("Unexpected elements in sequence", nameof(seq)); + } - public virtual DerInteger Version + public virtual DerInteger Version { get { return version; } } diff --git a/crypto/src/asn1/crmf/PKIPublicationInfo.cs b/crypto/src/asn1/crmf/PKIPublicationInfo.cs index c855a7d28..aac6d9911 100644 --- a/crypto/src/asn1/crmf/PKIPublicationInfo.cs +++ b/crypto/src/asn1/crmf/PKIPublicationInfo.cs @@ -80,13 +80,7 @@ namespace Org.BouncyCastle.Asn1.Crmf public virtual DerInteger Action => m_action; - public virtual SinglePubInfo[] GetPubInfos() - { - if (m_pubInfos == null) - return null; - - return m_pubInfos.MapElements(SinglePubInfo.GetInstance); - } + public virtual SinglePubInfo[] GetPubInfos() => m_pubInfos?.MapElements(SinglePubInfo.GetInstance); /** *
diff --git a/crypto/src/asn1/ocsp/CertStatus.cs b/crypto/src/asn1/ocsp/CertStatus.cs
index e1d06ed19..7ce44ea3f 100644
--- a/crypto/src/asn1/ocsp/CertStatus.cs
+++ b/crypto/src/asn1/ocsp/CertStatus.cs
@@ -34,7 +34,7 @@ namespace Org.BouncyCastle.Asn1.Ocsp
                 }
             }
 
-            throw new ArgumentException("Unknown tag encountered: " + Asn1Utilities.GetTagText(choice));
+            throw new ArgumentException("unknown tag: " + Asn1Utilities.GetTagText(choice), nameof(choice));
         }
 
         private readonly int m_tagNo;
diff --git a/crypto/src/asn1/pkcs/PBES2Parameters.cs b/crypto/src/asn1/pkcs/PBES2Parameters.cs
index 66e4755c8..7d8a91ffa 100644
--- a/crypto/src/asn1/pkcs/PBES2Parameters.cs
+++ b/crypto/src/asn1/pkcs/PBES2Parameters.cs
@@ -42,7 +42,7 @@ namespace Org.BouncyCastle.Asn1.Pkcs
                 func = new KeyDerivationFunc(funcSeq);
             }
 
-            scheme = EncryptionScheme.GetInstance(seq[1].ToAsn1Object());
+            scheme = EncryptionScheme.GetInstance(seq[1]);
         }
 
         public KeyDerivationFunc KeyDerivationFunc
diff --git a/crypto/src/asn1/tsp/ArchiveTimeStamp.cs b/crypto/src/asn1/tsp/ArchiveTimeStamp.cs
index dbc426bc8..e1be303b7 100644
--- a/crypto/src/asn1/tsp/ArchiveTimeStamp.cs
+++ b/crypto/src/asn1/tsp/ArchiveTimeStamp.cs
@@ -153,13 +153,8 @@ namespace Org.BouncyCastle.Asn1.Tsp
             return PartialHashtree.GetInstance(m_reducedHashTree[0]);
         }
 
-        public virtual PartialHashtree[] GetReducedHashTree()
-        {
-            if (m_reducedHashTree == null)
-                return null;
-
-            return m_reducedHashTree.MapElements(PartialHashtree.GetInstance);
-        }
+        public virtual PartialHashtree[] GetReducedHashTree() =>
+            m_reducedHashTree?.MapElements(PartialHashtree.GetInstance);
 
         public virtual ContentInfo TimeStamp => m_timeStamp;
 
diff --git a/crypto/src/asn1/x509/IssuerSerial.cs b/crypto/src/asn1/x509/IssuerSerial.cs
index 2c26339bd..09b6dae18 100644
--- a/crypto/src/asn1/x509/IssuerSerial.cs
+++ b/crypto/src/asn1/x509/IssuerSerial.cs
@@ -1,40 +1,29 @@
 using System;
 
-using Org.BouncyCastle.Utilities;
-
 namespace Org.BouncyCastle.Asn1.X509
 {
     public class IssuerSerial
         : Asn1Encodable
     {
-        internal readonly GeneralNames	issuer;
-        internal readonly DerInteger	serial;
-        internal readonly DerBitString	issuerUid;
-
-		public static IssuerSerial GetInstance(
-            object obj)
+		public static IssuerSerial GetInstance(object obj)
         {
-            if (obj == null || obj is IssuerSerial)
-            {
-                return (IssuerSerial) obj;
-            }
-
-			if (obj is Asn1Sequence)
-            {
-                return new IssuerSerial((Asn1Sequence) obj);
-            }
-
-            throw new ArgumentException("unknown object in factory: " + Platform.GetTypeName(obj), "obj");
+            if (obj == null)
+                return null;
+            if (obj is IssuerSerial issuerSerial)
+                return issuerSerial;
+            return new IssuerSerial(Asn1Sequence.GetInstance(obj));
 		}
 
-        public static IssuerSerial GetInstance(
-            Asn1TaggedObject	obj,
-            bool				explicitly)
+        public static IssuerSerial GetInstance(Asn1TaggedObject obj, bool explicitly)
         {
-            return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
+            return new IssuerSerial(Asn1Sequence.GetInstance(obj, explicitly));
         }
 
-		private IssuerSerial(
+        private readonly GeneralNames issuer;
+        private readonly DerInteger serial;
+        private readonly DerBitString issuerUid;
+
+        private IssuerSerial(
             Asn1Sequence seq)
         {
 			if (seq.Count != 2 && seq.Count != 3)
diff --git a/crypto/src/asn1/x509/PolicyInformation.cs b/crypto/src/asn1/x509/PolicyInformation.cs
index 90db29a36..fca5fd03b 100644
--- a/crypto/src/asn1/x509/PolicyInformation.cs
+++ b/crypto/src/asn1/x509/PolicyInformation.cs
@@ -5,6 +5,20 @@ namespace Org.BouncyCastle.Asn1.X509
     public class PolicyInformation
         : Asn1Encodable
     {
+        public static PolicyInformation GetInstance(object obj)
+        {
+            if (obj == null)
+                return null;
+            if (obj is PolicyInformation policyInformation)
+                return policyInformation;
+            return new PolicyInformation(Asn1Sequence.GetInstance(obj));
+        }
+
+        public static PolicyInformation GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
+        {
+            return new PolicyInformation(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));
+        }
+
         private readonly DerObjectIdentifier	policyIdentifier;
         private readonly Asn1Sequence			policyQualifiers;
 
@@ -38,17 +52,6 @@ namespace Org.BouncyCastle.Asn1.X509
             this.policyQualifiers = policyQualifiers;
         }
 
-		public static PolicyInformation GetInstance(
-            object obj)
-        {
-            if (obj == null || obj is PolicyInformation)
-            {
-                return (PolicyInformation) obj;
-            }
-
-			return new PolicyInformation(Asn1Sequence.GetInstance(obj));
-        }
-
 		public DerObjectIdentifier PolicyIdentifier
 		{
 			get { return policyIdentifier; }
diff --git a/crypto/src/asn1/x509/X509Extensions.cs b/crypto/src/asn1/x509/X509Extensions.cs
index 5d83ecdc6..2893f8b79 100644
--- a/crypto/src/asn1/x509/X509Extensions.cs
+++ b/crypto/src/asn1/x509/X509Extensions.cs
@@ -233,17 +233,16 @@ namespace Org.BouncyCastle.Asn1.X509
 
 			foreach (Asn1Encodable ae in seq)
 			{
-				Asn1Sequence s = Asn1Sequence.GetInstance(ae.ToAsn1Object());
+				Asn1Sequence s = Asn1Sequence.GetInstance(ae);
 
 				if (s.Count < 2 || s.Count > 3)
 					throw new ArgumentException("Bad sequence size: " + s.Count);
 
-				DerObjectIdentifier oid = DerObjectIdentifier.GetInstance(s[0].ToAsn1Object());
+				DerObjectIdentifier oid = DerObjectIdentifier.GetInstance(s[0]);
 
-				bool isCritical = s.Count == 3
-					&& DerBoolean.GetInstance(s[1].ToAsn1Object()).IsTrue;
+				bool isCritical = s.Count == 3 && DerBoolean.GetInstance(s[1]).IsTrue;
 
-				Asn1OctetString octets = Asn1OctetString.GetInstance(s[s.Count - 1].ToAsn1Object());
+				Asn1OctetString octets = Asn1OctetString.GetInstance(s[s.Count - 1]);
 
                 if (m_extensions.ContainsKey(oid))
                     throw new ArgumentException("repeated extension found: " + oid);
diff --git a/crypto/src/asn1/x509/X509Name.cs b/crypto/src/asn1/x509/X509Name.cs
index 6135ad2fa..8f25e49ef 100644
--- a/crypto/src/asn1/x509/X509Name.cs
+++ b/crypto/src/asn1/x509/X509Name.cs
@@ -360,7 +360,7 @@ namespace Org.BouncyCastle.Asn1.X509
             foreach (Asn1Encodable asn1Obj in seq)
             {
                 // RelativeDistinguishedName ::= SET SIZE(1..MAX) OF AttributeTypeAndValue
-                Asn1Set rdn = Asn1Set.GetInstance(asn1Obj.ToAsn1Object());
+                Asn1Set rdn = Asn1Set.GetInstance(asn1Obj);
 
                 // TODO Apply this check? (Currently "breaks" CertificateTest.CheckDudCertificate)
                 //if (rdn.Count < 1)
@@ -368,7 +368,7 @@ namespace Org.BouncyCastle.Asn1.X509
 
                 for (int i = 0; i < rdn.Count; ++i)
                 {
-                    Asn1Sequence attributeTypeAndValue = Asn1Sequence.GetInstance(rdn[i].ToAsn1Object());
+                    Asn1Sequence attributeTypeAndValue = Asn1Sequence.GetInstance(rdn[i]);
                     if (attributeTypeAndValue.Count != 2)
                         throw new ArgumentException("badly sized AttributeTypeAndValue");
 
-- 
cgit 1.4.1