Path: blob/main/frontier/09-commitments-sigma-protocols/rust/src/lib.rs
483 views
unlisted
//! # Module 09: Commitment Schemes and Sigma Protocols — Exercises1//!2//! ## Progression3//! 1. `pedersen_commit` — signature + doc4//! 2. `pedersen_verify` — signature + doc5//! 3. `schnorr_prove` — signature + doc6//! 4. `schnorr_verify` — signature + doc7//! 5. `fiat_shamir` — signature only89/// Create a Pedersen commitment: C = g^m * h^r mod p.10///11/// - `g`, `h`: generators (h must have unknown discrete log w.r.t. g)12/// - `m`: the message/value to commit to13/// - `r`: randomness (blinding factor)14/// - `p`: prime modulus15pub fn pedersen_commit(g: u64, h: u64, m: u64, r: u64, p: u64) -> u64 {16todo!("C = g^m * h^r mod p")17}1819/// Verify a Pedersen commitment opening.20///21/// Check that `commitment == g^m * h^r mod p`.22pub fn pedersen_verify(g: u64, h: u64, m: u64, r: u64, commitment: u64, p: u64) -> bool {23todo!("Check commitment == g^m * h^r mod p")24}2526/// Generate a Schnorr proof of knowledge of discrete log.27///28/// Prover knows `x` such that `pk = g^x mod p`.29/// Protocol:30/// 1. Choose random `k`, compute `commitment = g^k mod p`31/// 2. Receive `challenge` (from verifier or Fiat-Shamir)32/// 3. Compute `response = k - x * challenge mod (p-1)`33///34/// Returns `(commitment, challenge, response)`.35pub fn schnorr_prove(36g: u64,37x: u64,38p: u64,39k: u64,40challenge: u64,41) -> (u64, u64, u64) {42todo!("Schnorr proof: (g^k, challenge, k - x*challenge mod p-1)")43}4445/// Verify a Schnorr proof.46///47/// Check: g^response * pk^challenge ≡ commitment (mod p).48pub fn schnorr_verify(49g: u64,50pk: u64,51commitment: u64,52challenge: u64,53response: u64,54p: u64,55) -> bool {56todo!("Check g^response * pk^challenge == commitment mod p")57}5859/// Apply the Fiat-Shamir transform: derive challenge from transcript.60///61/// Hash the concatenation of (g, pk, commitment, message) to produce62/// a deterministic challenge. Use a simple hash for this exercise.63///64/// Returns the challenge value.65pub fn fiat_shamir(g: u64, pk: u64, commitment: u64, message: &[u8]) -> u64 {66todo!("Hash-based challenge derivation")67}6869#[cfg(test)]70mod tests {71use super::*;7273#[test]74#[ignore]75fn test_pedersen_commit_verify() {76let p = 23;77let g = 4;78let h = 9;79let m = 5;80let r = 3;81let c = pedersen_commit(g, h, m, r, p);82assert!(pedersen_verify(g, h, m, r, c, p));83// Wrong message should fail84assert!(!pedersen_verify(g, h, m + 1, r, c, p));85}8687#[test]88#[ignore]89fn test_schnorr_roundtrip() {90let p = 23;91let g = 5;92let x = 7; // secret key93// pk = g^x mod p94let pk = 5_u64.pow(7) % 23; // = 1795let k = 3; // random nonce96let challenge = 11;97let (comm, ch, resp) = schnorr_prove(g, x, p, k, challenge);98assert_eq!(ch, challenge);99assert!(schnorr_verify(g, pk, comm, ch, resp, p));100}101}102103104