From 3aab1ac1fafeae3b363f33a8b03e2a058b0f38ac Mon Sep 17 00:00:00 2001 From: Marcin Benke Date: Mon, 9 Sep 2019 12:33:23 +0200 Subject: [PATCH 01/10] Sub+SubAssign+Neg for Enc --- src/enc.rs | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/enc.rs b/src/enc.rs index f186b5f..df30e91 100644 --- a/src/enc.rs +++ b/src/enc.rs @@ -6,7 +6,7 @@ use num_traits::Zero; use rand::prelude::*; use serde::{Deserialize, Serialize}; use std::fmt; -use std::ops::{Add, AddAssign, Mul, MulAssign}; +use std::ops::{Add, AddAssign, Mul, MulAssign, Sub, SubAssign, Neg}; /// Wrapper type for lifting `u32` type to FHE compatible /// form @@ -77,6 +77,35 @@ impl MulAssign for Enc { } } +impl Sub for Enc { + type Output = Self; + + #[inline] + fn sub(self, rhs: Self) -> Self::Output { + Self { + inner: self.inner - rhs.inner, + } + } +} + +impl SubAssign for Enc { + #[inline] + fn sub_assign(&mut self, rhs: Self) { + *self = *self - rhs + } +} + +impl Neg for Enc { + type Output = Self; + + #[inline] + fn neg(self) -> Self::Output { + Self { + inner: self.inner.neg(), + } + } +} + /// Type representing a key pair which can be used for encrypting /// and decrypting data #[derive(Debug, Serialize, Deserialize)] From cc81096e695b8490d0d8ac7863ac0fba8de56744 Mon Sep 17 00:00:00 2001 From: Marcin Benke Date: Mon, 9 Sep 2019 13:03:27 +0200 Subject: [PATCH 02/10] Mod231::From/Into --- src/algebra/m231.rs | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/algebra/m231.rs b/src/algebra/m231.rs index af93d47..856fa1c 100644 --- a/src/algebra/m231.rs +++ b/src/algebra/m231.rs @@ -106,6 +106,46 @@ impl From for Mod231 { } } +impl From for Mod231 { + fn from(x: i32) -> Self { + let max = MODULUS / 2; + let y: u32 = if x < 0 { + let y = (x + MODULUSI32); + if y < 0 { + panic!("i32 out of range for Mod231") + } + else { + y as u32 + } + } + else { + if x < MODULUSI32 { + x as u32 + } + else { + panic!("i32 out of range for Mod231") + } + }; + + Mod231(normalize(y)) + } +} + +impl Into for Mod231 { + fn into(self) -> i32 { + let y: u32 = self.0; + let max = MODULUS / 2; + + if y > max { + ((y - max) as i32).neg() + } + else { + y as i32 + } + } +} + + impl Add for Mod231 { type Output = Self; From 14ff40edbfbc480966321e449a87415685dbb36c Mon Sep 17 00:00:00 2001 From: Marcin Benke Date: Thu, 19 Sep 2019 07:47:50 +0200 Subject: [PATCH 03/10] cargo fmt --- src/algebra/m231.rs | 19 +++++++------------ src/enc.rs | 2 +- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/algebra/m231.rs b/src/algebra/m231.rs index 856fa1c..8b339ed 100644 --- a/src/algebra/m231.rs +++ b/src/algebra/m231.rs @@ -113,17 +113,14 @@ impl From for Mod231 { let y = (x + MODULUSI32); if y < 0 { panic!("i32 out of range for Mod231") - } - else { + } else { y as u32 } - } - else { + } else { if x < MODULUSI32 { x as u32 - } - else { - panic!("i32 out of range for Mod231") + } else { + panic!("i32 out of range for Mod231") } }; @@ -136,16 +133,14 @@ impl Into for Mod231 { let y: u32 = self.0; let max = MODULUS / 2; - if y > max { + if y > max { ((y - max) as i32).neg() - } - else { - y as i32 + } else { + y as i32 } } } - impl Add for Mod231 { type Output = Self; diff --git a/src/enc.rs b/src/enc.rs index df30e91..3b0d87b 100644 --- a/src/enc.rs +++ b/src/enc.rs @@ -6,7 +6,7 @@ use num_traits::Zero; use rand::prelude::*; use serde::{Deserialize, Serialize}; use std::fmt; -use std::ops::{Add, AddAssign, Mul, MulAssign, Sub, SubAssign, Neg}; +use std::ops::{Add, AddAssign, Mul, MulAssign, Neg, Sub, SubAssign}; /// Wrapper type for lifting `u32` type to FHE compatible /// form From b5297f419cad2118dba8be88f4083b080202473f Mon Sep 17 00:00:00 2001 From: Marcin Benke Date: Thu, 19 Sep 2019 07:58:03 +0200 Subject: [PATCH 04/10] enc_i32/dec_i32 --- src/enc.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/enc.rs b/src/enc.rs index 3b0d87b..d0ec09b 100644 --- a/src/enc.rs +++ b/src/enc.rs @@ -32,6 +32,20 @@ impl Enc { let dec = key_pair.backwards * self.inner * key_pair.forwards; dec[0].w.0 } + + #[inline] + fn enc_i32(key_pair: &KeyPair, value: i32) -> Self { + let enc: Matrix3<_> = Q231::from(Mod231::from(value)).into(); + let inner = key_pair.forwards * enc * key_pair.backwards; + + Self { inner } + } + + #[inline] + fn dec_i32(&self, key_pair: &KeyPair) -> i32 { + let dec = key_pair.backwards * self.inner * key_pair.forwards; + Mod231::into(dec[0].w) + } } impl fmt::Display for Enc { From 36e6aa3c2a49a1fa1950028eea8bba610da7b0e6 Mon Sep 17 00:00:00 2001 From: Marcin Benke Date: Thu, 19 Sep 2019 08:02:25 +0200 Subject: [PATCH 05/10] clean up --- src/algebra/m231.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/algebra/m231.rs b/src/algebra/m231.rs index 8b339ed..a5a61d4 100644 --- a/src/algebra/m231.rs +++ b/src/algebra/m231.rs @@ -108,9 +108,8 @@ impl From for Mod231 { impl From for Mod231 { fn from(x: i32) -> Self { - let max = MODULUS / 2; let y: u32 = if x < 0 { - let y = (x + MODULUSI32); + let y = x + MODULUSI32; if y < 0 { panic!("i32 out of range for Mod231") } else { From bf049a663db89b1ba4cfc85711e3f6c2039aa1ab Mon Sep 17 00:00:00 2001 From: Marcin Benke Date: Thu, 19 Sep 2019 09:16:50 +0200 Subject: [PATCH 06/10] test prop_roundtrip_i32 --- src/algebra/m231.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/algebra/m231.rs b/src/algebra/m231.rs index a5a61d4..5ceed1c 100644 --- a/src/algebra/m231.rs +++ b/src/algebra/m231.rs @@ -133,7 +133,7 @@ impl Into for Mod231 { let max = MODULUS / 2; if y > max { - ((y - max) as i32).neg() + (y as i32) - MODULUSI32 } else { y as i32 } @@ -318,4 +318,11 @@ mod tests { } } } + + #[quickcheck] + fn prop_roundtrip_i32(x: Mod231) -> bool { + let y: i32 = x.into(); + let z: Mod231 = Mod231::from(y); + x == z + } } From a4147aec3364f71c64748c96bbfb3e001414f3ce Mon Sep 17 00:00:00 2001 From: Marcin Benke Date: Mon, 23 Sep 2019 15:28:07 +0200 Subject: [PATCH 07/10] TryFrom instead of From for Mod231 --- src/algebra/m231.rs | 13 ++++++++----- src/enc.rs | 8 +++++--- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/algebra/m231.rs b/src/algebra/m231.rs index 5ceed1c..366a011 100644 --- a/src/algebra/m231.rs +++ b/src/algebra/m231.rs @@ -4,6 +4,7 @@ use num_traits::identities::{One, Zero}; use rand::distributions::{Distribution, Standard}; use rand::Rng; use serde::{Deserialize, Serialize}; +use std::convert::TryFrom; use std::fmt; use std::ops::{Add, AddAssign, Div, Mul, MulAssign, Neg, Sub, SubAssign}; @@ -106,12 +107,14 @@ impl From for Mod231 { } } -impl From for Mod231 { - fn from(x: i32) -> Self { +impl TryFrom for Mod231 { + type Error = &'static str; + + fn try_from(x: i32) -> Result { let y: u32 = if x < 0 { let y = x + MODULUSI32; if y < 0 { - panic!("i32 out of range for Mod231") + return Err("i32 out of range for Mod231"); } else { y as u32 } @@ -119,11 +122,11 @@ impl From for Mod231 { if x < MODULUSI32 { x as u32 } else { - panic!("i32 out of range for Mod231") + return Err("i32 out of range for Mod231"); } }; - Mod231(normalize(y)) + Ok(Mod231(normalize(y))) } } diff --git a/src/enc.rs b/src/enc.rs index d0ec09b..794051e 100644 --- a/src/enc.rs +++ b/src/enc.rs @@ -5,6 +5,7 @@ use nalgebra::Matrix3; use num_traits::Zero; use rand::prelude::*; use serde::{Deserialize, Serialize}; +use std::convert::TryFrom; use std::fmt; use std::ops::{Add, AddAssign, Mul, MulAssign, Neg, Sub, SubAssign}; @@ -34,11 +35,12 @@ impl Enc { } #[inline] - fn enc_i32(key_pair: &KeyPair, value: i32) -> Self { - let enc: Matrix3<_> = Q231::from(Mod231::from(value)).into(); + fn enc_i32(key_pair: &KeyPair, value: i32) -> Option { + let m = Mod231::try_from(value).ok()?; + let enc: Matrix3<_> = Q231::from(m).into(); let inner = key_pair.forwards * enc * key_pair.backwards; - Self { inner } + Some(Self { inner }) } #[inline] From 63ed78520ace6b36892cbebac6406712c467b9b9 Mon Sep 17 00:00:00 2001 From: Marcin Benke Date: Mon, 23 Sep 2019 17:16:07 +0200 Subject: [PATCH 08/10] fix test prop_roundtrip_i32 --- src/algebra/m231.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/algebra/m231.rs b/src/algebra/m231.rs index 366a011..251ef93 100644 --- a/src/algebra/m231.rs +++ b/src/algebra/m231.rs @@ -325,7 +325,7 @@ mod tests { #[quickcheck] fn prop_roundtrip_i32(x: Mod231) -> bool { let y: i32 = x.into(); - let z: Mod231 = Mod231::from(y); - x == z + let z: Result = Mod231::try_from(y); + z == Ok(x) } } From 7140c280bba5b0a0aac4bd83dbd9f45bc2a16b63 Mon Sep 17 00:00:00 2001 From: Marcin Benke Date: Tue, 24 Sep 2019 07:44:51 +0200 Subject: [PATCH 09/10] cargo fmt --- src/algebra/m231.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/algebra/m231.rs b/src/algebra/m231.rs index 251ef93..8228b81 100644 --- a/src/algebra/m231.rs +++ b/src/algebra/m231.rs @@ -325,7 +325,7 @@ mod tests { #[quickcheck] fn prop_roundtrip_i32(x: Mod231) -> bool { let y: i32 = x.into(); - let z: Result = Mod231::try_from(y); + let z: Result = Mod231::try_from(y); z == Ok(x) } } From 93397db1db625c129c7b33e2c9c7f415884c340f Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Mon, 4 Nov 2019 11:02:28 +0100 Subject: [PATCH 10/10] Returning Result in quickcheck is OK --- src/algebra/m231.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/algebra/m231.rs b/src/algebra/m231.rs index 8228b81..be9e690 100644 --- a/src/algebra/m231.rs +++ b/src/algebra/m231.rs @@ -323,9 +323,8 @@ mod tests { } #[quickcheck] - fn prop_roundtrip_i32(x: Mod231) -> bool { + fn prop_roundtrip_i32(x: Mod231) -> Result { let y: i32 = x.into(); - let z: Result = Mod231::try_from(y); - z == Ok(x) + Mod231::try_from(y).map(|z| z == x) } }