core_crypto/transaction_context/
proteus.rs1use super::{Error, Result, TransactionContext};
4use crate::{RecursiveError, proteus::ProteusCentral};
5
6impl TransactionContext {
7 pub async fn proteus_init(&self) -> Result<()> {
9 let inner = self.inner().await?;
10 let proteus_client = ProteusCentral::try_new(&inner.transaction)
11 .await
12 .map_err(RecursiveError::context("creating new proteus client"))?;
13
14 let _ = proteus_client
16 .last_resort_prekey(&inner.transaction)
17 .await
18 .map_err(RecursiveError::context("getting last resort prekey"))?;
19
20 let mut guard = inner.core_crypto.proteus.lock().await;
21 *guard = Some(proteus_client);
22 Ok(())
23 }
24
25 pub async fn proteus_session_from_prekey(&self, session_id: &str, prekey: &[u8]) -> Result<()> {
30 let inner = self.inner().await?;
31 let mut guard = inner.core_crypto.proteus.lock().await;
32 let proteus = guard.as_mut().ok_or(Error::ProteusNotInitialized)?;
33 let session = proteus
34 .session_from_prekey(session_id, prekey)
35 .await
36 .map_err(RecursiveError::context("creating proteus session from prekey"))?;
37 ProteusCentral::session_save_by_ref(&inner.transaction, session)
38 .await
39 .map_err(RecursiveError::context("saving proteus session by ref"))?;
40 Ok(())
41 }
42
43 pub async fn proteus_session_from_message(&self, session_id: &str, envelope: &[u8]) -> Result<Vec<u8>> {
48 let inner = self.inner().await?;
49 let mut guard = inner.core_crypto.proteus.lock().await;
50 let proteus = guard.as_mut().ok_or(Error::ProteusNotInitialized)?;
51 let (session, message) = proteus
52 .session_from_message(&inner.transaction, session_id, envelope)
53 .await
54 .map_err(RecursiveError::context("creating proteus sesseion from message"))?;
55 ProteusCentral::session_save_by_ref(&inner.transaction, session)
56 .await
57 .map_err(RecursiveError::context("saving proteus session by ref"))?;
58 Ok(message)
59 }
60
61 pub async fn proteus_session_save(&self, session_id: &str) -> Result<()> {
66 let inner = self.inner().await?;
67 let mut guard = inner.core_crypto.proteus.lock().await;
68 let proteus = guard.as_mut().ok_or(Error::ProteusNotInitialized)?;
69 proteus
70 .session_save(&inner.transaction, session_id)
71 .await
72 .map_err(RecursiveError::context("saving proteus session"))
73 .map_err(Into::into)
74 }
75
76 pub async fn proteus_session_delete(&self, session_id: &str) -> Result<()> {
81 let inner = self.inner().await?;
82 let mut guard = inner.core_crypto.proteus.lock().await;
83 let proteus = guard.as_mut().ok_or(Error::ProteusNotInitialized)?;
84 proteus
85 .session_delete(&inner.transaction, session_id)
86 .await
87 .map_err(RecursiveError::context("deleting proteus session"))
88 .map_err(Into::into)
89 }
90
91 pub async fn proteus_session_exists(&self, session_id: &str) -> Result<bool> {
96 let inner = self.inner().await?;
97 let mut guard = inner.core_crypto.proteus.lock().await;
98 let proteus = guard.as_mut().ok_or(Error::ProteusNotInitialized)?;
99 proteus
100 .session_exists(session_id, &inner.transaction)
101 .await
102 .map_err(RecursiveError::context("checking whether proteus session exists"))
103 .map_err(Into::into)
104 }
105
106 pub async fn proteus_decrypt(&self, session_id: &str, ciphertext: &[u8]) -> Result<Vec<u8>> {
111 let inner = self.inner().await?;
112 let mut guard = inner.core_crypto.proteus.lock().await;
113 let proteus = guard.as_mut().ok_or(Error::ProteusNotInitialized)?;
114 proteus
115 .decrypt(&inner.transaction, session_id, ciphertext)
116 .await
117 .map_err(RecursiveError::context("decrypting proteus message"))
118 .map_err(Into::into)
119 }
120
121 pub async fn proteus_encrypt(&self, session_id: &str, plaintext: &[u8]) -> Result<Vec<u8>> {
126 let inner = self.inner().await?;
127 let mut guard = inner.core_crypto.proteus.lock().await;
128 let proteus = guard.as_mut().ok_or(Error::ProteusNotInitialized)?;
129 proteus
130 .encrypt(&inner.transaction, session_id, plaintext)
131 .await
132 .map_err(RecursiveError::context("encrypting proteus message"))
133 .map_err(Into::into)
134 }
135
136 pub async fn proteus_encrypt_batched(
142 &self,
143 sessions: &[impl AsRef<str>],
144 plaintext: &[u8],
145 ) -> Result<std::collections::HashMap<String, Vec<u8>>> {
146 let inner = self.inner().await?;
147 let mut guard = inner.core_crypto.proteus.lock().await;
148 let proteus = guard.as_mut().ok_or(Error::ProteusNotInitialized)?;
149 proteus
150 .encrypt_batched(&inner.transaction, sessions, plaintext)
151 .await
152 .map_err(RecursiveError::context("batch encrypting proteus message"))
153 .map_err(Into::into)
154 }
155
156 pub async fn proteus_new_prekey(&self, prekey_id: u16) -> Result<Vec<u8>> {
167 let inner = self.inner().await?;
168 let mut guard = inner.core_crypto.proteus.lock().await;
169 let proteus = guard.as_mut().ok_or(Error::ProteusNotInitialized)?;
170 proteus
171 .new_prekey(prekey_id, &inner.transaction)
172 .await
173 .map_err(RecursiveError::context("new proteus prekey"))
174 .map_err(Into::into)
175 }
176
177 pub async fn proteus_new_prekey_auto(&self) -> Result<(u16, Vec<u8>)> {
183 let inner = self.inner().await?;
184 let mut guard = inner.core_crypto.proteus.lock().await;
185 let proteus = guard.as_mut().ok_or(Error::ProteusNotInitialized)?;
186 proteus
187 .new_prekey_auto(&inner.transaction)
188 .await
189 .map_err(RecursiveError::context("proteus new prekey auto"))
190 .map_err(Into::into)
191 }
192
193 pub async fn proteus_last_resort_prekey(&self) -> Result<Vec<u8>> {
195 let inner = self.inner().await?;
196 let mut guard = inner.core_crypto.proteus.lock().await;
197 let proteus = guard.as_mut().ok_or(Error::ProteusNotInitialized)?;
198
199 proteus
200 .last_resort_prekey(&inner.transaction)
201 .await
202 .map_err(RecursiveError::context("getting proteus last resort prekey"))
203 .map_err(Into::into)
204 }
205
206 pub fn proteus_last_resort_prekey_id() -> u16 {
208 ProteusCentral::last_resort_prekey_id()
209 }
210
211 pub async fn proteus_fingerprint(&self) -> Result<String> {
216 let inner = self.inner().await?;
217 let mut guard = inner.core_crypto.proteus.lock().await;
218 let proteus = guard.as_mut().ok_or(Error::ProteusNotInitialized)?;
219 Ok(proteus.fingerprint())
220 }
221
222 pub async fn proteus_fingerprint_local(&self, session_id: &str) -> Result<String> {
227 let inner = self.inner().await?;
228 let mut guard = inner.core_crypto.proteus.lock().await;
229 let proteus = guard.as_mut().ok_or(Error::ProteusNotInitialized)?;
230 proteus
231 .fingerprint_local(session_id, &inner.transaction)
232 .await
233 .map_err(RecursiveError::context("getting proteus fingerprint local"))
234 .map_err(Into::into)
235 }
236
237 pub async fn proteus_fingerprint_remote(&self, session_id: &str) -> Result<String> {
242 let inner = self.inner().await?;
243 let mut guard = inner.core_crypto.proteus.lock().await;
244 let proteus = guard.as_mut().ok_or(Error::ProteusNotInitialized)?;
245 proteus
246 .fingerprint_remote(session_id, &inner.transaction)
247 .await
248 .map_err(RecursiveError::context("geeting proteus fingerprint remote"))
249 .map_err(Into::into)
250 }
251}