Simplify KeyMint setAdditionalAttestationInfo impl Make `allowed_additional_attestation_tags` a const slice instead of a BTreeSet & make `additional_attestation_info` a Vec instead of BTreeMap. Bug: 369375199 Test: VtsAidlKeyMintTargetTest Change-Id: Iebcc04473e3a051530f71ab324ae8aebfde9888f
diff --git a/ta/src/keys.rs b/ta/src/keys.rs index 87a070d..7323b01 100644 --- a/ta/src/keys.rs +++ b/ta/src/keys.rs
@@ -172,8 +172,6 @@ if let Some(SigningInfo { attestation_info: Some((challenge, app_id)), .. }) = &info { let unique_id = self.calculate_unique_id(app_id, params)?; let boot_info = self.boot_info_hashed_key()?; - let additional_attestation_info = - self.additional_attestation_info.values().cloned().collect::<Vec<_>>(); let attest_ext = cert::attestation_extension( self.aidl_version as i32, challenge, @@ -184,7 +182,7 @@ chars, &unique_id, &boot_info, - additional_attestation_info.as_slice(), + &self.additional_attestation_info, )?; Some( cert::asn1_der_encode(&attest_ext)
diff --git a/ta/src/lib.rs b/ta/src/lib.rs index 773f0c1..95bdf09 100644 --- a/ta/src/lib.rs +++ b/ta/src/lib.rs
@@ -18,8 +18,7 @@ extern crate alloc; use alloc::{ - boxed::Box, collections::BTreeMap, collections::BTreeSet, format, rc::Rc, string::String, - string::ToString, vec::Vec, + boxed::Box, collections::BTreeMap, format, rc::Rc, string::String, string::ToString, vec::Vec, }; use core::cmp::Ordering; use core::mem::size_of; @@ -85,6 +84,9 @@ /// Maximum number of keys whose use count can be tracked. const MAX_USE_COUNTED_KEYS: usize = 32; +/// Tags allowed in `KeyMintTa::additional_attestation_info`. +const ALLOWED_ADDITIONAL_ATTESTATION_TAGS: &[Tag] = &[Tag::ModuleHash]; + /// Per-key ID use count. struct UseCount { key_id: KeyId, @@ -138,10 +140,7 @@ /// Additional information to attest to, provided by Android. Refer to /// `IKeyMintDevice::setAdditionalAttestationInfo()`. - additional_attestation_info: BTreeMap<Tag, KeyParam>, - - /// Tags allowed in additional_attestation_info. - allowed_additional_attestation_tags: BTreeSet<Tag>, + additional_attestation_info: Vec<KeyParam>, /// Attestation chain information, retrieved on first use. attestation_chain_info: RefCell<BTreeMap<device::SigningKeyType, AttestationChainInfo>>, @@ -336,8 +335,7 @@ attestation_chain_info: RefCell::new(BTreeMap::new()), attestation_id_info: RefCell::new(None), dice_info: RefCell::new(None), - additional_attestation_info: BTreeMap::new(), - allowed_additional_attestation_tags: BTreeSet::from([Tag::ModuleHash]), + additional_attestation_info: Vec::new(), } } @@ -1105,25 +1103,35 @@ fn set_additional_attestation_info(&mut self, info: Vec<KeyParam>) -> Result<(), Error> { for param in info { let tag = param.tag(); - if !self.allowed_additional_attestation_tags.contains(&tag) { + if !ALLOWED_ADDITIONAL_ATTESTATION_TAGS.contains(&tag) { + warn!("ignoring non-allowlisted tag: {tag:?}"); continue; } - match self.additional_attestation_info.get(&tag) { + match self.additional_attestation_info.iter().find(|&x| x.tag() == tag) { Some(value) if value == ¶m => { - warn!("additional attestation info for: {:?} already set, ignoring repeated attempt to set same info", param); + warn!( + concat!( + "additional attestation info for: {:?} already set, ignoring repeated", + " attempt to set same info" + ), + param + ); continue; } Some(value) => { return Err(set_additional_attestation_info_err( tag, format!( - "attempt to set additional attestation info for: {:?}, but that tag already has a different value set: {:?}", + concat!( + "attempt to set additional attestation info for: {:?}, but that tag", + " already has a different value set: {:?}" + ), param, value ), )); } None => { - self.additional_attestation_info.insert(tag, param.clone()); + self.additional_attestation_info.push(param.clone()); } } } @@ -1269,12 +1277,12 @@ } } -/// Create an Error for set_additional_attestation_info failure that corresponds to the -/// specified tag. -pub fn set_additional_attestation_info_err(tag: Tag, err_msg: String) -> Error { +/// Create an Error for [`KeyMintTa::set_additional_attestation_info`] failure that corresponds to +/// the specified tag. +fn set_additional_attestation_info_err(tag: Tag, err_msg: String) -> Error { match tag { Tag::ModuleHash => km_err!(ModuleHashAlreadySet, "{}", err_msg), - _ => km_err!(InvalidTag, "unexpected tag: {:?}", tag), + _ => km_err!(InvalidTag, "unexpected tag: {tag:?}"), } }