diff --git a/src/ikm.rs b/src/ikm.rs index 87ee50e..45d2fda 100644 --- a/src/ikm.rs +++ b/src/ikm.rs @@ -98,6 +98,17 @@ impl InputKeyMaterialList { Ok(()) } + #[cfg(feature = "ikm-management")] + pub fn revoke_ikm(&mut self, id: IkmId) -> Result<()> { + let ikm = self + .ikm_lst + .iter_mut() + .find(|ikm| ikm.id == id) + .ok_or(Error::IkmNotFound(id))?; + ikm.is_revoked = true; + Ok(()) + } + #[cfg(feature = "ikm-management")] pub fn export(&self) -> Result { let data_size = (self.ikm_lst.len() * IKM_STRUCT_SIZE) + 4; @@ -277,6 +288,25 @@ mod tests { } } + #[test] + #[cfg(feature = "ikm-management")] + fn revoke_ikm() { + let mut lst = InputKeyMaterialList::new(); + let _ = lst.add_ikm(); + let _ = lst.add_ikm(); + + let latest_ikm = lst.get_latest_ikm().unwrap(); + assert_eq!(latest_ikm.id, 2); + + let _ = lst.revoke_ikm(2); + let latest_ikm = lst.get_latest_ikm().unwrap(); + assert_eq!(latest_ikm.id, 1); + + let _ = lst.revoke_ikm(1); + let res = lst.get_latest_ikm(); + assert!(res.is_err()); + } + #[test] #[cfg(feature = "encryption")] fn get_latest_ikm() {