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}