1 files changed, 52 insertions, 0 deletions
diff --git a/crypto/src/asn1/ConstructedDerEncoding.cs b/crypto/src/asn1/ConstructedDerEncoding.cs
new file mode 100644
index 000000000..3df7841e8
--- /dev/null
+++ b/crypto/src/asn1/ConstructedDerEncoding.cs
@@ -0,0 +1,52 @@
+using System;
+using System.Diagnostics;
+
+namespace Org.BouncyCastle.Asn1
+{
+ internal class ConstructedDerEncoding
+ : DerEncoding
+ {
+ private readonly DerEncoding[] m_contentsElements;
+ private readonly int m_contentsLength;
+
+ internal ConstructedDerEncoding(int tagClass, int tagNo, DerEncoding[] contentsElements)
+ : base(tagClass, tagNo)
+ {
+ Debug.Assert(contentsElements != null);
+ m_contentsElements = contentsElements;
+ m_contentsLength = Asn1OutputStream.GetLengthOfContents(contentsElements);
+ }
+
+ protected internal override int CompareLengthAndContents(DerEncoding other)
+ {
+ if (!(other is ConstructedDerEncoding that))
+ throw new InvalidOperationException();
+
+ if (this.m_contentsLength != that.m_contentsLength)
+ return this.m_contentsLength - that.m_contentsLength;
+
+ int length = System.Math.Min(this.m_contentsElements.Length, that.m_contentsElements.Length);
+ for (int i = 0; i < length; i++)
+ {
+ int c = this.m_contentsElements[i].CompareTo(that.m_contentsElements[i]);
+ if (c != 0)
+ return c;
+ }
+
+ Debug.Assert(this.m_contentsElements.Length == that.m_contentsElements.Length);
+ return this.m_contentsElements.Length - that.m_contentsElements.Length;
+ }
+
+ public override void Encode(Asn1OutputStream asn1Out)
+ {
+ asn1Out.WriteIdentifier(Asn1Tags.Constructed | m_tagClass, m_tagNo);
+ asn1Out.WriteDL(m_contentsLength);
+ asn1Out.EncodeContents(m_contentsElements);
+ }
+
+ public override int GetLength()
+ {
+ return Asn1OutputStream.GetLengthOfEncodingDL(m_tagNo, m_contentsLength);
+ }
+ }
+}
|