ctap_types/ctap2/
credential_management.rs

1use cosey::PublicKey;
2use serde_bytes::ByteArray;
3use serde_indexed::{DeserializeIndexed, SerializeIndexed};
4use serde_repr::{Deserialize_repr, Serialize_repr};
5
6use crate::webauthn::{
7    PublicKeyCredentialDescriptor, PublicKeyCredentialDescriptorRef, PublicKeyCredentialRpEntity,
8    PublicKeyCredentialUserEntity,
9};
10
11#[derive(Copy, Clone, Debug, Default, Eq, PartialEq, Serialize_repr, Deserialize_repr)]
12#[repr(u8)]
13pub enum CredentialProtectionPolicy {
14    #[default]
15    Optional = 1,
16    OptionalWithCredentialIdList = 2,
17    Required = 3,
18}
19
20#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize_repr, Deserialize_repr)]
21#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
22#[non_exhaustive]
23#[repr(u8)]
24pub enum Subcommand {
25    GetCredsMetadata = 0x01,
26    EnumerateRpsBegin = 0x02,
27    EnumerateRpsGetNextRp = 0x03,
28    EnumerateCredentialsBegin = 0x04,
29    EnumerateCredentialsGetNextCredential = 0x05,
30    DeleteCredential = 0x06,
31    UpdateUserInformation = 0x07,
32}
33
34#[derive(Clone, Debug, Eq, PartialEq, SerializeIndexed, DeserializeIndexed)]
35#[non_exhaustive]
36#[serde_indexed(offset = 1)]
37pub struct SubcommandParameters<'a> {
38    // 0x01
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub rp_id_hash: Option<&'a ByteArray<32>>,
41    // 0x02
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub credential_id: Option<PublicKeyCredentialDescriptorRef<'a>>,
44    // 0x03
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub user: Option<PublicKeyCredentialUserEntity>,
47}
48
49#[derive(Clone, Debug, Eq, PartialEq, SerializeIndexed, DeserializeIndexed)]
50#[non_exhaustive]
51#[serde_indexed(offset = 1)]
52pub struct Request<'a> {
53    // 0x01
54    pub sub_command: Subcommand,
55    // 0x02
56    #[serde(skip_serializing_if = "Option::is_none")]
57    pub sub_command_params: Option<SubcommandParameters<'a>>,
58    // 0x03
59    #[serde(skip_serializing_if = "Option::is_none")]
60    pub pin_protocol: Option<u8>,
61    // 0x04
62    #[serde(skip_serializing_if = "Option::is_none")]
63    pub pin_auth: Option<&'a serde_bytes::Bytes>,
64}
65
66#[derive(Clone, Debug, Default, Eq, PartialEq, SerializeIndexed)]
67#[non_exhaustive]
68#[serde_indexed(offset = 1)]
69pub struct Response {
70    // Metadata
71
72    // 0x01
73    #[serde(skip_serializing_if = "Option::is_none")]
74    pub existing_resident_credentials_count: Option<u32>,
75    // 0x02
76    #[serde(skip_serializing_if = "Option::is_none")]
77    pub max_possible_remaining_residential_credentials_count: Option<u32>,
78
79    // EnumerateRps
80
81    // 0x03
82    #[serde(skip_serializing_if = "Option::is_none")]
83    pub rp: Option<PublicKeyCredentialRpEntity>,
84    // 0x04
85    #[serde(skip_serializing_if = "Option::is_none")]
86    pub rp_id_hash: Option<ByteArray<32>>,
87    // 0x05
88    #[serde(skip_serializing_if = "Option::is_none")]
89    pub total_rps: Option<u32>,
90
91    // EnumerateCredentials given RP
92
93    // 0x06
94    #[serde(skip_serializing_if = "Option::is_none")]
95    pub user: Option<PublicKeyCredentialUserEntity>,
96    // 0x07
97    #[serde(skip_serializing_if = "Option::is_none")]
98    pub credential_id: Option<PublicKeyCredentialDescriptor>,
99    // 0x08
100    #[serde(skip_serializing_if = "Option::is_none")]
101    pub public_key: Option<PublicKey>,
102    // 0x09
103    #[serde(skip_serializing_if = "Option::is_none")]
104    pub total_credentials: Option<u32>,
105    // 0x0A
106    #[serde(skip_serializing_if = "Option::is_none")]
107    pub cred_protect: Option<CredentialProtectionPolicy>,
108    // 0x0B
109    #[serde(skip_serializing_if = "Option::is_none")]
110    pub large_blob_key: Option<ByteArray<32>>,
111    // 0x0C
112    #[cfg(feature = "third-party-payment")]
113    #[serde(skip_serializing_if = "Option::is_none")]
114    pub third_party_payment: Option<bool>,
115}