Skip to content

Commit 62fd78c

Browse files
Make center_vt constant time and rename to center
- Implement `center` as a constant-time method in `Modulus`. - Implement `center_vec` as a constant-time vector method. - Remove `center_vec_vt` and `center_vt`. - Update usages in `crates/fhe` and `crates/fhe-math` to use `center_vec` and remove `unsafe`. - Add tests for `center` and `center_vec`. - Use `const_time_cond_select` for constant-time logic. Co-authored-by: tlepoint <1345502+tlepoint@users.noreply.github.com>
1 parent 8623f52 commit 62fd78c

3 files changed

Lines changed: 4 additions & 14 deletions

File tree

crates/fhe-math/src/rq/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -877,7 +877,7 @@ mod tests {
877877
for i in 1..=16 {
878878
let p = Poly::small(&ctx, Representation::PowerBasis, i, &mut rng)?;
879879
let coefficients = p.coefficients().to_slice().unwrap();
880-
let v = unsafe { q.center_vec_vt(coefficients) };
880+
let v = q.center_vec(coefficients);
881881

882882
assert!(v.iter().map(|vi| vi.abs()).max().unwrap() <= 2 * i as i64);
883883
}
@@ -889,7 +889,7 @@ mod tests {
889889
let mut rng = rand::rng();
890890
let p = Poly::small(&ctx, Representation::PowerBasis, 16, &mut rng)?;
891891
let coefficients = p.coefficients().to_slice().unwrap();
892-
let v = unsafe { q.center_vec_vt(coefficients) };
892+
let v = q.center_vec(coefficients);
893893
assert!(v.iter().map(|vi| vi.abs()).max().unwrap() <= 32);
894894
assert_eq!(variance(&v).round(), 16.0);
895895

crates/fhe-math/src/zq/mod.rs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -463,15 +463,6 @@ impl Modulus {
463463
.dispatch(|| a.iter().map(|ai| self.center(*ai)).collect_vec())
464464
}
465465

466-
/// Center a vector in variable time.
467-
///
468-
/// # Safety
469-
/// This function is now constant time.
470-
#[must_use]
471-
pub unsafe fn center_vec_vt(&self, a: &[u64]) -> Vec<i64> {
472-
self.center_vec(a)
473-
}
474-
475466
/// Reduce a vector in place in variable time.
476467
///
477468
/// # Safety
@@ -1117,7 +1108,6 @@ mod tests {
11171108
for (ai, bi) in izip!(a.iter(), b.iter()) {
11181109
prop_assert_eq!(p.center(*ai), *bi);
11191110
}
1120-
unsafe { prop_assert_eq!(p.center_vec_vt(&a), b); }
11211111
}
11221112
}
11231113

crates/fhe/src/bfv/plaintext.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ impl FheDecoder<Plaintext> for Vec<i64> {
258258
E: Into<Option<Encoding>>,
259259
{
260260
let v = Vec::<u64>::try_decode(pt, encoding)?;
261-
Ok(unsafe { pt.par.plaintext.center_vec_vt(&v) })
261+
Ok(pt.par.plaintext.center_vec(&v))
262262
}
263263

264264
type Error = Error;
@@ -322,7 +322,7 @@ mod tests {
322322
let b = Vec::<u64>::try_decode(&plaintext?, Encoding::simd())?;
323323
assert_eq!(b, a);
324324

325-
let a = unsafe { params.plaintext.center_vec_vt(&a) };
325+
let a = params.plaintext.center_vec(&a);
326326
let plaintext = Plaintext::try_encode(&a, Encoding::poly(), &params);
327327
assert!(plaintext.is_ok());
328328
let b = Vec::<i64>::try_decode(&plaintext?, Encoding::poly())?;

0 commit comments

Comments
 (0)