use one buffer instead of two

This commit is contained in:
Oleg Andreev 2019-05-22 11:48:30 -07:00
parent dfcac0d8e2
commit ca2926ac89
2 changed files with 22 additions and 19 deletions

View file

@ -70,7 +70,6 @@ impl VartimeMultiscalarMul for Pippenger {
I::Item: Borrow<Scalar>,
J: IntoIterator<Item = Option<EdwardsPoint>>,
{
use backend::serial::curve_models::ProjectiveNielsPoint;
use traits::Identity;
let mut scalars = scalars.into_iter();
@ -95,14 +94,16 @@ impl VartimeMultiscalarMul for Pippenger {
// (scanning the whole set per digit position).
let scalars = scalars
.into_iter()
.map(|s| s.borrow().to_pippenger_radix(w).0)
.collect::<Vec<_>>();
let points: Vec<ProjectiveNielsPoint> = match points
.map(|s| s.borrow().to_pippenger_radix(w).0);
let points = points
.into_iter()
.map(|p| p.map(|P| P.to_projective_niels()))
.collect::<Option<Vec<_>>>()
{
Some(x) => x,
.map(|p| p.map(|P| P.to_projective_niels()));
let scalars_points = scalars.zip(points).map(|(s,maybe_p)| maybe_p.map(|p| (s,p) ) )
.collect::<Option<Vec<_>>>();
let scalars_points = match scalars_points {
Some(sp) => sp,
None => return None,
};
@ -122,7 +123,7 @@ impl VartimeMultiscalarMul for Pippenger {
// and add/sub the point to the corresponding bucket.
// Note: if we add support for precomputed lookup tables,
// we'll be adding/subtractiong point premultiplied by `digits[i]` to buckets[0].
for (digits, pt) in scalars.iter().zip(points.iter()) {
for (digits, pt) in scalars_points.iter() {
let digit = digits[digit_index];
if digit > 0 {
let b = (digit - 1) as usize;

View file

@ -48,18 +48,20 @@ impl VartimeMultiscalarMul for Pippenger {
let digits_count: usize = (256 + w - 1) / w; // == ceil(256/w)
let buckets_count: usize = max_digit / 2; // digits are signed+centered hence 2^w/2, excluding 0-th bucket
// Collect optimized scalars and points in buffers for repeated access
// (scanning the whole set per digit position).
// Collect optimized scalars and points in a buffer for repeated access
// (scanning the whole collection per each digit position).
let scalars = scalars
.into_iter()
.map(|s| s.borrow().to_pippenger_radix(w).0)
.collect::<Vec<_>>();
let points: Vec<CachedPoint> = match points
.map(|s| s.borrow().to_pippenger_radix(w).0);
let points = points
.into_iter()
.map(|p| p.map(|P| CachedPoint::from(ExtendedPoint::from(P))))
.collect::<Option<Vec<_>>>()
{
Some(x) => x,
.map(|p| p.map(|P| CachedPoint::from(ExtendedPoint::from(P))));
let scalars_points = scalars.zip(points).map(|(s,maybe_p)| maybe_p.map(|p| (s,p) ) )
.collect::<Option<Vec<_>>>();
let scalars_points = match scalars_points {
Some(sp) => sp,
None => return None,
};
@ -79,7 +81,7 @@ impl VartimeMultiscalarMul for Pippenger {
// and add/sub the point to the corresponding bucket.
// Note: if we add support for precomputed lookup tables,
// we'll be adding/subtractiong point premultiplied by `digits[i]` to buckets[0].
for (digits, pt) in scalars.iter().zip(points.iter()) {
for (digits, pt) in scalars_points.iter() {
let digit = digits[digit_index];
if digit > 0 {
let b = (digit - 1) as usize;