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

MLDsaPublicKeyParameters

using Org.BouncyCastle.Pqc.Crypto.Crystals.Dilithium; using Org.BouncyCastle.Utilities; using System; namespace Org.BouncyCastle.Crypto.Parameters { public sealed class MLDsaPublicKeyParameters : MLDsaKeyParameters { internal readonly byte[] m_rho; internal readonly byte[] m_t1; private byte[] cachedPublicKeyHash; public static MLDsaPublicKeyParameters FromEncoding(MLDsaParameters parameters, byte[] encoding) { if (parameters == null) throw new ArgumentNullException("parameters"); if (encoding == null) throw new ArgumentNullException("encoding"); if (encoding.Length != parameters.ParameterSet.PublicKeyLength) throw new ArgumentException("invalid encoding", "encoding"); byte[] rho = Arrays.CopyOfRange(encoding, 0, 32); byte[] t = Arrays.CopyOfRange(encoding, 32, encoding.Length); return new MLDsaPublicKeyParameters(parameters, rho, t); } internal MLDsaPublicKeyParameters(MLDsaParameters parameters, byte[] rho, byte[] t1) : base(false, parameters) { m_rho = rho; m_t1 = t1; } public byte[] GetEncoded() { return Arrays.Concatenate(m_rho, m_t1); } internal byte[] GetPublicKeyHash() { return Objects.EnsureSingletonInitialized(ref cachedPublicKeyHash, this, CreatePublicKeyHash); } internal bool VerifyInternal(byte[] msg, int msgOff, int msgLen, byte[] sig) { return base.Parameters.ParameterSet.GetEngine(null).VerifyInternal(sig, sig.Length, msg, msgOff, msgLen, m_rho, m_t1, GetPublicKeyHash()); } private static byte[] CreatePublicKeyHash(MLDsaPublicKeyParameters publicKey) { return DilithiumEngine.CalculatePublicKeyHash(publicKey.m_rho, publicKey.m_t1); } } }