1 /*
2 *
3 * Copyright 2020, The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 #include "include/KeyMintAidlUtils.h"
19
20 namespace aidl {
21 namespace android {
22 namespace hardware {
23 namespace keymint {
24
25 using namespace ::keymaster;
26
27 // TODO(seleneh): This needs to be modified depends on how aidl support for union came out to
28 // be.
kmParamSet2Aidl(const keymaster_key_param_set_t & set)29 vector<KeyParameter> kmParamSet2Aidl(const keymaster_key_param_set_t& set) {
30 vector<KeyParameter> result;
31 if (set.length == 0 || set.params == nullptr) return result;
32
33 result.resize(set.length);
34 keymaster_key_param_t* params = set.params;
35 for (size_t i = 0; i < set.length; ++i) {
36 auto tag = params[i].tag;
37 result[i].tag = legacy_enum_conversion(tag);
38 switch (typeFromTag(tag)) {
39 case KM_ENUM:
40 case KM_ENUM_REP:
41 result[i].integer = params[i].enumerated;
42 break;
43 case KM_UINT:
44 case KM_UINT_REP:
45 result[i].integer = params[i].integer;
46 break;
47 case KM_ULONG:
48 case KM_ULONG_REP:
49 result[i].longInteger = params[i].long_integer;
50 break;
51 case KM_DATE:
52 result[i].longInteger = params[i].date_time;
53 break;
54 case KM_BOOL:
55 result[i].boolValue = params[i].boolean;
56 break;
57 case KM_BIGNUM:
58 case KM_BYTES:
59 result[i].blob.assign(params[i].blob.data,
60 params[i].blob.data + params[i].blob.data_length);
61 break;
62 case KM_INVALID:
63 default:
64 params[i].tag = KM_TAG_INVALID;
65 /* just skip */
66 break;
67 }
68 }
69 return result;
70 }
71
72 // TODO(seleneh): This needs to be modified depends on how aidl support for union came out to
73 // be.
aidlKeyParams2Km(const vector<KeyParameter> & keyParams)74 keymaster_key_param_set_t aidlKeyParams2Km(const vector<KeyParameter>& keyParams) {
75 keymaster_key_param_set_t set;
76
77 set.params = new (std::nothrow) keymaster_key_param_t[keyParams.size()];
78 set.length = keyParams.size();
79
80 for (size_t i = 0; i < keyParams.size(); ++i) {
81 auto tag = legacy_enum_conversion(keyParams[i].tag);
82 switch (typeFromTag(tag)) {
83 case KM_ENUM:
84 case KM_ENUM_REP:
85 set.params[i] = keymaster_param_enum(tag, keyParams[i].integer);
86 break;
87 case KM_UINT:
88 case KM_UINT_REP:
89 set.params[i] = keymaster_param_int(tag, keyParams[i].integer);
90 break;
91 case KM_ULONG:
92 case KM_ULONG_REP:
93 set.params[i] = keymaster_param_long(tag, keyParams[i].longInteger);
94 break;
95 case KM_DATE:
96 set.params[i] = keymaster_param_date(tag, keyParams[i].longInteger);
97 break;
98 case KM_BOOL:
99 if (keyParams[i].boolValue)
100 set.params[i] = keymaster_param_bool(tag);
101 else
102 set.params[i].tag = KM_TAG_INVALID;
103 break;
104 case KM_BIGNUM:
105 case KM_BYTES:
106 set.params[i] =
107 keymaster_param_blob(tag, keyParams[i].blob.data(), keyParams[i].blob.size());
108 break;
109 case KM_INVALID:
110 default:
111 set.params[i].tag = KM_TAG_INVALID;
112 /* just skip */
113 break;
114 }
115 }
116
117 return set;
118 }
119
120 } // namespace keymint
121 } // namespace hardware
122 } // namespace android
123 } // namespace aidl
124