mirror of
https://github.com/arnaucube/schnorr.git
synced 2026-01-12 08:51:33 +01:00
Test schnorr verify, works when it should, fails when it should
This commit is contained in:
@@ -173,8 +173,6 @@ mod tests{
|
|||||||
let sig_targ = SchnorrSignatureTarget::new_virtual(&mut builder);
|
let sig_targ = SchnorrSignatureTarget::new_virtual(&mut builder);
|
||||||
let msg_targ = MessageTarget::new_with_size(&mut builder, msg_size);
|
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> (
|
sb.constrain_sig::<PoseidonGoldilocksConfig> (
|
||||||
&mut builder,
|
&mut builder,
|
||||||
&sig_targ,
|
&sig_targ,
|
||||||
@@ -189,6 +187,111 @@ mod tests{
|
|||||||
msg_targ.set_witness(&mut pw, &msg).unwrap();
|
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 data = builder.build::<C>();
|
||||||
let proof = data.prove(pw).unwrap();
|
let proof = data.prove(pw).unwrap();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user