use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum IdentifierTier {
High,
Medium,
Low,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum IdentifierKind {
SmbiosBoardUuid,
SmbiosSystemSerial,
TpmEndorsementKey,
CpuVendorAndModel,
MachineId,
DiskSerial { index: u8 },
MacAddress { index: u8 },
PciSignature { index: u8 },
}
impl IdentifierKind {
pub fn description(&self) -> &'static str {
match self {
IdentifierKind::SmbiosBoardUuid => "SMBIOS board UUID",
IdentifierKind::SmbiosSystemSerial => "SMBIOS system serial",
IdentifierKind::TpmEndorsementKey => "TPM endorsement key",
IdentifierKind::CpuVendorAndModel => "CPU vendor + model",
IdentifierKind::MachineId => "machine-id",
IdentifierKind::DiskSerial { .. } => "disk serial",
IdentifierKind::MacAddress { .. } => "MAC address",
IdentifierKind::PciSignature { .. } => "PCI device signature",
}
}
pub fn tier(&self) -> IdentifierTier {
match self {
IdentifierKind::SmbiosBoardUuid
| IdentifierKind::SmbiosSystemSerial
| IdentifierKind::TpmEndorsementKey => IdentifierTier::High,
IdentifierKind::CpuVendorAndModel
| IdentifierKind::MachineId
| IdentifierKind::DiskSerial { .. } => IdentifierTier::Medium,
IdentifierKind::MacAddress { .. } | IdentifierKind::PciSignature { .. } => {
IdentifierTier::Low
}
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HardwareIdentifier {
pub kind: IdentifierKind,
pub value: Vec<u8>,
}
impl HardwareIdentifier {
pub fn new(kind: IdentifierKind, value: Vec<u8>) -> Self {
Self { kind, value }
}
pub fn tier(&self) -> IdentifierTier {
self.kind.tier()
}
}