diff options
Diffstat (limited to 'crypto/src/asn1/DerSet.cs')
-rw-r--r-- | crypto/src/asn1/DerSet.cs | 89 |
1 files changed, 15 insertions, 74 deletions
diff --git a/crypto/src/asn1/DerSet.cs b/crypto/src/asn1/DerSet.cs index d89285d9e..3e52094c3 100644 --- a/crypto/src/asn1/DerSet.cs +++ b/crypto/src/asn1/DerSet.cs @@ -15,8 +15,6 @@ namespace Org.BouncyCastle.Asn1 return elementVector.Count < 1 ? Empty : new DerSet(elementVector); } - private int m_contentsLengthDer = -1; - /** * create an empty set */ @@ -61,88 +59,31 @@ namespace Org.BouncyCastle.Asn1 { } - internal override int EncodedLength(int encoding, bool withID) + internal override IAsn1Encoding GetEncoding(int encoding) { - encoding = Asn1OutputStream.EncodingDer; - - int count = elements.Length; - int contentsLength = 0; - - for (int i = 0; i < count; ++i) - { - Asn1Object asn1Object = elements[i].ToAsn1Object(); - contentsLength += asn1Object.EncodedLength(encoding, true); - } - - return Asn1OutputStream.GetLengthOfEncodingDL(withID, contentsLength); + return new ConstructedDLEncoding(Asn1Tags.Universal, Asn1Tags.Set, + Asn1OutputStream.GetContentsEncodings(Asn1OutputStream.EncodingDer, GetSortedElements())); } - /* - * A note on the implementation: - * <p> - * As Der requires the constructed, definite-length model to - * be used for structured types, this varies slightly from the - * ASN.1 descriptions given. Rather than just outputing Set, - * we also have to specify Constructed, and the objects length. - */ - internal override void Encode(Asn1OutputStream asn1Out, bool withID) + internal override IAsn1Encoding GetEncodingImplicit(int encoding, int tagClass, int tagNo) { - if (Count < 1) - { - asn1Out.WriteEncodingDL(withID, Asn1Tags.Constructed | Asn1Tags.Set, Asn1OctetString.EmptyOctets); - return; - } - - Asn1Encodable[] elements = this.elements; - if (!isSorted) - { - elements = Sort((Asn1Encodable[])elements.Clone()); - } - - asn1Out = asn1Out.GetDerSubStream(); + return new ConstructedDLEncoding(tagClass, tagNo, + Asn1OutputStream.GetContentsEncodings(Asn1OutputStream.EncodingDer, GetSortedElements())); + } - asn1Out.WriteIdentifier(withID, Asn1Tags.Constructed | Asn1Tags.Set); + private Asn1Encodable[] GetSortedElements() + { + if (isSorted) + return elements; int count = elements.Length; - if (m_contentsLengthDer >= 0 || count > 16) - { - asn1Out.WriteDL(GetContentsLengthDer()); - - for (int i = 0; i < count; ++i) - { - Asn1Object asn1Object = elements[i].ToAsn1Object(); - asn1Object.Encode(asn1Out, true); - } - } - else + Asn1Object[] asn1Objects = new Asn1Object[count]; + for (int i = 0; i < count; ++i) { - int contentsLength = 0; - - Asn1Object[] asn1Objects = new Asn1Object[count]; - for (int i = 0; i < count; ++i) - { - Asn1Object asn1Object = elements[i].ToAsn1Object(); - asn1Objects[i] = asn1Object; - contentsLength += asn1Object.EncodedLength(asn1Out.Encoding, true); - } - - this.m_contentsLengthDer = contentsLength; - asn1Out.WriteDL(contentsLength); - - for (int i = 0; i < count; ++i) - { - asn1Objects[i].Encode(asn1Out, true); - } + asn1Objects[i] = elements[i].ToAsn1Object(); } - } - private int GetContentsLengthDer() - { - if (m_contentsLengthDer < 0) - { - m_contentsLengthDer = CalculateContentsLength(Asn1OutputStream.EncodingDer); - } - return m_contentsLengthDer; + return Sort(asn1Objects); } } } |