diff --git a/src/pcd.rs b/src/pcd.rs index 5e0602c..d9a165a 100644 --- a/src/pcd.rs +++ b/src/pcd.rs @@ -48,10 +48,26 @@ impl<'a> TryFrom<&'a [u8]> for PCD { } } +impl<'a> TryFrom<&'a [u8]> for PCD { + type Error = String; + + fn try_from(value: &'a [u8]) -> Result { + let sized_value: [u8; PCD_EXTENDED_LENGTH] = <[u8; PCD_EXTENDED_LENGTH]>::try_from(value).map_err(|_| format!("PCD size needs to be {}, but was: {}", PCD_EXTENDED_LENGTH, value.len()))?; + Ok(PCD { state: Encrypted { data: sized_value } }) + } +} + impl PCD { pub fn header(&self) -> PCDHeader { self.state.header } + pub fn data(&self) -> Vec { + [ + self.state.pgt.as_slice(), + &self.state.header, + &self.state.card_data, + ].concat() + } } impl From> for PCD { @@ -110,6 +126,16 @@ impl PCD { let sized_data: [u8; PCD_EXTENDED_LENGTH] = <[u8; PCD_EXTENDED_LENGTH]>::try_from(imm_data).map_err(|_| format!("Encrypted data length is {} instead of {}", data.len(), PCD_LENGTH))?; Ok(PCD::new(sized_data)) } + + pub fn simplify(self) -> PCD { + PCD { + state: Partitioned { + pgt: self.state.pgt, + header: self.state.header, + card_data: self.state.card_data, + } + } + } } impl PCD {