use snarkvm_curves::Group;
use super::{PedersenCRHParameters, PedersenSize};
pub const BOWE_HOPWOOD_CHUNK_SIZE: usize = 3;
pub const BOWE_HOPWOOD_LOOKUP_SIZE: usize = 2usize.pow(BOWE_HOPWOOD_CHUNK_SIZE as u32);
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct BoweHopwoodPedersenCRHParameters<G: Group> {
pub base_lookup: Vec<Vec<[G; BOWE_HOPWOOD_LOOKUP_SIZE]>>,
}
impl<G: Group> BoweHopwoodPedersenCRHParameters<G> {
pub fn setup<S: PedersenSize>(input: &PedersenCRHParameters<G, S>) -> Self {
Self {
base_lookup: input
.bases
.iter()
.map(|x| {
x.iter()
.map(|g| {
let mut out = [G::zero(); BOWE_HOPWOOD_LOOKUP_SIZE];
for i in 0..BOWE_HOPWOOD_LOOKUP_SIZE {
let mut encoded = *g;
if (i & 0x01) != 0 {
encoded += g;
}
if (i & 0x02) != 0 {
encoded += &g.double();
}
if (i & 0x04) != 0 {
encoded = encoded.neg();
}
out[i] = encoded;
}
out
})
.collect()
})
.collect(),
}
}
}