diff options
Diffstat (limited to 'crypto/src/asn1/TaggedDerEncoding.cs')
-rw-r--r-- | crypto/src/asn1/TaggedDerEncoding.cs | 43 |
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); + } + } +} |