1use rand::rngs::StdRng;
5use rand_core::CryptoRngCore;
6
7use reach_attestant::{
8 macros::shared_keys_random_from_rng,
9 memory::{
10 AttestantSigningKeys, UnsignedSalts, UnsignedSharedPublicKeys, UnsignedSharedSecretKeys,
11 UnsignedSharedSigningKeys, UnsignedSharedVerifyingKeys,
12 },
13};
14use reach_core::{
15 RandomFromRng,
16 memory::{SharedSecretKeys, SharedSigningKeys},
17 storage::UnsignedReachableVerifyingKeys,
18 wire::{
19 AttestantVerifyingKeys, ReachablePublicKeys, ReachableVerifyingKeys, Salts,
20 SharedPublicKeys, SharedVerifyingKeys,
21 },
22};
23use reach_signatures::*;
24use reachable_secrets::memory::{
25 ReachableSecretKeys, ReachableSigningKeys, UnsignedReachablePublicKeys,
26};
27
28pub struct Instance {
29 pub rng: StdRng,
30 pub attestant_signing_keys: AttestantSigningKeys,
31 pub attestant_verifying_keys: AttestantVerifyingKeys,
32 pub salts: Salts,
33 pub shared_signing_keys: SharedSigningKeys,
34 pub shared_verifying_keys: SharedVerifyingKeys,
35 pub shared_secret_keys: SharedSecretKeys,
36 pub shared_public_keys: SharedPublicKeys,
37 pub reachable_signing_keys: Vec<ReachableSigningKeys>,
38 pub reachable_verifying_keys: Vec<ReachableVerifyingKeys>,
39 pub reachable_secret_keys: Vec<Vec<ReachableSecretKeys>>,
40 pub reachable_public_keys: Vec<Vec<ReachablePublicKeys>>,
41}
42
43impl Default for Instance {
44 fn default() -> Self {
45 const AMOUNT: usize = 10;
46
47 let mut rng = crate::seeded_rng(0);
48 let csprng = &mut rng;
49
50 let attestant_signing_keys = AttestantSigningKeys::random_from_rng(csprng);
51 let attestant_verifying_keys = AttestantVerifyingKeys::from(&attestant_signing_keys);
52
53 let unsigned_salts = UnsignedSalts::random_from_rng(csprng);
54 let salts = attestant_signing_keys.sign(unsigned_salts, csprng);
55
56 let (shared_secret_keys, shared_public_keys) = shared_keys_random_from_rng!(
57 attestant_signing_keys,
58 UnsignedSharedSecretKeys,
59 UnsignedSharedPublicKeys,
60 csprng,
61 );
62 let (shared_signing_keys, shared_verifying_keys) = shared_keys_random_from_rng!(
63 attestant_signing_keys,
64 UnsignedSharedSigningKeys,
65 UnsignedSharedVerifyingKeys,
66 csprng,
67 );
68
69 let (reachable_signing_keys, unsigned_reachable_verifying_keys) =
70 pending_reachable_peers(AMOUNT, csprng);
71 let reachable_verifying_keys = unsigned_reachable_verifying_keys
72 .into_iter()
73 .map(|urvk| attestant_signing_keys.sign(urvk, csprng))
74 .collect();
75
76 let (reachable_secret_keys, reachable_public_keys) = reachable_signing_keys
77 .iter()
78 .map(|rsk| reachable_encryption_keys(AMOUNT, rsk, csprng))
79 .collect();
80
81 Self {
82 rng,
83 attestant_signing_keys,
84 attestant_verifying_keys,
85 salts,
86 shared_signing_keys,
87 shared_verifying_keys,
88 shared_secret_keys,
89 shared_public_keys,
90 reachable_signing_keys,
91 reachable_verifying_keys,
92 reachable_secret_keys,
93 reachable_public_keys,
94 }
95 }
96}
97
98pub fn pending_reachable_peers(
99 amount: usize,
100 csprng: &mut impl CryptoRngCore,
101) -> (
102 Vec<ReachableSigningKeys>,
103 Vec<UnsignedReachableVerifyingKeys>,
104) {
105 (0..amount)
106 .map(|_| {
107 let signing = ReachableSigningKeys::random_from_rng(csprng);
108 let verifying = UnsignedReachableVerifyingKeys::from(&signing);
109
110 (signing, verifying)
111 })
112 .collect()
113}
114
115pub fn reachable_encryption_keys(
116 amount: usize,
117 reachable_signing_keys: &ReachableSigningKeys,
118 csprng: &mut impl CryptoRngCore,
119) -> (Vec<ReachableSecretKeys>, Vec<ReachablePublicKeys>) {
120 (0..amount)
121 .map(|_| {
122 let secret = ReachableSecretKeys::random_from_rng(csprng);
123 let public = UnsignedReachablePublicKeys::from(&secret);
124
125 (secret, reachable_signing_keys.sign(public, csprng))
126 })
127 .collect()
128}