bitwarden_fido/
client_fido.rs

1use bitwarden_core::Client;
2use bitwarden_vault::CipherView;
3use thiserror::Error;
4
5use crate::{
6    Fido2Authenticator, Fido2Client, Fido2CredentialAutofillView, Fido2CredentialAutofillViewError,
7    Fido2CredentialStore, Fido2UserInterface,
8};
9
10#[allow(missing_docs)]
11#[derive(Clone)]
12pub struct ClientFido2 {
13    pub(crate) client: Client,
14}
15
16#[allow(missing_docs)]
17#[derive(Debug, Error)]
18pub enum DecryptFido2AutofillCredentialsError {
19    #[error(transparent)]
20    Fido2CredentialAutofillView(#[from] Fido2CredentialAutofillViewError),
21}
22
23impl ClientFido2 {
24    #[allow(missing_docs)]
25    pub fn new(client: Client) -> Self {
26        Self { client }
27    }
28
29    #[allow(missing_docs)]
30    pub fn create_authenticator<'a>(
31        &'a self,
32        user_interface: &'a dyn Fido2UserInterface,
33        credential_store: &'a dyn Fido2CredentialStore,
34    ) -> Fido2Authenticator<'a> {
35        Fido2Authenticator::new(&self.client, user_interface, credential_store)
36    }
37
38    #[allow(missing_docs)]
39    pub fn create_client<'a>(
40        &'a self,
41        user_interface: &'a dyn Fido2UserInterface,
42        credential_store: &'a dyn Fido2CredentialStore,
43    ) -> Fido2Client<'a> {
44        Fido2Client {
45            authenticator: self.create_authenticator(user_interface, credential_store),
46        }
47    }
48
49    #[allow(missing_docs)]
50    pub fn decrypt_fido2_autofill_credentials(
51        &self,
52        cipher_view: CipherView,
53    ) -> Result<Vec<Fido2CredentialAutofillView>, DecryptFido2AutofillCredentialsError> {
54        let key_store = self.client.internal.get_key_store();
55
56        Ok(Fido2CredentialAutofillView::from_cipher_view(
57            &cipher_view,
58            &mut key_store.context(),
59        )?)
60    }
61}
62
63#[allow(missing_docs)]
64pub trait ClientFido2Ext {
65    fn fido2(&self) -> ClientFido2;
66}
67
68impl ClientFido2Ext for Client {
69    fn fido2(&self) -> ClientFido2 {
70        ClientFido2::new(self.clone())
71    }
72}