2019-04-09 22:37:39 +03:00
|
|
|
const assert = require("assert");
|
|
|
|
const fs = require("fs");
|
|
|
|
const path = require("path");
|
2023-09-12 11:51:08 +03:00
|
|
|
const snarkjs = require("@tornado/snarkjs");
|
2019-04-09 22:37:39 +03:00
|
|
|
|
|
|
|
const buildGroth16 = require("../index.js").buildGroth16;
|
|
|
|
|
|
|
|
describe("Basic tests for groth16 proof generator", () => {
|
2019-04-27 08:09:17 +03:00
|
|
|
it("should do basic multiexponentiation", async () => {
|
|
|
|
const groth16 = await buildGroth16();
|
|
|
|
|
|
|
|
const signalsAll = fs.readFileSync(path.join(__dirname, "data", "witness.bin"));
|
|
|
|
const provingKey = fs.readFileSync(path.join(__dirname, "data", "proving_key.bin"));
|
|
|
|
|
|
|
|
const nSignals = 1;
|
|
|
|
|
|
|
|
const pkey32 = new Uint32Array(provingKey);
|
|
|
|
const pPointsA = pkey32[5];
|
|
|
|
|
2023-09-12 11:51:08 +03:00
|
|
|
const points = provingKey.slice(pPointsA, pPointsA + nSignals * 64);
|
|
|
|
const signals = signalsAll.slice(0, nSignals * 32);
|
2019-04-27 08:09:17 +03:00
|
|
|
|
|
|
|
const pr1 = groth16.alloc(96);
|
|
|
|
const pPoints = groth16.alloc(points.byteLength);
|
|
|
|
groth16.putBin(pPoints, points);
|
|
|
|
|
|
|
|
const pSignals = groth16.alloc(signals.byteLength);
|
|
|
|
groth16.putBin(pSignals, signals);
|
|
|
|
|
|
|
|
groth16.instance.exports.g1_zero(pr1);
|
|
|
|
groth16.instance.exports.g1_multiexp(pSignals, pPoints, nSignals, 1, pr1);
|
|
|
|
groth16.instance.exports.g1_affine(pr1, pr1);
|
|
|
|
groth16.instance.exports.g1_fromMontgomery(pr1, pr1);
|
|
|
|
|
|
|
|
const r1 = groth16.bin2g1(groth16.getBin(pr1, 96));
|
|
|
|
|
|
|
|
groth16.instance.exports.g1_zero(pr1);
|
|
|
|
groth16.instance.exports.g1_multiexp2(pSignals, pPoints, nSignals, 1, pr1);
|
|
|
|
groth16.instance.exports.g1_affine(pr1, pr1);
|
|
|
|
groth16.instance.exports.g1_fromMontgomery(pr1, pr1);
|
|
|
|
|
|
|
|
const r2 = groth16.bin2g1(groth16.getBin(pr1, 96));
|
|
|
|
|
2023-09-12 11:51:08 +03:00
|
|
|
assert.equal(r1[0], r2[0]);
|
|
|
|
assert.equal(r1[1], r2[1]);
|
2019-04-27 08:09:17 +03:00
|
|
|
|
|
|
|
groth16.terminate();
|
|
|
|
});
|
|
|
|
|
2019-04-09 22:37:39 +03:00
|
|
|
it("It should do a basic point doubling G1", async () => {
|
|
|
|
const groth16 = await buildGroth16();
|
|
|
|
|
|
|
|
const signals = fs.readFileSync(path.join(__dirname, "data", "witness.bin"));
|
|
|
|
const provingKey = fs.readFileSync(path.join(__dirname, "data", "proving_key.bin"));
|
|
|
|
const proofS = await groth16.proof(signals.buffer, provingKey.buffer);
|
|
|
|
|
|
|
|
const proof = snarkjs.unstringifyBigInts(proofS);
|
2023-09-12 11:51:08 +03:00
|
|
|
const verifierKey = snarkjs.unstringifyBigInts(
|
|
|
|
JSON.parse(fs.readFileSync(path.join(__dirname, "data", "verification_key.json"), "utf8"))
|
|
|
|
);
|
2019-04-09 22:37:39 +03:00
|
|
|
const pub = snarkjs.unstringifyBigInts(JSON.parse(fs.readFileSync(path.join(__dirname, "data", "public.json"), "utf8")));
|
|
|
|
|
|
|
|
assert(snarkjs.groth.isValid(verifierKey, proof, pub));
|
|
|
|
|
|
|
|
groth16.terminate();
|
|
|
|
}).timeout(10000000);
|
|
|
|
});
|