1c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis/*
2c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis **
3c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis ** Copyright 2016, The Android Open Source Project
4c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis **
5c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis ** Licensed under the Apache License, Version 2.0 (the "License");
6c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis ** you may not use this file except in compliance with the License.
7c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis ** You may obtain a copy of the License at
8c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis **
9c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis **     http://www.apache.org/licenses/LICENSE-2.0
10c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis **
11c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis ** Unless required by applicable law or agreed to in writing, software
12c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis ** distributed under the License is distributed on an "AS IS" BASIS,
13c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis ** See the License for the specific language governing permissions and
15c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis ** limitations under the License.
16c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis */
17c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis
18c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis#ifndef KEYSTORE_KEYSTORE_HIDL_SUPPORT_H_
19c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis#define KEYSTORE_KEYSTORE_HIDL_SUPPORT_H_
20c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis
21c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis#include <android/hardware/keymaster/3.0/IKeymasterDevice.h>
22c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis#include <hidl/Status.h>
23c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis#include <keystore/keymaster_tags.h>
24c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis#include <ostream>
25c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis#include <sstream>
26c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis#include <string>
27c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis
28c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskisnamespace keystore {
29c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis
30c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskisinline static std::ostream& formatArgs(std::ostream& out) {
31c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    return out;
32c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis}
33c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis
34c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskistemplate <typename First, typename... Args>
35c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskisinline static std::ostream& formatArgs(std::ostream& out, First&& first, Args&&... args) {
36c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    out << first;
37c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    return formatArgs(out, args...);
38c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis}
39c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis
40c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskistemplate <typename... Args> inline static std::string argsToString(Args&&... args) {
41c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    std::stringstream s;
42c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    formatArgs(s, args...);
43c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    return s.str();
44c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis}
45c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis
46c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskistemplate <typename... Msgs>
47c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskisinline static ErrorCode ksHandleHidlError(const Return<ErrorCode>& error, Msgs&&... msgs) {
48c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    if (!error.isOk()) {
49c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis        ALOGE("HIDL call failed with %s @ %s", error.description().c_str(),
50c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis              argsToString(msgs...).c_str());
51c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis        return ErrorCode::UNKNOWN_ERROR;
52c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    }
53c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    return ErrorCode(error);
54c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis}
55c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskistemplate <typename... Msgs>
56c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskisinline static ErrorCode ksHandleHidlError(const Return<void>& error, Msgs&&... msgs) {
57c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    if (!error.isOk()) {
58c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis        ALOGE("HIDL call failed with %s @ %s", error.description().c_str(),
59c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis              argsToString(msgs...).c_str());
60c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis        return ErrorCode::UNKNOWN_ERROR;
61c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    }
62c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    return ErrorCode::OK;
63c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis}
64c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis
65c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis#define KS_HANDLE_HIDL_ERROR(rc)                                                                   \
66c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    ::keystore::ksHandleHidlError(rc, __FILE__, ":", __LINE__, ":", __PRETTY_FUNCTION__)
67c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis
68c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskisinline static hidl_vec<uint8_t> blob2hidlVec(const uint8_t* data, const size_t length,
69c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis                                             bool inPlace = true) {
70c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    hidl_vec<uint8_t> result;
71c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    if (inPlace)
72c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis        result.setToExternal(const_cast<unsigned char*>(data), length);
73c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    else {
74c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis        result.resize(length);
75c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis        memcpy(&result[0], data, length);
76c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    }
77c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    return result;
78c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis}
79c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis
80c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskisinline static hidl_vec<uint8_t> blob2hidlVec(const std::string& value) {
81c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    hidl_vec<uint8_t> result;
82c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    result.setToExternal(
83c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis        reinterpret_cast<uint8_t*>(const_cast<std::string::value_type*>(value.data())),
84c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis        static_cast<size_t>(value.size()));
85c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    return result;
86c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis}
87c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis
88c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskisinline static hidl_vec<uint8_t> blob2hidlVec(const std::vector<uint8_t>& blob) {
89c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    hidl_vec<uint8_t> result;
90c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    result.setToExternal(const_cast<uint8_t*>(blob.data()), static_cast<size_t>(blob.size()));
91c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    return result;
92c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis}
93c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis
94c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskistemplate <typename T, typename OutIter>
95c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskisinline static OutIter copy_bytes_to_iterator(const T& value, OutIter dest) {
96c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    const uint8_t* value_ptr = reinterpret_cast<const uint8_t*>(&value);
97c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    return std::copy(value_ptr, value_ptr + sizeof(value), dest);
98c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis}
99c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis
100d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willdeninline static hidl_vec<uint8_t> authToken2HidlVec(const HardwareAuthToken& token) {
101d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willden    static_assert(
102d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willden        std::is_same<decltype(token.hmac), ::android::hardware::hidl_array<uint8_t, 32>>::value,
103d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willden        "This function assumes token HMAC is 32 bytes, but it might not be.");
104d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willden    static_assert(1 /* version size */ + sizeof(token.challenge) + sizeof(token.userId) +
105d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willden                          sizeof(token.authenticatorId) + sizeof(token.authenticatorType) +
106d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willden                          sizeof(token.timestamp) + 32 /* HMAC size */
107d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willden                      == sizeof(hw_auth_token_t),
108d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willden                  "HardwareAuthToken content size does not match hw_auth_token_t size");
109d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willden
110d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willden    hidl_vec<uint8_t> result;
111d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willden    result.resize(sizeof(hw_auth_token_t));
112d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willden    auto pos = result.begin();
113d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willden    *pos++ = 0;  // Version byte
114d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willden    pos = copy_bytes_to_iterator(token.challenge, pos);
115d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willden    pos = copy_bytes_to_iterator(token.userId, pos);
116d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willden    pos = copy_bytes_to_iterator(token.authenticatorId, pos);
117d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willden    pos = copy_bytes_to_iterator(token.authenticatorType, pos);
118d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willden    pos = copy_bytes_to_iterator(token.timestamp, pos);
119d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willden    pos = std::copy(token.hmac.data(), token.hmac.data() + token.hmac.size(), pos);
120d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willden
121d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willden    return result;
122d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willden}
123d3ed3a207990fa2a1cd2902a07afc9bd3d1f5777Shawn Willden
124c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskisinline std::string hidlVec2String(const hidl_vec<uint8_t>& value) {
125c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis    return std::string(reinterpret_cast<const std::string::value_type*>(&value[0]), value.size());
126c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis}
127c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis
128c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis}  // namespace keystore
129c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis
130c7a9fa29c185a8c1889486d4acf00fd59c513870Janis Danisevskis#endif  // KEYSTORE_KEYSTORE_HIDL_SUPPORT_H_
131