Skip to main content

coven_protocol/
recovery.rs

1//! Durable recovery authority: the exact continuation or Owner-recovery state
2//! a restore proves before it may rebuild a device.
3
4use serde::{Deserialize, Serialize};
5
6/// The closed authority a restore operation may exercise.
7#[derive(Clone, Serialize, Deserialize)]
8#[serde(rename_all = "snake_case", deny_unknown_fields)]
9pub enum RestoreAuthority {
10    /// Continue one exact, already-activated Store device.
11    ActivatedContinuation(ActivatedContinuation),
12    /// Recover an Owner identity at its exact root-anchored recovery cursor.
13    OwnerRecovery(OwnerRecoveryAuthority),
14}
15
16/// Exact durable state required to continue an activated Store device.
17#[derive(Clone, Serialize, Deserialize)]
18#[serde(deny_unknown_fields)]
19pub struct ActivatedContinuation {
20    pub identity_signing_secret: String,
21    pub device_signing_secret: String,
22    pub registration: crate::store_commit::StoreDeviceRegistrationRef,
23    pub registration_bytes: Vec<u8>,
24    pub registration_prepared: crate::objects::PreparedExactObject,
25    pub initial_ack: crate::store_commit::StoreAckRef,
26    pub initial_ack_bytes: Vec<u8>,
27    pub initial_ack_prepared: crate::objects::PreparedExactObject,
28    pub activation: crate::store_commit::StoreDeviceRegistrationActivation,
29    pub latest_ack: crate::store_commit::StoreAckRef,
30    pub latest_position: Option<crate::store_commit::StoreBatchCommitRef>,
31}
32
33/// Exact Owner grant and recovery-stream authority used to create a replacement
34/// device when no activated device continuation survives.
35#[derive(Clone, Serialize, Deserialize)]
36#[serde(deny_unknown_fields)]
37pub struct OwnerRecoveryAuthority {
38    pub owner_identity_secret: String,
39    pub owner_grant: crate::membership::MembershipGrantId,
40    pub recovery: crate::store_commit::OwnerRecoveryCursor,
41    pub published_at: String,
42}
43
44impl std::fmt::Debug for RestoreAuthority {
45    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
46        match self {
47            Self::ActivatedContinuation(value) => f
48                .debug_struct("ActivatedContinuation")
49                .field("identity_signing_secret", &"<redacted>")
50                .field("device_signing_secret", &"<redacted>")
51                .field("registration", &value.registration)
52                .field("initial_ack", &value.initial_ack)
53                .field("activation", &value.activation)
54                .field("latest_ack", &value.latest_ack)
55                .field("latest_position", &value.latest_position)
56                .finish(),
57            Self::OwnerRecovery(value) => f
58                .debug_struct("OwnerRecovery")
59                .field("owner_identity_secret", &"<redacted>")
60                .field("owner_grant", &value.owner_grant)
61                .field("recovery", &value.recovery)
62                .finish(),
63        }
64    }
65}