(
pp: &Self::UniversalParams,
supported_degree: usize,
supported_hiding_bound: usize,
enforced_degree_bounds: Option<&[usize]>,
)
| 157 | } |
| 158 | |
| 159 | fn trim( |
| 160 | pp: &Self::UniversalParams, |
| 161 | supported_degree: usize, |
| 162 | supported_hiding_bound: usize, |
| 163 | enforced_degree_bounds: Option<&[usize]>, |
| 164 | ) -> Result<(Self::CommitterKey, Self::VerifierKey), Self::Error> { |
| 165 | let trim_time = start_timer!(|| "Trimming public parameters"); |
| 166 | let neg_powers_of_h = &pp.neg_powers_of_h; |
| 167 | let max_degree = pp.max_degree(); |
| 168 | if supported_degree > max_degree { |
| 169 | return Err(Error::TrimmingDegreeTooLarge); |
| 170 | } |
| 171 | |
| 172 | let enforced_degree_bounds = enforced_degree_bounds.map(|bounds| { |
| 173 | let mut v = bounds.to_vec(); |
| 174 | v.sort(); |
| 175 | v.dedup(); |
| 176 | v |
| 177 | }); |
| 178 | |
| 179 | let (shifted_powers_of_g, shifted_powers_of_gamma_g, degree_bounds_and_neg_powers_of_h) = |
| 180 | if let Some(enforced_degree_bounds) = enforced_degree_bounds.as_ref() { |
| 181 | if enforced_degree_bounds.is_empty() { |
| 182 | (None, None, None) |
| 183 | } else { |
| 184 | let highest_enforced_degree_bound = *enforced_degree_bounds.last().unwrap(); |
| 185 | if highest_enforced_degree_bound > supported_degree { |
| 186 | return Err(Error::UnsupportedDegreeBound(highest_enforced_degree_bound)); |
| 187 | } |
| 188 | |
| 189 | let lowest_shift_degree = max_degree - highest_enforced_degree_bound; |
| 190 | |
| 191 | let shifted_ck_time = start_timer!(|| format!( |
| 192 | "Constructing `shifted_powers` of size {}", |
| 193 | max_degree - lowest_shift_degree + 1 |
| 194 | )); |
| 195 | |
| 196 | let shifted_powers_of_g = pp.powers_of_g[lowest_shift_degree..].to_vec(); |
| 197 | let mut shifted_powers_of_gamma_g = BTreeMap::new(); |
| 198 | // Also add degree 0. |
| 199 | for degree_bound in enforced_degree_bounds { |
| 200 | let shift_degree = max_degree - degree_bound; |
| 201 | let mut powers_for_degree_bound = vec![]; |
| 202 | for i in 0..=(supported_hiding_bound + 1) { |
| 203 | // We have an additional degree in `powers_of_gamma_g` beyond `powers_of_g`. |
| 204 | if shift_degree + i < max_degree + 2 { |
| 205 | powers_for_degree_bound |
| 206 | .push(pp.powers_of_gamma_g[&(shift_degree + i)]); |
| 207 | } |
| 208 | } |
| 209 | shifted_powers_of_gamma_g.insert(*degree_bound, powers_for_degree_bound); |
| 210 | } |
| 211 | |
| 212 | end_timer!(shifted_ck_time); |
| 213 | |
| 214 | let neg_powers_of_h_time = start_timer!(|| format!( |
| 215 | "Constructing `neg_powers_of_h` of size {}", |
| 216 | enforced_degree_bounds.len() |
nothing calls this directly
no test coverage detected