DilithiumSigner
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;
namespace Org.BouncyCastle.Pqc.Crypto.Crystals.Dilithium
{
    public class DilithiumSigner : IMessageSigner
    {
        private DilithiumPrivateKeyParameters privKey;
        private DilithiumPublicKeyParameters pubKey;
        private SecureRandom random;
        public void Init(bool forSigning, ICipherParameters param)
        {
            if (forSigning) {
                ParametersWithRandom parametersWithRandom = param as ParametersWithRandom;
                if (parametersWithRandom != null) {
                    privKey = (DilithiumPrivateKeyParameters)parametersWithRandom.Parameters;
                    random = parametersWithRandom.Random;
                } else {
                    privKey = (DilithiumPrivateKeyParameters)param;
                    random = null;
                }
            } else {
                pubKey = (DilithiumPublicKeyParameters)param;
                random = null;
            }
        }
        public byte[] GenerateSignature(byte[] message)
        {
            DilithiumEngine engine = privKey.Parameters.GetEngine(random);
            byte[] array = new byte[engine.CryptoBytes];
            engine.Sign(array, array.Length, message, message.Length, privKey.m_rho, privKey.m_k, privKey.m_tr, privKey.m_t0, privKey.m_s1, privKey.m_s2);
            return array;
        }
        public bool VerifySignature(byte[] message, byte[] signature)
        {
            return pubKey.Parameters.GetEngine(random).SignOpen(message, signature, signature.Length, pubKey.m_rho, pubKey.m_t1);
        }
    }
}