core_crypto_ffi/e2ei/
enrollment.rs1use 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#[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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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#[cfg(target_family = "wasm")]
155#[wasm_bindgen(js_class = FfiWireE2EIdentity)]
156impl E2eiEnrollment {
157 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 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 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 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 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}