use super::Ctap2PinUvAuthProtocol;
use serde_bytes::ByteBuf;
use serde_indexed::{DeserializeIndexed, SerializeIndexed};
use serde_repr::{Deserialize_repr, Serialize_repr};
use std::time::Duration;
#[derive(Debug, Clone, SerializeIndexed)]
pub struct Ctap2BioEnrollmentRequest {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(index = 0x01)]
pub modality: Option<Ctap2BioEnrollmentModality>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(index = 0x02)]
pub subcommand: Option<Ctap2BioEnrollmentSubcommand>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(index = 0x03)]
pub subcommand_params: Option<Ctap2BioEnrollmentParams>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(index = 0x04)]
pub protocol: Option<Ctap2PinUvAuthProtocol>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(index = 0x05)]
pub uv_auth_param: Option<ByteBuf>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(index = 0x06)]
pub get_modality: Option<bool>,
#[serde(skip)]
pub use_legacy_preview: bool,
}
#[repr(u32)]
#[derive(Debug, Copy, Clone, FromPrimitive, PartialEq, Serialize_repr, Deserialize_repr)]
pub enum Ctap2BioEnrollmentSubcommand {
EnrollBegin = 0x01,
EnrollCaptureNextSample = 0x02,
CancelCurrentEnrollment = 0x03,
EnumerateEnrollments = 0x04,
SetFriendlyName = 0x05,
RemoveEnrollment = 0x06,
GetFingerprintSensorInfo = 0x07,
}
#[derive(Debug, Clone, SerializeIndexed)]
pub struct Ctap2BioEnrollmentParams {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(index = 0x01)]
template_id: Option<ByteBuf>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(index = 0x02)]
template_friendly_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(index = 0x03)]
timeout_milliseconds: Option<u64>,
}
#[derive(Debug, Default, Clone, DeserializeIndexed)]
pub struct Ctap2BioEnrollmentResponse {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(index = 0x01)]
pub modality: Option<Ctap2BioEnrollmentModality>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(index = 0x02)]
pub fingerprint_kind: Option<Ctap2BioEnrollmentFingerprintKind>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(index = 0x03)]
pub max_capture_samples_required_for_enroll: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(index = 0x04)]
pub template_id: Option<ByteBuf>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(index = 0x05)]
pub last_enroll_sample_status: Option<Ctap2LastEnrollmentSampleStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(index = 0x06)]
pub remaining_samples: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(index = 0x07)]
pub template_infos: Option<Vec<Ctap2BioEnrollmentTemplateId>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(index = 0x08)]
pub max_template_friendly_name: Option<u64>,
}
#[derive(Debug, Clone, DeserializeIndexed)]
pub struct Ctap2BioEnrollmentTemplateId {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(index = 0x01)]
pub template_id: Option<ByteBuf>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(index = 0x02)]
pub template_friendly_name: Option<String>,
}
#[repr(u64)]
#[derive(Debug, Clone, Copy, FromPrimitive, PartialEq, Serialize_repr, Deserialize_repr)]
pub enum Ctap2LastEnrollmentSampleStatus {
Ctap2EnrollFeedbackFpGood = 0x00, Ctap2EnrollFeedbackFpTooHigh = 0x01, Ctap2EnrollFeedbackFpTooLow = 0x02, Ctap2EnrollFeedbackFpTooLeft = 0x03, Ctap2EnrollFeedbackFpTooRight = 0x04, Ctap2EnrollFeedbackFpTooFast = 0x05, Ctap2EnrollFeedbackFpTooSlow = 0x06, Ctap2EnrollFeedbackFpPoorQuality = 0x07, Ctap2EnrollFeedbackFpTooSkewed = 0x08, Ctap2EnrollFeedbackFpTooShort = 0x09, Ctap2EnrollFeedbackFpMergeFailure = 0x0A, Ctap2EnrollFeedbackFpExists = 0x0B, Unused = 0x0C, Ctap2EnrollFeedbackNoUserActivity = 0x0D, Ctap2EnrollFeedbackNoUserPresenceTransition = 0x0E, }
#[repr(u64)]
#[derive(Debug, Clone, FromPrimitive, PartialEq, Serialize_repr, Deserialize_repr)]
pub enum Ctap2BioEnrollmentModality {
Fingerprint = 0x01, }
#[repr(u64)]
#[derive(Debug, Clone, FromPrimitive, PartialEq, Serialize_repr, Deserialize_repr)]
pub enum Ctap2BioEnrollmentFingerprintKind {
Touch = 0x01,
Swipe = 0x02,
}
impl Ctap2BioEnrollmentRequest {
pub fn new_get_modality() -> Self {
Ctap2BioEnrollmentRequest {
modality: None,
subcommand: None,
subcommand_params: None,
protocol: None, uv_auth_param: None, get_modality: Some(true),
use_legacy_preview: false,
}
}
pub fn new_fingerprint_sensor_info() -> Self {
Ctap2BioEnrollmentRequest {
modality: Some(Ctap2BioEnrollmentModality::Fingerprint),
subcommand: Some(Ctap2BioEnrollmentSubcommand::GetFingerprintSensorInfo),
subcommand_params: None,
protocol: None, uv_auth_param: None, get_modality: None,
use_legacy_preview: false,
}
}
pub fn new_enumerate_enrollments() -> Self {
Ctap2BioEnrollmentRequest {
modality: Some(Ctap2BioEnrollmentModality::Fingerprint),
subcommand: Some(Ctap2BioEnrollmentSubcommand::EnumerateEnrollments),
subcommand_params: None,
protocol: None, uv_auth_param: None, get_modality: None,
use_legacy_preview: false,
}
}
pub fn new_remove_enrollment(template_id: &[u8]) -> Self {
Ctap2BioEnrollmentRequest {
modality: Some(Ctap2BioEnrollmentModality::Fingerprint),
subcommand: Some(Ctap2BioEnrollmentSubcommand::RemoveEnrollment),
subcommand_params: Some(Ctap2BioEnrollmentParams {
template_id: Some(ByteBuf::from(template_id)),
template_friendly_name: None,
timeout_milliseconds: None,
}),
protocol: None, uv_auth_param: None, get_modality: None,
use_legacy_preview: false,
}
}
pub fn new_rename_enrollment(template_id: &[u8], template_friendly_name: &str) -> Self {
Ctap2BioEnrollmentRequest {
modality: Some(Ctap2BioEnrollmentModality::Fingerprint),
subcommand: Some(Ctap2BioEnrollmentSubcommand::SetFriendlyName),
subcommand_params: Some(Ctap2BioEnrollmentParams {
template_id: Some(ByteBuf::from(template_id)),
template_friendly_name: Some(template_friendly_name.to_string()),
timeout_milliseconds: None,
}),
protocol: None, uv_auth_param: None, get_modality: None,
use_legacy_preview: false,
}
}
pub fn new_start_new_enrollment(enrollment_timeout: Option<Duration>) -> Self {
let subcommand_params = enrollment_timeout.map(|time| Ctap2BioEnrollmentParams {
template_id: None,
template_friendly_name: None,
timeout_milliseconds: Some(time.as_millis() as u64),
});
Ctap2BioEnrollmentRequest {
modality: Some(Ctap2BioEnrollmentModality::Fingerprint),
subcommand: Some(Ctap2BioEnrollmentSubcommand::EnrollBegin),
subcommand_params,
protocol: None, uv_auth_param: None, get_modality: None,
use_legacy_preview: false,
}
}
pub fn new_next_enrollment(template_id: &[u8], enrollment_timeout: Option<Duration>) -> Self {
let subcommand_params = Some(Ctap2BioEnrollmentParams {
template_id: Some(ByteBuf::from(template_id)),
template_friendly_name: None,
timeout_milliseconds: enrollment_timeout.map(|x| x.as_millis() as u64),
});
Ctap2BioEnrollmentRequest {
modality: Some(Ctap2BioEnrollmentModality::Fingerprint),
subcommand: Some(Ctap2BioEnrollmentSubcommand::EnrollCaptureNextSample),
subcommand_params,
protocol: None,
uv_auth_param: None,
get_modality: None,
use_legacy_preview: false,
}
}
pub fn new_cancel_current_enrollment() -> Self {
Ctap2BioEnrollmentRequest {
modality: Some(Ctap2BioEnrollmentModality::Fingerprint),
subcommand: Some(Ctap2BioEnrollmentSubcommand::CancelCurrentEnrollment),
subcommand_params: None,
protocol: None,
uv_auth_param: None,
get_modality: None,
use_legacy_preview: false,
}
}
}