ParametersWithID
using System;
using System.Buffers;
namespace Org.BouncyCastle.Crypto.Parameters
{
public class ParametersWithID : ICipherParameters
{
private readonly ICipherParameters m_parameters;
private readonly byte[] m_id;
public int IDLength => m_id.Length;
public ICipherParameters Parameters => m_parameters;
internal ReadOnlySpan<byte> ID => m_id;
public static ParametersWithID Create<TState>(ICipherParameters parameters, int idLength, TState state, SpanAction<byte, TState> action)
{
if (action == null)
throw new ArgumentNullException("action");
if (idLength < 0)
throw new ArgumentOutOfRangeException("idLength");
ParametersWithID parametersWithID = new ParametersWithID(parameters, idLength);
action(parametersWithID.m_id, state);
return parametersWithID;
}
internal static ICipherParameters ApplyOptionalID(ICipherParameters parameters, byte[] id)
{
if (id != null)
return new ParametersWithIV(parameters, id);
return parameters;
}
public ParametersWithID(ICipherParameters parameters, byte[] id)
{
if (id == null)
throw new ArgumentNullException("id");
m_parameters = parameters;
m_id = (byte[])id.Clone();
}
public ParametersWithID(ICipherParameters parameters, byte[] id, int idOff, int idLen)
{
if (id == null)
throw new ArgumentNullException("id");
m_parameters = parameters;
m_id = new byte[idLen];
Array.Copy(id, idOff, m_id, 0, idLen);
}
public ParametersWithID(ICipherParameters parameters, ReadOnlySpan<byte> id)
{
m_parameters = parameters;
m_id = id.ToArray();
}
private ParametersWithID(ICipherParameters parameters, int idLength)
{
if (idLength < 0)
throw new ArgumentOutOfRangeException("idLength");
m_parameters = parameters;
m_id = new byte[idLength];
}
public void CopyIDTo(byte[] buf, int off, int len)
{
if (m_id.Length != len)
throw new ArgumentOutOfRangeException("len");
Array.Copy(m_id, 0, buf, off, len);
}
public byte[] GetID()
{
return (byte[])m_id.Clone();
}
}
}