SIGMA Proofs
A Rust implementation of SIGMA (Σ) zero-knowledge proof protocols and the Fiat-Shamir transform, following the IRTF CFRG specifications:
Features
Implemented Protocols
- Schnorr Proof: Proves knowledge of a discrete logarithm
- DLEQ Proof: Proves equality of discrete logarithms across different generators
- Pedersen Commitment Proof: Proves knowledge of a Pedersen commitment opening
Core Components
- Fiat-Shamir Transform: Converts interactive protocols to non-interactive
- Duplex Sponge Construction: Based on SHAKE128 for challenge generation
- Transcript Management: Secure transcript handling with domain separation
Usage
Schnorr Proof Example
use RISTRETTO_BASEPOINT_POINT;
use Scalar;
use OsRng;
use TryRngCore;
use ;
use ;
// Generate keys
let mut secret_bytes = ;
OsRng.try_fill_bytes.expect;
let secret_key = from_bytes_mod_order;
let public_key = secret_key * RISTRETTO_BASEPOINT_POINT;
// Create statement and witness
let statement = SchnorrStatement ;
let witness = SchnorrWitness ;
// Generate proof (interactive)
let = prover_commit;
let mut challenge_bytes = ;
OsRng.try_fill_bytes.expect;
let challenge = ScalarChallenge;
let response = prover_response?;
// Verify proof
verifier?;
Non-Interactive Proof with Fiat-Shamir
use FiatShamirTransform;
use ;
// Create Fiat-Shamir transform
let mut fs = new;
// Generate non-interactive proof
let = prover_commit;
fs.absorb_commitment;
let challenge_bytes = fs.generate_challenge;
let challenge = from_bytes?;
let response = prover_response?;
// Verify non-interactive proof
let mut verifier_fs = new;
verifier_fs.verify_transcript?;
Security
- Elliptic Curve: Uses curve25519-dalek with Ristretto group for prime-order group operations
- Hash Function: SHAKE128 provides 128-bit security for challenge generation
- Constant-Time: Operations use the
subtlecrate to prevent timing attacks - Random Generation: Cryptographically secure randomness via
rand::OsRng - Security Level: 128-bit computational security (not quantum-resistant for soundness)
Testing
Run tests with:
Additional Examples
DLEQ (Discrete Log Equality) Proof
use ;
// Prove that log_g(x) = log_h(y)
let alpha = from_bytes_mod_order;
let x = alpha * g;
let y = alpha * h;
let statement = DLEQStatement ;
let witness = DLEQWitness ;
Pedersen Commitment Proof
use ;
// Prove knowledge of commitment opening: C = v*G + r*H
let commitment = value * g + randomness * h;
let statement = PedersenStatement ;
let witness = PedersenWitness ;