You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

68 lines
2.5 KiB

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