diff options
author | Peter Dettman <peter.dettman@bouncycastle.org> | 2022-09-03 00:36:40 +0700 |
---|---|---|
committer | Peter Dettman <peter.dettman@bouncycastle.org> | 2022-09-03 00:36:40 +0700 |
commit | aa5f3f0929c50fc942325f18ed7ae48129d4c992 (patch) | |
tree | 0382f7336cb55c4a01bd38782d7694d1cb094921 /crypto/src/asn1 | |
parent | Clean up tests (diff) | |
download | BouncyCastle.NET-ed25519-aa5f3f0929c50fc942325f18ed7ae48129d4c992.tar.xz |
Stream modernization
Diffstat (limited to 'crypto/src/asn1')
-rw-r--r-- | crypto/src/asn1/Asn1OutputStream.cs | 16 | ||||
-rw-r--r-- | crypto/src/asn1/BEROctetStringGenerator.cs | 68 | ||||
-rw-r--r-- | crypto/src/asn1/DerOctetString.cs | 17 |
3 files changed, 78 insertions, 23 deletions
diff --git a/crypto/src/asn1/Asn1OutputStream.cs b/crypto/src/asn1/Asn1OutputStream.cs index 1a69d7c2c..59178ea31 100644 --- a/crypto/src/asn1/Asn1OutputStream.cs +++ b/crypto/src/asn1/Asn1OutputStream.cs @@ -77,7 +77,11 @@ namespace Org.BouncyCastle.Asn1 return; } +#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER + Span<byte> stack = stackalloc byte[5]; +#else byte[] stack = new byte[5]; +#endif int pos = stack.Length; do @@ -90,7 +94,11 @@ namespace Org.BouncyCastle.Asn1 int count = stack.Length - pos; stack[--pos] = (byte)(0x80 | count); +#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER + Write(stack[pos..]); +#else Write(stack, pos, count + 1); +#endif } internal void WriteIdentifier(int tagClass, int tagNo) @@ -101,7 +109,11 @@ namespace Org.BouncyCastle.Asn1 return; } +#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER + Span<byte> stack = stackalloc byte[6]; +#else byte[] stack = new byte[6]; +#endif int pos = stack.Length; stack[--pos] = (byte)(tagNo & 0x7F); @@ -113,7 +125,11 @@ namespace Org.BouncyCastle.Asn1 stack[--pos] = (byte)(tagClass | 0x1F); +#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER + Write(stack[pos..]); +#else Write(stack, pos, stack.Length - pos); +#endif } internal static IAsn1Encoding[] GetContentsEncodings(int encoding, Asn1Encodable[] elements) diff --git a/crypto/src/asn1/BEROctetStringGenerator.cs b/crypto/src/asn1/BEROctetStringGenerator.cs index 7893139d6..b07576e7d 100644 --- a/crypto/src/asn1/BEROctetStringGenerator.cs +++ b/crypto/src/asn1/BEROctetStringGenerator.cs @@ -64,6 +64,9 @@ namespace Org.BouncyCastle.Asn1 { Streams.ValidateBufferArguments(buffer, offset, count); +#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER + Write(buffer.AsSpan(offset, count)); +#else int bufLen = _buf.Length; int available = bufLen - _off; if (count < available) @@ -77,8 +80,9 @@ namespace Org.BouncyCastle.Asn1 if (_off > 0) { Array.Copy(buffer, offset, _buf, _off, available); - pos += available; + pos = available; DerOctetString.Encode(_derOut, _buf, 0, bufLen); + //_off = 0; } int remaining; @@ -90,9 +94,40 @@ namespace Org.BouncyCastle.Asn1 Array.Copy(buffer, offset + pos, _buf, 0, remaining); this._off = remaining; +#endif + } + +#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER + public override void Write(ReadOnlySpan<byte> buffer) + { + int bufLen = _buf.Length; + int available = bufLen - _off; + if (buffer.Length < available) + { + buffer.CopyTo(_buf.AsSpan(_off)); + _off += buffer.Length; + return; + } + + if (_off > 0) + { + DerOctetString.Encode(_derOut, _buf.AsSpan(0, _off), buffer[..available]); + buffer = buffer[available..]; + //_off = 0; + } + + while (buffer.Length >= bufLen) + { + DerOctetString.Encode(_derOut, buffer[..bufLen]); + buffer = buffer[bufLen..]; + } + + buffer.CopyTo(_buf.AsSpan()); + _off = buffer.Length; } +#endif - public override void WriteByte(byte value) + public override void WriteByte(byte value) { _buf[_off++] = value; @@ -103,33 +138,20 @@ namespace Org.BouncyCastle.Asn1 } } -#if PORTABLE protected override void Dispose(bool disposing) { if (disposing) { - ImplClose(); - } - base.Dispose(disposing); - } -#else - public override void Close() - { - ImplClose(); - base.Close(); - } -#endif - - private void ImplClose() - { - if (_off != 0) - { - DerOctetString.Encode(_derOut, _buf, 0, _off); - } + if (_off != 0) + { + DerOctetString.Encode(_derOut, _buf, 0, _off); + } - _derOut.FlushInternal(); + _derOut.FlushInternal(); - _gen.WriteBerEnd(); + _gen.WriteBerEnd(); + } + base.Dispose(disposing); } } } diff --git a/crypto/src/asn1/DerOctetString.cs b/crypto/src/asn1/DerOctetString.cs index d9913f065..ea13765ec 100644 --- a/crypto/src/asn1/DerOctetString.cs +++ b/crypto/src/asn1/DerOctetString.cs @@ -37,5 +37,22 @@ namespace Org.BouncyCastle.Asn1 asn1Out.WriteDL(len); asn1Out.Write(buf, off, len); } + +#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER + internal static void Encode(Asn1OutputStream asn1Out, ReadOnlySpan<byte> buf) + { + asn1Out.WriteIdentifier(Asn1Tags.Universal, Asn1Tags.OctetString); + asn1Out.WriteDL(buf.Length); + asn1Out.Write(buf); + } + + internal static void Encode(Asn1OutputStream asn1Out, ReadOnlySpan<byte> buf1, ReadOnlySpan<byte> buf2) + { + asn1Out.WriteIdentifier(Asn1Tags.Universal, Asn1Tags.OctetString); + asn1Out.WriteDL(buf1.Length + buf2.Length); + asn1Out.Write(buf1); + asn1Out.Write(buf2); + } +#endif } } |