use serde::{Deserialize, Serialize};
#[cfg(feature = "typeshare")]
use typeshare::typeshare;
use crate::{
Bytes,
utils::serde::{ignore_unknown, ignore_unknown_opt_vec, maybe_stringified_num},
webauthn::{
AttestationConveyancePreference, AttestationStatementFormatIdentifiers,
AuthenticationExtensionsClientInputs, PublicKeyCredential, PublicKeyCredentialDescriptor,
PublicKeyCredentialHints, UserVerificationRequirement,
},
};
#[cfg(doc)]
use crate::{
ctap2::{AttestedCredentialData, AuthenticatorData},
webauthn::{
AuthenticatorAttestationResponse, CollectedClientData, PublicKeyCredentialUserEntity,
},
};
#[cfg_attr(feature = "typeshare", typeshare(swift = "Equatable, Hashable"))]
pub type AuthenticatedPublicKeyCredential = PublicKeyCredential<AuthenticatorAssertionResponse>;
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "typeshare", typeshare)]
pub struct PublicKeyCredentialRequestOptions {
pub challenge: Bytes,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "maybe_stringified_num"
)]
pub timeout: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rp_id: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "ignore_unknown_opt_vec",
// On older versions of google play services, hybrid requests were not being transcribed
// correctly from the CTAP format to the webauthn format as is required by the credential
// manager API. This alias is present to mitigate the issue on devices that may not have
// received the update. It will be removed at a later date so do not rely on it.
alias = "allowList"
)]
pub allow_credentials: Option<Vec<PublicKeyCredentialDescriptor>>,
#[serde(default, deserialize_with = "ignore_unknown")]
pub user_verification: UserVerificationRequirement,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "ignore_unknown_opt_vec"
)]
pub hints: Option<Vec<PublicKeyCredentialHints>>,
#[serde(default, deserialize_with = "ignore_unknown")]
pub attestation: AttestationConveyancePreference,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "ignore_unknown_opt_vec"
)]
pub attestation_formats: Option<Vec<AttestationStatementFormatIdentifiers>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "ignore_unknown"
)]
pub extensions: Option<AuthenticationExtensionsClientInputs>,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "typeshare", typeshare)]
pub struct CredentialRequestOptions {
pub public_key: PublicKeyCredentialRequestOptions,
}
#[derive(Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "typeshare", typeshare(swift = "Equatable, Hashable"))]
pub struct AuthenticatorAssertionResponse {
#[serde(rename = "clientDataJSON")]
pub client_data_json: Bytes,
pub authenticator_data: Bytes,
pub signature: Bytes,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub user_handle: Option<Bytes>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub attestation_object: Option<Bytes>,
}