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