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