ctap_types/ctap2/
credential_management.rs1use 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 #[serde(skip_serializing_if = "Option::is_none")]
40 pub rp_id_hash: Option<&'a ByteArray<32>>,
41 #[serde(skip_serializing_if = "Option::is_none")]
43 pub credential_id: Option<PublicKeyCredentialDescriptorRef<'a>>,
44 #[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 pub sub_command: Subcommand,
55 #[serde(skip_serializing_if = "Option::is_none")]
57 pub sub_command_params: Option<SubcommandParameters<'a>>,
58 #[serde(skip_serializing_if = "Option::is_none")]
60 pub pin_protocol: Option<u8>,
61 #[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 #[serde(skip_serializing_if = "Option::is_none")]
74 pub existing_resident_credentials_count: Option<u32>,
75 #[serde(skip_serializing_if = "Option::is_none")]
77 pub max_possible_remaining_residential_credentials_count: Option<u32>,
78
79 #[serde(skip_serializing_if = "Option::is_none")]
83 pub rp: Option<PublicKeyCredentialRpEntity>,
84 #[serde(skip_serializing_if = "Option::is_none")]
86 pub rp_id_hash: Option<ByteArray<32>>,
87 #[serde(skip_serializing_if = "Option::is_none")]
89 pub total_rps: Option<u32>,
90
91 #[serde(skip_serializing_if = "Option::is_none")]
95 pub user: Option<PublicKeyCredentialUserEntity>,
96 #[serde(skip_serializing_if = "Option::is_none")]
98 pub credential_id: Option<PublicKeyCredentialDescriptor>,
99 #[serde(skip_serializing_if = "Option::is_none")]
101 pub public_key: Option<PublicKey>,
102 #[serde(skip_serializing_if = "Option::is_none")]
104 pub total_credentials: Option<u32>,
105 #[serde(skip_serializing_if = "Option::is_none")]
107 pub cred_protect: Option<CredentialProtectionPolicy>,
108 #[serde(skip_serializing_if = "Option::is_none")]
110 pub large_blob_key: Option<ByteArray<32>>,
111 #[cfg(feature = "third-party-payment")]
113 #[serde(skip_serializing_if = "Option::is_none")]
114 pub third_party_payment: Option<bool>,
115}