summary refs log tree commit diff
path: root/crypto/src/asn1/Asn1OutputStream.cs
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/src/asn1/Asn1OutputStream.cs')
-rw-r--r--crypto/src/asn1/Asn1OutputStream.cs46
1 files changed, 41 insertions, 5 deletions
diff --git a/crypto/src/asn1/Asn1OutputStream.cs b/crypto/src/asn1/Asn1OutputStream.cs

index 745674930..588c3733d 100644 --- a/crypto/src/asn1/Asn1OutputStream.cs +++ b/crypto/src/asn1/Asn1OutputStream.cs
@@ -18,20 +18,56 @@ namespace Org.BouncyCastle.Asn1 public static Asn1OutputStream Create(Stream output) { - return new Asn1OutputStream(output); + return Create(output, Asn1Encodable.Ber); } public static Asn1OutputStream Create(Stream output, string encoding) { + return Create(output, encoding, false); + } + + public static Asn1OutputStream Create(Stream output, string encoding, bool leaveOpen) + { + if (Asn1Encodable.Der.Equals(encoding)) + return new DerOutputStream(output, leaveOpen); + + return new Asn1OutputStream(output, leaveOpen); + } + + internal static int GetEncodingType(string encoding) + { if (Asn1Encodable.Der.Equals(encoding)) - return new DerOutputStream(output); + return EncodingDer; + + return EncodingBer; + } - return new Asn1OutputStream(output); + private readonly bool m_leaveOpen; + + internal Asn1OutputStream(Stream output, bool leaveOpen) + : base(output) + { + if (!output.CanWrite) + throw new ArgumentException("Expected stream to be writable", nameof(output)); + + m_leaveOpen = leaveOpen; } - internal Asn1OutputStream(Stream os) - : base(os) + protected override void Dispose(bool disposing) { + if (disposing) + { + FlushInternal(); + } + + if (m_leaveOpen) + { + base.Detach(disposing); + } + else + { + base.Dispose(disposing); + } } public virtual void WriteObject(Asn1Encodable asn1Encodable)