<PackageReference Include="BouncyCastle.Cryptography" Version="2.7.0-beta.98" />

FalconSigner

public class FalconSigner : IMessageSigner
using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Security; using System; namespace Org.BouncyCastle.Pqc.Crypto.Falcon { public class FalconSigner : IMessageSigner { private byte[] encodedkey; private FalconNist nist; public void Init(bool forSigning, ICipherParameters param) { SecureRandom random2; FalconParameters parameters; if (forSigning) { param = ParameterUtilities.GetRandom(param, out SecureRandom random); FalconPrivateKeyParameters falconPrivateKeyParameters = (FalconPrivateKeyParameters)param; random2 = CryptoServicesRegistrar.GetSecureRandom(random); encodedkey = falconPrivateKeyParameters.GetEncoded(); parameters = falconPrivateKeyParameters.Parameters; } else { FalconPublicKeyParameters falconPublicKeyParameters = (FalconPublicKeyParameters)param; random2 = null; encodedkey = falconPublicKeyParameters.GetEncoded(); parameters = falconPublicKeyParameters.Parameters; } nist = new FalconNist(random2, (uint)parameters.LogN, (uint)parameters.NonceLength); } public byte[] GenerateSignature(byte[] message) { byte[] sm = new byte[nist.CryptoBytes]; return nist.crypto_sign(false, sm, message, 0, (uint)message.Length, encodedkey, 0); } public bool VerifySignature(byte[] message, byte[] signature) { if (signature[0] != (byte)(48 + nist.LogN)) return false; byte[] array = new byte[nist.NonceLength]; byte[] array2 = new byte[signature.Length - nist.NonceLength - 1]; Array.Copy(signature, 1, array, 0, nist.NonceLength); Array.Copy(signature, nist.NonceLength + 1, array2, 0, signature.Length - nist.NonceLength - 1); return nist.crypto_sign_open(false, array2, array, message, encodedkey, 0) == 0; } } }