| 474 | #[test] |
| 475 | fn partial_knowledge_single() { |
| 476 | fn check_partial_know_single(n: usize, known_indices: BTreeSet<usize>) { |
| 477 | let mut rng = StdRng::seed_from_u64(0u64); |
| 478 | let k = known_indices.len(); |
| 479 | let g = <Bls12_381 as Pairing>::G1::rand(&mut rng).into_affine(); |
| 480 | let gs = (0..2 * n - k) |
| 481 | .map(|_| <Bls12_381 as Pairing>::G1::rand(&mut rng).into_affine()) |
| 482 | .collect::<Vec<_>>(); |
| 483 | let h = <Bls12_381 as Pairing>::G1::rand(&mut rng).into_affine(); |
| 484 | |
| 485 | let xs = (0..n).map(|_| Fr::rand(&mut rng)).collect::<Vec<_>>(); |
| 486 | let known_x = known_indices |
| 487 | .iter() |
| 488 | .map(|i| (*i, &xs[*i])) |
| 489 | .collect::<BTreeMap<_, _>>(); |
| 490 | let Ps = xs |
| 491 | .iter() |
| 492 | .map(|x| g.mul_bigint(x.into_bigint()).into_affine()) |
| 493 | .collect::<Vec<_>>(); |
| 494 | |
| 495 | let start = Instant::now(); |
| 496 | let (y, gamma, P) = |
| 497 | single::create_new_witnesses_and_their_commitment(&mut rng, &Ps, known_x, &gs, &h) |
| 498 | .unwrap(); |
| 499 | let fs = single::create_homomorphisms(g.clone(), Ps.clone(), n, k); |
| 500 | |
| 501 | assert_eq!(fs.len(), n); |
| 502 | for i in 0..n { |
| 503 | if !known_indices.contains(&i) { |
| 504 | assert!(y[n - k + i].is_zero()); |
| 505 | } |
| 506 | assert_eq!(fs[i].eval(&y).unwrap(), Ps[i]); |
| 507 | } |
| 508 | |
| 509 | let mut new_gs = gs.clone(); |
| 510 | new_gs.push(h); |
| 511 | let mut new_y = y.clone(); |
| 512 | new_y.push(gamma); |
| 513 | |
| 514 | let rand_comm = |
| 515 | RandomCommitment::new::<_, Blake2b512, _>(&mut rng, &new_gs, &Ps, &fs, None) |
| 516 | .unwrap(); |
| 517 | let challenge = Fr::rand(&mut rng); |
| 518 | let response = rand_comm.response(&new_y, &challenge).unwrap(); |
| 519 | response |
| 520 | .is_valid::<Blake2b512, _>( |
| 521 | &new_gs, |
| 522 | &P, |
| 523 | &Ps, |
| 524 | &fs, |
| 525 | &rand_comm.A, |
| 526 | &rand_comm.t, |
| 527 | &challenge, |
| 528 | ) |
| 529 | .unwrap(); |
| 530 | println!( |
| 531 | "Proof of partial knowledge of {}-of-{} takes {:?}", |
| 532 | k, |
| 533 | n, |