diff options
Diffstat (limited to 'ng/KeyMintAidlUtils.cpp')
-rw-r--r-- | ng/KeyMintAidlUtils.cpp | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/ng/KeyMintAidlUtils.cpp b/ng/KeyMintAidlUtils.cpp new file mode 100644 index 0000000..17a53a5 --- /dev/null +++ b/ng/KeyMintAidlUtils.cpp @@ -0,0 +1,147 @@ +/* + * + * Copyright 2020, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "include/KeyMintAidlUtils.h" + +namespace aidl { +namespace android { +namespace hardware { +namespace keymint { + +using namespace ::keymaster; + +vector<uint8_t> authToken2AidlVec(const HardwareAuthToken& token) { + static_assert(1 /* version size */ + sizeof(token.challenge) + sizeof(token.userId) + + sizeof(token.authenticatorId) + sizeof(token.authenticatorType) + + sizeof(token.timestamp) + 32 /* HMAC size */ + == sizeof(hw_auth_token_t), + "HardwareAuthToken content size does not match hw_auth_token_t size"); + + vector<uint8_t> result; + + if (token.mac.size() <= 32) return result; + + result.resize(sizeof(hw_auth_token_t)); + auto pos = result.begin(); + *pos++ = 0; // Version byte + pos = copy_bytes_to_iterator(token.challenge, pos); + pos = copy_bytes_to_iterator(token.userId, pos); + pos = copy_bytes_to_iterator(token.authenticatorId, pos); + pos = copy_bytes_to_iterator(token.authenticatorType, pos); + pos = copy_bytes_to_iterator(token.timestamp, pos); + pos = std::copy(token.mac.data(), token.mac.data() + token.mac.size(), pos); + + return result; +} + +// TODO(seleneh): This needs to be modified depends on how aidl support for union came out to +// be. +vector<KeyParameter> kmParamSet2Aidl(const keymaster_key_param_set_t& set) { + vector<KeyParameter> result; + if (set.length == 0 || set.params == nullptr) return result; + + result.resize(set.length); + keymaster_key_param_t* params = set.params; + for (size_t i = 0; i < set.length; ++i) { + auto tag = params[i].tag; + result[i].tag = legacy_enum_conversion(tag); + switch (typeFromTag(tag)) { + case KM_ENUM: + case KM_ENUM_REP: + result[i].integer = params[i].enumerated; + break; + case KM_UINT: + case KM_UINT_REP: + result[i].integer = params[i].integer; + break; + case KM_ULONG: + case KM_ULONG_REP: + result[i].longInteger = params[i].long_integer; + break; + case KM_DATE: + result[i].longInteger = params[i].date_time; + break; + case KM_BOOL: + result[i].boolValue = params[i].boolean; + break; + case KM_BIGNUM: + case KM_BYTES: + result[i].blob.assign(params[i].blob.data, + params[i].blob.data + params[i].blob.data_length); + break; + case KM_INVALID: + default: + params[i].tag = KM_TAG_INVALID; + /* just skip */ + break; + } + } + return result; +} + +// TODO(seleneh): This needs to be modified depends on how aidl support for union came out to +// be. +keymaster_key_param_set_t aidlKeyParams2Km(const vector<KeyParameter>& keyParams) { + keymaster_key_param_set_t set; + + set.params = new keymaster_key_param_t[keyParams.size()]; + set.length = keyParams.size(); + + for (size_t i = 0; i < keyParams.size(); ++i) { + auto tag = legacy_enum_conversion(keyParams[i].tag); + switch (typeFromTag(tag)) { + case KM_ENUM: + case KM_ENUM_REP: + set.params[i] = keymaster_param_enum(tag, keyParams[i].integer); + break; + case KM_UINT: + case KM_UINT_REP: + set.params[i] = keymaster_param_int(tag, keyParams[i].integer); + break; + case KM_ULONG: + case KM_ULONG_REP: + set.params[i] = keymaster_param_long(tag, keyParams[i].longInteger); + break; + case KM_DATE: + set.params[i] = keymaster_param_date(tag, keyParams[i].longInteger); + break; + case KM_BOOL: + if (keyParams[i].boolValue) + set.params[i] = keymaster_param_bool(tag); + else + set.params[i].tag = KM_TAG_INVALID; + break; + case KM_BIGNUM: + case KM_BYTES: + set.params[i] = + keymaster_param_blob(tag, keyParams[i].blob.data(), keyParams[i].blob.size()); + break; + case KM_INVALID: + default: + set.params[i].tag = KM_TAG_INVALID; + /* just skip */ + break; + } + } + + return set; +} + +} // namespace keymint +} // namespace hardware +} // namespace android +} // namespace aidl |