|
const path = require("path");
|
|
|
|
const chai = require("chai");
|
|
const assert = chai.assert;
|
|
|
|
const c_tester = require("circom_tester").c;
|
|
|
|
const utils = require("./utils");
|
|
|
|
describe("keccakfRound test", function () {
|
|
this.timeout(100000);
|
|
|
|
// apt install nlohmann-json3-dev
|
|
// apt install nasm
|
|
// apt install libgmp3-dev
|
|
|
|
it ("keccakfRound (testvector generated from go)", async () => {
|
|
const cir = await c_tester(path.join(__dirname, "circuits", "keccakfRound0_test.circom"));
|
|
await cir.loadConstraints();
|
|
// console.log("n_constraints", cir.constraints.length);
|
|
|
|
const input =
|
|
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24];
|
|
const expectedOut = utils.strsToBigInts(["26388279066651",
|
|
"246290629787648", "26388279902208", "25165850", "246290605457408",
|
|
"7784628352", "844424965783552", "2305843009213694083",
|
|
"844432714760192", "2305843009249345539", "637534226", "14848",
|
|
"641204224", "14354", "3670528", "6308236288", "2130304761856",
|
|
"648518346341354496", "6309216256", "648520476645130240",
|
|
"4611706359392501763", "792677514882318336", "20340965113972",
|
|
"4611732197915754499", "792633534417207412"]);
|
|
|
|
const stateIn = utils.u64ArrayToBits(input);
|
|
const expectedOutBits = utils.u64ArrayToBits(expectedOut);
|
|
|
|
const witness = await cir.calculateWitness({ "in": stateIn }, true);
|
|
|
|
const stateOut = witness.slice(1, 1+(25*64));
|
|
const stateOutU64 = utils.bitsToU64Array(stateOut);
|
|
// console.log(stateOutU64, expectedOut);
|
|
assert.deepEqual(stateOutU64, expectedOut);
|
|
});
|
|
|
|
it ("keccakfRound 20 (testvector generated from go)", async () => {
|
|
const cir = await c_tester(path.join(__dirname, "circuits", "keccakfRound20_test.circom"));
|
|
await cir.loadConstraints();
|
|
// console.log("n_constraints", cir.constraints.length);
|
|
|
|
const input = utils.strsToBigInts(["26388279066651", "246290629787648",
|
|
"26388279902208", "25165850", "246290605457408", "7784628352",
|
|
"844424965783552", "2305843009213694083", "844432714760192",
|
|
"2305843009249345539", "637534226", "14848", "641204224", "14354",
|
|
"3670528", "6308236288", "2130304761856", "648518346341354496",
|
|
"6309216256", "648520476645130240", "4611706359392501763",
|
|
"792677514882318336", "20340965113972", "4611732197915754499",
|
|
"792633534417207412"]);
|
|
const expectedOut = utils.strsToBigInts(["17728382861289829725",
|
|
"13654073086381141005", "9912591532945168756",
|
|
"2030068283137172501", "5084683018496047808", "151244976540463006",
|
|
"11718217461613725815", "11636071286320763433",
|
|
"15039144509240642782", "11629028282864249197",
|
|
"2594633730779457624", "14005558505838459171",
|
|
"4612881094252610438", "2828009553220809993",
|
|
"4838578484623267135", "1006588603063111352",
|
|
"11109191860075454495", "1187545859779038208",
|
|
"14661669042642437042", "5345317080454741069",
|
|
"8196674451365552863", "635818354583088260",
|
|
"13515759754032305626", "1708499319988748543",
|
|
"7509292798507899312"]);
|
|
|
|
const stateIn = utils.u64ArrayToBits(input);
|
|
const expectedOutBits = utils.u64ArrayToBits(expectedOut);
|
|
|
|
const witness = await cir.calculateWitness({ "in": stateIn }, true);
|
|
|
|
const stateOut = witness.slice(1, 1+(25*64));
|
|
const stateOutU64 = utils.bitsToU64Array(stateOut);
|
|
// console.log(stateOutU64, expectedOut);
|
|
assert.deepEqual(stateOutU64, expectedOut);
|
|
});
|
|
});
|
|
|
|
describe("keccakf test", function () {
|
|
this.timeout(100000);
|
|
|
|
let cir;
|
|
before(async () => {
|
|
cir = await c_tester(path.join(__dirname, "circuits", "keccakf_test.circom"));
|
|
await cir.loadConstraints();
|
|
console.log("n_constraints", cir.constraints.length);
|
|
});
|
|
|
|
it ("keccakf 1 (testvector generated from go)", async () => {
|
|
const input =
|
|
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24];
|
|
const expectedOut = utils.strsToBigInts(["9472389783892099349",
|
|
"2159377575142921216", "17826682512249813373",
|
|
"2325963263767348549", "15086930817298358378",
|
|
"11661812091723830419", "3517755057770134847",
|
|
"5223775837645169598", "933274647126506074", "3451250694486589320",
|
|
"825065683101361807", "6192414258352188799",
|
|
"14426505790672879210", "3326742392640380689",
|
|
"16749975585634164134", "17847697619892908514",
|
|
"11598434253200954839", "6049795840392747215",
|
|
"8610635351954084385", "18234131770974529925",
|
|
"15330347418010067760", "12047099911907354591",
|
|
"4763389569697138851", "6779624089296570504",
|
|
"15083668107635345971"]);
|
|
|
|
const stateIn = utils.u64ArrayToBits(input);
|
|
const expectedOutBits = utils.u64ArrayToBits(expectedOut);
|
|
|
|
const witness = await cir.calculateWitness({ "in": stateIn }, true);
|
|
|
|
const stateOut = witness.slice(1, 1+(25*64));
|
|
const stateOutU64 = utils.bitsToU64Array(stateOut);
|
|
// console.log(stateOutU64, expectedOut);
|
|
assert.deepEqual(stateOutU64, expectedOut);
|
|
});
|
|
|
|
it ("keccakf 2 (testvector generated from go)", async () => {
|
|
const input = utils.strsToBigInts(["9472389783892099349",
|
|
"2159377575142921216", "17826682512249813373",
|
|
"2325963263767348549", "15086930817298358378",
|
|
"11661812091723830419", "3517755057770134847",
|
|
"5223775837645169598", "933274647126506074", "3451250694486589320",
|
|
"825065683101361807", "6192414258352188799",
|
|
"14426505790672879210", "3326742392640380689",
|
|
"16749975585634164134", "17847697619892908514",
|
|
"11598434253200954839", "6049795840392747215",
|
|
"8610635351954084385", "18234131770974529925",
|
|
"15330347418010067760", "12047099911907354591",
|
|
"4763389569697138851", "6779624089296570504",
|
|
"15083668107635345971"]);
|
|
const expectedOut = utils.strsToBigInts(["269318771259381490",
|
|
"15892848561416382510", "12485559500958802382",
|
|
"4360182510883008729", "14284025675983944434",
|
|
"8800366419087562177", "7881853509112258378",
|
|
"9503857914080778528", "17110477940977988953",
|
|
"13825318756568052601", "11460650932194163315",
|
|
"13272167288297399439", "13599957064256729412",
|
|
"12730838251751851758", "13736647180617564382",
|
|
"5651695613583298166", "15496251216716036782",
|
|
"9748494184433838858", "3637745438296580159",
|
|
"3821184813198767406", "15603239432236101315",
|
|
"3726326332491237029", "7819962668913661099",
|
|
"2285898735263816116", "13518516210247555620"]);
|
|
|
|
const stateIn = utils.u64ArrayToBits(input);
|
|
const expectedOutBits = utils.u64ArrayToBits(expectedOut);
|
|
|
|
const witness = await cir.calculateWitness({ "in": stateIn }, true);
|
|
|
|
const stateOut = witness.slice(1, 1+(25*64));
|
|
const stateOutU64 = utils.bitsToU64Array(stateOut);
|
|
// console.log(stateOutU64, expectedOut);
|
|
assert.deepEqual(stateOutU64, expectedOut);
|
|
});
|
|
});
|