BerOctetStringGenerator
using Org.BouncyCastle.Utilities.IO;
using System;
using System.IO;
namespace Org.BouncyCastle.Asn1
{
public class BerOctetStringGenerator : BerGenerator
{
private class BufferedBerOctetStream : BaseOutputStream
{
private byte[] _buf;
private int _off;
private readonly Asn1OutputStream _derOut;
internal BufferedBerOctetStream(Stream outStream, byte[] buf)
{
_buf = buf;
_off = 0;
_derOut = Asn1OutputStream.Create(outStream, "DER", true);
}
public override void Write(byte[] buffer, int offset, int count)
{
Streams.ValidateBufferArguments(buffer, offset, count);
Write(buffer.AsSpan(offset, count));
}
public override void Write(ReadOnlySpan<byte> buffer)
{
int num = _buf.Length;
int num2 = num - _off;
if (buffer.Length < num2) {
buffer.CopyTo(_buf.AsSpan(_off));
_off += buffer.Length;
} else {
if (_off > 0) {
DerOctetString.Encode(_derOut, _buf.AsSpan(0, _off), buffer.Slice(0, num2));
int num3 = num2;
buffer = buffer.Slice(num3, buffer.Length - num3);
}
while (buffer.Length >= num) {
DerOctetString.Encode(_derOut, buffer.Slice(0, num));
int num3 = num;
buffer = buffer.Slice(num3, buffer.Length - num3);
}
buffer.CopyTo(_buf.AsSpan());
_off = buffer.Length;
}
}
public override void WriteByte(byte value)
{
_buf[_off++] = value;
if (_off == _buf.Length) {
DerOctetString.Encode(_derOut, _buf, 0, _off);
_off = 0;
}
}
protected override void Dispose(bool disposing)
{
if (disposing) {
if (_off != 0) {
DerOctetString.Encode(_derOut, _buf, 0, _off);
_off = 0;
}
_derOut.Dispose();
}
base.Dispose(disposing);
}
}
public BerOctetStringGenerator(Stream outStream)
: base(outStream)
{
WriteBerHeader(36);
}
public BerOctetStringGenerator(Stream outStream, int tagNo, bool isExplicit)
: base(outStream, tagNo, isExplicit)
{
WriteBerHeader(36);
}
public Stream GetOctetOutputStream()
{
return GetOctetOutputStream(new byte[1000]);
}
public Stream GetOctetOutputStream(int bufSize)
{
if (bufSize >= 1)
return GetOctetOutputStream(new byte[bufSize]);
return GetOctetOutputStream();
}
public Stream GetOctetOutputStream(byte[] buf)
{
return new BufferedBerOctetStream(GetRawOutputStream(), buf);
}
}
}