diff options
Diffstat (limited to 'crypto/ext4crypt/Keymaster4.cpp')
-rw-r--r-- | crypto/ext4crypt/Keymaster4.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/crypto/ext4crypt/Keymaster4.cpp b/crypto/ext4crypt/Keymaster4.cpp index cebe1f1d5..e5c059a61 100644 --- a/crypto/ext4crypt/Keymaster4.cpp +++ b/crypto/ext4crypt/Keymaster4.cpp @@ -142,6 +142,32 @@ bool Keymaster::generateKey(const km::AuthorizationSet& inParams, std::string* k return true; } +bool Keymaster::exportKey(km::KeyFormat format, KeyBuffer& kmKey, const std::string& clientId, + const std::string& appData, std::string* key) { + auto kmKeyBlob = km::support::blob2hidlVec(std::string(kmKey.data(), kmKey.size())); + auto emptyAssign = NULL; + auto kmClientId = (clientId == "!") ? emptyAssign: km::support::blob2hidlVec(clientId); + auto kmAppData = (appData == "!") ? emptyAssign: km::support::blob2hidlVec(appData); + km::ErrorCode km_error; + auto hidlCb = [&](km::ErrorCode ret, const hidl_vec<uint8_t>& exportedKeyBlob) { + km_error = ret; + if (km_error != km::ErrorCode::OK) return; + if(key) + key->assign(reinterpret_cast<const char*>(&exportedKeyBlob[0]), + exportedKeyBlob.size()); + }; + auto error = mDevice->exportKey(format, kmKeyBlob, kmClientId, kmAppData, hidlCb); + if (!error.isOk()) { + LOG(ERROR) << "export_key failed: " << error.description(); + return false; + } + if (km_error != km::ErrorCode::OK) { + LOG(ERROR) << "export_key failed, code " << int32_t(km_error); + return false; + } + return true; +} + bool Keymaster::deleteKey(const std::string& key) { LOG(ERROR) << "not actually deleting key\n"; return true; |