From 6561413e5d42b0c9c4cc7c8a867b6927c1fd6942 Mon Sep 17 00:00:00 2001 From: Xiang Xie Date: Fri, 20 Oct 2023 10:37:19 +0800 Subject: [PATCH] set ideal module --- ot/mpz-ot-core/src/ferret/mod.rs | 93 ----------------------- ot/mpz-ot-core/src/ferret/spcot/mod.rs | 6 +- ot/mpz-ot-core/src/ideal/ideal_cot.rs | 101 +++++++++++++++++++++++++ ot/mpz-ot-core/src/ideal/mod.rs | 3 + ot/mpz-ot-core/src/lib.rs | 1 + 5 files changed, 107 insertions(+), 97 deletions(-) create mode 100644 ot/mpz-ot-core/src/ideal/ideal_cot.rs create mode 100644 ot/mpz-ot-core/src/ideal/mod.rs diff --git a/ot/mpz-ot-core/src/ferret/mod.rs b/ot/mpz-ot-core/src/ferret/mod.rs index 007e1cb3..5f99ed7d 100644 --- a/ot/mpz-ot-core/src/ferret/mod.rs +++ b/ot/mpz-ot-core/src/ferret/mod.rs @@ -4,96 +4,3 @@ pub mod spcot; /// Computational security parameter pub const CSP: usize = 128; - -pub mod ideal_cot { - //! Ideal functionality of COT. - use mpz_core::{prg::Prg, Block}; - use serde::{Deserialize, Serialize}; - - #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] - /// The message that sender receives from the COT functionality. - pub struct CotMsgForSender { - /// The random blocks that sender receives from the COT functionality. - pub qs: Vec, - } - - #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] - /// The message that receiver receives from the COT functionality. - pub struct CotMsgForReceiver { - /// The random bits that receiver receives from the COT functionality. - pub rs: Vec, - /// The chosen blocks that receiver receivers from the COT functionality. - pub ts: Vec, - } - #[allow(missing_docs)] - pub struct IdealCOT { - pub delta: Block, - pub counter: usize, - pub prg: Prg, - } - - impl IdealCOT { - /// Initiate the functionality - pub fn init() -> Self { - let mut prg = Prg::new(); - let delta = prg.random_block(); - IdealCOT { - delta, - counter: 0, - prg, - } - } - - /// Performs the extension with random choice bits. - /// - /// # Argument - /// - /// * `counter` - The number of COT to extend. - pub fn extend(&mut self, counter: usize) -> (CotMsgForSender, CotMsgForReceiver) { - let mut qs = vec![Block::ZERO; counter]; - let mut rs = vec![false; counter]; - - self.prg.random_blocks(&mut qs); - self.prg.random_bools(&mut rs); - - let ts: Vec = qs - .iter() - .zip(rs.iter()) - .map(|(&q, &r)| if r { q ^ self.delta } else { q }) - .collect(); - - self.counter += counter; - (CotMsgForSender { qs }, CotMsgForReceiver { rs, ts }) - } - - /// Perform the checks. - /// - /// # Arguments - /// - /// `sender_msg` - The message that the ideal COT sends to the sender. - /// `receiver_msg` - The message that the ideal COT sends to the receiver. - pub fn check(self, sender_msg: CotMsgForSender, receiver_msg: CotMsgForReceiver) -> bool { - let CotMsgForSender { qs } = sender_msg; - let CotMsgForReceiver { rs, ts } = receiver_msg; - - qs.into_iter().zip(ts).zip(rs).all( - |((q, t), r)| { - if !r { - q == t - } else { - q == t ^ self.delta - } - }, - ) - } - } - - #[test] - fn ideal_cot_test() { - let num = 100; - let mut ideal_cot = IdealCOT::init(); - let (sender, receiver) = ideal_cot.extend(num); - - assert!(ideal_cot.check(sender, receiver)); - } -} diff --git a/ot/mpz-ot-core/src/ferret/spcot/mod.rs b/ot/mpz-ot-core/src/ferret/spcot/mod.rs index d48ef331..a89bb592 100644 --- a/ot/mpz-ot-core/src/ferret/spcot/mod.rs +++ b/ot/mpz-ot-core/src/ferret/spcot/mod.rs @@ -10,10 +10,8 @@ mod tests { use mpz_core::prg::Prg; use super::{receiver::Receiver as SpcotReceiver, sender::Sender as SpcotSender}; - use crate::ferret::{ - ideal_cot::{CotMsgForReceiver, CotMsgForSender, IdealCOT}, - CSP, - }; + use crate::ferret::CSP; + use crate::ideal::ideal_cot::{CotMsgForReceiver, CotMsgForSender, IdealCOT}; #[test] fn spcot_test() { diff --git a/ot/mpz-ot-core/src/ideal/ideal_cot.rs b/ot/mpz-ot-core/src/ideal/ideal_cot.rs new file mode 100644 index 00000000..fd6d1f22 --- /dev/null +++ b/ot/mpz-ot-core/src/ideal/ideal_cot.rs @@ -0,0 +1,101 @@ +//! Define ideal functionality of COT with random choise bit. + +use mpz_core::{prg::Prg, Block}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +/// The message that sender receives from the COT functionality. +pub struct CotMsgForSender { + /// The random blocks that sender receives from the COT functionality. + pub qs: Vec, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +/// The message that receiver receives from the COT functionality. +pub struct CotMsgForReceiver { + /// The random bits that receiver receives from the COT functionality. + pub rs: Vec, + /// The chosen blocks that receiver receivers from the COT functionality. + pub ts: Vec, +} +#[allow(missing_docs)] +pub struct IdealCOT { + pub delta: Block, + pub counter: usize, + pub prg: Prg, +} + +impl IdealCOT { + /// Initiate the functionality + pub fn init() -> Self { + let mut prg = Prg::new(); + let delta = prg.random_block(); + IdealCOT { + delta, + counter: 0, + prg, + } + } + + /// Initiate with a given delta + pub fn init_with_delta(delta: Block) -> Self { + let prg = Prg::new(); + IdealCOT { + delta, + counter: 0, + prg, + } + } + + /// Performs the extension with random choice bits. + /// + /// # Argument + /// + /// * `counter` - The number of COT to extend. + pub fn extend(&mut self, counter: usize) -> (CotMsgForSender, CotMsgForReceiver) { + let mut qs = vec![Block::ZERO; counter]; + let mut rs = vec![false; counter]; + + self.prg.random_blocks(&mut qs); + self.prg.random_bools(&mut rs); + + let ts: Vec = qs + .iter() + .zip(rs.iter()) + .map(|(&q, &r)| if r { q ^ self.delta } else { q }) + .collect(); + + self.counter += counter; + (CotMsgForSender { qs }, CotMsgForReceiver { rs, ts }) + } + + /// Perform the checks. + /// + /// # Arguments + /// + /// `sender_msg` - The message that the ideal COT sends to the sender. + /// `receiver_msg` - The message that the ideal COT sends to the receiver. + pub fn check(self, sender_msg: CotMsgForSender, receiver_msg: CotMsgForReceiver) -> bool { + let CotMsgForSender { qs } = sender_msg; + let CotMsgForReceiver { rs, ts } = receiver_msg; + + qs.into_iter().zip(ts).zip(rs).all( + |((q, t), r)| { + if !r { + q == t + } else { + q == t ^ self.delta + } + }, + ) + } +} + +#[test] +fn ideal_cot_test() { + let num = 100; + let mut ideal_cot = IdealCOT::init(); + let (sender, receiver) = ideal_cot.extend(num); + + assert!(ideal_cot.check(sender, receiver)); +} diff --git a/ot/mpz-ot-core/src/ideal/mod.rs b/ot/mpz-ot-core/src/ideal/mod.rs new file mode 100644 index 00000000..344075b6 --- /dev/null +++ b/ot/mpz-ot-core/src/ideal/mod.rs @@ -0,0 +1,3 @@ +//! Define ideal functionalities of OT. + +pub mod ideal_cot; diff --git a/ot/mpz-ot-core/src/lib.rs b/ot/mpz-ot-core/src/lib.rs index a1fca89f..aebad59c 100644 --- a/ot/mpz-ot-core/src/lib.rs +++ b/ot/mpz-ot-core/src/lib.rs @@ -16,5 +16,6 @@ pub mod chou_orlandi; pub mod ferret; +pub mod ideal; pub mod kos; pub mod msgs;