use curve25519_dalek::{
constants::RISTRETTO_BASEPOINT_POINT,
ristretto::{CompressedRistretto, RistrettoPoint},
scalar::Scalar,
};
use rand::OsRng;
use Error::{WiredRistrettoPointMalformed, WiredScalarMalformed};
#[derive(Copy, Clone, Debug)]
pub struct BlindKeypair {
private: Scalar,
public: RistrettoPoint,
}
impl BlindKeypair {
pub fn generate() -> ::Result<Self> {
let mut rng = OsRng::new()?;
let private = Scalar::random(&mut rng);
let public = private * RISTRETTO_BASEPOINT_POINT;
Ok(BlindKeypair { private, public })
}
pub fn from_wired(private: [u8; 32], public: [u8; 32]) -> ::Result<Self> {
Ok(BlindKeypair {
private: Scalar::from_canonical_bytes(private).ok_or(WiredScalarMalformed)?,
public: CompressedRistretto(public)
.decompress()
.ok_or(WiredRistrettoPointMalformed)?,
})
}
pub fn private(&self) -> Scalar {
self.private
}
pub fn public(&self) -> RistrettoPoint {
self.public
}
pub fn public_wired(&self) -> [u8; 32] {
self.public.compress().to_bytes()
}
pub fn private_wired(&self) -> [u8; 32] {
self.private.to_bytes()
}
}