use generic_ec::{Curve, Point, SecretScalar};
use rand_core::{CryptoRng, RngCore};
use crate::ciphersuite::{AdditionalEntropy, Ciphersuite};
#[derive(Clone)]
#[cfg_attr(
feature = "serde",
derive(serde::Serialize, serde::Deserialize),
serde(bound = "")
)]
pub struct SecretNonces<E: Curve> {
pub hiding_nonce: SecretScalar<E>,
pub binding_nonce: SecretScalar<E>,
}
impl<E: Curve> SecretNonces<E> {
pub fn public_commitments(&self) -> PublicCommitments<E> {
PublicCommitments {
hiding_comm: Point::generator() * &self.hiding_nonce,
binding_comm: Point::generator() * &self.binding_nonce,
}
}
}
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
#[cfg_attr(
feature = "serde",
derive(serde::Serialize, serde::Deserialize),
serde(bound = "")
)]
pub struct PublicCommitments<E: Curve> {
pub hiding_comm: Point<E>,
pub binding_comm: Point<E>,
}
pub fn commit<C: Ciphersuite>(
rng: &mut (impl RngCore + CryptoRng),
additional_entropy: &impl AdditionalEntropy<C>,
) -> (SecretNonces<C::Curve>, PublicCommitments<C::Curve>) {
let hiding_nonce = crate::ciphersuite::generate_nonce::<C>(rng, additional_entropy);
let binding_nonce = crate::ciphersuite::generate_nonce::<C>(rng, additional_entropy);
let nonces = SecretNonces {
hiding_nonce,
binding_nonce,
};
let comms = nonces.public_commitments();
(nonces, comms)
}