pedersen working
This commit is contained in:
parent
b4cd3889b6
commit
4117ebc64a
@ -48,12 +48,14 @@ template BinSub(n) {
|
||||
var lin = 2**n;
|
||||
var lout = 0;
|
||||
|
||||
for (var i=0; i<n; i++) {
|
||||
var i;
|
||||
|
||||
for (i=0; i<n; i++) {
|
||||
lin = lin + in[0][i]*(2**i);
|
||||
lin = lin - in[1][i]*(2**i);
|
||||
}
|
||||
|
||||
for (var i=0; i<n; i++) {
|
||||
for (i=0; i<n; i++) {
|
||||
out[i] <-- (lin >> i) & 1;
|
||||
|
||||
// Ensure out is binary
|
||||
|
62
src/eddsa.js
62
src/eddsa.js
@ -1,11 +1,13 @@
|
||||
const createBlakeHash = require("blake-hash");
|
||||
const bigInt = require("snarkjs").bigInt;
|
||||
const bigInt = require("big-integer");
|
||||
const babyJub = require("./babyjub");
|
||||
const utils = require("./utils");
|
||||
const pedersenHash = require("./pedersenHash").hash;
|
||||
const mimc7 = require("./mimc7");
|
||||
const poseidon = require("./poseidon.js");
|
||||
const mimcsponge = require("./mimcsponge");
|
||||
|
||||
|
||||
exports.prv2pub= prv2pub;
|
||||
exports.sign = sign;
|
||||
exports.signMiMC = signMiMC;
|
||||
@ -30,26 +32,26 @@ function pruneBuffer(_buff) {
|
||||
|
||||
function prv2pub(prv) {
|
||||
const sBuff = pruneBuffer(createBlakeHash("blake512").update(prv).digest().slice(0,32));
|
||||
let s = bigInt.leBuff2int(sBuff);
|
||||
const A = babyJub.mulPointEscalar(babyJub.Base8, s.shr(3));
|
||||
let s = utils.leBuff2int(sBuff);
|
||||
const A = babyJub.mulPointEscalar(babyJub.Base8, s.shiftRight(3));
|
||||
return A;
|
||||
}
|
||||
|
||||
function sign(prv, msg) {
|
||||
const h1 = createBlakeHash("blake512").update(prv).digest();
|
||||
const sBuff = pruneBuffer(h1.slice(0,32));
|
||||
const s = bigInt.leBuff2int(sBuff);
|
||||
const A = babyJub.mulPointEscalar(babyJub.Base8, s.shr(3));
|
||||
const s = utils.leBuff2int(sBuff);
|
||||
const A = babyJub.mulPointEscalar(babyJub.Base8, s.shiftRight(3));
|
||||
|
||||
const rBuff = createBlakeHash("blake512").update(Buffer.concat([h1.slice(32,64), msg])).digest();
|
||||
let r = bigInt.leBuff2int(rBuff);
|
||||
let r = utils.leBuff2int(rBuff);
|
||||
r = r.mod(babyJub.subOrder);
|
||||
const R8 = babyJub.mulPointEscalar(babyJub.Base8, r);
|
||||
const R8p = babyJub.packPoint(R8);
|
||||
const Ap = babyJub.packPoint(A);
|
||||
const hmBuff = pedersenHash(Buffer.concat([R8p, Ap, msg]));
|
||||
const hm = bigInt.leBuff2int(hmBuff);
|
||||
const S = r.add(hm.mul(s)).mod(babyJub.subOrder);
|
||||
const hm = utils.leBuff2int(hmBuff);
|
||||
const S = r.add(hm.times(s)).mod(babyJub.subOrder);
|
||||
return {
|
||||
R8: R8,
|
||||
S: S
|
||||
@ -59,16 +61,16 @@ function sign(prv, msg) {
|
||||
function signMiMC(prv, msg) {
|
||||
const h1 = createBlakeHash("blake512").update(prv).digest();
|
||||
const sBuff = pruneBuffer(h1.slice(0,32));
|
||||
const s = bigInt.leBuff2int(sBuff);
|
||||
const A = babyJub.mulPointEscalar(babyJub.Base8, s.shr(3));
|
||||
const s = utils.leBuff2int(sBuff);
|
||||
const A = babyJub.mulPointEscalar(babyJub.Base8, s.shiftRight(3));
|
||||
|
||||
const msgBuff = bigInt.leInt2Buff(msg, 32);
|
||||
const msgBuff = utils.leInt2Buff(msg, 32);
|
||||
const rBuff = createBlakeHash("blake512").update(Buffer.concat([h1.slice(32,64), msgBuff])).digest();
|
||||
let r = bigInt.leBuff2int(rBuff);
|
||||
let r = utils.leBuff2int(rBuff);
|
||||
r = r.mod(babyJub.subOrder);
|
||||
const R8 = babyJub.mulPointEscalar(babyJub.Base8, r);
|
||||
const hm = mimc7.multiHash([R8[0], R8[1], A[0], A[1], msg]);
|
||||
const S = r.add(hm.mul(s)).mod(babyJub.subOrder);
|
||||
const S = r.add(hm.times(s)).mod(babyJub.subOrder);
|
||||
return {
|
||||
R8: R8,
|
||||
S: S
|
||||
@ -78,16 +80,16 @@ function signMiMC(prv, msg) {
|
||||
function signMiMCSponge(prv, msg) {
|
||||
const h1 = createBlakeHash("blake512").update(prv).digest();
|
||||
const sBuff = pruneBuffer(h1.slice(0,32));
|
||||
const s = bigInt.leBuff2int(sBuff);
|
||||
const A = babyJub.mulPointEscalar(babyJub.Base8, s.shr(3));
|
||||
const s = utils.leBuff2int(sBuff);
|
||||
const A = babyJub.mulPointEscalar(babyJub.Base8, s.shiftRight(3));
|
||||
|
||||
const msgBuff = bigInt.leInt2Buff(msg, 32);
|
||||
const msgBuff = utils.leInt2Buff(msg, 32);
|
||||
const rBuff = createBlakeHash("blake512").update(Buffer.concat([h1.slice(32,64), msgBuff])).digest();
|
||||
let r = bigInt.leBuff2int(rBuff);
|
||||
let r = utils.leBuff2int(rBuff);
|
||||
r = r.mod(babyJub.subOrder);
|
||||
const R8 = babyJub.mulPointEscalar(babyJub.Base8, r);
|
||||
const hm = mimcsponge.multiHash([R8[0], R8[1], A[0], A[1], msg]);
|
||||
const S = r.add(hm.mul(s)).mod(babyJub.subOrder);
|
||||
const S = r.add(hm.times(s)).mod(babyJub.subOrder);
|
||||
return {
|
||||
R8: R8,
|
||||
S: S
|
||||
@ -97,17 +99,17 @@ function signMiMCSponge(prv, msg) {
|
||||
function signPoseidon(prv, msg) {
|
||||
const h1 = createBlakeHash("blake512").update(prv).digest();
|
||||
const sBuff = pruneBuffer(h1.slice(0,32));
|
||||
const s = bigInt.leBuff2int(sBuff);
|
||||
const A = babyJub.mulPointEscalar(babyJub.Base8, s.shr(3));
|
||||
const s = utils.leBuff2int(sBuff);
|
||||
const A = babyJub.mulPointEscalar(babyJub.Base8, s.shiftRight(3));
|
||||
|
||||
const msgBuff = bigInt.leInt2Buff(msg, 32);
|
||||
const msgBuff = utils.leInt2Buff(msg, 32);
|
||||
const rBuff = createBlakeHash("blake512").update(Buffer.concat([h1.slice(32,64), msgBuff])).digest();
|
||||
let r = bigInt.leBuff2int(rBuff);
|
||||
let r = utils.leBuff2int(rBuff);
|
||||
r = r.mod(babyJub.subOrder);
|
||||
const R8 = babyJub.mulPointEscalar(babyJub.Base8, r);
|
||||
const hash = poseidon.createHash(6, 8, 57);
|
||||
const hm = hash([R8[0], R8[1], A[0], A[1], msg]);
|
||||
const S = r.add(hm.mul(s)).mod(babyJub.subOrder);
|
||||
const S = r.add(hm.times(s)).mod(babyJub.subOrder);
|
||||
return {
|
||||
R8: R8,
|
||||
S: S
|
||||
@ -128,10 +130,10 @@ function verify(msg, sig, A) {
|
||||
const R8p = babyJub.packPoint(sig.R8);
|
||||
const Ap = babyJub.packPoint(A);
|
||||
const hmBuff = pedersenHash(Buffer.concat([R8p, Ap, msg]));
|
||||
const hm = bigInt.leBuff2int(hmBuff);
|
||||
const hm = utils.leBuff2int(hmBuff);
|
||||
|
||||
const Pleft = babyJub.mulPointEscalar(babyJub.Base8, sig.S);
|
||||
let Pright = babyJub.mulPointEscalar(A, hm.mul(bigInt("8")));
|
||||
let Pright = babyJub.mulPointEscalar(A, hm.times(bigInt("8")));
|
||||
Pright = babyJub.addPoint(sig.R8, Pright);
|
||||
|
||||
if (!Pleft[0].equals(Pright[0])) return false;
|
||||
@ -153,7 +155,7 @@ function verifyMiMC(msg, sig, A) {
|
||||
const hm = mimc7.multiHash([sig.R8[0], sig.R8[1], A[0], A[1], msg]);
|
||||
|
||||
const Pleft = babyJub.mulPointEscalar(babyJub.Base8, sig.S);
|
||||
let Pright = babyJub.mulPointEscalar(A, hm.mul(bigInt("8")));
|
||||
let Pright = babyJub.mulPointEscalar(A, hm.times(bigInt("8")));
|
||||
Pright = babyJub.addPoint(sig.R8, Pright);
|
||||
|
||||
if (!Pleft[0].equals(Pright[0])) return false;
|
||||
@ -177,7 +179,7 @@ function verifyPoseidon(msg, sig, A) {
|
||||
const hm = hash([sig.R8[0], sig.R8[1], A[0], A[1], msg]);
|
||||
|
||||
const Pleft = babyJub.mulPointEscalar(babyJub.Base8, sig.S);
|
||||
let Pright = babyJub.mulPointEscalar(A, hm.mul(bigInt("8")));
|
||||
let Pright = babyJub.mulPointEscalar(A, hm.times(bigInt("8")));
|
||||
Pright = babyJub.addPoint(sig.R8, Pright);
|
||||
|
||||
if (!Pleft[0].equals(Pright[0])) return false;
|
||||
@ -199,7 +201,7 @@ function verifyMiMCSponge(msg, sig, A) {
|
||||
const hm = mimcsponge.multiHash([sig.R8[0], sig.R8[1], A[0], A[1], msg]);
|
||||
|
||||
const Pleft = babyJub.mulPointEscalar(babyJub.Base8, sig.S);
|
||||
let Pright = babyJub.mulPointEscalar(A, hm.mul(bigInt("8")));
|
||||
let Pright = babyJub.mulPointEscalar(A, hm.times(bigInt("8")));
|
||||
Pright = babyJub.addPoint(sig.R8, Pright);
|
||||
|
||||
if (!Pleft[0].equals(Pright[0])) return false;
|
||||
@ -209,14 +211,14 @@ function verifyMiMCSponge(msg, sig, A) {
|
||||
|
||||
function packSignature(sig) {
|
||||
const R8p = babyJub.packPoint(sig.R8);
|
||||
const Sp = bigInt.leInt2Buff(sig.S, 32);
|
||||
const Sp = utils.leInt2Buff(sig.S, 32);
|
||||
return Buffer.concat([R8p, Sp]);
|
||||
}
|
||||
|
||||
function unpackSignature(sigBuff) {
|
||||
return {
|
||||
R8: babyJub.unpackPoint(sigBuff.slice(0,32)),
|
||||
S: bigInt.leBuff2int(sigBuff.slice(32,64))
|
||||
S: utils.leBuff2int(sigBuff.slice(32,64))
|
||||
};
|
||||
}
|
||||
|
||||
|
17
src/mimc7.js
17
src/mimc7.js
@ -1,7 +1,8 @@
|
||||
const bn128 = require("snarkjs").bn128;
|
||||
const bigInt = require("snarkjs").bigInt;
|
||||
const bigInt = require("big-integer");
|
||||
const ZqField = require("fflib").ZqField;
|
||||
|
||||
const Web3Utils = require("web3-utils");
|
||||
const F = bn128.Fr;
|
||||
const F = new ZqField(bigInt("21888242871839275222246405745257275088548364400416034343698204186575808495617"));
|
||||
|
||||
const SEED = "mimc";
|
||||
const NROUNDS = 91;
|
||||
@ -10,7 +11,7 @@ exports.getIV = (seed) => {
|
||||
if (typeof seed === "undefined") seed = SEED;
|
||||
const c = Web3Utils.keccak256(seed+"_iv");
|
||||
const cn = bigInt(Web3Utils.toBN(c).toString());
|
||||
const iv = cn.mod(F.q);
|
||||
const iv = cn.mod(F.p);
|
||||
return iv;
|
||||
};
|
||||
|
||||
@ -22,7 +23,7 @@ exports.getConstants = (seed, nRounds) => {
|
||||
for (let i=1; i<nRounds; i++) {
|
||||
c = Web3Utils.keccak256(c);
|
||||
|
||||
const n1 = Web3Utils.toBN(c).mod(Web3Utils.toBN(F.q.toString()));
|
||||
const n1 = Web3Utils.toBN(c).mod(Web3Utils.toBN(F.p.toString()));
|
||||
const c2 = Web3Utils.padLeft(Web3Utils.toHex(n1), 64);
|
||||
cts[i] = bigInt(Web3Utils.toBN(c2).toString());
|
||||
}
|
||||
@ -39,9 +40,9 @@ exports.hash = (_x_in, _k) =>{
|
||||
for (let i=0; i<NROUNDS; i++) {
|
||||
const c = cts[i];
|
||||
const t = (i==0) ? F.add(x_in, k) : F.add(F.add(r, k), c);
|
||||
r = F.exp(t, 7);
|
||||
r = F.pow(t, 7);
|
||||
}
|
||||
return F.affine(F.add(r, k));
|
||||
return F.add(r, k);
|
||||
};
|
||||
|
||||
exports.multiHash = (arr, key) => {
|
||||
@ -60,5 +61,5 @@ exports.multiHash = (arr, key) => {
|
||||
exports.hash(bigInt(arr[i]), r)
|
||||
);
|
||||
}
|
||||
return F.affine(r);
|
||||
return r;
|
||||
};
|
||||
|
@ -1,5 +1,4 @@
|
||||
const bn128 = require("snarkjs").bn128;
|
||||
const bigInt = require("snarkjs").bigInt;
|
||||
const bigInt = require("big-integer");
|
||||
const babyJub = require("./babyjub");
|
||||
const createBlakeHash = require("blake-hash");
|
||||
|
||||
|
@ -1,8 +1,10 @@
|
||||
const bn128 = require("snarkjs").bn128;
|
||||
const bigInt = require("snarkjs").bigInt;
|
||||
const blake2b = require('blake2b');
|
||||
const bigInt = require("big-integer");
|
||||
const blake2b = require("blake2b");
|
||||
const assert = require("assert");
|
||||
const F = bn128.Fr;
|
||||
const ZqField = require("fflib").ZqField;
|
||||
const utils = require("./utils");
|
||||
|
||||
const F = new ZqField(bigInt("21888242871839275222246405745257275088548364400416034343698204186575808495617"));
|
||||
|
||||
const SEED = "poseidon";
|
||||
const NROUNDSF = 8;
|
||||
@ -12,11 +14,11 @@ const T = 6;
|
||||
function getPseudoRandom(seed, n) {
|
||||
const res = [];
|
||||
let input = Buffer.from(seed);
|
||||
let h = blake2b(32).update(input).digest()
|
||||
let h = blake2b(32).update(input).digest();
|
||||
while (res.length<n) {
|
||||
const n = F.affine(bigInt.leBuff2int(h));
|
||||
const n = F.normalize(utils.leBuff2int(h));
|
||||
res.push(n);
|
||||
h = blake2b(32).update(h).digest()
|
||||
h = blake2b(32).update(h).digest();
|
||||
}
|
||||
|
||||
return res;
|
||||
@ -48,7 +50,7 @@ exports.getMatrix = (t, seed, nRounds) => {
|
||||
for (let i=0; i<t; i++) {
|
||||
M[i] = new Array(t);
|
||||
for (let j=0; j<t; j++) {
|
||||
M[i][j] = F.affine(F.inverse(F.sub(cmatrix[i], cmatrix[t+j])));
|
||||
M[i][j] = F.normalize(F.inverse(F.sub(cmatrix[i], cmatrix[t+j])));
|
||||
}
|
||||
}
|
||||
return M;
|
||||
@ -109,7 +111,7 @@ exports.createHash = (t, nRoundsF, nRoundsP, seed) => {
|
||||
}
|
||||
mix(state, M);
|
||||
}
|
||||
return F.affine(state[0]);
|
||||
return F.normalize(state[0]);
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -1,55 +1,53 @@
|
||||
const chai = require("chai");
|
||||
const path = require("path");
|
||||
const snarkjs = require("snarkjs");
|
||||
const compiler = require("circom");
|
||||
|
||||
const assert = chai.assert;
|
||||
|
||||
const bigInt = snarkjs.bigInt;
|
||||
const bigInt = require("big-integer");
|
||||
const tester = require("circom").tester;
|
||||
|
||||
function print(circuit, w, s) {
|
||||
console.log(s + ": " + w[circuit.getSignalIdx(s)]);
|
||||
}
|
||||
|
||||
function checkSub(_a,_b, circuit) {
|
||||
async function checkSub(_a,_b, circuit) {
|
||||
let a=bigInt(_a);
|
||||
let b=bigInt(_b);
|
||||
if (a.lesser(bigInt.zero)) a = a.add(bigInt.one.shl(16));
|
||||
if (b.lesser(bigInt.zero)) b = b.add(bigInt.one.shl(16));
|
||||
const w = circuit.calculateWitness({a: a, b: b});
|
||||
if (a.lesser(bigInt.zero)) a = a.add(bigInt.one.shiftLeft(16));
|
||||
if (b.lesser(bigInt.zero)) b = b.add(bigInt.one.shiftLeft(16));
|
||||
const w = await circuit.calculateWitness({a: a, b: b});
|
||||
|
||||
let res = a.sub(b);
|
||||
if (res.lesser(bigInt.zero)) res = res.add(bigInt.one.shl(16));
|
||||
assert( w[circuit.getSignalIdx("main.out")].equals(bigInt(res)) );
|
||||
let res = a.minus(b);
|
||||
if (res.lesser(bigInt.zero)) res = res.add(bigInt.one.shiftLeft(16));
|
||||
await circuit.assertOut(w, {out: bigInt(res)});
|
||||
}
|
||||
|
||||
describe("BinSub test", () => {
|
||||
describe("BinSub test", function () {
|
||||
|
||||
this.timeout(100000);
|
||||
|
||||
let circuit;
|
||||
before( async() => {
|
||||
const cirDef = await compiler(path.join(__dirname, "circuits", "binsub_test.circom"));
|
||||
|
||||
circuit = new snarkjs.Circuit(cirDef);
|
||||
|
||||
console.log("NConstrains BinSub: " + circuit.nConstraints);
|
||||
circuit = await tester(path.join(__dirname, "circuits", "binsub_test.circom"));
|
||||
});
|
||||
|
||||
it("Should check variuos ege cases", async () => {
|
||||
checkSub(0,0, circuit);
|
||||
checkSub(1,0, circuit);
|
||||
checkSub(-1,0, circuit);
|
||||
checkSub(2,1, circuit);
|
||||
checkSub(2,2, circuit);
|
||||
checkSub(2,3, circuit);
|
||||
checkSub(2,-1, circuit);
|
||||
checkSub(2,-2, circuit);
|
||||
checkSub(2,-3, circuit);
|
||||
checkSub(-2,-3, circuit);
|
||||
checkSub(-2,-2, circuit);
|
||||
checkSub(-2,-1, circuit);
|
||||
checkSub(-2,0, circuit);
|
||||
checkSub(-2,1, circuit);
|
||||
checkSub(-2,2, circuit);
|
||||
checkSub(-2,3, circuit);
|
||||
await checkSub(0,0, circuit);
|
||||
await checkSub(1,0, circuit);
|
||||
await checkSub(-1,0, circuit);
|
||||
await checkSub(2,1, circuit);
|
||||
await checkSub(2,2, circuit);
|
||||
await checkSub(2,3, circuit);
|
||||
await checkSub(2,-1, circuit);
|
||||
await checkSub(2,-2, circuit);
|
||||
await checkSub(2,-3, circuit);
|
||||
await checkSub(-2,-3, circuit);
|
||||
await checkSub(-2,-2, circuit);
|
||||
await checkSub(-2,-1, circuit);
|
||||
await checkSub(-2,0, circuit);
|
||||
await checkSub(-2,1, circuit);
|
||||
await checkSub(-2,2, circuit);
|
||||
await checkSub(-2,3, circuit);
|
||||
});
|
||||
|
||||
|
||||
|
@ -1,35 +1,36 @@
|
||||
const chai = require("chai");
|
||||
const path = require("path");
|
||||
const snarkjs = require("snarkjs");
|
||||
const crypto = require("crypto");
|
||||
|
||||
const compiler = require("circom");
|
||||
const tester = require("circom").tester;
|
||||
|
||||
const bigInt = require("big-integer");
|
||||
|
||||
const assert = chai.assert;
|
||||
|
||||
describe("Sum test", () => {
|
||||
describe("Sum test", function () {
|
||||
|
||||
this.timeout(100000);
|
||||
|
||||
it("Should create a constant circuit", async () => {
|
||||
const circuit = await tester(path.join(__dirname, "circuits", "constants_test.circom"));
|
||||
|
||||
const cirDef = await compiler(path.join(__dirname, "circuits", "constants_test.circom"));
|
||||
assert.equal(cirDef.nVars, 2);
|
||||
// TODO
|
||||
// assert.equal(cirDef.nVars, 2);
|
||||
|
||||
const circuit = new snarkjs.Circuit(cirDef);
|
||||
const witness = await circuit.calculateWitness({ "in": bigInt("d807aa98", 16)});
|
||||
|
||||
const witness = circuit.calculateWitness({ "in": "0xd807aa98" });
|
||||
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt("0xd807aa98")));
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt("d807aa98", 16)));
|
||||
});
|
||||
it("Should create a sum circuit", async () => {
|
||||
const circuit = await tester(path.join(__dirname, "circuits", "sum_test.circom"));
|
||||
|
||||
const cirDef = await compiler(path.join(__dirname, "circuits", "sum_test.circom"));
|
||||
assert.equal(cirDef.nVars, 97); // 32 (in1) + 32(in2) + 32(out) + 1 (carry)
|
||||
// TODO
|
||||
// assert.equal(cirDef.nVars, 97); // 32 (in1) + 32(in2) + 32(out) + 1 (carry)
|
||||
|
||||
const circuit = new snarkjs.Circuit(cirDef);
|
||||
const witness = await circuit.calculateWitness({ "a": "111", "b": "222" });
|
||||
|
||||
const witness = circuit.calculateWitness({ "a": "111", "b": "222" });
|
||||
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt("333")));
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt("333")));
|
||||
});
|
||||
});
|
||||
|
@ -6,6 +6,8 @@ template A() {
|
||||
signal input b;
|
||||
signal output out;
|
||||
|
||||
var i;
|
||||
|
||||
component n2ba = Num2Bits(16);
|
||||
component n2bb = Num2Bits(16);
|
||||
component sub = BinSub(16);
|
||||
@ -14,9 +16,12 @@ template A() {
|
||||
n2ba.in <== a;
|
||||
n2bb.in <== b;
|
||||
|
||||
for (var i=0; i<16; i++) {
|
||||
for (i=0; i<16; i++) {
|
||||
sub.in[0][i] <== n2ba.out[i];
|
||||
sub.in[1][i] <== n2bb.out[i];
|
||||
}
|
||||
|
||||
for (i=0; i<16; i++) {
|
||||
b2n.in[i] <== sub.out[i];
|
||||
}
|
||||
|
||||
|
@ -1 +1 @@
|
||||
{"in":"3876493977147089964395646989418653640709890493868463039177063670701706079087","Ax":"7544364404313686108640297486043592597084907953513982229886192880342666171487","Ay":"2721089742146723067451923493488918617350881493409568860627491866568993834336"}
|
||||
{ "in": ["0", "0"]}
|
||||
|
5543
test/circuits/out.json
Normal file
5543
test/circuits/out.json
Normal file
File diff suppressed because it is too large
Load Diff
BIN
test/circuits/pedersen_test
Executable file
BIN
test/circuits/pedersen_test
Executable file
Binary file not shown.
51580
test/circuits/pedersen_test.cpp
Normal file
51580
test/circuits/pedersen_test.cpp
Normal file
File diff suppressed because it is too large
Load Diff
20
test/circuits/pedersen_test.dSYM/Contents/Info.plist
Normal file
20
test/circuits/pedersen_test.dSYM/Contents/Info.plist
Normal file
@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.apple.xcode.dsym.pedersen_test</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>dSYM</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
</dict>
|
||||
</plist>
|
Binary file not shown.
13108
test/circuits/pedersen_test.sym
Normal file
13108
test/circuits/pedersen_test.sym
Normal file
File diff suppressed because it is too large
Load Diff
@ -6,6 +6,8 @@ template A() {
|
||||
signal input b;
|
||||
signal output out;
|
||||
|
||||
var i;
|
||||
|
||||
component n2ba = Num2Bits(32);
|
||||
component n2bb = Num2Bits(32);
|
||||
component sum = BinSum(32,2);
|
||||
@ -14,9 +16,12 @@ template A() {
|
||||
n2ba.in <== a;
|
||||
n2bb.in <== b;
|
||||
|
||||
for (var i=0; i<32; i++) {
|
||||
for (i=0; i<32; i++) {
|
||||
sum.in[0][i] <== n2ba.out[i];
|
||||
sum.in[1][i] <== n2bb.out[i];
|
||||
}
|
||||
|
||||
for (i=0; i<32; i++) {
|
||||
b2n.in[i] <== sum.out[i];
|
||||
}
|
||||
|
||||
|
@ -1,193 +1,184 @@
|
||||
const chai = require("chai");
|
||||
const path = require("path");
|
||||
const snarkjs = require("snarkjs");
|
||||
const crypto = require("crypto");
|
||||
|
||||
const compiler = require("circom");
|
||||
const tester = require("circom").tester;
|
||||
|
||||
const bigInt = require("big-integer");
|
||||
|
||||
const assert = chai.assert;
|
||||
|
||||
describe("Sum test", () => {
|
||||
it("Should create a iszero circuit", async() => {
|
||||
const cirDef = await compiler(path.join(__dirname, "circuits", "iszero.circom"));
|
||||
describe("Sum test", function () {
|
||||
|
||||
const circuit = new snarkjs.Circuit(cirDef);
|
||||
this.timeout(100000);
|
||||
|
||||
it("Should create a iszero circuit", async() => {
|
||||
const circuit = await tester(path.join(__dirname, "circuits", "iszero.circom"));
|
||||
|
||||
let witness;
|
||||
witness = circuit.calculateWitness({ "in": 111});
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(0)));
|
||||
witness = await circuit.calculateWitness({ "in": 111});
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(0)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in": 0 });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(1)));
|
||||
witness = await circuit.calculateWitness({ "in": 0 });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(1)));
|
||||
});
|
||||
it("Should create a isequal circuit", async() => {
|
||||
const cirDef = await compiler(path.join(__dirname, "circuits", "isequal.circom"));
|
||||
|
||||
const circuit = new snarkjs.Circuit(cirDef);
|
||||
const circuit = await tester(path.join(__dirname, "circuits", "isequal.circom"));
|
||||
|
||||
let witness;
|
||||
witness = circuit.calculateWitness({ "in[0]": "111", "in[1]": "222" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(0)));
|
||||
witness = await circuit.calculateWitness({ "in": [111,222] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(0)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "444", "in[1]": "444" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(1)));
|
||||
witness = await circuit.calculateWitness({ "in": [444,444] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(1)));
|
||||
});
|
||||
it("Should create a comparison lessthan", async() => {
|
||||
const cirDef = await compiler(path.join(__dirname, "circuits", "lessthan.circom"));
|
||||
|
||||
const circuit = new snarkjs.Circuit(cirDef);
|
||||
const circuit = await tester(path.join(__dirname, "circuits", "lessthan.circom"));
|
||||
|
||||
let witness;
|
||||
witness = circuit.calculateWitness({ "in[0]": "333", "in[1]": "444" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(1)));
|
||||
witness = await circuit.calculateWitness({ "in": [333,444] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(1)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "1", "in[1]": "1" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(0)));
|
||||
witness = await circuit.calculateWitness({ "in":[1,1] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(0)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "661", "in[1]": "660" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(0)));
|
||||
witness = await circuit.calculateWitness({ "in": [661, 660] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(0)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "0", "in[1]": "1" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(1)));
|
||||
witness = await circuit.calculateWitness({ "in": [0, 1] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(1)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "0", "in[1]": "444" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(1)));
|
||||
witness = await circuit.calculateWitness({ "in": [0, 444] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(1)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "1", "in[1]": "0" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(0)));
|
||||
witness = await circuit.calculateWitness({ "in": [1, 0] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(0)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "555", "in[1]": "0" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(0)));
|
||||
witness = await circuit.calculateWitness({ "in": [555, 0] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(0)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "0", "in[1]": "0" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(0)));
|
||||
witness = await circuit.calculateWitness({ "in": [0, 0] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(0)));
|
||||
});
|
||||
it("Should create a comparison lesseqthan", async() => {
|
||||
const cirDef = await compiler(path.join(__dirname, "circuits", "lesseqthan.circom"));
|
||||
|
||||
const circuit = new snarkjs.Circuit(cirDef);
|
||||
const circuit = await tester(path.join(__dirname, "circuits", "lesseqthan.circom"));
|
||||
|
||||
let witness;
|
||||
witness = circuit.calculateWitness({ "in[0]": "333", "in[1]": "444" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(1)));
|
||||
witness = await circuit.calculateWitness({ "in": [333,444] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(1)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "1", "in[1]": "1" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(1)));
|
||||
witness = await circuit.calculateWitness({ "in":[1,1] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(1)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "661", "in[1]": "660" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(0)));
|
||||
witness = await circuit.calculateWitness({ "in": [661, 660] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(0)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "0", "in[1]": "1" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(1)));
|
||||
witness = await circuit.calculateWitness({ "in": [0, 1] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(1)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "0", "in[1]": "444" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(1)));
|
||||
witness = await circuit.calculateWitness({ "in": [0, 444] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(1)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "1", "in[1]": "0" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(0)));
|
||||
witness = await circuit.calculateWitness({ "in": [1, 0] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(0)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "555", "in[1]": "0" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(0)));
|
||||
witness = await circuit.calculateWitness({ "in": [555, 0] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(0)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "0", "in[1]": "0" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(1)));
|
||||
witness = await circuit.calculateWitness({ "in": [0, 0] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(1)));
|
||||
});
|
||||
it("Should create a comparison greaterthan", async() => {
|
||||
const cirDef = await compiler(path.join(__dirname, "circuits", "greaterthan.circom"));
|
||||
|
||||
const circuit = new snarkjs.Circuit(cirDef);
|
||||
const circuit = await tester(path.join(__dirname, "circuits", "greaterthan.circom"));
|
||||
|
||||
let witness;
|
||||
witness = circuit.calculateWitness({ "in[0]": "333", "in[1]": "444" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(0)));
|
||||
witness = await circuit.calculateWitness({ "in": [333,444] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(0)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "1", "in[1]": "1" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(0)));
|
||||
witness = await circuit.calculateWitness({ "in":[1,1] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(0)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "661", "in[1]": "660" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(1)));
|
||||
witness = await circuit.calculateWitness({ "in": [661, 660] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(1)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "0", "in[1]": "1" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(0)));
|
||||
witness = await circuit.calculateWitness({ "in": [0, 1] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(0)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "0", "in[1]": "444" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(0)));
|
||||
witness = await circuit.calculateWitness({ "in": [0, 444] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(0)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "1", "in[1]": "0" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(1)));
|
||||
witness = await circuit.calculateWitness({ "in": [1, 0] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(1)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "555", "in[1]": "0" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(1)));
|
||||
witness = await circuit.calculateWitness({ "in": [555, 0] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(1)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "0", "in[1]": "0" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(0)));
|
||||
witness = await circuit.calculateWitness({ "in": [0, 0] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(0)));
|
||||
});
|
||||
it("Should create a comparison greatereqthan", async() => {
|
||||
const cirDef = await compiler(path.join(__dirname, "circuits", "greatereqthan.circom"));
|
||||
|
||||
const circuit = new snarkjs.Circuit(cirDef);
|
||||
|
||||
console.log("NConstraints BalancesUpdater: " + circuit.nConstraints);
|
||||
const circuit = await tester(path.join(__dirname, "circuits", "greatereqthan.circom"));
|
||||
|
||||
let witness;
|
||||
witness = circuit.calculateWitness({ "in[0]": "333", "in[1]": "444" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(0)));
|
||||
witness = await circuit.calculateWitness({ "in": [333,444] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(0)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "1", "in[1]": "1" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(1)));
|
||||
witness = await circuit.calculateWitness({ "in":[1,1] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(1)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "661", "in[1]": "660" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(1)));
|
||||
witness = await circuit.calculateWitness({ "in": [661, 660] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(1)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "0", "in[1]": "1" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(0)));
|
||||
witness = await circuit.calculateWitness({ "in": [0, 1] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(0)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "0", "in[1]": "444" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(0)));
|
||||
witness = await circuit.calculateWitness({ "in": [0, 444] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(0)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "1", "in[1]": "0" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(1)));
|
||||
witness = await circuit.calculateWitness({ "in": [1, 0] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(1)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "555", "in[1]": "0" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(1)));
|
||||
witness = await circuit.calculateWitness({ "in": [555, 0] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(1)));
|
||||
|
||||
witness = circuit.calculateWitness({ "in[0]": "0", "in[1]": "0" });
|
||||
assert(witness[0].equals(snarkjs.bigInt(1)));
|
||||
assert(witness[1].equals(snarkjs.bigInt(1)));
|
||||
witness = await circuit.calculateWitness({ "in": [0, 0] });
|
||||
assert(witness[0].equals(bigInt(1)));
|
||||
assert(witness[1].equals(bigInt(1)));
|
||||
});
|
||||
});
|
||||
|
@ -1,16 +1,14 @@
|
||||
const chai = require("chai");
|
||||
const path = require("path");
|
||||
const snarkjs = require("snarkjs");
|
||||
const compiler = require("circom");
|
||||
// const crypto = require("crypto");
|
||||
|
||||
const tester = require("circom").tester;
|
||||
const bigInt = require("big-integer");
|
||||
|
||||
const eddsa = require("../src/eddsa.js");
|
||||
const babyJub = require("../src/babyjub.js");
|
||||
|
||||
const assert = chai.assert;
|
||||
|
||||
const bigInt = snarkjs.bigInt;
|
||||
|
||||
function print(circuit, w, s) {
|
||||
console.log(s + ": " + w[circuit.getSignalIdx(s)]);
|
||||
}
|
||||
@ -36,11 +34,7 @@ describe("EdDSA test", function () {
|
||||
this.timeout(100000);
|
||||
|
||||
before( async () => {
|
||||
const cirDef = await compiler(path.join(__dirname, "circuits", "eddsa_test.circom"));
|
||||
|
||||
circuit = new snarkjs.Circuit(cirDef);
|
||||
|
||||
console.log("NConstrains EdDSA: " + circuit.nConstraints);
|
||||
circuit = await tester(path.join(__dirname, "circuits", "eddsa_test.circom"));
|
||||
});
|
||||
|
||||
it("Sign a single 10 bytes from 0 to 9", async () => {
|
||||
@ -66,9 +60,10 @@ describe("EdDSA test", function () {
|
||||
const sBits = buffer2bits(pSignature.slice(32, 64));
|
||||
const aBits = buffer2bits(pPubKey);
|
||||
|
||||
const w = circuit.calculateWitness({A: aBits, R8: r8Bits, S: sBits, msg: msgBits});
|
||||
const w = await circuit.calculateWitness({A: aBits, R8: r8Bits, S: sBits, msg: msgBits});
|
||||
|
||||
assert(circuit.checkWitness(w));
|
||||
// TODO
|
||||
// assert(circuit.checkWitness(w));
|
||||
|
||||
});
|
||||
});
|
||||
|
@ -1,12 +1,12 @@
|
||||
const chai = require("chai");
|
||||
const snarkjs = require("snarkjs");
|
||||
|
||||
const eddsa = require("../src/eddsa.js");
|
||||
const babyJub = require("../src/babyjub.js");
|
||||
|
||||
const assert = chai.assert;
|
||||
|
||||
const bigInt = snarkjs.bigInt;
|
||||
const bigInt = require("big-integer");
|
||||
const utils = require("../src/utils.js");
|
||||
|
||||
describe("EdDSA js test", function () {
|
||||
|
||||
@ -14,7 +14,7 @@ describe("EdDSA js test", function () {
|
||||
|
||||
it("Sign (using Mimc7) a single 10 bytes from 0 to 9", () => {
|
||||
const msgBuf = Buffer.from("00010203040506070809", "hex");
|
||||
const msg = bigInt.leBuff2int(msgBuf);
|
||||
const msg = utils.leBuff2int(msgBuf);
|
||||
|
||||
// const prvKey = crypto.randomBytes(32);
|
||||
|
||||
@ -49,7 +49,7 @@ describe("EdDSA js test", function () {
|
||||
|
||||
it("Sign (using Poseidon) a single 10 bytes from 0 to 9", () => {
|
||||
const msgBuf = Buffer.from("00010203040506070809", "hex");
|
||||
const msg = bigInt.leBuff2int(msgBuf);
|
||||
const msg = utils.leBuff2int(msgBuf);
|
||||
|
||||
const prvKey = Buffer.from("0001020304050607080900010203040506070809000102030405060708090001", "hex");
|
||||
|
||||
|
@ -1,11 +1,8 @@
|
||||
const chai = require("chai");
|
||||
const path = require("path");
|
||||
const snarkjs = require("snarkjs");
|
||||
const compiler = require("circom");
|
||||
|
||||
const assert = chai.assert;
|
||||
|
||||
const bigInt = snarkjs.bigInt;
|
||||
const bigInt = require("big-integer");
|
||||
const tester = require("circom").tester;
|
||||
|
||||
const babyJub = require("../src/babyjub.js");
|
||||
|
||||
@ -22,79 +19,59 @@ describe("Double Pedersen test", function() {
|
||||
let circuit;
|
||||
this.timeout(100000);
|
||||
before( async() => {
|
||||
const cirDef = await compiler(path.join(__dirname, "circuits", "pedersen_test.circom"));
|
||||
|
||||
circuit = new snarkjs.Circuit(cirDef);
|
||||
circuit = await tester(path.join(__dirname, "circuits", "pedersen_test.circom"));
|
||||
|
||||
console.log("NConstrains: " + circuit.nConstraints);
|
||||
});
|
||||
it("Should pedersen at zero", async () => {
|
||||
|
||||
let w, xout, yout;
|
||||
let w;
|
||||
|
||||
w = circuit.calculateWitness({ in: ["0", "0"]});
|
||||
w = await circuit.calculateWitness({ in: ["0", "0"]});
|
||||
|
||||
xout = w[circuit.getSignalIdx("main.out[0]")];
|
||||
yout = w[circuit.getSignalIdx("main.out[1]")];
|
||||
await circuit.assertOut(w, {out: [0,1]});
|
||||
|
||||
assert(xout.equals("0"));
|
||||
assert(yout.equals("1"));
|
||||
});
|
||||
it("Should pedersen at one first generator", async () => {
|
||||
let w, xout, yout;
|
||||
let w;
|
||||
|
||||
w = circuit.calculateWitness({ in: ["1", "0"]});
|
||||
w = await circuit.calculateWitness({ in: ["1", "0"]});
|
||||
|
||||
xout = bigInt(w[circuit.getSignalIdx("main.out[0]")]);
|
||||
yout = bigInt(w[circuit.getSignalIdx("main.out[1]")]);
|
||||
await circuit.assertOut(w, {out: PBASE[0]});
|
||||
|
||||
assert(xout.equals(PBASE[0][0]));
|
||||
assert(yout.equals(PBASE[0][1]));
|
||||
});
|
||||
it("Should pedersen at one second generator", async () => {
|
||||
let w, xout, yout;
|
||||
let w;
|
||||
|
||||
w = circuit.calculateWitness({ in: ["0", "1"]});
|
||||
w = await circuit.calculateWitness({ in: ["0", "1"]});
|
||||
|
||||
xout = w[circuit.getSignalIdx("main.out[0]")];
|
||||
yout = w[circuit.getSignalIdx("main.out[1]")];
|
||||
|
||||
assert(xout.equals(PBASE[1][0]));
|
||||
assert(yout.equals(PBASE[1][1]));
|
||||
await circuit.assertOut(w, {out: PBASE[1]});
|
||||
|
||||
});
|
||||
it("Should pedersen at mixed generators", async () => {
|
||||
let w, xout, yout;
|
||||
w = circuit.calculateWitness({ in: ["3", "7"]});
|
||||
|
||||
xout = w[circuit.getSignalIdx("main.out[0]")];
|
||||
yout = w[circuit.getSignalIdx("main.out[1]")];
|
||||
|
||||
let w;
|
||||
w = await circuit.calculateWitness({ in: ["3", "7"]});
|
||||
|
||||
const r = babyJub.addPoint(
|
||||
babyJub.mulPointEscalar(PBASE[0], 3),
|
||||
babyJub.mulPointEscalar(PBASE[1], 7)
|
||||
);
|
||||
|
||||
assert(xout.equals(r[0]));
|
||||
assert(yout.equals(r[1]));
|
||||
await circuit.assertOut(w, {out: r});
|
||||
|
||||
});
|
||||
it("Should pedersen all ones", async () => {
|
||||
let w, xout, yout;
|
||||
let w;
|
||||
|
||||
const allOnes = bigInt("1").shl(250).sub(bigInt("1"));
|
||||
w = circuit.calculateWitness({ in: [allOnes, allOnes]});
|
||||
const allOnes = bigInt("1").shiftLeft(250).minus(bigInt("1"));
|
||||
w = await circuit.calculateWitness({ in: [allOnes, allOnes]});
|
||||
|
||||
xout = w[circuit.getSignalIdx("main.out[0]")];
|
||||
yout = w[circuit.getSignalIdx("main.out[1]")];
|
||||
|
||||
const r2 = babyJub.addPoint(
|
||||
babyJub.mulPointEscalar(PBASE[0], allOnes),
|
||||
babyJub.mulPointEscalar(PBASE[1], allOnes)
|
||||
);
|
||||
|
||||
assert(xout.equals(r2[0]));
|
||||
assert(yout.equals(r2[1]));
|
||||
await circuit.assertOut(w, {out: r2});
|
||||
});
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user