const G1Curve = require("./g1curve");
|
|
const G2Curve = require("./g2curve");
|
|
const GT = require("./gt");
|
|
|
|
const G1 = new G1Curve();
|
|
const G2 = new G2Curve();
|
|
const Gt = new GT();
|
|
|
|
const pairing = require("./pairing");
|
|
|
|
module.exports = function isValid(vk_verifier, proof, publicSignals) {
|
|
|
|
let full_pi_a = proof.pi_a;
|
|
for (let s= 0; s< vk_verifier.nPublic; s++) {
|
|
|
|
full_pi_a = G1.add( full_pi_a, G1.mulEscalar( vk_verifier.A[s], publicSignals[s]));
|
|
}
|
|
|
|
if (! Gt.equal(
|
|
pairing( proof.pi_a , vk_verifier.vk_a ),
|
|
pairing( proof.pi_ap , G2.g )))
|
|
return false;
|
|
|
|
if (! Gt.equal(
|
|
pairing( vk_verifier.vk_b, proof.pi_b ),
|
|
pairing( proof.pi_ap , G2.g )))
|
|
return false;
|
|
|
|
if (! Gt.equal(
|
|
pairing( proof.pi_c , vk_verifier.vk_c ),
|
|
pairing( proof.pi_cp , G2.g )))
|
|
return false;
|
|
|
|
if (! Gt.equal(
|
|
pairing( full_pi_a , proof.pi_b ),
|
|
Gt.mul(
|
|
pairing( proof.pi_h , vk_verifier.vk_z ),
|
|
pairing( proof.pi_b , G2.g ),
|
|
),
|
|
pairing( proof.pi_kp , vk_verifier.vk_g )))
|
|
return false;
|
|
|
|
if (! Gt.equal(
|
|
Gt.mul(
|
|
pairing( G1.add(full_pi_a, proof.pi_c) , vk_verifier.vk_gb_2 ),
|
|
pairing( vk_verifier.vk_gb_1 , proof.pi_b ),
|
|
),
|
|
pairing( proof.pi_kp , vk_verifier.vk_g )))
|
|
return false;
|
|
|
|
return true;
|
|
};
|