change cccid handling to target entire ccc object (a la yubico-piv-tool status action)

This commit is contained in:
Carl Wallace
2019-11-30 15:11:10 -05:00
parent 77302af21e
commit c8e5c96398
2 changed files with 21 additions and 9 deletions
+20 -9
View File
@@ -48,16 +48,27 @@ const CCC_TMPL: &[u8] = &[
0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00,
]; ];
/// Cardholder Capability Container (CCC) Identifier /// Cardholder Capability Container (CCC) Identifier card ID
#[derive(Copy, Clone, Debug, Eq, PartialEq)] #[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub struct CCCID(pub [u8; YKPIV_CCCID_SIZE]); pub struct CccCardId(pub [u8; YKPIV_CCCID_SIZE]);
/// Cardholder Capability Container (CCC) Identifier
#[derive(Copy, Clone)]
pub struct CCC(pub [u8; YKPIV_CCC_SIZE]);
impl CCC {
/// Return CardId component of CHUID
pub fn cccid(&self) -> Result<CccCardId, Error> {
let mut cccid = [0u8; YKPIV_CCCID_SIZE];
cccid.copy_from_slice(&self.0[CCC_ID_OFFS..(CCC_ID_OFFS + YKPIV_CCCID_SIZE)]);
Ok(CccCardId(cccid))
}
impl CCCID {
/// Generate a random CCCID /// Generate a random CCCID
pub fn generate() -> Result<Self, Error> { pub fn generate() -> Result<CccCardId, Error> {
let mut id = [0u8; YKPIV_CCCID_SIZE]; let mut id = [0u8; YKPIV_CCCID_SIZE];
getrandom(&mut id).map_err(|_| Error::RandomnessError)?; getrandom(&mut id).map_err(|_| Error::RandomnessError)?;
Ok(CCCID(id)) Ok(CccCardId(id))
} }
/// Get Cardholder Capability Container (CCC) ID /// Get Cardholder Capability Container (CCC) ID
@@ -69,15 +80,15 @@ impl CCCID {
return Err(Error::GenericError); return Err(Error::GenericError);
} }
let mut cccid = [0u8; YKPIV_CCCID_SIZE]; let mut ccc = [0u8; YKPIV_CCC_SIZE];
cccid.copy_from_slice(&response[CCC_ID_OFFS..(CCC_ID_OFFS + YKPIV_CCCID_SIZE)]); ccc.copy_from_slice(&response[0..YKPIV_CCC_SIZE]);
Ok(CCCID(cccid)) Ok(CCC { 0: ccc })
} }
/// Get Cardholder Capability Container (CCC) ID /// Get Cardholder Capability Container (CCC) ID
pub fn set(&self, yubikey: &mut YubiKey) -> Result<(), Error> { pub fn set(&self, yubikey: &mut YubiKey) -> Result<(), Error> {
let mut buf = CCC_TMPL.to_vec(); let mut buf = CCC_TMPL.to_vec();
buf[CCC_ID_OFFS..(CCC_ID_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_CAPABILITY, &buf) txn.save_object(YKPIV_OBJ_CAPABILITY, &buf)
+1
View File
@@ -137,6 +137,7 @@ pub const YKPIV_FASCN_SIZE: usize = 25;
pub const YKPIV_EXPIRATION_SIZE: usize = 8; pub const YKPIV_EXPIRATION_SIZE: usize = 8;
pub const YKPIV_CCCID_SIZE: usize = 14; pub const YKPIV_CCCID_SIZE: usize = 14;
pub const YKPIV_CCC_SIZE: usize = 51;
pub const YKPIV_CERTINFO_UNCOMPRESSED: u8 = 0; pub const YKPIV_CERTINFO_UNCOMPRESSED: u8 = 0;
pub const YKPIV_CERTINFO_GZIP: u8 = 1; pub const YKPIV_CERTINFO_GZIP: u8 = 1;