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/DLSequence.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/DLSequence.cs')
-rw-r--r-- | crypto/src/asn1/DLSequence.cs | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/crypto/src/asn1/DLSequence.cs b/crypto/src/asn1/DLSequence.cs new file mode 100644 index 000000000..56a0e6932 --- /dev/null +++ b/crypto/src/asn1/DLSequence.cs @@ -0,0 +1,96 @@ +using System; +using System.IO; + +using Org.BouncyCastle.Utilities; + +namespace Org.BouncyCastle.Asn1 +{ + internal class DLSequence + : DerSequence + { + internal static new readonly DLSequence Empty = new DLSequence(); + + internal static new DLSequence FromVector(Asn1EncodableVector elementVector) + { + return elementVector.Count < 1 ? Empty : new DLSequence(elementVector); + } + + /** + * create an empty sequence + */ + internal DLSequence() + : base() + { + } + + /** + * create a sequence containing one object + */ + internal DLSequence(Asn1Encodable element) + : base(element) + { + } + + internal DLSequence(params Asn1Encodable[] elements) + : base(elements) + { + } + + /** + * create a sequence containing a vector of objects. + */ + internal DLSequence(Asn1EncodableVector elementVector) + : base(elementVector) + { + } + + internal DLSequence(Asn1Encodable[] elements, bool clone) + : base(elements, clone) + { + } + + internal override int EncodedLength(bool withID) + { + throw Platform.CreateNotImplementedException("DLSequence.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.Sequence, 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.Sequence, bytes, 0, length); + + Platform.Dispose(dOut); + } + + internal override Asn1Set ToAsn1Set() + { + return new DLSet(false, elements); + } + } +} |