<PackageReference Include="BouncyCastle.Cryptography" Version="2.4.0" />

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); } } }