public static string verify_message(string signature, string message, int addrtype) { byte[] sig; //try { sig = Convert.FromBase64String(signature); } //catch (err) //{ // return false; //} if (sig.Length != 65) { return("Error e"); } // extract r,s from signature var r = Bytes32.ConvetToBigInteger(sig.Skip(1).Take(32).ToArray()); var s = Bytes32.ConvetToBigInteger(sig.Skip(33).Take(32).ToArray()); // var s = BigInteger.fromByteArrayUnsigned(sig.slice(33, 33 + 32)); // get recid // var compressed = false; var nV = Convert.ToInt32(sig[0]); if (nV < 27 || nV >= 35) { return("Error e"); } if (nV >= 31) { // compressed = true; nV -= 4; } var recid = new BigInteger(nV - 27); { //var z = Bytes32.ConvetToBigInteger(hash); ; //var w = s.ModInverse(Secp256k1.q); //var u1 = (z * w) % Secp256k1.q; //var u2 = (r * w) % Secp256k1.q; //bool isZero; //var pt = Calculate.pointPlus(Calculate.getPublicByPrivate(u1), Calculate.getMulValue(u2, publicKey), out isZero);// (publicKey.Multiply(u2)); //if (pt == null) //{ // return false; //} //else //{ // var pmod = pt[0] % Secp256k1.q; // return pmod == r; //} } //var ecparams = getSECCurveByName("secp256k1"); //var curve = ecparams.getCurve(); //var a = curve.getA().toBigInteger(); //var b = curve.getB().toBigInteger(); //var p = curve.getQ(); //var G = ecparams.getG(); //var order = ecparams.getN(); //var x = r.add(order.multiply(recid.divide(BigInteger.valueOf(2)))); var x = recid / 2 * Secp256k1.q + r; //Calculate.getMulValue(,recid / 2); // var alpha = x.multiply(x).multiply(x).add(a.multiply(x)).add(b).mod(p); var alpha = (x * x * x + Secp256k1.a * x + Secp256k1.b) % Secp256k1.p; //var beta = alpha.modPow(p.add(BigInteger.ONE).divide(BigInteger.valueOf(4)), p); var beta = BigInteger.ModPow(alpha, (Secp256k1.p + 1) / 4, Secp256k1.p);//Calculate.Pow((Secp256k1.p + 1) / 4, alpha); var y = (beta - recid).IsEven ? beta : (Secp256k1.p - beta); //var y = beta.subtract(recid).isEven() ? beta : p.subtract(beta); // var R = new ECPointFp(curve, curve.fromBigInteger(x), curve.fromBigInteger(y)); // var e = BigInteger.fromByteArrayUnsigned(msg_digest(message)); var e = Bytes32.ConvetToBigInteger(msg_digest(message)); // var minus_e = BigInteger.Negate(e)+ % Secp256k1.q; var minus_e = ((Secp256k1.q - e) % Secp256k1.q + Secp256k1.q) % Secp256k1.q; var inv_r = Inverse.ex_gcd(r, Secp256k1.q);////BigInteger.mo r.modInverse(order); //var Q = (R.multiply(s).add(G.multiply(minus_e))).multiply(inv_r); bool isZero; var Q__ = Calculate.pointPlus(Calculate.getMulValue(s, new BigInteger[] { x, y }), Calculate.getPublicByPrivate(minus_e), out isZero); if (isZero) { return("Error e"); } else { var Q = Calculate.getMulValue(inv_r, Q__); var public_key = PublicKeyF.GetAddressOfcompressed(Q); if (addrtype == 0) { return(PublicKeyF.GetAddressOfUncompressed(Q)); } else if (addrtype == 1) { return(PublicKeyF.GetAddressOfcompressed(Q)); } else { return("Error e"); } } }
public static bool checkSign(string signature, string message, string address) { byte[] sig; { sig = Convert.FromBase64String(signature); } if (sig.Length != 65) { return(false); } // extract r,s from signature var r = Bytes32.ConvetToBigInteger(sig.Skip(1).Take(32).ToArray()); var s = Bytes32.ConvetToBigInteger(sig.Skip(33).Take(32).ToArray()); // var s = BigInteger.fromByteArrayUnsigned(sig.slice(33, 33 + 32)); // get recid var compressed = false; var nV = Convert.ToInt32(sig[0]); if (nV < 27 || nV >= 35) { return(false); } if (nV >= 31) { compressed = true; nV -= 4; } var recid = new BigInteger(nV - 27); //var ecparams = getSECCurveByName("secp256k1"); //var curve = ecparams.getCurve(); //var a = curve.getA().toBigInteger(); //var b = curve.getB().toBigInteger(); //var p = curve.getQ(); //var G = ecparams.getG(); //var order = ecparams.getN(); //var x = r.add(order.multiply(recid.divide(BigInteger.valueOf(2)))); var x = recid / 2 * Secp256k1.q + r; //Calculate.getMulValue(,recid / 2); // var alpha = x.multiply(x).multiply(x).add(a.multiply(x)).add(b).mod(p); var alpha = (x * x * x + Secp256k1.a * x + Secp256k1.b) % Secp256k1.p; //var beta = alpha.modPow(p.add(BigInteger.ONE).divide(BigInteger.valueOf(4)), p); var beta = BigInteger.ModPow(alpha, (Secp256k1.p + 1) / 4, Secp256k1.p);//Calculate.Pow((Secp256k1.p + 1) / 4, alpha); var y = (beta - recid).IsEven ? beta : (Secp256k1.p - beta); //var y = beta.subtract(recid).isEven() ? beta : p.subtract(beta); // var R = new ECPointFp(curve, curve.fromBigInteger(x), curve.fromBigInteger(y)); // var e = BigInteger.fromByteArrayUnsigned(msg_digest(message)); var e = Bytes32.ConvetToBigInteger(msg_digest(message)); // var minus_e = BigInteger.Negate(e)+ % Secp256k1.q; var minus_e = ((Secp256k1.q - e) % Secp256k1.q + Secp256k1.q) % Secp256k1.q; var inv_r = Inverse.ex_gcd(r, Secp256k1.q);////BigInteger.mo r.modInverse(order); //var Q = (R.multiply(s).add(G.multiply(minus_e))).multiply(inv_r); bool isZero; var Q__ = Calculate.pointPlus(Calculate.getMulValue(s, new BigInteger[] { x, y }), Calculate.getPublicByPrivate(minus_e), out isZero); if (isZero) { return(false); } else { var Q = Calculate.getMulValue(inv_r, Q__); // var public_key = PublicKeyF.GetAddressOfcompressed(Q); if (compressed) { var compressedAdress = PublicKeyF.GetAddressOfcompressed(Q); Console.WriteLine($"compressed Adress:{compressedAdress}"); return(compressedAdress == address); } else { var unCompressedAdress = PublicKeyF.GetAddressOfUncompressed(Q); Console.WriteLine($"uncompressed adress:{unCompressedAdress}"); return(unCompressedAdress == address); } } }