pub mod dlog_group;
pub mod private_input;
pub mod prover;
pub mod sigma_boolean;
pub mod verifier;
mod challenge;
mod dlog_protocol;
mod fiat_shamir;
mod sig_serializer;
mod unchecked_tree;
mod unproven_tree;
use k256::Scalar;
use dlog_protocol::FirstDlogProverMessage;
use sigma_boolean::{ProveDlog, SigmaBoolean, SigmaProofOfKnowledgeTree};
use std::convert::TryInto;
use unchecked_tree::{UncheckedSigmaTree, UncheckedTree};
use unproven_tree::{UnprovenLeaf, UnprovenSchnorr, UnprovenTree};
use self::challenge::Challenge;
pub trait ProverMessage {
fn bytes(&self) -> Vec<u8>;
}
pub enum FirstProverMessage {
FirstDlogProverMessage(FirstDlogProverMessage),
FirstDHTProverMessage,
}
impl ProverMessage for FirstProverMessage {
fn bytes(&self) -> Vec<u8> {
match self {
FirstProverMessage::FirstDlogProverMessage(fdpm) => fdpm.bytes(),
FirstProverMessage::FirstDHTProverMessage => todo!(),
}
}
}
pub enum ProofTree {
UncheckedTree(UncheckedTree),
UnprovenTree(UnprovenTree),
}
impl ProofTree {
pub fn with_challenge(&self, challenge: Challenge) -> ProofTree {
match self {
ProofTree::UncheckedTree(_) => todo!(),
ProofTree::UnprovenTree(ut) => match ut {
UnprovenTree::UnprovenLeaf(ul) => match ul {
UnprovenLeaf::UnprovenSchnorr(us) => ProofTree::UnprovenTree(
UnprovenSchnorr {
challenge_opt: Some(challenge),
..us.clone()
}
.into(),
),
},
},
}
}
}
impl<T: Into<UncheckedTree>> From<T> for ProofTree {
fn from(t: T) -> Self {
ProofTree::UncheckedTree(t.into())
}
}
pub trait ProofTreeLeaf {
fn proposition(&self) -> SigmaBoolean;
fn commitment_opt(&self) -> Option<FirstProverMessage>;
}
pub const GROUP_SIZE_BITS: usize = 256;
pub const GROUP_SIZE: usize = GROUP_SIZE_BITS / 8;
#[derive(PartialEq, Eq, Debug, Clone)]
pub struct GroupSizedBytes(pub Box<[u8; GROUP_SIZE]>);
impl From<GroupSizedBytes> for Scalar {
fn from(b: GroupSizedBytes) -> Self {
let sl: &[u8] = b.0.as_ref();
Scalar::from_bytes_reduced(sl.try_into().expect(""))
}
}
impl From<&[u8; GROUP_SIZE]> for GroupSizedBytes {
fn from(b: &[u8; GROUP_SIZE]) -> Self {
GroupSizedBytes(Box::new(*b))
}
}
pub const SOUNDNESS_BITS: usize = 192;
pub const SOUNDNESS_BYTES: usize = SOUNDNESS_BITS / 8;
#[cfg(test)]
mod tests {
use super::*;
#[allow(clippy::assertions_on_constants)]
#[test]
fn ensure_soundness_bits() {
assert!(SOUNDNESS_BITS < GROUP_SIZE_BITS);
assert!(SOUNDNESS_BYTES * 8 <= 512);
assert!(SOUNDNESS_BYTES % 8 == 0);
}
}