1use crate::artifacts::{PublicKey, SigningKey, SigningKeyExt, UserSecretKey, VerifyingKey};
4use crate::identity::{Attribute, EncryptionPolicy, Policy};
5use ibe::kem::cgw_kv::CGWKV;
6use ibe::kem::IBKEM;
7use rand::{CryptoRng, Rng};
8
9use alloc::string::String;
10use alloc::vec::Vec;
11
12#[derive(Debug)]
14pub struct TestSetup {
15 pub ibe_pk: PublicKey<CGWKV>,
17
18 pub ibs_pk: VerifyingKey,
20
21 pub policies: Vec<Policy>,
23
24 pub usks: Vec<UserSecretKey<CGWKV>>,
26
27 pub signing_keys: Vec<SigningKeyExt>,
29
30 pub policy: EncryptionPolicy,
32}
33
34impl TestSetup {
35 pub fn new<R: Rng + CryptoRng>(rng: &mut R) -> Self {
37 let (ibe_pk, ibe_msk) = ibe::kem::cgw_kv::CGWKV::setup(rng);
38 let (ibs_pk, ibs_sk) = ibs::gg::setup(rng);
39
40 let ibe_pk = PublicKey::<CGWKV>(ibe_pk);
41 let ibs_pk = VerifyingKey(ibs_pk);
42
43 let id2 = String::from("Bob");
45 let id3 = String::from("Charlie");
46
47 let policies = vec![
49 Policy {
51 timestamp: 1566722350,
52 con: vec![Attribute::new(
53 "pbdf.sidn-pbdf.email.email",
54 Some("alice@example.com"),
55 )],
56 }, Policy {
58 timestamp: 1566722350,
59 con: vec![Attribute::new(
60 "pbdf.gemeente.personalData.bsn",
61 Some("<Alice's social security number>"),
62 )],
63 }, Policy {
65 timestamp: 1566722350,
66 con: vec![
67 Attribute::new("pbdf.gemeente.personalData.name", Some("Bob")),
68 Attribute::new("pbdf.sidn-pbdf.email.email", Some("bob@example.com")),
69 ],
70 }, Policy {
72 timestamp: 1566722350,
73 con: vec![
74 Attribute::new("pbdf.gemeente.personalData.name", Some("Charlie")),
75 Attribute::new("pbdf.sidn-pbdf.email.email", Some("charlie@example.com")),
76 ],
77 }, Policy {
79 timestamp: 1566722350,
80 con: vec![Attribute::new(
81 "pbdf.gemeente.personalData.name",
82 Some("Charlie"),
83 )],
84 },
85 Policy {
87 timestamp: 0,
88 con: vec![Attribute::new("default", Some("Default"))],
89 },
90 ];
91
92 let policy =
94 EncryptionPolicy::from([(id2, policies[2].clone()), (id3, policies[3].clone())]);
95
96 let usks = policies
98 .iter()
99 .map(|pol| {
100 let derived = pol.derive_kem::<CGWKV>().unwrap();
101 let usk = CGWKV::extract_usk(Some(&ibe_pk.0), &ibe_msk, &derived, rng);
102 UserSecretKey::<CGWKV>(usk)
103 })
104 .collect();
105
106 let signing_keys = policies
108 .iter()
109 .map(|pol| {
110 let derived = pol.derive_ibs().unwrap();
111 let signing_key = ibs::gg::keygen(&ibs_sk, &derived, rng);
112
113 SigningKeyExt {
114 key: SigningKey(signing_key),
115 policy: pol.clone(),
116 }
117 })
118 .collect();
119
120 TestSetup {
121 ibe_pk,
122 ibs_pk,
123 policies,
124 usks,
125 signing_keys,
126 policy,
127 }
128 }
129}