use crate::artifacts::{PublicKey, SigningKey, SigningKeyExt, UserSecretKey, VerifyingKey};
use crate::identity::{Attribute, EncryptionPolicy, Policy};
use ibe::kem::cgw_kv::CGWKV;
use ibe::kem::IBKEM;
use rand::{CryptoRng, Rng};
use alloc::string::String;
use alloc::vec::Vec;
#[derive(Debug)]
pub struct TestSetup {
pub ibe_pk: PublicKey<CGWKV>,
pub ibs_pk: VerifyingKey,
pub policies: Vec<Policy>,
pub usks: Vec<UserSecretKey<CGWKV>>,
pub signing_keys: Vec<SigningKeyExt>,
pub policy: EncryptionPolicy,
}
impl TestSetup {
pub fn new<R: Rng + CryptoRng>(rng: &mut R) -> Self {
let (ibe_pk, ibe_msk) = ibe::kem::cgw_kv::CGWKV::setup(rng);
let (ibs_pk, ibs_sk) = ibs::gg::setup(rng);
let ibe_pk = PublicKey::<CGWKV>(ibe_pk);
let ibs_pk = VerifyingKey(ibs_pk);
let id2 = String::from("Bob");
let id3 = String::from("Charlie");
let policies = vec![
Policy {
timestamp: 1566722350,
con: vec![Attribute::new(
"pbdf.sidn-pbdf.email.email",
Some("alice@example.com"),
)],
}, Policy {
timestamp: 1566722350,
con: vec![Attribute::new(
"pbdf.gemeente.personalData.bsn",
Some("<Alice's social security number>"),
)],
}, Policy {
timestamp: 1566722350,
con: vec![
Attribute::new("pbdf.gemeente.personalData.name", Some("Bob")),
Attribute::new("pbdf.sidn-pbdf.email.email", Some("bob@example.com")),
],
}, Policy {
timestamp: 1566722350,
con: vec![
Attribute::new("pbdf.gemeente.personalData.name", Some("Charlie")),
Attribute::new("pbdf.sidn-pbdf.email.email", Some("charlie@example.com")),
],
}, Policy {
timestamp: 1566722350,
con: vec![Attribute::new(
"pbdf.gemeente.personalData.name",
Some("Charlie"),
)],
},
Policy {
timestamp: 0,
con: vec![Attribute::new("default", Some("Default"))],
},
];
let policy =
EncryptionPolicy::from([(id2, policies[2].clone()), (id3, policies[3].clone())]);
let usks = policies
.iter()
.map(|pol| {
let derived = pol.derive_kem::<CGWKV>().unwrap();
let usk = CGWKV::extract_usk(Some(&ibe_pk.0), &ibe_msk, &derived, rng);
UserSecretKey::<CGWKV>(usk)
})
.collect();
let signing_keys = policies
.iter()
.map(|pol| {
let derived = pol.derive_ibs().unwrap();
let signing_key = ibs::gg::keygen(&ibs_sk, &derived, rng);
SigningKeyExt {
key: SigningKey(signing_key),
policy: pol.clone(),
}
})
.collect();
TestSetup {
ibe_pk,
ibs_pk,
policies,
usks,
signing_keys,
policy,
}
}
}