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
This commit is contained in:
Alex Dale
2021-12-16 19:33:28 -08:00
parent 1b35b915b5
commit 2d1372fbec

View File

@@ -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<uint8_t> 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<int>(result));
}
level1_.CloseSession(session);
return result == OEMCrypto_SUCCESS;
}