core_crypto_ffi/e2ei/
enrollment.rs

1use std::{ops::Deref, sync::Arc};
2
3use async_lock::RwLock;
4#[cfg(target_family = "wasm")]
5use wasm_bindgen::prelude::*;
6
7#[cfg(not(target_family = "wasm"))]
8use crate::CoreCryptoContext;
9use crate::{AcmeDirectory, CoreCryptoResult, NewAcmeAuthz, NewAcmeOrder};
10
11/// See [core_crypto::e2e_identity::E2eiEnrollment]
12#[derive(Debug)]
13#[cfg_attr(target_family = "wasm", wasm_bindgen(js_name = FfiWireE2EIdentity))]
14#[cfg_attr(not(target_family = "wasm"), derive(uniffi::Object))]
15pub struct E2eiEnrollment(Arc<RwLock<core_crypto::prelude::E2eiEnrollment>>);
16
17impl E2eiEnrollment {
18    pub fn new(inner: core_crypto::prelude::E2eiEnrollment) -> Self {
19        Self(Arc::new(RwLock::new(inner)))
20    }
21
22    pub fn into_inner(self) -> Option<core_crypto::prelude::E2eiEnrollment> {
23        Arc::into_inner(self.0).map(|rwlock| rwlock.into_inner())
24    }
25}
26
27impl Deref for E2eiEnrollment {
28    type Target = RwLock<core_crypto::prelude::E2eiEnrollment>;
29
30    fn deref(&self) -> &Self::Target {
31        &self.0
32    }
33}
34
35#[cfg_attr(target_family = "wasm", wasm_bindgen(js_class = FfiWireE2EIdentity))]
36#[cfg_attr(not(target_family = "wasm"), uniffi::export)]
37impl E2eiEnrollment {
38    /// See [core_crypto::e2e_identity::E2eiEnrollment::directory_response]
39    pub async fn directory_response(&self, directory: Vec<u8>) -> CoreCryptoResult<AcmeDirectory> {
40        self.write()
41            .await
42            .directory_response(directory)
43            .map(AcmeDirectory::from)
44            .map_err(Into::into)
45    }
46
47    /// See [core_crypto::e2e_identity::E2eiEnrollment::new_account_request]
48    pub async fn new_account_request(&self, previous_nonce: String) -> CoreCryptoResult<Vec<u8>> {
49        self.read()
50            .await
51            .new_account_request(previous_nonce)
52            .map_err(Into::into)
53    }
54
55    /// See [core_crypto::e2e_identity::E2eiEnrollment::new_account_response]
56    pub async fn new_account_response(&self, account: Vec<u8>) -> CoreCryptoResult<()> {
57        self.write().await.new_account_response(account).map_err(Into::into)
58    }
59
60    /// See [core_crypto::e2e_identity::E2eiEnrollment::new_order_request]
61    pub async fn new_order_request(&self, previous_nonce: String) -> CoreCryptoResult<Vec<u8>> {
62        self.read().await.new_order_request(previous_nonce).map_err(Into::into)
63    }
64
65    /// See [core_crypto::e2e_identity::E2eiEnrollment::new_order_response]
66    pub async fn new_order_response(&self, order: Vec<u8>) -> CoreCryptoResult<NewAcmeOrder> {
67        self.read()
68            .await
69            .new_order_response(order)
70            .map(Into::into)
71            .map_err(Into::into)
72    }
73
74    /// See [core_crypto::e2e_identity::E2eiEnrollment::new_authz_request]
75    pub async fn new_authz_request(&self, url: String, previous_nonce: String) -> CoreCryptoResult<Vec<u8>> {
76        self.read()
77            .await
78            .new_authz_request(url, previous_nonce)
79            .map_err(Into::into)
80    }
81
82    /// See [core_crypto::e2e_identity::E2eiEnrollment::new_authz_response]
83    pub async fn new_authz_response(&self, authz: Vec<u8>) -> CoreCryptoResult<NewAcmeAuthz> {
84        self.write()
85            .await
86            .new_authz_response(authz)
87            .map(Into::into)
88            .map_err(Into::into)
89    }
90
91    /// See [core_crypto::e2e_identity::E2eiEnrollment::create_dpop_token]
92    pub async fn create_dpop_token(&self, expiry_secs: u32, backend_nonce: String) -> CoreCryptoResult<String> {
93        self.read()
94            .await
95            .create_dpop_token(expiry_secs, backend_nonce)
96            .map_err(Into::into)
97    }
98
99    /// See [core_crypto::e2e_identity::E2eiEnrollment::new_dpop_challenge_request]
100    pub async fn new_dpop_challenge_request(
101        &self,
102        access_token: String,
103        previous_nonce: String,
104    ) -> CoreCryptoResult<Vec<u8>> {
105        self.read()
106            .await
107            .new_dpop_challenge_request(access_token, previous_nonce)
108            .map_err(Into::into)
109    }
110
111    /// See [core_crypto::e2e_identity::E2eiEnrollment::new_dpop_challenge_response]
112    pub async fn new_dpop_challenge_response(&self, challenge: Vec<u8>) -> CoreCryptoResult<()> {
113        self.read()
114            .await
115            .new_dpop_challenge_response(challenge)
116            .map_err(Into::into)
117    }
118
119    /// See [core_crypto::e2e_identity::E2eiEnrollment::check_order_request]
120    pub async fn check_order_request(&self, order_url: String, previous_nonce: String) -> CoreCryptoResult<Vec<u8>> {
121        self.read()
122            .await
123            .check_order_request(order_url, previous_nonce)
124            .map_err(Into::into)
125    }
126
127    /// See [core_crypto::e2e_identity::E2eiEnrollment::check_order_response]
128    pub async fn check_order_response(&self, order: Vec<u8>) -> CoreCryptoResult<String> {
129        self.write().await.check_order_response(order).map_err(Into::into)
130    }
131
132    /// See [core_crypto::prelude::E2eiEnrollment::finalize_request]
133    pub async fn finalize_request(&self, previous_nonce: String) -> CoreCryptoResult<Vec<u8>> {
134        self.write().await.finalize_request(previous_nonce).map_err(Into::into)
135    }
136
137    /// See [core_crypto::prelude::E2eiEnrollment::finalize_response]
138    pub async fn finalize_response(&self, finalize: Vec<u8>) -> CoreCryptoResult<String> {
139        self.write().await.finalize_response(finalize).map_err(Into::into)
140    }
141
142    /// See [core_crypto::prelude::E2eiEnrollment::certificate_request]
143    pub async fn certificate_request(&self, previous_nonce: String) -> CoreCryptoResult<Vec<u8>> {
144        self.write()
145            .await
146            .certificate_request(previous_nonce)
147            .map_err(Into::into)
148    }
149}
150
151// There are certain functions whose signatures are completely different in uniffi and wasm;
152// it's easier to define them separately.
153
154#[cfg(target_family = "wasm")]
155#[wasm_bindgen(js_class = FfiWireE2EIdentity)]
156impl E2eiEnrollment {
157    /// See [core_crypto::e2e_identity::E2eiEnrollment::new_oidc_challenge_request]
158    pub async fn new_oidc_challenge_request(
159        &self,
160        id_token: String,
161        previous_nonce: String,
162    ) -> CoreCryptoResult<Vec<u8>> {
163        self.write()
164            .await
165            .new_oidc_challenge_request(id_token, previous_nonce)
166            .map_err(Into::into)
167    }
168
169    /// See [core_crypto::e2e_identity::E2eiEnrollment::new_oidc_challenge_response]
170    pub async fn new_oidc_challenge_response(&self, challenge: Vec<u8>) -> CoreCryptoResult<()> {
171        self.write()
172            .await
173            .new_oidc_challenge_response(challenge)
174            .await
175            .map_err(Into::into)
176    }
177}
178
179#[cfg(not(target_family = "wasm"))]
180#[uniffi::export]
181impl E2eiEnrollment {
182    /// See [core_crypto::e2e_identity::E2eiEnrollment::new_oidc_challenge_request]
183    pub async fn new_oidc_challenge_request(
184        &self,
185        id_token: String,
186        refresh_token: String,
187        previous_nonce: String,
188    ) -> CoreCryptoResult<Vec<u8>> {
189        self.write()
190            .await
191            .new_oidc_challenge_request(id_token, refresh_token, previous_nonce)
192            .map_err(Into::into)
193    }
194
195    /// See [core_crypto::e2e_identity::E2eiEnrollment::new_oidc_challenge_response]
196    pub async fn new_oidc_challenge_response(
197        &self,
198        cc: Arc<CoreCryptoContext>,
199        challenge: Vec<u8>,
200    ) -> CoreCryptoResult<()> {
201        let provider = cc.inner.mls_provider().await?;
202        self.write()
203            .await
204            .new_oidc_challenge_response(&provider, challenge)
205            .await
206            .map_err(Into::into)
207    }
208
209    /// See [core_crypto::prelude::E2eiEnrollment::get_refresh_token]
210    //
211    // Note: this function does not exist in WASM!
212    pub async fn get_refresh_token(&self) -> CoreCryptoResult<String> {
213        self.read()
214            .await
215            .get_refresh_token()
216            .map(Into::into)
217            .map_err(Into::into)
218    }
219}