lair_keystore_api/lair_api/
derive_seed.rs

1use super::*;
2
3/// Derive a new lair seed from an existing seed.
4#[derive(Debug, serde::Serialize, serde::Deserialize)]
5#[serde(rename_all = "camelCase")]
6pub struct LairApiReqDeriveSeed {
7    /// Msg id to relate request / response.
8    pub msg_id: Arc<str>,
9
10    /// Tag of existing seed.
11    pub src_tag: Arc<str>,
12
13    /// If source seed is deep-locked, this passphrase will unlock it.
14    #[serde(skip_serializing_if = "Option::is_none", default)]
15    pub src_deep_lock_passphrase: Option<DeepLockPassphrase>,
16
17    /// Tag under which to store derived seed.
18    pub dst_tag: Arc<str>,
19
20    /// Optional passphrase with which to deep-lock derived seed.
21    #[serde(skip_serializing_if = "Option::is_none", default)]
22    pub dst_deep_lock_passphrase: Option<DeepLockPassphrase>,
23
24    /// The hierarchy of nested derivations.
25    /// For instance, [99, 1, 42] would specify that the destination seed is the
26    /// 42nd derivation of the 1st derivation of the 99th derivation of the source seed.    
27    pub derivation_path: Box<[u32]>,
28}
29
30impl LairApiReqDeriveSeed {
31    /// Make a new list entries request.
32    pub fn new(
33        src_tag: Arc<str>,
34        src_deep_lock_passphrase: Option<DeepLockPassphrase>,
35        dst_tag: Arc<str>,
36        dst_deep_lock_passphrase: Option<DeepLockPassphrase>,
37        derivation_path: Box<[u32]>,
38    ) -> Self {
39        Self {
40            msg_id: new_msg_id(),
41            src_tag,
42            src_deep_lock_passphrase,
43            dst_tag,
44            dst_deep_lock_passphrase,
45            derivation_path,
46        }
47    }
48}
49
50impl std::convert::TryFrom<LairApiEnum> for LairApiReqDeriveSeed {
51    type Error = one_err::OneErr;
52
53    fn try_from(e: LairApiEnum) -> Result<Self, Self::Error> {
54        if let LairApiEnum::ReqDeriveSeed(s) = e {
55            Ok(s)
56        } else {
57            Err(format!("Invalid response type: {e:?}").into())
58        }
59    }
60}
61
62impl AsLairCodec for LairApiReqDeriveSeed {
63    fn into_api_enum(self) -> LairApiEnum {
64        LairApiEnum::ReqDeriveSeed(self)
65    }
66}
67
68/// Response to a ReqDeriveSeed request.
69#[derive(Debug, serde::Serialize, serde::Deserialize)]
70#[serde(rename_all = "camelCase")]
71pub struct LairApiResDeriveSeed {
72    /// Msg id to relate request / response.
73    pub msg_id: Arc<str>,
74
75    /// The seed info associated with this seed.
76    pub seed_info: SeedInfo,
77}
78
79impl std::convert::TryFrom<LairApiEnum> for LairApiResDeriveSeed {
80    type Error = one_err::OneErr;
81
82    fn try_from(e: LairApiEnum) -> Result<Self, Self::Error> {
83        if let LairApiEnum::ResDeriveSeed(s) = e {
84            Ok(s)
85        } else {
86            Err(format!("Invalid response type: {e:?}").into())
87        }
88    }
89}
90
91impl AsLairCodec for LairApiResDeriveSeed {
92    fn into_api_enum(self) -> LairApiEnum {
93        LairApiEnum::ResDeriveSeed(self)
94    }
95}
96
97impl AsLairRequest for LairApiReqDeriveSeed {
98    type Response = LairApiResDeriveSeed;
99}
100
101impl AsLairResponse for LairApiResDeriveSeed {
102    type Request = LairApiReqDeriveSeed;
103}