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});