1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
use crate::{Bytes, String, Vec};
use serde::{Deserialize, Serialize};
use serde_indexed::{DeserializeIndexed, SerializeIndexed};
use super::{AuthenticatorOptions, PinAuth};
use crate::cose::EcdhEsHkdf256PublicKey;
use crate::sizes::*;
use crate::webauthn::*;
#[derive(Clone, Debug, Eq, PartialEq, SerializeIndexed, DeserializeIndexed)]
#[serde_indexed(offset = 1)]
pub struct HmacSecretInput {
pub key_agreement: EcdhEsHkdf256PublicKey,
pub salt_enc: Bytes<64>,
pub salt_auth: Bytes<16>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pin_protocol: Option<u32>,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct ExtensionsInput {
#[serde(rename = "hmac-secret")]
#[serde(skip_serializing_if = "Option::is_none")]
pub hmac_secret: Option<HmacSecretInput>,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Default)]
pub struct ExtensionsOutput {
#[serde(rename = "hmac-secret")]
#[serde(skip_serializing_if = "Option::is_none")]
pub hmac_secret: Option<Bytes<64>>,
}
pub struct NoAttestedCredentialData(core::marker::PhantomData<()>);
impl super::SerializeAttestedCredentialData for NoAttestedCredentialData {
fn serialize(&self) -> Bytes<ATTESTED_CREDENTIAL_DATA_LENGTH> {
Bytes::new()
}
}
pub type AuthenticatorData = super::AuthenticatorData<NoAttestedCredentialData, ExtensionsOutput>;
pub type AllowList = Vec<PublicKeyCredentialDescriptor, MAX_CREDENTIAL_COUNT_IN_LIST>;
#[derive(Clone, Debug, Eq, PartialEq, SerializeIndexed, DeserializeIndexed)]
#[serde_indexed(offset = 1)]
pub struct Request {
pub rp_id: String<64>,
pub client_data_hash: Bytes<32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allow_list: Option<AllowList>,
#[serde(skip_serializing_if = "Option::is_none")]
pub extensions: Option<ExtensionsInput>,
#[serde(skip_serializing_if = "Option::is_none")]
pub options: Option<AuthenticatorOptions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pin_auth: Option<PinAuth>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pin_protocol: Option<u32>,
}
#[derive(Clone, Debug, Eq, PartialEq, SerializeIndexed, DeserializeIndexed)]
#[serde_indexed(offset = 1)]
pub struct Response {
#[serde(skip_serializing_if = "Option::is_none")]
pub credential: Option<PublicKeyCredentialDescriptor>,
pub auth_data: Bytes<AUTHENTICATOR_DATA_LENGTH>,
pub signature: Bytes<ASN1_SIGNATURE_LENGTH>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<PublicKeyCredentialUserEntity>,
#[serde(skip_serializing_if = "Option::is_none")]
pub number_of_credentials: Option<u32>,
}
pub type Responses = Vec<Response, 8>;