/* Copyright 2018 0kims association. This file is part of snarkjs. snarkjs is a free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. snarkjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with snarkjs. If not, see . */ const bigInt = require("./bigint.js"); const BN128 = require("./bn128.js"); const PolField = require("./polfield.js"); const ZqField = require("./zqfield.js"); const bn128 = new BN128(); const G1 = bn128.G1; const G2 = bn128.G2; const PolF = new PolField(new ZqField(bn128.r)); const F = new ZqField(bn128.r); module.exports = function setup(circuit) { const setup = { vk_proof : { protocol: "original", nVars: circuit.nVars, nPublic: circuit.nPubInputs + circuit.nOutputs }, vk_verifier: { protocol: "original", nPublic: circuit.nPubInputs + circuit.nOutputs }, toxic: {} }; setup.vk_proof.domainBits = PolF.log2(circuit.nConstraints + circuit.nPubInputs + circuit.nOutputs +1 -1) +1; setup.vk_proof.domainSize = 1 << setup.vk_proof.domainBits; calculatePolinomials(setup, circuit); setup.toxic.t = F.random(); calculateEncriptedValuesAtT(setup, circuit); calculateHexps(setup, circuit); return setup; }; function calculatePolinomials(setup, circuit) { setup.vk_proof.polsA = new Array(circuit.nVars); setup.vk_proof.polsB = new Array(circuit.nVars); setup.vk_proof.polsC = new Array(circuit.nVars); for (let i=0; i setup.vk_proof.nPublic) { setup.vk_proof.Ap[s] = G1.affine(G1.mulScalar(A, setup.toxic.ka)); } setup.vk_proof.Bp[s] = G1.affine(G1.mulScalar(B1, setup.toxic.kb)); setup.vk_proof.Cp[s] = G1.affine(G1.mulScalar(C, setup.toxic.kc)); setup.vk_proof.Kp[s] = G1.affine(G1.mulScalar(K, setup.toxic.kbeta)); } // Extra coeficients const A = G1.mulScalar( G1.g, F.mul(setup.toxic.ra, v.z_t)); setup.vk_proof.A[circuit.nVars] = G1.affine(A); setup.vk_proof.Ap[circuit.nVars] = G1.affine(G1.mulScalar(A, setup.toxic.ka)); const B1 = G1.mulScalar( G1.g, F.mul(setup.toxic.rb, v.z_t)); const B2 = G2.mulScalar( G2.g, F.mul(setup.toxic.rb, v.z_t)); setup.vk_proof.B[circuit.nVars] = G2.affine(B2); setup.vk_proof.Bp[circuit.nVars] = G1.affine(G1.mulScalar(B1, setup.toxic.kb)); const C = G1.mulScalar( G1.g, F.mul(setup.toxic.rc, v.z_t)); setup.vk_proof.C[circuit.nVars] = G1.affine(C); setup.vk_proof.Cp[circuit.nVars] = G1.affine(G1.mulScalar(C, setup.toxic.kc)); setup.vk_proof.Kp[circuit.nVars ] = G1.affine(G1.mulScalar(A, setup.toxic.kbeta)); setup.vk_proof.Kp[circuit.nVars+1] = G1.affine(G1.mulScalar(B1, setup.toxic.kbeta)); setup.vk_proof.Kp[circuit.nVars+2] = G1.affine(G1.mulScalar(C, setup.toxic.kbeta)); // setup.vk_verifier.A[0] = G1.affine(G1.add(setup.vk_verifier.A[0], setup.vk_proof.A[circuit.nVars])); // vk_z setup.vk_verifier.vk_z = G2.affine(G2.mulScalar( G2.g, F.mul(setup.toxic.rc, v.z_t))); } function calculateHexps(setup) { const maxH = setup.vk_proof.domainSize+1; setup.vk_proof.hExps = new Array(maxH); setup.vk_proof.hExps[0] = G1.g; let eT = setup.toxic.t; for (let i=1; i