From 2d1372fbec567866cda2a5a8be5941306931164d Mon Sep 17 00:00:00 2001 From: Alex Dale Date: Thu, 16 Dec 2021 19:33:28 -0800 Subject: [PATCH] Open session when checking for OTA keybox support. [ Merge of http://go/wvgerrit/142089 ] [ Cherry-pick of http://ag/16496425 ] Qualcomm's implementation of GenerateOTARequest requires an open session before attempting to generate an OTA keybox request. When checking for OTA keybox support, the dynamic layer was not opening a session, getting a different error than expected. Coincidentally, this would trick the dynamic layer to thinking it was supported, but hides useful error information. Bug: 210823889 Test: Android manual testing Change-Id: I60662d2d9d411c0f999b619d6088aabdba55e2c3 --- .../core/src/oemcrypto_adapter_dynamic.cpp | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp b/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp index 619e3807..95f672ac 100644 --- a/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp +++ b/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp @@ -1234,14 +1234,28 @@ class Adapter { bool IsOTAKeyboxSupported() { if (!level1_valid_) return false; if (!level1_.GenerateOTARequest) return false; + if (!level1_.OpenSession || !level1_.CloseSession) return false; + OEMCrypto_SESSION session = 0; + OEMCryptoResult result = level1_.OpenSession(&session); + if (result != OEMCrypto_SUCCESS) { + LOGE("Failed to open keybox OTA session: result = %d", result); + return false; + } size_t buffer_size = 500; // a large buffer. std::vector buffer(buffer_size); - OEMCryptoResult result = - level1_.GenerateOTARequest(0, buffer.data(), &buffer_size, 0); + result = + level1_.GenerateOTARequest(session, buffer.data(), &buffer_size, 0); if (result == OEMCrypto_ERROR_SHORT_BUFFER) { buffer.resize(buffer_size); - result = level1_.GenerateOTARequest(0, buffer.data(), &buffer_size, 0); + result = + level1_.GenerateOTARequest(session, buffer.data(), &buffer_size, 0); } + if (result != OEMCrypto_SUCCESS && + result != OEMCrypto_ERROR_NOT_IMPLEMENTED) { + LOGE("Unexpected OTA error: buffer_size = %zu, result = %d", buffer_size, + static_cast(result)); + } + level1_.CloseSession(session); return result == OEMCrypto_SUCCESS; }