crew_rs/
member.rs

1use std::rc::Rc;
2
3use crate::changes::CrewChange;
4use crate::{tx::CrewChangeTx, tx::CrewChangeTxContent};
5use litl::impl_debug_as_litl;
6use ridl::{
7    asymm_encr::{AsymmDecryptionError, EncrFromAnon, RecipientID, RecipientSecret},
8    signing::{SignerID, SignerSecret},
9    symm_encr::KeySecret,
10};
11use serde::{de::DeserializeOwned, Serialize};
12use serde_derive::{Deserialize, Serialize};
13
14#[derive(Serialize, Deserialize)]
15pub struct MemberCredentialInner {
16    pub signer: SignerSecret,
17    pub recipient: RecipientSecret,
18}
19impl_debug_as_litl!(MemberCredentialInner);
20
21#[derive(Clone, Serialize, Deserialize)]
22#[serde(transparent)]
23pub struct MemberCredential(
24    #[serde(with = "ser_rc")]
25    Rc<MemberCredentialInner>
26);
27impl_debug_as_litl!(MemberCredential);
28
29impl MemberCredential {
30    pub fn literally_everyone() -> Self {
31        MemberCredential(Rc::new(MemberCredentialInner {
32            signer: SignerSecret::everyone(),
33            recipient: RecipientSecret::everyone(),
34        }))
35    }
36    pub fn new_random() -> Self {
37        MemberCredential(Rc::new(MemberCredentialInner {
38            signer: SignerSecret::new_random(),
39            recipient: RecipientSecret::new_random(),
40        }))
41    }
42
43    pub fn pub_id(&self) -> Member {
44        Member {
45            signer: self.0.signer.pub_id(),
46            recipient: self.0.recipient.pub_id(),
47        }
48    }
49
50    pub fn sign_tx<I: IntoIterator<Item = CrewChange>>(&self, changes: I) -> CrewChangeTx {
51        CrewChangeTx {
52            content: self.0.signer.sign(CrewChangeTxContent {
53                changes: changes.into_iter().collect(),
54                made_at: ti64::now(),
55            }),
56            by: self.0.signer.pub_id(),
57        }
58    }
59
60    pub fn decrypt_secret(
61        &self,
62        encr: &EncrFromAnon<KeySecret>,
63    ) -> Result<KeySecret, AsymmDecryptionError> {
64        self.0.recipient.decrypt(encr)
65    }
66
67    pub fn signer(&self) -> &SignerSecret {
68        &self.0.signer
69    }
70}
71
72#[derive(Clone, Hash, Serialize, PartialEq, Eq, Deserialize)]
73pub struct Member {
74    pub signer: SignerID,
75    pub recipient: RecipientID,
76}
77impl_debug_as_litl!(Member);
78
79impl Member {
80    pub fn encrypt_from_anon<T: Serialize + DeserializeOwned>(&self, data: &T) -> EncrFromAnon<T> {
81        self.recipient.encrypt_from_anon(data)
82    }
83
84    pub fn literally_everyone() -> Member {
85        Member { signer: SignerSecret::everyone().pub_id(), recipient: RecipientSecret::everyone().pub_id()}
86    }
87}
88
89mod ser_rc {
90    use serde::{Deserialize, Deserializer, Serialize, Serializer};
91    use std::rc::Rc;
92
93    pub fn serialize<S, T>(value: &Rc<T>, serializer: S) -> Result<S::Ok, S::Error>
94    where
95        S: Serializer,
96        T: Serialize,
97    {
98        value.as_ref().serialize(serializer)
99    }
100
101    pub fn deserialize<'de, D, T>(deserializer: D) -> Result<Rc<T>, D::Error>
102    where
103        D: Deserializer<'de>,
104        T: Deserialize<'de>,
105    {
106        Ok(Rc::new(T::deserialize(deserializer)?))
107    }
108}