1*e1997b9aSAndroid Build Coastguard Worker // Copyright 2020, The Android Open Source Project
2*e1997b9aSAndroid Build Coastguard Worker //
3*e1997b9aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*e1997b9aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*e1997b9aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*e1997b9aSAndroid Build Coastguard Worker //
7*e1997b9aSAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0
8*e1997b9aSAndroid Build Coastguard Worker //
9*e1997b9aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*e1997b9aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*e1997b9aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*e1997b9aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*e1997b9aSAndroid Build Coastguard Worker // limitations under the License.
14*e1997b9aSAndroid Build Coastguard Worker
15*e1997b9aSAndroid Build Coastguard Worker //! Utility functions tests.
16*e1997b9aSAndroid Build Coastguard Worker
17*e1997b9aSAndroid Build Coastguard Worker use super::*;
18*e1997b9aSAndroid Build Coastguard Worker use anyhow::Result;
19*e1997b9aSAndroid Build Coastguard Worker
20*e1997b9aSAndroid Build Coastguard Worker #[test]
check_device_attestation_permissions_test() -> Result<()>21*e1997b9aSAndroid Build Coastguard Worker fn check_device_attestation_permissions_test() -> Result<()> {
22*e1997b9aSAndroid Build Coastguard Worker check_device_attestation_permissions().or_else(|error| {
23*e1997b9aSAndroid Build Coastguard Worker match error.root_cause().downcast_ref::<Error>() {
24*e1997b9aSAndroid Build Coastguard Worker // Expected: the context for this test might not be allowed to attest device IDs.
25*e1997b9aSAndroid Build Coastguard Worker Some(Error::Km(ErrorCode::CANNOT_ATTEST_IDS)) => Ok(()),
26*e1997b9aSAndroid Build Coastguard Worker // Other errors are unexpected
27*e1997b9aSAndroid Build Coastguard Worker _ => Err(error),
28*e1997b9aSAndroid Build Coastguard Worker }
29*e1997b9aSAndroid Build Coastguard Worker })
30*e1997b9aSAndroid Build Coastguard Worker }
31*e1997b9aSAndroid Build Coastguard Worker
create_key_descriptors_from_aliases(key_aliases: &[&str]) -> Vec<KeyDescriptor>32*e1997b9aSAndroid Build Coastguard Worker fn create_key_descriptors_from_aliases(key_aliases: &[&str]) -> Vec<KeyDescriptor> {
33*e1997b9aSAndroid Build Coastguard Worker key_aliases
34*e1997b9aSAndroid Build Coastguard Worker .iter()
35*e1997b9aSAndroid Build Coastguard Worker .map(|key_alias| KeyDescriptor {
36*e1997b9aSAndroid Build Coastguard Worker domain: Domain::APP,
37*e1997b9aSAndroid Build Coastguard Worker nspace: 0,
38*e1997b9aSAndroid Build Coastguard Worker alias: Some(key_alias.to_string()),
39*e1997b9aSAndroid Build Coastguard Worker blob: None,
40*e1997b9aSAndroid Build Coastguard Worker })
41*e1997b9aSAndroid Build Coastguard Worker .collect::<Vec<KeyDescriptor>>()
42*e1997b9aSAndroid Build Coastguard Worker }
43*e1997b9aSAndroid Build Coastguard Worker
aliases_from_key_descriptors(key_descriptors: &[KeyDescriptor]) -> Vec<String>44*e1997b9aSAndroid Build Coastguard Worker fn aliases_from_key_descriptors(key_descriptors: &[KeyDescriptor]) -> Vec<String> {
45*e1997b9aSAndroid Build Coastguard Worker key_descriptors
46*e1997b9aSAndroid Build Coastguard Worker .iter()
47*e1997b9aSAndroid Build Coastguard Worker .map(|kd| if let Some(alias) = &kd.alias { String::from(alias) } else { String::from("") })
48*e1997b9aSAndroid Build Coastguard Worker .collect::<Vec<String>>()
49*e1997b9aSAndroid Build Coastguard Worker }
50*e1997b9aSAndroid Build Coastguard Worker
51*e1997b9aSAndroid Build Coastguard Worker #[test]
test_safe_amount_to_return() -> Result<()>52*e1997b9aSAndroid Build Coastguard Worker fn test_safe_amount_to_return() -> Result<()> {
53*e1997b9aSAndroid Build Coastguard Worker let key_aliases = vec!["key1", "key2", "key3"];
54*e1997b9aSAndroid Build Coastguard Worker let key_descriptors = create_key_descriptors_from_aliases(&key_aliases);
55*e1997b9aSAndroid Build Coastguard Worker
56*e1997b9aSAndroid Build Coastguard Worker assert_eq!(estimate_safe_amount_to_return(Domain::APP, 1017, None, &key_descriptors, 20), 1);
57*e1997b9aSAndroid Build Coastguard Worker assert_eq!(estimate_safe_amount_to_return(Domain::APP, 1017, None, &key_descriptors, 50), 2);
58*e1997b9aSAndroid Build Coastguard Worker assert_eq!(estimate_safe_amount_to_return(Domain::APP, 1017, None, &key_descriptors, 100), 3);
59*e1997b9aSAndroid Build Coastguard Worker Ok(())
60*e1997b9aSAndroid Build Coastguard Worker }
61*e1997b9aSAndroid Build Coastguard Worker
62*e1997b9aSAndroid Build Coastguard Worker #[test]
test_merge_and_sort_lists_without_filtering() -> Result<()>63*e1997b9aSAndroid Build Coastguard Worker fn test_merge_and_sort_lists_without_filtering() -> Result<()> {
64*e1997b9aSAndroid Build Coastguard Worker let legacy_key_aliases = vec!["key_c", "key_a", "key_b"];
65*e1997b9aSAndroid Build Coastguard Worker let legacy_key_descriptors = create_key_descriptors_from_aliases(&legacy_key_aliases);
66*e1997b9aSAndroid Build Coastguard Worker let db_key_aliases = vec!["key_a", "key_d"];
67*e1997b9aSAndroid Build Coastguard Worker let db_key_descriptors = create_key_descriptors_from_aliases(&db_key_aliases);
68*e1997b9aSAndroid Build Coastguard Worker let result =
69*e1997b9aSAndroid Build Coastguard Worker merge_and_filter_key_entry_lists(&legacy_key_descriptors, &db_key_descriptors, None);
70*e1997b9aSAndroid Build Coastguard Worker assert_eq!(aliases_from_key_descriptors(&result), vec!["key_a", "key_b", "key_c", "key_d"]);
71*e1997b9aSAndroid Build Coastguard Worker Ok(())
72*e1997b9aSAndroid Build Coastguard Worker }
73*e1997b9aSAndroid Build Coastguard Worker
74*e1997b9aSAndroid Build Coastguard Worker #[test]
test_merge_and_sort_lists_with_filtering() -> Result<()>75*e1997b9aSAndroid Build Coastguard Worker fn test_merge_and_sort_lists_with_filtering() -> Result<()> {
76*e1997b9aSAndroid Build Coastguard Worker let legacy_key_aliases = vec!["key_f", "key_a", "key_e", "key_b"];
77*e1997b9aSAndroid Build Coastguard Worker let legacy_key_descriptors = create_key_descriptors_from_aliases(&legacy_key_aliases);
78*e1997b9aSAndroid Build Coastguard Worker let db_key_aliases = vec!["key_c", "key_g"];
79*e1997b9aSAndroid Build Coastguard Worker let db_key_descriptors = create_key_descriptors_from_aliases(&db_key_aliases);
80*e1997b9aSAndroid Build Coastguard Worker let result = merge_and_filter_key_entry_lists(
81*e1997b9aSAndroid Build Coastguard Worker &legacy_key_descriptors,
82*e1997b9aSAndroid Build Coastguard Worker &db_key_descriptors,
83*e1997b9aSAndroid Build Coastguard Worker Some("key_b"),
84*e1997b9aSAndroid Build Coastguard Worker );
85*e1997b9aSAndroid Build Coastguard Worker assert_eq!(aliases_from_key_descriptors(&result), vec!["key_c", "key_e", "key_f", "key_g"]);
86*e1997b9aSAndroid Build Coastguard Worker Ok(())
87*e1997b9aSAndroid Build Coastguard Worker }
88*e1997b9aSAndroid Build Coastguard Worker
89*e1997b9aSAndroid Build Coastguard Worker #[test]
test_merge_and_sort_lists_with_filtering_and_dups() -> Result<()>90*e1997b9aSAndroid Build Coastguard Worker fn test_merge_and_sort_lists_with_filtering_and_dups() -> Result<()> {
91*e1997b9aSAndroid Build Coastguard Worker let legacy_key_aliases = vec!["key_f", "key_a", "key_e", "key_b"];
92*e1997b9aSAndroid Build Coastguard Worker let legacy_key_descriptors = create_key_descriptors_from_aliases(&legacy_key_aliases);
93*e1997b9aSAndroid Build Coastguard Worker let db_key_aliases = vec!["key_d", "key_e", "key_g"];
94*e1997b9aSAndroid Build Coastguard Worker let db_key_descriptors = create_key_descriptors_from_aliases(&db_key_aliases);
95*e1997b9aSAndroid Build Coastguard Worker let result = merge_and_filter_key_entry_lists(
96*e1997b9aSAndroid Build Coastguard Worker &legacy_key_descriptors,
97*e1997b9aSAndroid Build Coastguard Worker &db_key_descriptors,
98*e1997b9aSAndroid Build Coastguard Worker Some("key_c"),
99*e1997b9aSAndroid Build Coastguard Worker );
100*e1997b9aSAndroid Build Coastguard Worker assert_eq!(aliases_from_key_descriptors(&result), vec!["key_d", "key_e", "key_f", "key_g"]);
101*e1997b9aSAndroid Build Coastguard Worker Ok(())
102*e1997b9aSAndroid Build Coastguard Worker }
103*e1997b9aSAndroid Build Coastguard Worker
104*e1997b9aSAndroid Build Coastguard Worker #[test]
test_list_key_parameters_with_filter_on_security_sensitive_info() -> Result<()>105*e1997b9aSAndroid Build Coastguard Worker fn test_list_key_parameters_with_filter_on_security_sensitive_info() -> Result<()> {
106*e1997b9aSAndroid Build Coastguard Worker let params = vec![
107*e1997b9aSAndroid Build Coastguard Worker KmKeyParameter { tag: Tag::APPLICATION_ID, value: KeyParameterValue::Integer(0) },
108*e1997b9aSAndroid Build Coastguard Worker KmKeyParameter { tag: Tag::APPLICATION_DATA, value: KeyParameterValue::Integer(0) },
109*e1997b9aSAndroid Build Coastguard Worker KmKeyParameter {
110*e1997b9aSAndroid Build Coastguard Worker tag: Tag::CERTIFICATE_NOT_AFTER,
111*e1997b9aSAndroid Build Coastguard Worker value: KeyParameterValue::DateTime(UNDEFINED_NOT_AFTER),
112*e1997b9aSAndroid Build Coastguard Worker },
113*e1997b9aSAndroid Build Coastguard Worker KmKeyParameter { tag: Tag::CERTIFICATE_NOT_BEFORE, value: KeyParameterValue::DateTime(0) },
114*e1997b9aSAndroid Build Coastguard Worker ];
115*e1997b9aSAndroid Build Coastguard Worker let wanted = vec![
116*e1997b9aSAndroid Build Coastguard Worker KmKeyParameter {
117*e1997b9aSAndroid Build Coastguard Worker tag: Tag::CERTIFICATE_NOT_AFTER,
118*e1997b9aSAndroid Build Coastguard Worker value: KeyParameterValue::DateTime(UNDEFINED_NOT_AFTER),
119*e1997b9aSAndroid Build Coastguard Worker },
120*e1997b9aSAndroid Build Coastguard Worker KmKeyParameter { tag: Tag::CERTIFICATE_NOT_BEFORE, value: KeyParameterValue::DateTime(0) },
121*e1997b9aSAndroid Build Coastguard Worker ];
122*e1997b9aSAndroid Build Coastguard Worker
123*e1997b9aSAndroid Build Coastguard Worker assert_eq!(log_security_safe_params(¶ms), wanted);
124*e1997b9aSAndroid Build Coastguard Worker Ok(())
125*e1997b9aSAndroid Build Coastguard Worker }
126