From 3b5db17f9742229ccde2c96704610c2679c500ea Mon Sep 17 00:00:00 2001 From: Peter Dettman Date: Fri, 15 Oct 2021 17:47:24 +0700 Subject: Preserve laziness in substreams --- crypto/src/asn1/Asn1InputStream.cs | 4 +-- crypto/src/asn1/LazyASN1InputStream.cs | 62 +++++++++++++++++++++------------- 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/crypto/src/asn1/Asn1InputStream.cs b/crypto/src/asn1/Asn1InputStream.cs index 76bc3076d..b56d890fa 100644 --- a/crypto/src/asn1/Asn1InputStream.cs +++ b/crypto/src/asn1/Asn1InputStream.cs @@ -18,7 +18,7 @@ namespace Org.BouncyCastle.Asn1 { private readonly int limit; - private readonly byte[][] tmpBuffers; + internal readonly byte[][] tmpBuffers; internal static int FindLimit(Stream input) { @@ -64,7 +64,7 @@ namespace Org.BouncyCastle.Asn1 { } - private Asn1InputStream(Stream input, int limit, byte[][] tmpBuffers) + internal Asn1InputStream(Stream input, int limit, byte[][] tmpBuffers) : base(input) { this.limit = limit; diff --git a/crypto/src/asn1/LazyASN1InputStream.cs b/crypto/src/asn1/LazyASN1InputStream.cs index 4cf2305fd..1a85e455a 100644 --- a/crypto/src/asn1/LazyASN1InputStream.cs +++ b/crypto/src/asn1/LazyASN1InputStream.cs @@ -3,31 +3,45 @@ using System.IO; namespace Org.BouncyCastle.Asn1 { - public class LazyAsn1InputStream - : Asn1InputStream - { - public LazyAsn1InputStream( - byte[] input) - : base(input) - { - } + public class LazyAsn1InputStream + : Asn1InputStream + { + public LazyAsn1InputStream( + byte[] input) + : base(input) + { + } - public LazyAsn1InputStream( - Stream inputStream) - : base(inputStream) - { - } + public LazyAsn1InputStream( + Stream inputStream) + : base(inputStream) + { + } - internal override DerSequence CreateDerSequence( - DefiniteLengthInputStream dIn) - { - return new LazyDerSequence(dIn.ToArray()); - } + internal LazyAsn1InputStream(Stream input, int limit, byte[][] tmpBuffers) + : base(input, limit, tmpBuffers) + { + } - internal override DerSet CreateDerSet( - DefiniteLengthInputStream dIn) - { - return new LazyDerSet(dIn.ToArray()); - } - } + internal override DerSequence CreateDerSequence( + DefiniteLengthInputStream dIn) + { + return new LazyDerSequence(dIn.ToArray()); + } + + internal override DerSet CreateDerSet( + DefiniteLengthInputStream dIn) + { + return new LazyDerSet(dIn.ToArray()); + } + + internal override Asn1EncodableVector ReadVector(DefiniteLengthInputStream defIn) + { + int remaining = defIn.Remaining; + if (remaining < 1) + return new Asn1EncodableVector(0); + + return new LazyAsn1InputStream(defIn, remaining, tmpBuffers).ReadVector(); + } + } } -- cgit 1.4.1