summary refs log tree commit diff
path: root/crypto/src/asn1/BerTaggedObject.cs
diff options
context:
space:
mode:
authorPeter Dettman <peter.dettman@bouncycastle.org>2021-11-11 14:06:03 +0700
committerPeter Dettman <peter.dettman@bouncycastle.org>2021-11-11 14:06:03 +0700
commit46230a012af2824a5e742db8e6dc5b23c720d696 (patch)
tree9cd842e680b7a9e3eac925f05bde504bb8670859 /crypto/src/asn1/BerTaggedObject.cs
parentHandle high tag numbers (diff)
downloadBouncyCastle.NET-ed25519-46230a012af2824a5e742db8e6dc5b23c720d696.tar.xz
ASN.1: Update encoding in line with bc-java
Diffstat (limited to 'crypto/src/asn1/BerTaggedObject.cs')
-rw-r--r--crypto/src/asn1/BerTaggedObject.cs107
1 files changed, 48 insertions, 59 deletions
diff --git a/crypto/src/asn1/BerTaggedObject.cs b/crypto/src/asn1/BerTaggedObject.cs
index 4bf27e12f..fc4d1835a 100644
--- a/crypto/src/asn1/BerTaggedObject.cs
+++ b/crypto/src/asn1/BerTaggedObject.cs
@@ -1,7 +1,4 @@
 using System;
-using System.Collections;
-
-using Org.BouncyCastle.Utilities;
 
 namespace Org.BouncyCastle.Asn1
 {
@@ -52,75 +49,67 @@ namespace Org.BouncyCastle.Asn1
             get { return Ber; }
         }
 
-        internal override bool EncodeConstructed()
+        internal override bool EncodeConstructed(int encoding)
         {
-            throw Platform.CreateNotImplementedException("BerTaggedObject.EncodeConstructed");
+            if (Asn1OutputStream.EncodingBer != encoding)
+                return base.EncodeConstructed(encoding);
 
-            // TODO This depends on knowing it's not DER
-            //return IsExplicit() || obj.ToAsn1Object().EncodeConstructed();
+            return IsExplicit() || GetBaseObject().ToAsn1Object().EncodeConstructed(encoding);
         }
 
-        internal override int EncodedLength(bool withID)
+        internal override int EncodedLength(int encoding, bool withID)
         {
-            throw Platform.CreateNotImplementedException("BerTaggedObject.EncodedLength");
+            if (Asn1OutputStream.EncodingBer != encoding)
+                return base.EncodedLength(encoding, withID);
+
+            Asn1Object baseObject = GetBaseObject().ToAsn1Object();
+            bool withBaseID = IsExplicit();
+
+            int length = baseObject.EncodedLength(encoding, withBaseID);
+
+            if (withBaseID)
+            {
+                length += 3;
+            }
+
+            length += withID ? Asn1OutputStream.GetLengthOfIdentifier(TagNo) : 0;
+
+            return length;
         }
 
         internal override void Encode(Asn1OutputStream asn1Out, bool withID)
 		{
-			if (asn1Out.IsBer)
-			{
-                if (withID)
+            if (Asn1OutputStream.EncodingBer != asn1Out.Encoding)
+            {
+                base.Encode(asn1Out, withID);
+                return;
+            }
+
+            Asn1Object baseObject = GetBaseObject().ToAsn1Object();
+            bool withBaseID = IsExplicit();
+
+            if (withID)
+            {
+                int flags = TagClass;
+                if (withBaseID || baseObject.EncodeConstructed(asn1Out.Encoding))
                 {
-                    asn1Out.WriteIdentifier(true, Asn1Tags.Constructed | TagClass, TagNo);
+                    flags |= Asn1Tags.Constructed;
                 }
 
-                asn1Out.WriteByte(0x80);
+                asn1Out.WriteIdentifier(true, flags, TagNo);
+            }
 
-				if (!explicitly)
-				{
-					IEnumerable eObj;
-					if (obj is Asn1OctetString)
-					{
-						if (obj is BerOctetString)
-						{
-							eObj = (BerOctetString) obj;
-						}
-						else
-						{
-							Asn1OctetString octs = (Asn1OctetString)obj;
-							eObj = new BerOctetString(octs.GetOctets());
-						}
-					}
-					else if (obj is Asn1Sequence)
-					{
-						eObj = (Asn1Sequence) obj;
-					}
-					else if (obj is Asn1Set)
-					{
-						eObj = (Asn1Set) obj;
-					}
-					else
-					{
-						throw Platform.CreateNotImplementedException(Platform.GetTypeName(obj));
-					}
-
-					foreach (Asn1Encodable o in eObj)
-					{
-						asn1Out.WritePrimitive(o.ToAsn1Object(), true);
-					}
-				}
-				else
-				{
-					asn1Out.WritePrimitive(obj.ToAsn1Object(), true);
-				}
-
-				asn1Out.WriteByte(0x00);
-				asn1Out.WriteByte(0x00);
-			}
-			else
-			{
-				base.Encode(asn1Out, withID);
-			}
+            if (withBaseID)
+            {
+                asn1Out.WriteByte(0x80);
+                baseObject.Encode(asn1Out, true);
+                asn1Out.WriteByte(0x00);
+                asn1Out.WriteByte(0x00);
+            }
+            else
+            {
+                baseObject.Encode(asn1Out, false);
+            }
 		}
 
         internal override Asn1Sequence RebuildConstructed(Asn1Object asn1Object)