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