use crate::api::{ApiError, PseudonymServiceErrorHandler};
use libpep::data::simple::{EncryptedPseudonym, Pseudonym};
use libpep::factors::PseudonymizationDomain;
use paas_client::pseudonym_service::PseudonymService;
use paas_client::sessions::EncryptionContexts;
use rand::{CryptoRng, Rng};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PEPParticipantInfo {
pub encrypted_pseudonym: EncryptedPseudonym,
pub sessions: EncryptionContexts,
pub domain_from: PseudonymizationDomain,
}
#[derive(Debug, Clone)]
pub struct ParticipantInfo {
pub pseudonym: Pseudonym,
pub domain: PseudonymizationDomain,
}
impl PEPParticipantInfo {
pub async fn decrypt(
&self,
ps: &mut PseudonymService,
domain_to: PseudonymizationDomain,
) -> Result<ParticipantInfo, ApiError> {
let transcrypted = ps
.pseudonymize(
&self.encrypted_pseudonym,
&self.sessions,
&self.domain_from,
&domain_to,
)
.await
.handle_pseudonym_error()?;
let pseudonym = ps.decrypt(&transcrypted).handle_pseudonym_error()?;
Ok(ParticipantInfo {
domain: domain_to,
pseudonym,
})
}
}
impl ParticipantInfo {
pub async fn encrypt<R: Rng + CryptoRng>(
&self,
ps: &mut PseudonymService,
mut rng: R,
) -> Result<PEPParticipantInfo, ApiError> {
let (encrypted_pseudonym, sessions) = ps
.encrypt(&self.pseudonym, &mut rng)
.handle_pseudonym_error()?;
Ok(PEPParticipantInfo {
encrypted_pseudonym,
sessions,
domain_from: self.domain.clone(),
})
}
}