public ECKeyInfo( int length, string p_str, string a_str, string b_str, string gx_str, string gy_str, string n_str) { this.length = length; p = new Org.BouncyCastle.Math.BigInteger(p_str, 16); a = new Org.BouncyCastle.Math.BigInteger(a_str, 16); b = new Org.BouncyCastle.Math.BigInteger(b_str, 16); gx = new Org.BouncyCastle.Math.BigInteger(gx_str, 16); gy = new Org.BouncyCastle.Math.BigInteger(gy_str, 16); n = new Org.BouncyCastle.Math.BigInteger(n_str, 16); Org.BouncyCastle.Math.BigInteger h = Org.BouncyCastle.Math.BigInteger.One; this.curve = new Org.BouncyCastle.Math.EC.FpCurve(p, a, b, n, h); //spec = new ECParameterSpec(curve, new ECPoint(gx, gy), n, 1); this.spec = new Org.BouncyCastle.Crypto.Parameters.ECDomainParameters( curve , curve.CreatePoint(gx, gy) // G , n , h ); }
public bool VerifySignature(byte[] message, byte[] signature, byte[] pubkey) { if (pubkey.Length == 33 && (pubkey[0] == 0x02 || pubkey[0] == 0x03)) { try { pubkey = ECPoint.DecodePoint(pubkey, ECCurve.Secp256r1).EncodePoint(false).Skip(1).ToArray(); } catch { return(false); } } else if (pubkey.Length == 65 && pubkey[0] == 0x04) { pubkey = pubkey.Skip(1).ToArray(); } else if (pubkey.Length != 64) { throw new ArgumentException(); } BigInteger x = new BigInteger(1, pubkey.Take(32).ToArray()); BigInteger y = new BigInteger(1, pubkey.Skip(32).ToArray()); X9ECParameters ecParams = NistNamedCurves.GetByName("P-256"); ECDomainParameters domainParameters = new ECDomainParameters(ecParams.Curve, ecParams.G, ecParams.N, ecParams.H, ecParams.GetSeed()); var G = ecParams.G; Org.BouncyCastle.Math.EC.ECCurve curve = ecParams.Curve; Org.BouncyCastle.Math.EC.ECPoint q = curve.CreatePoint(x, y); ECPublicKeyParameters pubkeyParam = new ECPublicKeyParameters(q, domainParameters); var verifier = SignerUtilities.GetSigner("SHA-256withECDSA"); verifier.Init(false, pubkeyParam); verifier.BlockUpdate(message, 0, message.Length); // expected format is SEQUENCE {INTEGER r, INTEGER s} var derSignature = new DerSequence( // first 32 bytes is "r" number new DerInteger(new BigInteger(1, signature.Take(32).ToArray())), // last 32 bytes is "s" number new DerInteger(new BigInteger(1, signature.Skip(32).ToArray()))) .GetDerEncoded(); ///old verify method /// /* * const int ECDSA_PUBLIC_P256_MAGIC = 0x31534345; * pubkey = BitConverter.GetBytes(ECDSA_PUBLIC_P256_MAGIC).Concat(BitConverter.GetBytes(32)).Concat(pubkey).ToArray(); * using (CngKey key = CngKey.Import(pubkey, CngKeyBlobFormat.EccPublicBlob)) * using (ECDsaCng ecdsa = new ECDsaCng(key)) * { * var result = ecdsa.VerifyData(message, signature, HashAlgorithmName.SHA256); * } */ /////////////////// return(verifier.VerifySignature(derSignature)); }