#![forbid(unsafe_code)]
#![allow(dead_code, clippy::manual_is_multiple_of, clippy::needless_range_loop)]
mod algebra;
mod crs;
mod error;
mod protocol;
pub use algebra::ring::{
encode_rq_coeffs_le, short_vec_to_rq, short_vec_to_rq_bound, RqPoly, ScrubbedPoly,
};
pub use crs::VerifyingKey;
pub use error::LeError;
pub use protocol::commit::{
commit_mlwe, verify_lattice_algebraic, Commitment, CommitmentRandomness, LatticeProof,
PublicBinding, PublicInstance, Witness,
};
pub(crate) use protocol::commit::prove_with_witness;
pub(crate) trait DeterministicRng {
fn next_u32(&mut self) -> u32;
fn fill_bytes(&mut self, dest: &mut [u8]);
}
pub use protocol::params::{
BETA, C_POLY_SIZE, C_POLY_SPAN, ETA, GAMMA, N, PUBLIC_DIGEST_COEFFS, PUBLIC_DIGEST_COEFF_MAX, Q,
};
pub use qssm_utils::LE_FS_PUBLIC_BINDING_LAYOUT_VERSION;
pub fn verify_lattice(
vk: &VerifyingKey,
public: &PublicInstance,
commitment: &Commitment,
proof: &LatticeProof,
binding_context: &[u8; 32],
) -> Result<bool, LeError> {
verify_lattice_algebraic(vk, public, commitment, proof, binding_context)
}
pub fn prove_arithmetic(
vk: &VerifyingKey,
public: &PublicInstance,
witness: &Witness,
binding_context: &[u8; 32],
rng_seed: [u8; 32],
) -> Result<(Commitment, LatticeProof), LeError> {
let commitment = commit_mlwe(vk, public, witness)?;
let mut rng = Blake3Rng::new(rng_seed);
let proof = prove_with_witness(vk, public, witness, &commitment, binding_context, &mut rng)?;
Ok((commitment, proof))
}
struct Blake3Rng {
reader: blake3::OutputReader,
}
impl Blake3Rng {
fn new(mut seed: [u8; 32]) -> Self {
let h = blake3::Hasher::new_keyed(&seed);
zeroize::Zeroize::zeroize(&mut seed);
Self {
reader: h.finalize_xof(),
}
}
}
impl DeterministicRng for Blake3Rng {
fn next_u32(&mut self) -> u32 {
let mut buf = [0u8; 4];
self.reader.fill(&mut buf);
u32::from_le_bytes(buf)
}
fn fill_bytes(&mut self, dest: &mut [u8]) {
self.reader.fill(dest);
}
}