arnaucube
arnaucube/grapevine-sonobePublic Self-hosted repository
grapevine-sonobe/circom/node_modules/circomlib/test/eddsaposeidon.js
circom/node_modules/circomlib/test/eddsaposeidon.jsRaw
  1const chai = require("chai");
  2const path = require("path");
  3const wasm_tester = require("circom_tester").wasm;
  4
  5const buildEddsa = require("circomlibjs").buildEddsa;
  6const buildBabyjub = require("circomlibjs").buildBabyjub;
  7
  8const assert = chai.assert;
  9
 10describe("EdDSA Poseidon 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        circuit = await wasm_tester(path.join(__dirname, "circuits", "eddsaposeidon_test.circom"));
 23    });
 24
 25    it("Sign a single number", async () => {
 26        const msg = F.e(1234);
 27
 28        const prvKey = Buffer.from("0001020304050607080900010203040506070809000102030405060708090001", "hex");
 29
 30        const pubKey = eddsa.prv2pub(prvKey);
 31
 32        const signature = eddsa.signPoseidon(prvKey, msg);
 33
 34        assert(eddsa.verifyPoseidon(msg, signature, pubKey));
 35
 36        const input = {
 37            enabled: 1,
 38            Ax: F.toObject(pubKey[0]),
 39            Ay: F.toObject(pubKey[1]),
 40            R8x: F.toObject(signature.R8[0]),
 41            R8y: F.toObject(signature.R8[1]),
 42            S: signature.S,
 43            M: F.toObject(msg)
 44        };
 45
 46        // console.log(JSON.stringify(utils.stringifyBigInts(input)));
 47
 48        const w = await circuit.calculateWitness(input, true);
 49
 50        await circuit.checkConstraints(w);
 51    });
 52
 53    it("Detect Invalid signature", async () => {
 54        const msg = F.e(1234);
 55
 56        const prvKey = Buffer.from("0001020304050607080900010203040506070809000102030405060708090001", "hex");
 57
 58        const pubKey = eddsa.prv2pub(prvKey);
 59
 60
 61        const signature = eddsa.signPoseidon(prvKey, msg);
 62
 63        assert(eddsa.verifyPoseidon(msg, signature, pubKey));
 64        try {
 65            await circuit.calculateWitness({
 66                enabled: 1,
 67                Ax: F.toObject(pubKey[0]),
 68                Ay: F.toObject(pubKey[1]),
 69                R8x: F.toObject(F.add(signature.R8[0], F.e(1))),
 70                R8y: F.toObject(signature.R8[1]),
 71                S: signature.S,
 72                M: F.toObject(msg)}, true);
 73            assert(false);
 74        } catch(err) {
 75	    assert(err.message.includes("Assert Failed"));
 76        }
 77    });
 78
 79
 80    it("Test a dissabled circuit with a bad signature", async () => {
 81        const msg = F.e(1234);
 82
 83        const prvKey = Buffer.from("0001020304050607080900010203040506070809000102030405060708090001", "hex");
 84
 85        const pubKey = eddsa.prv2pub(prvKey);
 86
 87
 88        const signature = eddsa.signPoseidon(prvKey, msg);
 89
 90        assert(eddsa.verifyPoseidon(msg, signature, pubKey));
 91
 92        const w = await circuit.calculateWitness({
 93            enabled: 0,
 94            Ax: F.toObject(pubKey[0]),
 95            Ay: F.toObject(pubKey[1]),
 96            R8x: F.toObject(F.add(signature.R8[0], F.e(1))),
 97            R8y: F.toObject(signature.R8[1]),
 98            S: signature.S,
 99            M: F.toObject(msg)}, true);
100
101        await circuit.checkConstraints(w);
102    });
103});