/ test / eddsamimc.js
eddsamimc.js
  1  const chai = require("chai");
  2  const path = require("path");
  3  const wasm_tester = require("circom_tester").wasm;
  4  
  5  const buildEddsa = require("circomlibjs").buildEddsa;
  6  const buildBabyjub = require("circomlibjs").buildBabyjub;
  7  
  8  const assert = chai.assert;
  9  
 10  describe("EdDSA MiMC test", function () {
 11      let circuit;
 12      let eddsa;
 13      let babyJub;
 14      let F;
 15  
 16      this.timeout(100000);
 17  
 18      before( async () => {
 19          eddsa = await buildEddsa();
 20          babyJub = await buildBabyjub();
 21          F = babyJub.F;
 22  
 23          circuit = await wasm_tester(path.join(__dirname, "circuits", "eddsamimc_test.circom"));
 24      });
 25  
 26      it("Sign a single number", async () => {
 27          const msg = F.e(1234);
 28  
 29          const prvKey = Buffer.from("0001020304050607080900010203040506070809000102030405060708090001", "hex");
 30  
 31          const pubKey = eddsa.prv2pub(prvKey);
 32  
 33          const signature = eddsa.signMiMC(prvKey, msg);
 34  
 35          assert(eddsa.verifyMiMC(msg, signature, pubKey));
 36  
 37          const w = await circuit.calculateWitness({
 38              enabled: 1,
 39              Ax: F.toObject(pubKey[0]),
 40              Ay: F.toObject(pubKey[1]),
 41              R8x: F.toObject(signature.R8[0]),
 42              R8y: F.toObject(signature.R8[1]),
 43              S: signature.S,
 44              M: F.toObject(msg)}, true);
 45  
 46  
 47          await circuit.checkConstraints(w);
 48  
 49      });
 50  
 51      it("Detect Invalid signature", async () => {
 52          const msg = F.e(1234);
 53  
 54          const prvKey = Buffer.from("0001020304050607080900010203040506070809000102030405060708090001", "hex");
 55  
 56          const pubKey = eddsa.prv2pub(prvKey);
 57  
 58  
 59          const signature = eddsa.signMiMC(prvKey, msg);
 60  
 61          assert(eddsa.verifyMiMC(msg, signature, pubKey));
 62          try {
 63              const w = await circuit.calculateWitness({
 64                  enabled: 1,
 65                  Ax: F.toObject(pubKey[0]),
 66                  Ay: F.toObject(pubKey[1]),
 67                  R8x: F.toObject(F.add(signature.R8[0], F.e(1))),
 68                  R8y: F.toObject(signature.R8[1]),
 69                  S: signature.S,
 70                  M: F.toObject(msg)}, true);
 71              assert(false);
 72          } catch(err) {
 73  	    assert(err.message.includes("Assert Failed"));
 74          }
 75      });
 76  
 77  
 78      it("Test a dissabled circuit with a bad signature", async () => {
 79          const msg = F.e(1234);
 80  
 81          const prvKey = Buffer.from("0001020304050607080900010203040506070809000102030405060708090001", "hex");
 82  
 83          const pubKey = eddsa.prv2pub(prvKey);
 84  
 85  
 86          const signature = eddsa.signMiMC(prvKey, msg);
 87  
 88          assert(eddsa.verifyMiMC(msg, signature, pubKey));
 89  
 90          const w = await  circuit.calculateWitness({
 91              enabled: 0,
 92              Ax: F.toObject(pubKey[0]),
 93              Ay: F.toObject(pubKey[1]),
 94              R8x: F.toObject(F.add(signature.R8[0], F.e(1))),
 95              R8y: F.toObject(signature.R8[1]),
 96              S: signature.S,
 97              M: F.toObject(msg)}, true);
 98  
 99          await circuit.checkConstraints(w);
100  
101      });
102  });