summary refs log tree commit diff
path: root/crypto/src/asn1/BERTaggedObjectParser.cs
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/src/asn1/BERTaggedObjectParser.cs')
-rw-r--r--crypto/src/asn1/BERTaggedObjectParser.cs58
1 files changed, 28 insertions, 30 deletions
diff --git a/crypto/src/asn1/BERTaggedObjectParser.cs b/crypto/src/asn1/BERTaggedObjectParser.cs
index a54e3ce38..c87f6cf9a 100644
--- a/crypto/src/asn1/BERTaggedObjectParser.cs
+++ b/crypto/src/asn1/BERTaggedObjectParser.cs
@@ -3,25 +3,24 @@ using System.IO;
 
 namespace Org.BouncyCastle.Asn1
 {
+    [Obsolete("Will be made non-public. Test for and use only Asn1TaggedObjectParser.")]
 	public class BerTaggedObjectParser
 		: Asn1TaggedObjectParser
 	{
-        private readonly int m_tagClass;
-        private readonly int m_tagNo;
-        private readonly bool m_constructed;
-        private readonly Asn1StreamParser m_parser;
+        internal readonly int m_tagClass;
+        internal readonly int m_tagNo;
+        internal readonly Asn1StreamParser m_parser;
 
-		internal BerTaggedObjectParser(int tagClass, int tagNo, bool constructed, Asn1StreamParser parser)
+		internal BerTaggedObjectParser(int tagClass, int tagNo, Asn1StreamParser parser)
 		{
-            this.m_tagClass = tagClass;
-            this.m_tagNo = tagNo;
-            this.m_constructed = constructed;
-            this.m_parser = parser;
+            m_tagClass = tagClass;
+            m_tagNo = tagNo;
+            m_parser = parser;
 		}
 
-		public bool IsConstructed
+		public virtual bool IsConstructed
 		{
-			get { return m_constructed; }
+			get { return true; }
 		}
 
         public int TagClass
@@ -53,40 +52,39 @@ namespace Org.BouncyCastle.Asn1
             return ParseBaseUniversal(declaredExplicit, baseTagNo);
 		}
 
-        public IAsn1Convertible ParseBaseUniversal(bool declaredExplicit, int baseTagNo)
+        public virtual IAsn1Convertible ParseBaseUniversal(bool declaredExplicit, int baseTagNo)
         {
             if (declaredExplicit)
-            {
-                if (!m_constructed)
-                    throw new IOException("Explicit tags must be constructed (see X.690 8.14.2)");
+                return m_parser.ParseObject(baseTagNo);
 
-                // TODO[asn1] Alternate parser method specific to this case
-                return m_parser.ReadObject();
-            }
-
-            return m_parser.ReadImplicit(m_constructed, baseTagNo);
+            return m_parser.ParseImplicitConstructedIL(baseTagNo);
         }
 
-        public Asn1TaggedObjectParser ParseExplicitBaseTagged()
+        public virtual IAsn1Convertible ParseExplicitBaseObject()
         {
-            if (!m_constructed)
-                throw new IOException("Explicit tags must be constructed (see X.690 8.14.2)");
+            return m_parser.ReadObject();
+        }
 
-            // TODO[asn1] Alternate parser method specific to this case
-            return (Asn1TaggedObjectParser)m_parser.ReadObject();
+        public virtual Asn1TaggedObjectParser ParseExplicitBaseTagged()
+        {
+            return m_parser.ParseTaggedObject();
         }
 
-        public Asn1TaggedObjectParser ParseImplicitBaseTagged(int baseTagClass, int baseTagNo)
+        public virtual Asn1TaggedObjectParser ParseImplicitBaseTagged(int baseTagClass, int baseTagNo)
         {
-            return new BerTaggedObjectParser(baseTagClass, baseTagNo, m_constructed, m_parser);
+            // TODO[asn1] Special handling can be removed once ASN1ApplicationSpecificParser types removed.
+            if (Asn1Tags.Application == baseTagClass)
+                return new BerApplicationSpecificParser(baseTagNo, m_parser);
+
+            return new BerTaggedObjectParser(baseTagClass, baseTagNo, m_parser);
         }
 
-        public Asn1Object ToAsn1Object()
+        public virtual Asn1Object ToAsn1Object()
 		{
 			try
 			{
-				return m_parser.ReadTaggedObject(TagClass, TagNo, IsConstructed);
-			}
+                return m_parser.LoadTaggedIL(TagClass, TagNo);
+            }
 			catch (IOException e)
 			{
 				throw new Asn1ParsingException(e.Message);