use crate::{errors::DomainSeparatorMismatch, Unit};
pub trait UnitTranscript<U: Unit> {
fn public_units(&mut self, input: &[U]) -> Result<(), DomainSeparatorMismatch>;
fn fill_challenge_units(&mut self, output: &mut [U]) -> Result<(), DomainSeparatorMismatch>;
}
pub trait CommonUnitToBytes {
fn public_bytes(&mut self, input: &[u8]) -> Result<(), DomainSeparatorMismatch>;
}
pub trait UnitToBytes {
fn fill_challenge_bytes(&mut self, output: &mut [u8]) -> Result<(), DomainSeparatorMismatch>;
fn challenge_bytes<const N: usize>(&mut self) -> Result<[u8; N], DomainSeparatorMismatch> {
let mut output = [0u8; N];
self.fill_challenge_bytes(&mut output)?;
Ok(output)
}
}
pub trait ByteTranscript: CommonUnitToBytes + UnitToBytes {}
pub trait BytesToUnitDeserialize {
fn fill_next_bytes(&mut self, input: &mut [u8]) -> Result<(), DomainSeparatorMismatch>;
fn next_bytes<const N: usize>(&mut self) -> Result<[u8; N], DomainSeparatorMismatch> {
let mut input = [0u8; N];
self.fill_next_bytes(&mut input)?;
Ok(input)
}
}
pub trait BytesToUnitSerialize {
fn add_bytes(&mut self, input: &[u8]) -> Result<(), DomainSeparatorMismatch>;
}
pub trait ByteDomainSeparator {
#[must_use]
fn add_bytes(self, count: usize, label: &str) -> Self;
#[must_use]
fn hint(self, label: &str) -> Self;
#[must_use]
fn challenge_bytes(self, count: usize, label: &str) -> Self;
}
impl<T: UnitTranscript<u8>> CommonUnitToBytes for T {
#[inline]
fn public_bytes(&mut self, input: &[u8]) -> Result<(), DomainSeparatorMismatch> {
self.public_units(input)
}
}
impl<T: UnitTranscript<u8>> UnitToBytes for T {
#[inline]
fn fill_challenge_bytes(&mut self, output: &mut [u8]) -> Result<(), DomainSeparatorMismatch> {
self.fill_challenge_units(output)
}
}