arnaucube
arnaucube/snarkjsPublic Self-hosted repository
snarkjs/src/verifier.js
src/verifier.jsRaw
 1const G1Curve = require("./g1curve");
 2const G2Curve = require("./g2curve");
 3const GT = require("./gt");
 4
 5const G1 = new G1Curve();
 6const G2 = new G2Curve();
 7const Gt = new GT();
 8
 9const pairing = require("./pairing");
10
11module.exports = function isValid(vk_verifier, proof, publicSignals) {
12
13    let  full_pi_a = proof.pi_a;
14    for (let s= 0; s< vk_verifier.nPublic; s++) {
15
16        full_pi_a  = G1.add( full_pi_a, G1.mulEscalar( vk_verifier.A[s], publicSignals[s]));
17    }
18
19    if (! Gt.equal(
20        pairing( proof.pi_a , vk_verifier.vk_a ),
21        pairing( proof.pi_ap , G2.g )))
22        return false;
23
24    if (! Gt.equal(
25        pairing( vk_verifier.vk_b,  proof.pi_b ),
26        pairing( proof.pi_ap , G2.g )))
27        return false;
28
29    if (! Gt.equal(
30        pairing( proof.pi_c , vk_verifier.vk_c ),
31        pairing( proof.pi_cp , G2.g )))
32        return false;
33
34    if (! Gt.equal(
35        pairing( full_pi_a , proof.pi_b  ),
36        Gt.mul(
37            pairing( proof.pi_h , vk_verifier.vk_z ),
38            pairing( proof.pi_b , G2.g  ),
39        ),
40        pairing( proof.pi_kp , vk_verifier.vk_g )))
41        return false;
42
43    if (! Gt.equal(
44        Gt.mul(
45            pairing( G1.add(full_pi_a, proof.pi_c) , vk_verifier.vk_gb_2 ),
46            pairing( vk_verifier.vk_gb_1 , proof.pi_b ),
47        ),
48        pairing( proof.pi_kp , vk_verifier.vk_g )))
49        return false;
50
51    return true;
52};