From 4210571da36f22e5781e014b41e73a65915bfeab Mon Sep 17 00:00:00 2001 From: Carl Wallace Date: Fri, 29 Nov 2019 09:31:24 -0500 Subject: [PATCH] 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). --- src/cccid.rs | 2 +- src/chuid.rs | 39 ++++++++++++++++++++++++++++++--------- src/consts.rs | 5 +++++ 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/cccid.rs b/src/cccid.rs index ceb30d8..d72c197 100644 --- a/src/cccid.rs +++ b/src/cccid.rs @@ -50,7 +50,7 @@ const CCC_TMPL: &[u8] = &[ /// Cardholder Capability Container (CCC) Identifier #[derive(Copy, Clone, Debug, Eq, PartialEq)] -pub struct CCCID([u8; YKPIV_CCCID_SIZE]); +pub struct CCCID(pub [u8; YKPIV_CCCID_SIZE]); impl CCCID { /// Generate a random CCCID diff --git a/src/chuid.rs b/src/chuid.rs index b3ca6c4..45eb085 100644 --- a/src/chuid.rs +++ b/src/chuid.rs @@ -55,20 +55,40 @@ const CHUID_TMPL: &[u8] = &[ 0x30, 0x33, 0x30, 0x30, 0x31, 0x30, 0x31, 0x3e, 0x00, 0xfe, 0x00, ]; +#[derive(Copy,Clone, Debug)] +pub struct ChuidUuid(pub [u8; YKPIV_CARDID_SIZE]); + /// Cardholder Unique Identifier (CHUID) -#[derive(Copy, Clone, Debug)] -pub struct CHUID(pub [u8; YKPIV_CARDID_SIZE]); +#[derive(Copy, Clone)] +pub struct CHUID(pub [u8; YKPIV_CHUID_SIZE]); 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) - pub fn generate() -> Result { + pub fn generate() -> Result { let mut id = [0u8; YKPIV_CARDID_SIZE]; getrandom(&mut id).map_err(|_| Error::RandomnessError)?; - Ok(CHUID(id)) + Ok(ChuidUuid(id)) } /// Get Cardholder Unique Identifier (CHUID) - pub fn get(yubikey: &mut YubiKey) -> Result { + pub fn get(yubikey: &mut YubiKey) -> Result { let txn = yubikey.begin_transaction()?; let response = txn.fetch_object(YKPIV_OBJ_CHUID)?; @@ -76,15 +96,16 @@ impl CHUID { return Err(Error::GenericError); } - let mut cardid = [0u8; YKPIV_CARDID_SIZE]; - cardid.copy_from_slice(&response[CHUID_GUID_OFFS..(CHUID_GUID_OFFS + YKPIV_CARDID_SIZE)]); - Ok(CHUID(cardid)) + let mut chuid = [0u8; YKPIV_CHUID_SIZE]; + chuid.copy_from_slice(&response[0..YKPIV_CHUID_SIZE]); + let retval = CHUID{0: chuid}; + Ok(retval) } /// Set Cardholder Unique Identifier (CHUID) pub fn set(&self, yubikey: &mut YubiKey) -> Result<(), Error> { 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()?; txn.save_object(YKPIV_OBJ_CHUID, &buf) diff --git a/src/consts.rs b/src/consts.rs index 749a2a2..75ef5dd 100644 --- a/src/consts.rs +++ b/src/consts.rs @@ -63,7 +63,9 @@ pub const CB_PIN_MAX: usize = 8; pub const CCC_ID_OFFS: usize = 9; +pub const CHUID_FASCN_OFFS: usize = 2; 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_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_CHUID_SIZE: usize = 59; 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;