From 4210571da36f22e5781e014b41e73a65915bfeab Mon Sep 17 00:00:00 2001 From: Carl Wallace Date: Fri, 29 Nov 2019 09:31:24 -0500 Subject: [PATCH 1/3] 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; From 78288b4200523a2e626b1aabf3c754d7e5536266 Mon Sep 17 00:00:00 2001 From: Carl Wallace Date: Sat, 30 Nov 2019 14:13:34 -0500 Subject: [PATCH 2/3] address formatting and documentation issues flagged by clippy --- src/chuid.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/chuid.rs b/src/chuid.rs index 45eb085..6d1fddf 100644 --- a/src/chuid.rs +++ b/src/chuid.rs @@ -55,6 +55,7 @@ const CHUID_TMPL: &[u8] = &[ 0x30, 0x33, 0x30, 0x30, 0x31, 0x30, 0x31, 0x3e, 0x00, 0xfe, 0x00, ]; +/// Cardholder Unique Identifier (CHUID) Card UUID/GUID value #[derive(Copy,Clone, Debug)] pub struct ChuidUuid(pub [u8; YKPIV_CARDID_SIZE]); @@ -64,19 +65,26 @@ pub struct CHUID(pub [u8; YKPIV_CHUID_SIZE]); impl CHUID { + /// Return FASC-N component of 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) } + + /// Return Card UUID/GUID component of CHUID 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) } + + /// Return expiration date component of CHUID 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)]); + expiration.copy_from_slice( + &self.0[CHUID_EXPIRATION_OFFS..(CHUID_EXPIRATION_OFFS + YKPIV_EXPIRATION_SIZE)] + ); Ok(expiration) } @@ -98,7 +106,7 @@ impl CHUID { let mut chuid = [0u8; YKPIV_CHUID_SIZE]; chuid.copy_from_slice(&response[0..YKPIV_CHUID_SIZE]); - let retval = CHUID{0: chuid}; + let retval = CHUID { 0: chuid }; Ok(retval) } From 77302af21e9a358563e88e8aa2197f968526c5ea Mon Sep 17 00:00:00 2001 From: Carl Wallace Date: Sat, 30 Nov 2019 14:22:33 -0500 Subject: [PATCH 3/3] address formatting per cargo fmt --- src/chuid.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/chuid.rs b/src/chuid.rs index 6d1fddf..9f3c803 100644 --- a/src/chuid.rs +++ b/src/chuid.rs @@ -56,7 +56,7 @@ const CHUID_TMPL: &[u8] = &[ ]; /// Cardholder Unique Identifier (CHUID) Card UUID/GUID value -#[derive(Copy,Clone, Debug)] +#[derive(Copy, Clone, Debug)] pub struct ChuidUuid(pub [u8; YKPIV_CARDID_SIZE]); /// Cardholder Unique Identifier (CHUID) @@ -64,7 +64,6 @@ pub struct ChuidUuid(pub [u8; YKPIV_CARDID_SIZE]); pub struct CHUID(pub [u8; YKPIV_CHUID_SIZE]); impl CHUID { - /// Return FASC-N component of CHUID pub fn fascn(&self) -> Result<[u8; YKPIV_FASCN_SIZE], Error> { let mut fascn = [0u8; YKPIV_FASCN_SIZE]; @@ -83,7 +82,7 @@ impl CHUID { 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)] + &self.0[CHUID_EXPIRATION_OFFS..(CHUID_EXPIRATION_OFFS + YKPIV_EXPIRATION_SIZE)], ); Ok(expiration) }