1use primitives::{
2 algebra::field::binary::Gf2_128,
3 correlated_randomness::{
4 bundler::{errors::BundlerError, BundleIterator},
5 dabits::DaBit,
6 singlets::Singlet,
7 stream::{Next, NextVec, NextVecIterator},
8 },
9 sharing::{Malicious, ThreatModel},
10 types::identifiers::Named,
11};
12
13use crate::{
14 circuit::preprocessing::{CircuitPreprocessing, FieldCircuitPreprocessing},
15 config::{BaseFieldOf, MpcConfig, MpcFieldOf, ScalarFieldOf},
16 errors::AbortError,
17 preprocessing::{NextDaBit, NextDaBits, NextSinglet, NextSinglets},
18};
19
20pub struct PreprocessingIterator<C: MpcConfig, M: ThreatModel = Malicious> {
22 pub base_field_dabits: NextVecIterator<DaBit<BaseFieldOf<C>>, AbortError>,
24 pub base_field_singlets: NextVecIterator<Singlet<BaseFieldOf<C>>, AbortError>,
25 pub base_field_triples: NextVecIterator<M::Triple<BaseFieldOf<C>>, AbortError>,
26
27 pub binary_singlets: NextVecIterator<Singlet<Gf2_128>, AbortError>,
29 pub binary_triples: NextVecIterator<M::Triple<Gf2_128>, AbortError>,
30
31 pub mpc_field_dabits: NextVecIterator<DaBit<MpcFieldOf<C>>, AbortError>,
33 pub mpc_field_singlets: NextVecIterator<Singlet<MpcFieldOf<C>>, AbortError>,
34 pub mpc_field_triples: NextVecIterator<M::Triple<MpcFieldOf<C>>, AbortError>,
35
36 pub scalar_dabits: NextVecIterator<DaBit<ScalarFieldOf<C>>, AbortError>,
38 pub scalar_singlets: NextVecIterator<Singlet<ScalarFieldOf<C>>, AbortError>,
39 pub scalar_triples: NextVecIterator<M::Triple<ScalarFieldOf<C>>, AbortError>,
40}
41
42impl<C: MpcConfig, M: ThreatModel> BundleIterator for PreprocessingIterator<C, M> {
43 type Size = CircuitPreprocessing;
44
45 fn len(&self) -> CircuitPreprocessing {
46 CircuitPreprocessing {
47 bit_singlets: self.binary_singlets.len(),
48 bit_triples: self.binary_triples.len(),
49 base_field: FieldCircuitPreprocessing {
50 singlets: self.base_field_singlets.len(),
51 triples: self.base_field_triples.len(),
52 dabits: self.base_field_dabits.len(),
53 },
54 scalar: FieldCircuitPreprocessing {
55 singlets: self.scalar_singlets.len(),
56 triples: self.scalar_triples.len(),
57 dabits: self.scalar_dabits.len(),
58 },
59 mpc_field: FieldCircuitPreprocessing {
60 singlets: self.mpc_field_singlets.len(),
61 triples: self.mpc_field_triples.len(),
62 dabits: self.mpc_field_dabits.len(),
63 },
64 }
65 }
66 }
68
69macro_rules! next_preprocessing_item {
70 ($( ($fn:ident, $iter:ident, $ret:ty, $ty:ty, $kind:literal) ),* $(,)?) => {
71 $(
72 pub fn $fn(&mut self) -> Result<$ret, BundlerError> {
73 self.$iter.next().ok_or_else(|| {
74 BundlerError::InsufficientPreprocessing(
75 format!("{} {}", <$ty>::get_name(), $kind),
76 )
77 })
78 }
79 )*
80 };
81}
82
83macro_rules! next_n_preprocessing_items {
84 ($( ($fn:ident, $iter:ident, $ret:ty, $ty:ty, $kind:literal) ),* $(,)?) => {
85 $(
86 pub fn $fn(&mut self, n: usize) -> Result<$ret, BundlerError> {
87 self.$iter.next_n(n).ok_or_else(|| {
88 BundlerError::InsufficientPreprocessing(
89 format!("{} {} (requested {}, available {})", <$ty>::get_name(), $kind, n, self.$iter.len()),
90 )
91 })
92 }
93 )*
94 };
95}
96
97impl<C: MpcConfig, M: ThreatModel> PreprocessingIterator<C, M> {
98 next_preprocessing_item!(
99 (next_base_field_dabit, base_field_dabits, NextDaBit<BaseFieldOf<C>>, BaseFieldOf<C>, "dabits"),
100 (next_base_field_singlet, base_field_singlets, NextSinglet<BaseFieldOf<C>>, BaseFieldOf<C>, "singlets"),
101 (next_base_field_triple, base_field_triples, Next<M::Triple<BaseFieldOf<C>>, AbortError>, BaseFieldOf<C>, "triples"),
102 (next_bit_singlet, binary_singlets, NextSinglet<Gf2_128>, Gf2_128, "singlets"),
103 (next_bit_triple, binary_triples, Next<M::Triple<Gf2_128>, AbortError>, Gf2_128, "triples"),
104 (next_mpc_field_dabit, mpc_field_dabits, NextDaBit<MpcFieldOf<C>>, MpcFieldOf<C>, "dabits"),
105 (next_mpc_field_singlet, mpc_field_singlets, NextSinglet<MpcFieldOf<C>>, MpcFieldOf<C>, "singlets"),
106 (next_mpc_field_triple, mpc_field_triples, Next<M::Triple<MpcFieldOf<C>>, AbortError>, MpcFieldOf<C>, "triples"),
107 (next_scalar_dabit, scalar_dabits, NextDaBit<ScalarFieldOf<C>>, ScalarFieldOf<C>, "dabits"),
108 (next_scalar_singlet, scalar_singlets, NextSinglet<ScalarFieldOf<C>>, ScalarFieldOf<C>, "singlets"),
109 (next_scalar_triple, scalar_triples, Next<M::Triple<ScalarFieldOf<C>>, AbortError>, ScalarFieldOf<C>, "triples"),
110 );
111
112 next_n_preprocessing_items!(
113 (next_n_base_field_dabits, base_field_dabits, NextDaBits<BaseFieldOf<C>>, BaseFieldOf<C>, "dabits"),
114 (next_n_base_field_singlets, base_field_singlets, NextSinglets<BaseFieldOf<C>>, BaseFieldOf<C>, "singlets"),
115 (next_n_base_field_triples, base_field_triples, NextVec<M::Triple<BaseFieldOf<C>>, AbortError>, BaseFieldOf<C>, "triples"),
116 (next_n_bit_singlets, binary_singlets, NextSinglets<Gf2_128>, Gf2_128, "singlets"),
117 (next_n_bit_triples, binary_triples, NextVec<M::Triple<Gf2_128>, AbortError>, Gf2_128, "triples"),
118 (next_n_mpc_field_dabits, mpc_field_dabits, NextDaBits<MpcFieldOf<C>>, MpcFieldOf<C>, "dabits"),
119 (next_n_mpc_field_singlets, mpc_field_singlets, NextSinglets<MpcFieldOf<C>>, MpcFieldOf<C>, "singlets"),
120 (next_n_mpc_field_triples, mpc_field_triples, NextVec<M::Triple<MpcFieldOf<C>>, AbortError>, MpcFieldOf<C>, "triples"),
121 (next_n_scalar_dabits, scalar_dabits, NextDaBits<ScalarFieldOf<C>>, ScalarFieldOf<C>, "dabits"),
122 (next_n_scalar_singlets, scalar_singlets, NextSinglets<ScalarFieldOf<C>>, ScalarFieldOf<C>, "singlets"),
123 (next_n_scalar_triples, scalar_triples, NextVec<M::Triple<ScalarFieldOf<C>>, AbortError>, ScalarFieldOf<C>, "triples"),
124 );
125}
126
127impl<C: MpcConfig, M: ThreatModel> std::fmt::Debug for PreprocessingIterator<C, M> {
128 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
129 write!(f, "PreprocessingIterator with len: {:?}", self.len())
130 }
131}