passkey_authenticator/
passkey.rs1use std::{borrow::Cow, ops::Deref};
2
3use coset::CoseKey;
4use passkey_types::{
5 CredentialExtensions,
6 webauthn::{AuthenticatorTransport, PublicKeyCredentialDescriptor, PublicKeyCredentialType},
7};
8
9#[cfg(doc)]
10use passkey_types::Passkey;
11
12pub trait PasskeyAccessor {
15 fn key(&self) -> Cow<'_, CoseKey>;
19 fn credential_id(&self) -> &[u8];
21 fn rp_id(&self) -> &str;
23 fn user_handle(&self) -> Option<&[u8]>;
25 fn username(&self) -> Option<&str>;
27 fn user_display_name(&self) -> Option<&str>;
29 fn counter(&self) -> Option<u32>;
33 fn set_counter(&mut self, counter: u32);
35 fn extensions(&self) -> Cow<'_, CredentialExtensions>;
40}
41
42pub(crate) trait AsCredentialDescriptor: PasskeyAccessor {
43 fn as_credential_descriptor(
44 &self,
45 transports: Option<Vec<AuthenticatorTransport>>,
46 ) -> PublicKeyCredentialDescriptor;
47}
48
49impl<P> AsCredentialDescriptor for P
50where
51 P: PasskeyAccessor,
52{
53 fn as_credential_descriptor(
54 &self,
55 transports: Option<Vec<AuthenticatorTransport>>,
56 ) -> PublicKeyCredentialDescriptor {
57 PublicKeyCredentialDescriptor {
58 ty: PublicKeyCredentialType::PublicKey,
59 id: self.credential_id().into(),
60 transports,
61 }
62 }
63}
64
65impl PasskeyAccessor for passkey_types::Passkey {
66 fn key(&self) -> Cow<'_, CoseKey> {
67 Cow::Borrowed(&self.key)
68 }
69
70 fn credential_id(&self) -> &[u8] {
71 &self.credential_id
72 }
73
74 fn rp_id(&self) -> &str {
75 &self.rp_id
76 }
77
78 fn user_handle(&self) -> Option<&[u8]> {
79 self.user_handle.as_ref().map(|b| b.deref().deref())
80 }
81
82 fn username(&self) -> Option<&str> {
83 self.username.as_deref()
84 }
85
86 fn user_display_name(&self) -> Option<&str> {
87 self.user_display_name.as_deref()
88 }
89
90 fn counter(&self) -> Option<u32> {
91 self.counter
92 }
93
94 fn set_counter(&mut self, counter: u32) {
95 self.counter = Some(counter);
96 }
97
98 fn extensions(&self) -> Cow<'_, CredentialExtensions> {
99 Cow::Borrowed(&self.extensions)
100 }
101}