From 6a8fe91a6910a193ac7b8a9677048d2b5ae849c2 Mon Sep 17 00:00:00 2001 From: Julian van der Horst Date: Thu, 29 Jan 2026 10:39:43 +0100 Subject: [PATCH 1/5] Added rekey_info for both pseudonyms and attributes --- src/lib/data/traits.rs | 41 +++++++++++++++++++++++++++++++++ src/lib/transcryptor/prelude.rs | 1 + src/lib/transcryptor/types.rs | 22 +++++++++++++++++- 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/src/lib/data/traits.rs b/src/lib/data/traits.rs index 447bb75..4c20739 100644 --- a/src/lib/data/traits.rs +++ b/src/lib/data/traits.rs @@ -1,5 +1,6 @@ //! Core traits for encryption and decryption operations. +use crate::factors::contexts::EncryptionContext; use crate::factors::TranscryptionInfo; use crate::factors::{PseudonymizationInfo, RerandomizeFactor}; use rand_core::{CryptoRng, RngCore}; @@ -126,6 +127,24 @@ pub trait Pseudonymizable: Encrypted { fn pseudonymize(&self, info: &PseudonymizationInfo) -> Self; } +/// A trait for types that can provide rekey information for a specific rekey info type. +/// +/// This trait is parameterized by the rekey info type, allowing different implementations +/// for different encrypted types (e.g., `AttributeRekeyInfo` vs `PseudonymRekeyInfo`). +/// +/// # Examples +/// +/// ```rust,ignore +/// // Transcryptor implements RekeyInfoSource for both types +/// let attr_info: AttributeRekeyInfo = transcryptor.rekey_info(&from_ctx, &to_ctx); +/// let pseudo_info: PseudonymRekeyInfo = transcryptor.rekey_info(&from_ctx, &to_ctx); +/// ``` +pub trait RekeyInfoSource { + /// Get the rekey information for transcryption between encryption contexts. + fn rekey_info(&self, session_from: &EncryptionContext, session_to: &EncryptionContext) + -> Info; +} + /// A trait for encrypted types that can be rekeyed (encryption context change). /// /// Rekeying changes the encryption context without changing the underlying value. @@ -137,6 +156,28 @@ pub trait Rekeyable: Encrypted { /// Rekey this encrypted value from one encryption context to another. fn rekey(&self, info: &Self::RekeyInfo) -> Self; + + /// Get the rekey information from a source (e.g., a PEP transcryptor) for transcryption between sessions. + /// + /// This is a convenience method that allows getting the appropriate rekey info type + /// automatically based on the encrypted type. + /// + /// # Examples + /// + /// ```rust,ignore + /// // For EncryptedAttribute, this returns AttributeRekeyInfo + /// let info = EncryptedAttribute::get_rekey_info(&transcryptor, &from_ctx, &to_ctx); + /// + /// // For EncryptedPseudonym, this returns PseudonymRekeyInfo + /// let info = EncryptedPseudonym::get_rekey_info(&transcryptor, &from_ctx, &to_ctx); + /// ``` + fn get_rekey_info>( + source: &S, + session_from: &EncryptionContext, + session_to: &EncryptionContext, + ) -> Self::RekeyInfo { + source.rekey_info(session_from, session_to) + } } /// A trait for encrypted types that can be transcrypted. diff --git a/src/lib/transcryptor/prelude.rs b/src/lib/transcryptor/prelude.rs index 461f610..bc1f98b 100644 --- a/src/lib/transcryptor/prelude.rs +++ b/src/lib/transcryptor/prelude.rs @@ -2,5 +2,6 @@ pub use super::{pseudonymize, rekey, rerandomize, rerandomize_known, transcrypt, Transcryptor}; pub use crate::data::simple::{Attribute, EncryptedAttribute, EncryptedPseudonym, Pseudonym}; +pub use crate::data::traits::{Rekeyable, RekeyInfoSource}; pub use crate::factors::contexts::{EncryptionContext, PseudonymizationDomain}; pub use crate::factors::{EncryptionSecret, PseudonymizationSecret, TranscryptionInfo}; diff --git a/src/lib/transcryptor/types.rs b/src/lib/transcryptor/types.rs index 977d35a..a6bfc5d 100644 --- a/src/lib/transcryptor/types.rs +++ b/src/lib/transcryptor/types.rs @@ -1,6 +1,6 @@ //! Transcryptor type definitions. -use crate::data::traits::{Pseudonymizable, Rekeyable, Transcryptable}; +use crate::data::traits::{Pseudonymizable, Rekeyable, RekeyInfoSource, Transcryptable}; use crate::factors::contexts::*; use crate::factors::{ AttributeRekeyInfo, EncryptionSecret, PseudonymRekeyInfo, PseudonymizationInfo, @@ -184,3 +184,23 @@ impl Transcryptor { super::batch::transcrypt_batch(encrypted, transcryption_info, rng) } } + +impl RekeyInfoSource for Transcryptor { + fn rekey_info( + &self, + session_from: &EncryptionContext, + session_to: &EncryptionContext, + ) -> AttributeRekeyInfo { + self.attribute_rekey_info(session_from, session_to) + } +} + +impl RekeyInfoSource for Transcryptor { + fn rekey_info( + &self, + session_from: &EncryptionContext, + session_to: &EncryptionContext, + ) -> PseudonymRekeyInfo { + self.pseudonym_rekey_info(session_from, session_to) + } +} From 1ba9a338cefe3b80849538eae666af52ebfaeab4 Mon Sep 17 00:00:00 2001 From: Julian van der Horst Date: Thu, 29 Jan 2026 10:40:12 +0100 Subject: [PATCH 2/5] Upped version --- Cargo.toml | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index f44c363..95ef517 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "libpep" edition = "2021" -version = "0.10.0" +version = "0.10.1" authors = ["Bernard van Gastel ", "Job Doesburg "] homepage = "https://github.com/NOLAI/libpep" repository = "https://github.com/NOLAI/libpep" diff --git a/package.json b/package.json index 3dd50a1..74ef726 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@nolai/libpep-wasm", - "version": "0.10.0", + "version": "0.10.1", "description": "Library for polymorphic encryption and pseudonymization (in WASM)", "repository": { "type": "git", From 2dc1ce3c60933465306c1399f53151e740cec654 Mon Sep 17 00:00:00 2001 From: Julian van der Horst Date: Thu, 29 Jan 2026 10:41:01 +0100 Subject: [PATCH 3/5] Ran fmt --- src/lib/data/traits.rs | 3 +-- src/lib/transcryptor/prelude.rs | 2 +- src/lib/transcryptor/types.rs | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/lib/data/traits.rs b/src/lib/data/traits.rs index 4c20739..26c22fd 100644 --- a/src/lib/data/traits.rs +++ b/src/lib/data/traits.rs @@ -141,8 +141,7 @@ pub trait Pseudonymizable: Encrypted { /// ``` pub trait RekeyInfoSource { /// Get the rekey information for transcryption between encryption contexts. - fn rekey_info(&self, session_from: &EncryptionContext, session_to: &EncryptionContext) - -> Info; + fn rekey_info(&self, session_from: &EncryptionContext, session_to: &EncryptionContext) -> Info; } /// A trait for encrypted types that can be rekeyed (encryption context change). diff --git a/src/lib/transcryptor/prelude.rs b/src/lib/transcryptor/prelude.rs index bc1f98b..ffcaeff 100644 --- a/src/lib/transcryptor/prelude.rs +++ b/src/lib/transcryptor/prelude.rs @@ -2,6 +2,6 @@ pub use super::{pseudonymize, rekey, rerandomize, rerandomize_known, transcrypt, Transcryptor}; pub use crate::data::simple::{Attribute, EncryptedAttribute, EncryptedPseudonym, Pseudonym}; -pub use crate::data::traits::{Rekeyable, RekeyInfoSource}; +pub use crate::data::traits::{RekeyInfoSource, Rekeyable}; pub use crate::factors::contexts::{EncryptionContext, PseudonymizationDomain}; pub use crate::factors::{EncryptionSecret, PseudonymizationSecret, TranscryptionInfo}; diff --git a/src/lib/transcryptor/types.rs b/src/lib/transcryptor/types.rs index a6bfc5d..c8babab 100644 --- a/src/lib/transcryptor/types.rs +++ b/src/lib/transcryptor/types.rs @@ -1,6 +1,6 @@ //! Transcryptor type definitions. -use crate::data::traits::{Pseudonymizable, Rekeyable, RekeyInfoSource, Transcryptable}; +use crate::data::traits::{Pseudonymizable, RekeyInfoSource, Rekeyable, Transcryptable}; use crate::factors::contexts::*; use crate::factors::{ AttributeRekeyInfo, EncryptionSecret, PseudonymRekeyInfo, PseudonymizationInfo, From c72dd6a0c563b673e7c473e5e6c743ff4a2aaae2 Mon Sep 17 00:00:00 2001 From: Job Doesburg Date: Thu, 29 Jan 2026 11:38:32 +0100 Subject: [PATCH 4/5] Fix --- src/lib/data/traits.rs | 40 --------------------------------- src/lib/factors/mod.rs | 4 ++-- src/lib/factors/types.rs | 19 ++++++++++++++++ src/lib/transcryptor/prelude.rs | 2 +- src/lib/transcryptor/types.rs | 7 +++--- 5 files changed, 26 insertions(+), 46 deletions(-) diff --git a/src/lib/data/traits.rs b/src/lib/data/traits.rs index 26c22fd..447bb75 100644 --- a/src/lib/data/traits.rs +++ b/src/lib/data/traits.rs @@ -1,6 +1,5 @@ //! Core traits for encryption and decryption operations. -use crate::factors::contexts::EncryptionContext; use crate::factors::TranscryptionInfo; use crate::factors::{PseudonymizationInfo, RerandomizeFactor}; use rand_core::{CryptoRng, RngCore}; @@ -127,23 +126,6 @@ pub trait Pseudonymizable: Encrypted { fn pseudonymize(&self, info: &PseudonymizationInfo) -> Self; } -/// A trait for types that can provide rekey information for a specific rekey info type. -/// -/// This trait is parameterized by the rekey info type, allowing different implementations -/// for different encrypted types (e.g., `AttributeRekeyInfo` vs `PseudonymRekeyInfo`). -/// -/// # Examples -/// -/// ```rust,ignore -/// // Transcryptor implements RekeyInfoSource for both types -/// let attr_info: AttributeRekeyInfo = transcryptor.rekey_info(&from_ctx, &to_ctx); -/// let pseudo_info: PseudonymRekeyInfo = transcryptor.rekey_info(&from_ctx, &to_ctx); -/// ``` -pub trait RekeyInfoSource { - /// Get the rekey information for transcryption between encryption contexts. - fn rekey_info(&self, session_from: &EncryptionContext, session_to: &EncryptionContext) -> Info; -} - /// A trait for encrypted types that can be rekeyed (encryption context change). /// /// Rekeying changes the encryption context without changing the underlying value. @@ -155,28 +137,6 @@ pub trait Rekeyable: Encrypted { /// Rekey this encrypted value from one encryption context to another. fn rekey(&self, info: &Self::RekeyInfo) -> Self; - - /// Get the rekey information from a source (e.g., a PEP transcryptor) for transcryption between sessions. - /// - /// This is a convenience method that allows getting the appropriate rekey info type - /// automatically based on the encrypted type. - /// - /// # Examples - /// - /// ```rust,ignore - /// // For EncryptedAttribute, this returns AttributeRekeyInfo - /// let info = EncryptedAttribute::get_rekey_info(&transcryptor, &from_ctx, &to_ctx); - /// - /// // For EncryptedPseudonym, this returns PseudonymRekeyInfo - /// let info = EncryptedPseudonym::get_rekey_info(&transcryptor, &from_ctx, &to_ctx); - /// ``` - fn get_rekey_info>( - source: &S, - session_from: &EncryptionContext, - session_to: &EncryptionContext, - ) -> Self::RekeyInfo { - source.rekey_info(session_from, session_to) - } } /// A trait for encrypted types that can be transcrypted. diff --git a/src/lib/factors/mod.rs b/src/lib/factors/mod.rs index 0873d5a..4ab12eb 100644 --- a/src/lib/factors/mod.rs +++ b/src/lib/factors/mod.rs @@ -30,6 +30,6 @@ pub use secrets::{ }; pub use types::{ AttributeRekeyFactor, AttributeRekeyInfo, PseudonymRSKFactors, PseudonymRekeyFactor, - PseudonymRekeyInfo, PseudonymizationInfo, RekeyFactor, RerandomizeFactor, ReshuffleFactor, - TranscryptionInfo, + PseudonymRekeyInfo, PseudonymizationInfo, RekeyFactor, RekeyInfoProvider, RerandomizeFactor, + ReshuffleFactor, TranscryptionInfo, }; diff --git a/src/lib/factors/types.rs b/src/lib/factors/types.rs index e8ed982..5debeb5 100644 --- a/src/lib/factors/types.rs +++ b/src/lib/factors/types.rs @@ -2,6 +2,7 @@ use crate::arithmetic::scalars::ScalarNonZero; use derive_more::From; +use crate::factors::EncryptionContext; /// High-level type for the factor used to [`rerandomize`](crate::core::primitives::rerandomize) an [ElGamal](crate::core::elgamal::ElGamal) ciphertext. #[derive(Copy, Clone, Eq, PartialEq, Debug, From)] @@ -106,3 +107,21 @@ impl TranscryptionInfo { } } } + + +/// A trait for types that can provide rekey information for a specific rekey info type. +/// +/// This trait is parameterized by the rekey info type, allowing different implementations +/// for different encrypted types (e.g., `AttributeRekeyInfo` vs `PseudonymRekeyInfo`). +/// +/// # Examples +/// +/// ```rust,ignore +/// // Transcryptor implements RekeyInfoProvider for both types +/// let attr_info: AttributeRekeyInfo = transcryptor.rekey_info(&from_ctx, &to_ctx); +/// let pseudo_info: PseudonymRekeyInfo = transcryptor.rekey_info(&from_ctx, &to_ctx); +/// ``` +pub trait RekeyInfoProvider { + /// Get the rekey information for transcryption between encryption contexts. + fn rekey_info(&self, session_from: &EncryptionContext, session_to: &EncryptionContext) -> Info; +} diff --git a/src/lib/transcryptor/prelude.rs b/src/lib/transcryptor/prelude.rs index ffcaeff..0d44d1b 100644 --- a/src/lib/transcryptor/prelude.rs +++ b/src/lib/transcryptor/prelude.rs @@ -2,6 +2,6 @@ pub use super::{pseudonymize, rekey, rerandomize, rerandomize_known, transcrypt, Transcryptor}; pub use crate::data::simple::{Attribute, EncryptedAttribute, EncryptedPseudonym, Pseudonym}; -pub use crate::data::traits::{RekeyInfoSource, Rekeyable}; +pub use crate::data::traits::{Rekeyable}; pub use crate::factors::contexts::{EncryptionContext, PseudonymizationDomain}; pub use crate::factors::{EncryptionSecret, PseudonymizationSecret, TranscryptionInfo}; diff --git a/src/lib/transcryptor/types.rs b/src/lib/transcryptor/types.rs index c8babab..1f5d24c 100644 --- a/src/lib/transcryptor/types.rs +++ b/src/lib/transcryptor/types.rs @@ -1,12 +1,13 @@ //! Transcryptor type definitions. -use crate::data::traits::{Pseudonymizable, RekeyInfoSource, Rekeyable, Transcryptable}; +use crate::data::traits::{Pseudonymizable, Rekeyable, Transcryptable}; use crate::factors::contexts::*; use crate::factors::{ AttributeRekeyInfo, EncryptionSecret, PseudonymRekeyInfo, PseudonymizationInfo, PseudonymizationSecret, TranscryptionInfo, }; use rand_core::{CryptoRng, RngCore}; +use crate::factors::types::RekeyInfoProvider; /// A PEP transcryptor system that can pseudonymize and rekey data, based on /// a pseudonymisation secret and a rekeying secret. @@ -185,7 +186,7 @@ impl Transcryptor { } } -impl RekeyInfoSource for Transcryptor { +impl RekeyInfoProvider for Transcryptor { fn rekey_info( &self, session_from: &EncryptionContext, @@ -195,7 +196,7 @@ impl RekeyInfoSource for Transcryptor { } } -impl RekeyInfoSource for Transcryptor { +impl RekeyInfoProvider for Transcryptor { fn rekey_info( &self, session_from: &EncryptionContext, From d0b50c5888cc9b1882732f603241806a18ed472e Mon Sep 17 00:00:00 2001 From: Job Doesburg Date: Thu, 29 Jan 2026 11:41:16 +0100 Subject: [PATCH 5/5] Fix cargo --- src/lib/factors/mod.rs | 1 - src/lib/factors/types.rs | 3 +-- src/lib/transcryptor/prelude.rs | 2 +- src/lib/transcryptor/types.rs | 2 +- 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/lib/factors/mod.rs b/src/lib/factors/mod.rs index 4ab12eb..6b8c730 100644 --- a/src/lib/factors/mod.rs +++ b/src/lib/factors/mod.rs @@ -10,7 +10,6 @@ //! - [`contexts`]: Context types (PseudonymizationDomain, EncryptionContext) //! - [`secrets`]: Secret types (PseudonymizationSecret, EncryptionSecret) //! - [`types`]: Factor types and Info type aliases -//! - [`derivation`]: Functions for deriving factors from contexts and secrets pub mod contexts; pub mod secrets; diff --git a/src/lib/factors/types.rs b/src/lib/factors/types.rs index 5debeb5..29219bc 100644 --- a/src/lib/factors/types.rs +++ b/src/lib/factors/types.rs @@ -1,8 +1,8 @@ //! Cryptographic factor types for rerandomization, reshuffling, and rekeying operations. use crate::arithmetic::scalars::ScalarNonZero; -use derive_more::From; use crate::factors::EncryptionContext; +use derive_more::From; /// High-level type for the factor used to [`rerandomize`](crate::core::primitives::rerandomize) an [ElGamal](crate::core::elgamal::ElGamal) ciphertext. #[derive(Copy, Clone, Eq, PartialEq, Debug, From)] @@ -108,7 +108,6 @@ impl TranscryptionInfo { } } - /// A trait for types that can provide rekey information for a specific rekey info type. /// /// This trait is parameterized by the rekey info type, allowing different implementations diff --git a/src/lib/transcryptor/prelude.rs b/src/lib/transcryptor/prelude.rs index 0d44d1b..e54f6b2 100644 --- a/src/lib/transcryptor/prelude.rs +++ b/src/lib/transcryptor/prelude.rs @@ -2,6 +2,6 @@ pub use super::{pseudonymize, rekey, rerandomize, rerandomize_known, transcrypt, Transcryptor}; pub use crate::data::simple::{Attribute, EncryptedAttribute, EncryptedPseudonym, Pseudonym}; -pub use crate::data::traits::{Rekeyable}; +pub use crate::data::traits::Rekeyable; pub use crate::factors::contexts::{EncryptionContext, PseudonymizationDomain}; pub use crate::factors::{EncryptionSecret, PseudonymizationSecret, TranscryptionInfo}; diff --git a/src/lib/transcryptor/types.rs b/src/lib/transcryptor/types.rs index 1f5d24c..105d0de 100644 --- a/src/lib/transcryptor/types.rs +++ b/src/lib/transcryptor/types.rs @@ -2,12 +2,12 @@ use crate::data::traits::{Pseudonymizable, Rekeyable, Transcryptable}; use crate::factors::contexts::*; +use crate::factors::types::RekeyInfoProvider; use crate::factors::{ AttributeRekeyInfo, EncryptionSecret, PseudonymRekeyInfo, PseudonymizationInfo, PseudonymizationSecret, TranscryptionInfo, }; use rand_core::{CryptoRng, RngCore}; -use crate::factors::types::RekeyInfoProvider; /// A PEP transcryptor system that can pseudonymize and rekey data, based on /// a pseudonymisation secret and a rekeying secret.