diff --git a/README.md b/README.md index 5828c83..3799b1a 100644 --- a/README.md +++ b/README.md @@ -32,21 +32,22 @@ let (_, leaf) = id.commitment().to_bytes_be(); tree.set(0, leaf.into()); let merkle_proof = tree.proof(0).expect("proof should exist"); -let root = tree.root().into(); +let root = tree.root(); // change signal and external_nullifier here -let signal = "hello".as_bytes(); -let external_nullifier = "123".as_bytes(); +let signal = "xxx".as_bytes(); +let external_nullifier = "appId".as_bytes(); -let nullifier_hash = generate_nullifier_hash(&id, external_nullifier); +let external_nullifier_hash = hash_external_nullifier(external_nullifier); +let nullifier_hash = generate_nullifier_hash(&id, &external_nullifier_hash); let config = SnarkFileConfig { zkey: "./semaphore/build/snark/semaphore_final.zkey".to_string(), wasm: "./semaphore/build/snark/semaphore.wasm".to_string(), }; -let proof = generate_proof(&config, &id, &merkle_proof, external_nullifier, signal).unwrap(); -let success = verify_proof(&config, &root, &nullifier_hash, signal, external_nullifier, &proof).unwrap(); +let proof = generate_proof(&config, &id, &merkle_proof, &external_nullifier_hash, signal).unwrap(); +let success = verify_proof(&config, &root.into(), &nullifier_hash, signal, &external_nullifier_hash, &proof).unwrap(); assert!(success); ``` \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index ecc7fc7..bdd689d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -43,7 +43,8 @@ mod test { let signal = "xxx".as_bytes(); let external_nullifier = "appId".as_bytes(); - let nullifier_hash = generate_nullifier_hash(&id, external_nullifier); + let external_nullifier_hash = hash_external_nullifier(external_nullifier); + let nullifier_hash = generate_nullifier_hash(&id, &external_nullifier_hash); let config = SnarkFileConfig { zkey: "./semaphore/build/snark/semaphore_final.zkey".to_string(), @@ -51,14 +52,14 @@ mod test { }; let proof = - generate_proof(&config, &id, &merkle_proof, external_nullifier, signal).unwrap(); + generate_proof(&config, &id, &merkle_proof, &external_nullifier_hash, signal).unwrap(); let success = verify_proof( &config, &root.into(), &nullifier_hash, signal, - external_nullifier, + &external_nullifier_hash, &proof, ) .unwrap(); diff --git a/src/protocol.rs b/src/protocol.rs index 6153d5c..1a681dc 100644 --- a/src/protocol.rs +++ b/src/protocol.rs @@ -45,17 +45,23 @@ fn hash_signal(signal: &[u8]) -> BigInt { } /// Internal helper to hash the external nullifier -pub fn hash_external_nullifier(nullifier: &[u8]) -> BigInt { - let mut hash = keccak256(nullifier).to_vec(); - hash.splice(..3, vec![0; 4]); - BigInt::from_bytes_be(Sign::Plus, &hash) +pub fn hash_external_nullifier(nullifier: &[u8]) -> [u8; 32] { + let mut hash = keccak256(nullifier); + hash[0] = 0; + hash[1] = 0; + hash[2] = 0; + hash[3] = 0; + hash } /// Generates the nullifier hash pub fn generate_nullifier_hash(identity: &Identity, external_nullifier: &[u8]) -> BigInt { let res = POSEIDON .hash(vec![ - bigint_to_fr(&hash_external_nullifier(external_nullifier)), + bigint_to_fr(&BigInt::from_bytes_be( + Sign::Plus, + external_nullifier, + )), bigint_to_fr(&identity.nullifier), ]) .unwrap(); @@ -90,7 +96,7 @@ pub fn generate_proof( merkle_proof_to_vec(merkle_proof), ); inputs.insert("externalNullifier".to_string(), vec![ - hash_external_nullifier(external_nullifier), + BigInt::from_bytes_be(Sign::Plus, external_nullifier), ]); inputs.insert("signalHash".to_string(), vec![hash_signal(signal)]); @@ -151,7 +157,7 @@ pub fn verify_proof( Fp256::from(nullifier_hash.to_biguint().unwrap()), Fp256::from(hash_signal(signal).to_biguint().unwrap()), Fp256::from( - hash_external_nullifier(external_nullifier) + BigInt::from_bytes_be(Sign::Plus, external_nullifier) .to_biguint() .unwrap(), ),