#![allow(non_snake_case)]
use mohan::{
hash::{
blake256,
hash_to_ristretto
},
dalek::{
constants::{
RISTRETTO_BASEPOINT_COMPRESSED,
RISTRETTO_BASEPOINT_POINT
},
ristretto::RistrettoPoint,
scalar::Scalar,
traits::MultiscalarMul,
}
};
use bacteria::Transcript;
#[derive(Copy, Clone)]
pub struct PedersenGens
{
pub B: RistrettoPoint,
pub B_blinding: RistrettoPoint,
pub J_blinding: RistrettoPoint
}
impl PedersenGens {
pub fn commit(&self, value: &Scalar, blinding: &Scalar) -> RistrettoPoint {
RistrettoPoint::multiscalar_mul(vec![value, blinding].into_iter(), &[self.B, self.B_blinding])
}
pub fn blind_switch(&self, value: &Scalar, blinding: &Scalar) -> Scalar {
let rj = blinding * self.J_blinding;
let sub_commit = self.commit(value, blinding);
let mut transcript = Transcript::new(b"blind_switch");
let c = {
transcript.commit_point(b"left", &sub_commit.compress());
transcript.commit_point(b"right", &rj.compress());
transcript.challenge_scalar(b"c")
};
blinding + c
}
pub fn switch_commit(&self, value: &Scalar, blinding: &Scalar) -> RistrettoPoint {
self. commit(&value, &self.blind_switch(&value, &blinding))
}
}
impl Default for PedersenGens {
fn default() -> Self {
PedersenGens {
B: RISTRETTO_BASEPOINT_POINT,
B_blinding: hash_to_ristretto(RISTRETTO_BASEPOINT_COMPRESSED.as_bytes()),
J_blinding: hash_to_ristretto(
hash_to_ristretto(
RISTRETTO_BASEPOINT_COMPRESSED.as_bytes()
).compress().as_bytes()
)
}
}
}