Browse Source

Test schnorr verify, works when it should, fails when it should

master
Brian Lawrence 6 months ago
parent
commit
8e25c44603
1 changed files with 105 additions and 2 deletions
  1. +105
    -2
      src/schnorr_prover.rs

+ 105
- 2
src/schnorr_prover.rs

@ -173,8 +173,6 @@ mod tests{
let sig_targ = SchnorrSignatureTarget::new_virtual(&mut builder);
let msg_targ = MessageTarget::new_with_size(&mut builder, msg_size);
// instead of verifying we're going to prove the verification
sb.constrain_sig::<PoseidonGoldilocksConfig> (
&mut builder,
&sig_targ,
@ -189,6 +187,111 @@ mod tests{
msg_targ.set_witness(&mut pw, &msg).unwrap();
let data = builder.build::<C>();
let proof = data.prove(pw).unwrap();
}
#[test]
fn test_schnorr_fails() {
const D: usize = 2;
type C = PoseidonGoldilocksConfig;
type F = <C as GenericConfig<D>>::F;
let mut rng: rand::rngs::ThreadRng = rand::thread_rng();
let config = CircuitConfig::standard_recursion_config();
let mut builder = CircuitBuilder::<F, D>::new(config);
let sb: SchnorrBuilder = SchnorrBuilder{};
// create keypair, message, signature
let sk: SchnorrSecretKey = SchnorrSecretKey{ sk: 133 };
let ss = SchnorrSigner::new();
let pk: SchnorrPublicKey = ss.keygen(&sk);
let msg0: Vec<GoldilocksField> = ss.u64_into_goldilocks_vec(
vec![1500, 1600, 0, 0, 0]
);
let msg_size: usize = msg0.len();
let sig: SchnorrSignature = ss.sign(&msg0, &sk, &mut rng);
let msg1: Vec<GoldilocksField> = ss.u64_into_goldilocks_vec(
vec![1510, 1600, 0, 0, 0]
);
let pk_targ = SchnorrPublicKeyTarget::new_virtual(&mut builder);
let sig_targ = SchnorrSignatureTarget::new_virtual(&mut builder);
let msg_targ = MessageTarget::new_with_size(&mut builder, msg_size);
let verification_result = sb.verify_sig::<PoseidonGoldilocksConfig> (
&mut builder,
&sig_targ,
&msg_targ,
&pk_targ
);
// assign witnesses for verification
let mut pw: PartialWitness<F> = PartialWitness::new();
pk_targ.set_witness(&mut pw, &pk).unwrap();
sig_targ.set_witness(&mut pw, &sig).unwrap();
msg_targ.set_witness(&mut pw, &msg1).unwrap();
// check value of verification result
let false_target = builder._false();
builder.connect(verification_result.target, false_target.target);
let data = builder.build::<C>();
let proof = data.prove(pw).unwrap();
}
#[test]
#[should_panic]
fn test_schnorr_panics() {
const D: usize = 2;
type C = PoseidonGoldilocksConfig;
type F = <C as GenericConfig<D>>::F;
let mut rng: rand::rngs::ThreadRng = rand::thread_rng();
let config = CircuitConfig::standard_recursion_config();
let mut builder = CircuitBuilder::<F, D>::new(config);
let sb: SchnorrBuilder = SchnorrBuilder{};
// create keypair, message, signature
let sk: SchnorrSecretKey = SchnorrSecretKey{ sk: 133 };
let ss = SchnorrSigner::new();
let pk: SchnorrPublicKey = ss.keygen(&sk);
let msg0: Vec<GoldilocksField> = ss.u64_into_goldilocks_vec(
vec![1500, 1600, 0, 0, 0]
);
let msg_size: usize = msg0.len();
let sig: SchnorrSignature = ss.sign(&msg0, &sk, &mut rng);
let msg1: Vec<GoldilocksField> = ss.u64_into_goldilocks_vec(
vec![1510, 1600, 0, 0, 0]
);
let pk_targ = SchnorrPublicKeyTarget::new_virtual(&mut builder);
let sig_targ = SchnorrSignatureTarget::new_virtual(&mut builder);
let msg_targ = MessageTarget::new_with_size(&mut builder, msg_size);
let verification_result = sb.verify_sig::<PoseidonGoldilocksConfig> (
&mut builder,
&sig_targ,
&msg_targ,
&pk_targ
);
// assign witnesses for verification
let mut pw: PartialWitness<F> = PartialWitness::new();
pk_targ.set_witness(&mut pw, &pk).unwrap();
sig_targ.set_witness(&mut pw, &sig).unwrap();
msg_targ.set_witness(&mut pw, &msg1).unwrap();
// value of verification result should be false
let true_target = builder._true();
builder.connect(verification_result.target, true_target.target);
let data = builder.build::<C>();
let proof = data.prove(pw).unwrap();
}

Loading…
Cancel
Save