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

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