/// <summary> /// Signs the passed in data with a private key /// </summary> /// <param name="privateKey">the private key used to create the signature</param> /// <param name="data">The data to sign</param> /// <returns>the signature as a byte array</returns> public byte[] Sign(byte[] privateKey, byte[] data) { var signer = new Gost3410Signer(); var privKey = (Gost3410PrivateKeyParameters)CreateAsymmetricKeyParameterFromPrivateKeyInfo(privateKey); try { signer.Init(true, privKey); } catch (Exception exception) { string message = "Private Key Creation Failure!\n" + $"{exception.Message}.\n" + $"The private key file is corrupted, verify private key file or try another key.\n" + $"If all fails create a new key pair."; throw new CryptoException(message, exception); } var bigIntSig = signer.GenerateSignature(data); var signature = new List <byte>(); signature.AddRange(bigIntSig[0].ToByteArrayUnsigned()); signature.AddRange(bigIntSig[1].ToByteArrayUnsigned()); return(signature.ToArray()); }
/// <summary> /// Verifies a signature to be authentic /// </summary> /// <param name="originalSignature">The signature which is be verified</param> /// <param name="publicKey">the public key used for the verification</param> /// <param name="data">the data which is signed</param> /// <returns>true if signature is authentic, false if not</returns> public bool Verify(byte[] originalSignature, byte[] publicKey, byte[] data) { var signer = new Gost3410Signer(); var pubKey = (Gost3410PublicKeyParameters)CreateAsymmetricKeyParameterFromPublicKeyInfo(publicKey); signer.Init(false, pubKey); var r = new byte[originalSignature.Length / 2]; var s = new byte[originalSignature.Length / 2]; Array.Copy(originalSignature, r, r.Length); Array.Copy(originalSignature, r.Length, s, 0, s.Length); var R = new BigInteger(1, r); var S = new BigInteger(1, s); return(signer.VerifySignature(data, R, S)); }