arnaucube
arnaucube/websnarkPublic Self-hosted repository
websnark/test/groth16.js
test/groth16.jsRaw
 1
 2const assert = require("assert");
 3const fs = require("fs");
 4const path = require("path");
 5const snarkjs = require("snarkjs");
 6
 7const buildGroth16 = require("../index.js").buildGroth16;
 8
 9describe("Basic tests for groth16 proof generator", () => {
10    it("should do basic multiexponentiation", async () => {
11        const groth16 = await buildGroth16();
12
13        const signalsAll = fs.readFileSync(path.join(__dirname, "data", "witness.bin"));
14        const provingKey = fs.readFileSync(path.join(__dirname, "data", "proving_key.bin"));
15
16        const nSignals = 1;
17
18        const pkey32 = new Uint32Array(provingKey);
19        const pPointsA = pkey32[5];
20
21        const points = provingKey.slice(pPointsA, pPointsA + nSignals*64);
22        const signals = signalsAll.slice(0, nSignals*32);
23
24        const pr1 = groth16.alloc(96);
25        const pPoints = groth16.alloc(points.byteLength);
26        groth16.putBin(pPoints, points);
27
28        const pSignals = groth16.alloc(signals.byteLength);
29        groth16.putBin(pSignals, signals);
30
31        groth16.instance.exports.g1_zero(pr1);
32        groth16.instance.exports.g1_multiexp(pSignals, pPoints, nSignals, 1, pr1);
33        groth16.instance.exports.g1_affine(pr1, pr1);
34        groth16.instance.exports.g1_fromMontgomery(pr1, pr1);
35
36        const r1 = groth16.bin2g1(groth16.getBin(pr1, 96));
37
38        groth16.instance.exports.g1_zero(pr1);
39        groth16.instance.exports.g1_multiexp2(pSignals, pPoints, nSignals, 1, pr1);
40        groth16.instance.exports.g1_affine(pr1, pr1);
41        groth16.instance.exports.g1_fromMontgomery(pr1, pr1);
42
43        const r2 = groth16.bin2g1(groth16.getBin(pr1, 96));
44
45        assert.equal(r1[0],r2[0]);
46        assert.equal(r1[1],r2[1]);
47
48        groth16.terminate();
49
50    });
51
52    it("It should do a basic point doubling G1", async () => {
53        const groth16 = await buildGroth16();
54
55        const signals = fs.readFileSync(path.join(__dirname, "data", "witness.bin"));
56        const provingKey = fs.readFileSync(path.join(__dirname, "data", "proving_key.bin"));
57        const proofS = await groth16.proof(signals.buffer, provingKey.buffer);
58
59        const proof = snarkjs.unstringifyBigInts(proofS);
60        const verifierKey = snarkjs.unstringifyBigInts(JSON.parse(fs.readFileSync(path.join(__dirname, "data", "verification_key.json"), "utf8")));
61        const pub = snarkjs.unstringifyBigInts(JSON.parse(fs.readFileSync(path.join(__dirname, "data", "public.json"), "utf8")));
62
63        assert(snarkjs.groth.isValid(verifierKey, proof, pub));
64
65        groth16.terminate();
66    }).timeout(10000000);
67
68});