Files
self/circuits/scripts/build/build_single_circuit.sh
2025-10-17 11:15:57 +05:30

239 lines
7.8 KiB
Bash
Executable File

#!/bin/bash
# Build a single circuit by name
if [[ $# -ne 1 ]]; then
echo "Usage: $0 <circuit_name>"
echo "Example: $0 register_sha256_sha224_sha224_ecdsa_secp224r1"
exit 1
fi
CIRCUIT_NAME="$1"
# Function to extract circuit type from circuit name
extract_circuit_type() {
local name="$1"
# Special cases first
if [[ "$name" == "register_aadhaar" ]]; then
echo "register_aadhaar"
return
fi
if [[ "$name" =~ ^vc_and_disclose ]]; then
echo "vc_and_disclose"
return
fi
# For other patterns, extract based on underscores
if [[ "$name" =~ ^register_id_ ]]; then
echo "register_id"
return
fi
if [[ "$name" =~ ^register_ ]]; then
echo "register"
return
fi
if [[ "$name" =~ ^dsc_ ]]; then
echo "dsc"
return
fi
# If no pattern matches, return empty
echo ""
}
REGISTER_CIRCUITS=(
"register_sha1_sha1_sha1_rsa_64321_4096"
"register_sha1_sha1_sha1_ecdsa_brainpoolP224r1"
"register_sha1_sha1_sha1_ecdsa_secp256r1"
"register_sha256_sha1_sha1_rsa_65537_4096"
"register_sha1_sha1_sha1_rsa_65537_4096"
"register_sha1_sha256_sha256_rsa_65537_4096"
"register_sha224_sha224_sha224_ecdsa_brainpoolP224r1"
"register_sha256_sha224_sha224_ecdsa_secp224r1"
"register_sha256_sha256_sha224_ecdsa_secp224r1"
"register_sha256_sha256_sha256_ecdsa_brainpoolP256r1"
"register_sha256_sha256_sha256_ecdsa_brainpoolP384r1"
"register_sha256_sha256_sha256_ecdsa_secp256r1"
"register_sha256_sha256_sha256_ecdsa_secp384r1"
"register_sha256_sha256_sha256_rsa_3_4096"
"register_sha256_sha256_sha256_rsa_65537_4096"
"register_sha256_sha256_sha256_rsapss_3_32_2048"
"register_sha256_sha256_sha256_rsapss_65537_32_2048"
"register_sha256_sha256_sha256_rsapss_65537_32_3072"
"register_sha256_sha256_sha256_rsapss_65537_32_4096"
"register_sha256_sha256_sha256_rsapss_65537_64_2048"
"register_sha384_sha384_sha384_ecdsa_brainpoolP384r1"
"register_sha384_sha384_sha384_ecdsa_brainpoolP512r1"
"register_sha384_sha384_sha384_ecdsa_secp384r1"
"register_sha512_sha512_sha256_rsapss_65537_32_2048"
"register_sha384_sha384_sha384_rsapss_65537_48_2048"
"register_sha512_sha512_sha256_rsa_65537_4096"
"register_sha512_sha512_sha512_ecdsa_brainpoolP512r1"
"register_sha512_sha512_sha512_rsa_65537_4096"
"register_sha512_sha512_sha512_rsapss_65537_64_2048"
"register_sha512_sha512_sha512_ecdsa_secp521r1"
)
REGISTER_ID_CIRCUITS=(
"register_id_sha1_sha1_sha1_ecdsa_brainpoolP224r1"
"register_id_sha1_sha1_sha1_ecdsa_secp256r1"
"register_id_sha1_sha1_sha1_rsa_65537_4096"
"register_id_sha1_sha256_sha256_rsa_65537_4096"
"register_id_sha224_sha224_sha224_ecdsa_brainpoolP224r1"
"register_id_sha256_sha224_sha224_ecdsa_secp224r1"
"register_id_sha256_sha256_sha224_ecdsa_secp224r1"
"register_id_sha256_sha256_sha256_ecdsa_brainpoolP256r1"
"register_id_sha256_sha256_sha256_ecdsa_brainpoolP384r1"
"register_id_sha256_sha256_sha256_ecdsa_secp256r1"
"register_id_sha256_sha256_sha256_ecdsa_secp384r1"
"register_id_sha256_sha256_sha256_rsa_3_4096"
"register_id_sha256_sha256_sha256_rsa_65537_4096"
"register_id_sha256_sha256_sha256_rsapss_3_32_2048"
"register_id_sha256_sha256_sha256_rsapss_65537_32_2048"
"register_id_sha256_sha256_sha256_rsapss_65537_32_3072"
"register_id_sha256_sha256_sha256_rsapss_65537_64_2048"
"register_id_sha384_sha384_sha384_ecdsa_brainpoolP384r1"
"register_id_sha384_sha384_sha384_ecdsa_brainpoolP512r1"
"register_id_sha384_sha384_sha384_ecdsa_secp384r1"
"register_id_sha384_sha384_sha384_rsapss_65537_48_2048"
"register_id_sha512_sha512_sha256_rsa_65537_4096"
"register_id_sha512_sha512_sha512_ecdsa_brainpoolP512r1"
"register_id_sha512_sha512_sha512_ecdsa_secp521r1"
"register_id_sha512_sha512_sha512_rsa_65537_4096"
"register_id_sha512_sha512_sha512_rsapss_65537_64_2048"
"register_id_sha512_sha512_sha256_rsapss_65537_32_2048"
)
REGISTER_AADHAAR_CIRCUITS=(
"register_aadhaar"
)
DISCLOSE_CIRCUITS=(
"vc_and_disclose"
"vc_and_disclose_id"
"vc_and_disclose_aadhaar"
)
DSC_CIRCUITS=(
"dsc_sha1_ecdsa_brainpoolP256r1"
"dsc_sha1_ecdsa_secp256r1"
"dsc_sha1_rsa_65537_4096"
"dsc_sha256_ecdsa_brainpoolP256r1"
"dsc_sha256_ecdsa_brainpoolP384r1"
"dsc_sha256_ecdsa_secp256r1"
"dsc_sha256_ecdsa_secp384r1"
"dsc_sha256_ecdsa_secp521r1"
"dsc_sha256_rsa_65537_4096"
"dsc_sha256_rsa_56611_4096"
"dsc_sha256_rsa_107903_4096"
"dsc_sha256_rsa_122125_4096"
"dsc_sha256_rsa_130689_4096"
"dsc_sha256_rsapss_3_32_3072"
"dsc_sha256_rsapss_65537_32_3072"
"dsc_sha256_rsapss_65537_32_4096"
"dsc_sha384_ecdsa_brainpoolP384r1"
"dsc_sha384_ecdsa_brainpoolP512r1"
"dsc_sha384_ecdsa_secp384r1"
"dsc_sha512_ecdsa_brainpoolP512r1"
"dsc_sha512_ecdsa_secp521r1"
"dsc_sha512_rsa_65537_4096"
"dsc_sha512_rsapss_65537_64_4096"
"dsc_sha384_rsapss_65537_48_3072"
)
# Extract circuit type
CIRCUIT_TYPE=$(extract_circuit_type "$CIRCUIT_NAME")
if [[ -z "$CIRCUIT_TYPE" ]]; then
echo "❌ Error: Cannot determine circuit type from '$CIRCUIT_NAME'"
echo "Expected patterns: register_*, register_id_*, register_aadhaar, vc_and_disclose*, dsc_*"
exit 1
fi
# Function to check if circuit exists in array
circuit_exists_in_array() {
local circuit_name="$1"
shift
local array=("$@")
for item in "${array[@]}"; do
if [[ "$item" == "$circuit_name" ]]; then
return 0
fi
done
return 1
}
# Validate circuit exists in the appropriate array and set paths
case "$CIRCUIT_TYPE" in
"register")
if ! circuit_exists_in_array "$CIRCUIT_NAME" "${REGISTER_CIRCUITS[@]}"; then
echo "❌ Error: Circuit '$CIRCUIT_NAME' not found in REGISTER_CIRCUITS"
exit 1
fi
output="output/register"
basepath="./circuits/circuits/register/instances"
;;
"register_id")
if ! circuit_exists_in_array "$CIRCUIT_NAME" "${REGISTER_ID_CIRCUITS[@]}"; then
echo "❌ Error: Circuit '$CIRCUIT_NAME' not found in REGISTER_ID_CIRCUITS"
exit 1
fi
output="output/register"
basepath="./circuits/circuits/register_id/instances"
;;
"register_aadhaar")
if ! circuit_exists_in_array "$CIRCUIT_NAME" "${REGISTER_AADHAAR_CIRCUITS[@]}"; then
echo "❌ Error: Circuit '$CIRCUIT_NAME' not found in REGISTER_AADHAAR_CIRCUITS"
exit 1
fi
output="output/register"
basepath="./circuits/circuits/register/instances"
;;
"vc_and_disclose")
if ! circuit_exists_in_array "$CIRCUIT_NAME" "${DISCLOSE_CIRCUITS[@]}"; then
echo "❌ Error: Circuit '$CIRCUIT_NAME' not found in DISCLOSE_CIRCUITS"
exit 1
fi
output="output/disclose"
basepath="./circuits/circuits/disclose"
;;
"dsc")
if ! circuit_exists_in_array "$CIRCUIT_NAME" "${DSC_CIRCUITS[@]}"; then
echo "❌ Error: Circuit '$CIRCUIT_NAME' not found in DSC_CIRCUITS"
exit 1
fi
output="output/dsc"
basepath="./circuits/circuits/dsc/instances"
;;
*)
echo "❌ Error: Unknown circuit type '$CIRCUIT_TYPE'"
exit 1
;;
esac
# Create output directory
mkdir -p "$output"
filepath="$basepath/${CIRCUIT_NAME}.circom"
if [[ ! -f "$filepath" ]]; then
echo "❌ Error: Circuit file not found: $filepath"
exit 1
fi
# Compile circuit and C++ code
circom "$filepath" \
-l "circuits/node_modules" \
-l "circuits/node_modules/@zk-kit/binary-merkle-root.circom/src" \
-l "circuits/node_modules/circomlib/circuits" \
--O1 -c --output "$output" && \
cd "$output/${CIRCUIT_NAME}_cpp" && \
make
echo " Circuit '$CIRCUIT_NAME' built successfully!"