Blake to Blake2b and use of native big num

This commit is contained in:
Jordi Baylina 2020-04-18 22:33:59 +02:00
parent 6df6e9cb1c
commit b2ac4daaa7
No known key found for this signature in database
GPG Key ID: 7480C80C1BE43112
42 changed files with 572 additions and 1191 deletions

@ -177,17 +177,17 @@ template Pedersen(n) {
signal output out[2]; signal output out[2];
var BASE[10][2] = [ var BASE[10][2] = [
[10457101036533406547632367118273992217979173478358440826365724437999023779287,19824078218392094440610104313265183977899662750282163392862422243483260492317], [7688621503272331394947188562469131124099290577812125474996268020905176040083,6637287939860384587467947982369268811366630904563077767287326262235485629411],
[2671756056509184035029146175565761955751135805354291559563293617232983272177,2663205510731142763556352975002641716101654201788071096152948830924149045094], [11549681895645637778324638856880330712650895608496649854094912415387988201330,5771732722784528537721081267383956005090479808901717812009343940574217488577],
[5802099305472655231388284418920769829666717045250560929368476121199858275951,5980429700218124965372158798884772646841287887664001482443826541541529227896], [18790245153471844934157747708238883966079935875787657036767664036124524381945,18300275459419441151064576487317481499516933849631632883767173501999997278432],
[7107336197374528537877327281242680114152313102022415488494307685842428166594,2857869773864086953506483169737724679646433914307247183624878062391496185654], [16301069151422548986850494139112207641738464387919729729324473657161689764196,8215273507373494014441104012907835625670941526105528197815397741007626226499],
[20265828622013100949498132415626198973119240347465898028410217039057588424236,1160461593266035632937973507065134938065359936056410650153315956301179689506], [12597665704678284488008395353749282149622295037737374782196049599390683534185,4072455241781501621593714139281767473040087753548015968773801065193764079468],
[1487999857809287756929114517587739322941449154962237464737694709326309567994,14017256862867289575056460215526364897734808720610101650676790868051368668003], [4729410576230735258214831208080552588881894465489299233097088872252465832672,14367731890670510422926552586486424937476635415639602730590517235570020260326],
[14618644331049802168996997831720384953259095788558646464435263343433563860015,13115243279999696210147231297848654998887864576952244320558158620692603342236], [7546420686025050869200393054526306477146836870617678274607971529534032974471,8663210466512842901413293603100781938253817808912549776944118491282484711929],
[6814338563135591367010655964669793483652536871717891893032616415581401894627,13660303521961041205824633772157003587453809761793065294055279768121314853695], [6544653022506992755201027646251976600601201151329001772892901529509137954387,5932506509962692832681604586561215780097326378431958035490245111470435106811],
[3571615583211663069428808372184817973703476260057504149923239576077102575715,11981351099832644138306422070127357074117642951423551606012551622164230222506], [12376274813795671622507230443130412169480807188767687554607910279743333852725,10116389110458158800073166533660211332390835019644001845057351607297889034557],
[18597552580465440374022635246985743886550544261632147935254624835147509493269,6753322320275422086923032033899357299485124665258735666995435957890214041481] [18268098112071835140361074835791174816144587762778386397940339415400583397725,8120955462199046866292537174552276799123029303901205157708576578886090835495]
] ];
var nSegments = ((n-1)\200)+1; var nSegments = ((n-1)\200)+1;

@ -29,16 +29,16 @@ template Pedersen(n) {
component escalarMuls[nexps]; component escalarMuls[nexps];
var PBASE[10][2] = [ var PBASE[10][2] = [
[10457101036533406547632367118273992217979173478358440826365724437999023779287,19824078218392094440610104313265183977899662750282163392862422243483260492317], [7688621503272331394947188562469131124099290577812125474996268020905176040083,6637287939860384587467947982369268811366630904563077767287326262235485629411],
[2671756056509184035029146175565761955751135805354291559563293617232983272177,2663205510731142763556352975002641716101654201788071096152948830924149045094], [11549681895645637778324638856880330712650895608496649854094912415387988201330,5771732722784528537721081267383956005090479808901717812009343940574217488577],
[5802099305472655231388284418920769829666717045250560929368476121199858275951,5980429700218124965372158798884772646841287887664001482443826541541529227896], [18790245153471844934157747708238883966079935875787657036767664036124524381945,18300275459419441151064576487317481499516933849631632883767173501999997278432],
[7107336197374528537877327281242680114152313102022415488494307685842428166594,2857869773864086953506483169737724679646433914307247183624878062391496185654], [16301069151422548986850494139112207641738464387919729729324473657161689764196,8215273507373494014441104012907835625670941526105528197815397741007626226499],
[20265828622013100949498132415626198973119240347465898028410217039057588424236,1160461593266035632937973507065134938065359936056410650153315956301179689506], [12597665704678284488008395353749282149622295037737374782196049599390683534185,4072455241781501621593714139281767473040087753548015968773801065193764079468],
[1487999857809287756929114517587739322941449154962237464737694709326309567994,14017256862867289575056460215526364897734808720610101650676790868051368668003], [4729410576230735258214831208080552588881894465489299233097088872252465832672,14367731890670510422926552586486424937476635415639602730590517235570020260326],
[14618644331049802168996997831720384953259095788558646464435263343433563860015,13115243279999696210147231297848654998887864576952244320558158620692603342236], [7546420686025050869200393054526306477146836870617678274607971529534032974471,8663210466512842901413293603100781938253817808912549776944118491282484711929],
[6814338563135591367010655964669793483652536871717891893032616415581401894627,13660303521961041205824633772157003587453809761793065294055279768121314853695], [6544653022506992755201027646251976600601201151329001772892901529509137954387,5932506509962692832681604586561215780097326378431958035490245111470435106811],
[3571615583211663069428808372184817973703476260057504149923239576077102575715,11981351099832644138306422070127357074117642951423551606012551622164230222506], [12376274813795671622507230443130412169480807188767687554607910279743333852725,10116389110458158800073166533660211332390835019644001845057351607297889034557],
[18597552580465440374022635246985743886550544261632147935254624835147509493269,6753322320275422086923032033899357299485124665258735666995435957890214041481] [18268098112071835140361074835791174816144587762778386397940339415400583397725,8120955462199046866292537174552276799123029303901205157708576578886090835495]
]; ];
var i; var i;

@ -7,8 +7,6 @@ exports.pedersenHash = require("./src/pedersenHash");
exports.SMT = require("./src/smt").SMT; exports.SMT = require("./src/smt").SMT;
exports.SMTMemDB = require("./src/smt_memdb"); exports.SMTMemDB = require("./src/smt_memdb");
exports.poseidon = require("./src/poseidon"); exports.poseidon = require("./src/poseidon");
exports.leInt2Buff = require("./src/utils").leInt2Buff;
exports.leBuff2int = require("./src/utils").leBuff2int;

406
package-lock.json generated

@ -57,9 +57,9 @@
"integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
}, },
"@types/node": { "@types/node": {
"version": "12.12.31", "version": "12.12.36",
"resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.31.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.36.tgz",
"integrity": "sha512-T+wnJno8uh27G9c+1T+a1/WYCHzLeDqtsGJkoEdSp2X8RTh3oOCZQcUnjAx90CS8cmmADX51O0FI/tu9s0yssg==" "integrity": "sha512-hmmypvyO/uTLFYCYu6Hlb3ydeJ11vXRxg8/WJ0E3wvwmPO0y47VqnfmXFVuWlysO0Zyj+je1Y33rQeuYkZ51GQ=="
}, },
"@web3-js/scrypt-shim": { "@web3-js/scrypt-shim": {
"version": "0.1.0", "version": "0.1.0",
@ -292,16 +292,6 @@
"safe-buffer": "^5.1.1" "safe-buffer": "^5.1.1"
} }
}, },
"blake-hash": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/blake-hash/-/blake-hash-1.1.0.tgz",
"integrity": "sha512-rNbOFPT7DC/0XnLBJ0noWuzcV+9kHwEKzRGljHMDLQzYv6WZT1vjV3UkWQuNFzyr5tIL7zSsw7A834pgTl75xQ==",
"requires": {
"bindings": "^1.2.1",
"inherits": "^2.0.3",
"nan": "^2.2.1"
}
},
"blake2b": { "blake2b": {
"version": "2.1.3", "version": "2.1.3",
"resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.3.tgz", "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.3.tgz",
@ -448,9 +438,9 @@
} }
}, },
"buffer": { "buffer": {
"version": "5.5.0", "version": "5.6.0",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.5.0.tgz", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz",
"integrity": "sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==", "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==",
"requires": { "requires": {
"base64-js": "^1.0.2", "base64-js": "^1.0.2",
"ieee754": "^1.1.4" "ieee754": "^1.1.4"
@ -632,28 +622,27 @@
} }
}, },
"circom": { "circom": {
"version": "0.5.3", "version": "0.5.8",
"resolved": "https://registry.npmjs.org/circom/-/circom-0.5.3.tgz", "resolved": "https://registry.npmjs.org/circom/-/circom-0.5.8.tgz",
"integrity": "sha512-uKmcWE+qvy7+wJ4aXxv2cfNJxhdAV7NiXwCWsiBCzwhzFpA2P+JQQGgUj7C1GIMiJLNmmhx62jWnXW+fQ2PvBw==", "integrity": "sha512-NTp5R3qiNdtuF0SzZlnuKabrGRySR+uNK1+5ZIIpHUPLzIPXwle7sha/Jz1RDyHtV/z8yZNNVm6PXVoYuvnR3A==",
"requires": { "requires": {
"big-integer": "^1.6.32",
"chai": "^4.2.0", "chai": "^4.2.0",
"circom_runtime": "0.0.3", "circom_runtime": "0.0.5",
"ffiasm": "0.0.2", "ffiasm": "0.0.2",
"ffjavascript": "0.0.3", "ffjavascript": "0.1.0",
"ffwasm": "0.0.6", "ffwasm": "0.0.7",
"fnv-plus": "^1.3.1", "fnv-plus": "^1.3.1",
"r1csfile": "0.0.3", "r1csfile": "0.0.4",
"tmp-promise": "^2.0.2", "tmp-promise": "^2.0.2",
"wasmbuilder": "0.0.10" "wasmbuilder": "0.0.10"
} }
}, },
"circom_runtime": { "circom_runtime": {
"version": "0.0.3", "version": "0.0.5",
"resolved": "https://registry.npmjs.org/circom_runtime/-/circom_runtime-0.0.3.tgz", "resolved": "https://registry.npmjs.org/circom_runtime/-/circom_runtime-0.0.5.tgz",
"integrity": "sha512-z4ypbs9cTQn7+2FHZNTnccMj6kQCcKT2agYqCrm2kdLBJh9LDoxU1JVu5mSnVuOtgc7BclQ7r0xclG0zP2rxhw==", "integrity": "sha512-WEZHnRO1AJIDI2w1yX6rq4G1/MMKnExT3qirjBQR7x43i9Ww3E/wusBHTbXWLb8aYyxsBU07LGy0YXPywPGYvA==",
"requires": { "requires": {
"big-integer": "^1.6.48", "ffjavascript": "0.1.0",
"fnv-plus": "^1.3.1" "fnv-plus": "^1.3.1"
} }
}, },
@ -681,11 +670,6 @@
"mimic-response": "^1.0.0" "mimic-response": "^1.0.0"
} }
}, },
"code-point-at": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
},
"color-convert": { "color-convert": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@ -807,6 +791,7 @@
"version": "6.0.5", "version": "6.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
"integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
"dev": true,
"requires": { "requires": {
"nice-try": "^1.0.4", "nice-try": "^1.0.4",
"path-key": "^2.0.1", "path-key": "^2.0.1",
@ -870,9 +855,9 @@
"integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
}, },
"decompress": { "decompress": {
"version": "4.2.0", "version": "4.2.1",
"resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz",
"integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==",
"requires": { "requires": {
"decompress-tar": "^4.0.0", "decompress-tar": "^4.0.0",
"decompress-tarbz2": "^4.0.0", "decompress-tarbz2": "^4.0.0",
@ -1036,9 +1021,9 @@
} }
}, },
"dom-walk": { "dom-walk": {
"version": "0.1.1", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
"integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
}, },
"drbg.js": { "drbg.js": {
"version": "1.0.1", "version": "1.0.1",
@ -1070,9 +1055,9 @@
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
}, },
"ejs": { "ejs": {
"version": "3.0.1", "version": "3.0.2",
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.0.1.tgz", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.0.2.tgz",
"integrity": "sha512-cuIMtJwxvzumSAkqaaoGY/L6Fc/t6YvoP9/VIaK0V/CyqKLEQ8sqODmYfy/cjXEdZ9+OOL8TecbJu+1RsofGDw==" "integrity": "sha512-IncmUpn1yN84hy2shb0POJ80FWrfGNY0cxO9f4v+/sG7qcBvAtVWUA1IdzY/8EYUmOVhoKJVdJjNd3AZcnxOjA=="
}, },
"elliptic": { "elliptic": {
"version": "6.5.2", "version": "6.5.2",
@ -1173,7 +1158,8 @@
"escape-string-regexp": { "escape-string-regexp": {
"version": "1.0.5", "version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
}, },
"eslint": { "eslint": {
"version": "6.8.0", "version": "6.8.0",
@ -1504,9 +1490,9 @@
} }
}, },
"ethereum-bloom-filters": { "ethereum-bloom-filters": {
"version": "1.0.6", "version": "1.0.7",
"resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.6.tgz", "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.7.tgz",
"integrity": "sha512-dE9CGNzgOOsdh7msZirvv8qjHtnHpvBlKe2647kM8v+yeF71IRso55jpojemvHV+jMjr48irPWxMRaHuOWzAFA==", "integrity": "sha512-cDcJJSJ9GMAcURiAWO3DxIEhTL/uWqlQnvgKpuYQzYPrt/izuGU+1ntQmHt0IRq6ADoSYHFnB+aCEFIldjhkMQ==",
"requires": { "requires": {
"js-sha3": "^0.8.0" "js-sha3": "^0.8.0"
} }
@ -1557,9 +1543,9 @@
}, },
"dependencies": { "dependencies": {
"@types/node": { "@types/node": {
"version": "10.17.17", "version": "10.17.20",
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.17.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.20.tgz",
"integrity": "sha512-gpNnRnZP3VWzzj5k3qrpRC6Rk3H/uclhAVo1aIvwzK5p5cOrs9yEyQ8H/HBsBY0u5rrWxXEiVPQ0dEB6pkjE8Q==" "integrity": "sha512-XgDgo6W10SeGEAM0k7FosJpvLCynOTYns4Xk3J5HGrA+UI/bKZ30PGMzOP5Lh2zs4259I71FSYLAtjnx3qhObw=="
}, },
"elliptic": { "elliptic": {
"version": "6.3.3", "version": "6.3.3",
@ -1637,20 +1623,6 @@
"safe-buffer": "^5.1.1" "safe-buffer": "^5.1.1"
} }
}, },
"execa": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
"integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
"requires": {
"cross-spawn": "^6.0.0",
"get-stream": "^4.0.0",
"is-stream": "^1.1.0",
"npm-run-path": "^2.0.0",
"p-finally": "^1.0.0",
"signal-exit": "^3.0.0",
"strip-eof": "^1.0.0"
}
},
"express": { "express": {
"version": "4.17.1", "version": "4.17.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
@ -1790,17 +1762,17 @@
} }
}, },
"ffjavascript": { "ffjavascript": {
"version": "0.0.3", "version": "0.1.0",
"resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.0.3.tgz", "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.1.0.tgz",
"integrity": "sha512-uXbiC7cNbFzNJCdkGlbQf2d7GciY1ICMcBeAA7+D8RHPr9Y5zYiDRWtU5etjAV8TplE7eZQ9Iqd9ieFi0ARJLA==", "integrity": "sha512-dmKlUasSfvUcxBm8nCSKl2x7EFJsXA7OVP8XLFA03T2+6mAc3IiVLC2ambEVOcMOhyhl0vJfVZjM9f9d38D1rw==",
"requires": { "requires": {
"big-integer": "^1.6.48" "big-integer": "^1.6.48"
} }
}, },
"ffwasm": { "ffwasm": {
"version": "0.0.6", "version": "0.0.7",
"resolved": "https://registry.npmjs.org/ffwasm/-/ffwasm-0.0.6.tgz", "resolved": "https://registry.npmjs.org/ffwasm/-/ffwasm-0.0.7.tgz",
"integrity": "sha512-bEBKYANozdyZBCGE6XLg4s/CaJRZdFGQgbthy7EZ4OhNCIpycgklS5mlf88Bw4fXSddlU1V9iYXI4JwfGO3BhQ==", "integrity": "sha512-17cTLzv7HHAKqZbX8MvHxjSrR0yDdn1sh4TVsTbAvO9e6klhFicnyoVXc/sCuViV/M8g65sCmVrAmoPCZp1YkQ==",
"requires": { "requires": {
"big-integer": "^1.6.48", "big-integer": "^1.6.48",
"wasmbuilder": "0.0.10" "wasmbuilder": "0.0.10"
@ -2935,11 +2907,6 @@
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
}, },
"invert-kv": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
"integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA=="
},
"ipaddr.js": { "ipaddr.js": {
"version": "1.9.1", "version": "1.9.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
@ -3070,7 +3037,8 @@
"isexe": { "isexe": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
"dev": true
}, },
"isstream": { "isstream": {
"version": "0.1.2", "version": "0.1.2",
@ -3176,14 +3144,6 @@
"json-buffer": "3.0.0" "json-buffer": "3.0.0"
} }
}, },
"lcid": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
"integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
"requires": {
"invert-kv": "^2.0.0"
}
},
"levn": { "levn": {
"version": "0.3.0", "version": "0.3.0",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
@ -3237,14 +3197,6 @@
} }
} }
}, },
"map-age-cleaner": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
"integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
"requires": {
"p-defer": "^1.0.0"
}
},
"md5.js": { "md5.js": {
"version": "1.3.5", "version": "1.3.5",
"resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
@ -3260,16 +3212,6 @@
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
}, },
"mem": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
"integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
"requires": {
"map-age-cleaner": "^0.1.1",
"mimic-fn": "^2.0.0",
"p-is-promise": "^2.0.0"
}
},
"merge-descriptors": { "merge-descriptors": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
@ -3307,11 +3249,6 @@
"mime-db": "1.43.0" "mime-db": "1.43.0"
} }
}, },
"mimic-fn": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
"integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
},
"mimic-response": { "mimic-response": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
@ -3653,7 +3590,8 @@
"nice-try": { "nice-try": {
"version": "1.0.5", "version": "1.0.5",
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
"integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
"dev": true
}, },
"node-environment-flags": { "node-environment-flags": {
"version": "1.0.6", "version": "1.0.6",
@ -3676,19 +3614,6 @@
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
"integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ=="
}, },
"npm-run-path": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
"integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
"requires": {
"path-key": "^2.0.0"
}
},
"number-is-nan": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
},
"number-to-bn": { "number-to-bn": {
"version": "1.7.0", "version": "1.7.0",
"resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz",
@ -3787,16 +3712,6 @@
"word-wrap": "~1.2.3" "word-wrap": "~1.2.3"
} }
}, },
"os-locale": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
"integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
"requires": {
"execa": "^1.0.0",
"lcid": "^2.0.0",
"mem": "^4.0.0"
}
},
"os-tmpdir": { "os-tmpdir": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
@ -3808,21 +3723,11 @@
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
"integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw=="
}, },
"p-defer": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
"integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww="
},
"p-finally": { "p-finally": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
"integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
}, },
"p-is-promise": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
"integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg=="
},
"p-limit": { "p-limit": {
"version": "2.2.2", "version": "2.2.2",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
@ -3897,7 +3802,8 @@
"path-key": { "path-key": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
"integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
"dev": true
}, },
"path-to-regexp": { "path-to-regexp": {
"version": "0.1.7", "version": "0.1.7",
@ -4039,11 +3945,11 @@
} }
}, },
"r1csfile": { "r1csfile": {
"version": "0.0.3", "version": "0.0.4",
"resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.3.tgz", "resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.4.tgz",
"integrity": "sha512-TNrodnbHw5yAMv2gj0Ezf22XS3q8zGEjdPHZLBmJauIPFxm6QmyzxlB92yZ5WNkjEtJiS7p1hvkO9/RsJXRDjw==", "integrity": "sha512-1Y/zzzEjQVTR/gPlduRaKi2K+yU+UxqtsS+obDLEEb4WAzwCkKGybRfp037CUW5OApeleS1WdGmtKv9K9FPhsA==",
"requires": { "requires": {
"big-integer": "^1.6.48" "ffjavascript": "0.1.0"
} }
}, },
"randombytes": { "randombytes": {
@ -4262,7 +4168,8 @@
"semver": { "semver": {
"version": "5.7.1", "version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true
}, },
"send": { "send": {
"version": "0.17.1", "version": "0.17.1",
@ -4357,6 +4264,7 @@
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
"integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
"dev": true,
"requires": { "requires": {
"shebang-regex": "^1.0.0" "shebang-regex": "^1.0.0"
} }
@ -4364,12 +4272,14 @@
"shebang-regex": { "shebang-regex": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
"dev": true
}, },
"signal-exit": { "signal-exit": {
"version": "3.0.2", "version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
"dev": true
}, },
"simple-concat": { "simple-concat": {
"version": "1.0.0", "version": "1.0.0",
@ -4429,174 +4339,6 @@
} }
} }
}, },
"snarkjs": {
"version": "0.1.22",
"resolved": "https://registry.npmjs.org/snarkjs/-/snarkjs-0.1.22.tgz",
"integrity": "sha512-Z1ifCeSluzxbG6TLpI1eL7cCnG/7XVdmPw0ClvPc4Uu28Pp1nAikm9gbp1VnqmFYyJyop0sloS7uOv7UK/CXhQ==",
"requires": {
"big-integer": "^1.6.43",
"chai": "^4.2.0",
"circom_runtime": "0.0.3",
"escape-string-regexp": "^1.0.5",
"keccak": "^2.0.0",
"r1csfile": "0.0.1",
"yargs": "^12.0.5"
},
"dependencies": {
"ansi-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
"integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
},
"cliui": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
"integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
"requires": {
"string-width": "^2.1.1",
"strip-ansi": "^4.0.0",
"wrap-ansi": "^2.0.0"
}
},
"find-up": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
"requires": {
"locate-path": "^3.0.0"
}
},
"get-caller-file": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
"integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w=="
},
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
},
"locate-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
"requires": {
"p-locate": "^3.0.0",
"path-exists": "^3.0.0"
}
},
"p-locate": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
"integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
"requires": {
"p-limit": "^2.0.0"
}
},
"path-exists": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
"integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
},
"r1csfile": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.1.tgz",
"integrity": "sha512-1mUgD7XXpU/EAf4xWiIt1jaQbQuMBDKAiEJ2eZYsN9rHOJtBWZqLYDkAmC4WJhCwK3O3NZKhvRMaNBM5dBpp1Q=="
},
"require-main-filename": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
"integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
},
"string-width": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
"requires": {
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^4.0.0"
}
},
"strip-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"requires": {
"ansi-regex": "^3.0.0"
}
},
"wrap-ansi": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
"integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
"requires": {
"string-width": "^1.0.1",
"strip-ansi": "^3.0.1"
},
"dependencies": {
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
},
"is-fullwidth-code-point": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"requires": {
"number-is-nan": "^1.0.0"
}
},
"string-width": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
"strip-ansi": "^3.0.0"
}
},
"strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"requires": {
"ansi-regex": "^2.0.0"
}
}
}
},
"yargs": {
"version": "12.0.5",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
"integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
"requires": {
"cliui": "^4.0.0",
"decamelize": "^1.2.0",
"find-up": "^3.0.0",
"get-caller-file": "^1.0.1",
"os-locale": "^3.0.0",
"require-directory": "^2.1.1",
"require-main-filename": "^1.0.1",
"set-blocking": "^2.0.0",
"string-width": "^2.0.0",
"which-module": "^2.0.0",
"y18n": "^3.2.1 || ^4.0.0",
"yargs-parser": "^11.1.1"
}
},
"yargs-parser": {
"version": "11.1.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
"integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
"requires": {
"camelcase": "^5.0.0",
"decamelize": "^1.2.0"
}
}
}
},
"sprintf-js": { "sprintf-js": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@ -4690,11 +4432,6 @@
"is-natural-number": "^4.0.1" "is-natural-number": "^4.0.1"
} }
}, },
"strip-eof": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
"integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
},
"strip-hex-prefix": { "strip-hex-prefix": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz",
@ -4995,9 +4732,9 @@
"integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og=="
}, },
"unbzip2-stream": { "unbzip2-stream": {
"version": "1.3.3", "version": "1.4.1",
"resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.1.tgz",
"integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", "integrity": "sha512-sgDYfSDPMsA4Hr2/w7vOlrJBlwzmyakk1+hW8ObLvxSp0LA36LcL2XItGvOT3OSblohSdevMuT8FQjLsqyy4sA==",
"requires": { "requires": {
"buffer": "^5.2.1", "buffer": "^5.2.1",
"through": "^2.3.8" "through": "^2.3.8"
@ -5120,9 +4857,9 @@
}, },
"dependencies": { "dependencies": {
"@types/node": { "@types/node": {
"version": "10.17.17", "version": "10.17.20",
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.17.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.20.tgz",
"integrity": "sha512-gpNnRnZP3VWzzj5k3qrpRC6Rk3H/uclhAVo1aIvwzK5p5cOrs9yEyQ8H/HBsBY0u5rrWxXEiVPQ0dEB6pkjE8Q==" "integrity": "sha512-XgDgo6W10SeGEAM0k7FosJpvLCynOTYns4Xk3J5HGrA+UI/bKZ30PGMzOP5Lh2zs4259I71FSYLAtjnx3qhObw=="
} }
} }
}, },
@ -5392,6 +5129,7 @@
"version": "1.3.1", "version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
"requires": { "requires": {
"isexe": "^2.0.0" "isexe": "^2.0.0"
} }
@ -5516,11 +5254,11 @@
} }
}, },
"xhr-request-promise": { "xhr-request-promise": {
"version": "0.1.2", "version": "0.1.3",
"resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz", "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz",
"integrity": "sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0=", "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==",
"requires": { "requires": {
"xhr-request": "^1.0.1" "xhr-request": "^1.1.0"
} }
}, },
"xhr2-cookies": { "xhr2-cookies": {
@ -5575,9 +5313,9 @@
} }
}, },
"yargs-parser": { "yargs-parser": {
"version": "18.1.2", "version": "18.1.3",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
"integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
"requires": { "requires": {
"camelcase": "^5.0.0", "camelcase": "^5.0.0",
"decamelize": "^1.2.0" "decamelize": "^1.2.0"

@ -24,12 +24,9 @@
"author": "0Kims", "author": "0Kims",
"license": "GPL-3.0", "license": "GPL-3.0",
"dependencies": { "dependencies": {
"blake-hash": "^1.1.0",
"blake2b": "^2.1.3", "blake2b": "^2.1.3",
"circom": "0.5.3", "circom": "0.5.8",
"ffjavascript": "0.0.3", "ffjavascript": "0.1.0",
"snarkjs": "^0.1.22",
"typedarray-to-buffer": "^3.1.5",
"web3": "^1.2.6" "web3": "^1.2.6"
}, },
"devDependencies": { "devDependencies": {

@ -1,6 +1,6 @@
const bigInt = require("big-integer"); const F1Field = require("ffjavascript").F1Field;
const ZqField = require("ffjavascript").ZqField; const Scalar = require("ffjavascript").Scalar;
const utils = require("./utils.js"); const utils = require("ffjavascript").utils;
exports.addPoint = addPoint; exports.addPoint = addPoint;
exports.mulPointEscalar = mulPointEscalar; exports.mulPointEscalar = mulPointEscalar;
@ -8,23 +8,27 @@ exports.inCurve = inCurve;
exports.inSubgroup = inSubgroup; exports.inSubgroup = inSubgroup;
exports.packPoint = packPoint; exports.packPoint = packPoint;
exports.unpackPoint = unpackPoint; exports.unpackPoint = unpackPoint;
exports.p = Scalar.fromString("21888242871839275222246405745257275088548364400416034343698204186575808495617");
const F = new F1Field(exports.p);
exports.F = F;
exports.Generator = [ exports.Generator = [
bigInt("995203441582195749578291179787384436505546430278305826713579947235728471134"), F.e("995203441582195749578291179787384436505546430278305826713579947235728471134"),
bigInt("5472060717959818805561601436314318772137091100104008585924551046643952123905") F.e("5472060717959818805561601436314318772137091100104008585924551046643952123905")
]; ];
exports.Base8 = [ exports.Base8 = [
bigInt("5299619240641551281634865583518297030282874472190772894086521144482721001553"), F.e("5299619240641551281634865583518297030282874472190772894086521144482721001553"),
bigInt("16950150798460657717958625567821834550301663161624707787222815936182638968203") F.e("16950150798460657717958625567821834550301663161624707787222815936182638968203")
]; ];
exports.order = bigInt("21888242871839275222246405745257275088614511777268538073601725287587578984328"); exports.order = Scalar.fromString("21888242871839275222246405745257275088614511777268538073601725287587578984328");
exports.subOrder = exports.order.shiftRight(3); exports.subOrder = Scalar.shiftRight(exports.order, 3);
exports.p = bigInt("21888242871839275222246405745257275088548364400416034343698204186575808495617"); exports.A = F.e("168700");
exports.A = bigInt("168700"); exports.D = F.e("168696");
exports.D = bigInt("168696");
function addPoint(a,b) { function addPoint(a,b) {
const F = new ZqField(exports.p);
const res = []; const res = [];
@ -44,28 +48,28 @@ function addPoint(a,b) {
res[0] = F.div( res[0] = F.div(
F.add(beta, gamma), F.add(beta, gamma),
F.add(bigInt.one, dtau) F.add(F.one, dtau)
); );
res[1] = F.div( res[1] = F.div(
F.add(delta, F.sub(F.mul(exports.A,beta), gamma)), F.add(delta, F.sub(F.mul(exports.A,beta), gamma)),
F.sub(bigInt.one, dtau) F.sub(F.one, dtau)
); );
return res; return res;
} }
function mulPointEscalar(base, e) { function mulPointEscalar(base, e) {
let res = [bigInt("0"),bigInt("1")]; let res = [F.e("0"),F.e("1")];
let rem = bigInt(e); let rem = e;
let exp = base; let exp = base;
while (! rem.isZero()) { while (! Scalar.isZero(rem)) {
if (rem.isOdd()) { if (Scalar.isOdd(rem)) {
res = addPoint(res, exp); res = addPoint(res, exp);
} }
exp = addPoint(exp, exp); exp = addPoint(exp, exp);
rem = rem.shiftRight(1); rem = Scalar.shiftRight(rem, 1);
} }
return res; return res;
@ -74,11 +78,10 @@ function mulPointEscalar(base, e) {
function inSubgroup(P) { function inSubgroup(P) {
if (!inCurve(P)) return false; if (!inCurve(P)) return false;
const res= mulPointEscalar(P, exports.subOrder); const res= mulPointEscalar(P, exports.subOrder);
return (res[0].equals(bigInt(0))) && (res[1].equals(bigInt(1))); return (F.isZero(res[0]) && F.eq(res[1], F.one));
} }
function inCurve(P) { function inCurve(P) {
const F = new ZqField(exports.p);
const x2 = F.square(P[0]); const x2 = F.square(P[0]);
const y2 = F.square(P[1]); const y2 = F.square(P[1]);
@ -92,15 +95,13 @@ function inCurve(P) {
function packPoint(P) { function packPoint(P) {
const buff = utils.leInt2Buff(P[1], 32); const buff = utils.leInt2Buff(P[1], 32);
if (P[0].greater(exports.p.shiftRight(1))) { if (F.lt(P[0], F.zero)) {
buff[31] = buff[31] | 0x80; buff[31] = buff[31] | 0x80;
} }
return buff; return buff;
} }
function unpackPoint(_buff) { function unpackPoint(_buff) {
const F = new ZqField(exports.p);
const buff = Buffer.from(_buff); const buff = Buffer.from(_buff);
let sign = false; let sign = false;
const P = new Array(2); const P = new Array(2);
@ -109,7 +110,7 @@ function unpackPoint(_buff) {
buff[31] = buff[31] & 0x7F; buff[31] = buff[31] & 0x7F;
} }
P[1] = utils.leBuff2int(buff); P[1] = utils.leBuff2int(buff);
if (P[1].greaterOrEquals(exports.p)) return null; if (Scalar.gt(P[1], exports.p)) return null;
const y2 = F.square(P[1]); const y2 = F.square(P[1]);

@ -1,7 +1,8 @@
const createBlakeHash = require("blake-hash"); const blake2b = require("blake2b");
const bigInt = require("big-integer"); const Scalar = require("ffjavascript").Scalar;
const F1Field = require("ffjavascript").F1Field;
const babyJub = require("./babyjub"); const babyJub = require("./babyjub");
const utils = require("./utils"); const utils = require("ffjavascript").utils;
const pedersenHash = require("./pedersenHash").hash; const pedersenHash = require("./pedersenHash").hash;
const mimc7 = require("./mimc7"); const mimc7 = require("./mimc7");
const poseidon = require("./poseidon.js"); const poseidon = require("./poseidon.js");
@ -31,27 +32,28 @@ function pruneBuffer(_buff) {
} }
function prv2pub(prv) { function prv2pub(prv) {
const sBuff = pruneBuffer(createBlakeHash("blake512").update(prv).digest().slice(0,32)); const sBuff = pruneBuffer(blake2b(64).update(prv).digest().slice(0,32));
let s = utils.leBuff2int(sBuff); let s = utils.leBuff2int(sBuff);
const A = babyJub.mulPointEscalar(babyJub.Base8, s.shiftRight(3)); const A = babyJub.mulPointEscalar(babyJub.Base8, Scalar.shr(s,3));
return A; return A;
} }
function sign(prv, msg) { function sign(prv, msg) {
const h1 = createBlakeHash("blake512").update(prv).digest(); const h1 = Buffer.from(blake2b(64).update(prv).digest());
const sBuff = pruneBuffer(h1.slice(0,32)); const sBuff = pruneBuffer(h1.slice(0,32));
const s = utils.leBuff2int(sBuff); const s = utils.leBuff2int(sBuff);
const A = babyJub.mulPointEscalar(babyJub.Base8, s.shiftRight(3)); const A = babyJub.mulPointEscalar(babyJub.Base8, Scalar.shr(s, 3));
const rBuff = createBlakeHash("blake512").update(Buffer.concat([h1.slice(32,64), msg])).digest(); const rBuff = Buffer.from(blake2b(64).update(Buffer.concat([h1.slice(32,64), msg])).digest());
let r = utils.leBuff2int(rBuff); let r = utils.leBuff2int(rBuff);
r = r.mod(babyJub.subOrder); const Fr = new F1Field(babyJub.subOrder);
r = Fr.e(r);
const R8 = babyJub.mulPointEscalar(babyJub.Base8, r); const R8 = babyJub.mulPointEscalar(babyJub.Base8, r);
const R8p = babyJub.packPoint(R8); const R8p = babyJub.packPoint(R8);
const Ap = babyJub.packPoint(A); const Ap = babyJub.packPoint(A);
const hmBuff = pedersenHash(Buffer.concat([R8p, Ap, msg])); const hmBuff = pedersenHash(Buffer.concat([R8p, Ap, msg]));
const hm = utils.leBuff2int(hmBuff); const hm = utils.leBuff2int(hmBuff);
const S = r.add(hm.times(s)).mod(babyJub.subOrder); const S = Fr.add(r , Fr.mul(hm, s));
return { return {
R8: R8, R8: R8,
S: S S: S
@ -59,18 +61,19 @@ function sign(prv, msg) {
} }
function signMiMC(prv, msg) { function signMiMC(prv, msg) {
const h1 = createBlakeHash("blake512").update(prv).digest(); const h1 = Buffer.from(blake2b(64).update(prv).digest());
const sBuff = pruneBuffer(h1.slice(0,32)); const sBuff = pruneBuffer(h1.slice(0,32));
const s = utils.leBuff2int(sBuff); const s = utils.leBuff2int(sBuff);
const A = babyJub.mulPointEscalar(babyJub.Base8, s.shiftRight(3)); const A = babyJub.mulPointEscalar(babyJub.Base8, Scalar.shr(s, 3));
const msgBuff = utils.leInt2Buff(msg, 32); const msgBuff = utils.leInt2Buff(msg, 32);
const rBuff = createBlakeHash("blake512").update(Buffer.concat([h1.slice(32,64), msgBuff])).digest(); const rBuff = Buffer.from(blake2b(64).update(Buffer.concat([h1.slice(32,64), msgBuff])).digest());
let r = utils.leBuff2int(rBuff); let r = utils.leBuff2int(rBuff);
r = r.mod(babyJub.subOrder); const Fr = new F1Field(babyJub.subOrder);
r = Fr.e(r);
const R8 = babyJub.mulPointEscalar(babyJub.Base8, r); const R8 = babyJub.mulPointEscalar(babyJub.Base8, r);
const hm = mimc7.multiHash([R8[0], R8[1], A[0], A[1], msg]); const hm = mimc7.multiHash([R8[0], R8[1], A[0], A[1], msg]);
const S = r.add(hm.times(s)).mod(babyJub.subOrder); const S = Fr.add(r , Fr.mul(hm, s));
return { return {
R8: R8, R8: R8,
S: S S: S
@ -78,18 +81,19 @@ function signMiMC(prv, msg) {
} }
function signMiMCSponge(prv, msg) { function signMiMCSponge(prv, msg) {
const h1 = createBlakeHash("blake512").update(prv).digest(); const h1 = Buffer.from(blake2b(64).update(prv).digest());
const sBuff = pruneBuffer(h1.slice(0,32)); const sBuff = pruneBuffer(h1.slice(0,32));
const s = utils.leBuff2int(sBuff); const s = utils.leBuff2int(sBuff);
const A = babyJub.mulPointEscalar(babyJub.Base8, s.shiftRight(3)); const A = babyJub.mulPointEscalar(babyJub.Base8, Scalar.shr(s, 3));
const msgBuff = utils.leInt2Buff(msg, 32); const msgBuff = utils.leInt2Buff(msg, 32);
const rBuff = createBlakeHash("blake512").update(Buffer.concat([h1.slice(32,64), msgBuff])).digest(); const rBuff = Buffer.from(blake2b(64).update(Buffer.concat([h1.slice(32,64), msgBuff])).digest());
let r = utils.leBuff2int(rBuff); let r = utils.leBuff2int(rBuff);
r = r.mod(babyJub.subOrder); const Fr = new F1Field(babyJub.subOrder);
r = Fr.e(r);
const R8 = babyJub.mulPointEscalar(babyJub.Base8, r); const R8 = babyJub.mulPointEscalar(babyJub.Base8, r);
const hm = mimcsponge.multiHash([R8[0], R8[1], A[0], A[1], msg]); const hm = mimcsponge.multiHash([R8[0], R8[1], A[0], A[1], msg]);
const S = r.add(hm.times(s)).mod(babyJub.subOrder); const S = Fr.add(r , Fr.mul(hm, s));
return { return {
R8: R8, R8: R8,
S: S S: S
@ -97,19 +101,20 @@ function signMiMCSponge(prv, msg) {
} }
function signPoseidon(prv, msg) { function signPoseidon(prv, msg) {
const h1 = createBlakeHash("blake512").update(prv).digest(); const h1 = Buffer.from(blake2b(64).update(prv).digest());
const sBuff = pruneBuffer(h1.slice(0,32)); const sBuff = pruneBuffer(h1.slice(0,32));
const s = utils.leBuff2int(sBuff); const s = utils.leBuff2int(sBuff);
const A = babyJub.mulPointEscalar(babyJub.Base8, s.shiftRight(3)); const A = babyJub.mulPointEscalar(babyJub.Base8, Scalar.shr(s, 3));
const msgBuff = utils.leInt2Buff(msg, 32); const msgBuff = utils.leInt2Buff(msg, 32);
const rBuff = createBlakeHash("blake512").update(Buffer.concat([h1.slice(32,64), msgBuff])).digest(); const rBuff = Buffer.from(blake2b(64).update(Buffer.concat([h1.slice(32,64), msgBuff])).digest());
let r = utils.leBuff2int(rBuff); let r = utils.leBuff2int(rBuff);
r = r.mod(babyJub.subOrder); const Fr = new F1Field(babyJub.subOrder);
r = Fr.e(r);
const R8 = babyJub.mulPointEscalar(babyJub.Base8, r); const R8 = babyJub.mulPointEscalar(babyJub.Base8, r);
const hash = poseidon.createHash(6, 8, 57); const hash = poseidon.createHash(6, 8, 57);
const hm = hash([R8[0], R8[1], A[0], A[1], msg]); const hm = hash([R8[0], R8[1], A[0], A[1], msg]);
const S = r.add(hm.times(s)).mod(babyJub.subOrder); const S = Fr.add(r , Fr.mul(hm, s));
return { return {
R8: R8, R8: R8,
S: S S: S
@ -133,11 +138,11 @@ function verify(msg, sig, A) {
const hm = utils.leBuff2int(hmBuff); const hm = utils.leBuff2int(hmBuff);
const Pleft = babyJub.mulPointEscalar(babyJub.Base8, sig.S); const Pleft = babyJub.mulPointEscalar(babyJub.Base8, sig.S);
let Pright = babyJub.mulPointEscalar(A, hm.times(bigInt("8"))); let Pright = babyJub.mulPointEscalar(A, Scalar.mul(hm,8));
Pright = babyJub.addPoint(sig.R8, Pright); Pright = babyJub.addPoint(sig.R8, Pright);
if (!Pleft[0].equals(Pright[0])) return false; if (!babyJub.F.eq(Pleft[0],Pright[0])) return false;
if (!Pleft[1].equals(Pright[1])) return false; if (!babyJub.F.eq(Pleft[1],Pright[1])) return false;
return true; return true;
} }
@ -155,11 +160,11 @@ function verifyMiMC(msg, sig, A) {
const hm = mimc7.multiHash([sig.R8[0], sig.R8[1], A[0], A[1], msg]); const hm = mimc7.multiHash([sig.R8[0], sig.R8[1], A[0], A[1], msg]);
const Pleft = babyJub.mulPointEscalar(babyJub.Base8, sig.S); const Pleft = babyJub.mulPointEscalar(babyJub.Base8, sig.S);
let Pright = babyJub.mulPointEscalar(A, hm.times(bigInt("8"))); let Pright = babyJub.mulPointEscalar(A, Scalar.mul(hm, 8));
Pright = babyJub.addPoint(sig.R8, Pright); Pright = babyJub.addPoint(sig.R8, Pright);
if (!Pleft[0].equals(Pright[0])) return false; if (!babyJub.F.eq(Pleft[0],Pright[0])) return false;
if (!Pleft[1].equals(Pright[1])) return false; if (!babyJub.F.eq(Pleft[1],Pright[1])) return false;
return true; return true;
} }
@ -179,11 +184,11 @@ function verifyPoseidon(msg, sig, A) {
const hm = hash([sig.R8[0], sig.R8[1], A[0], A[1], msg]); const hm = hash([sig.R8[0], sig.R8[1], A[0], A[1], msg]);
const Pleft = babyJub.mulPointEscalar(babyJub.Base8, sig.S); const Pleft = babyJub.mulPointEscalar(babyJub.Base8, sig.S);
let Pright = babyJub.mulPointEscalar(A, hm.times(bigInt("8"))); let Pright = babyJub.mulPointEscalar(A, Scalar.mul(hm, 8));
Pright = babyJub.addPoint(sig.R8, Pright); Pright = babyJub.addPoint(sig.R8, Pright);
if (!Pleft[0].equals(Pright[0])) return false; if (!babyJub.F.eq(Pleft[0],Pright[0])) return false;
if (!Pleft[1].equals(Pright[1])) return false; if (!babyJub.F.eq(Pleft[1],Pright[1])) return false;
return true; return true;
} }
@ -204,8 +209,8 @@ function verifyMiMCSponge(msg, sig, A) {
let Pright = babyJub.mulPointEscalar(A, hm.times(bigInt("8"))); let Pright = babyJub.mulPointEscalar(A, hm.times(bigInt("8")));
Pright = babyJub.addPoint(sig.R8, Pright); Pright = babyJub.addPoint(sig.R8, Pright);
if (!Pleft[0].equals(Pright[0])) return false; if (!babyJub.F.eq(Pleft[0],Pright[0])) return false;
if (!Pleft[1].equals(Pright[1])) return false; if (!babyJub.F.eq(Pleft[1],Pright[1])) return false;
return true; return true;
} }

@ -4,7 +4,6 @@
const Contract = require("./evmasm"); const Contract = require("./evmasm");
const G2 = require("snarkjs").bn128.G2; const G2 = require("snarkjs").bn128.G2;
const bigInt = require("snarkjs").bigInt;
function toHex256(a) { function toHex256(a) {
@ -539,7 +538,7 @@ function createCode(P, w) {
function storeVals() { function storeVals() {
C.push(VAR_POINTS); // p C.push(VAR_POINTS); // p
for (let i=0; i<NPOINTS; i++) { for (let i=0; i<NPOINTS; i++) {
const MP = G2.affine(G2.mulScalar(P, bigInt(i))); const MP = G2.affine(G2.mulScalar(P, i));
for (let j=0; j<2; j++) { for (let j=0; j<2; j++) {
for (let k=0; k<2; k++) { for (let k=0; k<2; k++) {
C.push(toHex256(MP[j][k])); // MP[0][0] p C.push(toHex256(MP[j][k])); // MP[0][0] p

@ -1,8 +1,9 @@
const bigInt = require("big-integer"); const Scalar = require("ffjavascript").Scalar;
const ZqField = require("ffjavascript").ZqField; const ZqField = require("ffjavascript").ZqField;
const Web3Utils = require("web3-utils"); const Web3Utils = require("web3-utils");
const F = new ZqField(bigInt("21888242871839275222246405745257275088548364400416034343698204186575808495617")); const F = new ZqField(Scalar.fromString("21888242871839275222246405745257275088548364400416034343698204186575808495617"));
exports.F = F;
const SEED = "mimc"; const SEED = "mimc";
const NROUNDS = 91; const NROUNDS = 91;
@ -10,7 +11,7 @@ const NROUNDS = 91;
exports.getIV = (seed) => { exports.getIV = (seed) => {
if (typeof seed === "undefined") seed = SEED; if (typeof seed === "undefined") seed = SEED;
const c = Web3Utils.keccak256(seed+"_iv"); const c = Web3Utils.keccak256(seed+"_iv");
const cn = bigInt(Web3Utils.toBN(c).toString()); const cn = Scalar.FromString(Web3Utils.toBN(c).toString());
const iv = cn.mod(F.p); const iv = cn.mod(F.p);
return iv; return iv;
}; };
@ -25,17 +26,17 @@ exports.getConstants = (seed, nRounds) => {
const n1 = Web3Utils.toBN(c).mod(Web3Utils.toBN(F.p.toString())); const n1 = Web3Utils.toBN(c).mod(Web3Utils.toBN(F.p.toString()));
const c2 = Web3Utils.padLeft(Web3Utils.toHex(n1), 64); const c2 = Web3Utils.padLeft(Web3Utils.toHex(n1), 64);
cts[i] = bigInt(Web3Utils.toBN(c2).toString()); cts[i] = Scalar.fromString(Web3Utils.toBN(c2).toString());
} }
cts[0] = bigInt(0); cts[0] = F.e(0);
return cts; return cts;
}; };
const cts = exports.getConstants(SEED, 91); const cts = exports.getConstants(SEED, 91);
exports.hash = (_x_in, _k) =>{ exports.hash = (_x_in, _k) =>{
const x_in = bigInt(_x_in); const x_in = F.e(_x_in);
const k = bigInt(_k); const k = F.e(_k);
let r; let r;
for (let i=0; i<NROUNDS; i++) { for (let i=0; i<NROUNDS; i++) {
const c = cts[i]; const c = cts[i];
@ -58,7 +59,7 @@ exports.multiHash = (arr, key) => {
r, r,
arr[i] arr[i]
), ),
exports.hash(bigInt(arr[i]), r) exports.hash(F.e(arr[i]), r)
); );
} }
return r; return r;

@ -1,7 +1,7 @@
const bigInt = require("big-integer"); const Scalar = require("ffjavascript").Scalar
const Web3Utils = require("web3-utils"); const Web3Utils = require("web3-utils");
const ZqField = require("ffjavascript").ZqField; const ZqField = require("ffjavascript").ZqField;
const F = new ZqField(bigInt("21888242871839275222246405745257275088548364400416034343698204186575808495617")); const F = new ZqField(Scalar.fromString("21888242871839275222246405745257275088548364400416034343698204186575808495617"));
const SEED = "mimcsponge"; const SEED = "mimcsponge";
const NROUNDS = 220; const NROUNDS = 220;
@ -9,7 +9,7 @@ const NROUNDS = 220;
exports.getIV = (seed) => { exports.getIV = (seed) => {
if (typeof seed === "undefined") seed = SEED; if (typeof seed === "undefined") seed = SEED;
const c = Web3Utils.keccak256(seed+"_iv"); const c = Web3Utils.keccak256(seed+"_iv");
const cn = bigInt(Web3Utils.toBN(c).toString()); const cn = Scalar.fromString(Web3Utils.toBN(c).toString());
const iv = cn.mod(F.p); const iv = cn.mod(F.p);
return iv; return iv;
}; };
@ -24,23 +24,23 @@ exports.getConstants = (seed, nRounds) => {
const n1 = Web3Utils.toBN(c).mod(Web3Utils.toBN(F.p.toString())); const n1 = Web3Utils.toBN(c).mod(Web3Utils.toBN(F.p.toString()));
const c2 = Web3Utils.padLeft(Web3Utils.toHex(n1), 64); const c2 = Web3Utils.padLeft(Web3Utils.toHex(n1), 64);
cts[i] = bigInt(Web3Utils.toBN(c2).toString()); cts[i] = F.e(Web3Utils.toBN(c2).toString());
} }
cts[0] = bigInt(0); cts[0] = F.e(0);
cts[cts.length - 1] = bigInt(0); cts[cts.length - 1] = F.e(0);
return cts; return cts;
}; };
const cts = exports.getConstants(SEED, NROUNDS); const cts = exports.getConstants(SEED, NROUNDS);
exports.hash = (_xL_in, _xR_in, _k) =>{ exports.hash = (_xL_in, _xR_in, _k) =>{
let xL = bigInt(_xL_in); let xL = F.e(_xL_in);
let xR = bigInt(_xR_in); let xR = F.e(_xR_in);
const k = bigInt(_k); const k = F.e(_k);
for (let i=0; i<NROUNDS; i++) { for (let i=0; i<NROUNDS; i++) {
const c = cts[i]; const c = cts[i];
const t = (i==0) ? F.add(xL, k) : F.add(F.add(xL, k), c); const t = (i==0) ? F.add(xL, k) : F.add(F.add(xL, k), c);
const xR_tmp = bigInt(xR); const xR_tmp = F.e(xR);
if (i < (NROUNDS - 1)) { if (i < (NROUNDS - 1)) {
xR = xL; xR = xL;
xL = F.add(xR_tmp, F.pow(t, 5)); xL = F.add(xR_tmp, F.pow(t, 5));
@ -66,7 +66,7 @@ exports.multiHash = (arr, key, numOutputs) => {
let C = F.zero; let C = F.zero;
for (let i=0; i<arr.length; i++) { for (let i=0; i<arr.length; i++) {
R = F.add(R, bigInt(arr[i])); R = F.add(R, F.e(arr[i]));
const S = exports.hash(R, C, key); const S = exports.hash(R, C, key);
R = S.xL; R = S.xL;
C = S.xR; C = S.xR;

@ -1,6 +1,6 @@
const bigInt = require("big-integer");
const babyJub = require("./babyjub"); const babyJub = require("./babyjub");
const createBlakeHash = require("blake-hash"); const blake2b = require("blake2b");
const Scalar = require("ffjavascript").Scalar;
const GENPOINT_PREFIX = "PedersenGenerator"; const GENPOINT_PREFIX = "PedersenGenerator";
const windowSize = 4; const windowSize = 4;
@ -15,7 +15,7 @@ function pedersenHash(msg) {
const nSegments = Math.floor((bits.length - 1)/(windowSize*nWindowsPerSegment)) +1; const nSegments = Math.floor((bits.length - 1)/(windowSize*nWindowsPerSegment)) +1;
let accP = [bigInt.zero,bigInt.one]; let accP = [babyJub.F.zero,babyJub.F.one];
for (let s=0; s<nSegments; s++) { for (let s=0; s<nSegments; s++) {
let nWindows; let nWindows;
@ -24,29 +24,29 @@ function pedersenHash(msg) {
} else { } else {
nWindows = nWindowsPerSegment; nWindows = nWindowsPerSegment;
} }
let escalar = bigInt.zero; let escalar = Scalar.e(0);
let exp = bigInt.one; let exp = Scalar.e(1);
for (let w=0; w<nWindows; w++) { for (let w=0; w<nWindows; w++) {
let o = s*bitsPerSegment + w*windowSize; let o = s*bitsPerSegment + w*windowSize;
let acc = bigInt.one; let acc = Scalar.e(1);
for (let b=0; ((b<windowSize-1)&&(o<bits.length)) ; b++) { for (let b=0; ((b<windowSize-1)&&(o<bits.length)) ; b++) {
if (bits[o]) { if (bits[o]) {
acc = acc.add( bigInt.one.shiftLeft(b) ); acc = Scalar.add(acc, Scalar.shl(Scalar.e(1), b) );
} }
o++; o++;
} }
if (o<bits.length) { if (o<bits.length) {
if (bits[o]) { if (bits[o]) {
acc = bigInt.zero.minus(acc); acc = Scalar.neg(acc);
} }
o++; o++;
} }
escalar = escalar.add(acc.times(exp)); escalar = Scalar.add(escalar, Scalar.mul(acc, exp));
exp = exp.shiftLeft(windowSize+1); exp = Scalar.shl(exp, windowSize+1);
} }
if (escalar.lesser(bigInt.zero)) { if (Scalar.lt(escalar, 0)) {
escalar = babyJub.subOrder.add(escalar); escalar = Scalar.add( escalar, babyJub.subOrder);
} }
accP = babyJub.addPoint(accP, babyJub.mulPointEscalar(getBasePoint(s), escalar)); accP = babyJub.addPoint(accP, babyJub.mulPointEscalar(getBasePoint(s), escalar));
@ -63,7 +63,7 @@ function getBasePoint(pointIdx) {
let tryIdx = 0; let tryIdx = 0;
while (p==null) { while (p==null) {
const S = GENPOINT_PREFIX + "_" + padLeftZeros(pointIdx, 32) + "_" + padLeftZeros(tryIdx, 32); const S = GENPOINT_PREFIX + "_" + padLeftZeros(pointIdx, 32) + "_" + padLeftZeros(tryIdx, 32);
const h = createBlakeHash("blake256").update(S).digest(); const h = Buffer.from(blake2b(32).update(Buffer.from(S)).digest());
h[31] = h[31] & 0xBF; // Set 255th bit to 0 (256th is the signal and 254th is the last possible bit to 1) h[31] = h[31] & 0xBF; // Set 255th bit to 0 (256th is the signal and 254th is the last possible bit to 1)
p = babyJub.unpackPoint(h); p = babyJub.unpackPoint(h);
tryIdx++; tryIdx++;

@ -1,10 +1,11 @@
const bigInt = require("big-integer"); const Scalar = require("ffjavascript").Scalar;
const blake2b = require("blake2b"); const blake2b = require("blake2b");
const assert = require("assert"); const assert = require("assert");
const ZqField = require("ffjavascript").ZqField; const ZqField = require("ffjavascript").ZqField;
const utils = require("./utils"); const utils = require("ffjavascript").utils;
const F = new ZqField(bigInt("21888242871839275222246405745257275088548364400416034343698204186575808495617")); const F = new ZqField(Scalar.fromString("21888242871839275222246405745257275088548364400416034343698204186575808495617"));
exports.F = F;
const SEED = "poseidon"; const SEED = "poseidon";
const NROUNDSF = 8; const NROUNDSF = 8;
@ -16,7 +17,7 @@ function getPseudoRandom(seed, n) {
let input = Buffer.from(seed); let input = Buffer.from(seed);
let h = blake2b(32).update(input).digest(); let h = blake2b(32).update(input).digest();
while (res.length<n) { while (res.length<n) {
const n = F.normalize(utils.leBuff2int(h)); const n = F.normalize(utils.leBuff2int(Buffer.from(h)));
res.push(n); res.push(n);
h = blake2b(32).update(h).digest(); h = blake2b(32).update(h).digest();
} }
@ -26,9 +27,9 @@ function getPseudoRandom(seed, n) {
function allDifferent(v) { function allDifferent(v) {
for (let i=0; i<v.length; i++) { for (let i=0; i<v.length; i++) {
if (v[i].isZero()) return false; if (F.isZero(v[i])) return false;
for (let j=i+1; j<v.length; j++) { for (let j=i+1; j<v.length; j++) {
if (v[i].equals(v[j])) return false; if (F.eq(v[i],v[j])) return false;
} }
} }
return true; return true;
@ -101,7 +102,7 @@ exports.createHash = (t, nRoundsF, nRoundsP, seed) => {
let state = []; let state = [];
assert(inputs.length <= t); assert(inputs.length <= t);
assert(inputs.length > 0); assert(inputs.length > 0);
for (let i=0; i<inputs.length; i++) state[i] = bigInt(inputs[i]); for (let i=0; i<inputs.length; i++) state[i] = F.e(inputs[i]);
for (let i=inputs.length; i<t; i++) state[i] = F.zero; for (let i=inputs.length; i<t; i++) state[i] = F.zero;
for (let i=0; i< nRoundsF + nRoundsP; i++) { for (let i=0; i< nRoundsF + nRoundsP; i++) {

@ -1,7 +1,6 @@
const bigInt = require("big-integer"); const Scalar = require("ffjavascript").Scalar;
const SMTMemDB = require("./smt_memdb"); const SMTMemDB = require("./smt_memdb");
const {hash0, hash1} = require("./smt_hashes_poseidon"); const {hash0, hash1, F} = require("./smt_hashes_poseidon");
class SMT { class SMT {
@ -11,18 +10,7 @@ class SMT {
} }
_splitBits(_key) { _splitBits(_key) {
const res = Scalar.bits(_key);
let k = bigInt(_key);
const res = [];
while (!k.isZero()) {
if (k.isOdd()) {
res.push(true);
} else {
res.push(false);
}
k = k.shiftRight(1);
}
while (res.length<256) res.push(false); while (res.length<256) res.push(false);
@ -30,8 +18,8 @@ class SMT {
} }
async update(_key, _newValue) { async update(_key, _newValue) {
const key = bigInt(_key); const key = Scalar.e(_key);
const newValue = bigInt(_newValue); const newValue = F.e(_newValue);
const resFind = await this.find(key); const resFind = await this.find(key);
@ -79,7 +67,7 @@ class SMT {
} }
async delete(_key) { async delete(_key) {
const key = bigInt(_key); const key = Scalar.e(_key);
const resFind = await this.find(key); const resFind = await this.find(key);
if (!resFind.found) throw new Error("Key does not exists"); if (!resFind.found) throw new Error("Key does not exists");
@ -99,7 +87,7 @@ class SMT {
let mixed; let mixed;
if (resFind.siblings.length > 0) { if (resFind.siblings.length > 0) {
const record = await this.db.get(resFind.siblings[resFind.siblings.length - 1]); const record = await this.db.get(resFind.siblings[resFind.siblings.length - 1]);
if ((record.length == 3)&&(record[0].equals(bigInt.one))) { if ((record.length == 3)&&(F.eq(record[0], F.one))) {
mixed = false; mixed = false;
res.oldKey = record[1]; res.oldKey = record[1];
res.oldValue = record[2]; res.oldValue = record[2];
@ -108,16 +96,16 @@ class SMT {
} else if (record.length == 2) { } else if (record.length == 2) {
mixed = true; mixed = true;
res.oldKey = key; res.oldKey = key;
res.oldValue = bigInt(0); res.oldValue = F.zero;
res.isOld0 = true; res.isOld0 = true;
rtNew = bigInt.zero; rtNew = F.zero;
} else { } else {
throw new Error("Invalid node. Database corrupted"); throw new Error("Invalid node. Database corrupted");
} }
} else { } else {
rtNew = bigInt.zero; rtNew = F.zero;
res.oldKey = key; res.oldKey = key;
res.oldValue = bigInt(0); res.oldValue = F.zero;
res.isOld0 = true; res.isOld0 = true;
} }
@ -126,7 +114,7 @@ class SMT {
for (let level = resFind.siblings.length-1; level >=0; level--) { for (let level = resFind.siblings.length-1; level >=0; level--) {
let newSibling = resFind.siblings[level]; let newSibling = resFind.siblings[level];
if ((level == resFind.siblings.length-1)&&(!res.isOld0)) { if ((level == resFind.siblings.length-1)&&(!res.isOld0)) {
newSibling = bigInt.zero; newSibling = F.zero;
} }
const oldSibling = resFind.siblings[level]; const oldSibling = resFind.siblings[level];
if (keyBits[level]) { if (keyBits[level]) {
@ -135,7 +123,7 @@ class SMT {
rtOld = hash0(rtOld, oldSibling); rtOld = hash0(rtOld, oldSibling);
} }
dels.push(rtOld); dels.push(rtOld);
if (!newSibling.isZero()) { if (!F.isZero(newSibling)) {
mixed = true; mixed = true;
} }
@ -164,8 +152,8 @@ class SMT {
} }
async insert(_key, _value) { async insert(_key, _value) {
const key = bigInt(_key); const key = Scalar.e(_key);
const value = bigInt(_value); const value = F.e(_value);
let addedOne = false; let addedOne = false;
const res = {}; const res = {};
res.oldRoot = this.root; res.oldRoot = this.root;
@ -183,7 +171,7 @@ class SMT {
if (!resFind.isOld0) { if (!resFind.isOld0) {
const oldKeyits = this._splitBits(resFind.notFoundKey); const oldKeyits = this._splitBits(resFind.notFoundKey);
for (let i= res.siblings.length; oldKeyits[i] == newKeyBits[i]; i++) { for (let i= res.siblings.length; oldKeyits[i] == newKeyBits[i]; i++) {
res.siblings.push(bigInt.zero); res.siblings.push(F.zero);
} }
rtOld = hash1(resFind.notFoundKey, resFind.notFoundValue); rtOld = hash1(resFind.notFoundKey, resFind.notFoundValue);
res.siblings.push(rtOld); res.siblings.push(rtOld);
@ -191,7 +179,7 @@ class SMT {
mixed = false; mixed = false;
} else if (res.siblings.length >0) { } else if (res.siblings.length >0) {
mixed = true; mixed = true;
rtOld = bigInt.zero; rtOld = F.zero;
} }
const inserts = []; const inserts = [];
@ -201,7 +189,7 @@ class SMT {
inserts.push([rt,[1, key, value]] ); inserts.push([rt,[1, key, value]] );
for (let i=res.siblings.length-1; i>=0; i--) { for (let i=res.siblings.length-1; i>=0; i--) {
if ((i<res.siblings.length-1)&&(!res.siblings[i].isZero())) { if ((i<res.siblings.length-1)&&(!F.isZero(res.siblings[i]))) {
mixed = true; mixed = true;
} }
if (mixed) { if (mixed) {
@ -227,7 +215,7 @@ class SMT {
} }
if (addedOne) res.siblings.pop(); if (addedOne) res.siblings.pop();
while ((res.siblings.length>0) && (res.siblings[res.siblings.length-1].isZero())) { while ((res.siblings.length>0) && (F.isZero(res.siblings[res.siblings.length-1]))) {
res.siblings.pop(); res.siblings.pop();
} }
res.oldKey = resFind.notFoundKey; res.oldKey = resFind.notFoundKey;
@ -253,12 +241,12 @@ class SMT {
if (typeof root === "undefined") root = this.root; if (typeof root === "undefined") root = this.root;
let res; let res;
if (root.isZero()) { if (F.isZero(root)) {
res = { res = {
found: false, found: false,
siblings: [], siblings: [],
notFoundKey: key, notFoundKey: key,
notFoundValue: bigInt.zero, notFoundValue: F.zero,
isOld0: true isOld0: true
}; };
return res; return res;
@ -266,8 +254,8 @@ class SMT {
const record = await this.db.get(root); const record = await this.db.get(root);
if ((record.length==3)&&(record[0].equals(bigInt.one))) { if ((record.length==3)&&(F.eq(record[0],F.one))) {
if (record[1].equals(key)) { if (F.eq(record[1],key)) {
res = { res = {
found: true, found: true,
siblings: [], siblings: [],

@ -8,3 +8,5 @@ exports.hash0 = function (left, right) {
exports.hash1 = function(key, value) { exports.hash1 = function(key, value) {
return mimc7.multiHash([key, value], bigInt.one); return mimc7.multiHash([key, value], bigInt.one);
}; };
exports.F = mimc7.F;

@ -1,5 +1,4 @@
const Poseidon = require("./poseidon"); const Poseidon = require("./poseidon");
const bigInt = require("big-integer");
const hash = Poseidon.createHash(6, 8, 57); const hash = Poseidon.createHash(6, 8, 57);
@ -8,5 +7,7 @@ exports.hash0 = function (left, right) {
}; };
exports.hash1 = function(key, value) { exports.hash1 = function(key, value) {
return hash([key, value, bigInt.one]); return hash([key, value, Poseidon.F.one]);
}; };
exports.F = Poseidon.F;

@ -1,9 +1,11 @@
const bigInt = require("big-integer");
const F = require("./poseidon.js").F;
const Scalar = require("ffjavascript").Scalar;
class SMTMemDb { class SMTMemDb {
constructor() { constructor() {
this.nodes = {}; this.nodes = {};
this.root = bigInt(0); this.root = F.zero;
} }
async getRoot() { async getRoot() {
@ -12,13 +14,13 @@ class SMTMemDb {
_key2str(k) { _key2str(k) {
// const keyS = bigInt(key).leInt2Buff(32).toString("hex"); // const keyS = bigInt(key).leInt2Buff(32).toString("hex");
const keyS = bigInt(k).toString(); const keyS = Scalar.e(k);
return keyS; return keyS;
} }
_normalize(n) { _normalize(n) {
for (let i=0; i<n.length; i++) { for (let i=0; i<n.length; i++) {
n[i] = bigInt(n[i]); n[i] = F.e(n[i]);
} }
} }

@ -1,87 +0,0 @@
const bigInt = require("big-integer");
module.exports.leBuff2int = leBuff2int;
module.exports.leInt2Buff = leInt2Buff;
module.exports.beBuff2int = beBuff2int;
module.exports.beInt2Buff = beInt2Buff;
module.exports.stringifyBigInts = stringifyBigInts;
module.exports.unstringifyBigInts = unstringifyBigInts;
function leBuff2int (buff) {
let res = bigInt.zero;
for (let i=0; i<buff.length; i++) {
const n = bigInt(buff[i]);
res = res.add(n.shiftLeft(i*8));
}
return res;
}
function leInt2Buff(n, len) {
let r = n;
let o =0;
const buff = Buffer.alloc(len);
while ((r.gt(bigInt.zero))&&(o<buff.length)) {
let c = Number(r.and(bigInt(255)));
buff[o] = c;
o++;
r = r.shiftRight(8);
}
if (r.gt(bigInt.zero)) throw new Error("Number does not feed in buffer");
return buff;
}
function beBuff2int (buff) {
let res = bigInt.zero;
for (let i=0; i<buff.length; i++) {
const n = bigInt(buff[buff.length - i - 1]);
res = res.add(n.shiftLeft(i*8));
}
return res;
}
function beInt2Buff(n, len) {
let r = n;
let o =len-1;
const buff = Buffer.alloc(len);
while ((r.greater(bigInt.zero))&&(o>=0)) {
let c = Number(r.and(bigInt(255)));
buff[o] = c;
o--;
r = r.shiftRight(8);
}
if (r.gt(bigInt.zero)) throw new Error("Number does not feed in buffer");
return buff;
}
function stringifyBigInts(o) {
if ((typeof(o) == "bigint") || o.isZero !== undefined) {
return o.toString(10);
} else if (Array.isArray(o)) {
return o.map(stringifyBigInts);
} else if (typeof o == "object") {
const res = {};
for (let k in o) {
res[k] = stringifyBigInts(o[k]);
}
return res;
} else {
return o;
}
}
function unstringifyBigInts(o) {
if ((typeof(o) == "string") && (/^[0-9]+$/.test(o) )) {
return bigInt(o);
} else if (Array.isArray(o)) {
return o.map(unstringifyBigInts);
} else if (typeof o == "object") {
const res = {};
for (let k in o) {
res[k] = unstringifyBigInts(o[k]);
}
return res;
} else {
return o;
}
}

@ -3,7 +3,11 @@ const path = require("path");
const assert = chai.assert; const assert = chai.assert;
const bigInt = require("big-integer"); const Scalar = require("ffjavascript").Scalar;
const F1Field = require("ffjavascript").F1Field;
const utils = require("ffjavascript").utils;
const q = Scalar.fromString("21888242871839275222246405745257275088548364400416034343698204186575808495617");
const F = new F1Field(q);
const tester = require("circom").tester; const tester = require("circom").tester;
@ -14,16 +18,15 @@ function print(circuit, w, s) {
function getBits(v, n) { function getBits(v, n) {
const res = []; const res = [];
for (let i=0; i<n; i++) { for (let i=0; i<n; i++) {
if (v.shiftRight(i).isOdd()) { if (Scalar.isOdd(Scalar.shr(v,i))) {
res.push(bigInt.one); res.push(F.one);
} else { } else {
res.push(bigInt.zero); res.push(F.zero);
} }
} }
return res; return res;
} }
const q = bigInt("21888242871839275222246405745257275088548364400416034343698204186575808495617");
describe("Aliascheck test", function () { describe("Aliascheck test", function () {
this.timeout(100000); this.timeout(100000);
@ -35,17 +38,18 @@ describe("Aliascheck test", function () {
}); });
it("Satisfy the aliastest 0", async () => { it("Satisfy the aliastest 0", async () => {
const inp = getBits(bigInt.zero, 254); const inp = getBits(0, 254);
await cir.calculateWitness({in: inp}, true); await cir.calculateWitness({in: inp}, true);
}); });
it("Satisfy the aliastest 3", async () => { it("Satisfy the aliastest 3", async () => {
const inp = getBits(bigInt(3), 254); const inp = getBits(3, 254);
await cir.calculateWitness({in: inp}, true); await cir.calculateWitness({in: inp}, true);
}); });
it("Satisfy the aliastest q-1", async () => { it("Satisfy the aliastest q-1", async () => {
const inp = getBits(q.minus(bigInt.one), 254); const inp = getBits(F.minusone, 254);
// console.log(JSON.stringify(utils.stringifyBigInts(inp)));
await cir.calculateWitness({in: inp}, true); await cir.calculateWitness({in: inp}, true);
}); });
@ -61,7 +65,7 @@ describe("Aliascheck test", function () {
it("Should not satisfy all ones", async () => { it("Should not satisfy all ones", async () => {
const inp = getBits(bigInt(1).shiftLeft(254).minus(bigInt.one), 254); const inp = getBits(Scalar.sub(Scalar.shl(1, 254) , 1) , 254);
try { try {
await cir.calculateWitness({in: inp}, true); await cir.calculateWitness({in: inp}, true);
assert(false); assert(false);

@ -1,14 +1,15 @@
const chai = require("chai"); const chai = require("chai");
const path = require("path"); const path = require("path");
const createBlakeHash = require("blake-hash"); const blake2b = require("blake2b");
const eddsa = require("../src/eddsa.js"); const eddsa = require("../src/eddsa.js");
const F = require("../src/babyjub.js").F;
const assert = chai.assert; const assert = chai.assert;
const bigInt = require("big-integer");
const tester = require("circom").tester; const tester = require("circom").tester;
const utils = require("../src/utils.js"); const utils = require("ffjavascript").utils;
const Scalar = require("ffjavascript").Scalar;
describe("Baby Jub test", function () { describe("Baby Jub test", function () {
let circuitAdd; let circuitAdd;
@ -28,31 +29,31 @@ describe("Baby Jub test", function () {
it("Should add point (0,1) and (0,1)", async () => { it("Should add point (0,1) and (0,1)", async () => {
const input={ const input={
x1: bigInt(0), x1: F.e(0),
y1: bigInt(1), y1: F.e(1),
x2: bigInt(0), x2: F.e(0),
y2: bigInt(1) y2: F.e(1)
}; };
const w = await circuitAdd.calculateWitness(input, true); const w = await circuitAdd.calculateWitness(input, true);
await circuitAdd.assertOut(w, {xout: bigInt(0), yout: bigInt(1)}); await circuitAdd.assertOut(w, {xout: F.e(0), yout: F.e(1)});
}); });
it("Should add 2 same numbers", async () => { it("Should add 2 same numbers", async () => {
const input={ const input={
x1: bigInt("17777552123799933955779906779655732241715742912184938656739573121738514868268"), x1: F.e("17777552123799933955779906779655732241715742912184938656739573121738514868268"),
y1: bigInt("2626589144620713026669568689430873010625803728049924121243784502389097019475"), y1: F.e("2626589144620713026669568689430873010625803728049924121243784502389097019475"),
x2: bigInt("17777552123799933955779906779655732241715742912184938656739573121738514868268"), x2: F.e("17777552123799933955779906779655732241715742912184938656739573121738514868268"),
y2: bigInt("2626589144620713026669568689430873010625803728049924121243784502389097019475") y2: F.e("2626589144620713026669568689430873010625803728049924121243784502389097019475")
}; };
const w = await circuitAdd.calculateWitness(input, true); const w = await circuitAdd.calculateWitness(input, true);
await circuitAdd.assertOut(w, { await circuitAdd.assertOut(w, {
xout: bigInt("6890855772600357754907169075114257697580319025794532037257385534741338397365"), xout: F.e("6890855772600357754907169075114257697580319025794532037257385534741338397365"),
yout: bigInt("4338620300185947561074059802482547481416142213883829469920100239455078257889") yout: F.e("4338620300185947561074059802482547481416142213883829469920100239455078257889")
}); });
}); });
@ -60,17 +61,17 @@ describe("Baby Jub test", function () {
it("Should add 2 different numbers", async () => { it("Should add 2 different numbers", async () => {
const input={ const input={
x1: bigInt("17777552123799933955779906779655732241715742912184938656739573121738514868268"), x1: F.e("17777552123799933955779906779655732241715742912184938656739573121738514868268"),
y1: bigInt("2626589144620713026669568689430873010625803728049924121243784502389097019475"), y1: F.e("2626589144620713026669568689430873010625803728049924121243784502389097019475"),
x2: bigInt("16540640123574156134436876038791482806971768689494387082833631921987005038935"), x2: F.e("16540640123574156134436876038791482806971768689494387082833631921987005038935"),
y2: bigInt("20819045374670962167435360035096875258406992893633759881276124905556507972311") y2: F.e("20819045374670962167435360035096875258406992893633759881276124905556507972311")
}; };
const w = await circuitAdd.calculateWitness(input, true); const w = await circuitAdd.calculateWitness(input, true);
await circuitAdd.assertOut(w, { await circuitAdd.assertOut(w, {
xout: bigInt("7916061937171219682591368294088513039687205273691143098332585753343424131937"), xout: F.e("7916061937171219682591368294088513039687205273691143098332585753343424131937"),
yout: bigInt("14035240266687799601661095864649209771790948434046947201833777492504781204499") yout: F.e("14035240266687799601661095864649209771790948434046947201833777492504781204499")
}); });
}); });
@ -93,8 +94,8 @@ describe("Baby Jub test", function () {
it("Should extract the public key from the private one", async () => { it("Should extract the public key from the private one", async () => {
const rawpvk = Buffer.from("0001020304050607080900010203040506070809000102030405060708090021", "hex"); const rawpvk = Buffer.from("0001020304050607080900010203040506070809000102030405060708090021", "hex");
const pvk = eddsa.pruneBuffer(createBlakeHash("blake512").update(rawpvk).digest().slice(0,32)); const pvk = eddsa.pruneBuffer(Buffer.from(blake2b(64).update(rawpvk).digest().slice(0,32)));
const S = utils.leBuff2int(pvk).shiftRight(3); const S = Scalar.shr(utils.leBuff2int(pvk), 3);
const A = eddsa.prv2pub(rawpvk); const A = eddsa.prv2pub(rawpvk);

@ -1,6 +1,6 @@
const chai = require("chai"); const chai = require("chai");
const bigInt = require("big-integer");
const babyjub = require("../src/babyjub.js"); const babyjub = require("../src/babyjub.js");
const Scalar = require("ffjavascript").Scalar;
const assert = chai.assert; const assert = chai.assert;
@ -14,16 +14,16 @@ describe("Baby Jub js test", function () {
it("Should add point (0,1) and (0,1)", () => { it("Should add point (0,1) and (0,1)", () => {
const p1 = [ const p1 = [
bigInt(0), babyjub.F.e(0),
bigInt(1)]; babyjub.F.e(1)];
const p2 = [ const p2 = [
bigInt(0), babyjub.F.e(0),
bigInt(1) babyjub.F.e(1)
]; ];
const out = babyjub.addPoint(p1, p2); const out = babyjub.addPoint(p1, p2);
assert(out[0].equals(0)); assert(babyjub.F.eq(out[0], babyjub.F.zero));
assert(out[1].equals(1)); assert(babyjub.F.eq(out[1], babyjub.F.one));
}); });
it("Should base be 8*generator", () => { it("Should base be 8*generator", () => {
@ -32,50 +32,50 @@ describe("Baby Jub js test", function () {
res = babyjub.addPoint(res, res); res = babyjub.addPoint(res, res);
res = babyjub.addPoint(res, res); res = babyjub.addPoint(res, res);
assert(res[0].equals(babyjub.Base8[0])); assert(babyjub.F.eq(res[0], babyjub.Base8[0]));
assert(res[1].equals(babyjub.Base8[1])); assert(babyjub.F.eq(res[1], babyjub.Base8[1]));
}); });
it("Should add 2 same numbers", () => { it("Should add 2 same numbers", () => {
const p1 = [ const p1 = [
bigInt("17777552123799933955779906779655732241715742912184938656739573121738514868268"), babyjub.F.e("17777552123799933955779906779655732241715742912184938656739573121738514868268"),
bigInt("2626589144620713026669568689430873010625803728049924121243784502389097019475"), babyjub.F.e("2626589144620713026669568689430873010625803728049924121243784502389097019475"),
]; ];
const p2 = [ const p2 = [
bigInt("17777552123799933955779906779655732241715742912184938656739573121738514868268"), babyjub.F.e("17777552123799933955779906779655732241715742912184938656739573121738514868268"),
bigInt("2626589144620713026669568689430873010625803728049924121243784502389097019475"), babyjub.F.e("2626589144620713026669568689430873010625803728049924121243784502389097019475"),
]; ];
const out = babyjub.addPoint(p1, p2); const out = babyjub.addPoint(p1, p2);
assert(out[0].equals(bigInt("6890855772600357754907169075114257697580319025794532037257385534741338397365"))); assert(babyjub.F.eq(out[0], babyjub.F.e("6890855772600357754907169075114257697580319025794532037257385534741338397365")));
assert(out[1].equals(bigInt("4338620300185947561074059802482547481416142213883829469920100239455078257889"))); assert(babyjub.F.eq(out[1], babyjub.F.e("4338620300185947561074059802482547481416142213883829469920100239455078257889")));
}); });
it("Should add 2 different numbers", () => { it("Should add 2 different numbers", () => {
const p1 = [ const p1 = [
bigInt("17777552123799933955779906779655732241715742912184938656739573121738514868268"), babyjub.F.e("17777552123799933955779906779655732241715742912184938656739573121738514868268"),
bigInt("2626589144620713026669568689430873010625803728049924121243784502389097019475"), babyjub.F.e("2626589144620713026669568689430873010625803728049924121243784502389097019475"),
]; ];
const p2 = [ const p2 = [
bigInt("16540640123574156134436876038791482806971768689494387082833631921987005038935"), babyjub.F.e("16540640123574156134436876038791482806971768689494387082833631921987005038935"),
bigInt("20819045374670962167435360035096875258406992893633759881276124905556507972311"), babyjub.F.e("20819045374670962167435360035096875258406992893633759881276124905556507972311"),
]; ];
const out = babyjub.addPoint(p1, p2); const out = babyjub.addPoint(p1, p2);
assert(babyjub.F.eq(out[0], babyjub.F.e("7916061937171219682591368294088513039687205273691143098332585753343424131937")));
assert(babyjub.F.eq(out[1], babyjub.F.e("14035240266687799601661095864649209771790948434046947201833777492504781204499")));
assert(out[0].equals(bigInt("7916061937171219682591368294088513039687205273691143098332585753343424131937")));
assert(out[1].equals(bigInt("14035240266687799601661095864649209771790948434046947201833777492504781204499")));
}); });
it("should mulPointEscalar 0", () => { it("should mulPointEscalar 0", () => {
const p = [ const p = [
bigInt("17777552123799933955779906779655732241715742912184938656739573121738514868268"), babyjub.F.e("17777552123799933955779906779655732241715742912184938656739573121738514868268"),
bigInt("2626589144620713026669568689430873010625803728049924121243784502389097019475"), babyjub.F.e("2626589144620713026669568689430873010625803728049924121243784502389097019475"),
]; ];
const r = babyjub.mulPointEscalar(p, bigInt("3")); const r = babyjub.mulPointEscalar(p, 3);
let r2 = babyjub.addPoint(p, p); let r2 = babyjub.addPoint(p, p);
r2 = babyjub.addPoint(r2, p); r2 = babyjub.addPoint(r2, p);
assert.equal(r2[0].toString(), r[0].toString()); assert.equal(r2[0].toString(), r[0].toString());
@ -86,62 +86,62 @@ describe("Baby Jub js test", function () {
it("should mulPointEscalar 1", () => { it("should mulPointEscalar 1", () => {
const p = [ const p = [
bigInt("17777552123799933955779906779655732241715742912184938656739573121738514868268"), babyjub.F.e("17777552123799933955779906779655732241715742912184938656739573121738514868268"),
bigInt("2626589144620713026669568689430873010625803728049924121243784502389097019475"), babyjub.F.e("2626589144620713026669568689430873010625803728049924121243784502389097019475"),
]; ];
const r = babyjub.mulPointEscalar(p, bigInt("14035240266687799601661095864649209771790948434046947201833777492504781204499")); const r = babyjub.mulPointEscalar(p, Scalar.fromString("14035240266687799601661095864649209771790948434046947201833777492504781204499"));
assert.equal(r[0].toString(), "17070357974431721403481313912716834497662307308519659060910483826664480189605"); assert.equal(r[0].toString(), "17070357974431721403481313912716834497662307308519659060910483826664480189605");
assert.equal(r[1].toString(), "4014745322800118607127020275658861516666525056516280575712425373174125159339"); assert.equal(r[1].toString(), "4014745322800118607127020275658861516666525056516280575712425373174125159339");
}); });
it("should mulPointEscalar 2", () => { it("should mulPointEscalar 2", () => {
const p = [ const p = [
bigInt("6890855772600357754907169075114257697580319025794532037257385534741338397365"), babyjub.F.e("6890855772600357754907169075114257697580319025794532037257385534741338397365"),
bigInt("4338620300185947561074059802482547481416142213883829469920100239455078257889"), babyjub.F.e("4338620300185947561074059802482547481416142213883829469920100239455078257889"),
]; ];
const r = babyjub.mulPointEscalar(p, bigInt("20819045374670962167435360035096875258406992893633759881276124905556507972311")); const r = babyjub.mulPointEscalar(p, Scalar.fromString("20819045374670962167435360035096875258406992893633759881276124905556507972311"));
assert.equal(r[0].toString(), "13563888653650925984868671744672725781658357821216877865297235725727006259983"); assert.equal(r[0].toString(), "13563888653650925984868671744672725781658357821216877865297235725727006259983");
assert.equal(r[1].toString(), "8442587202676550862664528699803615547505326611544120184665036919364004251662"); assert.equal(r[1].toString(), "8442587202676550862664528699803615547505326611544120184665036919364004251662");
}); });
it("should inCurve 1", () => { it("should inCurve 1", () => {
const p = [ const p = [
bigInt("17777552123799933955779906779655732241715742912184938656739573121738514868268"), babyjub.F.e("17777552123799933955779906779655732241715742912184938656739573121738514868268"),
bigInt("2626589144620713026669568689430873010625803728049924121243784502389097019475"), babyjub.F.e("2626589144620713026669568689430873010625803728049924121243784502389097019475"),
]; ];
assert(babyjub.inCurve(p)); assert(babyjub.inCurve(p));
}); });
it("should inCurve 2", () => { it("should inCurve 2", () => {
const p = [ const p = [
bigInt("6890855772600357754907169075114257697580319025794532037257385534741338397365"), babyjub.F.e("6890855772600357754907169075114257697580319025794532037257385534741338397365"),
bigInt("4338620300185947561074059802482547481416142213883829469920100239455078257889"), babyjub.F.e("4338620300185947561074059802482547481416142213883829469920100239455078257889"),
]; ];
assert(babyjub.inCurve(p)); assert(babyjub.inCurve(p));
}); });
it("should inSubgroup 1", () => { it("should inSubgroup 1", () => {
const p = [ const p = [
bigInt("17777552123799933955779906779655732241715742912184938656739573121738514868268"), babyjub.F.e("17777552123799933955779906779655732241715742912184938656739573121738514868268"),
bigInt("2626589144620713026669568689430873010625803728049924121243784502389097019475"), babyjub.F.e("2626589144620713026669568689430873010625803728049924121243784502389097019475"),
]; ];
assert(babyjub.inSubgroup(p)); assert(babyjub.inSubgroup(p));
}); });
it("should inSubgroup 2", () => { it("should inSubgroup 2", () => {
const p = [ const p = [
bigInt("6890855772600357754907169075114257697580319025794532037257385534741338397365"), babyjub.F.e("6890855772600357754907169075114257697580319025794532037257385534741338397365"),
bigInt("4338620300185947561074059802482547481416142213883829469920100239455078257889"), babyjub.F.e("4338620300185947561074059802482547481416142213883829469920100239455078257889"),
]; ];
assert(babyjub.inSubgroup(p)); assert(babyjub.inSubgroup(p));
}); });
it("should packPoint - unpackPoint 1", () => { it("should packPoint - unpackPoint 1", () => {
const p = [ const p = [
bigInt("17777552123799933955779906779655732241715742912184938656739573121738514868268"), babyjub.F.e("17777552123799933955779906779655732241715742912184938656739573121738514868268"),
bigInt("2626589144620713026669568689430873010625803728049924121243784502389097019475"), babyjub.F.e("2626589144620713026669568689430873010625803728049924121243784502389097019475"),
]; ];
const buf = babyjub.packPoint(p); const buf = babyjub.packPoint(p);
assert.equal(buf.toString("hex"), "53b81ed5bffe9545b54016234682e7b2f699bd42a5e9eae27ff4051bc698ce85"); assert.equal(buf.toString("hex"), "53b81ed5bffe9545b54016234682e7b2f699bd42a5e9eae27ff4051bc698ce85");
@ -152,8 +152,8 @@ describe("Baby Jub js test", function () {
it("should packPoint - unpackPoint 2", () => { it("should packPoint - unpackPoint 2", () => {
const p = [ const p = [
bigInt("6890855772600357754907169075114257697580319025794532037257385534741338397365"), babyjub.F.e("6890855772600357754907169075114257697580319025794532037257385534741338397365"),
bigInt("4338620300185947561074059802482547481416142213883829469920100239455078257889"), babyjub.F.e("4338620300185947561074059802482547481416142213883829469920100239455078257889"),
]; ];
const buf = babyjub.packPoint(p); const buf = babyjub.packPoint(p);
assert.equal(buf.toString("hex"), "e114eb17eddf794f063a68fecac515e3620e131976108555735c8b0773929709"); assert.equal(buf.toString("hex"), "e114eb17eddf794f063a68fecac515e3620e131976108555735c8b0773929709");

@ -1,6 +1,7 @@
const path = require("path"); const path = require("path");
const bigInt = require("big-integer"); const Fr = require("ffjavascript").bn128.Fr;
const Scalar = require("ffjavascript").Scalar;
const tester = require("circom").tester; const tester = require("circom").tester;
function print(circuit, w, s) { function print(circuit, w, s) {
@ -8,15 +9,16 @@ function print(circuit, w, s) {
} }
async function checkSub(_a,_b, circuit) { async function checkSub(_a,_b, circuit) {
let a=bigInt(_a); let a=Scalar.e(_a);
let b=bigInt(_b); let b=Scalar.e(_b);
if (a.lesser(bigInt.zero)) a = a.add(bigInt.one.shiftLeft(16)); if (Scalar.lt(a, 0)) a = Scalar.add(a, Scalar.shl(1, 16));
if (b.lesser(bigInt.zero)) b = b.add(bigInt.one.shiftLeft(16)); if (Scalar.lt(b, 0)) b = Scalar.add(b, Scalar.shl(1, 16));
const w = await circuit.calculateWitness({a: a, b: b}, true); const w = await circuit.calculateWitness({a: a, b: b}, true);
let res = a.minus(b); let res = Scalar.sub(a, b);
if (res.lesser(bigInt.zero)) res = res.add(bigInt.one.shiftLeft(16)); if (Scalar.lt(res, 0)) res = Scalar.add(res, Scalar.shl(1, 16));
await circuit.assertOut(w, {out: bigInt(res)});
await circuit.assertOut(w, {out: res});
} }
describe("BinSub test", function () { describe("BinSub test", function () {

@ -3,7 +3,7 @@ const path = require("path");
const tester = require("circom").tester; const tester = require("circom").tester;
const bigInt = require("big-integer"); const Fr = require("ffjavascript").bn128.Fr;
const assert = chai.assert; const assert = chai.assert;
@ -18,10 +18,10 @@ describe("Binary sum test", function () {
assert.equal(circuit.nVars, 2); assert.equal(circuit.nVars, 2);
assert.equal(circuit.constraints.length, 1); assert.equal(circuit.constraints.length, 1);
const witness = await circuit.calculateWitness({ "in": bigInt("d807aa98", 16)}, true); const witness = await circuit.calculateWitness({ "in": Fr.e("d807aa98", 16)}, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0],Fr.e(1)));
assert(witness[1].equals(bigInt("d807aa98", 16))); assert(Fr.eq(witness[1],Fr.e("d807aa98", 16)));
}); });
it("Should create a sum circuit", async () => { it("Should create a sum circuit", async () => {
const circuit = await tester(path.join(__dirname, "circuits", "sum_test.circom")); const circuit = await tester(path.join(__dirname, "circuits", "sum_test.circom"));
@ -31,7 +31,7 @@ describe("Binary sum test", function () {
const witness = await circuit.calculateWitness({ "a": "111", "b": "222" }, true); const witness = await circuit.calculateWitness({ "a": "111", "b": "222" }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0],Fr.e(1)));
assert(witness[1].equals(bigInt("333"))); assert(Fr.eq(witness[1],Fr.e("333")));
}); });
}); });

@ -1,258 +0,0 @@
{
"in": [
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1",
"1"
]
}

@ -3,7 +3,7 @@ const path = require("path");
const tester = require("circom").tester; const tester = require("circom").tester;
const bigInt = require("big-integer"); const Fr = require("ffjavascript").bn128.Fr;
const assert = chai.assert; const assert = chai.assert;
@ -16,60 +16,61 @@ describe("Comparators test", function () {
let witness; let witness;
witness = await circuit.calculateWitness({ "in": 111}, true); witness = await circuit.calculateWitness({ "in": 111}, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(0))); assert(Fr.eq(witness[1], Fr.e(0)));
witness = await circuit.calculateWitness({ "in": 0 }, true); witness = await circuit.calculateWitness({ "in": 0 }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(1))); assert(Fr.eq(witness[1], Fr.e(1)));
}); });
it("Should create a isequal circuit", async() => { it("Should create a isequal circuit", async() => {
const circuit = await tester(path.join(__dirname, "circuits", "isequal.circom")); const circuit = await tester(path.join(__dirname, "circuits", "isequal.circom"));
let witness; let witness;
witness = await circuit.calculateWitness({ "in": [111,222] }, true); witness = await circuit.calculateWitness({ "in": [111,222] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(0))); assert(Fr.eq(witness[1], Fr.e(0)));
witness = await circuit.calculateWitness({ "in": [444,444] }, true); witness = await circuit.calculateWitness({ "in": [444,444] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(1))); assert(Fr.eq(witness[1], Fr.e(1)));
}); });
it("Should create a comparison lessthan", async() => { it("Should create a comparison lessthan", async() => {
const circuit = await tester(path.join(__dirname, "circuits", "lessthan.circom")); const circuit = await tester(path.join(__dirname, "circuits", "lessthan.circom"));
let witness; let witness;
witness = await circuit.calculateWitness({ "in": [333,444] }), true; witness = await circuit.calculateWitness({ "in": [333,444] }), true;
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(1))); assert(Fr.eq(witness[1], Fr.e(1)));
witness = await circuit.calculateWitness({ "in":[1,1] }, true); witness = await circuit.calculateWitness({ "in":[1,1] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(0))); assert(Fr.eq(witness[1], Fr.e(0)));
witness = await circuit.calculateWitness({ "in": [661, 660] }, true); witness = await circuit.calculateWitness({ "in": [661, 660] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(0))); assert(Fr.eq(witness[1], Fr.e(0)));
witness = await circuit.calculateWitness({ "in": [0, 1] }, true); witness = await circuit.calculateWitness({ "in": [0, 1] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(1))); assert(Fr.eq(witness[1], Fr.e(1)));
witness = await circuit.calculateWitness({ "in": [0, 444] }, true); witness = await circuit.calculateWitness({ "in": [0, 444] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(1))); assert(Fr.eq(witness[1], Fr.e(1)));
witness = await circuit.calculateWitness({ "in": [1, 0] }, true); witness = await circuit.calculateWitness({ "in": [1, 0] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(0))); assert(Fr.eq(witness[1], Fr.e(0)));
witness = await circuit.calculateWitness({ "in": [555, 0] }, true); witness = await circuit.calculateWitness({ "in": [555, 0] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(0))); assert(Fr.eq(witness[1], Fr.e(0)));
witness = await circuit.calculateWitness({ "in": [0, 0] }, true); witness = await circuit.calculateWitness({ "in": [0, 0] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(0))); assert(Fr.eq(witness[1], Fr.e(0)));
}); });
it("Should create a comparison lesseqthan", async() => { it("Should create a comparison lesseqthan", async() => {
@ -77,36 +78,36 @@ describe("Comparators test", function () {
let witness; let witness;
witness = await circuit.calculateWitness({ "in": [333,444] }, true); witness = await circuit.calculateWitness({ "in": [333,444] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(1))); assert(Fr.eq(witness[1], Fr.e(1)));
witness = await circuit.calculateWitness({ "in":[1,1] }, true); witness = await circuit.calculateWitness({ "in":[1,1] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(1))); assert(Fr.eq(witness[1], Fr.e(1)));
witness = await circuit.calculateWitness({ "in": [661, 660] }, true); witness = await circuit.calculateWitness({ "in": [661, 660] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(0))); assert(Fr.eq(witness[1], Fr.e(0)));
witness = await circuit.calculateWitness({ "in": [0, 1] }, true); witness = await circuit.calculateWitness({ "in": [0, 1] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(1))); assert(Fr.eq(witness[1], Fr.e(1)));
witness = await circuit.calculateWitness({ "in": [0, 444] }, true); witness = await circuit.calculateWitness({ "in": [0, 444] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(1))); assert(Fr.eq(witness[1], Fr.e(1)));
witness = await circuit.calculateWitness({ "in": [1, 0] }, true); witness = await circuit.calculateWitness({ "in": [1, 0] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(0))); assert(Fr.eq(witness[1], Fr.e(0)));
witness = await circuit.calculateWitness({ "in": [555, 0] }, true); witness = await circuit.calculateWitness({ "in": [555, 0] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(0))); assert(Fr.eq(witness[1], Fr.e(0)));
witness = await circuit.calculateWitness({ "in": [0, 0] }, true); witness = await circuit.calculateWitness({ "in": [0, 0] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(1))); assert(Fr.eq(witness[1], Fr.e(1)));
}); });
it("Should create a comparison greaterthan", async() => { it("Should create a comparison greaterthan", async() => {
@ -114,71 +115,71 @@ describe("Comparators test", function () {
let witness; let witness;
witness = await circuit.calculateWitness({ "in": [333,444] }, true); witness = await circuit.calculateWitness({ "in": [333,444] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(0))); assert(Fr.eq(witness[1], Fr.e(0)));
witness = await circuit.calculateWitness({ "in":[1,1] }, true); witness = await circuit.calculateWitness({ "in":[1,1] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(0))); assert(Fr.eq(witness[1], Fr.e(0)));
witness = await circuit.calculateWitness({ "in": [661, 660] }, true); witness = await circuit.calculateWitness({ "in": [661, 660] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(1))); assert(Fr.eq(witness[1], Fr.e(1)));
witness = await circuit.calculateWitness({ "in": [0, 1] }, true); witness = await circuit.calculateWitness({ "in": [0, 1] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(0))); assert(Fr.eq(witness[1], Fr.e(0)));
witness = await circuit.calculateWitness({ "in": [0, 444] }, true); witness = await circuit.calculateWitness({ "in": [0, 444] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(0))); assert(Fr.eq(witness[1], Fr.e(0)));
witness = await circuit.calculateWitness({ "in": [1, 0] }, true); witness = await circuit.calculateWitness({ "in": [1, 0] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(1))); assert(Fr.eq(witness[1], Fr.e(1)));
witness = await circuit.calculateWitness({ "in": [555, 0] }, true); witness = await circuit.calculateWitness({ "in": [555, 0] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(1))); assert(Fr.eq(witness[1], Fr.e(1)));
witness = await circuit.calculateWitness({ "in": [0, 0] }, true); witness = await circuit.calculateWitness({ "in": [0, 0] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(0))); assert(Fr.eq(witness[1], Fr.e(0)));
}); });
it("Should create a comparison greatereqthan", async() => { it("Should create a comparison greatereqthan", async() => {
const circuit = await tester(path.join(__dirname, "circuits", "greatereqthan.circom")); const circuit = await tester(path.join(__dirname, "circuits", "greatereqthan.circom"));
let witness; let witness;
witness = await circuit.calculateWitness({ "in": [333,444] }, true); witness = await circuit.calculateWitness({ "in": [333,444] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(0))); assert(Fr.eq(witness[1], Fr.e(0)));
witness = await circuit.calculateWitness({ "in":[1,1] }, true); witness = await circuit.calculateWitness({ "in":[1,1] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(1))); assert(Fr.eq(witness[1], Fr.e(1)));
witness = await circuit.calculateWitness({ "in": [661, 660] }, true); witness = await circuit.calculateWitness({ "in": [661, 660] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(1))); assert(Fr.eq(witness[1], Fr.e(1)));
witness = await circuit.calculateWitness({ "in": [0, 1] }, true); witness = await circuit.calculateWitness({ "in": [0, 1] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(0))); assert(Fr.eq(witness[1], Fr.e(0)));
witness = await circuit.calculateWitness({ "in": [0, 444] }, true); witness = await circuit.calculateWitness({ "in": [0, 444] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(0))); assert(Fr.eq(witness[1], Fr.e(0)));
witness = await circuit.calculateWitness({ "in": [1, 0] }, true); witness = await circuit.calculateWitness({ "in": [1, 0] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(1))); assert(Fr.eq(witness[1], Fr.e(1)));
witness = await circuit.calculateWitness({ "in": [555, 0] }, true); witness = await circuit.calculateWitness({ "in": [555, 0] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(1))); assert(Fr.eq(witness[1], Fr.e(1)));
witness = await circuit.calculateWitness({ "in": [0, 0] }, true); witness = await circuit.calculateWitness({ "in": [0, 0] }, true);
assert(witness[0].equals(bigInt(1))); assert(Fr.eq(witness[0], Fr.e(1)));
assert(witness[1].equals(bigInt(1))); assert(Fr.eq(witness[1], Fr.e(1)));
}); });
}); });

@ -2,7 +2,7 @@ const chai = require("chai");
const path = require("path"); const path = require("path");
const tester = require("circom").tester; const tester = require("circom").tester;
const bigInt = require("big-integer"); const Fr = require("ffjavascript").bn128.Fr;
const eddsa = require("../src/eddsa.js"); const eddsa = require("../src/eddsa.js");
const babyJub = require("../src/babyjub.js"); const babyJub = require("../src/babyjub.js");
@ -18,9 +18,9 @@ function buffer2bits(buff) {
for (let i=0; i<buff.length; i++) { for (let i=0; i<buff.length; i++) {
for (let j=0; j<8; j++) { for (let j=0; j<8; j++) {
if ((buff[i]>>j)&1) { if ((buff[i]>>j)&1) {
res.push(bigInt.one); res.push(Fr.one);
} else { } else {
res.push(bigInt.zero); res.push(Fr.zero);
} }
} }
} }

@ -5,8 +5,7 @@ const babyJub = require("../src/babyjub.js");
const assert = chai.assert; const assert = chai.assert;
const bigInt = require("big-integer"); const utils = require("ffjavascript").utils;
const utils = require("../src/utils.js");
describe("EdDSA js test", function () { describe("EdDSA js test", function () {
@ -23,24 +22,24 @@ describe("EdDSA js test", function () {
const pubKey = eddsa.prv2pub(prvKey); const pubKey = eddsa.prv2pub(prvKey);
assert.equal(pubKey[0].toString(), assert.equal(pubKey[0].toString(),
"13277427435165878497778222415993513565335242147425444199013288855685581939618"); "17579234973106307986399040784563986669343100608865726413246909559198451825625");
assert.equal(pubKey[1].toString(), assert.equal(pubKey[1].toString(),
"13622229784656158136036771217484571176836296686641868549125388198837476602820"); "21581828029826859845363968476425861244058376747493285816141526544272562145486");
const pPubKey = babyJub.packPoint(pubKey); const pPubKey = babyJub.packPoint(pubKey);
const signature = eddsa.signMiMC(prvKey, msg); const signature = eddsa.signMiMC(prvKey, msg);
assert.equal(signature.R8[0].toString(), assert.equal(signature.R8[0].toString(),
"11384336176656855268977457483345535180380036354188103142384839473266348197733"); "12672422877531089818651367820728973438446851190471722610781936061829103362897");
assert.equal(signature.R8[1].toString(), assert.equal(signature.R8[1].toString(),
"15383486972088797283337779941324724402501462225528836549661220478783371668959"); "12052234579439634484237590306927118446073354173341433290934144373261241958718");
assert.equal(signature.S.toString(), assert.equal(signature.S.toString(),
"2523202440825208709475937830811065542425109372212752003460238913256192595070"); "1582013862333331285840015273849085014739146294568319205499642618291614907374");
const pSignature = eddsa.packSignature(signature); const pSignature = eddsa.packSignature(signature);
assert.equal(pSignature.toString("hex"), ""+ assert.equal(pSignature.toString("hex"), ""+
"dfedb4315d3f2eb4de2d3c510d7a987dcab67089c8ace06308827bf5bcbe02a2"+ "3e417cd811f9c9c545a680b962e45d22ccb62b2284b4fe4bbc9fdb50b252a59a" +
"7ed40dab29bf993c928e789d007387998901a24913d44fddb64b1f21fc149405"); "eefbebe2b895393fa0e9b5b31b19e65a63fee5d7b6261d8d5b6b847c5b637f03");
const uSignature = eddsa.unpackSignature(pSignature); const uSignature = eddsa.unpackSignature(pSignature);
assert(eddsa.verifyMiMC(msg, uSignature, pubKey)); assert(eddsa.verifyMiMC(msg, uSignature, pubKey));
@ -56,24 +55,24 @@ describe("EdDSA js test", function () {
const pubKey = eddsa.prv2pub(prvKey); const pubKey = eddsa.prv2pub(prvKey);
assert.equal(pubKey[0].toString(), assert.equal(pubKey[0].toString(),
"13277427435165878497778222415993513565335242147425444199013288855685581939618"); "17579234973106307986399040784563986669343100608865726413246909559198451825625");
assert.equal(pubKey[1].toString(), assert.equal(pubKey[1].toString(),
"13622229784656158136036771217484571176836296686641868549125388198837476602820"); "21581828029826859845363968476425861244058376747493285816141526544272562145486");
const pPubKey = babyJub.packPoint(pubKey); const pPubKey = babyJub.packPoint(pubKey);
const signature = eddsa.signPoseidon(prvKey, msg); const signature = eddsa.signPoseidon(prvKey, msg);
assert.equal(signature.R8[0].toString(), assert.equal(signature.R8[0].toString(),
"11384336176656855268977457483345535180380036354188103142384839473266348197733"); "12672422877531089818651367820728973438446851190471722610781936061829103362897");
assert.equal(signature.R8[1].toString(), assert.equal(signature.R8[1].toString(),
"15383486972088797283337779941324724402501462225528836549661220478783371668959"); "12052234579439634484237590306927118446073354173341433290934144373261241958718");
assert.equal(signature.S.toString(), assert.equal(signature.S.toString(),
"248298168863866362217836334079793350221620631973732197668910946177382043688"); "2318334603430781860679872910160434499077270843466490702990199622594868564504");
const pSignature = eddsa.packSignature(signature); const pSignature = eddsa.packSignature(signature);
assert.equal(pSignature.toString("hex"), ""+ assert.equal(pSignature.toString("hex"), ""+
"dfedb4315d3f2eb4de2d3c510d7a987dcab67089c8ace06308827bf5bcbe02a2"+ "3e417cd811f9c9c545a680b962e45d22ccb62b2284b4fe4bbc9fdb50b252a59a" +
"28506bce274aa1b3f7e7c2fd7e4fe09bff8f9aa37a42def7994e98f322888c00"); "1852c049fc6286138a0ddb57718049a09374fdf0390686c7ac5637b481212005");
const uSignature = eddsa.unpackSignature(pSignature); const uSignature = eddsa.unpackSignature(pSignature);
assert(eddsa.verifyPoseidon(msg, uSignature, pubKey)); assert(eddsa.verifyPoseidon(msg, uSignature, pubKey));

@ -1,7 +1,8 @@
const chai = require("chai"); const chai = require("chai");
const path = require("path"); const path = require("path");
const tester = require("circom").tester; const tester = require("circom").tester;
const bigInt = require("big-integer");
const Fr = require("ffjavascript").bn128.Fr;
const eddsa = require("../src/eddsa.js"); const eddsa = require("../src/eddsa.js");
@ -18,7 +19,7 @@ describe("EdDSA MiMC test", function () {
}); });
it("Sign a single number", async () => { it("Sign a single number", async () => {
const msg = bigInt(1234); const msg = Fr.e(1234);
const prvKey = Buffer.from("0001020304050607080900010203040506070809000102030405060708090001", "hex"); const prvKey = Buffer.from("0001020304050607080900010203040506070809000102030405060708090001", "hex");
@ -43,7 +44,7 @@ describe("EdDSA MiMC test", function () {
}); });
it("Detect Invalid signature", async () => { it("Detect Invalid signature", async () => {
const msg = bigInt(1234); const msg = Fr.e(1234);
const prvKey = Buffer.from("0001020304050607080900010203040506070809000102030405060708090001", "hex"); const prvKey = Buffer.from("0001020304050607080900010203040506070809000102030405060708090001", "hex");
@ -58,7 +59,7 @@ describe("EdDSA MiMC test", function () {
enabled: 1, enabled: 1,
Ax: pubKey[0], Ax: pubKey[0],
Ay: pubKey[1], Ay: pubKey[1],
R8x: signature.R8[0].add(bigInt(1)), R8x: Fr.add(signature.R8[0], Fr.e(1)),
R8y: signature.R8[1], R8y: signature.R8[1],
S: signature.S, S: signature.S,
M: msg}, true); M: msg}, true);
@ -70,7 +71,7 @@ describe("EdDSA MiMC test", function () {
it("Test a dissabled circuit with a bad signature", async () => { it("Test a dissabled circuit with a bad signature", async () => {
const msg = bigInt(1234); const msg = Fr.e(1234);
const prvKey = Buffer.from("0001020304050607080900010203040506070809000102030405060708090001", "hex"); const prvKey = Buffer.from("0001020304050607080900010203040506070809000102030405060708090001", "hex");
@ -85,7 +86,7 @@ describe("EdDSA MiMC test", function () {
enabled: 0, enabled: 0,
Ax: pubKey[0], Ax: pubKey[0],
Ay: pubKey[1], Ay: pubKey[1],
R8x: signature.R8[0].add(bigInt(1)), R8x: Fr.add(signature.R8[0], Fr.e(1)),
R8y: signature.R8[1], R8y: signature.R8[1],
S: signature.S, S: signature.S,
M: msg}, true); M: msg}, true);

@ -1,7 +1,7 @@
const chai = require("chai"); const chai = require("chai");
const path = require("path"); const path = require("path");
const bigInt = require("big-integer");
const tester = require("circom").tester; const tester = require("circom").tester;
const Fr = require("ffjavascript").bn128.Fr;
const eddsa = require("../src/eddsa.js"); const eddsa = require("../src/eddsa.js");
@ -19,7 +19,7 @@ describe("EdDSA Poseidon test", function () {
}); });
it("Sign a single number", async () => { it("Sign a single number", async () => {
const msg = bigInt(1234); const msg = Fr.e(1234);
const prvKey = Buffer.from("0001020304050607080900010203040506070809000102030405060708090001", "hex"); const prvKey = Buffer.from("0001020304050607080900010203040506070809000102030405060708090001", "hex");
@ -47,7 +47,7 @@ describe("EdDSA Poseidon test", function () {
}); });
it("Detect Invalid signature", async () => { it("Detect Invalid signature", async () => {
const msg = bigInt(1234); const msg = Fr.e(1234);
const prvKey = Buffer.from("0001020304050607080900010203040506070809000102030405060708090001", "hex"); const prvKey = Buffer.from("0001020304050607080900010203040506070809000102030405060708090001", "hex");
@ -62,7 +62,7 @@ describe("EdDSA Poseidon test", function () {
enabled: 1, enabled: 1,
Ax: pubKey[0], Ax: pubKey[0],
Ay: pubKey[1], Ay: pubKey[1],
R8x: signature.R8[0].add(bigInt(1)), R8x: Fr.add(signature.R8[0], Fr.e(1)),
R8y: signature.R8[1], R8y: signature.R8[1],
S: signature.S, S: signature.S,
M: msg}, true); M: msg}, true);
@ -74,7 +74,7 @@ describe("EdDSA Poseidon test", function () {
it("Test a dissabled circuit with a bad signature", async () => { it("Test a dissabled circuit with a bad signature", async () => {
const msg = bigInt(1234); const msg = Fr.e(1234);
const prvKey = Buffer.from("0001020304050607080900010203040506070809000102030405060708090001", "hex"); const prvKey = Buffer.from("0001020304050607080900010203040506070809000102030405060708090001", "hex");
@ -89,7 +89,7 @@ describe("EdDSA Poseidon test", function () {
enabled: 0, enabled: 0,
Ax: pubKey[0], Ax: pubKey[0],
Ay: pubKey[1], Ay: pubKey[1],
R8x: signature.R8[0].add(bigInt(1)), R8x: Fr.add(signature.R8[0], Fr.e(1)),
R8y: signature.R8[1], R8y: signature.R8[1],
S: signature.S, S: signature.S,
M: msg}, true); M: msg}, true);

@ -1,8 +1,9 @@
const chai = require("chai"); const chai = require("chai");
const path = require("path"); const path = require("path");
const bigInt = require("big-integer");
const tester = require("circom").tester; const tester = require("circom").tester;
const babyJub = require("../src/babyjub.js"); const babyJub = require("../src/babyjub.js");
const Fr = require("ffjavascript").bn128.Fr;
const assert = chai.assert; const assert = chai.assert;
@ -23,11 +24,11 @@ describe("Exponentioation test", function () {
await circuit.checkConstraints(w); await circuit.checkConstraints(w);
let g = [ let g = [
bigInt("5299619240641551281634865583518297030282874472190772894086521144482721001553"), Fr.e("5299619240641551281634865583518297030282874472190772894086521144482721001553"),
bigInt("16950150798460657717958625567821834550301663161624707787222815936182638968203") Fr.e("16950150798460657717958625567821834550301663161624707787222815936182638968203")
]; ];
let dbl= [bigInt("0"), bigInt("1")]; let dbl= [Fr.e("0"), Fr.e("1")];
const expectedOut = []; const expectedOut = [];
@ -50,15 +51,15 @@ describe("Exponentioation test", function () {
await circuit.checkConstraints(w); await circuit.checkConstraints(w);
let g = [ let g = [
bigInt("5299619240641551281634865583518297030282874472190772894086521144482721001553"), Fr.e("5299619240641551281634865583518297030282874472190772894086521144482721001553"),
bigInt("16950150798460657717958625567821834550301663161624707787222815936182638968203") Fr.e("16950150798460657717958625567821834550301663161624707787222815936182638968203")
]; ];
for (let i=0; i<12;i++) { for (let i=0; i<12;i++) {
g = babyJub.addPoint(g,g); g = babyJub.addPoint(g,g);
} }
let dbl= [bigInt("0"), bigInt("1")]; let dbl= [Fr.e("0"), Fr.e("1")];
const expectedOut = []; const expectedOut = [];
@ -81,11 +82,11 @@ describe("Exponentioation test", function () {
await circuit.checkConstraints(w); await circuit.checkConstraints(w);
let g = [ let g = [
bigInt("5299619240641551281634865583518297030282874472190772894086521144482721001553"), Fr.e("5299619240641551281634865583518297030282874472190772894086521144482721001553"),
bigInt("16950150798460657717958625567821834550301663161624707787222815936182638968203") Fr.e("16950150798460657717958625567821834550301663161624707787222815936182638968203")
]; ];
let c = [bigInt(0), bigInt(1)]; let c = [Fr.e(0), Fr.e(1)];
for (let i=0; i<31;i++) { for (let i=0; i<31;i++) {
c = babyJub.addPoint(c,g); c = babyJub.addPoint(c,g);
@ -93,7 +94,7 @@ describe("Exponentioation test", function () {
await circuit.assertOut(w, {out: c}); await circuit.assertOut(w, {out: c});
const w2 = await circuit.calculateWitness({"in": bigInt(1).shiftLeft(252).add(bigInt.one)}); const w2 = await circuit.calculateWitness({"in": Fr.add(Fr.shl(Fr.e(1), Fr.e(252)),Fr.one)});
c = [g[0], g[1]]; c = [g[0], g[1]];
for (let i=0; i<252;i++) { for (let i=0; i<252;i++) {

@ -1,7 +1,8 @@
const chai = require("chai"); const chai = require("chai");
const path = require("path"); const path = require("path");
const bigInt = require("big-integer");
const tester = require("circom").tester; const tester = require("circom").tester;
const Fr = require("ffjavascript").bn128.Fr;
function print(circuit, w, s) { function print(circuit, w, s) {
console.log(s + ": " + w[circuit.getSignalIdx(s)]); console.log(s + ": " + w[circuit.getSignalIdx(s)]);
@ -13,8 +14,8 @@ describe("Escalarmul test", function () {
this.timeout(100000); this.timeout(100000);
let g = [ let g = [
bigInt("5299619240641551281634865583518297030282874472190772894086521144482721001553"), Fr.e("5299619240641551281634865583518297030282874472190772894086521144482721001553"),
bigInt("16950150798460657717958625567821834550301663161624707787222815936182638968203") Fr.e("16950150798460657717958625567821834550301663161624707787222815936182638968203")
]; ];
before( async() => { before( async() => {
@ -33,7 +34,7 @@ describe("Escalarmul test", function () {
it("If multiply by order should return 0", async () => { it("If multiply by order should return 0", async () => {
const r = bigInt("2736030358979909402780800718157159386076813972158567259200215660948447373041"); const r = Fr.e("2736030358979909402780800718157159386076813972158567259200215660948447373041");
const w = await circuitEMulAny.calculateWitness({"e": r, "p": g}); const w = await circuitEMulAny.calculateWitness({"e": r, "p": g});
await circuitEMulAny.checkConstraints(w); await circuitEMulAny.checkConstraints(w);

@ -1,8 +1,8 @@
const chai = require("chai"); const chai = require("chai");
const path = require("path"); const path = require("path");
const bigInt = require("big-integer");
const tester = require("circom").tester; const tester = require("circom").tester;
const babyjub = require("../src/babyjub"); const babyjub = require("../src/babyjub");
const Fr = require("ffjavascript").bn128.Fr;
const assert = chai.assert; const assert = chai.assert;
@ -41,10 +41,10 @@ describe("Escalarmul test", function () {
it("Should generate scalar mul of a specific constant", async () => { it("Should generate scalar mul of a specific constant", async () => {
const s = bigInt("2351960337287830298912035165133676222414898052661454064215017316447594616519"); const s = Fr.e("2351960337287830298912035165133676222414898052661454064215017316447594616519");
const base8 = [ const base8 = [
bigInt("5299619240641551281634865583518297030282874472190772894086521144482721001553"), Fr.e("5299619240641551281634865583518297030282874472190772894086521144482721001553"),
bigInt("16950150798460657717958625567821834550301663161624707787222815936182638968203") Fr.e("16950150798460657717958625567821834550301663161624707787222815936182638968203")
]; ];
const w = await circuit.calculateWitness({"e": s}, true); const w = await circuit.calculateWitness({"e": s}, true);
@ -60,12 +60,12 @@ describe("Escalarmul test", function () {
it("Should generate scalar mul of the firsts 50 elements", async () => { it("Should generate scalar mul of the firsts 50 elements", async () => {
const base8 = [ const base8 = [
bigInt("5299619240641551281634865583518297030282874472190772894086521144482721001553"), Fr.e("5299619240641551281634865583518297030282874472190772894086521144482721001553"),
bigInt("16950150798460657717958625567821834550301663161624707787222815936182638968203") Fr.e("16950150798460657717958625567821834550301663161624707787222815936182638968203")
]; ];
for (let i=0; i<50; i++) { for (let i=0; i<50; i++) {
const s = bigInt(i); const s = Fr.e(i);
const w = await circuit.calculateWitness({"e": s}, true); const w = await circuit.calculateWitness({"e": s}, true);

@ -1,8 +1,8 @@
const chai = require("chai"); const chai = require("chai");
const path = require("path"); const path = require("path");
const bigInt = require("big-integer");
const tester = require("circom").tester; const tester = require("circom").tester;
const babyJub = require("../src/babyjub.js"); const babyJub = require("../src/babyjub.js");
const Fr = require("ffjavascript").bn128.Fr;
const assert = chai.assert; const assert = chai.assert;
@ -13,8 +13,8 @@ describe("Montgomery test", function () {
let circuitMDouble; let circuitMDouble;
let g = [ let g = [
bigInt("5299619240641551281634865583518297030282874472190772894086521144482721001553"), Fr.e("5299619240641551281634865583518297030282874472190772894086521144482721001553"),
bigInt("16950150798460657717958625567821834550301663161624707787222815936182638968203") Fr.e("16950150798460657717958625567821834550301663161624707787222815936182638968203")
]; ];
let mg, mg2, g2, g3, mg3; let mg, mg2, g2, g3, mg3;
@ -45,8 +45,8 @@ describe("Montgomery test", function () {
xout = w[circuitM2E.symbols["main.out[0]"].varIdx]; xout = w[circuitM2E.symbols["main.out[0]"].varIdx];
yout = w[circuitM2E.symbols["main.out[1]"].varIdx]; yout = w[circuitM2E.symbols["main.out[1]"].varIdx];
assert(xout.equals(g[0])); assert(Fr.eq(xout, g[0]));
assert(yout.equals(g[1])); assert(Fr.eq(yout, g[1]));
}); });
it("Should double a point", async () => { it("Should double a point", async () => {
let w, xout, yout; let w, xout, yout;
@ -65,8 +65,9 @@ describe("Montgomery test", function () {
xout = w[circuitM2E.symbols["main.out[0]"].varIdx]; xout = w[circuitM2E.symbols["main.out[0]"].varIdx];
yout = w[circuitM2E.symbols["main.out[1]"].varIdx]; yout = w[circuitM2E.symbols["main.out[1]"].varIdx];
assert(xout.equals(g2[0]));
assert(yout.equals(g2[1])); assert(Fr.eq(xout, g2[0]));
assert(Fr.eq(yout, g2[1]));
}); });
it("Should add a point", async () => { it("Should add a point", async () => {
let w, xout, yout; let w, xout, yout;
@ -85,7 +86,7 @@ describe("Montgomery test", function () {
xout = w[circuitM2E.symbols["main.out[0]"].varIdx]; xout = w[circuitM2E.symbols["main.out[0]"].varIdx];
yout = w[circuitM2E.symbols["main.out[1]"].varIdx]; yout = w[circuitM2E.symbols["main.out[1]"].varIdx];
assert(xout.equals(g3[0])); assert(Fr.eq(xout, g3[0]));
assert(yout.equals(g3[1])); assert(Fr.eq(yout, g3[1]));
}); });
}); });

@ -1,6 +1,6 @@
const path = require("path"); const path = require("path");
const bigInt = require("big-integer");
const tester = require("circom").tester; const tester = require("circom").tester;
const Fr = require("ffjavascript").bn128.Fr;
describe("Mux4 test", function() { describe("Mux4 test", function() {
this.timeout(100000); this.timeout(100000);
@ -9,22 +9,22 @@ describe("Mux4 test", function() {
const circuit = await tester(path.join(__dirname, "circuits", "mux4_1.circom")); const circuit = await tester(path.join(__dirname, "circuits", "mux4_1.circom"));
const ct16 = [ const ct16 = [
bigInt("123"), Fr.e("123"),
bigInt("456"), Fr.e("456"),
bigInt("789"), Fr.e("789"),
bigInt("012"), Fr.e("012"),
bigInt("111"), Fr.e("111"),
bigInt("222"), Fr.e("222"),
bigInt("333"), Fr.e("333"),
bigInt("4546"), Fr.e("4546"),
bigInt("134523"), Fr.e("134523"),
bigInt("44356"), Fr.e("44356"),
bigInt("15623"), Fr.e("15623"),
bigInt("4566"), Fr.e("4566"),
bigInt("1223"), Fr.e("1223"),
bigInt("4546"), Fr.e("4546"),
bigInt("4256"), Fr.e("4256"),
bigInt("4456") Fr.e("4456")
]; ];
for (let i=0; i<16; i++) { for (let i=0; i<16; i++) {
@ -41,14 +41,14 @@ describe("Mux4 test", function() {
const circuit = await tester(path.join(__dirname, "circuits", "mux3_1.circom")); const circuit = await tester(path.join(__dirname, "circuits", "mux3_1.circom"));
const ct8 = [ const ct8 = [
bigInt("37"), Fr.e("37"),
bigInt("47"), Fr.e("47"),
bigInt("53"), Fr.e("53"),
bigInt("71"), Fr.e("71"),
bigInt("89"), Fr.e("89"),
bigInt("107"), Fr.e("107"),
bigInt("163"), Fr.e("163"),
bigInt("191") Fr.e("191")
]; ];
for (let i=0; i<8; i++) { for (let i=0; i<8; i++) {
@ -64,10 +64,10 @@ describe("Mux4 test", function() {
const circuit = await tester(path.join(__dirname, "circuits", "mux2_1.circom")); const circuit = await tester(path.join(__dirname, "circuits", "mux2_1.circom"));
const ct4 = [ const ct4 = [
bigInt("37"), Fr.e("37"),
bigInt("47"), Fr.e("47"),
bigInt("53"), Fr.e("53"),
bigInt("71"), Fr.e("71"),
]; ];
for (let i=0; i<4; i++) { for (let i=0; i<4; i++) {
@ -83,8 +83,8 @@ describe("Mux4 test", function() {
const circuit = await tester(path.join(__dirname, "circuits", "mux1_1.circom")); const circuit = await tester(path.join(__dirname, "circuits", "mux1_1.circom"));
const ct2 = [ const ct2 = [
bigInt("37"), Fr.e("37"),
bigInt("47"), Fr.e("47"),
]; ];
for (let i=0; i<2; i++) { for (let i=0; i<2; i++) {

@ -1,18 +1,18 @@
const chai = require("chai"); const chai = require("chai");
const path = require("path"); const path = require("path");
const bigInt = require("big-integer"); const Fr = require("ffjavascript").bn128.Fr;
const tester = require("circom").tester; const tester = require("circom").tester;
const babyJub = require("../src/babyjub.js"); const babyJub = require("../src/babyjub.js");
const PBASE = const PBASE =
[ [
[bigInt("10457101036533406547632367118273992217979173478358440826365724437999023779287"),bigInt("19824078218392094440610104313265183977899662750282163392862422243483260492317")], [Fr.e("7688621503272331394947188562469131124099290577812125474996268020905176040083"),Fr.e("6637287939860384587467947982369268811366630904563077767287326262235485629411")],
[bigInt("2671756056509184035029146175565761955751135805354291559563293617232983272177"),bigInt("2663205510731142763556352975002641716101654201788071096152948830924149045094")], [Fr.e("11549681895645637778324638856880330712650895608496649854094912415387988201330"),Fr.e("5771732722784528537721081267383956005090479808901717812009343940574217488577")],
[bigInt("5802099305472655231388284418920769829666717045250560929368476121199858275951"),bigInt("5980429700218124965372158798884772646841287887664001482443826541541529227896")], [Fr.e("18790245153471844934157747708238883966079935875787657036767664036124524381945"),Fr.e("18300275459419441151064576487317481499516933849631632883767173501999997278432")],
[bigInt("7107336197374528537877327281242680114152313102022415488494307685842428166594"),bigInt("2857869773864086953506483169737724679646433914307247183624878062391496185654")], [Fr.e("16301069151422548986850494139112207641738464387919729729324473657161689764196"),Fr.e("8215273507373494014441104012907835625670941526105528197815397741007626226499")],
[bigInt("20265828622013100949498132415626198973119240347465898028410217039057588424236"),bigInt("1160461593266035632937973507065134938065359936056410650153315956301179689506")] [Fr.e("12597665704678284488008395353749282149622295037737374782196049599390683534185"),Fr.e("4072455241781501621593714139281767473040087753548015968773801065193764079468")]
]; ];
describe("Double Pedersen test", function() { describe("Double Pedersen test", function() {
@ -63,7 +63,7 @@ describe("Double Pedersen test", function() {
it("Should pedersen all ones", async () => { it("Should pedersen all ones", async () => {
let w; let w;
const allOnes = bigInt("1").shiftLeft(250).minus(bigInt("1")); const allOnes = Fr.sub(Fr.shl(Fr.e("1"), Fr.e(250)), Fr.e("1"));
w = await circuit.calculateWitness({ in: [allOnes, allOnes]}, true); w = await circuit.calculateWitness({ in: [allOnes, allOnes]}, true);

@ -1,6 +1,6 @@
const path = require("path"); const path = require("path");
const bigInt = require("big-integer"); const Fr = require("ffjavascript").bn128.Fr;
const tester = require("circom").tester; const tester = require("circom").tester;
const babyJub = require("../src/babyjub.js"); const babyJub = require("../src/babyjub.js");
@ -32,7 +32,7 @@ describe("Pedersen test", function() {
let w; let w;
const n = bigInt.one.shiftLeft(253).minus(bigInt.one); const n = Fr.sub(Fr.shl(Fr.one, Fr.e(253)), Fr.one);
w = await circuit.calculateWitness({ in: n}, true); w = await circuit.calculateWitness({ in: n}, true);

@ -1,7 +1,6 @@
const chai = require("chai"); const chai = require("chai");
const path = require("path"); const path = require("path");
var blake2b = require("blake2b"); var blake2b = require("blake2b");
const bigInt = require("big-integer");
const tester = require("circom").tester; const tester = require("circom").tester;
const poseidon = require("../src/poseidon.js"); const poseidon = require("../src/poseidon.js");

@ -3,7 +3,6 @@ const Web3 = require("web3");
const chai = require("chai"); const chai = require("chai");
const poseidonGenContract = require("../src/poseidon_gencontract.js"); const poseidonGenContract = require("../src/poseidon_gencontract.js");
const Poseidon = require("../src/poseidon.js"); const Poseidon = require("../src/poseidon.js");
const bigInt = require("snarkjs").bigInt;
const assert = chai.assert; const assert = chai.assert;
const log = (msg) => { if (process.env.MOCHA_VERBOSE) console.log(msg); }; const log = (msg) => { if (process.env.MOCHA_VERBOSE) console.log(msg); };

@ -1,7 +1,7 @@
const chai = require("chai"); const chai = require("chai");
const path = require("path"); const path = require("path");
const snarkjs = require("snarkjs");
const crypto = require("crypto"); const crypto = require("crypto");
const Fr = require("ffjavascript").bn128.Fr;
const assert = chai.assert; const assert = chai.assert;
@ -67,7 +67,7 @@ describe("SHA256 test", function () {
assert.equal(hash, hash2); assert.equal(hash, hash2);
assert(witness[1].equals(snarkjs.bigInt(r))); assert(Fr.eq(witness[1], Fr.e(r)));
}).timeout(1000000); }).timeout(1000000);
it("Should calculate a hash of 2 compressor", async () => { it("Should calculate a hash of 2 compressor", async () => {

@ -1,5 +1,6 @@
const path = require("path"); const path = require("path");
const bigInt = require("big-integer"); const Fr = require("ffjavascript").bn128.Fr;
const Scalar = require("ffjavascript").Scalar;
const tester = require("circom").tester; const tester = require("circom").tester;
function print(circuit, w, s) { function print(circuit, w, s) {
@ -9,16 +10,16 @@ function print(circuit, w, s) {
function getBits(v, n) { function getBits(v, n) {
const res = []; const res = [];
for (let i=0; i<n; i++) { for (let i=0; i<n; i++) {
if (v.shiftRight(i).isOdd()) { if (Scalar.isOdd(Scalar.shr(v, i))) {
res.push(bigInt.one); res.push(Fr.one);
} else { } else {
res.push(bigInt.zero); res.push(Fr.zero);
} }
} }
return res; return res;
} }
const q = bigInt("21888242871839275222246405745257275088548364400416034343698204186575808495617"); const q = Scalar.fromString("21888242871839275222246405745257275088548364400416034343698204186575808495617");
describe("Sign test", function() { describe("Sign test", function() {
let circuit; let circuit;
@ -29,35 +30,35 @@ describe("Sign test", function() {
}); });
it("Sign of 0", async () => { it("Sign of 0", async () => {
const inp = getBits(bigInt.zero, 254); const inp = getBits(Scalar.e(0), 254);
const w = await circuit.calculateWitness({in: inp}, true); const w = await circuit.calculateWitness({in: inp}, true);
await circuit.assertOut(w, {sign: 0}); await circuit.assertOut(w, {sign: 0});
}); });
it("Sign of 3", async () => { it("Sign of 3", async () => {
const inp = getBits(bigInt(3), 254); const inp = getBits(Scalar.e(3), 254);
const w = await circuit.calculateWitness({in: inp}, true); const w = await circuit.calculateWitness({in: inp}, true);
await circuit.assertOut(w, {sign: 0}); await circuit.assertOut(w, {sign: 0});
}); });
it("Sign of q/2", async () => { it("Sign of q/2", async () => {
const inp = getBits(q.shiftRight(bigInt.one), 254); const inp = getBits(Scalar.shr(q, 1), 254);
const w = await circuit.calculateWitness({in: inp}, true); const w = await circuit.calculateWitness({in: inp}, true);
await circuit.assertOut(w, {sign: 0}); await circuit.assertOut(w, {sign: 0});
}); });
it("Sign of q/2+1", async () => { it("Sign of q/2+1", async () => {
const inp = getBits(q.shiftRight(bigInt.one).add(bigInt.one), 254); const inp = getBits(Scalar.add(Scalar.shr(q, 1), 1) , 254);
const w = await circuit.calculateWitness({in: inp}, true); const w = await circuit.calculateWitness({in: inp}, true);
await circuit.assertOut(w, {sign: 1}); await circuit.assertOut(w, {sign: 1});
}); });
it("Sign of q-1", async () => { it("Sign of q-1", async () => {
const inp = getBits(q.minus(bigInt.one), 254); const inp = getBits(Scalar.sub(q, 1), 254);
const w = await circuit.calculateWitness({in: inp}, true); const w = await circuit.calculateWitness({in: inp}, true);
await circuit.assertOut(w, {sign: 1}); await circuit.assertOut(w, {sign: 1});
@ -71,7 +72,7 @@ describe("Sign test", function() {
}); });
it("Sign of all ones", async () => { it("Sign of all ones", async () => {
const inp = getBits(bigInt(1).shiftLeft(254).minus(bigInt(1)), 254); const inp = getBits(Scalar.sub(Scalar.shl(1,254),1), 254);
const w = await circuit.calculateWitness({in: inp}, true); const w = await circuit.calculateWitness({in: inp}, true);
await circuit.assertOut(w, {sign: 1}); await circuit.assertOut(w, {sign: 1});

@ -1,28 +1,11 @@
const chai = require("chai"); const chai = require("chai");
const bigInt = require("big-integer"); const Fr = require("ffjavascript").bn128.Fr;
const smt = require("../src/smt.js"); const smt = require("../src/smt.js");
const assert = chai.assert; const assert = chai.assert;
function stringifyBigInts(o) {
if ((typeof(o) == "bigint") || (o instanceof bigInt)) {
return o.toString(10);
} else if (Array.isArray(o)) {
return o.map(stringifyBigInts);
} else if (typeof o == "object") {
const res = {};
for (let k in o) {
res[k] = stringifyBigInts(o[k]);
}
return res;
} else {
return o;
}
}
describe("SMT Javascript test", function () { describe("SMT Javascript test", function () {
this.timeout(100000); this.timeout(100000);
before( async () => { before( async () => {
@ -30,22 +13,22 @@ describe("SMT Javascript test", function () {
it("Should insert 2 elements and empty them", async () => { it("Should insert 2 elements and empty them", async () => {
const tree = await smt.newMemEmptyTrie(); const tree = await smt.newMemEmptyTrie();
const key1 = bigInt(111); const key1 = Fr.e(111);
const value1 = bigInt(222); const value1 = Fr.e(222);
const key2 = bigInt(333); const key2 = Fr.e(333);
const value2 = bigInt(444); const value2 = Fr.e(444);
await tree.insert(key1,value1); await tree.insert(key1,value1);
await tree.insert(key2,value2); await tree.insert(key2,value2);
await tree.delete(key2); await tree.delete(key2);
await tree.delete(key1); await tree.delete(key1);
assert(tree.root.isZero()); assert(Fr.isZero(tree.root));
}); });
it("Should insert 3 elements in dferent order and should be the same", async () => { it("Should insert 3 elements in dferent order and should be the same", async () => {
const keys = [bigInt(8), bigInt(9), bigInt(32)]; const keys = [Fr.e(8), Fr.e(9), Fr.e(32)];
const values = [bigInt(88), bigInt(99), bigInt(3232)]; const values = [Fr.e(88), Fr.e(99), Fr.e(3232)];
const tree1 = await smt.newMemEmptyTrie(); const tree1 = await smt.newMemEmptyTrie();
const tree2 = await smt.newMemEmptyTrie(); const tree2 = await smt.newMemEmptyTrie();
const tree3 = await smt.newMemEmptyTrie(); const tree3 = await smt.newMemEmptyTrie();
@ -77,11 +60,11 @@ describe("SMT Javascript test", function () {
await tree6.insert(keys[1],values[1]); await tree6.insert(keys[1],values[1]);
await tree6.insert(keys[0],values[0]); await tree6.insert(keys[0],values[0]);
assert(tree1.root.equals(tree2.root)); assert(Fr.eq(tree1.root, tree2.root));
assert(tree2.root.equals(tree3.root)); assert(Fr.eq(tree2.root, tree3.root));
assert(tree3.root.equals(tree4.root)); assert(Fr.eq(tree3.root, tree4.root));
assert(tree4.root.equals(tree5.root)); assert(Fr.eq(tree4.root, tree5.root));
assert(tree5.root.equals(tree6.root)); assert(Fr.eq(tree5.root, tree6.root));
assert.equal(Object.keys(tree1.db.nodes).length, Object.keys(tree2.db.nodes).length); assert.equal(Object.keys(tree1.db.nodes).length, Object.keys(tree2.db.nodes).length);
assert.equal(Object.keys(tree2.db.nodes).length, Object.keys(tree3.db.nodes).length); assert.equal(Object.keys(tree2.db.nodes).length, Object.keys(tree3.db.nodes).length);
@ -93,19 +76,19 @@ describe("SMT Javascript test", function () {
await tree1.delete(keys[1]); await tree1.delete(keys[1]);
await tree2.delete(keys[1]); await tree2.delete(keys[1]);
await tree2.delete(keys[0]); await tree2.delete(keys[0]);
assert(tree1.root.equals(tree2.root)); assert(Fr.eq(tree1.root, tree2.root));
await tree3.delete(keys[0]); await tree3.delete(keys[0]);
await tree3.delete(keys[2]); await tree3.delete(keys[2]);
await tree4.delete(keys[2]); await tree4.delete(keys[2]);
await tree4.delete(keys[0]); await tree4.delete(keys[0]);
assert(tree3.root.equals(tree4.root)); assert(Fr.eq(tree3.root, tree4.root));
await tree5.delete(keys[1]); await tree5.delete(keys[1]);
await tree5.delete(keys[2]); await tree5.delete(keys[2]);
await tree6.delete(keys[2]); await tree6.delete(keys[2]);
await tree6.delete(keys[1]); await tree6.delete(keys[1]);
assert(tree5.root.equals(tree6.root)); assert(Fr.eq(tree5.root, tree6.root));
await tree1.delete(keys[2]); await tree1.delete(keys[2]);
await tree2.delete(keys[2]); await tree2.delete(keys[2]);
@ -114,12 +97,12 @@ describe("SMT Javascript test", function () {
await tree5.delete(keys[0]); await tree5.delete(keys[0]);
await tree6.delete(keys[0]); await tree6.delete(keys[0]);
assert(tree1.root.isZero()); assert(Fr.isZero(tree1.root));
assert(tree2.root.isZero()); assert(Fr.isZero(tree2.root));
assert(tree3.root.isZero()); assert(Fr.isZero(tree3.root));
assert(tree4.root.isZero()); assert(Fr.isZero(tree4.root));
assert(tree5.root.isZero()); assert(Fr.isZero(tree5.root));
assert(tree6.root.isZero()); assert(Fr.isZero(tree6.root));
assert.equal(Object.keys(tree1.db.nodes).length, 0); assert.equal(Object.keys(tree1.db.nodes).length, 0);
assert.equal(Object.keys(tree2.db.nodes).length, 0); assert.equal(Object.keys(tree2.db.nodes).length, 0);
@ -144,7 +127,7 @@ describe("SMT Javascript test", function () {
const arr = []; const arr = [];
const N = 100; const N = 100;
for (let i=0; i<N; i++) { for (let i=0; i<N; i++) {
arr.push(bigInt(i)); arr.push(Fr.e(i));
} }
const insArr = perm(arr); const insArr = perm(arr);
for (let i=0; i<N; i++) { for (let i=0; i<N; i++) {
@ -155,7 +138,7 @@ describe("SMT Javascript test", function () {
await tree.delete(delArr[i]); await tree.delete(delArr[i]);
} }
assert(tree.root.isZero()); assert(Fr.isZero(tree.root));
assert.equal(Object.keys(tree.db.nodes).length, 0); assert.equal(Object.keys(tree.db.nodes).length, 0);
}); });
@ -175,7 +158,7 @@ describe("SMT Javascript test", function () {
await tree1.update(9, 999); await tree1.update(9, 999);
await tree1.update(32, 323232); await tree1.update(32, 323232);
assert(tree1.root.equals(tree2.root)); assert(Fr.eq(tree1.root, tree2.root));
}); });
}); });

@ -1,7 +1,7 @@
const chai = require("chai"); const chai = require("chai");
const path = require("path"); const path = require("path");
const bigInt = require("big-integer");
const tester = require("circom").tester; const tester = require("circom").tester;
const Fr = require("ffjavascript").bn128.Fr;
const smt = require("../src/smt.js"); const smt = require("../src/smt.js");
@ -15,7 +15,7 @@ async function testInsert(tree, key, value, circuit ) {
const res = await tree.insert(key,value); const res = await tree.insert(key,value);
let siblings = res.siblings; let siblings = res.siblings;
while (siblings.length<10) siblings.push(bigInt(0)); while (siblings.length<10) siblings.push(Fr.e(0));
const w = await circuit.calculateWitness({ const w = await circuit.calculateWitness({
fnc: [1,0], fnc: [1,0],
@ -37,7 +37,7 @@ async function testInsert(tree, key, value, circuit ) {
async function testDelete(tree, key, circuit) { async function testDelete(tree, key, circuit) {
const res = await tree.delete(key); const res = await tree.delete(key);
let siblings = res.siblings; let siblings = res.siblings;
while (siblings.length<10) siblings.push(bigInt(0)); while (siblings.length<10) siblings.push(Fr.e(0));
const w = await circuit.calculateWitness({ const w = await circuit.calculateWitness({
fnc: [1,1], fnc: [1,1],
@ -58,7 +58,7 @@ async function testDelete(tree, key, circuit) {
async function testUpdate(tree, key, newValue, circuit) { async function testUpdate(tree, key, newValue, circuit) {
const res = await tree.update(key, newValue); const res = await tree.update(key, newValue);
let siblings = res.siblings; let siblings = res.siblings;
while (siblings.length<10) siblings.push(bigInt(0)); while (siblings.length<10) siblings.push(Fr.e(0));
const w = await circuit.calculateWitness({ const w = await circuit.calculateWitness({
fnc: [0,1], fnc: [0,1],
@ -91,15 +91,15 @@ describe("SMT Processor test", function () {
}); });
it("Should verify an insert to an empty tree", async () => { it("Should verify an insert to an empty tree", async () => {
const key = bigInt(111); const key = Fr.e(111);
const value = bigInt(222); const value = Fr.e(222);
await testInsert(tree, key, value, circuit); await testInsert(tree, key, value, circuit);
}); });
it("It should add another element", async () => { it("It should add another element", async () => {
const key = bigInt(333); const key = Fr.e(333);
const value = bigInt(444); const value = Fr.e(444);
await testInsert(tree, key, value, circuit); await testInsert(tree, key, value, circuit);
}); });
@ -110,8 +110,8 @@ describe("SMT Processor test", function () {
}); });
it("Should test convination of adding and removing 3 elements", async () => { it("Should test convination of adding and removing 3 elements", async () => {
const keys = [bigInt(8), bigInt(9), bigInt(32)]; const keys = [Fr.e(8), Fr.e(9), Fr.e(32)];
const values = [bigInt(88), bigInt(99), bigInt(3232)]; const values = [Fr.e(88), Fr.e(99), Fr.e(3232)];
const tree1 = await smt.newMemEmptyTrie(); const tree1 = await smt.newMemEmptyTrie();
const tree2 = await smt.newMemEmptyTrie(); const tree2 = await smt.newMemEmptyTrie();
const tree3 = await smt.newMemEmptyTrie(); const tree3 = await smt.newMemEmptyTrie();
@ -170,7 +170,7 @@ describe("SMT Processor test", function () {
it("Should match a NOp with random vals", async () => { it("Should match a NOp with random vals", async () => {
let siblings = []; let siblings = [];
while (siblings.length<10) siblings.push(bigInt(88)); while (siblings.length<10) siblings.push(Fr.e(88));
const w = await circuit.calculateWitness({ const w = await circuit.calculateWitness({
fnc: [0,0], fnc: [0,0],
oldRoot: 11, oldRoot: 11,
@ -187,7 +187,7 @@ describe("SMT Processor test", function () {
await circuit.checkConstraints(w); await circuit.checkConstraints(w);
assert(root1.equals(root2)); assert(Fr.eq(root1, root2));
}); });
it("Should update an element", async () => { it("Should update an element", async () => {
const tree1 = await smt.newMemEmptyTrie(); const tree1 = await smt.newMemEmptyTrie();

@ -1,6 +1,6 @@
const chai = require("chai"); const chai = require("chai");
const path = require("path"); const path = require("path");
const bigInt = require("big-integer"); const Fr = require("ffjavascript").bn128.Fr;
const tester = require("circom").tester; const tester = require("circom").tester;
const smt = require("../src/smt.js"); const smt = require("../src/smt.js");
@ -17,7 +17,7 @@ async function testInclusion(tree, key, circuit) {
assert(res.found); assert(res.found);
let siblings = res.siblings; let siblings = res.siblings;
while (siblings.length<10) siblings.push(bigInt(0)); while (siblings.length<10) siblings.push(Fr.e(0));
const w = await circuit.calculateWitness({ const w = await circuit.calculateWitness({
enabled: 1, enabled: 1,
@ -40,7 +40,7 @@ async function testExclusion(tree, key, circuit) {
assert(!res.found); assert(!res.found);
let siblings = res.siblings; let siblings = res.siblings;
while (siblings.length<10) siblings.push(bigInt(0)); while (siblings.length<10) siblings.push(Fr.e(0));
const w = await circuit.calculateWitness({ const w = await circuit.calculateWitness({
enabled: 1, enabled: 1,
@ -110,14 +110,14 @@ describe("SMT Verifier test", function () {
}); });
it("Check inclussion Adria case", async () => { it("Check inclussion Adria case", async () => {
const e1_hi= bigInt("17124152697573569611556136390143205198134245887034837071647643529178599000839"); const e1_hi= Fr.e("17124152697573569611556136390143205198134245887034837071647643529178599000839");
const e1_hv= bigInt("19650379996168153643111744440707177573540245771926102415571667548153444658179"); const e1_hv= Fr.e("19650379996168153643111744440707177573540245771926102415571667548153444658179");
const e2ok_hi= bigInt("16498254692537945203721083102154618658340563351558973077349594629411025251262"); const e2ok_hi= Fr.e("16498254692537945203721083102154618658340563351558973077349594629411025251262");
const e2ok_hv= bigInt("19650379996168153643111744440707177573540245771926102415571667548153444658179"); const e2ok_hv= Fr.e("19650379996168153643111744440707177573540245771926102415571667548153444658179");
const e2fail_hi= bigInt("17195092312975762537892237130737365903429674363577646686847513978084990105579"); const e2fail_hi= Fr.e("17195092312975762537892237130737365903429674363577646686847513978084990105579");
const e2fail_hv= bigInt("19650379996168153643111744440707177573540245771926102415571667548153444658179"); const e2fail_hv= Fr.e("19650379996168153643111744440707177573540245771926102415571667548153444658179");
const tree1 = await smt.newMemEmptyTrie(); const tree1 = await smt.newMemEmptyTrie();
await tree1.insert(e1_hi,e1_hv); await tree1.insert(e1_hi,e1_hv);