1#![deny(unsafe_code)]
2#![deny(missing_docs)]
3#![deny(clippy::missing_docs_in_private_items)]
4#![allow(incomplete_features)]
5#![allow(ambiguous_glob_reexports)]
6#![feature(inherent_associated_types)]
7
8use std::sync::{Arc, RwLock};
12
13use algebra::{CurvePoint, Scalar};
14use ark_ec::CurveGroup;
15
16use rand::thread_rng;
17
18pub mod algebra;
19pub mod beaver;
20#[cfg(feature = "benchmarks")]
21pub mod buffer;
22#[cfg(not(feature = "benchmarks"))]
23pub(crate) mod buffer;
24pub mod commitment;
25pub mod error;
26mod fabric;
27pub mod gadgets;
28#[cfg(feature = "benchmarks")]
29pub use fabric::*;
30#[cfg(not(feature = "benchmarks"))]
31pub use fabric::{FabricInner, MpcFabric, ResultHandle, ResultId, ResultValue};
32pub mod network;
33
34pub const PARTY0: u64 = 0;
40pub const PARTY1: u64 = 1;
42
43pub fn random_point<C: CurveGroup>() -> CurvePoint<C> {
46 let mut rng = thread_rng();
47 CurvePoint::generator() * Scalar::random(&mut rng)
48}
49
50type Shared<T> = Arc<RwLock<T>>;
56
57#[cfg(any(test, feature = "test_helpers"))]
58pub mod test_helpers {
59 use futures::Future;
62
63 use crate::{
64 beaver::{PartyIDBeaverSource, SharedValueSource},
65 network::{MockNetwork, NoRecvNetwork, UnboundedDuplexStream},
66 MpcFabric, PARTY0, PARTY1,
67 };
68
69 use ark_bn254::G1Projective as Bn254Projective;
70
71 pub type TestCurve = Bn254Projective;
73
74 pub fn mock_fabric() -> MpcFabric<TestCurve> {
76 let network = NoRecvNetwork::default();
77 let beaver_source = PartyIDBeaverSource::default();
78
79 MpcFabric::new(network, beaver_source)
80 }
81
82 pub async fn execute_mock_mpc<T, S, F>(f: F) -> (T, T)
88 where
89 T: Send + 'static,
90 S: Future<Output = T> + Send + 'static,
91 F: FnMut(MpcFabric<TestCurve>) -> S,
92 {
93 execute_mock_mpc_with_beaver_source(
94 f,
95 PartyIDBeaverSource::new(PARTY0),
96 PartyIDBeaverSource::new(PARTY1),
97 )
98 .await
99 }
100
101 pub async fn execute_mock_mpc_with_beaver_source<B, T, S, F>(
103 mut f: F,
104 party0_beaver: B,
105 party1_beaver: B,
106 ) -> (T, T)
107 where
108 B: 'static + SharedValueSource<TestCurve>,
109 T: Send + 'static,
110 S: Future<Output = T> + Send + 'static,
111 F: FnMut(MpcFabric<TestCurve>) -> S,
112 {
113 let (party0_stream, party1_stream) = UnboundedDuplexStream::new_duplex_pair();
115 let party0_fabric = MpcFabric::new(MockNetwork::new(PARTY0, party0_stream), party0_beaver);
116 let party1_fabric = MpcFabric::new(MockNetwork::new(PARTY1, party1_stream), party1_beaver);
117
118 let fabric0 = party0_fabric.clone();
120 let fabric1 = party1_fabric.clone();
121 let party0_task = tokio::spawn(f(fabric0));
122 let party1_task = tokio::spawn(f(fabric1));
123
124 let party0_output = party0_task.await.unwrap();
125 let party1_output = party1_task.await.unwrap();
126
127 party0_fabric.shutdown();
129 party1_fabric.shutdown();
130
131 (party0_output, party1_output)
132 }
133}