#[allow(dead_code)] #[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub(super) enum InputCap {
None,
YesNo,
Keyboard,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub(super) enum OutputCap {
None,
Numeric,
}
#[derive(Clone, Copy, Debug)]
pub(super) enum KeyGenMethod {
JustWorks,
PasskeyEntry,
NumCompare,
}
impl KeyGenMethod {
#[rustfmt::skip]
const MAP: [[Self; 5]; 5] = {
use KeyGenMethod::*;
[ [JustWorks, JustWorks, PasskeyEntry, JustWorks, PasskeyEntry ], [JustWorks, NumCompare, PasskeyEntry, JustWorks, NumCompare ], [PasskeyEntry, PasskeyEntry, PasskeyEntry, JustWorks, PasskeyEntry ], [JustWorks, JustWorks, JustWorks, JustWorks, JustWorks ], [PasskeyEntry, NumCompare, PasskeyEntry, JustWorks, NumCompare ], ]
};
#[inline(always)]
pub const fn resolve(a: IoCap, b: IoCap) -> Self {
Self::MAP[a as usize][b as usize]
}
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, num_enum::IntoPrimitive, num_enum::TryFromPrimitive,
)]
#[non_exhaustive]
#[repr(u8)]
pub enum Code {
PairingRequest = 0x01,
PairingResponse = 0x02,
PairingConfirm = 0x03,
PairingRandom = 0x04,
PairingFailed = 0x05,
EncryptionInformation = 0x06,
CentralIdentification = 0x07,
IdentityInformation = 0x08,
IdentityAddressInformation = 0x09,
SigningInformation = 0x0A,
SecurityRequest = 0x0B,
PairingPublicKey = 0x0C,
PairingDhKeyCheck = 0x0D,
PairingKeypressNotification = 0x0E,
}
#[derive(
Clone, Copy, Debug, Default, Eq, PartialEq, num_enum::IntoPrimitive, num_enum::TryFromPrimitive,
)]
#[non_exhaustive]
#[repr(u8)]
pub(super) enum IoCap {
DisplayOnly = 0x00,
DisplayYesNo = 0x01,
KeyboardOnly = 0x02,
#[default]
NoInputNoOutput = 0x03,
KeyboardDisplay = 0x04,
}
impl IoCap {
#[must_use]
#[inline]
pub const fn new(inp: InputCap, out: OutputCap) -> Self {
#[allow(clippy::match_same_arms)]
match (inp, out) {
(InputCap::None, OutputCap::None) => Self::NoInputNoOutput,
(InputCap::None, OutputCap::Numeric) => Self::DisplayOnly,
(InputCap::YesNo, OutputCap::None) => Self::NoInputNoOutput,
(InputCap::YesNo, OutputCap::Numeric) => Self::DisplayYesNo,
(InputCap::Keyboard, OutputCap::None) => Self::KeyboardOnly,
(InputCap::Keyboard, OutputCap::Numeric) => Self::KeyboardDisplay,
}
}
}
bitflags::bitflags! {
#[derive(Clone, Copy, Debug, Default)]
#[repr(transparent)]
pub struct AuthReq: u8 {
const BONDING = 0b01 << 0;
const MITM = 1 << 2;
const SC = 1 << 3;
const KEYPRESS = 1 << 4;
const CT2 = 1 << 5;
}
}
bitflags::bitflags! {
#[derive(Clone, Copy, Debug, Default)]
#[repr(transparent)]
pub struct KeyDist: u8 {
const ENC = 1 << 0;
const ID = 1 << 1;
const SIGN = 1 << 2;
const LINK = 1 << 3;
}
}
#[derive(
Clone,
Copy,
Debug,
Eq,
PartialEq,
num_enum::IntoPrimitive,
num_enum::TryFromPrimitive,
thiserror::Error,
)]
#[non_exhaustive]
#[repr(u8)]
pub enum Reason {
PasskeyEntryFailed = 0x01,
OobNotAvailable = 0x02,
AuthenticationRequirements = 0x03,
ConfirmValueFailed = 0x04,
PairingNotSupported = 0x05,
EncryptionKeySize = 0x06,
CommandNotSupported = 0x07,
UnspecifiedReason = 0x08,
RepeatedAttempts = 0x09,
InvalidParameters = 0x0A,
DhKeyCheckFailed = 0x0B,
NumericComparisonFailed = 0x0C,
BredrPairingInProgress = 0x0D,
CrossTransportKeyDerivationNotAllowed = 0x0E,
KeyRejected = 0x0F,
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, num_enum::IntoPrimitive, num_enum::TryFromPrimitive,
)]
#[non_exhaustive]
#[repr(u8)]
pub enum PasskeyEntry {
Started = 0,
DigitEntered = 1,
DigitErased = 2,
Cleared = 3,
Completed = 4,
}
crate::impl_display_via_debug! { Code, IoCap, Reason, PasskeyEntry }