add sha1 proof generation to modal prover

This commit is contained in:
turnoffthiscomputer
2024-07-18 16:16:38 +02:00
parent 4a06dc6564
commit 52638fa289
19 changed files with 1960 additions and 52 deletions

4
.gitignore vendored
View File

@@ -1,3 +1,5 @@
contracts/contracts/RegisterASCII.txt
sdk/.env
dist
dist
**/node_modules
**/node_modules/

View File

@@ -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);

View File

@@ -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);

View 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);

View File

@@ -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"

View 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)
}
}
}

View 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)
}
}
}

View File

@@ -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

View File

@@ -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()

View File

@@ -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

View File

@@ -0,0 +1 @@
modal deploy dsc_prover.py --name dsc_prover

View File

@@ -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

View 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"
]
]
}

View 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"
]
]
}

View File

@@ -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
View 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
View 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"
}
}

View 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

File diff suppressed because it is too large Load Diff