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