Test hash_to_curve output.

This commit is contained in:
blakemscurr
2023-02-09 14:04:40 +13:00
parent 9fb2779368
commit 279972406f
4 changed files with 250 additions and 116 deletions

View File

@@ -12,6 +12,7 @@
"circom_tester": "^0.0.19",
"circom-ecdsa": "github:0xPARC/circom-ecdsa",
"circomlib": "^2.0.5",
"ffjavascript": "^0.2.57",
"secp256k1_hash_to_curve_circom": "https://gitpkg.now.sh/geometryresearch/secp256k1_hash_to_curve/circuits?main"
},
"devDependencies": {
@@ -2413,6 +2414,34 @@
"calcwit": "calcwit.js"
}
},
"node_modules/circom_runtime/node_modules/ffjavascript": {
"version": "0.2.55",
"resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.55.tgz",
"integrity": "sha512-8X0FCIPOWiK6DTWh3pnE3O6D6nIQsirStAXpWMzRDnoDX7SEnDX4I28aVhwjL7L35XS1vy2AU7zc0UCGYxdLjw==",
"dependencies": {
"big-integer": "^1.6.48",
"wasmbuilder": "^0.0.12",
"wasmcurves": "0.1.0",
"web-worker": "^1.2.0"
}
},
"node_modules/circom_runtime/node_modules/wasmbuilder": {
"version": "0.0.12",
"resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.12.tgz",
"integrity": "sha512-dTMpBgrnLOXrN58i2zakn2ScynsBhq9LfyQIsPz4CyxRF9k1GAORniuqn3xmE9NnI1l7g3iiVCkoB2Cl0/oG8w==",
"dependencies": {
"big-integer": "^1.6.48"
}
},
"node_modules/circom_runtime/node_modules/wasmcurves": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.1.0.tgz",
"integrity": "sha512-kIlcgbVUAv2uQ6lGsepGz/m5V40+Z6rvTBkqCYn3Y2+OcXst+UaP4filJYLh/xDxjJl62FFjZZeAnpeli1Y5/Q==",
"dependencies": {
"big-integer": "^1.6.42",
"blakejs": "^1.1.0"
}
},
"node_modules/circom_tester": {
"version": "0.0.19",
"resolved": "https://registry.npmjs.org/circom_tester/-/circom_tester-0.0.19.tgz",
@@ -2449,16 +2478,6 @@
"web-worker": "^1.2.0"
}
},
"node_modules/circom_tester/node_modules/ffjavascript": {
"version": "0.2.57",
"resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.57.tgz",
"integrity": "sha512-V+vxZ/zPNcthrWmqfe/1YGgqdkTamJeXiED0tsk7B84g40DKlrTdx47IqZuiygqAVG6zMw4qYuvXftIJWsmfKQ==",
"dependencies": {
"wasmbuilder": "0.0.16",
"wasmcurves": "0.2.0",
"web-worker": "^1.2.0"
}
},
"node_modules/circom_tester/node_modules/r1csfile": {
"version": "0.0.41",
"resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.41.tgz",
@@ -2510,19 +2529,6 @@
"web-worker": "^1.2.0"
}
},
"node_modules/circom_tester/node_modules/wasmbuilder": {
"version": "0.0.16",
"resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz",
"integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA=="
},
"node_modules/circom_tester/node_modules/wasmcurves": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.0.tgz",
"integrity": "sha512-3e2rbxdujOwaod657gxgmdhZNn+i1qKdHO3Y/bK+8E7bV8ttV/fu5FO4/WLBACF375cK0QDLOP+65Na63qYuWA==",
"dependencies": {
"wasmbuilder": "0.0.16"
}
},
"node_modules/circom-ecdsa": {
"version": "0.0.1",
"resolved": "git+ssh://git@github.com/0xPARC/circom-ecdsa.git#d87eb7068cb35c951187093abe966275c1839ead",
@@ -3211,13 +3217,12 @@
}
},
"node_modules/ffjavascript": {
"version": "0.2.55",
"resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.55.tgz",
"integrity": "sha512-8X0FCIPOWiK6DTWh3pnE3O6D6nIQsirStAXpWMzRDnoDX7SEnDX4I28aVhwjL7L35XS1vy2AU7zc0UCGYxdLjw==",
"version": "0.2.57",
"resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.57.tgz",
"integrity": "sha512-V+vxZ/zPNcthrWmqfe/1YGgqdkTamJeXiED0tsk7B84g40DKlrTdx47IqZuiygqAVG6zMw4qYuvXftIJWsmfKQ==",
"dependencies": {
"big-integer": "^1.6.48",
"wasmbuilder": "^0.0.12",
"wasmcurves": "0.1.0",
"wasmbuilder": "0.0.16",
"wasmcurves": "0.2.0",
"web-worker": "^1.2.0"
}
},
@@ -5280,6 +5285,34 @@
"ffjavascript": "0.2.55"
}
},
"node_modules/r1csfile/node_modules/ffjavascript": {
"version": "0.2.55",
"resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.55.tgz",
"integrity": "sha512-8X0FCIPOWiK6DTWh3pnE3O6D6nIQsirStAXpWMzRDnoDX7SEnDX4I28aVhwjL7L35XS1vy2AU7zc0UCGYxdLjw==",
"dependencies": {
"big-integer": "^1.6.48",
"wasmbuilder": "^0.0.12",
"wasmcurves": "0.1.0",
"web-worker": "^1.2.0"
}
},
"node_modules/r1csfile/node_modules/wasmbuilder": {
"version": "0.0.12",
"resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.12.tgz",
"integrity": "sha512-dTMpBgrnLOXrN58i2zakn2ScynsBhq9LfyQIsPz4CyxRF9k1GAORniuqn3xmE9NnI1l7g3iiVCkoB2Cl0/oG8w==",
"dependencies": {
"big-integer": "^1.6.48"
}
},
"node_modules/r1csfile/node_modules/wasmcurves": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.1.0.tgz",
"integrity": "sha512-kIlcgbVUAv2uQ6lGsepGz/m5V40+Z6rvTBkqCYn3Y2+OcXst+UaP4filJYLh/xDxjJl62FFjZZeAnpeli1Y5/Q==",
"dependencies": {
"big-integer": "^1.6.42",
"blakejs": "^1.1.0"
}
},
"node_modules/raw-body": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
@@ -5543,19 +5576,6 @@
"snarkjs": "build/cli.cjs"
}
},
"node_modules/secp256k1_hash_to_curve_circom/node_modules/wasmbuilder": {
"version": "0.0.16",
"resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz",
"integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA=="
},
"node_modules/secp256k1_hash_to_curve_circom/node_modules/wasmcurves": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.0.tgz",
"integrity": "sha512-3e2rbxdujOwaod657gxgmdhZNn+i1qKdHO3Y/bK+8E7bV8ttV/fu5FO4/WLBACF375cK0QDLOP+65Na63qYuWA==",
"dependencies": {
"wasmbuilder": "0.0.16"
}
},
"node_modules/semver": {
"version": "7.3.8",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -5709,6 +5729,34 @@
"snarkjs": "build/cli.cjs"
}
},
"node_modules/snarkjs/node_modules/ffjavascript": {
"version": "0.2.55",
"resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.55.tgz",
"integrity": "sha512-8X0FCIPOWiK6DTWh3pnE3O6D6nIQsirStAXpWMzRDnoDX7SEnDX4I28aVhwjL7L35XS1vy2AU7zc0UCGYxdLjw==",
"dependencies": {
"big-integer": "^1.6.48",
"wasmbuilder": "^0.0.12",
"wasmcurves": "0.1.0",
"web-worker": "^1.2.0"
}
},
"node_modules/snarkjs/node_modules/wasmbuilder": {
"version": "0.0.12",
"resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.12.tgz",
"integrity": "sha512-dTMpBgrnLOXrN58i2zakn2ScynsBhq9LfyQIsPz4CyxRF9k1GAORniuqn3xmE9NnI1l7g3iiVCkoB2Cl0/oG8w==",
"dependencies": {
"big-integer": "^1.6.48"
}
},
"node_modules/snarkjs/node_modules/wasmcurves": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.1.0.tgz",
"integrity": "sha512-kIlcgbVUAv2uQ6lGsepGz/m5V40+Z6rvTBkqCYn3Y2+OcXst+UaP4filJYLh/xDxjJl62FFjZZeAnpeli1Y5/Q==",
"dependencies": {
"big-integer": "^1.6.42",
"blakejs": "^1.1.0"
}
},
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -6165,20 +6213,16 @@
}
},
"node_modules/wasmbuilder": {
"version": "0.0.12",
"resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.12.tgz",
"integrity": "sha512-dTMpBgrnLOXrN58i2zakn2ScynsBhq9LfyQIsPz4CyxRF9k1GAORniuqn3xmE9NnI1l7g3iiVCkoB2Cl0/oG8w==",
"dependencies": {
"big-integer": "^1.6.48"
}
"version": "0.0.16",
"resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz",
"integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA=="
},
"node_modules/wasmcurves": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.1.0.tgz",
"integrity": "sha512-kIlcgbVUAv2uQ6lGsepGz/m5V40+Z6rvTBkqCYn3Y2+OcXst+UaP4filJYLh/xDxjJl62FFjZZeAnpeli1Y5/Q==",
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.0.tgz",
"integrity": "sha512-3e2rbxdujOwaod657gxgmdhZNn+i1qKdHO3Y/bK+8E7bV8ttV/fu5FO4/WLBACF375cK0QDLOP+65Na63qYuWA==",
"dependencies": {
"big-integer": "^1.6.42",
"blakejs": "^1.1.0"
"wasmbuilder": "0.0.16"
}
},
"node_modules/web-worker": {
@@ -8062,6 +8106,36 @@
"integrity": "sha512-61AnccA8Ozo5apyDf3hR1JMDDNx1DttKll2bdxVpNjUaTiawDuuYE0VNmRvuoKlcy/WAY+HtD3K994WGrOFhJQ==",
"requires": {
"ffjavascript": "0.2.55"
},
"dependencies": {
"ffjavascript": {
"version": "0.2.55",
"resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.55.tgz",
"integrity": "sha512-8X0FCIPOWiK6DTWh3pnE3O6D6nIQsirStAXpWMzRDnoDX7SEnDX4I28aVhwjL7L35XS1vy2AU7zc0UCGYxdLjw==",
"requires": {
"big-integer": "^1.6.48",
"wasmbuilder": "^0.0.12",
"wasmcurves": "0.1.0",
"web-worker": "^1.2.0"
}
},
"wasmbuilder": {
"version": "0.0.12",
"resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.12.tgz",
"integrity": "sha512-dTMpBgrnLOXrN58i2zakn2ScynsBhq9LfyQIsPz4CyxRF9k1GAORniuqn3xmE9NnI1l7g3iiVCkoB2Cl0/oG8w==",
"requires": {
"big-integer": "^1.6.48"
}
},
"wasmcurves": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.1.0.tgz",
"integrity": "sha512-kIlcgbVUAv2uQ6lGsepGz/m5V40+Z6rvTBkqCYn3Y2+OcXst+UaP4filJYLh/xDxjJl62FFjZZeAnpeli1Y5/Q==",
"requires": {
"big-integer": "^1.6.42",
"blakejs": "^1.1.0"
}
}
}
},
"circom_tester": {
@@ -8099,16 +8173,6 @@
}
}
},
"ffjavascript": {
"version": "0.2.57",
"resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.57.tgz",
"integrity": "sha512-V+vxZ/zPNcthrWmqfe/1YGgqdkTamJeXiED0tsk7B84g40DKlrTdx47IqZuiygqAVG6zMw4qYuvXftIJWsmfKQ==",
"requires": {
"wasmbuilder": "0.0.16",
"wasmcurves": "0.2.0",
"web-worker": "^1.2.0"
}
},
"r1csfile": {
"version": "0.0.41",
"resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.41.tgz",
@@ -8160,19 +8224,6 @@
}
}
}
},
"wasmbuilder": {
"version": "0.0.16",
"resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz",
"integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA=="
},
"wasmcurves": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.0.tgz",
"integrity": "sha512-3e2rbxdujOwaod657gxgmdhZNn+i1qKdHO3Y/bK+8E7bV8ttV/fu5FO4/WLBACF375cK0QDLOP+65Na63qYuWA==",
"requires": {
"wasmbuilder": "0.0.16"
}
}
}
},
@@ -8735,13 +8786,12 @@
"integrity": "sha512-ZtijOTFN7TzCujt1fnNhfWPFPSHeZkesff9AXZj+UEjYBynWNUIYpC87Ve4wHzyexQsImicLu7WsC2LHq7/xrQ=="
},
"ffjavascript": {
"version": "0.2.55",
"resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.55.tgz",
"integrity": "sha512-8X0FCIPOWiK6DTWh3pnE3O6D6nIQsirStAXpWMzRDnoDX7SEnDX4I28aVhwjL7L35XS1vy2AU7zc0UCGYxdLjw==",
"version": "0.2.57",
"resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.57.tgz",
"integrity": "sha512-V+vxZ/zPNcthrWmqfe/1YGgqdkTamJeXiED0tsk7B84g40DKlrTdx47IqZuiygqAVG6zMw4qYuvXftIJWsmfKQ==",
"requires": {
"big-integer": "^1.6.48",
"wasmbuilder": "^0.0.12",
"wasmcurves": "0.1.0",
"wasmbuilder": "0.0.16",
"wasmcurves": "0.2.0",
"web-worker": "^1.2.0"
}
},
@@ -10282,6 +10332,36 @@
"@iden3/binfileutils": "0.0.11",
"fastfile": "0.0.20",
"ffjavascript": "0.2.55"
},
"dependencies": {
"ffjavascript": {
"version": "0.2.55",
"resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.55.tgz",
"integrity": "sha512-8X0FCIPOWiK6DTWh3pnE3O6D6nIQsirStAXpWMzRDnoDX7SEnDX4I28aVhwjL7L35XS1vy2AU7zc0UCGYxdLjw==",
"requires": {
"big-integer": "^1.6.48",
"wasmbuilder": "^0.0.12",
"wasmcurves": "0.1.0",
"web-worker": "^1.2.0"
}
},
"wasmbuilder": {
"version": "0.0.12",
"resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.12.tgz",
"integrity": "sha512-dTMpBgrnLOXrN58i2zakn2ScynsBhq9LfyQIsPz4CyxRF9k1GAORniuqn3xmE9NnI1l7g3iiVCkoB2Cl0/oG8w==",
"requires": {
"big-integer": "^1.6.48"
}
},
"wasmcurves": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.1.0.tgz",
"integrity": "sha512-kIlcgbVUAv2uQ6lGsepGz/m5V40+Z6rvTBkqCYn3Y2+OcXst+UaP4filJYLh/xDxjJl62FFjZZeAnpeli1Y5/Q==",
"requires": {
"big-integer": "^1.6.42",
"blakejs": "^1.1.0"
}
}
}
},
"raw-body": {
@@ -10480,19 +10560,6 @@
"logplease": "^1.2.15",
"r1csfile": "0.0.41"
}
},
"wasmbuilder": {
"version": "0.0.16",
"resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz",
"integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA=="
},
"wasmcurves": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.0.tgz",
"integrity": "sha512-3e2rbxdujOwaod657gxgmdhZNn+i1qKdHO3Y/bK+8E7bV8ttV/fu5FO4/WLBACF375cK0QDLOP+65Na63qYuWA==",
"requires": {
"wasmbuilder": "0.0.16"
}
}
}
},
@@ -10592,6 +10659,36 @@
"js-sha3": "^0.8.0",
"logplease": "^1.2.15",
"r1csfile": "0.0.40"
},
"dependencies": {
"ffjavascript": {
"version": "0.2.55",
"resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.55.tgz",
"integrity": "sha512-8X0FCIPOWiK6DTWh3pnE3O6D6nIQsirStAXpWMzRDnoDX7SEnDX4I28aVhwjL7L35XS1vy2AU7zc0UCGYxdLjw==",
"requires": {
"big-integer": "^1.6.48",
"wasmbuilder": "^0.0.12",
"wasmcurves": "0.1.0",
"web-worker": "^1.2.0"
}
},
"wasmbuilder": {
"version": "0.0.12",
"resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.12.tgz",
"integrity": "sha512-dTMpBgrnLOXrN58i2zakn2ScynsBhq9LfyQIsPz4CyxRF9k1GAORniuqn3xmE9NnI1l7g3iiVCkoB2Cl0/oG8w==",
"requires": {
"big-integer": "^1.6.48"
}
},
"wasmcurves": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.1.0.tgz",
"integrity": "sha512-kIlcgbVUAv2uQ6lGsepGz/m5V40+Z6rvTBkqCYn3Y2+OcXst+UaP4filJYLh/xDxjJl62FFjZZeAnpeli1Y5/Q==",
"requires": {
"big-integer": "^1.6.42",
"blakejs": "^1.1.0"
}
}
}
},
"source-map": {
@@ -10918,20 +11015,16 @@
}
},
"wasmbuilder": {
"version": "0.0.12",
"resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.12.tgz",
"integrity": "sha512-dTMpBgrnLOXrN58i2zakn2ScynsBhq9LfyQIsPz4CyxRF9k1GAORniuqn3xmE9NnI1l7g3iiVCkoB2Cl0/oG8w==",
"requires": {
"big-integer": "^1.6.48"
}
"version": "0.0.16",
"resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz",
"integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA=="
},
"wasmcurves": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.1.0.tgz",
"integrity": "sha512-kIlcgbVUAv2uQ6lGsepGz/m5V40+Z6rvTBkqCYn3Y2+OcXst+UaP4filJYLh/xDxjJl62FFjZZeAnpeli1Y5/Q==",
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.0.tgz",
"integrity": "sha512-3e2rbxdujOwaod657gxgmdhZNn+i1qKdHO3Y/bK+8E7bV8ttV/fu5FO4/WLBACF375cK0QDLOP+65Na63qYuWA==",
"requires": {
"big-integer": "^1.6.42",
"blakejs": "^1.1.0"
"wasmbuilder": "0.0.16"
}
},
"web-worker": {

View File

@@ -9,9 +9,10 @@
},
"license": "ISC",
"dependencies": {
"circom_tester": "^0.0.19",
"circom-ecdsa": "github:0xPARC/circom-ecdsa",
"circom_tester": "^0.0.19",
"circomlib": "^2.0.5",
"ffjavascript": "^0.2.57",
"secp256k1_hash_to_curve_circom": "https://gitpkg.now.sh/geometryresearch/secp256k1_hash_to_curve/circuits?main"
},
"devDependencies": {

View File

@@ -0,0 +1,5 @@
pragma circom 2.1.2;
include "../node_modules/secp256k1_hash_to_curve_circom/circom/hash_to_curve.circom";
component main = HashToCurve(49);

View File

@@ -3,9 +3,13 @@ import { wasm as wasm_tester } from 'circom_tester'
import { describe, expect, test } from '@jest/globals';
import * as enclave from "../../javascript/src/index";
import { testSecretKey, testPublicKey, testR, testMessage, testMessageString } from "../../javascript/test/signals.test";
import { uint8ArrayToBigInt, hexToBigInt, hexToUint8Array } from "../../javascript/src/utils/encoding";
import { uint8ArrayToBigInt, hexToBigInt, hexToUint8Array, messageToUint8Array } from "../../javascript/src/utils/encoding";
import { CURVE, Point } from "@noble/secp256k1";
import { generate_inputs } from "secp256k1_hash_to_curve_circom/ts/generate_inputs";
import { generate_inputs_from_array, generate_inputs } from "secp256k1_hash_to_curve_circom/ts/generate_inputs";
import { bufToSha256PaddedBitArr, strToSha256PaddedBitArr } from "secp256k1_hash_to_curve_circom/ts/utils";
import { utils } from "ffjavascript"
import { concatUint8Arrays } from '../../javascript/src/utils/encoding';
jest.setTimeout(1_000_000);
@@ -25,7 +29,28 @@ describe("Nullifier Circuit", () => {
const skMultC = (uint8ArrayToBigInt(testSecretKey) * hexToBigInt(c)) % CURVE.n;
const s = ((skMultC + uint8ArrayToBigInt(testR)) % CURVE.n);
test.only("circuit verifies valid nullifier", async () => {
const public_key_bytes = Array.from(testPublicKey);
const message_bytes = Array.from(testMessage);
const hashMPkPoint = new Point(
hexToBigInt(hashMPk.x.toString()),
hexToBigInt(hashMPk.y.toString())
)
const hashMPkBytes = hashMPkPoint.toRawBytes(true);
test("hash to curve works", async () => {
const inputs = utils.stringifyBigInts(generate_inputs_from_array(message_bytes.concat(public_key_bytes)));
const p = join(__dirname, 'hash_to_curve_test.circom')
const circuit = await wasm_tester(p, {"json":true, "sym": true})
const w = await circuit.calculateWitness({
...inputs,
}, true)
await circuit.checkConstraints(w)
await circuit.assertOut(w, {out: pointToCircuitValue(hashMPkPoint)});
})
test("circuit verifies valid nullifier", async () => {
const p = join(__dirname, 'vfy_test.circom')
console.log("about to compile")
const circuit = await wasm_tester(p)
@@ -33,19 +58,29 @@ describe("Nullifier Circuit", () => {
console.log("about to calculate witness")
const public_key_bytes = [];
testPublicKey.forEach(x => {
public_key_bytes.push(BigInt(x))
})
const {msg: _, ...hash_to_curve_inputs} = utils.stringifyBigInts(generate_inputs_from_array(message_bytes.concat(public_key_bytes)));
// Calculate padded bit string for sha256 circuit
const preimage = concatUint8Arrays([
Point.BASE.toRawBytes(false).slice(1),
Point.fromPrivateKey(testSecretKey).toRawBytes(false).slice(1),
hashMPkBytes.slice(1),
nullifier.toRawBytes(false).slice(1),
gPowR.toRawBytes(false).slice(1),
hashMPkPowR.toRawBytes(false).slice(1),
])
const padded_bit_string = bufToSha256PaddedBitArr(Buffer.from(Array.from(preimage)));
const w = await circuit.calculateWitness({
// Main circuit inputs
c: scalarToCircuitValue(hexToBigInt(c)),
s: scalarToCircuitValue(s),
msg: message_bytes,
public_key: pointToCircuitValue(Point.fromPrivateKey(testSecretKey)),
public_key_bytes,
nullifier: pointToCircuitValue(nullifier),
...generate_inputs(testMessageString),
hash_padded_bits: [...padded_bit_string].map(Number),
...hash_to_curve_inputs,
})
console.log("calculated witness")
await circuit.checkConstraints(w)
@@ -134,4 +169,4 @@ function registersToBigint(registers: bigint[], bits_per_register: bigint): bigi
}
return value;
}
}