summary refs log tree commit diff
path: root/crypto/src/asn1/TaggedDerEncoding.cs
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/src/asn1/TaggedDerEncoding.cs')
-rw-r--r--crypto/src/asn1/TaggedDerEncoding.cs43
1 files changed, 43 insertions, 0 deletions
diff --git a/crypto/src/asn1/TaggedDerEncoding.cs b/crypto/src/asn1/TaggedDerEncoding.cs
new file mode 100644
index 000000000..c683ec071
--- /dev/null
+++ b/crypto/src/asn1/TaggedDerEncoding.cs
@@ -0,0 +1,43 @@
+using System;
+using System.Diagnostics;
+
+namespace Org.BouncyCastle.Asn1
+{
+    internal class TaggedDerEncoding
+        : DerEncoding
+    {
+        private readonly DerEncoding m_contentsElement;
+        private readonly int m_contentsLength;
+
+        internal TaggedDerEncoding(int tagClass, int tagNo, DerEncoding contentsElement)
+            : base(tagClass, tagNo)
+        {
+            Debug.Assert(contentsElement != null);
+            m_contentsElement = contentsElement;
+            m_contentsLength = contentsElement.GetLength();
+        }
+
+        protected internal override int CompareLengthAndContents(DerEncoding other)
+        {
+            if (!(other is TaggedDerEncoding that))
+                throw new InvalidOperationException();
+
+            if (this.m_contentsLength != that.m_contentsLength)
+                return this.m_contentsLength - that.m_contentsLength;
+
+            return this.m_contentsElement.CompareTo(that.m_contentsElement);
+        }
+
+        public override void Encode(Asn1OutputStream asn1Out)
+        {
+            asn1Out.WriteIdentifier(Asn1Tags.Constructed | m_tagClass, m_tagNo);
+            asn1Out.WriteDL(m_contentsLength);
+            m_contentsElement.Encode(asn1Out);
+        }
+
+        public override int GetLength()
+        {
+            return Asn1OutputStream.GetLengthOfEncodingDL(m_tagNo, m_contentsLength);
+        }
+    }
+}