reach_harness/
dummy.rs

1// SPDX-FileCopyrightText: 2023—2025 eaon <eaon@posteo.net>
2// SPDX-License-Identifier: EUPL-1.2
3
4use 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}