Simplify finite fields.

This commit is contained in:
th4s
2024-07-19 11:06:58 +02:00
parent 8db1961083
commit 68ba8cdcf7
4 changed files with 40 additions and 51 deletions

View File

@@ -2,7 +2,7 @@
//! be the OT receiver.
//!
//! We start again by opening a connection. To be able use the connection with out OT API you need
//! to wrap it in a [`mpz_common::executor::STExecutor`].
//! to wrap it in a [`mpz_common::executor::STExecutor`], which will be the [`mpz_common::Context`].
//!
//! Now either create an [`mpz_ot::OTSender`] or an [`mpz_ot::OTReceiver`] and set it up by calling
//! [`mpz_ot::OTSetup::setup`]. You can use [`mpz_ot::chou_orlandi::Sender`] and

View File

@@ -1,28 +1,31 @@
use common::{tcp_mux, FramedUidMux, Role, DEFAULT_LOCAL};
use common::{tcp_connect, Role, DEFAULT_LOCAL};
use finite_fields::setup_ot_sender;
use mpz_common::{executor::MTExecutor, Allocate, Preprocess};
use mpz_common::{executor::STExecutor, Allocate, Context, Preprocess};
use mpz_fields::{p256::P256, Field};
use mpz_ole::rot::OLESender;
use mpz_share_conversion::{
AdditiveToMultiplicative, MultiplicativeToAdditive, ShareConversionSender,
};
use serio::{stream::IoStreamExt, SinkExt};
use serio::{
codec::{Bincode, Codec},
stream::IoStreamExt,
SinkExt,
};
#[tokio::main]
async fn main() {
// Open connection and poll it in the background.
let (future, mut ctrl) = tcp_mux(Role::Alice, DEFAULT_LOCAL).await.unwrap();
let join_handle = tokio::spawn(future);
// Open a connection.
let tcp = tcp_connect(Role::Alice, DEFAULT_LOCAL).await.unwrap();
let channel = Bincode::default().new_framed(tcp);
// Create an executor and setup OT.
let mut executor = MTExecutor::new(ctrl.clone(), 32);
let mut executor = STExecutor::new(channel);
let ot_sender = setup_ot_sender(&mut executor).await.unwrap();
// Setup OLE and share conversion.
let mut context = executor.new_thread().await.unwrap();
let mut ole_sender = OLESender::<_, P256>::new(ot_sender);
ole_sender.alloc(2);
ole_sender.preprocess(&mut context).await.unwrap();
ole_sender.preprocess(&mut executor).await.unwrap();
let mut sender = ShareConversionSender::<_, P256>::new(ole_sender);
@@ -31,19 +34,19 @@ async fn main() {
// Perform the conversion.
let factor = sender
.to_multiplicative(&mut context, vec![number])
.to_multiplicative(&mut executor, vec![number])
.await
.unwrap();
let summand = sender
.to_additive(&mut context, factor)
.to_additive(&mut executor, factor)
.await
.unwrap()
.pop()
.unwrap();
// Open a channel and send/receive starting and final numbers.
let mut channel = ctrl.open_framed(b"1").await.unwrap();
// Get the channel and send/receive starting and final numbers.
let channel = executor.io_mut();
channel.send(number).await.unwrap();
channel.send(summand).await.unwrap();
@@ -53,8 +56,4 @@ async fn main() {
// Check that conversion worked correctly.
println!("Original sum: {:?}", (number + number2).to_be_bytes());
println!("Final sum: {:?}", (summand + summand2).to_be_bytes());
// Properly close the connection.
ctrl.mux_mut().close();
join_handle.await.unwrap().unwrap();
}

View File

@@ -1,28 +1,31 @@
use common::{tcp_mux, FramedUidMux, Role, DEFAULT_LOCAL};
use common::{tcp_connect, Role, DEFAULT_LOCAL};
use finite_fields::setup_ot_receiver;
use mpz_common::{executor::MTExecutor, Allocate, Preprocess};
use mpz_common::{executor::STExecutor, Allocate, Context, Preprocess};
use mpz_fields::{p256::P256, Field};
use mpz_ole::rot::OLEReceiver;
use mpz_share_conversion::{
AdditiveToMultiplicative, MultiplicativeToAdditive, ShareConversionReceiver,
};
use serio::{stream::IoStreamExt, SinkExt};
use serio::{
codec::{Bincode, Codec},
stream::IoStreamExt,
SinkExt,
};
#[tokio::main]
async fn main() {
// Open connection and poll it in the background.
let (future, mut ctrl) = tcp_mux(Role::Bob, DEFAULT_LOCAL).await.unwrap();
let join_handle = tokio::spawn(future);
// Open a connection.
let tcp = tcp_connect(Role::Bob, DEFAULT_LOCAL).await.unwrap();
let channel = Bincode::default().new_framed(tcp);
// Create an executor and setup OT.
let mut executor = MTExecutor::new(ctrl.clone(), 32);
let mut executor = STExecutor::new(channel);
let ot_receiver = setup_ot_receiver(&mut executor).await.unwrap();
// Setup OLE and share conversion.
let mut context = executor.new_thread().await.unwrap();
let mut ole_receiver = OLEReceiver::<_, P256>::new(ot_receiver);
ole_receiver.alloc(2);
ole_receiver.preprocess(&mut context).await.unwrap();
ole_receiver.preprocess(&mut executor).await.unwrap();
let mut receiver = ShareConversionReceiver::<_, P256>::new(ole_receiver);
@@ -31,19 +34,19 @@ async fn main() {
// Perform the conversion.
let factor = receiver
.to_multiplicative(&mut context, vec![number])
.to_multiplicative(&mut executor, vec![number])
.await
.unwrap();
let summand = receiver
.to_additive(&mut context, factor)
.to_additive(&mut executor, factor)
.await
.unwrap()
.pop()
.unwrap();
// Open a channel and send/receive starting and final numbers.
let mut channel = ctrl.open_framed(b"1").await.unwrap();
// Get the channel and send/receive starting and final numbers.
let channel = executor.io_mut();
channel.send(number).await.unwrap();
channel.send(summand).await.unwrap();
@@ -53,8 +56,4 @@ async fn main() {
// Check that conversion worked correctly.
println!("Original sum: {:?}", (number + number2).to_be_bytes());
println!("Final sum: {:?}", (summand + summand2).to_be_bytes());
// Properly close the connection.
ctrl.mux_mut().close();
join_handle.await.unwrap().unwrap();
}

View File

@@ -11,8 +11,7 @@
//! other.
use anyhow::Error as Anyhow;
use common::MuxControl;
use mpz_common::executor::MTExecutor;
use mpz_common::Context;
use mpz_ot::{
chou_orlandi::{
Receiver as BaseReceiver, ReceiverConfig as BaseReceiverConfig, Sender as BaseSender,
@@ -26,10 +25,8 @@ use mpz_ot::{
///
/// # Arguments
///
/// * `executor` - An executor for creating contexts.
pub async fn setup_ot_sender(
executor: &mut MTExecutor<MuxControl>,
) -> Result<Sender<BaseReceiver>, Anyhow> {
/// * `context` - A context for IO.
pub async fn setup_ot_sender(context: &mut impl Context) -> Result<Sender<BaseReceiver>, Anyhow> {
// Create a base OT receiver.
let base_receiver_config = BaseReceiverConfig::builder().build()?;
let base_receiver = BaseReceiver::new(base_receiver_config);
@@ -38,9 +35,7 @@ pub async fn setup_ot_sender(
let sender_config = SenderConfig::builder().build()?;
let mut sender = Sender::new(sender_config, base_receiver);
let mut context = executor.new_thread().await?;
sender.setup(&mut context).await?;
sender.setup(context).await?;
Ok(sender)
}
@@ -49,10 +44,8 @@ pub async fn setup_ot_sender(
///
/// # Arguments
///
/// * `executor` - An executor for creating contexts.
pub async fn setup_ot_receiver(
executor: &mut MTExecutor<MuxControl>,
) -> Result<Receiver<BaseSender>, Anyhow> {
/// * `context` - A context for IO.
pub async fn setup_ot_receiver(context: &mut impl Context) -> Result<Receiver<BaseSender>, Anyhow> {
// Create a base OT sender.
let base_sender_config = BaseSenderConfig::builder().build()?;
let base_sender = BaseSender::new(base_sender_config);
@@ -61,9 +54,7 @@ pub async fn setup_ot_receiver(
let receiver_config = ReceiverConfig::builder().build()?;
let mut receiver = Receiver::new(receiver_config, base_sender);
let mut context = executor.new_thread().await?;
receiver.setup(&mut context).await?;
receiver.setup(context).await?;
Ok(receiver)
}