Change CHUID struct to hold complete CHUID value. Add getters for subcomponents. Add additional consts to support this. Modified CCCID struct to be public (as prelude to similar treatment).

This commit is contained in:
Carl Wallace
2019-11-29 09:31:24 -05:00
parent 82b4bbb35d
commit 4210571da3
3 changed files with 36 additions and 10 deletions
+1 -1
View File
@@ -50,7 +50,7 @@ const CCC_TMPL: &[u8] = &[
/// Cardholder Capability Container (CCC) Identifier /// Cardholder Capability Container (CCC) Identifier
#[derive(Copy, Clone, Debug, Eq, PartialEq)] #[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub struct CCCID([u8; YKPIV_CCCID_SIZE]); pub struct CCCID(pub [u8; YKPIV_CCCID_SIZE]);
impl CCCID { impl CCCID {
/// Generate a random CCCID /// Generate a random CCCID
+30 -9
View File
@@ -55,20 +55,40 @@ const CHUID_TMPL: &[u8] = &[
0x30, 0x33, 0x30, 0x30, 0x31, 0x30, 0x31, 0x3e, 0x00, 0xfe, 0x00, 0x30, 0x33, 0x30, 0x30, 0x31, 0x30, 0x31, 0x3e, 0x00, 0xfe, 0x00,
]; ];
/// Cardholder Unique Identifier (CHUID)
#[derive(Copy,Clone, Debug)] #[derive(Copy,Clone, Debug)]
pub struct CHUID(pub [u8; YKPIV_CARDID_SIZE]); pub struct ChuidUuid(pub [u8; YKPIV_CARDID_SIZE]);
/// Cardholder Unique Identifier (CHUID)
#[derive(Copy, Clone)]
pub struct CHUID(pub [u8; YKPIV_CHUID_SIZE]);
impl CHUID { impl CHUID {
pub fn fascn(&self) -> Result<[u8; YKPIV_FASCN_SIZE], Error> {
let mut fascn = [0u8; YKPIV_FASCN_SIZE];
fascn.copy_from_slice(&self.0[CHUID_FASCN_OFFS..(CHUID_FASCN_OFFS + YKPIV_FASCN_SIZE)]);
Ok(fascn)
}
pub fn uuid(&self) -> Result<[u8; YKPIV_CARDID_SIZE], Error> {
let mut uuid = [0u8; YKPIV_CARDID_SIZE];
uuid.copy_from_slice(&self.0[CHUID_GUID_OFFS..(CHUID_GUID_OFFS + YKPIV_CARDID_SIZE)]);
Ok(uuid)
}
pub fn expiration(&self) -> Result<[u8; YKPIV_EXPIRATION_SIZE], Error> {
let mut expiration = [0u8; YKPIV_EXPIRATION_SIZE];
expiration.copy_from_slice(&self.0[CHUID_EXPIRATION_OFFS..(CHUID_EXPIRATION_OFFS + YKPIV_EXPIRATION_SIZE)]);
Ok(expiration)
}
/// Generate a random Cardholder Unique Identifier (CHUID) /// Generate a random Cardholder Unique Identifier (CHUID)
pub fn generate() -> Result<Self, Error> { pub fn generate() -> Result<ChuidUuid, Error> {
let mut id = [0u8; YKPIV_CARDID_SIZE]; let mut id = [0u8; YKPIV_CARDID_SIZE];
getrandom(&mut id).map_err(|_| Error::RandomnessError)?; getrandom(&mut id).map_err(|_| Error::RandomnessError)?;
Ok(CHUID(id)) Ok(ChuidUuid(id))
} }
/// Get Cardholder Unique Identifier (CHUID) /// Get Cardholder Unique Identifier (CHUID)
pub fn get(yubikey: &mut YubiKey) -> Result<Self, Error> { pub fn get(yubikey: &mut YubiKey) -> Result<CHUID, Error> {
let txn = yubikey.begin_transaction()?; let txn = yubikey.begin_transaction()?;
let response = txn.fetch_object(YKPIV_OBJ_CHUID)?; let response = txn.fetch_object(YKPIV_OBJ_CHUID)?;
@@ -76,15 +96,16 @@ impl CHUID {
return Err(Error::GenericError); return Err(Error::GenericError);
} }
let mut cardid = [0u8; YKPIV_CARDID_SIZE]; let mut chuid = [0u8; YKPIV_CHUID_SIZE];
cardid.copy_from_slice(&response[CHUID_GUID_OFFS..(CHUID_GUID_OFFS + YKPIV_CARDID_SIZE)]); chuid.copy_from_slice(&response[0..YKPIV_CHUID_SIZE]);
Ok(CHUID(cardid)) let retval = CHUID{0: chuid};
Ok(retval)
} }
/// Set Cardholder Unique Identifier (CHUID) /// Set Cardholder Unique Identifier (CHUID)
pub fn set(&self, yubikey: &mut YubiKey) -> Result<(), Error> { pub fn set(&self, yubikey: &mut YubiKey) -> Result<(), Error> {
let mut buf = CHUID_TMPL.to_vec(); let mut buf = CHUID_TMPL.to_vec();
buf[CHUID_GUID_OFFS..(CHUID_GUID_OFFS + self.0.len())].copy_from_slice(&self.0); buf[0..self.0.len()].copy_from_slice(&self.0);
let txn = yubikey.begin_transaction()?; let txn = yubikey.begin_transaction()?;
txn.save_object(YKPIV_OBJ_CHUID, &buf) txn.save_object(YKPIV_OBJ_CHUID, &buf)
+5
View File
@@ -63,7 +63,9 @@ pub const CB_PIN_MAX: usize = 8;
pub const CCC_ID_OFFS: usize = 9; pub const CCC_ID_OFFS: usize = 9;
pub const CHUID_FASCN_OFFS: usize = 2;
pub const CHUID_GUID_OFFS: usize = 29; pub const CHUID_GUID_OFFS: usize = 29;
pub const CHUID_EXPIRATION_OFFS: usize = 47;
pub const CHREF_ACT_CHANGE_PIN: i32 = 0; pub const CHREF_ACT_CHANGE_PIN: i32 = 0;
pub const CHREF_ACT_UNBLOCK_PIN: i32 = 1; pub const CHREF_ACT_UNBLOCK_PIN: i32 = 1;
@@ -129,7 +131,10 @@ pub const YKPIV_ALGO_ECCP384: u8 = 0x14;
pub const YKPIV_ATR_NEO_R3: &[u8] = b";\xFC\x13\0\0\x811\xFE\x15YubikeyNEOr3\xE1\0"; pub const YKPIV_ATR_NEO_R3: &[u8] = b";\xFC\x13\0\0\x811\xFE\x15YubikeyNEOr3\xE1\0";
pub const YKPIV_CHUID_SIZE: usize = 59;
pub const YKPIV_CARDID_SIZE: usize = 16; pub const YKPIV_CARDID_SIZE: usize = 16;
pub const YKPIV_FASCN_SIZE: usize = 25;
pub const YKPIV_EXPIRATION_SIZE: usize = 8;
pub const YKPIV_CCCID_SIZE: usize = 14; pub const YKPIV_CCCID_SIZE: usize = 14;