public byte[] TransformFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount) { // inputCount != InputBlockSize is allowed ThrowHelper.ValidateTransformBlock(inputBuffer, inputOffset, inputCount); if (_inputBuffer == null) { ThrowHelper.ThrowObjectDisposed(); } if (inputCount == 0) { return(Array.Empty <byte>()); } // The common case is inputCount <= Base64InputBlockSize byte[]? tmpBufferArray = null; Span <byte> tmpBuffer = stackalloc byte[StackAllocSize]; if (inputCount > StackAllocSize) { tmpBuffer = tmpBufferArray = CryptoPool.Rent(inputCount); } tmpBuffer = GetTempBuffer(inputBuffer.AsSpan(inputOffset, inputCount), tmpBuffer); int bytesToTransform = _inputIndex + tmpBuffer.Length; // Too little data to decode if (bytesToTransform < InputBlockSize) { // reinitialize the transform Reset(); ReturnToCryptoPool(tmpBufferArray, tmpBuffer.Length); return(Array.Empty <byte>()); } int outputSize = GetOutputSize(bytesToTransform, tmpBuffer); byte[] output = new byte[outputSize]; ConvertFromBase64(tmpBuffer, output, out int consumed, out int written); Debug.Assert(written == outputSize); ReturnToCryptoPool(tmpBufferArray, tmpBuffer.Length); // reinitialize the transform Reset(); return(output); }
public int TransformBlock(byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset) { // inputCount != InputBlockSize is allowed ThrowHelper.ValidateTransformBlock(inputBuffer, inputOffset, inputCount); if (_inputBuffer == null) { ThrowHelper.ThrowObjectDisposed(); } if (outputBuffer == null) { ThrowHelper.ThrowArgumentNull(ThrowHelper.ExceptionArgument.outputBuffer); } // The common case is inputCount = InputBlockSize byte[]? tmpBufferArray = null; Span <byte> tmpBuffer = stackalloc byte[StackAllocSize]; if (inputCount > StackAllocSize) { tmpBuffer = tmpBufferArray = CryptoPool.Rent(inputCount); } tmpBuffer = GetTempBuffer(inputBuffer.AsSpan(inputOffset, inputCount), tmpBuffer); int bytesToTransform = _inputIndex + tmpBuffer.Length; // Too little data to decode: save data to _inputBuffer, so it can be transformed later if (bytesToTransform < InputBlockSize) { tmpBuffer.CopyTo(_inputBuffer.AsSpan(_inputIndex)); _inputIndex = bytesToTransform; ReturnToCryptoPool(tmpBufferArray, tmpBuffer.Length); return(0); } ConvertFromBase64(tmpBuffer, outputBuffer.AsSpan(outputOffset), out _, out int written); ReturnToCryptoPool(tmpBufferArray, tmpBuffer.Length); return(written); }