From 3e2a4f5676503ed694aa962260e8805d970b46cd Mon Sep 17 00:00:00 2001 From: jnsiemer Date: Tue, 9 Dec 2025 15:24:11 +0000 Subject: [PATCH 1/7] Bump criterion version --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index f4d1751..b00961b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ sha2 = "0.10.6" serde = {version="1.0", features=["derive"]} serde_json = "1.0" typetag = "0.2" -criterion = { version = "0.7", features = ["html_reports"] } +criterion = { version = "0.8", features = ["html_reports"] } [profile.bench] debug = true From 9472e9b7916be7724aa597106fde085360d5d8de Mon Sep 17 00:00:00 2001 From: jnsiemer Date: Tue, 9 Dec 2025 15:31:13 +0000 Subject: [PATCH 2/7] Add compression to K-PKE --- src/identity_based_encryption.rs | 2 +- src/pk_encryption.rs | 6 ++--- src/pk_encryption/k_pke.rs | 40 ++++++++++++++++++++++++-------- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/identity_based_encryption.rs b/src/identity_based_encryption.rs index 5606c3e..e174f90 100644 --- a/src/identity_based_encryption.rs +++ b/src/identity_based_encryption.rs @@ -78,5 +78,5 @@ pub trait IBEScheme { /// - `cipher`: specifies the ciphertext to be decrypted /// /// Returns the decryption of `cipher` as a [`Z`] instance. - fn dec(&self, sk: &Self::SecretKey, cipher: &Self::Cipher) -> Z; + fn dec(&self, sk: &Self::SecretKey, cipher: Self::Cipher) -> Z; } diff --git a/src/pk_encryption.rs b/src/pk_encryption.rs index bd12830..590939e 100644 --- a/src/pk_encryption.rs +++ b/src/pk_encryption.rs @@ -84,7 +84,7 @@ pub trait PKEncryptionScheme { /// - `cipher`: specifies the ciphertext to be decrypted /// /// Returns the decryption of `cipher` as a [`Z`] instance. - fn dec(&self, sk: &Self::SecretKey, cipher: &Self::Cipher) -> Z; + fn dec(&self, sk: &Self::SecretKey, cipher: Self::Cipher) -> Z; } /// This trait just exists s.t. we can pass `self` in as mutable for more advanced constructions, which use a storage. @@ -115,7 +115,7 @@ pub trait PKEncryptionSchemeMut { /// - `cipher`: specifies the ciphertext to be decrypted /// /// Returns the decryption of `cipher` as a [`Z`] instance. - fn dec(&mut self, sk: &Self::SecretKey, cipher: &Self::Cipher) -> Z; + fn dec(&mut self, sk: &Self::SecretKey, cipher: Self::Cipher) -> Z; } /// This trait generically implements multi-bit encryption @@ -157,7 +157,7 @@ pub trait GenericMultiBitEncryption: PKEncryptionScheme { /// to be decrypted /// /// Returns the decryption of `cipher` as a [`Z`] instance. - fn dec_multiple_bits(&self, sk: &Self::SecretKey, cipher: &[Self::Cipher]) -> Z { + fn dec_multiple_bits(&self, sk: &Self::SecretKey, cipher: Vec) -> Z { let mut bits = vec![]; for item in cipher { diff --git a/src/pk_encryption/k_pke.rs b/src/pk_encryption/k_pke.rs index 3b99d03..001e5bb 100644 --- a/src/pk_encryption/k_pke.rs +++ b/src/pk_encryption/k_pke.rs @@ -10,7 +10,7 @@ //! used as foundation for ML-KEM. //! //! **WARNING:** This implementation is a toy implementation of the basics below -//! ML-KEM and mostly supposed to showcase the prototyping capabilities of the `qfall`-library. +//! ML-KEM and mostly supposed to showcase the prototyping capabilities of the `qFALL`-library. use crate::pk_encryption::PKEncryptionScheme; use qfall_math::{ @@ -22,6 +22,7 @@ use qfall_tools::utils::{ decode_z_bitwise_from_polynomialringzq, encode_z_bitwise_in_polynomialringzq, }, common_moduli::new_anticyclic, + lossy_compression::LossyCompression, }; use serde::{Deserialize, Serialize}; @@ -29,9 +30,8 @@ use serde::{Deserialize, Serialize}; /// as a basis for ML-KEM. /// /// This implementation is not supposed to be an implementation of the FIPS 203 standard in [\[6\]](), but -/// is supposed to showcase the prototyping capabilities of `qfall` and does not cover compression algorithms -/// as specified in the FIPS 203 document or might deviate for the choice of matrix multiplication algorithms. -/// Especially, NTT-representation, sampling and multiplication are not part of this prototype. +/// is supposed to showcase the prototyping capabilities of `qFALL` and does not cover byte decomposition algorithms +/// as specified in the FIPS 203 document or NTT-multiplication. /// /// Attributes: /// - `q`: defines the modulus polynomial `(X^n + 1) mod p` @@ -64,6 +64,8 @@ pub struct KPKE { k: i64, // defines both dimensions of matrix A eta_1: i64, // defines the binomial distribution of the secret and error drawn in `gen` eta_2: i64, // defines the binomial distribution of the error drawn in `enc` + d_u: i64, // defines the number of kept upper-order bits per entry of vector `u` + d_v: i64, // defines the number of kept upper-order bits per entry of `v` } impl KPKE { @@ -75,6 +77,8 @@ impl KPKE { k: 2, eta_1: 3, eta_2: 2, + d_u: 10, + d_v: 4, } } @@ -86,6 +90,8 @@ impl KPKE { k: 3, eta_1: 2, eta_2: 2, + d_u: 10, + d_v: 4, } } @@ -97,6 +103,8 @@ impl KPKE { k: 4, eta_1: 2, eta_2: 2, + d_u: 11, + d_v: 5, } } } @@ -160,6 +168,7 @@ impl PKEncryptionScheme for KPKE { /// - e_2 <- Bin(eta_2, 0.5) centered around 0 /// - u = A^T * y + e_1 /// - v = t^T * y + e_2 + 𝜇, where 𝜇 is the {q/2, 0} encoding of the bits of `message` + /// - Compress u and v /// /// Then, ciphertext `(u, v)` is returned. /// @@ -208,18 +217,24 @@ impl PKEncryptionScheme for KPKE { .unwrap(); // 19 𝐮 ← NTT^−1(𝐀^⊺ ∘ 𝐲) + 𝐞_𝟏 - let vec_u = &pk.0 * &vec_y + vec_e_1; + let mut vec_u = &pk.0 * &vec_y + vec_e_1; // 20 𝜇 ← Decompress_1(ByteDecode_1(𝑚)) let mu = encode_z_bitwise_in_polynomialringzq(&self.q, &message.into()); // 21 𝑣 ← NTT^−1(𝐭^⊺ ∘ 𝐲) + 𝑒_2 + 𝜇 - let v = pk.1.dot_product(&vec_y).unwrap() + e_2 + mu; + let mut v = pk.1.dot_product(&vec_y).unwrap() + e_2 + mu; + + // 22: 𝑐_1 ← ByteEncode_{𝑑_𝑢}(Compress_{𝑑_𝑢}(𝐮)) + vec_u.compress(self.d_u); + // 23: 𝑐_2 ← ByteEncode_{𝑑_𝑣}(Compress_{𝑑_𝑣}(𝑣)) + v.compress(self.d_v); (vec_u, v) } /// Decrypts the provided `cipher` using the secret key `sk` by following these steps: + /// - Decompress u and v /// - w = v - s^T * u /// - returns the decoding of `w` with 1 and 0 set in the returned [`Z`] instance /// if the corresponding coefficient was closer to q/2 or 0 respectively @@ -241,9 +256,14 @@ impl PKEncryptionScheme for KPKE { /// /// assert_eq!(1, m); /// ``` - fn dec(&self, sk: &Self::SecretKey, (u, v): &Self::Cipher) -> Z { - // 6 𝑤 ← 𝑣 − NTT^−1(𝐬^⊺ ∘ NTT(𝐮)) - let w = v - sk.dot_product(u).unwrap(); + fn dec(&self, sk: &Self::SecretKey, (mut u, mut v): Self::Cipher) -> Z { + // 3: 𝐮′ ← Decompress_{𝑑_𝑢}(ByteDecode_{𝑑_𝑢}(𝑐_1)) + u.decompress(self.d_u); + // 4: 𝑣′ ← Decompress_{𝑑_𝑣}(ByteDecode_{𝑑_𝑣}(𝑐_2)) + v.decompress(self.d_v); + + // 6 𝑤 ← 𝑣′ − NTT^−1(𝐬^⊺ ∘ NTT(𝐮′)) + let w = v - sk.dot_product(&u).unwrap(); // 7 𝑚 ← ByteEncode_1(Compress_1(𝑤)) decode_z_bitwise_from_polynomialringzq(self.q.get_q(), &w) @@ -265,7 +285,7 @@ mod test_kpke { for message in messages { let (pk, sk) = k_pke.gen(); let c = k_pke.enc(&pk, message); - let m = k_pke.dec(&sk, &c); + let m = k_pke.dec(&sk, c); assert_eq!(message, m); } From de7f320fefc69d6788b3de311e7ae0c7195462ce Mon Sep 17 00:00:00 2001 From: jnsiemer Date: Tue, 9 Dec 2025 15:32:07 +0000 Subject: [PATCH 3/7] Require ciphertext to be owned by dec --- benches/k_pke.rs | 26 ++++++++++++++++--- benches/regev.rs | 2 +- .../dual_regev_ibe.rs | 12 ++++----- src/pk_encryption/ccs_from_ibe.rs | 4 +-- .../ccs_from_ibe/dual_regev_ibe_pfdh.rs | 4 +-- src/pk_encryption/dual_regev.rs | 18 ++++++------- .../dual_regev_discrete_gauss.rs | 18 ++++++------- src/pk_encryption/lpr.rs | 20 +++++++------- src/pk_encryption/regev.rs | 20 +++++++------- src/pk_encryption/regev_discrete_gauss.rs | 18 ++++++------- src/pk_encryption/ring_lpr.rs | 8 +++--- 11 files changed, 84 insertions(+), 66 deletions(-) diff --git a/benches/k_pke.rs b/benches/k_pke.rs index 55c895e..ea6dbc7 100644 --- a/benches/k_pke.rs +++ b/benches/k_pke.rs @@ -14,7 +14,7 @@ use qfall_schemes::pk_encryption::KPKE; fn kpke_cycle(k_pke: &KPKE) { let (pk, sk) = k_pke.gen(); let cipher = k_pke.enc(&pk, 1); - let _ = k_pke.dec(&sk, &cipher); + let _ = k_pke.dec(&sk, cipher); } /// Benchmark [kpke_cycle] with [KPKE::ml_kem_512]. @@ -51,7 +51,13 @@ fn bench_kpke_dec_512(c: &mut Criterion) { let (pk, sk) = k_pke.gen(); let cipher = k_pke.enc(&pk, i64::MAX); - c.bench_function("K-PKE dec 512", |b| b.iter(|| k_pke.dec(&sk, &cipher))); + c.bench_function("K-PKE dec 512", |b| { + b.iter_batched( + || cipher.clone(), + |cipher| k_pke.dec(&sk, cipher), + criterion::BatchSize::SmallInput, + ) + }); } /// Benchmark [kpke_cycle] with [KPKE::ml_kem_768]. @@ -88,7 +94,13 @@ fn bench_kpke_dec_768(c: &mut Criterion) { let (pk, sk) = k_pke.gen(); let cipher = k_pke.enc(&pk, i64::MAX); - c.bench_function("K-PKE dec 768", |b| b.iter(|| k_pke.dec(&sk, &cipher))); + c.bench_function("K-PKE dec 768", |b| { + b.iter_batched( + || cipher.clone(), + |cipher| k_pke.dec(&sk, cipher), + criterion::BatchSize::SmallInput, + ) + }); } /// Benchmark [kpke_cycle] with [KPKE::ml_kem_1024]. @@ -125,7 +137,13 @@ fn bench_kpke_dec_1024(c: &mut Criterion) { let (pk, sk) = k_pke.gen(); let cipher = k_pke.enc(&pk, i64::MAX); - c.bench_function("K-PKE dec 1024", |b| b.iter(|| k_pke.dec(&sk, &cipher))); + c.bench_function("K-PKE dec 1024", |b| { + b.iter_batched( + || cipher.clone(), + |cipher| k_pke.dec(&sk, cipher), + criterion::BatchSize::SmallInput, + ) + }); } criterion_group!( diff --git a/benches/regev.rs b/benches/regev.rs index 10635a4..d6e75f9 100644 --- a/benches/regev.rs +++ b/benches/regev.rs @@ -18,7 +18,7 @@ fn regev_cycle(n: i64) { let (pk, sk) = regev.gen(); let cipher = regev.enc(&pk, &msg); - let _ = regev.dec(&sk, &cipher); + let _ = regev.dec(&sk, cipher); } /// Benchmark [regev_cycle] with `n = 50`. diff --git a/src/identity_based_encryption/dual_regev_ibe.rs b/src/identity_based_encryption/dual_regev_ibe.rs index 78cf26e..7698965 100644 --- a/src/identity_based_encryption/dual_regev_ibe.rs +++ b/src/identity_based_encryption/dual_regev_ibe.rs @@ -419,7 +419,7 @@ impl IBEScheme for DualRegevIBE { /// /// assert_eq!(msg, m) /// ``` - fn dec(&self, sk_id: &Self::SecretKey, cipher: &Self::Cipher) -> Z { + fn dec(&self, sk_id: &Self::SecretKey, cipher: Self::Cipher) -> Z { self.dual_regev.dec(sk_id, cipher) } } @@ -473,7 +473,7 @@ mod test_dual_regev_ibe { let (pk, sk) = cryptosystem.setup(); let id_sk = cryptosystem.extract(&pk, &sk, &id); let cipher = cryptosystem.enc(&pk, &id, &msg); - let m = cryptosystem.dec(&id_sk, &cipher); + let m = cryptosystem.dec(&id_sk, cipher); assert_eq!(msg, m) } @@ -489,7 +489,7 @@ mod test_dual_regev_ibe { let (pk, sk) = cryptosystem.setup(); let id_sk = cryptosystem.extract(&pk, &sk, &id); let cipher = cryptosystem.enc(&pk, &id, &msg); - let m = cryptosystem.dec(&id_sk, &cipher); + let m = cryptosystem.dec(&id_sk, cipher); assert_eq!(msg, m) } @@ -505,7 +505,7 @@ mod test_dual_regev_ibe { let (pk, sk) = cryptosystem.setup(); let id_sk = cryptosystem.extract(&pk, &sk, &id); let cipher = cryptosystem.enc(&pk, &id, &msg); - let m = cryptosystem.dec(&id_sk, &cipher); + let m = cryptosystem.dec(&id_sk, cipher); assert_eq!(msg, m); } @@ -520,7 +520,7 @@ mod test_dual_regev_ibe { let (pk, sk) = cryptosystem.setup(); let id_sk = cryptosystem.extract(&pk, &sk, &id); let cipher = cryptosystem.enc(&pk, &id, &msg); - let m = cryptosystem.dec(&id_sk, &cipher); + let m = cryptosystem.dec(&id_sk, cipher); assert_eq!(msg, m); } @@ -540,7 +540,7 @@ mod test_dual_regev_ibe { let id_sk = cryptosystem.extract(&pk, &sk, &id); for _j in 1..=100 { let cipher = cryptosystem.enc(&pk, &id, &msg); - let m = cryptosystem.dec(&id_sk, &cipher); + let m = cryptosystem.dec(&id_sk, cipher); assert_eq!(msg, m); } diff --git a/src/pk_encryption/ccs_from_ibe.rs b/src/pk_encryption/ccs_from_ibe.rs index 50cc089..3f73b56 100644 --- a/src/pk_encryption/ccs_from_ibe.rs +++ b/src/pk_encryption/ccs_from_ibe.rs @@ -129,7 +129,7 @@ where /// /// assert_eq!(Z::ONE, m); /// ``` - fn dec(&mut self, sk: &Self::SecretKey, cipher: &Self::Cipher) -> Z { + fn dec(&mut self, sk: &Self::SecretKey, cipher: Self::Cipher) -> Z { if !self .signature .vfy(cipher.1.to_string(), &cipher.2, &cipher.0) @@ -138,6 +138,6 @@ where } let secret = self.ibe.extract(&sk.0, &sk.1, &cipher.0.clone().into()); - self.ibe.dec(&secret, &cipher.1) + self.ibe.dec(&secret, cipher.1) } } diff --git a/src/pk_encryption/ccs_from_ibe/dual_regev_ibe_pfdh.rs b/src/pk_encryption/ccs_from_ibe/dual_regev_ibe_pfdh.rs index b92e38d..d15c21c 100644 --- a/src/pk_encryption/ccs_from_ibe/dual_regev_ibe_pfdh.rs +++ b/src/pk_encryption/ccs_from_ibe/dual_regev_ibe_pfdh.rs @@ -108,7 +108,7 @@ mod test_ccs_from_ibe { let (pk, sk) = scheme.gen(); let cipher = scheme.enc(&pk, &msg); - let m = scheme.dec(&sk, &cipher); + let m = scheme.dec(&sk, cipher); assert_eq!(msg, m); } @@ -121,7 +121,7 @@ mod test_ccs_from_ibe { let (pk, sk) = scheme.gen(); let cipher = scheme.enc(&pk, &msg); - let m = scheme.dec(&sk, &cipher); + let m = scheme.dec(&sk, cipher); assert_eq!(msg, m); } } diff --git a/src/pk_encryption/dual_regev.rs b/src/pk_encryption/dual_regev.rs index 8a637b3..5454b57 100644 --- a/src/pk_encryption/dual_regev.rs +++ b/src/pk_encryption/dual_regev.rs @@ -425,7 +425,7 @@ impl PKEncryptionScheme for DualRegev { /// /// assert_eq!(Z::ONE, m); /// ``` - fn dec(&self, sk: &Self::SecretKey, cipher: &Self::Cipher) -> Z { + fn dec(&self, sk: &Self::SecretKey, cipher: Self::Cipher) -> Z { let tmp = (Z::MINUS_ONE * sk) .concat_vertical(&MatZ::identity(1, 1)) .unwrap(); @@ -532,7 +532,7 @@ mod test_dual_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, &cipher); + let m = dr.dec(&sk, cipher); assert_eq!(msg, m); } @@ -545,7 +545,7 @@ mod test_dual_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, &cipher); + let m = dr.dec(&sk, cipher); assert_eq!(msg, m); } @@ -558,7 +558,7 @@ mod test_dual_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, &cipher); + let m = dr.dec(&sk, cipher); assert_eq!(msg, m); } @@ -571,7 +571,7 @@ mod test_dual_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, &cipher); + let m = dr.dec(&sk, cipher); assert_eq!(msg, m); } @@ -586,7 +586,7 @@ mod test_dual_regev { let msg_mod = Z::from(msg.rem_euclid(2)); let cipher = dr.enc(&pk, msg); - let m = dr.dec(&sk, &cipher); + let m = dr.dec(&sk, cipher); assert_eq!(msg_mod, m); } @@ -610,7 +610,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, &cipher); + let m = scheme.dec_multiple_bits(&sk, cipher); assert_eq!(msg, m); } @@ -625,7 +625,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, &cipher); + let m = scheme.dec_multiple_bits(&sk, cipher); assert_eq!(msg, m); } @@ -643,7 +643,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, &cipher); + let m = scheme.dec_multiple_bits(&sk, cipher); assert_eq!(msg.abs(), m); } diff --git a/src/pk_encryption/dual_regev_discrete_gauss.rs b/src/pk_encryption/dual_regev_discrete_gauss.rs index 00b795f..232a9a0 100644 --- a/src/pk_encryption/dual_regev_discrete_gauss.rs +++ b/src/pk_encryption/dual_regev_discrete_gauss.rs @@ -437,7 +437,7 @@ impl PKEncryptionScheme for DualRegevWithDiscreteGaussianRegularity { /// /// assert_eq!(Z::ONE, m); /// ``` - fn dec(&self, sk: &Self::SecretKey, cipher: &Self::Cipher) -> Z { + fn dec(&self, sk: &Self::SecretKey, cipher: Self::Cipher) -> Z { let result = &cipher.1 - sk.dot_product(&cipher.0).unwrap(); let result: Z = result.get_representative_least_absolute_residue().abs(); @@ -547,7 +547,7 @@ mod test_dual_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, &cipher); + let m = dr.dec(&sk, cipher); assert_eq!(msg, m); } @@ -561,7 +561,7 @@ mod test_dual_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, &cipher); + let m = dr.dec(&sk, cipher); assert_eq!(msg, m); } @@ -575,7 +575,7 @@ mod test_dual_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, &cipher); + let m = dr.dec(&sk, cipher); assert_eq!(msg, m); } @@ -589,7 +589,7 @@ mod test_dual_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, &cipher); + let m = dr.dec(&sk, cipher); assert_eq!(msg, m); } @@ -605,7 +605,7 @@ mod test_dual_regev { let msg_mod = Z::from(msg.rem_euclid(2)); let cipher = dr.enc(&pk, msg); - let m = dr.dec(&sk, &cipher); + let m = dr.dec(&sk, cipher); assert_eq!(msg_mod, m); } @@ -631,7 +631,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, &cipher); + let m = scheme.dec_multiple_bits(&sk, cipher); assert_eq!(msg, m); } @@ -646,7 +646,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, &cipher); + let m = scheme.dec_multiple_bits(&sk, cipher); assert_eq!(msg, m); } @@ -664,7 +664,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, &cipher); + let m = scheme.dec_multiple_bits(&sk, cipher); assert_eq!(msg.abs(), m); } diff --git a/src/pk_encryption/lpr.rs b/src/pk_encryption/lpr.rs index 07e4959..7ac87d9 100644 --- a/src/pk_encryption/lpr.rs +++ b/src/pk_encryption/lpr.rs @@ -424,11 +424,11 @@ impl PKEncryptionScheme for LPR { /// /// assert_eq!(Z::ONE, m); /// ``` - fn dec(&self, sk: &Self::SecretKey, cipher: &Self::Cipher) -> Z { + fn dec(&self, sk: &Self::SecretKey, cipher: Self::Cipher) -> Z { let result = (Z::MINUS_ONE * sk.transpose()) .concat_horizontal(&MatZq::identity(1, 1, &self.q)) .unwrap() - .dot_product(cipher) + .dot_product(&cipher) .unwrap(); let result: Z = result.get_representative_least_absolute_residue().abs(); @@ -533,7 +533,7 @@ mod test_lpr { let (pk, sk) = lpr.gen(); let cipher = lpr.enc(&pk, &msg); - let m = lpr.dec(&sk, &cipher); + let m = lpr.dec(&sk, cipher); assert_eq!(msg, m); } @@ -547,7 +547,7 @@ mod test_lpr { let (pk, sk) = lpr.gen(); let cipher = lpr.enc(&pk, &msg); - let m = lpr.dec(&sk, &cipher); + let m = lpr.dec(&sk, cipher); assert_eq!(msg, m); } @@ -561,7 +561,7 @@ mod test_lpr { let (pk, sk) = lpr.gen(); let cipher = lpr.enc(&pk, &msg); - let m = lpr.dec(&sk, &cipher); + let m = lpr.dec(&sk, cipher); assert_eq!(msg, m); } @@ -575,7 +575,7 @@ mod test_lpr { let (pk, sk) = lpr.gen(); let cipher = lpr.enc(&pk, &msg); - let m = lpr.dec(&sk, &cipher); + let m = lpr.dec(&sk, cipher); assert_eq!(msg, m); } @@ -591,7 +591,7 @@ mod test_lpr { let msg_mod = Z::from(msg.rem_euclid(2)); let cipher = dr.enc(&pk, msg); - let m = dr.dec(&sk, &cipher); + let m = dr.dec(&sk, cipher); assert_eq!(msg_mod, m); } @@ -615,7 +615,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, &cipher); + let m = scheme.dec_multiple_bits(&sk, cipher); assert_eq!(msg, m); } @@ -630,7 +630,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, &cipher); + let m = scheme.dec_multiple_bits(&sk, cipher); assert_eq!(msg, m); } @@ -648,7 +648,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, &cipher); + let m = scheme.dec_multiple_bits(&sk, cipher); assert_eq!(msg.abs(), m); } diff --git a/src/pk_encryption/regev.rs b/src/pk_encryption/regev.rs index 7d4d9e6..5ead8d1 100644 --- a/src/pk_encryption/regev.rs +++ b/src/pk_encryption/regev.rs @@ -421,11 +421,11 @@ impl PKEncryptionScheme for Regev { /// /// assert_eq!(Z::ONE, m); /// ``` - fn dec(&self, sk: &Self::SecretKey, cipher: &Self::Cipher) -> Z { + fn dec(&self, sk: &Self::SecretKey, cipher: Self::Cipher) -> Z { let result = (Z::MINUS_ONE * sk) .concat_vertical(&MatZq::identity(1, 1, &self.q)) .unwrap() - .dot_product(cipher) + .dot_product(&cipher) .unwrap(); let result: Z = result.get_representative_least_absolute_residue().abs(); @@ -529,7 +529,7 @@ mod test_regev { let (pk, sk) = regev.gen(); let cipher = regev.enc(&pk, &msg); - let m = regev.dec(&sk, &cipher); + let m = regev.dec(&sk, cipher); assert_eq!(msg, m); } @@ -542,7 +542,7 @@ mod test_regev { let (pk, sk) = regev.gen(); let cipher = regev.enc(&pk, &msg); - let m = regev.dec(&sk, &cipher); + let m = regev.dec(&sk, cipher); assert_eq!(msg, m); } @@ -555,7 +555,7 @@ mod test_regev { let (pk, sk) = regev.gen(); let cipher = regev.enc(&pk, &msg); - let m = regev.dec(&sk, &cipher); + let m = regev.dec(&sk, cipher); assert_eq!(msg, m); } @@ -568,7 +568,7 @@ mod test_regev { let (pk, sk) = regev.gen(); let cipher = regev.enc(&pk, &msg); - let m = regev.dec(&sk, &cipher); + let m = regev.dec(&sk, cipher); assert_eq!(msg, m); } @@ -583,7 +583,7 @@ mod test_regev { let msg_mod = Z::from(msg.rem_euclid(2)); let cipher = regev.enc(&pk, msg); - let m = regev.dec(&sk, &cipher); + let m = regev.dec(&sk, cipher); assert_eq!(msg_mod, m); } @@ -607,7 +607,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, &cipher); + let m = scheme.dec_multiple_bits(&sk, cipher); assert_eq!(msg, m); } @@ -622,7 +622,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, &cipher); + let m = scheme.dec_multiple_bits(&sk, cipher); assert_eq!(msg, m); } @@ -640,7 +640,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, &cipher); + let m = scheme.dec_multiple_bits(&sk, cipher); assert_eq!(msg.abs(), m); } diff --git a/src/pk_encryption/regev_discrete_gauss.rs b/src/pk_encryption/regev_discrete_gauss.rs index 01b0c19..f5f306c 100644 --- a/src/pk_encryption/regev_discrete_gauss.rs +++ b/src/pk_encryption/regev_discrete_gauss.rs @@ -434,7 +434,7 @@ impl PKEncryptionScheme for RegevWithDiscreteGaussianRegularity { /// /// assert_eq!(Z::ONE, m); /// ``` - fn dec(&self, sk: &Self::SecretKey, cipher: &Self::Cipher) -> Z { + fn dec(&self, sk: &Self::SecretKey, cipher: Self::Cipher) -> Z { let result = &cipher.1 - sk.dot_product(&cipher.0).unwrap(); let result: Z = result.get_representative_least_absolute_residue().abs(); @@ -543,7 +543,7 @@ mod test_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, &cipher); + let m = dr.dec(&sk, cipher); assert_eq!(msg, m); } @@ -557,7 +557,7 @@ mod test_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, &cipher); + let m = dr.dec(&sk, cipher); assert_eq!(msg, m); } @@ -571,7 +571,7 @@ mod test_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, &cipher); + let m = dr.dec(&sk, cipher); assert_eq!(msg, m); } @@ -585,7 +585,7 @@ mod test_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, &cipher); + let m = dr.dec(&sk, cipher); assert_eq!(msg, m); } @@ -601,7 +601,7 @@ mod test_regev { let msg_mod = Z::from(msg.rem_euclid(2)); let cipher = regev.enc(&pk, msg); - let m = regev.dec(&sk, &cipher); + let m = regev.dec(&sk, cipher); assert_eq!(msg_mod, m); } @@ -627,7 +627,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, &cipher); + let m = scheme.dec_multiple_bits(&sk, cipher); assert_eq!(msg, m); } @@ -642,7 +642,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, &cipher); + let m = scheme.dec_multiple_bits(&sk, cipher); assert_eq!(msg, m); } @@ -660,7 +660,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, &cipher); + let m = scheme.dec_multiple_bits(&sk, cipher); assert_eq!(msg.abs(), m); } diff --git a/src/pk_encryption/ring_lpr.rs b/src/pk_encryption/ring_lpr.rs index b343ef7..d76d93b 100644 --- a/src/pk_encryption/ring_lpr.rs +++ b/src/pk_encryption/ring_lpr.rs @@ -443,7 +443,7 @@ impl PKEncryptionScheme for RingLPR { /// /// assert_eq!(Z::from(212), m); /// ``` - fn dec(&self, sk: &Self::SecretKey, cipher: &Self::Cipher) -> Z { + fn dec(&self, sk: &Self::SecretKey, cipher: Self::Cipher) -> Z { // res = v - s * u let result = &cipher.1 - sk * &cipher.0; @@ -547,7 +547,7 @@ mod test_ring_lpr { for message in messages { let cipher = scheme.enc(&pk, message); - let m = scheme.dec(&sk, &cipher); + let m = scheme.dec(&sk, cipher); assert_eq!(Z::from(message), m); } @@ -579,7 +579,7 @@ mod test_ring_lpr { for message in messages { let cipher = scheme.enc(&pk, message); - let m = scheme.dec(&sk, &cipher); + let m = scheme.dec(&sk, cipher); assert_eq!(Z::from(message), m); } @@ -594,7 +594,7 @@ mod test_ring_lpr { for msg in messages { let cipher = scheme.enc(&pk, msg); - let m = scheme.dec(&sk, &cipher); + let m = scheme.dec(&sk, cipher); assert_eq!(Z::ZERO, m); } From 22e2fe5ae891763f968b13f577297772f49635e1 Mon Sep 17 00:00:00 2001 From: jnsiemer Date: Tue, 9 Dec 2025 15:46:41 +0000 Subject: [PATCH 4/7] Update doc-comments --- src/identity_based_encryption/dual_regev_ibe.rs | 4 ++-- src/pk_encryption/ccs_from_ibe.rs | 4 ++-- src/pk_encryption/dual_regev.rs | 4 ++-- src/pk_encryption/dual_regev_discrete_gauss.rs | 4 ++-- src/pk_encryption/k_pke.rs | 4 ++-- src/pk_encryption/lpr.rs | 4 ++-- src/pk_encryption/regev.rs | 4 ++-- src/pk_encryption/regev_discrete_gauss.rs | 4 ++-- src/pk_encryption/ring_lpr.rs | 4 ++-- 9 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/identity_based_encryption/dual_regev_ibe.rs b/src/identity_based_encryption/dual_regev_ibe.rs index 7698965..8d9dac0 100644 --- a/src/identity_based_encryption/dual_regev_ibe.rs +++ b/src/identity_based_encryption/dual_regev_ibe.rs @@ -56,7 +56,7 @@ use std::collections::HashMap; /// let cipher = ibe.enc(&pk, &identity, &msg); /// /// // decrypt -/// let m = ibe.dec(&id_sk, &cipher); +/// let m = ibe.dec(&id_sk, cipher); /// /// assert_eq!(msg, m) /// ``` @@ -415,7 +415,7 @@ impl IBEScheme for DualRegevIBE { /// let cipher = ibe.enc(&pk, &identity, &msg); /// /// // decrypt - /// let m = ibe.dec(&id_sk, &cipher); + /// let m = ibe.dec(&id_sk, cipher); /// /// assert_eq!(msg, m) /// ``` diff --git a/src/pk_encryption/ccs_from_ibe.rs b/src/pk_encryption/ccs_from_ibe.rs index 3f73b56..9466206 100644 --- a/src/pk_encryption/ccs_from_ibe.rs +++ b/src/pk_encryption/ccs_from_ibe.rs @@ -32,7 +32,7 @@ pub mod dual_regev_ibe_pfdh; /// /// let (pk, sk) = scheme.gen(); /// let cipher = scheme.enc(&pk, 0); -/// let m = scheme.dec(&sk, &cipher); +/// let m = scheme.dec(&sk, cipher); /// /// assert_eq!(Z::ZERO, m); /// ``` @@ -125,7 +125,7 @@ where /// /// let (pk, sk) = scheme.gen(); /// let cipher = scheme.enc(&pk, 1); - /// let m = scheme.dec(&sk, &cipher); + /// let m = scheme.dec(&sk, cipher); /// /// assert_eq!(Z::ONE, m); /// ``` diff --git a/src/pk_encryption/dual_regev.rs b/src/pk_encryption/dual_regev.rs index 5454b57..431374f 100644 --- a/src/pk_encryption/dual_regev.rs +++ b/src/pk_encryption/dual_regev.rs @@ -42,7 +42,7 @@ use serde::{Deserialize, Serialize}; /// let cipher = dual_regev.enc(&pk, &msg); /// /// // decrypt -/// let m = dual_regev.dec(&sk, &cipher); +/// let m = dual_regev.dec(&sk, cipher); /// /// assert_eq!(msg, m); /// ``` @@ -421,7 +421,7 @@ impl PKEncryptionScheme for DualRegev { /// let (pk, sk) = dual_regev.gen(); /// let cipher = dual_regev.enc(&pk, 1); /// - /// let m = dual_regev.dec(&sk, &cipher); + /// let m = dual_regev.dec(&sk, cipher); /// /// assert_eq!(Z::ONE, m); /// ``` diff --git a/src/pk_encryption/dual_regev_discrete_gauss.rs b/src/pk_encryption/dual_regev_discrete_gauss.rs index 232a9a0..535bbfd 100644 --- a/src/pk_encryption/dual_regev_discrete_gauss.rs +++ b/src/pk_encryption/dual_regev_discrete_gauss.rs @@ -45,7 +45,7 @@ use serde::{Deserialize, Serialize}; /// let cipher = dual_regev.enc(&pk, &msg); /// /// // decrypt -/// let m = dual_regev.dec(&sk, &cipher); +/// let m = dual_regev.dec(&sk, cipher); /// /// assert_eq!(msg, m); /// ``` @@ -433,7 +433,7 @@ impl PKEncryptionScheme for DualRegevWithDiscreteGaussianRegularity { /// let (pk, sk) = dual_regev.gen(); /// let cipher = dual_regev.enc(&pk, 1); /// - /// let m = dual_regev.dec(&sk, &cipher); + /// let m = dual_regev.dec(&sk, cipher); /// /// assert_eq!(Z::ONE, m); /// ``` diff --git a/src/pk_encryption/k_pke.rs b/src/pk_encryption/k_pke.rs index 001e5bb..e4994f5 100644 --- a/src/pk_encryption/k_pke.rs +++ b/src/pk_encryption/k_pke.rs @@ -54,7 +54,7 @@ use serde::{Deserialize, Serialize}; /// let cipher = k_pke.enc(&pk, &msg); /// /// // decrypt the ciphertext -/// let m = k_pke.dec(&sk, &cipher); +/// let m = k_pke.dec(&sk, cipher); /// /// assert_eq!(msg, m); /// ``` @@ -252,7 +252,7 @@ impl PKEncryptionScheme for KPKE { /// let (pk, sk) = k_pke.gen(); /// let c = k_pke.enc(&pk, 1); /// - /// let m = k_pke.dec(&sk, &c); + /// let m = k_pke.dec(&sk, c); /// /// assert_eq!(1, m); /// ``` diff --git a/src/pk_encryption/lpr.rs b/src/pk_encryption/lpr.rs index 7ac87d9..a3b120a 100644 --- a/src/pk_encryption/lpr.rs +++ b/src/pk_encryption/lpr.rs @@ -41,7 +41,7 @@ use serde::{Deserialize, Serialize}; /// let cipher = lpr.enc(&pk, &msg); /// /// // decrypt -/// let m = lpr.dec(&sk, &cipher); +/// let m = lpr.dec(&sk, cipher); /// /// assert_eq!(msg, m); /// ``` @@ -420,7 +420,7 @@ impl PKEncryptionScheme for LPR { /// let (pk, sk) = lpr.gen(); /// let cipher = lpr.enc(&pk, 1); /// - /// let m = lpr.dec(&sk, &cipher); + /// let m = lpr.dec(&sk, cipher); /// /// assert_eq!(Z::ONE, m); /// ``` diff --git a/src/pk_encryption/regev.rs b/src/pk_encryption/regev.rs index 5ead8d1..63eb766 100644 --- a/src/pk_encryption/regev.rs +++ b/src/pk_encryption/regev.rs @@ -42,7 +42,7 @@ use serde::{Deserialize, Serialize}; /// let cipher = regev.enc(&pk, &msg); /// /// // decrypt -/// let m = regev.dec(&sk, &cipher); +/// let m = regev.dec(&sk, cipher); /// /// assert_eq!(msg, m); /// ``` @@ -417,7 +417,7 @@ impl PKEncryptionScheme for Regev { /// let (pk, sk) = regev.gen(); /// let cipher = regev.enc(&pk, 1); /// - /// let m = regev.dec(&sk, &cipher); + /// let m = regev.dec(&sk, cipher); /// /// assert_eq!(Z::ONE, m); /// ``` diff --git a/src/pk_encryption/regev_discrete_gauss.rs b/src/pk_encryption/regev_discrete_gauss.rs index f5f306c..61f9bdb 100644 --- a/src/pk_encryption/regev_discrete_gauss.rs +++ b/src/pk_encryption/regev_discrete_gauss.rs @@ -45,7 +45,7 @@ use serde::{Deserialize, Serialize}; /// let cipher = regev.enc(&pk, &msg); /// /// // decrypt -/// let m = regev.dec(&sk, &cipher); +/// let m = regev.dec(&sk, cipher); /// /// assert_eq!(msg, m); /// ``` @@ -430,7 +430,7 @@ impl PKEncryptionScheme for RegevWithDiscreteGaussianRegularity { /// let (pk, sk) = regev.gen(); /// let cipher = regev.enc(&pk, 1); /// - /// let m = regev.dec(&sk, &cipher); + /// let m = regev.dec(&sk, cipher); /// /// assert_eq!(Z::ONE, m); /// ``` diff --git a/src/pk_encryption/ring_lpr.rs b/src/pk_encryption/ring_lpr.rs index d76d93b..278ec5f 100644 --- a/src/pk_encryption/ring_lpr.rs +++ b/src/pk_encryption/ring_lpr.rs @@ -49,7 +49,7 @@ use serde::{Deserialize, Serialize}; /// let cipher = lpr.enc(&pk, &msg); /// /// // decrypt -/// let m = lpr.dec(&sk, &cipher); +/// let m = lpr.dec(&sk, cipher); /// /// assert_eq!(msg, m); /// ``` @@ -439,7 +439,7 @@ impl PKEncryptionScheme for RingLPR { /// let (pk, sk) = lpr.gen(); /// let cipher = lpr.enc(&pk, 212); /// - /// let m = lpr.dec(&sk, &cipher); + /// let m = lpr.dec(&sk, cipher); /// /// assert_eq!(Z::from(212), m); /// ``` From 345f9816d540383e54a8f1a5e108b1a93a1fe537 Mon Sep 17 00:00:00 2001 From: jnsiemer Date: Wed, 10 Dec 2025 19:57:02 +0000 Subject: [PATCH 5/7] Address changes in tools --- Cargo.toml | 4 ++-- src/pk_encryption/k_pke.rs | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b00961b..927c02d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,8 +7,8 @@ autobenches = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -qfall-tools = { git = "https://github.com/qfall/tools", branch="update" } -qfall-math = { git = "https://github.com/qfall/math", rev="1ee0b9f41676894d48520322109a3364b8f3338e" } +qfall-tools = { git = "https://github.com/qfall/tools", branch = "update" } +qfall-math = { git = "https://github.com/qfall/math", branch = "dev" } sha2 = "0.10.6" serde = {version="1.0", features=["derive"]} serde_json = "1.0" diff --git a/src/pk_encryption/k_pke.rs b/src/pk_encryption/k_pke.rs index e4994f5..cb29244 100644 --- a/src/pk_encryption/k_pke.rs +++ b/src/pk_encryption/k_pke.rs @@ -14,7 +14,7 @@ use crate::pk_encryption::PKEncryptionScheme; use qfall_math::{ - integer::Z, + integer::{MatPolyOverZ, PolyOverZ, Z}, integer_mod_q::{MatPolynomialRingZq, ModulusPolynomialRingZq, PolynomialRingZq}, }; use qfall_tools::utils::{ @@ -22,7 +22,7 @@ use qfall_tools::utils::{ decode_z_bitwise_from_polynomialringzq, encode_z_bitwise_in_polynomialringzq, }, common_moduli::new_anticyclic, - lossy_compression::LossyCompression, + lossy_compression::LossyCompressionFIPS203, }; use serde::{Deserialize, Serialize}; @@ -112,7 +112,7 @@ impl KPKE { impl PKEncryptionScheme for KPKE { type PublicKey = (MatPolynomialRingZq, MatPolynomialRingZq); type SecretKey = MatPolynomialRingZq; - type Cipher = (MatPolynomialRingZq, PolynomialRingZq); + type Cipher = (MatPolyOverZ, PolyOverZ); /// Generates a `(pk, sk)` pair by following these steps: /// - A <- R_q^{k x k} @@ -217,18 +217,18 @@ impl PKEncryptionScheme for KPKE { .unwrap(); // 19 𝐮 ← NTT^−1(𝐀^⊺ ∘ 𝐲) + 𝐞_𝟏 - let mut vec_u = &pk.0 * &vec_y + vec_e_1; + let vec_u = &pk.0 * &vec_y + vec_e_1; // 20 𝜇 ← Decompress_1(ByteDecode_1(𝑚)) let mu = encode_z_bitwise_in_polynomialringzq(&self.q, &message.into()); // 21 𝑣 ← NTT^−1(𝐭^⊺ ∘ 𝐲) + 𝑒_2 + 𝜇 - let mut v = pk.1.dot_product(&vec_y).unwrap() + e_2 + mu; + let v = pk.1.dot_product(&vec_y).unwrap() + e_2 + mu; // 22: 𝑐_1 ← ByteEncode_{𝑑_𝑢}(Compress_{𝑑_𝑢}(𝐮)) - vec_u.compress(self.d_u); + let vec_u = vec_u.lossy_compress(self.d_u); // 23: 𝑐_2 ← ByteEncode_{𝑑_𝑣}(Compress_{𝑑_𝑣}(𝑣)) - v.compress(self.d_v); + let v = v.lossy_compress(self.d_v); (vec_u, v) } @@ -256,11 +256,11 @@ impl PKEncryptionScheme for KPKE { /// /// assert_eq!(1, m); /// ``` - fn dec(&self, sk: &Self::SecretKey, (mut u, mut v): Self::Cipher) -> Z { + fn dec(&self, sk: &Self::SecretKey, (u, v): Self::Cipher) -> Z { // 3: 𝐮′ ← Decompress_{𝑑_𝑢}(ByteDecode_{𝑑_𝑢}(𝑐_1)) - u.decompress(self.d_u); + let u = MatPolynomialRingZq::lossy_decompress(&u, self.d_u, &self.q); // 4: 𝑣′ ← Decompress_{𝑑_𝑣}(ByteDecode_{𝑑_𝑣}(𝑐_2)) - v.decompress(self.d_v); + let v = PolynomialRingZq::lossy_decompress(&v, self.d_v, &self.q); // 6 𝑤 ← 𝑣′ − NTT^−1(𝐬^⊺ ∘ NTT(𝐮′)) let w = v - sk.dot_product(&u).unwrap(); From 92fde83a711a4271da504530f5afbb1dcd279c9d Mon Sep 17 00:00:00 2001 From: jnsiemer Date: Thu, 11 Dec 2025 17:27:14 +0000 Subject: [PATCH 6/7] Back to ciphertexts as references --- benches/k_pke.rs | 8 +++---- benches/regev.rs | 2 +- src/identity_based_encryption.rs | 2 +- .../dual_regev_ibe.rs | 16 ++++++------- src/pk_encryption.rs | 6 ++--- src/pk_encryption/ccs_from_ibe.rs | 8 +++---- .../ccs_from_ibe/dual_regev_ibe_pfdh.rs | 4 ++-- src/pk_encryption/dual_regev.rs | 22 ++++++++--------- .../dual_regev_discrete_gauss.rs | 22 ++++++++--------- src/pk_encryption/k_pke.rs | 12 +++++----- src/pk_encryption/lpr.rs | 24 +++++++++---------- src/pk_encryption/regev.rs | 24 +++++++++---------- src/pk_encryption/regev_discrete_gauss.rs | 22 ++++++++--------- src/pk_encryption/ring_lpr.rs | 12 +++++----- 14 files changed, 92 insertions(+), 92 deletions(-) diff --git a/benches/k_pke.rs b/benches/k_pke.rs index ea6dbc7..4925a1b 100644 --- a/benches/k_pke.rs +++ b/benches/k_pke.rs @@ -14,7 +14,7 @@ use qfall_schemes::pk_encryption::KPKE; fn kpke_cycle(k_pke: &KPKE) { let (pk, sk) = k_pke.gen(); let cipher = k_pke.enc(&pk, 1); - let _ = k_pke.dec(&sk, cipher); + let _ = k_pke.dec(&sk, &cipher); } /// Benchmark [kpke_cycle] with [KPKE::ml_kem_512]. @@ -54,7 +54,7 @@ fn bench_kpke_dec_512(c: &mut Criterion) { c.bench_function("K-PKE dec 512", |b| { b.iter_batched( || cipher.clone(), - |cipher| k_pke.dec(&sk, cipher), + |cipher| k_pke.dec(&sk, &cipher), criterion::BatchSize::SmallInput, ) }); @@ -97,7 +97,7 @@ fn bench_kpke_dec_768(c: &mut Criterion) { c.bench_function("K-PKE dec 768", |b| { b.iter_batched( || cipher.clone(), - |cipher| k_pke.dec(&sk, cipher), + |cipher| k_pke.dec(&sk, &cipher), criterion::BatchSize::SmallInput, ) }); @@ -140,7 +140,7 @@ fn bench_kpke_dec_1024(c: &mut Criterion) { c.bench_function("K-PKE dec 1024", |b| { b.iter_batched( || cipher.clone(), - |cipher| k_pke.dec(&sk, cipher), + |cipher| k_pke.dec(&sk, &cipher), criterion::BatchSize::SmallInput, ) }); diff --git a/benches/regev.rs b/benches/regev.rs index d6e75f9..10635a4 100644 --- a/benches/regev.rs +++ b/benches/regev.rs @@ -18,7 +18,7 @@ fn regev_cycle(n: i64) { let (pk, sk) = regev.gen(); let cipher = regev.enc(&pk, &msg); - let _ = regev.dec(&sk, cipher); + let _ = regev.dec(&sk, &cipher); } /// Benchmark [regev_cycle] with `n = 50`. diff --git a/src/identity_based_encryption.rs b/src/identity_based_encryption.rs index e174f90..5606c3e 100644 --- a/src/identity_based_encryption.rs +++ b/src/identity_based_encryption.rs @@ -78,5 +78,5 @@ pub trait IBEScheme { /// - `cipher`: specifies the ciphertext to be decrypted /// /// Returns the decryption of `cipher` as a [`Z`] instance. - fn dec(&self, sk: &Self::SecretKey, cipher: Self::Cipher) -> Z; + fn dec(&self, sk: &Self::SecretKey, cipher: &Self::Cipher) -> Z; } diff --git a/src/identity_based_encryption/dual_regev_ibe.rs b/src/identity_based_encryption/dual_regev_ibe.rs index 8d9dac0..78cf26e 100644 --- a/src/identity_based_encryption/dual_regev_ibe.rs +++ b/src/identity_based_encryption/dual_regev_ibe.rs @@ -56,7 +56,7 @@ use std::collections::HashMap; /// let cipher = ibe.enc(&pk, &identity, &msg); /// /// // decrypt -/// let m = ibe.dec(&id_sk, cipher); +/// let m = ibe.dec(&id_sk, &cipher); /// /// assert_eq!(msg, m) /// ``` @@ -415,11 +415,11 @@ impl IBEScheme for DualRegevIBE { /// let cipher = ibe.enc(&pk, &identity, &msg); /// /// // decrypt - /// let m = ibe.dec(&id_sk, cipher); + /// let m = ibe.dec(&id_sk, &cipher); /// /// assert_eq!(msg, m) /// ``` - fn dec(&self, sk_id: &Self::SecretKey, cipher: Self::Cipher) -> Z { + fn dec(&self, sk_id: &Self::SecretKey, cipher: &Self::Cipher) -> Z { self.dual_regev.dec(sk_id, cipher) } } @@ -473,7 +473,7 @@ mod test_dual_regev_ibe { let (pk, sk) = cryptosystem.setup(); let id_sk = cryptosystem.extract(&pk, &sk, &id); let cipher = cryptosystem.enc(&pk, &id, &msg); - let m = cryptosystem.dec(&id_sk, cipher); + let m = cryptosystem.dec(&id_sk, &cipher); assert_eq!(msg, m) } @@ -489,7 +489,7 @@ mod test_dual_regev_ibe { let (pk, sk) = cryptosystem.setup(); let id_sk = cryptosystem.extract(&pk, &sk, &id); let cipher = cryptosystem.enc(&pk, &id, &msg); - let m = cryptosystem.dec(&id_sk, cipher); + let m = cryptosystem.dec(&id_sk, &cipher); assert_eq!(msg, m) } @@ -505,7 +505,7 @@ mod test_dual_regev_ibe { let (pk, sk) = cryptosystem.setup(); let id_sk = cryptosystem.extract(&pk, &sk, &id); let cipher = cryptosystem.enc(&pk, &id, &msg); - let m = cryptosystem.dec(&id_sk, cipher); + let m = cryptosystem.dec(&id_sk, &cipher); assert_eq!(msg, m); } @@ -520,7 +520,7 @@ mod test_dual_regev_ibe { let (pk, sk) = cryptosystem.setup(); let id_sk = cryptosystem.extract(&pk, &sk, &id); let cipher = cryptosystem.enc(&pk, &id, &msg); - let m = cryptosystem.dec(&id_sk, cipher); + let m = cryptosystem.dec(&id_sk, &cipher); assert_eq!(msg, m); } @@ -540,7 +540,7 @@ mod test_dual_regev_ibe { let id_sk = cryptosystem.extract(&pk, &sk, &id); for _j in 1..=100 { let cipher = cryptosystem.enc(&pk, &id, &msg); - let m = cryptosystem.dec(&id_sk, cipher); + let m = cryptosystem.dec(&id_sk, &cipher); assert_eq!(msg, m); } diff --git a/src/pk_encryption.rs b/src/pk_encryption.rs index 590939e..bd12830 100644 --- a/src/pk_encryption.rs +++ b/src/pk_encryption.rs @@ -84,7 +84,7 @@ pub trait PKEncryptionScheme { /// - `cipher`: specifies the ciphertext to be decrypted /// /// Returns the decryption of `cipher` as a [`Z`] instance. - fn dec(&self, sk: &Self::SecretKey, cipher: Self::Cipher) -> Z; + fn dec(&self, sk: &Self::SecretKey, cipher: &Self::Cipher) -> Z; } /// This trait just exists s.t. we can pass `self` in as mutable for more advanced constructions, which use a storage. @@ -115,7 +115,7 @@ pub trait PKEncryptionSchemeMut { /// - `cipher`: specifies the ciphertext to be decrypted /// /// Returns the decryption of `cipher` as a [`Z`] instance. - fn dec(&mut self, sk: &Self::SecretKey, cipher: Self::Cipher) -> Z; + fn dec(&mut self, sk: &Self::SecretKey, cipher: &Self::Cipher) -> Z; } /// This trait generically implements multi-bit encryption @@ -157,7 +157,7 @@ pub trait GenericMultiBitEncryption: PKEncryptionScheme { /// to be decrypted /// /// Returns the decryption of `cipher` as a [`Z`] instance. - fn dec_multiple_bits(&self, sk: &Self::SecretKey, cipher: Vec) -> Z { + fn dec_multiple_bits(&self, sk: &Self::SecretKey, cipher: &[Self::Cipher]) -> Z { let mut bits = vec![]; for item in cipher { diff --git a/src/pk_encryption/ccs_from_ibe.rs b/src/pk_encryption/ccs_from_ibe.rs index 9466206..50cc089 100644 --- a/src/pk_encryption/ccs_from_ibe.rs +++ b/src/pk_encryption/ccs_from_ibe.rs @@ -32,7 +32,7 @@ pub mod dual_regev_ibe_pfdh; /// /// let (pk, sk) = scheme.gen(); /// let cipher = scheme.enc(&pk, 0); -/// let m = scheme.dec(&sk, cipher); +/// let m = scheme.dec(&sk, &cipher); /// /// assert_eq!(Z::ZERO, m); /// ``` @@ -125,11 +125,11 @@ where /// /// let (pk, sk) = scheme.gen(); /// let cipher = scheme.enc(&pk, 1); - /// let m = scheme.dec(&sk, cipher); + /// let m = scheme.dec(&sk, &cipher); /// /// assert_eq!(Z::ONE, m); /// ``` - fn dec(&mut self, sk: &Self::SecretKey, cipher: Self::Cipher) -> Z { + fn dec(&mut self, sk: &Self::SecretKey, cipher: &Self::Cipher) -> Z { if !self .signature .vfy(cipher.1.to_string(), &cipher.2, &cipher.0) @@ -138,6 +138,6 @@ where } let secret = self.ibe.extract(&sk.0, &sk.1, &cipher.0.clone().into()); - self.ibe.dec(&secret, cipher.1) + self.ibe.dec(&secret, &cipher.1) } } diff --git a/src/pk_encryption/ccs_from_ibe/dual_regev_ibe_pfdh.rs b/src/pk_encryption/ccs_from_ibe/dual_regev_ibe_pfdh.rs index d15c21c..b92e38d 100644 --- a/src/pk_encryption/ccs_from_ibe/dual_regev_ibe_pfdh.rs +++ b/src/pk_encryption/ccs_from_ibe/dual_regev_ibe_pfdh.rs @@ -108,7 +108,7 @@ mod test_ccs_from_ibe { let (pk, sk) = scheme.gen(); let cipher = scheme.enc(&pk, &msg); - let m = scheme.dec(&sk, cipher); + let m = scheme.dec(&sk, &cipher); assert_eq!(msg, m); } @@ -121,7 +121,7 @@ mod test_ccs_from_ibe { let (pk, sk) = scheme.gen(); let cipher = scheme.enc(&pk, &msg); - let m = scheme.dec(&sk, cipher); + let m = scheme.dec(&sk, &cipher); assert_eq!(msg, m); } } diff --git a/src/pk_encryption/dual_regev.rs b/src/pk_encryption/dual_regev.rs index 431374f..8a637b3 100644 --- a/src/pk_encryption/dual_regev.rs +++ b/src/pk_encryption/dual_regev.rs @@ -42,7 +42,7 @@ use serde::{Deserialize, Serialize}; /// let cipher = dual_regev.enc(&pk, &msg); /// /// // decrypt -/// let m = dual_regev.dec(&sk, cipher); +/// let m = dual_regev.dec(&sk, &cipher); /// /// assert_eq!(msg, m); /// ``` @@ -421,11 +421,11 @@ impl PKEncryptionScheme for DualRegev { /// let (pk, sk) = dual_regev.gen(); /// let cipher = dual_regev.enc(&pk, 1); /// - /// let m = dual_regev.dec(&sk, cipher); + /// let m = dual_regev.dec(&sk, &cipher); /// /// assert_eq!(Z::ONE, m); /// ``` - fn dec(&self, sk: &Self::SecretKey, cipher: Self::Cipher) -> Z { + fn dec(&self, sk: &Self::SecretKey, cipher: &Self::Cipher) -> Z { let tmp = (Z::MINUS_ONE * sk) .concat_vertical(&MatZ::identity(1, 1)) .unwrap(); @@ -532,7 +532,7 @@ mod test_dual_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, cipher); + let m = dr.dec(&sk, &cipher); assert_eq!(msg, m); } @@ -545,7 +545,7 @@ mod test_dual_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, cipher); + let m = dr.dec(&sk, &cipher); assert_eq!(msg, m); } @@ -558,7 +558,7 @@ mod test_dual_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, cipher); + let m = dr.dec(&sk, &cipher); assert_eq!(msg, m); } @@ -571,7 +571,7 @@ mod test_dual_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, cipher); + let m = dr.dec(&sk, &cipher); assert_eq!(msg, m); } @@ -586,7 +586,7 @@ mod test_dual_regev { let msg_mod = Z::from(msg.rem_euclid(2)); let cipher = dr.enc(&pk, msg); - let m = dr.dec(&sk, cipher); + let m = dr.dec(&sk, &cipher); assert_eq!(msg_mod, m); } @@ -610,7 +610,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, cipher); + let m = scheme.dec_multiple_bits(&sk, &cipher); assert_eq!(msg, m); } @@ -625,7 +625,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, cipher); + let m = scheme.dec_multiple_bits(&sk, &cipher); assert_eq!(msg, m); } @@ -643,7 +643,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, cipher); + let m = scheme.dec_multiple_bits(&sk, &cipher); assert_eq!(msg.abs(), m); } diff --git a/src/pk_encryption/dual_regev_discrete_gauss.rs b/src/pk_encryption/dual_regev_discrete_gauss.rs index 535bbfd..00b795f 100644 --- a/src/pk_encryption/dual_regev_discrete_gauss.rs +++ b/src/pk_encryption/dual_regev_discrete_gauss.rs @@ -45,7 +45,7 @@ use serde::{Deserialize, Serialize}; /// let cipher = dual_regev.enc(&pk, &msg); /// /// // decrypt -/// let m = dual_regev.dec(&sk, cipher); +/// let m = dual_regev.dec(&sk, &cipher); /// /// assert_eq!(msg, m); /// ``` @@ -433,11 +433,11 @@ impl PKEncryptionScheme for DualRegevWithDiscreteGaussianRegularity { /// let (pk, sk) = dual_regev.gen(); /// let cipher = dual_regev.enc(&pk, 1); /// - /// let m = dual_regev.dec(&sk, cipher); + /// let m = dual_regev.dec(&sk, &cipher); /// /// assert_eq!(Z::ONE, m); /// ``` - fn dec(&self, sk: &Self::SecretKey, cipher: Self::Cipher) -> Z { + fn dec(&self, sk: &Self::SecretKey, cipher: &Self::Cipher) -> Z { let result = &cipher.1 - sk.dot_product(&cipher.0).unwrap(); let result: Z = result.get_representative_least_absolute_residue().abs(); @@ -547,7 +547,7 @@ mod test_dual_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, cipher); + let m = dr.dec(&sk, &cipher); assert_eq!(msg, m); } @@ -561,7 +561,7 @@ mod test_dual_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, cipher); + let m = dr.dec(&sk, &cipher); assert_eq!(msg, m); } @@ -575,7 +575,7 @@ mod test_dual_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, cipher); + let m = dr.dec(&sk, &cipher); assert_eq!(msg, m); } @@ -589,7 +589,7 @@ mod test_dual_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, cipher); + let m = dr.dec(&sk, &cipher); assert_eq!(msg, m); } @@ -605,7 +605,7 @@ mod test_dual_regev { let msg_mod = Z::from(msg.rem_euclid(2)); let cipher = dr.enc(&pk, msg); - let m = dr.dec(&sk, cipher); + let m = dr.dec(&sk, &cipher); assert_eq!(msg_mod, m); } @@ -631,7 +631,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, cipher); + let m = scheme.dec_multiple_bits(&sk, &cipher); assert_eq!(msg, m); } @@ -646,7 +646,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, cipher); + let m = scheme.dec_multiple_bits(&sk, &cipher); assert_eq!(msg, m); } @@ -664,7 +664,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, cipher); + let m = scheme.dec_multiple_bits(&sk, &cipher); assert_eq!(msg.abs(), m); } diff --git a/src/pk_encryption/k_pke.rs b/src/pk_encryption/k_pke.rs index cb29244..f478899 100644 --- a/src/pk_encryption/k_pke.rs +++ b/src/pk_encryption/k_pke.rs @@ -54,7 +54,7 @@ use serde::{Deserialize, Serialize}; /// let cipher = k_pke.enc(&pk, &msg); /// /// // decrypt the ciphertext -/// let m = k_pke.dec(&sk, cipher); +/// let m = k_pke.dec(&sk, &cipher); /// /// assert_eq!(msg, m); /// ``` @@ -252,15 +252,15 @@ impl PKEncryptionScheme for KPKE { /// let (pk, sk) = k_pke.gen(); /// let c = k_pke.enc(&pk, 1); /// - /// let m = k_pke.dec(&sk, c); + /// let m = k_pke.dec(&sk, &c); /// /// assert_eq!(1, m); /// ``` - fn dec(&self, sk: &Self::SecretKey, (u, v): Self::Cipher) -> Z { + fn dec(&self, sk: &Self::SecretKey, (u, v): &Self::Cipher) -> Z { // 3: 𝐮′ ← Decompress_{𝑑_𝑢}(ByteDecode_{𝑑_𝑢}(𝑐_1)) - let u = MatPolynomialRingZq::lossy_decompress(&u, self.d_u, &self.q); + let u = MatPolynomialRingZq::lossy_decompress(u, self.d_u, &self.q); // 4: 𝑣′ ← Decompress_{𝑑_𝑣}(ByteDecode_{𝑑_𝑣}(𝑐_2)) - let v = PolynomialRingZq::lossy_decompress(&v, self.d_v, &self.q); + let v = PolynomialRingZq::lossy_decompress(v, self.d_v, &self.q); // 6 𝑤 ← 𝑣′ − NTT^−1(𝐬^⊺ ∘ NTT(𝐮′)) let w = v - sk.dot_product(&u).unwrap(); @@ -285,7 +285,7 @@ mod test_kpke { for message in messages { let (pk, sk) = k_pke.gen(); let c = k_pke.enc(&pk, message); - let m = k_pke.dec(&sk, c); + let m = k_pke.dec(&sk, &c); assert_eq!(message, m); } diff --git a/src/pk_encryption/lpr.rs b/src/pk_encryption/lpr.rs index a3b120a..07e4959 100644 --- a/src/pk_encryption/lpr.rs +++ b/src/pk_encryption/lpr.rs @@ -41,7 +41,7 @@ use serde::{Deserialize, Serialize}; /// let cipher = lpr.enc(&pk, &msg); /// /// // decrypt -/// let m = lpr.dec(&sk, cipher); +/// let m = lpr.dec(&sk, &cipher); /// /// assert_eq!(msg, m); /// ``` @@ -420,15 +420,15 @@ impl PKEncryptionScheme for LPR { /// let (pk, sk) = lpr.gen(); /// let cipher = lpr.enc(&pk, 1); /// - /// let m = lpr.dec(&sk, cipher); + /// let m = lpr.dec(&sk, &cipher); /// /// assert_eq!(Z::ONE, m); /// ``` - fn dec(&self, sk: &Self::SecretKey, cipher: Self::Cipher) -> Z { + fn dec(&self, sk: &Self::SecretKey, cipher: &Self::Cipher) -> Z { let result = (Z::MINUS_ONE * sk.transpose()) .concat_horizontal(&MatZq::identity(1, 1, &self.q)) .unwrap() - .dot_product(&cipher) + .dot_product(cipher) .unwrap(); let result: Z = result.get_representative_least_absolute_residue().abs(); @@ -533,7 +533,7 @@ mod test_lpr { let (pk, sk) = lpr.gen(); let cipher = lpr.enc(&pk, &msg); - let m = lpr.dec(&sk, cipher); + let m = lpr.dec(&sk, &cipher); assert_eq!(msg, m); } @@ -547,7 +547,7 @@ mod test_lpr { let (pk, sk) = lpr.gen(); let cipher = lpr.enc(&pk, &msg); - let m = lpr.dec(&sk, cipher); + let m = lpr.dec(&sk, &cipher); assert_eq!(msg, m); } @@ -561,7 +561,7 @@ mod test_lpr { let (pk, sk) = lpr.gen(); let cipher = lpr.enc(&pk, &msg); - let m = lpr.dec(&sk, cipher); + let m = lpr.dec(&sk, &cipher); assert_eq!(msg, m); } @@ -575,7 +575,7 @@ mod test_lpr { let (pk, sk) = lpr.gen(); let cipher = lpr.enc(&pk, &msg); - let m = lpr.dec(&sk, cipher); + let m = lpr.dec(&sk, &cipher); assert_eq!(msg, m); } @@ -591,7 +591,7 @@ mod test_lpr { let msg_mod = Z::from(msg.rem_euclid(2)); let cipher = dr.enc(&pk, msg); - let m = dr.dec(&sk, cipher); + let m = dr.dec(&sk, &cipher); assert_eq!(msg_mod, m); } @@ -615,7 +615,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, cipher); + let m = scheme.dec_multiple_bits(&sk, &cipher); assert_eq!(msg, m); } @@ -630,7 +630,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, cipher); + let m = scheme.dec_multiple_bits(&sk, &cipher); assert_eq!(msg, m); } @@ -648,7 +648,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, cipher); + let m = scheme.dec_multiple_bits(&sk, &cipher); assert_eq!(msg.abs(), m); } diff --git a/src/pk_encryption/regev.rs b/src/pk_encryption/regev.rs index 63eb766..7d4d9e6 100644 --- a/src/pk_encryption/regev.rs +++ b/src/pk_encryption/regev.rs @@ -42,7 +42,7 @@ use serde::{Deserialize, Serialize}; /// let cipher = regev.enc(&pk, &msg); /// /// // decrypt -/// let m = regev.dec(&sk, cipher); +/// let m = regev.dec(&sk, &cipher); /// /// assert_eq!(msg, m); /// ``` @@ -417,15 +417,15 @@ impl PKEncryptionScheme for Regev { /// let (pk, sk) = regev.gen(); /// let cipher = regev.enc(&pk, 1); /// - /// let m = regev.dec(&sk, cipher); + /// let m = regev.dec(&sk, &cipher); /// /// assert_eq!(Z::ONE, m); /// ``` - fn dec(&self, sk: &Self::SecretKey, cipher: Self::Cipher) -> Z { + fn dec(&self, sk: &Self::SecretKey, cipher: &Self::Cipher) -> Z { let result = (Z::MINUS_ONE * sk) .concat_vertical(&MatZq::identity(1, 1, &self.q)) .unwrap() - .dot_product(&cipher) + .dot_product(cipher) .unwrap(); let result: Z = result.get_representative_least_absolute_residue().abs(); @@ -529,7 +529,7 @@ mod test_regev { let (pk, sk) = regev.gen(); let cipher = regev.enc(&pk, &msg); - let m = regev.dec(&sk, cipher); + let m = regev.dec(&sk, &cipher); assert_eq!(msg, m); } @@ -542,7 +542,7 @@ mod test_regev { let (pk, sk) = regev.gen(); let cipher = regev.enc(&pk, &msg); - let m = regev.dec(&sk, cipher); + let m = regev.dec(&sk, &cipher); assert_eq!(msg, m); } @@ -555,7 +555,7 @@ mod test_regev { let (pk, sk) = regev.gen(); let cipher = regev.enc(&pk, &msg); - let m = regev.dec(&sk, cipher); + let m = regev.dec(&sk, &cipher); assert_eq!(msg, m); } @@ -568,7 +568,7 @@ mod test_regev { let (pk, sk) = regev.gen(); let cipher = regev.enc(&pk, &msg); - let m = regev.dec(&sk, cipher); + let m = regev.dec(&sk, &cipher); assert_eq!(msg, m); } @@ -583,7 +583,7 @@ mod test_regev { let msg_mod = Z::from(msg.rem_euclid(2)); let cipher = regev.enc(&pk, msg); - let m = regev.dec(&sk, cipher); + let m = regev.dec(&sk, &cipher); assert_eq!(msg_mod, m); } @@ -607,7 +607,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, cipher); + let m = scheme.dec_multiple_bits(&sk, &cipher); assert_eq!(msg, m); } @@ -622,7 +622,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, cipher); + let m = scheme.dec_multiple_bits(&sk, &cipher); assert_eq!(msg, m); } @@ -640,7 +640,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, cipher); + let m = scheme.dec_multiple_bits(&sk, &cipher); assert_eq!(msg.abs(), m); } diff --git a/src/pk_encryption/regev_discrete_gauss.rs b/src/pk_encryption/regev_discrete_gauss.rs index 61f9bdb..01b0c19 100644 --- a/src/pk_encryption/regev_discrete_gauss.rs +++ b/src/pk_encryption/regev_discrete_gauss.rs @@ -45,7 +45,7 @@ use serde::{Deserialize, Serialize}; /// let cipher = regev.enc(&pk, &msg); /// /// // decrypt -/// let m = regev.dec(&sk, cipher); +/// let m = regev.dec(&sk, &cipher); /// /// assert_eq!(msg, m); /// ``` @@ -430,11 +430,11 @@ impl PKEncryptionScheme for RegevWithDiscreteGaussianRegularity { /// let (pk, sk) = regev.gen(); /// let cipher = regev.enc(&pk, 1); /// - /// let m = regev.dec(&sk, cipher); + /// let m = regev.dec(&sk, &cipher); /// /// assert_eq!(Z::ONE, m); /// ``` - fn dec(&self, sk: &Self::SecretKey, cipher: Self::Cipher) -> Z { + fn dec(&self, sk: &Self::SecretKey, cipher: &Self::Cipher) -> Z { let result = &cipher.1 - sk.dot_product(&cipher.0).unwrap(); let result: Z = result.get_representative_least_absolute_residue().abs(); @@ -543,7 +543,7 @@ mod test_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, cipher); + let m = dr.dec(&sk, &cipher); assert_eq!(msg, m); } @@ -557,7 +557,7 @@ mod test_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, cipher); + let m = dr.dec(&sk, &cipher); assert_eq!(msg, m); } @@ -571,7 +571,7 @@ mod test_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, cipher); + let m = dr.dec(&sk, &cipher); assert_eq!(msg, m); } @@ -585,7 +585,7 @@ mod test_regev { let (pk, sk) = dr.gen(); let cipher = dr.enc(&pk, &msg); - let m = dr.dec(&sk, cipher); + let m = dr.dec(&sk, &cipher); assert_eq!(msg, m); } @@ -601,7 +601,7 @@ mod test_regev { let msg_mod = Z::from(msg.rem_euclid(2)); let cipher = regev.enc(&pk, msg); - let m = regev.dec(&sk, cipher); + let m = regev.dec(&sk, &cipher); assert_eq!(msg_mod, m); } @@ -627,7 +627,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, cipher); + let m = scheme.dec_multiple_bits(&sk, &cipher); assert_eq!(msg, m); } @@ -642,7 +642,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, cipher); + let m = scheme.dec_multiple_bits(&sk, &cipher); assert_eq!(msg, m); } @@ -660,7 +660,7 @@ mod test_multi_bits { let (pk, sk) = scheme.gen(); let cipher = scheme.enc_multiple_bits(&pk, &msg); - let m = scheme.dec_multiple_bits(&sk, cipher); + let m = scheme.dec_multiple_bits(&sk, &cipher); assert_eq!(msg.abs(), m); } diff --git a/src/pk_encryption/ring_lpr.rs b/src/pk_encryption/ring_lpr.rs index 278ec5f..b343ef7 100644 --- a/src/pk_encryption/ring_lpr.rs +++ b/src/pk_encryption/ring_lpr.rs @@ -49,7 +49,7 @@ use serde::{Deserialize, Serialize}; /// let cipher = lpr.enc(&pk, &msg); /// /// // decrypt -/// let m = lpr.dec(&sk, cipher); +/// let m = lpr.dec(&sk, &cipher); /// /// assert_eq!(msg, m); /// ``` @@ -439,11 +439,11 @@ impl PKEncryptionScheme for RingLPR { /// let (pk, sk) = lpr.gen(); /// let cipher = lpr.enc(&pk, 212); /// - /// let m = lpr.dec(&sk, cipher); + /// let m = lpr.dec(&sk, &cipher); /// /// assert_eq!(Z::from(212), m); /// ``` - fn dec(&self, sk: &Self::SecretKey, cipher: Self::Cipher) -> Z { + fn dec(&self, sk: &Self::SecretKey, cipher: &Self::Cipher) -> Z { // res = v - s * u let result = &cipher.1 - sk * &cipher.0; @@ -547,7 +547,7 @@ mod test_ring_lpr { for message in messages { let cipher = scheme.enc(&pk, message); - let m = scheme.dec(&sk, cipher); + let m = scheme.dec(&sk, &cipher); assert_eq!(Z::from(message), m); } @@ -579,7 +579,7 @@ mod test_ring_lpr { for message in messages { let cipher = scheme.enc(&pk, message); - let m = scheme.dec(&sk, cipher); + let m = scheme.dec(&sk, &cipher); assert_eq!(Z::from(message), m); } @@ -594,7 +594,7 @@ mod test_ring_lpr { for msg in messages { let cipher = scheme.enc(&pk, msg); - let m = scheme.dec(&sk, cipher); + let m = scheme.dec(&sk, &cipher); assert_eq!(Z::ZERO, m); } From 3c56a3d555fe23cef023f3be2d1c3be41ef64859 Mon Sep 17 00:00:00 2001 From: jnsiemer Date: Mon, 15 Dec 2025 09:04:02 +0000 Subject: [PATCH 7/7] Adapt to changes from tools-crate --- Cargo.toml | 2 +- src/pk_encryption/k_pke.rs | 14 +++++++------- src/pk_encryption/ring_lpr.rs | 8 +++----- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 927c02d..5890495 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,7 @@ autobenches = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -qfall-tools = { git = "https://github.com/qfall/tools", branch = "update" } +qfall-tools = { git = "https://github.com/qfall/tools", branch = "dev" } qfall-math = { git = "https://github.com/qfall/math", branch = "dev" } sha2 = "0.10.6" serde = {version="1.0", features=["derive"]} diff --git a/src/pk_encryption/k_pke.rs b/src/pk_encryption/k_pke.rs index f478899..356272b 100644 --- a/src/pk_encryption/k_pke.rs +++ b/src/pk_encryption/k_pke.rs @@ -17,12 +17,12 @@ use qfall_math::{ integer::{MatPolyOverZ, PolyOverZ, Z}, integer_mod_q::{MatPolynomialRingZq, ModulusPolynomialRingZq, PolynomialRingZq}, }; -use qfall_tools::utils::{ - common_encodings::{ - decode_z_bitwise_from_polynomialringzq, encode_z_bitwise_in_polynomialringzq, +use qfall_tools::{ + compression::LossyCompressionFIPS203, + utils::{ + common_encodings::{decode_value_from_polynomialringzq, encode_value_in_polynomialringzq}, + common_moduli::new_anticyclic, }, - common_moduli::new_anticyclic, - lossy_compression::LossyCompressionFIPS203, }; use serde::{Deserialize, Serialize}; @@ -220,7 +220,7 @@ impl PKEncryptionScheme for KPKE { let vec_u = &pk.0 * &vec_y + vec_e_1; // 20 𝜇 ← Decompress_1(ByteDecode_1(𝑚)) - let mu = encode_z_bitwise_in_polynomialringzq(&self.q, &message.into()); + let mu = encode_value_in_polynomialringzq(message, 2, &self.q).unwrap(); // 21 𝑣 ← NTT^−1(𝐭^⊺ ∘ 𝐲) + 𝑒_2 + 𝜇 let v = pk.1.dot_product(&vec_y).unwrap() + e_2 + mu; @@ -266,7 +266,7 @@ impl PKEncryptionScheme for KPKE { let w = v - sk.dot_product(&u).unwrap(); // 7 𝑚 ← ByteEncode_1(Compress_1(𝑤)) - decode_z_bitwise_from_polynomialringzq(self.q.get_q(), &w) + decode_value_from_polynomialringzq(&w, 2).unwrap() } } diff --git a/src/pk_encryption/ring_lpr.rs b/src/pk_encryption/ring_lpr.rs index b343ef7..da4b27b 100644 --- a/src/pk_encryption/ring_lpr.rs +++ b/src/pk_encryption/ring_lpr.rs @@ -18,9 +18,7 @@ use qfall_math::{ traits::Pow, }; use qfall_tools::utils::{ - common_encodings::{ - decode_z_bitwise_from_polynomialringzq, encode_z_bitwise_in_polynomialringzq, - }, + common_encodings::{decode_value_from_polynomialringzq, encode_value_in_polynomialringzq}, common_moduli::new_anticyclic, }; use serde::{Deserialize, Serialize}; @@ -396,7 +394,7 @@ impl PKEncryptionScheme for RingLPR { let message: Z = message.into().abs(); let mu = message % Z::from(2).pow(&self.n).unwrap(); // set mu_q_half to polynomial with n {0,1} coefficients - let mu_q_half = encode_z_bitwise_in_polynomialringzq(&self.q, &mu); + let mu_q_half = encode_value_in_polynomialringzq(mu, 2, &self.q).unwrap(); // r <- χ let r = PolynomialRingZq::sample_discrete_gauss(&self.q, 0, &self.alpha * &self.q.get_q()) @@ -447,7 +445,7 @@ impl PKEncryptionScheme for RingLPR { // res = v - s * u let result = &cipher.1 - sk * &cipher.0; - decode_z_bitwise_from_polynomialringzq(self.q.get_q(), &result) + decode_value_from_polynomialringzq(&result, 2).unwrap() } }