Preserve laziness in substreams
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();
+ }
+ }
}
|