From c7a8b863cd9684c1221eb7edcf979fd5ed81944d Mon Sep 17 00:00:00 2001 From: Janis Danisevskis Date: Thu, 14 Mar 2019 15:35:48 -0700 Subject: Keymaster support: Verbose vendor errors Added function for verbosely logging Keymaster vendor errors. Bug: 123562864 Test: atest android.keystore.cts Change-Id: Ida093941d3b76b3d2e953439229081345909c16b --- keymaster/4.0/support/Keymaster.cpp | 13 +++++++++++++ keymaster/4.0/support/include/keymasterV4_0/Keymaster.h | 6 ++++++ 2 files changed, 19 insertions(+) (limited to 'keymaster') diff --git a/keymaster/4.0/support/Keymaster.cpp b/keymaster/4.0/support/Keymaster.cpp index 9325cc069..e8db0744e 100644 --- a/keymaster/4.0/support/Keymaster.cpp +++ b/keymaster/4.0/support/Keymaster.cpp @@ -106,6 +106,19 @@ std::vector> enumerateDevices( return result; } +void Keymaster::logIfKeymasterVendorError(ErrorCode ec) const { + static constexpr int32_t k_keymaster_vendor_error_code_range_max = -10000; + if (static_cast(ec) <= k_keymaster_vendor_error_code_range_max) { + const auto& versionInfo = halVersion(); + LOG(ERROR) << "Keymaster reported error: " << static_cast(ec) << "\n" + << "NOTE: This is an error in the vendor specific error range.\n" + << " Refer to the vendor of the implementation for details.\n" + << " Implementation name: " << versionInfo.keymasterName << "\n" + << " Vendor name: " << versionInfo.authorName << "\n" + << " MajorVersion: " << versionInfo.majorVersion; + } +} + Keymaster::KeymasterSet Keymaster::enumerateAvailableDevices() { auto serviceManager = IServiceManager::getService(); CHECK(serviceManager) << "Could not retrieve ServiceManager"; diff --git a/keymaster/4.0/support/include/keymasterV4_0/Keymaster.h b/keymaster/4.0/support/include/keymasterV4_0/Keymaster.h index 458053a4e..43a34b055 100644 --- a/keymaster/4.0/support/include/keymasterV4_0/Keymaster.h +++ b/keymaster/4.0/support/include/keymasterV4_0/Keymaster.h @@ -64,6 +64,12 @@ class Keymaster : public IKeymasterDevice { const hidl_string& descriptor() const { return descriptor_; } const hidl_string& instanceName() const { return instanceName_; } + /** + * If ec is in the vendor error code range (<-10000), logs the fact to logcat. + * There are no side effects otherwise. + */ + void logIfKeymasterVendorError(ErrorCode ec) const; + /** * Returns all available Keymaster3 and Keymaster4 instances, in order of most secure to least * secure (as defined by VersionResult::operator<). -- cgit v1.2.3