mirror of
https://github.com/selfxyz/self.git
synced 2026-01-09 22:58:20 -05:00
add sha1 proof generation to modal prover
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@@ -1,3 +1,5 @@
|
||||
contracts/contracts/RegisterASCII.txt
|
||||
sdk/.env
|
||||
dist
|
||||
dist
|
||||
**/node_modules
|
||||
**/node_modules/
|
||||
@@ -1,5 +0,0 @@
|
||||
pragma circom 2.1.6;
|
||||
|
||||
include "../../dsc.circom";
|
||||
|
||||
component main { public [ merkle_root ] } = DSC(1664,121 ,17 ,121, 34, 256, 12);
|
||||
@@ -1,5 +1,5 @@
|
||||
pragma circom 2.1.6;
|
||||
|
||||
include "../../dsc_sha1WithRSAEncryption.circom";
|
||||
include "../../dsc/dsc_sha1_rsa.circom";
|
||||
|
||||
component main { public [ merkle_root ] } = DSC_sha1WithRSAEncryption(1664,121 ,17 ,121, 34, 256, 12);
|
||||
component main { public [ merkle_root ] } = DSC_SHA1_RSA(1664,121 ,17 ,121, 34, 256, 12);
|
||||
5
circuits/circuits/tests/dsc/dsc_sha256_rsa_4096.circom
Normal file
5
circuits/circuits/tests/dsc/dsc_sha256_rsa_4096.circom
Normal file
@@ -0,0 +1,5 @@
|
||||
pragma circom 2.1.6;
|
||||
|
||||
include "../../dsc/dsc_sha256_rsa.circom";
|
||||
|
||||
component main { public [ merkle_root ] } = DSC_SHA256_RSA(1664,121 ,17 ,121, 34, 256, 12);
|
||||
@@ -1,44 +1,68 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Record the start time
|
||||
START_TIME=$(date +%s)
|
||||
TOTAL_START_TIME=$(date +%s)
|
||||
|
||||
mkdir -p build
|
||||
cd build
|
||||
if [ ! -f powersOfTau28_hez_final_22.ptau ]; then
|
||||
echo "Download power of tau...."
|
||||
echo -e "\033[34mDownload power of tau....\033[0m"
|
||||
wget https://hermez.s3-eu-west-1.amazonaws.com/powersOfTau28_hez_final_22.ptau
|
||||
echo "Finished download!"
|
||||
echo -e "\033[32mFinished download!\033[0m"
|
||||
else
|
||||
echo "Powers of tau file already downloaded... Skip download action!"
|
||||
echo -e "\033[90mPowers of tau file already downloaded\033[0m"
|
||||
fi
|
||||
cd ..
|
||||
|
||||
echo "compiling circuit"
|
||||
circom circuits/tests/certificates/dsc_4096.circom -l node_modules -l ./node_modules/@zk-kit/binary-merkle-root.circom/src -l ./node_modules/circomlib/circuits --r1cs --O1 --wasm -c --output build
|
||||
build_circuit() {
|
||||
local CIRCUIT_NAME=$1
|
||||
local START_TIME=$(date +%s)
|
||||
|
||||
echo "building zkey"
|
||||
yarn snarkjs groth16 setup build/dsc_4096.r1cs build/powersOfTau28_hez_final_22.ptau build/dsc_4096.zkey
|
||||
echo -e "\033[34mcompiling circuit: $CIRCUIT_NAME\033[0m"
|
||||
circom circuits/tests/dsc/${CIRCUIT_NAME}.circom -l node_modules -l ./node_modules/@zk-kit/binary-merkle-root.circom/src -l ./node_modules/circomlib/circuits --r1cs --O1 --wasm -c --output build
|
||||
|
||||
if command -v openssl &> /dev/null
|
||||
then
|
||||
RAND_STR=$(openssl rand -hex 64)
|
||||
else
|
||||
RAND_STR="random text"
|
||||
fi
|
||||
echo -e "\033[34mbuilding zkey\033[0m"
|
||||
yarn snarkjs groth16 setup build/${CIRCUIT_NAME}.r1cs build/powersOfTau28_hez_final_22.ptau build/${CIRCUIT_NAME}.zkey
|
||||
|
||||
echo "building vkey"
|
||||
echo $RAND_STR | yarn snarkjs zkey contribute build/dsc_4096.zkey build/dsc_4096_final.zkey
|
||||
yarn snarkjs zkey export verificationkey build/dsc_4096_final.zkey build/dsc_4096_vkey.json
|
||||
if command -v openssl &> /dev/null
|
||||
then
|
||||
RAND_STR=$(openssl rand -hex 64)
|
||||
else
|
||||
RAND_STR="random text"
|
||||
fi
|
||||
|
||||
yarn snarkjs zkey export solidityverifier build/dsc_4096_final.zkey build/Verifier_dsc_4096.sol
|
||||
sed -i '' 's/Groth16Verifier/Verifier_dsc_4096/g' build/Verifier_dsc_4096.sol
|
||||
cp build/Verifier_dsc_4096.sol ../contracts/contracts/Verifier_dsc_4096.sol
|
||||
echo "copied Verifier_dsc_4096.sol to contracts"
|
||||
echo -e "\033[34mbuilding vkey\033[0m"
|
||||
echo $RAND_STR | yarn snarkjs zkey contribute build/${CIRCUIT_NAME}.zkey build/${CIRCUIT_NAME}_final.zkey
|
||||
yarn snarkjs zkey export verificationkey build/${CIRCUIT_NAME}_final.zkey build/${CIRCUIT_NAME}_vkey.json
|
||||
|
||||
echo "Build completed in $(($(date +%s) - $START_TIME)) seconds"
|
||||
yarn snarkjs zkey export solidityverifier build/${CIRCUIT_NAME}_final.zkey build/Verifier_${CIRCUIT_NAME}.sol
|
||||
sed -i '' "s/Groth16Verifier/Verifier_${CIRCUIT_NAME}/g" build/Verifier_${CIRCUIT_NAME}.sol
|
||||
cp build/Verifier_${CIRCUIT_NAME}.sol ../contracts/contracts/Verifier_${CIRCUIT_NAME}.sol
|
||||
echo -e "\033[34mcopied Verifier_${CIRCUIT_NAME}.sol to contracts\033[0m"
|
||||
|
||||
echo "file sizes:"
|
||||
echo "Size of dsc_4096.r1cs: $(wc -c <build/dsc_4096.r1cs) bytes"
|
||||
echo "Size of dsc_4096.wasm: $(wc -c <build/dsc_4096_js/dsc_4096.wasm) bytes"
|
||||
echo "Size of dsc_4096_final.zkey: $(wc -c <build/dsc_4096_final.zkey) bytes"
|
||||
echo -e "\033[32mBuild of $CIRCUIT_NAME completed in $(($(date +%s) - START_TIME)) seconds\033[0m"
|
||||
|
||||
echo "file sizes:"
|
||||
echo -e "\033[34mSize of ${CIRCUIT_NAME}.r1cs: $(wc -c <build/${CIRCUIT_NAME}.r1cs) bytes\033[0m"
|
||||
echo -e "\033[34mSize of ${CIRCUIT_NAME}.wasm: $(wc -c <build/${CIRCUIT_NAME}_js/${CIRCUIT_NAME}.wasm) bytes\033[0m"
|
||||
echo -e "\033[34mSize of ${CIRCUIT_NAME}_final.zkey: $(wc -c <build/${CIRCUIT_NAME}_final.zkey) bytes\033[0m"
|
||||
}
|
||||
|
||||
# Define circuits and their deployment flags
|
||||
# name:deploy_flag
|
||||
CIRCUITS=(
|
||||
"dsc_sha256_rsa_4096:true"
|
||||
"dsc_sha1_rsa_4096:true"
|
||||
)
|
||||
|
||||
for circuit in "${CIRCUITS[@]}"; do
|
||||
IFS=':' read -r CIRCUIT_NAME DEPLOY_FLAG <<< "$circuit"
|
||||
if [ "$DEPLOY_FLAG" = "true" ]; then
|
||||
echo -e "\033[34mBuilding circuit $CIRCUIT_NAME\033[0m"
|
||||
build_circuit "$CIRCUIT_NAME"
|
||||
else
|
||||
echo -e "\033[90mSkipping build for $CIRCUIT_NAME\033[0m"
|
||||
fi
|
||||
done
|
||||
|
||||
echo -e "\033[32mTotal build completed in $(($(date +%s) - TOTAL_START_TIME)) seconds\033[0m"
|
||||
177
contracts/contracts/Verifier_dsc_sha1_rsa_4096.sol
Normal file
177
contracts/contracts/Verifier_dsc_sha1_rsa_4096.sol
Normal file
@@ -0,0 +1,177 @@
|
||||
// SPDX-License-Identifier: GPL-3.0
|
||||
/*
|
||||
Copyright 2021 0KIMS association.
|
||||
|
||||
This file is generated with [snarkJS](https://github.com/iden3/snarkjs).
|
||||
|
||||
snarkJS is a free software: you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
snarkJS is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with snarkJS. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
pragma solidity >=0.7.0 <0.9.0;
|
||||
|
||||
contract Verifier_dsc_sha1_rsa_4096 {
|
||||
// Scalar field size
|
||||
uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617;
|
||||
// Base field size
|
||||
uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583;
|
||||
|
||||
// Verification Key data
|
||||
uint256 constant alphax = 20491192805390485299153009773594534940189261866228447918068658471970481763042;
|
||||
uint256 constant alphay = 9383485363053290200918347156157836566562967994039712273449902621266178545958;
|
||||
uint256 constant betax1 = 4252822878758300859123897981450591353533073413197771768651442665752259397132;
|
||||
uint256 constant betax2 = 6375614351688725206403948262868962793625744043794305715222011528459656738731;
|
||||
uint256 constant betay1 = 21847035105528745403288232691147584728191162732299865338377159692350059136679;
|
||||
uint256 constant betay2 = 10505242626370262277552901082094356697409835680220590971873171140371331206856;
|
||||
uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;
|
||||
uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;
|
||||
uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;
|
||||
uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;
|
||||
uint256 constant deltax1 = 2504819411237842658609352397158415272245653421477946289695883131063258228520;
|
||||
uint256 constant deltax2 = 10238320193043068829157960501967854222692702878458503554377378628488406921948;
|
||||
uint256 constant deltay1 = 12816079684433910946739040167512171044510230919779819953946700906887571584144;
|
||||
uint256 constant deltay2 = 18340470375805803608701337556657721848991359834488959516971530751169316859620;
|
||||
|
||||
|
||||
uint256 constant IC0x = 12988588557782490372720106385872966314967422240534584361175457924756107643693;
|
||||
uint256 constant IC0y = 14646142751640522118026183869854599975857973506262663217812464078644335492697;
|
||||
|
||||
uint256 constant IC1x = 21227048561254712863337958008644060921163858069022181377071355406552412741483;
|
||||
uint256 constant IC1y = 11145905413764400843127715849833092427485801651255980452289482279055672757081;
|
||||
|
||||
uint256 constant IC2x = 6756928444291085777119241838626515299290626488852428949035210829352311876378;
|
||||
uint256 constant IC2y = 1864326467329351741201710240834361213001354015077536966380306996231129299589;
|
||||
|
||||
|
||||
// Memory data
|
||||
uint16 constant pVk = 0;
|
||||
uint16 constant pPairing = 128;
|
||||
|
||||
uint16 constant pLastMem = 896;
|
||||
|
||||
function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[2] calldata _pubSignals) public view returns (bool) {
|
||||
assembly {
|
||||
function checkField(v) {
|
||||
if iszero(lt(v, q)) {
|
||||
mstore(0, 0)
|
||||
return(0, 0x20)
|
||||
}
|
||||
}
|
||||
|
||||
// G1 function to multiply a G1 value(x,y) to value in an address
|
||||
function g1_mulAccC(pR, x, y, s) {
|
||||
let success
|
||||
let mIn := mload(0x40)
|
||||
mstore(mIn, x)
|
||||
mstore(add(mIn, 32), y)
|
||||
mstore(add(mIn, 64), s)
|
||||
|
||||
success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64)
|
||||
|
||||
if iszero(success) {
|
||||
mstore(0, 0)
|
||||
return(0, 0x20)
|
||||
}
|
||||
|
||||
mstore(add(mIn, 64), mload(pR))
|
||||
mstore(add(mIn, 96), mload(add(pR, 32)))
|
||||
|
||||
success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)
|
||||
|
||||
if iszero(success) {
|
||||
mstore(0, 0)
|
||||
return(0, 0x20)
|
||||
}
|
||||
}
|
||||
|
||||
function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk {
|
||||
let _pPairing := add(pMem, pPairing)
|
||||
let _pVk := add(pMem, pVk)
|
||||
|
||||
mstore(_pVk, IC0x)
|
||||
mstore(add(_pVk, 32), IC0y)
|
||||
|
||||
// Compute the linear combination vk_x
|
||||
|
||||
g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0)))
|
||||
|
||||
g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32)))
|
||||
|
||||
|
||||
// -A
|
||||
mstore(_pPairing, calldataload(pA))
|
||||
mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q))
|
||||
|
||||
// B
|
||||
mstore(add(_pPairing, 64), calldataload(pB))
|
||||
mstore(add(_pPairing, 96), calldataload(add(pB, 32)))
|
||||
mstore(add(_pPairing, 128), calldataload(add(pB, 64)))
|
||||
mstore(add(_pPairing, 160), calldataload(add(pB, 96)))
|
||||
|
||||
// alpha1
|
||||
mstore(add(_pPairing, 192), alphax)
|
||||
mstore(add(_pPairing, 224), alphay)
|
||||
|
||||
// beta2
|
||||
mstore(add(_pPairing, 256), betax1)
|
||||
mstore(add(_pPairing, 288), betax2)
|
||||
mstore(add(_pPairing, 320), betay1)
|
||||
mstore(add(_pPairing, 352), betay2)
|
||||
|
||||
// vk_x
|
||||
mstore(add(_pPairing, 384), mload(add(pMem, pVk)))
|
||||
mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32))))
|
||||
|
||||
|
||||
// gamma2
|
||||
mstore(add(_pPairing, 448), gammax1)
|
||||
mstore(add(_pPairing, 480), gammax2)
|
||||
mstore(add(_pPairing, 512), gammay1)
|
||||
mstore(add(_pPairing, 544), gammay2)
|
||||
|
||||
// C
|
||||
mstore(add(_pPairing, 576), calldataload(pC))
|
||||
mstore(add(_pPairing, 608), calldataload(add(pC, 32)))
|
||||
|
||||
// delta2
|
||||
mstore(add(_pPairing, 640), deltax1)
|
||||
mstore(add(_pPairing, 672), deltax2)
|
||||
mstore(add(_pPairing, 704), deltay1)
|
||||
mstore(add(_pPairing, 736), deltay2)
|
||||
|
||||
|
||||
let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20)
|
||||
|
||||
isOk := and(success, mload(_pPairing))
|
||||
}
|
||||
|
||||
let pMem := mload(0x40)
|
||||
mstore(0x40, add(pMem, pLastMem))
|
||||
|
||||
// Validate that all evaluations ∈ F
|
||||
|
||||
checkField(calldataload(add(_pubSignals, 0)))
|
||||
|
||||
checkField(calldataload(add(_pubSignals, 32)))
|
||||
|
||||
checkField(calldataload(add(_pubSignals, 64)))
|
||||
|
||||
|
||||
// Validate all evaluations
|
||||
let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem)
|
||||
|
||||
mstore(0, isValid)
|
||||
return(0, 0x20)
|
||||
}
|
||||
}
|
||||
}
|
||||
177
contracts/contracts/Verifier_dsc_sha256_rsa_4096.sol
Normal file
177
contracts/contracts/Verifier_dsc_sha256_rsa_4096.sol
Normal file
@@ -0,0 +1,177 @@
|
||||
// SPDX-License-Identifier: GPL-3.0
|
||||
/*
|
||||
Copyright 2021 0KIMS association.
|
||||
|
||||
This file is generated with [snarkJS](https://github.com/iden3/snarkjs).
|
||||
|
||||
snarkJS is a free software: you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
snarkJS is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with snarkJS. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
pragma solidity >=0.7.0 <0.9.0;
|
||||
|
||||
contract Verifier_dsc_sha256_rsa_4096 {
|
||||
// Scalar field size
|
||||
uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617;
|
||||
// Base field size
|
||||
uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583;
|
||||
|
||||
// Verification Key data
|
||||
uint256 constant alphax = 20491192805390485299153009773594534940189261866228447918068658471970481763042;
|
||||
uint256 constant alphay = 9383485363053290200918347156157836566562967994039712273449902621266178545958;
|
||||
uint256 constant betax1 = 4252822878758300859123897981450591353533073413197771768651442665752259397132;
|
||||
uint256 constant betax2 = 6375614351688725206403948262868962793625744043794305715222011528459656738731;
|
||||
uint256 constant betay1 = 21847035105528745403288232691147584728191162732299865338377159692350059136679;
|
||||
uint256 constant betay2 = 10505242626370262277552901082094356697409835680220590971873171140371331206856;
|
||||
uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;
|
||||
uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;
|
||||
uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;
|
||||
uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;
|
||||
uint256 constant deltax1 = 5794615369833932449623711589651728862835090361076583083326728412120661912694;
|
||||
uint256 constant deltax2 = 13321797380673210476515077034913864616333897796635017120985610572456619578202;
|
||||
uint256 constant deltay1 = 1627189806585647035450761519737947618200743049504008744031689523936664845869;
|
||||
uint256 constant deltay2 = 242783906272443516559840962669397308390618651647582683340262167519339576708;
|
||||
|
||||
|
||||
uint256 constant IC0x = 14799294619686504347123706464984449377033577151047902926075007068263899855296;
|
||||
uint256 constant IC0y = 4138452911775673696088952365685111981651322204728180622715924120168892012882;
|
||||
|
||||
uint256 constant IC1x = 19237066254572577791709165085639802359499616635829287221569436085741781781740;
|
||||
uint256 constant IC1y = 10362088703927009878905137753566677570786091714652005156465176142264008904616;
|
||||
|
||||
uint256 constant IC2x = 1633277393836614509092356048427487579995470358819940373097445848231970157637;
|
||||
uint256 constant IC2y = 12348867875321881462145411826101774663987266006830069071058772539021485934684;
|
||||
|
||||
|
||||
// Memory data
|
||||
uint16 constant pVk = 0;
|
||||
uint16 constant pPairing = 128;
|
||||
|
||||
uint16 constant pLastMem = 896;
|
||||
|
||||
function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[2] calldata _pubSignals) public view returns (bool) {
|
||||
assembly {
|
||||
function checkField(v) {
|
||||
if iszero(lt(v, q)) {
|
||||
mstore(0, 0)
|
||||
return(0, 0x20)
|
||||
}
|
||||
}
|
||||
|
||||
// G1 function to multiply a G1 value(x,y) to value in an address
|
||||
function g1_mulAccC(pR, x, y, s) {
|
||||
let success
|
||||
let mIn := mload(0x40)
|
||||
mstore(mIn, x)
|
||||
mstore(add(mIn, 32), y)
|
||||
mstore(add(mIn, 64), s)
|
||||
|
||||
success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64)
|
||||
|
||||
if iszero(success) {
|
||||
mstore(0, 0)
|
||||
return(0, 0x20)
|
||||
}
|
||||
|
||||
mstore(add(mIn, 64), mload(pR))
|
||||
mstore(add(mIn, 96), mload(add(pR, 32)))
|
||||
|
||||
success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)
|
||||
|
||||
if iszero(success) {
|
||||
mstore(0, 0)
|
||||
return(0, 0x20)
|
||||
}
|
||||
}
|
||||
|
||||
function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk {
|
||||
let _pPairing := add(pMem, pPairing)
|
||||
let _pVk := add(pMem, pVk)
|
||||
|
||||
mstore(_pVk, IC0x)
|
||||
mstore(add(_pVk, 32), IC0y)
|
||||
|
||||
// Compute the linear combination vk_x
|
||||
|
||||
g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0)))
|
||||
|
||||
g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32)))
|
||||
|
||||
|
||||
// -A
|
||||
mstore(_pPairing, calldataload(pA))
|
||||
mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q))
|
||||
|
||||
// B
|
||||
mstore(add(_pPairing, 64), calldataload(pB))
|
||||
mstore(add(_pPairing, 96), calldataload(add(pB, 32)))
|
||||
mstore(add(_pPairing, 128), calldataload(add(pB, 64)))
|
||||
mstore(add(_pPairing, 160), calldataload(add(pB, 96)))
|
||||
|
||||
// alpha1
|
||||
mstore(add(_pPairing, 192), alphax)
|
||||
mstore(add(_pPairing, 224), alphay)
|
||||
|
||||
// beta2
|
||||
mstore(add(_pPairing, 256), betax1)
|
||||
mstore(add(_pPairing, 288), betax2)
|
||||
mstore(add(_pPairing, 320), betay1)
|
||||
mstore(add(_pPairing, 352), betay2)
|
||||
|
||||
// vk_x
|
||||
mstore(add(_pPairing, 384), mload(add(pMem, pVk)))
|
||||
mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32))))
|
||||
|
||||
|
||||
// gamma2
|
||||
mstore(add(_pPairing, 448), gammax1)
|
||||
mstore(add(_pPairing, 480), gammax2)
|
||||
mstore(add(_pPairing, 512), gammay1)
|
||||
mstore(add(_pPairing, 544), gammay2)
|
||||
|
||||
// C
|
||||
mstore(add(_pPairing, 576), calldataload(pC))
|
||||
mstore(add(_pPairing, 608), calldataload(add(pC, 32)))
|
||||
|
||||
// delta2
|
||||
mstore(add(_pPairing, 640), deltax1)
|
||||
mstore(add(_pPairing, 672), deltax2)
|
||||
mstore(add(_pPairing, 704), deltay1)
|
||||
mstore(add(_pPairing, 736), deltay2)
|
||||
|
||||
|
||||
let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20)
|
||||
|
||||
isOk := and(success, mload(_pPairing))
|
||||
}
|
||||
|
||||
let pMem := mload(0x40)
|
||||
mstore(0x40, add(pMem, pLastMem))
|
||||
|
||||
// Validate that all evaluations ∈ F
|
||||
|
||||
checkField(calldataload(add(_pubSignals, 0)))
|
||||
|
||||
checkField(calldataload(add(_pubSignals, 32)))
|
||||
|
||||
checkField(calldataload(add(_pubSignals, 64)))
|
||||
|
||||
|
||||
// Validate all evaluations
|
||||
let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem)
|
||||
|
||||
mstore(0, isValid)
|
||||
return(0, 0x20)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,8 @@ RUN apt-get update && apt-get upgrade -y
|
||||
# Update the package list and install necessary dependencies
|
||||
RUN apt-get update && \
|
||||
apt install -y cmake build-essential pkg-config libssl-dev libgmp-dev libsodium-dev nasm git awscli gcc nodejs npm
|
||||
# Install jq
|
||||
RUN apt-get update && apt-get install -y jq
|
||||
|
||||
# Node install
|
||||
RUN npm install -g n
|
||||
|
||||
@@ -5,6 +5,7 @@ import subprocess
|
||||
import asyncio
|
||||
import json
|
||||
import hashlib
|
||||
|
||||
image = Image.from_dockerfile("Dockerfile")
|
||||
|
||||
app = App(image=image)
|
||||
@@ -16,6 +17,16 @@ mount = Mount.from_local_dir("src", remote_path="/root/src")
|
||||
async def generate_dsc_proof(request: Request):
|
||||
# Read the JSON data from the request body
|
||||
data = await request.json()
|
||||
|
||||
# Extract the signature_algorithm
|
||||
signature_algorithm = data.get("signature_algorithm")
|
||||
if signature_algorithm not in ["sha256_rsa", "sha1_rsa"]:
|
||||
return PlainTextResponse("Invalid or missing signature_algorithm", status_code=400)
|
||||
|
||||
# Ensure 'inputs' key exists
|
||||
if "inputs" not in data:
|
||||
return PlainTextResponse("Missing 'inputs' in request data", status_code=400)
|
||||
|
||||
# Convert JSON data to a properly formatted string
|
||||
json_data = json.dumps(data)
|
||||
|
||||
@@ -54,5 +65,4 @@ async def generate_dsc_proof(request: Request):
|
||||
|
||||
# Run the app
|
||||
if __name__ == "__main__":
|
||||
app.run()
|
||||
|
||||
app.run()
|
||||
@@ -1,3 +1,6 @@
|
||||
cp ../circuits/build/dsc_4096_final.zkey src/circuit/dsc_4096_final.zkey
|
||||
cp ../circuits/build/dsc_4096_js/dsc_4096.wasm src/circuit/dsc_4096.wasm
|
||||
modal deploy dsc_prover.py --name dsc_prover
|
||||
cp ../circuits/build/dsc_sha256_rsa_4096_final.zkey src/circuit/dsc_sha256_rsa_4096_final.zkey
|
||||
cp ../circuits/build/dsc_sha256_rsa_4096_js/dsc_sha256_rsa_4096.wasm src/circuit/dsc_sha256_rsa_4096.wasm
|
||||
cp ../circuits/build/dsc_sha1_rsa_4096_final.zkey src/circuit/dsc_sha1_rsa_4096_final.zkey
|
||||
cp ../circuits/build/dsc_sha1_rsa_4096_js/dsc_sha1_rsa_4096.wasm src/circuit/dsc_sha1_rsa_4096.wasm
|
||||
cp ../circuits/build/dsc_sha256_rsa_4096_vkey.json src/vkey/dsc_sha256_rsa_4096_vkey.json
|
||||
cp ../circuits/build/dsc_sha1_rsa_4096_vkey.json src/vkey/dsc_sha1_rsa_4096_vkey.json
|
||||
1
prover/launch_modal_server.sh
Normal file
1
prover/launch_modal_server.sh
Normal file
@@ -0,0 +1 @@
|
||||
modal deploy dsc_prover.py --name dsc_prover
|
||||
@@ -2,6 +2,18 @@
|
||||
# Read input from stdin
|
||||
input=$(cat)
|
||||
|
||||
# Extract the signature_algorithm
|
||||
signature_algorithm=$(echo "$input" | jq -r '.signature_algorithm // "sha256_rsa"')
|
||||
|
||||
# Set the circuit files based on the signature_algorithm
|
||||
if [ "$signature_algorithm" == "sha1_rsa" ]; then
|
||||
circuit_wasm="/root/src/circuit/dsc_sha1_rsa_4096.wasm"
|
||||
circuit_zkey="/root/src/circuit/dsc_sha1_rsa_4096_final.zkey"
|
||||
else
|
||||
circuit_wasm="/root/src/circuit/dsc_sha256_rsa_4096.wasm"
|
||||
circuit_zkey="/root/src/circuit/dsc_sha256_rsa_4096_final.zkey"
|
||||
fi
|
||||
|
||||
# Compute the hash of the input data
|
||||
hash=$(echo -n "$input" | sha256sum | cut -d ' ' -f 1)
|
||||
|
||||
@@ -11,13 +23,14 @@ mkdir -p /root/src/data/$hash
|
||||
# Write input to the unique directory
|
||||
echo "$input" > /root/src/data/$hash/input.json
|
||||
|
||||
# Extract only the 'inputs' part of the JSON for the circuit
|
||||
jq '.inputs' /root/src/data/$hash/input.json > /root/src/data/$hash/circuit_input.json
|
||||
|
||||
# Define paths
|
||||
input_path="/root/src/data/$hash/input.json"
|
||||
input_path="/root/src/data/$hash/circuit_input.json"
|
||||
witness_path="/root/src/data/$hash/witness.wtns"
|
||||
proof_path="/root/src/data/$hash/proof.json"
|
||||
public_path="/root/src/data/$hash/public.json"
|
||||
circuit_wasm="/root/src/circuit/dsc_4096.wasm"
|
||||
circuit_zkey="/root/src/circuit/dsc_4096_final.zkey"
|
||||
prover_path="/root/rapidsnark/build/prover"
|
||||
|
||||
# Calculate the witness
|
||||
@@ -47,7 +60,7 @@ fi
|
||||
echo "ldd $prover_path"
|
||||
ldd "$prover_path"
|
||||
status_lld=$?
|
||||
echo "✓ lld prover dependencies present! ${status_lld}"
|
||||
echo "✓ ldd prover dependencies present! ${status_lld}"
|
||||
|
||||
echo "$prover_path $circuit_zkey $witness_path $proof_path $public_path"
|
||||
"$prover_path" "$circuit_zkey" "$witness_path" "$proof_path" "$public_path" | tee /dev/stderr
|
||||
|
||||
99
prover/src/vkey/dsc_sha1_rsa_4096_vkey.json
Normal file
99
prover/src/vkey/dsc_sha1_rsa_4096_vkey.json
Normal file
@@ -0,0 +1,99 @@
|
||||
{
|
||||
"protocol": "groth16",
|
||||
"curve": "bn128",
|
||||
"nPublic": 2,
|
||||
"vk_alpha_1": [
|
||||
"20491192805390485299153009773594534940189261866228447918068658471970481763042",
|
||||
"9383485363053290200918347156157836566562967994039712273449902621266178545958",
|
||||
"1"
|
||||
],
|
||||
"vk_beta_2": [
|
||||
[
|
||||
"6375614351688725206403948262868962793625744043794305715222011528459656738731",
|
||||
"4252822878758300859123897981450591353533073413197771768651442665752259397132"
|
||||
],
|
||||
[
|
||||
"10505242626370262277552901082094356697409835680220590971873171140371331206856",
|
||||
"21847035105528745403288232691147584728191162732299865338377159692350059136679"
|
||||
],
|
||||
[
|
||||
"1",
|
||||
"0"
|
||||
]
|
||||
],
|
||||
"vk_gamma_2": [
|
||||
[
|
||||
"10857046999023057135944570762232829481370756359578518086990519993285655852781",
|
||||
"11559732032986387107991004021392285783925812861821192530917403151452391805634"
|
||||
],
|
||||
[
|
||||
"8495653923123431417604973247489272438418190587263600148770280649306958101930",
|
||||
"4082367875863433681332203403145435568316851327593401208105741076214120093531"
|
||||
],
|
||||
[
|
||||
"1",
|
||||
"0"
|
||||
]
|
||||
],
|
||||
"vk_delta_2": [
|
||||
[
|
||||
"10238320193043068829157960501967854222692702878458503554377378628488406921948",
|
||||
"2504819411237842658609352397158415272245653421477946289695883131063258228520"
|
||||
],
|
||||
[
|
||||
"18340470375805803608701337556657721848991359834488959516971530751169316859620",
|
||||
"12816079684433910946739040167512171044510230919779819953946700906887571584144"
|
||||
],
|
||||
[
|
||||
"1",
|
||||
"0"
|
||||
]
|
||||
],
|
||||
"vk_alphabeta_12": [
|
||||
[
|
||||
[
|
||||
"2029413683389138792403550203267699914886160938906632433982220835551125967885",
|
||||
"21072700047562757817161031222997517981543347628379360635925549008442030252106"
|
||||
],
|
||||
[
|
||||
"5940354580057074848093997050200682056184807770593307860589430076672439820312",
|
||||
"12156638873931618554171829126792193045421052652279363021382169897324752428276"
|
||||
],
|
||||
[
|
||||
"7898200236362823042373859371574133993780991612861777490112507062703164551277",
|
||||
"7074218545237549455313236346927434013100842096812539264420499035217050630853"
|
||||
]
|
||||
],
|
||||
[
|
||||
[
|
||||
"7077479683546002997211712695946002074877511277312570035766170199895071832130",
|
||||
"10093483419865920389913245021038182291233451549023025229112148274109565435465"
|
||||
],
|
||||
[
|
||||
"4595479056700221319381530156280926371456704509942304414423590385166031118820",
|
||||
"19831328484489333784475432780421641293929726139240675179672856274388269393268"
|
||||
],
|
||||
[
|
||||
"11934129596455521040620786944827826205713621633706285934057045369193958244500",
|
||||
"8037395052364110730298837004334506829870972346962140206007064471173334027475"
|
||||
]
|
||||
]
|
||||
],
|
||||
"IC": [
|
||||
[
|
||||
"12988588557782490372720106385872966314967422240534584361175457924756107643693",
|
||||
"14646142751640522118026183869854599975857973506262663217812464078644335492697",
|
||||
"1"
|
||||
],
|
||||
[
|
||||
"21227048561254712863337958008644060921163858069022181377071355406552412741483",
|
||||
"11145905413764400843127715849833092427485801651255980452289482279055672757081",
|
||||
"1"
|
||||
],
|
||||
[
|
||||
"6756928444291085777119241838626515299290626488852428949035210829352311876378",
|
||||
"1864326467329351741201710240834361213001354015077536966380306996231129299589",
|
||||
"1"
|
||||
]
|
||||
]
|
||||
}
|
||||
99
prover/src/vkey/dsc_sha256_rsa_4096_vkey.json
Normal file
99
prover/src/vkey/dsc_sha256_rsa_4096_vkey.json
Normal file
@@ -0,0 +1,99 @@
|
||||
{
|
||||
"protocol": "groth16",
|
||||
"curve": "bn128",
|
||||
"nPublic": 2,
|
||||
"vk_alpha_1": [
|
||||
"20491192805390485299153009773594534940189261866228447918068658471970481763042",
|
||||
"9383485363053290200918347156157836566562967994039712273449902621266178545958",
|
||||
"1"
|
||||
],
|
||||
"vk_beta_2": [
|
||||
[
|
||||
"6375614351688725206403948262868962793625744043794305715222011528459656738731",
|
||||
"4252822878758300859123897981450591353533073413197771768651442665752259397132"
|
||||
],
|
||||
[
|
||||
"10505242626370262277552901082094356697409835680220590971873171140371331206856",
|
||||
"21847035105528745403288232691147584728191162732299865338377159692350059136679"
|
||||
],
|
||||
[
|
||||
"1",
|
||||
"0"
|
||||
]
|
||||
],
|
||||
"vk_gamma_2": [
|
||||
[
|
||||
"10857046999023057135944570762232829481370756359578518086990519993285655852781",
|
||||
"11559732032986387107991004021392285783925812861821192530917403151452391805634"
|
||||
],
|
||||
[
|
||||
"8495653923123431417604973247489272438418190587263600148770280649306958101930",
|
||||
"4082367875863433681332203403145435568316851327593401208105741076214120093531"
|
||||
],
|
||||
[
|
||||
"1",
|
||||
"0"
|
||||
]
|
||||
],
|
||||
"vk_delta_2": [
|
||||
[
|
||||
"13321797380673210476515077034913864616333897796635017120985610572456619578202",
|
||||
"5794615369833932449623711589651728862835090361076583083326728412120661912694"
|
||||
],
|
||||
[
|
||||
"242783906272443516559840962669397308390618651647582683340262167519339576708",
|
||||
"1627189806585647035450761519737947618200743049504008744031689523936664845869"
|
||||
],
|
||||
[
|
||||
"1",
|
||||
"0"
|
||||
]
|
||||
],
|
||||
"vk_alphabeta_12": [
|
||||
[
|
||||
[
|
||||
"2029413683389138792403550203267699914886160938906632433982220835551125967885",
|
||||
"21072700047562757817161031222997517981543347628379360635925549008442030252106"
|
||||
],
|
||||
[
|
||||
"5940354580057074848093997050200682056184807770593307860589430076672439820312",
|
||||
"12156638873931618554171829126792193045421052652279363021382169897324752428276"
|
||||
],
|
||||
[
|
||||
"7898200236362823042373859371574133993780991612861777490112507062703164551277",
|
||||
"7074218545237549455313236346927434013100842096812539264420499035217050630853"
|
||||
]
|
||||
],
|
||||
[
|
||||
[
|
||||
"7077479683546002997211712695946002074877511277312570035766170199895071832130",
|
||||
"10093483419865920389913245021038182291233451549023025229112148274109565435465"
|
||||
],
|
||||
[
|
||||
"4595479056700221319381530156280926371456704509942304414423590385166031118820",
|
||||
"19831328484489333784475432780421641293929726139240675179672856274388269393268"
|
||||
],
|
||||
[
|
||||
"11934129596455521040620786944827826205713621633706285934057045369193958244500",
|
||||
"8037395052364110730298837004334506829870972346962140206007064471173334027475"
|
||||
]
|
||||
]
|
||||
],
|
||||
"IC": [
|
||||
[
|
||||
"14799294619686504347123706464984449377033577151047902926075007068263899855296",
|
||||
"4138452911775673696088952365685111981651322204728180622715924120168892012882",
|
||||
"1"
|
||||
],
|
||||
[
|
||||
"19237066254572577791709165085639802359499616635829287221569436085741781781740",
|
||||
"10362088703927009878905137753566677570786091714652005156465176142264008904616",
|
||||
"1"
|
||||
],
|
||||
[
|
||||
"1633277393836614509092356048427487579995470358819940373097445848231970157637",
|
||||
"12348867875321881462145411826101774663987266006830069071058772539021485934684",
|
||||
"1"
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
import requests
|
||||
import json
|
||||
|
||||
with open("csca_inputs.json", "r") as file:
|
||||
inputs = json.load(file)
|
||||
|
||||
response = requests.post("https://zk-passport--dsc-prover-generate-dsc-proof.modal.run", json=inputs , timeout=600)
|
||||
with open("response.json", "w") as file:
|
||||
file.write(response.text)
|
||||
113
prover/tests/modal.test.ts
Normal file
113
prover/tests/modal.test.ts
Normal file
@@ -0,0 +1,113 @@
|
||||
import { getCSCAInputs } from "../../common/src/utils/csca";
|
||||
import { mock_csca_sha256_rsa_4096, mock_dsc_sha256_rsa_4096, mock_csca_sha1_rsa_4096, mock_dsc_sha1_rsa_4096 } from "../../common/src/constants/mockCertificates";
|
||||
import forge from "node-forge";
|
||||
import { MODAL_SERVER_ADDRESS } from "../../common/src/constants/constants";
|
||||
import axios from 'axios';
|
||||
import fs from 'fs';
|
||||
import { groth16 } from 'snarkjs'
|
||||
import { expect } from "chai";
|
||||
import path from 'path';
|
||||
|
||||
const n_dsc = 121;
|
||||
const k_dsc = 17;
|
||||
const n_csca = 121;
|
||||
const k_csca = 34;
|
||||
const max_cert_bytes = 1664;
|
||||
const dscCert_sha256_rsa = forge.pki.certificateFromPem(mock_dsc_sha256_rsa_4096);
|
||||
const cscaCert_sha256_rsa = forge.pki.certificateFromPem(mock_csca_sha256_rsa_4096);
|
||||
const dscCert_sha1_rsa = forge.pki.certificateFromPem(mock_dsc_sha1_rsa_4096);
|
||||
const cscaCert_sha1_rsa = forge.pki.certificateFromPem(mock_csca_sha1_rsa_4096);
|
||||
|
||||
const vkey_sha256_rsa = JSON.parse(fs.readFileSync(path.join(__dirname, '../src/vkey/dsc_sha256_rsa_4096_vkey.json'), 'utf8'));
|
||||
const vkey_sha1_rsa = JSON.parse(fs.readFileSync(path.join(__dirname, '../src/vkey/dsc_sha1_rsa_4096_vkey.json'), 'utf8'));
|
||||
|
||||
describe('MODAL PROVER', function () {
|
||||
this.timeout(0); // Disable timeout
|
||||
describe("SHA256 RSA", async () => {
|
||||
it("verify proof", async () => {
|
||||
const circuitInputs = getCSCAInputs(
|
||||
BigInt(0).toString(),
|
||||
dscCert_sha256_rsa,
|
||||
cscaCert_sha256_rsa,
|
||||
n_dsc,
|
||||
k_dsc,
|
||||
n_csca,
|
||||
k_csca,
|
||||
max_cert_bytes,
|
||||
true
|
||||
);
|
||||
const inputs = {
|
||||
"signature_algorithm": "sha256_rsa",
|
||||
"inputs": circuitInputs
|
||||
}
|
||||
//console.log(JSON.stringify(inputs));
|
||||
console.log('\x1b[34msending request to modal server\x1b[0m');
|
||||
const response = await sendCSCARequest(inputs);
|
||||
console.log('\x1b[34mresponse from modal server received\x1b[0m');
|
||||
const proof = JSON.parse(JSON.stringify(response));
|
||||
const verifyProof = await groth16.verify(
|
||||
vkey_sha256_rsa,
|
||||
proof.pub_signals,
|
||||
proof.proof
|
||||
)
|
||||
expect(verifyProof).to.be.true;
|
||||
console.log('\x1b[32mproof for sha256 rsa verified\x1b[0m');
|
||||
});
|
||||
});
|
||||
|
||||
describe("SHA1 RSA", async () => {
|
||||
it("verify proof", async () => {
|
||||
const circuitInputs = getCSCAInputs(
|
||||
BigInt(0).toString(),
|
||||
dscCert_sha1_rsa,
|
||||
cscaCert_sha1_rsa,
|
||||
n_dsc,
|
||||
k_dsc,
|
||||
n_csca,
|
||||
k_csca,
|
||||
max_cert_bytes,
|
||||
true
|
||||
);
|
||||
const inputs = {
|
||||
"signature_algorithm": "sha1_rsa",
|
||||
"inputs": circuitInputs
|
||||
}
|
||||
//console.log(JSON.stringify(inputs));
|
||||
|
||||
console.log('\x1b[34msending request to modal server\x1b[0m');
|
||||
const response = await sendCSCARequest(inputs);
|
||||
console.log('\x1b[34mresponse from modal server received\x1b[0m');
|
||||
const proof = JSON.parse(JSON.stringify(response));
|
||||
const verifyProof = await groth16.verify(
|
||||
vkey_sha1_rsa,
|
||||
proof.pub_signals,
|
||||
proof.proof
|
||||
)
|
||||
expect(verifyProof).to.be.true;
|
||||
console.log('\x1b[32mproof for sha1 rsa verified\x1b[0m');
|
||||
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
export const sendCSCARequest = async (inputs_csca: any): Promise<any> => {
|
||||
try {
|
||||
const response = await axios.post(MODAL_SERVER_ADDRESS, inputs_csca, {
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
});
|
||||
return response.data;
|
||||
} catch (error) {
|
||||
if (axios.isAxiosError(error)) {
|
||||
console.error('Axios error:', error.message);
|
||||
if (error.response) {
|
||||
console.error('Response data:', error.response.data);
|
||||
console.error('Response status:', error.response.status);
|
||||
}
|
||||
} else {
|
||||
console.error('Unexpected error:', error);
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
29
prover/tests/package.json
Normal file
29
prover/tests/package.json
Normal file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"name": "modal-tests",
|
||||
"version": "0.0.1",
|
||||
"author": "",
|
||||
"license": "MIT",
|
||||
"scripts": {},
|
||||
"dependencies": {
|
||||
"@types/chai-as-promised": "^7.1.6",
|
||||
"@types/node": "^20.11.19",
|
||||
"@types/node-forge": "^1.3.5",
|
||||
"@types/snarkjs": "^0.7.8",
|
||||
"axios": "^1.7.2",
|
||||
"chai-as-promised": "^7.1.1",
|
||||
"node-forge": "https://github.com/remicolin/forge",
|
||||
"poseidon-lite": "^0.2.0",
|
||||
"snarkjs": "^0.7.4",
|
||||
"typescript": "^5.3.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/chai": "^4.3.6",
|
||||
"@types/circomlibjs": "^0.1.6",
|
||||
"@types/mocha": "^10.0.7",
|
||||
"chai": "^4.3.8",
|
||||
"mocha": "^10.3.0",
|
||||
"prettier": "^3.3.3",
|
||||
"ts-mocha": "^10.0.0",
|
||||
"ts-node": "^10.9.2"
|
||||
}
|
||||
}
|
||||
10
prover/tests/tsconfig.json
Normal file
10
prover/tests/tsconfig.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "es2020",
|
||||
"module": "commonjs",
|
||||
"strict": true,
|
||||
"esModuleInterop": true,
|
||||
"skipLibCheck": true,
|
||||
"forceConsistentCasingInFileNames": true
|
||||
}
|
||||
}
|
||||
1158
prover/tests/yarn.lock
Normal file
1158
prover/tests/yarn.lock
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user