Trait curve25519_dalek::traits::MultiscalarMul [−][src]
pub trait MultiscalarMul { type Point; fn multiscalar_mul<I, J>(scalars: I, points: J) -> Self::Point
where
I: IntoIterator,
I::Item: Borrow<Scalar>,
J: IntoIterator,
J::Item: Borrow<Self::Point>; }
A trait for constant-time multiscalar multiplication without precomputation.
Associated Types
type Point
The type of point being multiplied, e.g., RistrettoPoint
.
Required Methods
fn multiscalar_mul<I, J>(scalars: I, points: J) -> Self::Point where
I: IntoIterator,
I::Item: Borrow<Scalar>,
J: IntoIterator,
J::Item: Borrow<Self::Point>,
I: IntoIterator,
I::Item: Borrow<Scalar>,
J: IntoIterator,
J::Item: Borrow<Self::Point>,
Given an iterator of (possibly secret) scalars and an iterator of public points, compute $$ Q = c_1 P_1 + \cdots + c_n P_n. $$
It is an error to call this function with two iterators of different lengths.
Examples
The trait bound aims for maximum flexibility: the inputs must be
convertable to iterators (I: IntoIter
), and the iterator's items
must be Borrow<Scalar>
(or Borrow<Point>
), to allow
iterators returning either Scalar
s or &Scalar
s.
use curve25519_dalek::constants; use curve25519_dalek::traits::MultiscalarMul; use curve25519_dalek::ristretto::RistrettoPoint; use curve25519_dalek::scalar::Scalar; // Some scalars let a = Scalar::from_u64(87329482); let b = Scalar::from_u64(37264829); let c = Scalar::from_u64(98098098); // Some points let P = constants::RISTRETTO_BASEPOINT_POINT; let Q = P + P; let R = P + Q; // A1 = a*P + b*Q + c*R let abc = [a,b,c]; let A1 = RistrettoPoint::multiscalar_mul(&abc, &[P,Q,R]); // Note: (&abc).into_iter(): Iterator<Item=&Scalar> // A2 = (-a)*P + (-b)*Q + (-c)*R let minus_abc = abc.iter().map(|x| -x); let A2 = RistrettoPoint::multiscalar_mul(minus_abc, &[P,Q,R]); // Note: minus_abc.into_iter(): Iterator<Item=Scalar> assert_eq!(A1.compress(), (-A2).compress());
Implementors
impl MultiscalarMul for EdwardsPoint type Point = EdwardsPoint;
impl MultiscalarMul for RistrettoPoint type Point = RistrettoPoint;