• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, &params).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