diff options
author | Peter Dettman <peter.dettman@bouncycastle.org> | 2021-11-09 23:37:08 +0700 |
---|---|---|
committer | Peter Dettman <peter.dettman@bouncycastle.org> | 2021-11-09 23:37:08 +0700 |
commit | 3c034ea8ac68da52b5ff128300b6780549d05bd1 (patch) | |
tree | a3f4572beee014d784560c0ba1282a4000e1a98a /crypto/src/asn1/DLSet.cs | |
parent | Fix DER encoding of lazy objects (diff) | |
download | BouncyCastle.NET-ed25519-3c034ea8ac68da52b5ff128300b6780549d05bd1.tar.xz |
Add DLSequence, DLSet for internal use
- improve sorting of sets
Diffstat (limited to 'crypto/src/asn1/DLSet.cs')
-rw-r--r-- | crypto/src/asn1/DLSet.cs | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/crypto/src/asn1/DLSet.cs b/crypto/src/asn1/DLSet.cs new file mode 100644 index 000000000..0605a0167 --- /dev/null +++ b/crypto/src/asn1/DLSet.cs @@ -0,0 +1,91 @@ +using System; +using System.IO; + +using Org.BouncyCastle.Utilities; + +namespace Org.BouncyCastle.Asn1 +{ + internal class DLSet + : DerSet + { + internal static new readonly DLSet Empty = new DLSet(); + + internal static new DLSet FromVector(Asn1EncodableVector elementVector) + { + return elementVector.Count < 1 ? Empty : new DLSet(elementVector); + } + + /** + * create an empty set + */ + internal DLSet() + : base() + { + } + + /** + * create a set containing one object + */ + internal DLSet(Asn1Encodable element) + : base(element) + { + } + + internal DLSet(params Asn1Encodable[] elements) + : base(elements, false) + { + } + + /** + * create a set containing a vector of objects. + */ + internal DLSet(Asn1EncodableVector elementVector) + : base(elementVector, false) + { + } + + internal DLSet(bool isSorted, Asn1Encodable[] elements) + : base(isSorted, elements) + { + } + + internal override int EncodedLength(bool withID) + { + throw Platform.CreateNotImplementedException("DLSet.EncodedLength"); + } + + internal override void Encode(Asn1OutputStream asn1Out, bool withID) + { + if (asn1Out.IsDer) + { + base.Encode(asn1Out, withID); + return; + } + + if (Count < 1) + { + asn1Out.WriteEncodingDL(withID, Asn1Tags.Constructed | Asn1Tags.Set, Asn1OctetString.EmptyOctets); + return; + } + + // TODO Intermediate buffer could be avoided if we could calculate expected length + MemoryStream bOut = new MemoryStream(); + // TODO Once DLOutputStream exists, this should create one + Asn1OutputStream dOut = Asn1OutputStream.Create(bOut); + dOut.WriteElements(elements); + dOut.FlushInternal(); + +#if PORTABLE + byte[] bytes = bOut.ToArray(); + int length = bytes.Length; +#else + byte[] bytes = bOut.GetBuffer(); + int length = (int)bOut.Position; +#endif + + asn1Out.WriteEncodingDL(withID, Asn1Tags.Constructed | Asn1Tags.Set, bytes, 0, length); + + Platform.Dispose(dOut); + } + } +} |