summary refs log tree commit diff
path: root/crypto/src/asn1/Asn1TaggedObject.cs
diff options
context:
space:
mode:
authorPeter Dettman <peter.dettman@bouncycastle.org>2021-11-11 21:13:22 +0700
committerPeter Dettman <peter.dettman@bouncycastle.org>2021-11-11 21:13:22 +0700
commit39f33f785250b544610c429fb9d4e50c521cd493 (patch)
treec7a55871f7c0038dcbc99e582826051cb3a180d0 /crypto/src/asn1/Asn1TaggedObject.cs
parentTrim stack trace (diff)
downloadBouncyCastle.NET-ed25519-39f33f785250b544610c429fb9d4e50c521cd493.tar.xz
Refactor tagged object parsing
Diffstat (limited to 'crypto/src/asn1/Asn1TaggedObject.cs')
-rw-r--r--crypto/src/asn1/Asn1TaggedObject.cs32
1 files changed, 32 insertions, 0 deletions
diff --git a/crypto/src/asn1/Asn1TaggedObject.cs b/crypto/src/asn1/Asn1TaggedObject.cs
index 9f7eab576..aaa719ecc 100644
--- a/crypto/src/asn1/Asn1TaggedObject.cs
+++ b/crypto/src/asn1/Asn1TaggedObject.cs
@@ -284,6 +284,38 @@ namespace Org.BouncyCastle.Asn1
 
         internal abstract Asn1Sequence RebuildConstructed(Asn1Object asn1Object);
 
+        internal static Asn1Object CreateConstructed(int tagClass, int tagNo, bool isIL,
+            Asn1EncodableVector contentsElements)
+        {
+            bool maybeExplicit = (contentsElements.Count == 1);
+
+            if (isIL)
+            {
+                if (Asn1Tags.Application == tagClass)
+                    return new BerApplicationSpecific(tagNo, contentsElements);
+
+                return maybeExplicit
+                    ? new BerTaggedObject(true, tagNo, contentsElements[0])
+                    : new BerTaggedObject(false, tagNo, BerSequence.FromVector(contentsElements));
+            }
+
+            if (Asn1Tags.Application == tagClass)
+                return new DerApplicationSpecific(tagNo, contentsElements);
+
+            return maybeExplicit
+                ? new DLTaggedObject(true, tagNo, contentsElements[0])
+                : new DLTaggedObject(false, tagNo, DLSequence.FromVector(contentsElements));
+        }
+
+        internal static Asn1Object CreatePrimitive(int tagClass, int tagNo, byte[] contentsOctets)
+        {
+            // Note: !CONSTRUCTED => IMPLICIT
+            if (Asn1Tags.Application == tagClass)
+                return new DerApplicationSpecific(false, tagNo, contentsOctets);
+
+            return new DLTaggedObject(false, tagNo, new DerOctetString(contentsOctets));
+        }
+
         private static Asn1TaggedObject CheckedCast(Asn1Object asn1Object)
         {
             Asn1TaggedObject taggedObject = asn1Object as Asn1TaggedObject;