#![allow(dead_code)]
use serde::Serialize;
pub const MAX_HID_RPT_SIZE: usize = 64;
pub const U2FAPDUHEADER_SIZE: usize = 7;
pub const CID_BROADCAST: [u8; 4] = [0xff, 0xff, 0xff, 0xff];
pub const TYPE_MASK: u8 = 0x80;
pub const TYPE_INIT: u8 = 0x80;
pub const TYPE_CONT: u8 = 0x80;
pub const INIT_HEADER_SIZE: usize = 7;
pub const CONT_HEADER_SIZE: usize = 5;
pub const PARAMETER_SIZE: usize = 32;
pub const FIDO_USAGE_PAGE: u16 = 0xf1d0; pub const FIDO_USAGE_U2FHID: u16 = 0x01; pub const FIDO_USAGE_DATA_IN: u8 = 0x20; pub const FIDO_USAGE_DATA_OUT: u8 = 0x21;
pub const U2FHID_IF_VERSION: u32 = 2; pub const U2FHID_FRAME_TIMEOUT: u32 = 500; pub const U2FHID_TRANS_TIMEOUT: u32 = 3000;
const CTAPHID_PING: u8 = TYPE_INIT | 0x01; const CTAPHID_MSG: u8 = TYPE_INIT | 0x03; const CTAPHID_LOCK: u8 = TYPE_INIT | 0x04; const CTAPHID_INIT: u8 = TYPE_INIT | 0x06; const CTAPHID_WINK: u8 = TYPE_INIT | 0x08; const CTAPHID_CBOR: u8 = TYPE_INIT | 0x10; const CTAPHID_CANCEL: u8 = TYPE_INIT | 0x11; const CTAPHID_KEEPALIVE: u8 = TYPE_INIT | 0x3b; const CTAPHID_ERROR: u8 = TYPE_INIT | 0x3f;
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
#[repr(u8)]
pub enum HIDCmd {
Ping,
Msg,
Lock,
Init,
Wink,
Cbor,
Cancel,
Keepalive,
Error,
Unknown(u8),
}
impl Into<u8> for HIDCmd {
fn into(self) -> u8 {
match self {
HIDCmd::Ping => CTAPHID_PING,
HIDCmd::Msg => CTAPHID_MSG,
HIDCmd::Lock => CTAPHID_LOCK,
HIDCmd::Init => CTAPHID_INIT,
HIDCmd::Wink => CTAPHID_WINK,
HIDCmd::Cbor => CTAPHID_CBOR,
HIDCmd::Cancel => CTAPHID_CANCEL,
HIDCmd::Keepalive => CTAPHID_KEEPALIVE,
HIDCmd::Error => CTAPHID_ERROR,
HIDCmd::Unknown(v) => v,
}
}
}
impl From<u8> for HIDCmd {
fn from(v: u8) -> HIDCmd {
match v {
CTAPHID_PING => HIDCmd::Ping,
CTAPHID_MSG => HIDCmd::Msg,
CTAPHID_LOCK => HIDCmd::Lock,
CTAPHID_INIT => HIDCmd::Init,
CTAPHID_WINK => HIDCmd::Wink,
CTAPHID_CBOR => HIDCmd::Cbor,
CTAPHID_CANCEL => HIDCmd::Cancel,
CTAPHID_KEEPALIVE => HIDCmd::Keepalive,
CTAPHID_ERROR => HIDCmd::Error,
v => HIDCmd::Unknown(v),
}
}
}
pub const U2F_VENDOR_FIRST: u8 = TYPE_INIT | 0x40; pub const U2F_VENDOR_LAST: u8 = TYPE_INIT | 0x7f; pub const U2F_REGISTER: u8 = 0x01; pub const U2F_AUTHENTICATE: u8 = 0x02; pub const U2F_VERSION: u8 = 0x03;
pub const YKPIV_INS_GET_VERSION: u8 = 0xfd;
pub const U2F_REGISTER_ID: u8 = 0x05; pub const U2F_REGISTER_HASH_ID: u8 = 0x00;
pub const U2F_REQUEST_USER_PRESENCE: u8 = 0x03; pub const U2F_CHECK_IS_REGISTERED: u8 = 0x07;
pub const INIT_NONCE_SIZE: usize = 8;
bitflags! {
#[derive(Serialize)]
pub struct Capability: u8 {
const WINK = 0x01;
const LOCK = 0x02;
const CBOR = 0x04;
const NMSG = 0x08;
}
}
impl Capability {
pub fn has_fido1(self) -> bool {
!self.contains(Capability::NMSG)
}
pub fn has_fido2(self) -> bool {
self.contains(Capability::CBOR)
}
}
pub const ERR_NONE: u8 = 0x00; pub const ERR_INVALID_CMD: u8 = 0x01; pub const ERR_INVALID_PAR: u8 = 0x02; pub const ERR_INVALID_LEN: u8 = 0x03; pub const ERR_INVALID_SEQ: u8 = 0x04; pub const ERR_MSG_TIMEOUT: u8 = 0x05; pub const ERR_CHANNEL_BUSY: u8 = 0x06; pub const ERR_LOCK_REQUIRED: u8 = 0x0a; pub const ERR_INVALID_CID: u8 = 0x0b; pub const ERR_OTHER: u8 = 0x7f;
pub const SW_NO_ERROR: [u8; 2] = [0x90, 0x00];
pub const SW_CONDITIONS_NOT_SATISFIED: [u8; 2] = [0x69, 0x85];
pub const SW_WRONG_DATA: [u8; 2] = [0x6A, 0x80];
pub const SW_WRONG_LENGTH: [u8; 2] = [0x67, 0x00];