diff --git a/src/lib.rs b/src/lib.rs index e92eed2..05fffb4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -123,8 +123,8 @@ where Command::ChangeReference(change_reference) => { self.load()?.change_reference(change_reference) } - Command::GetData(container) => self.get_data(container, reply), - Command::PutData(put_data) => self.put_data(put_data), + Command::GetData(container) => self.load()?.get_data(container, reply), + Command::PutData(put_data) => self.load()?.put_data(put_data), Command::Select(_aid) => self.select(reply), Command::GeneralAuthenticate(authenticate) => { self.load()? @@ -203,32 +203,6 @@ where } Ok(()) } - - fn get_data( - &mut self, - container: Container, - mut reply: Reply<'_, R>, - ) -> Result { - // TODO: check security status, else return Status::SecurityStatusNotSatisfied - - use state::ContainerStorage; - reply.expand(&ContainerStorage(container).load(&mut self.trussed)?) - } - - fn put_data(&mut self, put_data: PutData<'_>) -> Result { - // TODO: check security status, else return Status::SecurityStatusNotSatisfied - - let (container, data) = match put_data { - PutData::Any(container, data) => (container, data), - PutData::BitGroupTemplate(data) => { - (Container::BiometricInformationTemplatesGroupTemplate, data) - } - PutData::DiscoveryObject(data) => (Container::DiscoveryObject, data), - }; - - use state::ContainerStorage; - ContainerStorage(container).save(&mut self.trussed, data) - } } impl<'a, T: trussed::Client + trussed::client::Ed255> LoadedAuthenticator<'a, T> { @@ -821,4 +795,33 @@ impl<'a, T: trussed::Client + trussed::client::Ed255> LoadedAuthenticator<'a, T> Ok(()) } + + fn get_data( + &mut self, + container: Container, + mut reply: Reply<'_, R>, + ) -> Result { + // TODO: check security status, else return Status::SecurityStatusNotSatisfied + + use state::ContainerStorage; + match ContainerStorage(container).load(self.trussed)? { + Some(data) => reply.expand(&data), + None => Err(Status::NotFound), + } + } + + fn put_data(&mut self, put_data: PutData<'_>) -> Result { + // TODO: check security status, else return Status::SecurityStatusNotSatisfied + + let (container, data) = match put_data { + PutData::Any(container, data) => (container, data), + PutData::BitGroupTemplate(data) => { + (Container::BiometricInformationTemplatesGroupTemplate, data) + } + PutData::DiscoveryObject(data) => (Container::DiscoveryObject, data), + }; + + use state::ContainerStorage; + ContainerStorage(container).save(self.trussed, data) + } } diff --git a/src/state.rs b/src/state.rs index d65fa5f..4f4fb1d 100644 --- a/src/state.rs +++ b/src/state.rs @@ -546,16 +546,25 @@ impl ContainerStorage { }) } - fn default(self) -> &'static [u8] { - todo!() + fn default(self) -> Option> { + match self.0 { + Container::CardHolderUniqueIdentifier => panic!("CHUID should alway be set"), + Container::CardCapabilityContainer => Some( + crate::piv_types::CardCapabilityContainer::default() + .to_heapless_vec() + .unwrap(), + ), + Container::DiscoveryObject => Some(Vec::from_slice(&DISCOVERY_OBJECT).unwrap()), + _ => None, + } } pub fn load( self, client: &mut impl trussed::Client, - ) -> Result, Status> { + ) -> Result>, Status> { load_if_exists(client, Location::Internal, &self.path()) - .map(|data| data.unwrap_or_else(|| Bytes::from_slice(self.default()).unwrap())) + .map(|data| data.or_else(|| self.default().map(Bytes::from))) } pub fn save(self, client: &mut impl trussed::Client, bytes: &[u8]) -> Result<(), Status> {