monero_bulletproofs/
point_vector.rs1use 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}