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 void SetUpSecp256k1() { //Set up OpenECC Curve OpenECCSecp256k1 = OpenECC.CurveFactory.secp256k1; OpenECCGenerator = OpenECCSecp256k1.Generator; OpenECCPoint1 = OpenECCGenerator * 3; OpenECCPoint2 = OpenECCGenerator * 5; //Set up BouncyCastle curve var bc_stuff = Org.BouncyCastle.Asn1.Sec.SecNamedCurves.GetByName("secp256k1"); BCSecp256k1 = bc_stuff.Curve; BCGenerator = bc_stuff.G; BCPoint1 = BCGenerator.Multiply(new Org.BouncyCastle.Math.BigInteger("3")); BCPoint2 = BCGenerator.Multiply(new Org.BouncyCastle.Math.BigInteger("5")); }
public static Key Deserialize(IEnumerable <byte> payload) { if (payload == null) { throw new ArgumentNullException(nameof(payload)); } var c = SecNamedCurves.GetByName("secp256k1"); var domain = new ECDomainParameters(c.Curve, c.G, c.N, c.H); Org.BouncyCastle.Math.EC.ECCurve curve = domain.Curve; Org.BouncyCastle.Math.EC.ECPoint q = curve.DecodePoint(payload.ToArray()); var publicKey = new ECPublicKeyParameters(q, domain); return(new Key(null, publicKey)); }
public static Key Deserialize(BigInteger publicKey, BigInteger privateKey) { if (publicKey == null) { throw new ArgumentNullException(nameof(publicKey)); } if (privateKey == null) { throw new ArgumentNullException(nameof(privateKey)); } var c = SecNamedCurves.GetByName("secp256k1"); var domain = new ECDomainParameters(c.Curve, c.G, c.N, c.H); Org.BouncyCastle.Math.EC.ECCurve curve = domain.Curve; Org.BouncyCastle.Math.EC.ECPoint q = curve.DecodePoint(publicKey.ToByteArray()); var pubK = new ECPublicKeyParameters(q, domain); var prK = new ECPrivateKeyParameters(privateKey, domain); return(new Key(prK, pubK)); }
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)); }