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", diff --git a/src/lib/factors/mod.rs b/src/lib/factors/mod.rs index 0873d5a..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; @@ -30,6 +29,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..29219bc 100644 --- a/src/lib/factors/types.rs +++ b/src/lib/factors/types.rs @@ -1,6 +1,7 @@ //! Cryptographic factor types for rerandomization, reshuffling, and rekeying operations. use crate::arithmetic::scalars::ScalarNonZero; +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. @@ -106,3 +107,20 @@ 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 461f610..e54f6b2 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; 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..105d0de 100644 --- a/src/lib/transcryptor/types.rs +++ b/src/lib/transcryptor/types.rs @@ -2,6 +2,7 @@ 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, @@ -184,3 +185,23 @@ impl Transcryptor { super::batch::transcrypt_batch(encrypted, transcryption_info, rng) } } + +impl RekeyInfoProvider for Transcryptor { + fn rekey_info( + &self, + session_from: &EncryptionContext, + session_to: &EncryptionContext, + ) -> AttributeRekeyInfo { + self.attribute_rekey_info(session_from, session_to) + } +} + +impl RekeyInfoProvider for Transcryptor { + fn rekey_info( + &self, + session_from: &EncryptionContext, + session_to: &EncryptionContext, + ) -> PseudonymRekeyInfo { + self.pseudonym_rekey_info(session_from, session_to) + } +}