use super::PKEncryptionSchemeMut;
use crate::{identity_based_encryption::IBEScheme, signature::SignatureScheme};
use qfall_math::integer::Z;
use serde::{Deserialize, Serialize};
pub mod dual_regev_ibe_pfdh;
#[derive(Serialize, Deserialize, Clone)]
pub struct CCSfromIBE<IBE: IBEScheme, Signature: SignatureScheme>
where
IBE::Cipher: ToString,
{
pub ibe: IBE,
pub signature: Signature,
}
impl<IBE, Signature> PKEncryptionSchemeMut for CCSfromIBE<IBE, Signature>
where
IBE: IBEScheme,
Signature: SignatureScheme,
IBE::Cipher: ToString,
IBE::MasterPublicKey: Clone,
Signature::PublicKey: Into<IBE::Identity> + Clone,
{
type Cipher = (Signature::PublicKey, IBE::Cipher, Signature::Signature);
type PublicKey = IBE::MasterPublicKey;
type SecretKey = (IBE::MasterPublicKey, IBE::MasterSecretKey);
fn key_gen(&mut self) -> (Self::PublicKey, Self::SecretKey) {
let (pk, sk) = self.ibe.setup();
(pk.clone(), (pk, sk))
}
fn enc(&mut self, pk: &Self::PublicKey, message: impl Into<Z>) -> Self::Cipher {
let (vrfy_key, sign_key) = self.signature.key_gen();
let c = self.ibe.enc(pk, &vrfy_key.clone().into(), message);
let sigma = self.signature.sign(c.to_string(), &sign_key, &vrfy_key);
(vrfy_key, c, sigma)
}
fn dec(&mut self, sk: &Self::SecretKey, cipher: &Self::Cipher) -> Z {
if !self
.signature
.vfy(cipher.1.to_string(), &cipher.2, &cipher.0)
{
return Z::MINUS_ONE;
}
let secret = self.ibe.extract(&sk.0, &sk.1, &cipher.0.clone().into());
self.ibe.dec(&secret, &cipher.1)
}
}