arcium-core-utils 0.6.0

Arcium core utils
Documentation
use std::marker::PhantomData;

use primitives::{
    algebra::{
        elliptic_curve::Curve,
        field::{binary::Gf2_128, mersenne::Mersenne107},
    },
    correlated_randomness::{
        bundler::{errors::BundlerError, Bundler},
        dabits::DaBit,
        singlets::Singlet,
        stream::CorrelatedStream,
        triples::Triple,
    },
};

use crate::{
    circuit::preprocessing::CircuitPreprocessing,
    errors::AbortError,
    preprocessing::iterator::PreprocessingIterator,
};

/// Stream bundler, holding one stream per preprocessing type, to provide all preprocessing for a
/// circuit via its streams.
pub struct StreamBundler<
    C: Curve,
    BFDS: CorrelatedStream<DaBit<C::BaseField>>,
    BFSS: CorrelatedStream<Singlet<C::BaseField>>,
    BFTS: CorrelatedStream<Triple<C::BaseField>>,
    BSS: CorrelatedStream<Singlet<Gf2_128>>,
    BTS: CorrelatedStream<Triple<Gf2_128>>,
    MDS: CorrelatedStream<DaBit<Mersenne107>>,
    MSS: CorrelatedStream<Singlet<Mersenne107>>,
    MTS: CorrelatedStream<Triple<Mersenne107>>,
    SDS: CorrelatedStream<DaBit<C::Scalar>>,
    SSS: CorrelatedStream<Singlet<C::Scalar>>,
    STS: CorrelatedStream<Triple<C::Scalar>>,
> {
    // Base field
    pub basefield_dabit_stream: BFDS,
    pub basefield_singlet_stream: BFSS,
    pub basefield_triple_stream: BFTS,
    // Binary (Gf2_128)
    pub binary_singlet_stream: BSS,
    pub binary_triple_stream: BTS,
    // Mersenne107
    pub mersenne107_dabit_stream: MDS,
    pub mersenne107_singlet_stream: MSS,
    pub mersenne107_triple_stream: MTS,
    // Scalar
    pub scalar_dabit_stream: SDS,
    pub scalar_singlet_stream: SSS,
    pub scalar_triple_stream: STS,

    pub _c: PhantomData<C>,
}

impl<C, BFDS, BFSS, BFTS, BSS, BTS, MDS, MSS, MTS, SDS, SSS, STS>
    StreamBundler<C, BFDS, BFSS, BFTS, BSS, BTS, MDS, MSS, MTS, SDS, SSS, STS>
where
    C: Curve,
    BFDS: CorrelatedStream<DaBit<C::BaseField>>,
    BFSS: CorrelatedStream<Singlet<C::BaseField>>,
    BFTS: CorrelatedStream<Triple<C::BaseField>>,
    BSS: CorrelatedStream<Singlet<Gf2_128>>,
    BTS: CorrelatedStream<Triple<Gf2_128>>,
    MDS: CorrelatedStream<DaBit<Mersenne107>>,
    MSS: CorrelatedStream<Singlet<Mersenne107>>,
    MTS: CorrelatedStream<Triple<Mersenne107>>,
    SDS: CorrelatedStream<DaBit<C::Scalar>>,
    SSS: CorrelatedStream<Singlet<C::Scalar>>,
    STS: CorrelatedStream<Triple<C::Scalar>>,
{
    /// Creates a new bundler from the given streams.
    #[allow(clippy::too_many_arguments)]
    pub fn new(
        basefield_dabit_stream: BFDS,
        basefield_singlet_stream: BFSS,
        basefield_triple_stream: BFTS,
        binary_singlet_stream: BSS,
        binary_triple_stream: BTS,
        mersenne107_dabit_stream: MDS,
        mersenne107_singlet_stream: MSS,
        mersenne107_triple_stream: MTS,
        scalar_dabit_stream: SDS,
        scalar_singlet_stream: SSS,
        scalar_triple_stream: STS,
    ) -> Self {
        Self {
            basefield_dabit_stream,
            basefield_singlet_stream,
            basefield_triple_stream,
            binary_singlet_stream,
            binary_triple_stream,
            mersenne107_dabit_stream,
            mersenne107_singlet_stream,
            mersenne107_triple_stream,
            scalar_dabit_stream,
            scalar_singlet_stream,
            scalar_triple_stream,
            _c: PhantomData,
        }
    }
}

// ──────────────────────── PreprocessingBundler impl ──────────────────────── //

impl<C, BFDS, BFSS, BFTS, BSS, BTS, MDS, MSS, MTS, SDS, SSS, STS> Bundler
    for StreamBundler<C, BFDS, BFSS, BFTS, BSS, BTS, MDS, MSS, MTS, SDS, SSS, STS>
where
    C: Curve,
    BFDS: CorrelatedStream<DaBit<C::BaseField>, Error = AbortError>,
    BFSS: CorrelatedStream<Singlet<C::BaseField>, Error = AbortError>,
    BFTS: CorrelatedStream<Triple<C::BaseField>, Error = AbortError>,
    BSS: CorrelatedStream<Singlet<Gf2_128>, Error = AbortError>,
    BTS: CorrelatedStream<Triple<Gf2_128>, Error = AbortError>,
    MDS: CorrelatedStream<DaBit<Mersenne107>, Error = AbortError>,
    MSS: CorrelatedStream<Singlet<Mersenne107>, Error = AbortError>,
    MTS: CorrelatedStream<Triple<Mersenne107>, Error = AbortError>,
    SDS: CorrelatedStream<DaBit<C::Scalar>, Error = AbortError>,
    SSS: CorrelatedStream<Singlet<C::Scalar>, Error = AbortError>,
    STS: CorrelatedStream<Triple<C::Scalar>, Error = AbortError>,
{
    type Iterator = PreprocessingIterator<C>;
    fn fetch(
        &mut self,
        req: &CircuitPreprocessing,
    ) -> Result<PreprocessingIterator<C>, BundlerError> {
        Ok(PreprocessingIterator {
            base_field_dabits: self
                .basefield_dabit_stream
                .next_n(req.base_field.dabits)?
                .into_iter(),
            base_field_singlets: self
                .basefield_singlet_stream
                .next_n(req.base_field.singlets)?
                .into_iter(),
            base_field_triples: self
                .basefield_triple_stream
                .next_n(req.base_field.triples)?
                .into_iter(),
            binary_singlets: self
                .binary_singlet_stream
                .next_n(req.bit_singlets)?
                .into_iter(),
            binary_triples: self
                .binary_triple_stream
                .next_n(req.bit_triples)?
                .into_iter(),
            mersenne107_dabits: self
                .mersenne107_dabit_stream
                .next_n(req.mersenne107.dabits)?
                .into_iter(),
            mersenne107_singlets: self
                .mersenne107_singlet_stream
                .next_n(req.mersenne107.singlets)?
                .into_iter(),
            mersenne107_triples: self
                .mersenne107_triple_stream
                .next_n(req.mersenne107.triples)?
                .into_iter(),
            scalar_dabits: self
                .scalar_dabit_stream
                .next_n(req.scalar.dabits)?
                .into_iter(),
            scalar_singlets: self
                .scalar_singlet_stream
                .next_n(req.scalar.singlets)?
                .into_iter(),
            scalar_triples: self
                .scalar_triple_stream
                .next_n(req.scalar.triples)?
                .into_iter(),
        })
    }
}