xref: /aosp_15_r20/system/keymaster/ng/KeyMintAidlUtils.cpp (revision 789431f29546679ab5188a97751fb38e3018d44d)
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