summary refs log tree commit diff
path: root/crypto/src/asn1/Asn1Utilities.cs
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/src/asn1/Asn1Utilities.cs')
-rw-r--r--crypto/src/asn1/Asn1Utilities.cs108
1 files changed, 104 insertions, 4 deletions
diff --git a/crypto/src/asn1/Asn1Utilities.cs b/crypto/src/asn1/Asn1Utilities.cs
index 6ccdfc43a..07f8aad03 100644
--- a/crypto/src/asn1/Asn1Utilities.cs
+++ b/crypto/src/asn1/Asn1Utilities.cs
@@ -7,6 +7,28 @@ namespace Org.BouncyCastle.Asn1
 {
     public abstract class Asn1Utilities
     {
+        internal static Asn1TaggedObject CheckTagClass(Asn1TaggedObject taggedObject, int tagClass)
+        {
+            if (!taggedObject.HasTagClass(tagClass))
+            {
+                string expected = GetTagClassText(tagClass);
+                string found = GetTagClassText(taggedObject);
+                throw new InvalidOperationException("Expected " + expected + " tag but found " + found);
+            }
+            return taggedObject;
+        }
+
+        internal static Asn1TaggedObjectParser CheckTagClass(Asn1TaggedObjectParser taggedObjectParser, int tagClass)
+        {
+            if (taggedObjectParser.TagClass != tagClass)
+            {
+                string expected = GetTagClassText(tagClass);
+                string found = GetTagClassText(taggedObjectParser);
+                throw new InvalidOperationException("Expected " + expected + " tag but found " + found);
+            }
+            return taggedObjectParser;
+        }
+
         internal static Asn1TaggedObject CheckTag(Asn1TaggedObject taggedObject, int tagClass, int tagNo)
         {
             if (!taggedObject.HasTag(tagClass, tagNo))
@@ -48,6 +70,31 @@ namespace Org.BouncyCastle.Asn1
         }
 
 
+        public static string GetTagClassText(int tagClass)
+        {
+            switch (tagClass)
+            {
+            case Asn1Tags.Application:
+                return "APPLICATION";
+            case Asn1Tags.ContextSpecific:
+                return "CONTEXT";
+            case Asn1Tags.Private:
+                return "PRIVATE";
+            default:
+                return "UNIVERSAL";
+            }
+        }
+
+        public static string GetTagClassText(Asn1TaggedObject taggedObject)
+        {
+            return GetTagClassText(taggedObject.TagClass);
+        }
+
+        public static string GetTagClassText(Asn1TaggedObjectParser taggedObjectParser)
+        {
+            return GetTagClassText(taggedObjectParser.TagClass);
+        }
+
         internal static string GetTagText(Asn1Tag tag)
         {
             return GetTagText(tag.TagClass, tag.TagNo);
@@ -68,13 +115,13 @@ namespace Org.BouncyCastle.Asn1
             switch (tagClass)
             {
             case Asn1Tags.Application:
-                return "[APPLICATION " + tagNo + "]";
+                return string.Format("[APPLICATION {0}]", tagNo);
             case Asn1Tags.ContextSpecific:
-                return "[CONTEXT " + tagNo + "]";
+                return string.Format("[CONTEXT {0}]", tagNo);
             case Asn1Tags.Private:
-                return "[PRIVATE " + tagNo + "]";
+                return string.Format("[PRIVATE {0}]", tagNo);
             default:
-                return "[UNIVERSAL " + tagNo + "]";
+                return string.Format("[UNIVERSAL {0}]", tagNo);
             }
         }
 
@@ -111,16 +158,34 @@ namespace Org.BouncyCastle.Asn1
          * Wrappers for Asn1TaggedObject.GetExplicitBaseTagged
          */
 
+        public static Asn1TaggedObject GetExplicitBaseTagged(Asn1TaggedObject taggedObject, int tagClass)
+        {
+            return CheckTagClass(taggedObject, tagClass).GetExplicitBaseTagged();
+        }
+
         public static Asn1TaggedObject GetExplicitBaseTagged(Asn1TaggedObject taggedObject, int tagClass, int tagNo)
         {
             return CheckTag(taggedObject, tagClass, tagNo).GetExplicitBaseTagged();
         }
 
+        public static Asn1TaggedObject GetExplicitContextBaseTagged(Asn1TaggedObject taggedObject)
+        {
+            return GetExplicitBaseTagged(taggedObject, Asn1Tags.ContextSpecific);
+        }
+
         public static Asn1TaggedObject GetExplicitContextBaseTagged(Asn1TaggedObject taggedObject, int tagNo)
         {
             return GetExplicitBaseTagged(taggedObject, Asn1Tags.ContextSpecific, tagNo);
         }
 
+        public static Asn1TaggedObject TryGetExplicitBaseTagged(Asn1TaggedObject taggedObject, int tagClass)
+        {
+            if (!taggedObject.HasTagClass(tagClass))
+                return null;
+
+            return taggedObject.GetExplicitBaseTagged();
+        }
+
         public static Asn1TaggedObject TryGetExplicitBaseTagged(Asn1TaggedObject taggedObject, int tagClass, int tagNo)
         {
             if (!taggedObject.HasTag(tagClass, tagNo))
@@ -129,6 +194,11 @@ namespace Org.BouncyCastle.Asn1
             return taggedObject.GetExplicitBaseTagged();
         }
 
+        public static Asn1TaggedObject TryGetExplicitContextBaseTagged(Asn1TaggedObject taggedObject)
+        {
+            return TryGetExplicitBaseTagged(taggedObject, Asn1Tags.ContextSpecific);
+        }
+
         public static Asn1TaggedObject TryGetExplicitContextBaseTagged(Asn1TaggedObject taggedObject, int tagNo)
         {
             return TryGetExplicitBaseTagged(taggedObject, Asn1Tags.ContextSpecific, tagNo);
@@ -205,12 +275,25 @@ namespace Org.BouncyCastle.Asn1
 
         /// <exception cref="IOException"/>
         public static Asn1TaggedObjectParser ParseExplicitBaseTagged(Asn1TaggedObjectParser taggedObjectParser,
+            int tagClass)
+        {
+            return CheckTagClass(taggedObjectParser, tagClass).ParseExplicitBaseTagged();
+        }
+
+        /// <exception cref="IOException"/>
+        public static Asn1TaggedObjectParser ParseExplicitBaseTagged(Asn1TaggedObjectParser taggedObjectParser,
             int tagClass, int tagNo)
         {
             return CheckTag(taggedObjectParser, tagClass, tagNo).ParseExplicitBaseTagged();
         }
 
         /// <exception cref="IOException"/>
+        public static Asn1TaggedObjectParser ParseExplicitContextBaseTagged(Asn1TaggedObjectParser taggedObjectParser)
+        {
+            return ParseExplicitBaseTagged(taggedObjectParser, Asn1Tags.ContextSpecific);
+        }
+
+        /// <exception cref="IOException"/>
         public static Asn1TaggedObjectParser ParseExplicitContextBaseTagged(Asn1TaggedObjectParser taggedObjectParser,
             int tagNo)
         {
@@ -219,6 +302,16 @@ namespace Org.BouncyCastle.Asn1
 
         /// <exception cref="IOException"/>
         public static Asn1TaggedObjectParser TryParseExplicitBaseTagged(Asn1TaggedObjectParser taggedObjectParser,
+            int tagClass)
+        {
+            if (taggedObjectParser.TagClass != tagClass)
+                return null;
+
+            return taggedObjectParser.ParseExplicitBaseTagged();
+        }
+
+        /// <exception cref="IOException"/>
+        public static Asn1TaggedObjectParser TryParseExplicitBaseTagged(Asn1TaggedObjectParser taggedObjectParser,
             int tagClass, int tagNo)
         {
             if (!taggedObjectParser.HasTag(tagClass, tagNo))
@@ -229,6 +322,13 @@ namespace Org.BouncyCastle.Asn1
 
         /// <exception cref="IOException"/>
         public static Asn1TaggedObjectParser TryParseExplicitContextBaseTagged(
+            Asn1TaggedObjectParser taggedObjectParser)
+        {
+            return TryParseExplicitBaseTagged(taggedObjectParser, Asn1Tags.ContextSpecific);
+        }
+
+        /// <exception cref="IOException"/>
+        public static Asn1TaggedObjectParser TryParseExplicitContextBaseTagged(
             Asn1TaggedObjectParser taggedObjectParser, int tagNo)
         {
             return TryParseExplicitBaseTagged(taggedObjectParser, Asn1Tags.ContextSpecific, tagNo);