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