| 
					
				 | 
			
			
				@@ -942,30 +942,66 @@ mod tests { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     use ff::Field; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     use utils::field::Fp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    #[test] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    fn test_doprf() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let output_bitsize = 42; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let mut party_1 = DOPrfParty1::<Fp>::new(output_bitsize); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let mut party_2 = DOPrfParty2::<Fp>::new(output_bitsize); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let mut party_3 = DOPrfParty3::<Fp>::new(output_bitsize); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fn doprf_init( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        party_1: &mut DOPrfParty1<Fp>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        party_2: &mut DOPrfParty2<Fp>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        party_3: &mut DOPrfParty3<Fp>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let (msg_1_2, msg_1_3) = party_1.init_round_0(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let (msg_2_1, msg_2_3) = party_2.init_round_0(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let (msg_3_1, msg_3_2) = party_3.init_round_0(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         party_1.init_round_1(msg_2_1, msg_3_1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         party_2.init_round_1(msg_1_2, msg_3_2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         party_3.init_round_1(msg_1_3, msg_2_3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // preprocess num invocations 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let num = 20; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fn doprf_preprocess( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        party_1: &mut DOPrfParty1<Fp>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        party_2: &mut DOPrfParty2<Fp>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        party_3: &mut DOPrfParty3<Fp>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        num: usize, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let (msg_1_2, msg_1_3) = party_1.preprocess_round_0(num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let (msg_2_1, msg_2_3) = party_2.preprocess_round_0(num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let (msg_3_1, msg_3_2) = party_3.preprocess_round_0(num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         party_1.preprocess_round_1(num, msg_2_1, msg_3_1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         party_2.preprocess_round_1(num, msg_1_2, msg_3_2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         party_3.preprocess_round_1(num, msg_1_3, msg_2_3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fn doprf_eval( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        party_1: &mut DOPrfParty1<Fp>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        party_2: &mut DOPrfParty2<Fp>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        party_3: &mut DOPrfParty3<Fp>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        shares_1: &[Fp], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        shares_2: &[Fp], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        shares_3: &[Fp], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        num: usize, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ) -> Vec<BitVec> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert_eq!(shares_1.len(), num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert_eq!(shares_2.len(), num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert_eq!(shares_3.len(), num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let (msg_2_1, msg_2_3) = party_2.eval_round_0(num, &shares_2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let (msg_3_1, _) = party_3.eval_round_0(num, &shares_3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let (_, msg_1_3) = party_1.eval_round_1(num, &shares_1, &msg_2_1, &msg_3_1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let output = party_3.eval_round_2(num, &shares_3, msg_1_3, msg_2_3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        output 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    #[test] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fn test_doprf() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let output_bitsize = 42; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let mut party_1 = DOPrfParty1::<Fp>::new(output_bitsize); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let mut party_2 = DOPrfParty2::<Fp>::new(output_bitsize); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let mut party_3 = DOPrfParty3::<Fp>::new(output_bitsize); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        doprf_init(&mut party_1, &mut party_2, &mut party_3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // preprocess num invocations 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let num = 20; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        doprf_preprocess(&mut party_1, &mut party_2, &mut party_3, num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         assert_eq!(party_1.get_num_preprocessed_invocations(), num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         assert_eq!(party_2.get_num_preprocessed_invocations(), num); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -976,12 +1012,7 @@ mod tests { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         party_3.check_preprocessing(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // preprocess another n invocations 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let (msg_1_2, msg_1_3) = party_1.preprocess_round_0(num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let (msg_2_1, msg_2_3) = party_2.preprocess_round_0(num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let (msg_3_1, msg_3_2) = party_3.preprocess_round_0(num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        party_1.preprocess_round_1(num, msg_2_1, msg_3_1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        party_2.preprocess_round_1(num, msg_1_2, msg_3_2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        party_3.preprocess_round_1(num, msg_1_3, msg_2_3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        doprf_preprocess(&mut party_1, &mut party_2, &mut party_3, num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let num = 2 * num; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1013,9 +1044,6 @@ mod tests { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .map(|(&s, &d)| s - d) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .collect(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             assert_eq!(mult_d.len(), n); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // assert!( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //     izip!(squares.iter(), mt_a.iter(), mult_d.iter()).all(|(&s, &a, &d)| d == s - a) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             assert_eq!(mt_a.len(), n); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             assert_eq!(mt_b.len(), num); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1038,10 +1066,15 @@ mod tests { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let shares_2: Vec<Fp> = (0..num).map(|_| Fp::random(thread_rng())).collect(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let shares_3: Vec<Fp> = (0..num).map(|_| Fp::random(thread_rng())).collect(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let (msg_2_1, msg_2_3) = party_2.eval_round_0(num, &shares_2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let (msg_3_1, _) = party_3.eval_round_0(num, &shares_3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let (_, msg_1_3) = party_1.eval_round_1(num, &shares_1, &msg_2_1, &msg_3_1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let output = party_3.eval_round_2(num, &shares_3, msg_1_3, msg_2_3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let output = doprf_eval( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &mut party_1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &mut party_2, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &mut party_3, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &shares_1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &shares_2, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &shares_3, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            num, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         assert_eq!(party_1.get_num_preprocessed_invocations(), 25); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         assert_eq!(party_2.get_num_preprocessed_invocations(), 25); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1062,30 +1095,68 @@ mod tests { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    #[test] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    fn test_masked_doprf() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let output_bitsize = 42; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let mut party_1 = MaskedDOPrfParty1::<Fp>::new(output_bitsize); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let mut party_2 = MaskedDOPrfParty2::<Fp>::new(output_bitsize); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let mut party_3 = MaskedDOPrfParty3::<Fp>::new(output_bitsize); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fn mdoprf_init( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        party_1: &mut MaskedDOPrfParty1<Fp>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        party_2: &mut MaskedDOPrfParty2<Fp>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        party_3: &mut MaskedDOPrfParty3<Fp>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let (msg_1_2, msg_1_3) = party_1.init_round_0(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let (msg_2_1, msg_2_3) = party_2.init_round_0(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let (msg_3_1, msg_3_2) = party_3.init_round_0(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         party_1.init_round_1(msg_2_1, msg_3_1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         party_2.init_round_1(msg_1_2, msg_3_2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         party_3.init_round_1(msg_1_3, msg_2_3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // preprocess num invocations 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let num = 20; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fn mdoprf_preprocess( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        party_1: &mut MaskedDOPrfParty1<Fp>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        party_2: &mut MaskedDOPrfParty2<Fp>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        party_3: &mut MaskedDOPrfParty3<Fp>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        num: usize, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let (msg_1_2, msg_1_3) = party_1.preprocess_round_0(num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let (msg_2_1, msg_2_3) = party_2.preprocess_round_0(num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let (msg_3_1, msg_3_2) = party_3.preprocess_round_0(num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         party_1.preprocess_round_1(num, msg_2_1, msg_3_1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         party_2.preprocess_round_1(num, msg_1_2, msg_3_2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         party_3.preprocess_round_1(num, msg_1_3, msg_2_3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fn mdoprf_eval( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        party_1: &mut MaskedDOPrfParty1<Fp>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        party_2: &mut MaskedDOPrfParty2<Fp>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        party_3: &mut MaskedDOPrfParty3<Fp>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        shares_1: &[Fp], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        shares_2: &[Fp], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        shares_3: &[Fp], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        num: usize, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ) -> (Vec<BitVec>, Vec<BitVec>, Vec<BitVec>) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert_eq!(shares_1.len(), num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert_eq!(shares_2.len(), num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert_eq!(shares_3.len(), num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let (_, msg_1_3) = party_1.eval_round_0(num, &shares_1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let (_, msg_2_3) = party_2.eval_round_0(num, &shares_2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let (msg_3_1, _) = party_3.eval_round_1(num, &shares_3, &msg_1_3, &msg_2_3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let masked_output = party_1.eval_round_2(num, &shares_1, (), msg_3_1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let mask2 = party_2.eval_get_output(num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let mask3 = party_3.eval_get_output(num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        (masked_output, mask2, mask3) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    #[test] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fn test_masked_doprf() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let output_bitsize = 42; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let mut party_1 = MaskedDOPrfParty1::<Fp>::new(output_bitsize); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let mut party_2 = MaskedDOPrfParty2::<Fp>::new(output_bitsize); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let mut party_3 = MaskedDOPrfParty3::<Fp>::new(output_bitsize); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        mdoprf_init(&mut party_1, &mut party_2, &mut party_3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // preprocess num invocations 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let num = 20; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        mdoprf_preprocess(&mut party_1, &mut party_2, &mut party_3, num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         assert_eq!(party_1.get_num_preprocessed_invocations(), num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         assert_eq!(party_2.get_num_preprocessed_invocations(), num); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1096,12 +1167,7 @@ mod tests { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         party_3.check_preprocessing(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // preprocess another n invocations 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let (msg_1_2, msg_1_3) = party_1.preprocess_round_0(num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let (msg_2_1, msg_2_3) = party_2.preprocess_round_0(num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let (msg_3_1, msg_3_2) = party_3.preprocess_round_0(num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        party_1.preprocess_round_1(num, msg_2_1, msg_3_1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        party_2.preprocess_round_1(num, msg_1_2, msg_3_2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        party_3.preprocess_round_1(num, msg_1_3, msg_2_3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        mdoprf_preprocess(&mut party_1, &mut party_2, &mut party_3, num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let num = 2 * num; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1153,13 +1219,15 @@ mod tests { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let shares_1: Vec<Fp> = (0..num).map(|_| Fp::random(thread_rng())).collect(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let shares_2: Vec<Fp> = (0..num).map(|_| Fp::random(thread_rng())).collect(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let shares_3: Vec<Fp> = (0..num).map(|_| Fp::random(thread_rng())).collect(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let (_, msg_1_3) = party_1.eval_round_0(num, &shares_1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let (_, msg_2_3) = party_2.eval_round_0(num, &shares_2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let (msg_3_1, _) = party_3.eval_round_1(num, &shares_3, &msg_1_3, &msg_2_3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let masked_output = party_1.eval_round_2(num, &shares_1, (), msg_3_1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let mask2 = party_2.eval_get_output(num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let mask3 = party_3.eval_get_output(num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let (masked_output, mask2, mask3) = mdoprf_eval( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &mut party_1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &mut party_2, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &mut party_3, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &shares_1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &shares_2, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &shares_3, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            num, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         assert_eq!(party_1.get_num_preprocessed_invocations(), 25); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         assert_eq!(party_2.get_num_preprocessed_invocations(), 25); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1182,5 +1250,102 @@ mod tests { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             let output_i = masked_output[i].clone() ^ &mask2[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             assert_eq!(output_i, expected_output_i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // preprocess another n invocations 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        mdoprf_preprocess(&mut party_1, &mut party_2, &mut party_3, num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // perform another n evaluations on the same inputs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let num = 15; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let (new_masked_output, new_mask2, new_mask3) = mdoprf_eval( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &mut party_1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &mut party_2, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &mut party_3, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &shares_1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &shares_2, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &shares_3, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            num, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert_eq!(party_1.get_num_preprocessed_invocations(), 25); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert_eq!(party_2.get_num_preprocessed_invocations(), 25); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert_eq!(party_3.get_num_preprocessed_invocations(), 25); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        party_1.check_preprocessing(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        party_2.check_preprocessing(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        party_3.check_preprocessing(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert_eq!(new_masked_output.len(), num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert!(new_masked_output 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .iter() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .all(|bv| bv.len() == output_bitsize)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert_eq!(new_mask2.len(), num); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert_eq!(new_mask2, new_mask3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert!(new_mask2.iter().all(|bv| bv.len() == output_bitsize)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // check that the new output matches the previous one 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for i in 0..num { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            let expected_output_i = masked_output[i].clone() ^ &mask2[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            let output_i = new_masked_output[i].clone() ^ &new_mask2[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            assert_eq!(output_i, expected_output_i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    #[test] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fn test_masked_doprf_single() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let output_bitsize = 42; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let mut party_1 = MaskedDOPrfParty1::<Fp>::new(output_bitsize); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let mut party_2 = MaskedDOPrfParty2::<Fp>::new(output_bitsize); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let mut party_3 = MaskedDOPrfParty3::<Fp>::new(output_bitsize); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        mdoprf_init(&mut party_1, &mut party_2, &mut party_3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let share_1 = Fp::random(thread_rng()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let share_2 = Fp::random(thread_rng()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let share_3 = Fp::random(thread_rng()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        mdoprf_preprocess(&mut party_1, &mut party_2, &mut party_3, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let (masked_output_1, mask2_1, mask3_1) = mdoprf_eval( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &mut party_1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &mut party_2, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &mut party_3, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &[share_1], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &[share_2], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &[share_3], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        mdoprf_preprocess(&mut party_1, &mut party_2, &mut party_3, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let (masked_output_2, mask2_2, mask3_2) = mdoprf_eval( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &mut party_1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &mut party_2, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &mut party_3, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &[share_1], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &[share_2], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &[share_3], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        mdoprf_preprocess(&mut party_1, &mut party_2, &mut party_3, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let (masked_output_3, mask2_3, mask3_3) = mdoprf_eval( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &mut party_1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &mut party_2, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &mut party_3, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &[share_1], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &[share_2], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            &[share_3], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert_eq!(mask2_1, mask3_1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert_eq!(mask2_2, mask3_2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert_eq!(mask2_3, mask3_3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let plain_output = masked_output_1[0].clone() ^ mask2_1[0].clone(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert_eq!( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            masked_output_2[0].clone() ^ mask2_2[0].clone(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            plain_output 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert_eq!( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            masked_output_3[0].clone() ^ mask2_3[0].clone(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            plain_output 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |