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

LMOtsPrivateKey

public sealed class LMOtsPrivateKey
using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Utilities; using System; namespace Org.BouncyCastle.Pqc.Crypto.Lms { public sealed class LMOtsPrivateKey { private readonly LMOtsParameters m_parameters; private readonly byte[] m_I; private readonly int m_q; private readonly byte[] m_masterSecret; public LMOtsParameters Parameters => m_parameters; public int Q => m_q; [Obsolete("Use 'GetI' instead")] public byte[] I { get { return m_I; } } [Obsolete("Use 'GetMasterSecret' instead")] public byte[] MasterSecret { get { return m_masterSecret; } } public LMOtsPrivateKey(LMOtsParameters parameters, byte[] i, int q, byte[] masterSecret) { m_parameters = parameters; m_I = i; m_q = q; m_masterSecret = masterSecret; } public LmsContext GetSignatureContext(LMSigParameters sigParams, byte[][] path) { byte[] array = new byte[m_parameters.N]; SeedDerive derivationFunction = GetDerivationFunction(); derivationFunction.J = LMOts.SEED_RANDOMISER_INDEX; derivationFunction.DeriveSeed(false, array, 0); IDigest digest = LmsUtilities.GetDigest(m_parameters); LmsUtilities.ByteArray(m_I, digest); LmsUtilities.U32Str(m_q, digest); LmsUtilities.U16Str((short)LMOts.D_MESG, digest); LmsUtilities.ByteArray(array, digest); return new LmsContext(this, sigParams, digest, array, path); } public byte[] GetI() { return Arrays.Clone(m_I); } public byte[] GetMasterSecret() { return Arrays.Clone(m_masterSecret); } internal SeedDerive GetDerivationFunction() { return new SeedDerive(m_I, m_masterSecret, LmsUtilities.GetDigest(m_parameters)) { Q = m_q, J = 0 }; } } }