pub struct DuplexChallenger<F, P, const WIDTH: usize, const RATE: usize>{
pub sponge_state: [F; WIDTH],
pub input_buffer: Vec<F>,
pub output_buffer: Vec<F>,
pub permutation: P,
}Expand description
A generic duplex sponge challenger over a finite field, used for generating deterministic challenges from absorbed inputs.
This structure implements a duplex sponge that alternates between:
- Absorbing inputs into the sponge state,
- Applying a cryptographic permutation over the state,
- Squeezing outputs from the state as challenges.
The sponge operates over a state of WIDTH elements, divided into:
- A rate of
RATEelements (the portion exposed to input/output), - A capacity of
WIDTH - RATEelements (the hidden part ensuring security).
The challenger buffers observed inputs until the rate is full, applies the permutation, and then produces challenge outputs from the permuted state. It supports:
- Observing single values, arrays, hashes, or nested vectors,
- Sampling fresh challenges as field elements or bitstrings.
Fields§
§sponge_state: [F; WIDTH]The internal sponge state, consisting of WIDTH field elements.
The first RATE elements form the rate section, where input values are absorbed
and output values are squeezed.
The remaining WIDTH - RATE elements form the capacity, which provides hidden
entropy and security against attacks.
input_buffer: Vec<F>A buffer holding field elements that have been observed but not yet absorbed.
Inputs added via observe are collected here.
Once the buffer reaches RATE elements, the sponge performs a duplexing step:
it absorbs the inputs into the state and applies the permutation.
output_buffer: Vec<F>A buffer holding field elements that have been squeezed from the sponge state.
Outputs are produced by duplexing and stored here.
Calls to sample or sample_bits pop values from this buffer.
When the buffer is empty (or new inputs were absorbed), a new duplexing step is triggered.
permutation: PThe cryptographic permutation applied to the sponge state.
This permutation must provide strong pseudorandomness and collision resistance, ensuring that squeezed outputs are indistinguishable from random and securely bound to the absorbed inputs.
Implementations§
Source§impl<F, P, const WIDTH: usize, const RATE: usize> DuplexChallenger<F, P, WIDTH, RATE>
impl<F, P, const WIDTH: usize, const RATE: usize> DuplexChallenger<F, P, WIDTH, RATE>
Trait Implementations§
Source§impl<F, P, const N: usize, const WIDTH: usize, const RATE: usize> CanObserve<[F; N]> for DuplexChallenger<F, P, WIDTH, RATE>
impl<F, P, const N: usize, const WIDTH: usize, const RATE: usize> CanObserve<[F; N]> for DuplexChallenger<F, P, WIDTH, RATE>
Source§impl<F, P, const WIDTH: usize, const RATE: usize> CanObserve<F> for DuplexChallenger<F, P, WIDTH, RATE>
impl<F, P, const WIDTH: usize, const RATE: usize> CanObserve<F> for DuplexChallenger<F, P, WIDTH, RATE>
Source§impl<F, P, const N: usize, const WIDTH: usize, const RATE: usize> CanObserve<Hash<F, F, N>> for DuplexChallenger<F, P, WIDTH, RATE>
impl<F, P, const N: usize, const WIDTH: usize, const RATE: usize> CanObserve<Hash<F, F, N>> for DuplexChallenger<F, P, WIDTH, RATE>
Source§impl<F, P, const WIDTH: usize, const RATE: usize> CanObserve<Vec<Vec<F>>> for DuplexChallenger<F, P, WIDTH, RATE>
impl<F, P, const WIDTH: usize, const RATE: usize> CanObserve<Vec<Vec<F>>> for DuplexChallenger<F, P, WIDTH, RATE>
Source§impl<F, EF, P, const WIDTH: usize, const RATE: usize> CanSample<EF> for DuplexChallenger<F, P, WIDTH, RATE>
impl<F, EF, P, const WIDTH: usize, const RATE: usize> CanSample<EF> for DuplexChallenger<F, P, WIDTH, RATE>
Source§fn sample_array<const N: usize>(&mut self) -> [T; N]
fn sample_array<const N: usize>(&mut self) -> [T; N]
N challenge values from the transcript.Source§fn sample_vec(&mut self, n: usize) -> Vec<T>
fn sample_vec(&mut self, n: usize) -> Vec<T>
Vec of n challenge values from the transcript.Source§impl<F, P, const WIDTH: usize, const RATE: usize> CanSampleBits<usize> for DuplexChallenger<F, P, WIDTH, RATE>
impl<F, P, const WIDTH: usize, const RATE: usize> CanSampleBits<usize> for DuplexChallenger<F, P, WIDTH, RATE>
Source§fn sample_bits(&mut self, bits: usize) -> usize
fn sample_bits(&mut self, bits: usize) -> usize
The sampled bits are not perfectly uniform, but we can bound the error: every sequence appears with probability 1/p-close to uniform (1/2^b).
Proof:
We denote p = F::ORDER_U64, and b = bits.
If X follows a uniform distribution over F, if we consider the first b bits of X, each
sequence appears either with probability P1 = ⌊p / 2^b⌋ / p or P2 = (1 + ⌊p / 2^b⌋) / p.
We have 1/2^b - 1/p ≤ P1, P2 ≤ 1/2^b + 1/p
Source§impl<F, P, const WIDTH: usize, const RATE: usize> CanSampleUniformBits<F> for DuplexChallenger<F, P, WIDTH, RATE>
impl<F, P, const WIDTH: usize, const RATE: usize> CanSampleUniformBits<F> for DuplexChallenger<F, P, WIDTH, RATE>
Source§fn sample_uniform_bits<const RESAMPLE: bool>(
&mut self,
bits: usize,
) -> Result<usize, ResamplingError>
fn sample_uniform_bits<const RESAMPLE: bool>( &mut self, bits: usize, ) -> Result<usize, ResamplingError>
bits-bit integer from the transcript with a guarantee of
uniformly sampled bits. Read moreSource§impl<F, P, const WIDTH: usize, const RATE: usize> Clone for DuplexChallenger<F, P, WIDTH, RATE>
impl<F, P, const WIDTH: usize, const RATE: usize> Clone for DuplexChallenger<F, P, WIDTH, RATE>
Source§fn clone(&self) -> DuplexChallenger<F, P, WIDTH, RATE>
fn clone(&self) -> DuplexChallenger<F, P, WIDTH, RATE>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<F, P, const WIDTH: usize, const RATE: usize> Debug for DuplexChallenger<F, P, WIDTH, RATE>
impl<F, P, const WIDTH: usize, const RATE: usize> Debug for DuplexChallenger<F, P, WIDTH, RATE>
Source§impl<F, P, const WIDTH: usize, const RATE: usize> FieldChallenger<F> for DuplexChallenger<F, P, WIDTH, RATE>
impl<F, P, const WIDTH: usize, const RATE: usize> FieldChallenger<F> for DuplexChallenger<F, P, WIDTH, RATE>
Source§fn observe_algebra_element<A: BasedVectorSpace<F>>(&mut self, alg_elem: A)
fn observe_algebra_element<A: BasedVectorSpace<F>>(&mut self, alg_elem: A)
Source§fn observe_algebra_slice<A: BasedVectorSpace<F> + Clone>(
&mut self,
alg_elems: &[A],
)
fn observe_algebra_slice<A: BasedVectorSpace<F> + Clone>( &mut self, alg_elems: &[A], )
Source§fn sample_algebra_element<A: BasedVectorSpace<F>>(&mut self) -> A
fn sample_algebra_element<A: BasedVectorSpace<F>>(&mut self) -> A
Source§fn observe_base_as_algebra_element<EF>(&mut self, val: F)where
EF: Algebra<F> + BasedVectorSpace<F>,
fn observe_base_as_algebra_element<EF>(&mut self, val: F)where
EF: Algebra<F> + BasedVectorSpace<F>,
Source§impl<F, P, const WIDTH: usize, const RATE: usize> GrindingChallenger for DuplexChallenger<F, P, WIDTH, RATE>
impl<F, P, const WIDTH: usize, const RATE: usize> GrindingChallenger for DuplexChallenger<F, P, WIDTH, RATE>
Source§impl<F, P, const WIDTH: usize, const RATE: usize> UniformGrindingChallenger for DuplexChallenger<F, P, WIDTH, RATE>
impl<F, P, const WIDTH: usize, const RATE: usize> UniformGrindingChallenger for DuplexChallenger<F, P, WIDTH, RATE>
Source§fn grind_uniform(&mut self, bits: usize) -> Self::Witness
fn grind_uniform(&mut self, bits: usize) -> Self::Witness
Source§fn grind_uniform_may_error(&mut self, bits: usize) -> Self::Witness
fn grind_uniform_may_error(&mut self, bits: usize) -> Self::Witness
UniformSamplingField trait implemented for each field for details. Read moreAuto Trait Implementations§
impl<F, P, const WIDTH: usize, const RATE: usize> Freeze for DuplexChallenger<F, P, WIDTH, RATE>
impl<F, P, const WIDTH: usize, const RATE: usize> RefUnwindSafe for DuplexChallenger<F, P, WIDTH, RATE>where
P: RefUnwindSafe,
F: RefUnwindSafe,
impl<F, P, const WIDTH: usize, const RATE: usize> Send for DuplexChallenger<F, P, WIDTH, RATE>
impl<F, P, const WIDTH: usize, const RATE: usize> Sync for DuplexChallenger<F, P, WIDTH, RATE>where
F: Sync,
impl<F, P, const WIDTH: usize, const RATE: usize> Unpin for DuplexChallenger<F, P, WIDTH, RATE>
impl<F, P, const WIDTH: usize, const RATE: usize> UnwindSafe for DuplexChallenger<F, P, WIDTH, RATE>where
P: UnwindSafe,
F: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more