libwebauthn 0.5.1

FIDO2 (WebAuthn) and FIDO U2F platform library for Linux written in Rust
Documentation
use std::io::Error as IOError;

use crate::proto::ctap2::cbor;
use crate::proto::ctap2::model::Ctap2ClientPinRequest;
use crate::proto::ctap2::model::Ctap2CommandCode;
use crate::proto::ctap2::model::Ctap2GetAssertionRequest;
use crate::proto::ctap2::model::Ctap2MakeCredentialRequest;
use crate::proto::ctap2::Ctap2AuthenticatorConfigRequest;
use crate::proto::ctap2::Ctap2BioEnrollmentRequest;
use crate::proto::ctap2::Ctap2CredentialManagementRequest;
use crate::webauthn::Error;

#[derive(Debug, Clone, PartialEq)]
pub struct CborRequest {
    pub command: Ctap2CommandCode,
    pub encoded_data: Vec<u8>,
}

impl CborRequest {
    pub fn new(command: Ctap2CommandCode) -> Self {
        Self {
            command,
            encoded_data: vec![],
        }
    }

    pub fn ctap_hid_data(&self) -> Vec<u8> {
        let mut data = vec![self.command as u8];
        data.extend(&self.encoded_data);
        data
    }

    pub fn raw_long(&self) -> Result<Vec<u8>, IOError> {
        let mut data = vec![self.command as u8];
        data.extend(self.encoded_data.iter().copied());
        Ok(data)
    }
}

impl TryFrom<&Ctap2MakeCredentialRequest> for CborRequest {
    type Error = Error;
    fn try_from(request: &Ctap2MakeCredentialRequest) -> Result<CborRequest, Error> {
        Ok(CborRequest {
            command: Ctap2CommandCode::AuthenticatorMakeCredential,
            encoded_data: cbor::to_vec(&request)?,
        })
    }
}

impl TryFrom<&Ctap2GetAssertionRequest> for CborRequest {
    type Error = Error;
    fn try_from(request: &Ctap2GetAssertionRequest) -> Result<CborRequest, Error> {
        Ok(CborRequest {
            command: Ctap2CommandCode::AuthenticatorGetAssertion,
            encoded_data: cbor::to_vec(&request)?,
        })
    }
}

impl TryFrom<&Ctap2ClientPinRequest> for CborRequest {
    type Error = Error;
    fn try_from(request: &Ctap2ClientPinRequest) -> Result<CborRequest, Error> {
        Ok(CborRequest {
            command: Ctap2CommandCode::AuthenticatorClientPin,
            encoded_data: cbor::to_vec(&request)?,
        })
    }
}

impl TryFrom<&Ctap2AuthenticatorConfigRequest> for CborRequest {
    type Error = Error;
    fn try_from(request: &Ctap2AuthenticatorConfigRequest) -> Result<CborRequest, Error> {
        Ok(CborRequest {
            command: Ctap2CommandCode::AuthenticatorConfig,
            encoded_data: cbor::to_vec(&request)?,
        })
    }
}

impl TryFrom<&Ctap2BioEnrollmentRequest> for CborRequest {
    type Error = Error;
    fn try_from(request: &Ctap2BioEnrollmentRequest) -> Result<CborRequest, Error> {
        let command = if request.use_legacy_preview {
            Ctap2CommandCode::AuthenticatorBioEnrollmentPreview
        } else {
            Ctap2CommandCode::AuthenticatorBioEnrollment
        };
        Ok(CborRequest {
            command,
            encoded_data: cbor::to_vec(&request)?,
        })
    }
}

impl TryFrom<&Ctap2CredentialManagementRequest> for CborRequest {
    type Error = Error;
    fn try_from(request: &Ctap2CredentialManagementRequest) -> Result<CborRequest, Error> {
        let command = if request.use_legacy_preview {
            Ctap2CommandCode::AuthenticatorCredentialManagementPreview
        } else {
            Ctap2CommandCode::AuthenticatorCredentialManagement
        };
        Ok(CborRequest {
            command,
            encoded_data: cbor::to_vec(&request)?,
        })
    }
}