use crate::{le_repr, wnaf_form};
use alloc::vec::Vec;
use core::marker::PhantomData;
use ff::PrimeField;
#[derive(Clone, Debug)]
pub struct WnafScalar<F: PrimeField, const WINDOW_SIZE: usize> {
pub(crate) wnaf: Vec<i64>,
field: PhantomData<F>,
}
impl<F: PrimeField, const WINDOW_SIZE: usize> WnafScalar<F, WINDOW_SIZE> {
pub fn new(scalar: &F) -> Self {
let mut wnaf = vec![];
wnaf_form(&mut wnaf, le_repr(scalar), WINDOW_SIZE);
WnafScalar {
wnaf,
field: PhantomData,
}
}
pub fn from_le_bytes(bytes: &[u8]) -> Option<Self> {
let mut repr = F::Repr::default();
let repr_len = repr.as_ref().len();
if bytes.len() > repr_len {
return None;
}
for (i, &byte) in bytes.iter().enumerate() {
repr.as_mut()[repr_len - 1 - i] = byte;
}
if bool::from(F::from_repr(repr).is_none()) {
return None;
}
let mut wnaf = vec![];
wnaf_form(&mut wnaf, bytes, WINDOW_SIZE);
Some(WnafScalar {
wnaf,
field: PhantomData,
})
}
}