monero_bulletproofs/
point_vector.rs

1use core::ops::{Index, IndexMut};
2use std_shims::vec::Vec;
3
4use zeroize::Zeroize;
5
6use curve25519_dalek::edwards::EdwardsPoint;
7
8use crate::scalar_vector::ScalarVector;
9
10#[cfg(test)]
11use crate::core::multiexp;
12
13#[derive(Clone, PartialEq, Eq, Debug, Zeroize)]
14pub(crate) struct PointVector(pub(crate) Vec<EdwardsPoint>);
15
16impl Index<usize> for PointVector {
17  type Output = EdwardsPoint;
18  fn index(&self, index: usize) -> &EdwardsPoint {
19    &self.0[index]
20  }
21}
22
23impl IndexMut<usize> for PointVector {
24  fn index_mut(&mut self, index: usize) -> &mut EdwardsPoint {
25    &mut self.0[index]
26  }
27}
28
29impl PointVector {
30  pub(crate) fn mul_vec(&self, vector: &ScalarVector) -> Self {
31    assert_eq!(self.len(), vector.len());
32    let mut res = self.clone();
33    for (i, val) in res.0.iter_mut().enumerate() {
34      *val *= vector.0[i];
35    }
36    res
37  }
38
39  #[cfg(test)]
40  pub(crate) fn multiexp(&self, vector: &ScalarVector) -> EdwardsPoint {
41    debug_assert_eq!(self.len(), vector.len());
42    let mut res = Vec::with_capacity(self.len());
43    for (point, scalar) in self.0.iter().copied().zip(vector.0.iter().copied()) {
44      res.push((scalar, point));
45    }
46    multiexp(&res)
47  }
48
49  pub(crate) fn len(&self) -> usize {
50    self.0.len()
51  }
52
53  pub(crate) fn split(mut self) -> (Self, Self) {
54    debug_assert!(self.len() > 1);
55    let r = self.0.split_off(self.0.len() / 2);
56    debug_assert_eq!(self.len(), r.len());
57    (self, PointVector(r))
58  }
59}