1 // Copyright 2020, The Android Open Source Project
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 use super::*;
16 use android_hardware_security_keymint::aidl::android::hardware::security::keymint::TagType::TagType;
17
get_field_by_tag_type(tag: Tag) -> KmKeyParameterValue18 fn get_field_by_tag_type(tag: Tag) -> KmKeyParameterValue {
19 let tag_type = TagType((tag.0 as u32 & 0xF0000000) as i32);
20 match tag {
21 Tag::ALGORITHM => return KmKeyParameterValue::Algorithm(Default::default()),
22 Tag::BLOCK_MODE => return KmKeyParameterValue::BlockMode(Default::default()),
23 Tag::PADDING => return KmKeyParameterValue::PaddingMode(Default::default()),
24 Tag::DIGEST => return KmKeyParameterValue::Digest(Default::default()),
25 Tag::RSA_OAEP_MGF_DIGEST => return KmKeyParameterValue::Digest(Default::default()),
26 Tag::EC_CURVE => return KmKeyParameterValue::EcCurve(Default::default()),
27 Tag::ORIGIN => return KmKeyParameterValue::Origin(Default::default()),
28 Tag::PURPOSE => return KmKeyParameterValue::KeyPurpose(Default::default()),
29 Tag::USER_AUTH_TYPE => {
30 return KmKeyParameterValue::HardwareAuthenticatorType(Default::default())
31 }
32 Tag::HARDWARE_TYPE => return KmKeyParameterValue::SecurityLevel(Default::default()),
33 _ => {}
34 }
35 match tag_type {
36 TagType::INVALID => return KmKeyParameterValue::Invalid(Default::default()),
37 TagType::ENUM | TagType::ENUM_REP => {}
38 TagType::UINT | TagType::UINT_REP => {
39 return KmKeyParameterValue::Integer(Default::default())
40 }
41 TagType::ULONG | TagType::ULONG_REP => {
42 return KmKeyParameterValue::LongInteger(Default::default())
43 }
44 TagType::DATE => return KmKeyParameterValue::DateTime(Default::default()),
45 TagType::BOOL => return KmKeyParameterValue::BoolValue(Default::default()),
46 TagType::BIGNUM | TagType::BYTES => return KmKeyParameterValue::Blob(Default::default()),
47 _ => {}
48 }
49 panic!("Unknown tag/tag_type: {:?} {:?}", tag, tag_type);
50 }
51
check_field_matches_tag_type(list_o_parameters: &[KmKeyParameter])52 fn check_field_matches_tag_type(list_o_parameters: &[KmKeyParameter]) {
53 for kp in list_o_parameters.iter() {
54 match (&kp.value, get_field_by_tag_type(kp.tag)) {
55 (&KmKeyParameterValue::Algorithm(_), KmKeyParameterValue::Algorithm(_))
56 | (&KmKeyParameterValue::BlockMode(_), KmKeyParameterValue::BlockMode(_))
57 | (&KmKeyParameterValue::PaddingMode(_), KmKeyParameterValue::PaddingMode(_))
58 | (&KmKeyParameterValue::Digest(_), KmKeyParameterValue::Digest(_))
59 | (&KmKeyParameterValue::EcCurve(_), KmKeyParameterValue::EcCurve(_))
60 | (&KmKeyParameterValue::Origin(_), KmKeyParameterValue::Origin(_))
61 | (&KmKeyParameterValue::KeyPurpose(_), KmKeyParameterValue::KeyPurpose(_))
62 | (
63 &KmKeyParameterValue::HardwareAuthenticatorType(_),
64 KmKeyParameterValue::HardwareAuthenticatorType(_),
65 )
66 | (&KmKeyParameterValue::SecurityLevel(_), KmKeyParameterValue::SecurityLevel(_))
67 | (&KmKeyParameterValue::Invalid(_), KmKeyParameterValue::Invalid(_))
68 | (&KmKeyParameterValue::Integer(_), KmKeyParameterValue::Integer(_))
69 | (&KmKeyParameterValue::LongInteger(_), KmKeyParameterValue::LongInteger(_))
70 | (&KmKeyParameterValue::DateTime(_), KmKeyParameterValue::DateTime(_))
71 | (&KmKeyParameterValue::BoolValue(_), KmKeyParameterValue::BoolValue(_))
72 | (&KmKeyParameterValue::Blob(_), KmKeyParameterValue::Blob(_)) => {}
73 (actual, expected) => panic!(
74 "Tag {:?} associated with variant {:?} expected {:?}",
75 kp.tag, actual, expected
76 ),
77 }
78 }
79 }
80
81 #[test]
key_parameter_value_field_matches_tag_type()82 fn key_parameter_value_field_matches_tag_type() {
83 check_field_matches_tag_type(&KeyParameterValue::make_field_matches_tag_type_test_vector());
84 }
85
86 #[test]
key_parameter_serialization_test()87 fn key_parameter_serialization_test() {
88 let params = KeyParameterValue::make_key_parameter_defaults_vector();
89 let mut out_buffer: Vec<u8> = Default::default();
90 serde_cbor::to_writer(&mut out_buffer, ¶ms).expect("Failed to serialize key parameters.");
91 let deserialized_params: Vec<KeyParameter> =
92 serde_cbor::from_reader(&mut out_buffer.as_slice())
93 .expect("Failed to deserialize key parameters.");
94 assert_eq!(params, deserialized_params);
95 }
96