Merge pull request #42 from carl-wallace/develop
Change CHUID struct to hold complete CHUID value. Add getters for sub components. Add additional consts to support this. Modified CCCID struct to be public (as prelude to similar treatment).
This commit is contained in:
+1
-1
@@ -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
|
||||||
|
|||||||
+37
-9
@@ -55,20 +55,47 @@ 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)
|
/// Cardholder Unique Identifier (CHUID) Card UUID/GUID value
|
||||||
#[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 {
|
||||||
|
/// 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)],
|
||||||
|
);
|
||||||
|
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 +103,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)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user