| 808 | |
| 809 | #[test] |
| 810 | fn commit_and_open_subset() { |
| 811 | let mut rng = StdRng::seed_from_u64(0u64); |
| 812 | let max_size = 10; |
| 813 | let (srs, trapdoor) = SetCommitmentSRS::<Bls12_381>::generate_with_random_trapdoor::< |
| 814 | StdRng, |
| 815 | Blake2b512, |
| 816 | >(&mut rng, max_size, None); |
| 817 | |
| 818 | fn check<R: RngCore>( |
| 819 | rng: &mut R, |
| 820 | set: BTreeSet<Fr>, |
| 821 | pp: &SetCommitmentSRS<Bls12_381>, |
| 822 | subset_has_trapdoor: bool, |
| 823 | ) { |
| 824 | let (comm, o) = SetCommitment::new(rng, set.clone(), pp).unwrap(); |
| 825 | comm.open_set(&o, set.clone(), pp).unwrap(); |
| 826 | |
| 827 | let prep_pp = PreparedSetCommitmentSRS::from(pp.clone()); |
| 828 | |
| 829 | // A proper subset |
| 830 | let mut iter = set.iter().cloned(); |
| 831 | let mut subset = BTreeSet::new(); |
| 832 | subset.insert(iter.next().unwrap()); |
| 833 | subset.insert(iter.next().unwrap()); |
| 834 | subset.insert(iter.next().unwrap()); |
| 835 | let witness = comm |
| 836 | .open_subset(&o, subset.clone(), set.clone(), pp) |
| 837 | .unwrap(); |
| 838 | |
| 839 | witness.verify(subset.clone(), &comm, &prep_pp).unwrap(); |
| 840 | |
| 841 | // When subset is same as set |
| 842 | if subset_has_trapdoor { |
| 843 | assert!(comm.open_subset(&o, set.clone(), set.clone(), pp).is_err()); |
| 844 | } else { |
| 845 | let witness = comm.open_subset(&o, set.clone(), set.clone(), pp).unwrap(); |
| 846 | witness.verify(set.clone(), &comm, &prep_pp).unwrap(); |
| 847 | } |
| 848 | |
| 849 | // When subset is empty |
| 850 | let witness = comm |
| 851 | .open_subset(&o, BTreeSet::new(), set.clone(), pp) |
| 852 | .unwrap(); |
| 853 | witness.verify(BTreeSet::new(), &comm, &prep_pp).unwrap(); |
| 854 | |
| 855 | // Randomize commitment and opening and check witness |
| 856 | let r = Fr::rand(rng); |
| 857 | let (comm, o) = comm.randomize(o, r); |
| 858 | let witness = comm |
| 859 | .open_subset(&o, subset.clone(), set.clone(), pp) |
| 860 | .unwrap(); |
| 861 | witness.verify(subset.clone(), &comm, &prep_pp).unwrap(); |
| 862 | |
| 863 | // Create invalid witness |
| 864 | let new_set = (0..pp.size() - 2) |
| 865 | .map(|_| Fr::rand(rng)) |
| 866 | .collect::<BTreeSet<_>>(); |
| 867 | let (comm1, o1) = SetCommitment::new(rng, new_set.clone(), pp).unwrap(); |