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

ParametersWithIV

using System; using System.Buffers; namespace Org.BouncyCastle.Crypto.Parameters { public class ParametersWithIV : ICipherParameters { private readonly ICipherParameters m_parameters; private readonly byte[] m_iv; public int IVLength => m_iv.Length; public ICipherParameters Parameters => m_parameters; internal ReadOnlySpan<byte> IV => m_iv; public static ParametersWithIV Create<TState>(ICipherParameters parameter, int ivLength, TState state, SpanAction<byte, TState> action) { if (action == null) throw new ArgumentNullException("action"); if (ivLength < 0) throw new ArgumentOutOfRangeException("ivLength"); ParametersWithIV parametersWithIV = new ParametersWithIV(parameter, ivLength); action(parametersWithIV.m_iv, state); return parametersWithIV; } internal static ICipherParameters ApplyOptionalIV(ICipherParameters parameters, byte[] iv) { if (iv != null) return new ParametersWithIV(parameters, iv); return parameters; } public ParametersWithIV(ICipherParameters parameters, byte[] iv) : this(parameters, iv, 0, iv.Length) { if (iv == null) throw new ArgumentNullException("iv"); m_parameters = parameters; m_iv = (byte[])iv.Clone(); } public ParametersWithIV(ICipherParameters parameters, byte[] iv, int ivOff, int ivLen) { if (iv == null) throw new ArgumentNullException("iv"); m_parameters = parameters; m_iv = new byte[ivLen]; Array.Copy(iv, ivOff, m_iv, 0, ivLen); } public ParametersWithIV(ICipherParameters parameters, ReadOnlySpan<byte> iv) { m_parameters = parameters; m_iv = iv.ToArray(); } private ParametersWithIV(ICipherParameters parameters, int ivLength) { if (ivLength < 0) throw new ArgumentOutOfRangeException("ivLength"); m_parameters = parameters; m_iv = new byte[ivLength]; } public void CopyIVTo(byte[] buf, int off, int len) { if (m_iv.Length != len) throw new ArgumentOutOfRangeException("len"); Array.Copy(m_iv, 0, buf, off, len); } public byte[] GetIV() { return (byte[])m_iv.Clone(); } } }