sentc_crypto/entities/
user.rs

1use alloc::string::{String, ToString};
2use alloc::vec::Vec;
3
4use sentc_crypto_common::group::GroupHmacData;
5use sentc_crypto_common::user::{UserPublicKeyData, UserVerifyKeyData};
6use sentc_crypto_common::{DeviceId, SymKeyId, UserId};
7use sentc_crypto_utils::cryptomat::{PkWrapper, SignKWrapper, SkWrapper, SymKeyWrapper, VerifyKWrapper};
8pub use sentc_crypto_utils::user::DeviceKeyDataExport;
9use sentc_crypto_utils::user::DeviceKeyDataInt;
10use serde::{Deserialize, Serialize};
11
12use crate::entities::group::GroupOutDataHmacKeyExport;
13use crate::{sdk_utils, SdkError};
14
15pub struct UserKeyDataInt<S: SymKeyWrapper, Sk: SkWrapper, Pk: PkWrapper, SiK: SignKWrapper, Vk: VerifyKWrapper>
16{
17	pub group_key: S,
18	pub private_key: Sk,
19	pub public_key: Pk,
20	pub time: u128,
21	pub sign_key: SiK,
22	pub verify_key: Vk,
23	pub exported_public_key: UserPublicKeyData,
24	pub exported_verify_key: UserVerifyKeyData,
25}
26
27pub struct UserDataInt<S: SymKeyWrapper, Sk: SkWrapper, Pk: PkWrapper, SiK: SignKWrapper, Vk: VerifyKWrapper>
28{
29	pub jwt: String,
30	pub refresh_token: String,
31	pub user_id: UserId,
32	pub device_id: DeviceId,
33
34	pub user_keys: Vec<UserKeyDataInt<S, Sk, Pk, SiK, Vk>>,
35	pub device_keys: DeviceKeyDataInt<Sk, Pk, SiK, Vk>,
36	pub hmac_keys: Vec<GroupHmacData>,
37}
38
39//==================================================================================================
40//export
41
42#[derive(Serialize, Deserialize)]
43pub struct UserKeyDataExport
44{
45	pub private_key: String,
46	pub public_key: String,
47	pub group_key: String,
48	pub time: u128,
49	pub group_key_id: SymKeyId,
50	pub sign_key: String,
51	pub verify_key: String,
52	pub exported_public_key: String,
53	pub exported_public_key_sig_key_id: Option<String>,
54	pub exported_verify_key: String,
55}
56
57impl<S: SymKeyWrapper, Sk: SkWrapper, Pk: PkWrapper, SiK: SignKWrapper, Vk: VerifyKWrapper> TryFrom<UserKeyDataInt<S, Sk, Pk, SiK, Vk>>
58	for UserKeyDataExport
59{
60	type Error = SdkError;
61
62	fn try_from(value: UserKeyDataInt<S, Sk, Pk, SiK, Vk>) -> Result<Self, Self::Error>
63	{
64		let group_key_id = value.group_key.get_id().to_string();
65
66		Ok(Self {
67			private_key: value.private_key.to_string()?,
68			public_key: value.public_key.to_string()?,
69			group_key_id,
70			group_key: value.group_key.to_string()?,
71			time: value.time,
72			sign_key: value.sign_key.to_string()?,
73			verify_key: value.verify_key.to_string()?,
74			exported_public_key: value
75				.exported_public_key
76				.to_string()
77				.map_err(|_e| SdkError::JsonToStringFailed)?,
78			exported_public_key_sig_key_id: value.exported_public_key.public_key_sig_key_id,
79			exported_verify_key: value
80				.exported_verify_key
81				.to_string()
82				.map_err(|_e| SdkError::JsonToStringFailed)?,
83		})
84	}
85}
86
87impl<'a, S: SymKeyWrapper, Sk: SkWrapper, Pk: PkWrapper, SiK: SignKWrapper, Vk: VerifyKWrapper> TryFrom<&'a UserKeyDataInt<S, Sk, Pk, SiK, Vk>>
88	for UserKeyDataExport
89{
90	type Error = SdkError;
91
92	fn try_from(value: &'a UserKeyDataInt<S, Sk, Pk, SiK, Vk>) -> Result<Self, Self::Error>
93	{
94		let group_key_id = value.group_key.get_id().to_string();
95
96		Ok(Self {
97			private_key: value.private_key.to_string_ref()?,
98			public_key: value.public_key.to_string_ref()?,
99			group_key_id,
100			group_key: value.group_key.to_string_ref()?,
101			time: value.time,
102			sign_key: value.sign_key.to_string_ref()?,
103			verify_key: value.verify_key.to_string_ref()?,
104			exported_public_key: value
105				.exported_public_key
106				.to_string()
107				.map_err(|_e| SdkError::JsonToStringFailed)?,
108			exported_public_key_sig_key_id: value.exported_public_key.public_key_sig_key_id.clone(),
109			exported_verify_key: value
110				.exported_verify_key
111				.to_string()
112				.map_err(|_e| SdkError::JsonToStringFailed)?,
113		})
114	}
115}
116
117impl<S: SymKeyWrapper, Sk: SkWrapper, Pk: PkWrapper, SiK: SignKWrapper, Vk: VerifyKWrapper> TryInto<UserKeyDataInt<S, Sk, Pk, SiK, Vk>>
118	for UserKeyDataExport
119{
120	type Error = SdkError;
121
122	fn try_into(self) -> Result<UserKeyDataInt<S, Sk, Pk, SiK, Vk>, Self::Error>
123	{
124		Ok(UserKeyDataInt {
125			group_key: self
126				.group_key
127				.parse()
128				.map_err(|_| SdkError::Util(sdk_utils::error::SdkUtilError::ImportSymmetricKeyFailed))?,
129			private_key: self
130				.private_key
131				.parse()
132				.map_err(|_| SdkError::Util(sdk_utils::error::SdkUtilError::JsonToStringFailed))?,
133			public_key: self
134				.public_key
135				.parse()
136				.map_err(|_| SdkError::Util(sdk_utils::error::SdkUtilError::JsonToStringFailed))?,
137			time: self.time,
138			sign_key: self
139				.sign_key
140				.parse()
141				.map_err(|_| SdkError::Util(sdk_utils::error::SdkUtilError::ImportingSignKeyFailed))?,
142			verify_key: self
143				.verify_key
144				.parse()
145				.map_err(|_| SdkError::Util(sdk_utils::error::SdkUtilError::ImportVerifyKeyFailed))?,
146			exported_public_key: UserPublicKeyData::from_string(&self.exported_public_key)
147				.map_err(|_| SdkError::Util(sdk_utils::error::SdkUtilError::ImportingKeyFromPemFailed))?,
148			exported_verify_key: UserVerifyKeyData::from_string(&self.exported_verify_key)
149				.map_err(|_| SdkError::Util(sdk_utils::error::SdkUtilError::ImportingKeyFromPemFailed))?,
150		})
151	}
152}
153
154//__________________________________________________________________________________________________
155
156#[derive(Serialize, Deserialize)]
157pub struct UserDataExport
158{
159	pub user_keys: Vec<UserKeyDataExport>,
160	pub device_keys: DeviceKeyDataExport,
161	pub jwt: String,
162	pub refresh_token: String,
163	pub user_id: UserId,
164	pub device_id: DeviceId,
165	pub hmac_keys: Vec<GroupOutDataHmacKeyExport>,
166}
167
168impl<S: SymKeyWrapper, Sk: SkWrapper, Pk: PkWrapper, SiK: SignKWrapper, Vk: VerifyKWrapper> TryFrom<UserDataInt<S, Sk, Pk, SiK, Vk>>
169	for UserDataExport
170{
171	type Error = SdkError;
172
173	fn try_from(value: UserDataInt<S, Sk, Pk, SiK, Vk>) -> Result<Self, Self::Error>
174	{
175		Ok(Self {
176			user_keys: value
177				.user_keys
178				.into_iter()
179				.map(|k| k.try_into())
180				.collect::<Result<_, SdkError>>()?,
181			device_keys: value.device_keys.try_into()?,
182			jwt: value.jwt,
183			refresh_token: value.refresh_token,
184			user_id: value.user_id,
185			device_id: value.device_id,
186			hmac_keys: value
187				.hmac_keys
188				.into_iter()
189				.map(|k| k.try_into())
190				.collect::<Result<_, SdkError>>()?,
191		})
192	}
193}