aidl plugin: add error details to return status

Merged from http://go/wvgerrit/163639

Bug: 253271674
Test: Google TV
Test: atest MediaDrmParameterizedTests
Test: atest DrmSessionManagerTest
Change-Id: I9f0e83774d405466a389d2fd90d693830682dde4
This commit is contained in:
Robert Shih
2022-11-30 18:39:52 -08:00
committed by Edwin Wong
parent 2384efde1e
commit 1fdbd3cd2c
15 changed files with 354 additions and 311 deletions

View File

@@ -0,0 +1,168 @@
//
// Copyright 2022 Google LLC. All Rights Reserved. This file and proprietary
// source code may only be used and distributed under the Widevine License
// Agreement.
//
#include "Utils.h"
#include <unordered_map>
#include <json/json.h>
namespace {
// Please keep the order stable.
// If APIs are renamed please keep the old enum and add new enum to bottom.
enum CryptoSessionApi : int32_t {
API_UNKNOWN = 0,
GET_PROVISIONING_METHOD = 1,
GET_TOKEN_FROM_KEYBOX = 2,
GET_TOKEN_FROM_OEM_CERT = 3,
GET_PROVISIONING_TOKEN = 4,
GET_INTERNAL_DEVICE_UNIQUE_ID = 5,
GET_EXTERNAL_DEVICE_UNIQUE_ID = 6,
GET_PROVISIONING_ID = 7,
OPEN = 8,
PREPARE_AND_SIGN_LICENSE_REQUEST = 9,
USE_SECONDARY_KEY = 10,
LOAD_LICENSE = 11,
PREPARE_AND_SIGN_RENEWAL_REQUEST = 12,
LOAD_RENEWAL = 13,
PREPARE_AND_SIGN_PROVISIONING_REQUEST = 14,
LOAD_ENTITLED_CONTENT_KEYS = 15,
LOAD_CERTIFICATE_PRIVATE_KEY = 16,
GET_BOOT_CERTIFICATE_CHAIN = 17,
GENERATE_CERTIFICATE_KEY_PAIR = 18,
LOAD_OEM_CERTIFICATE_PRIVATE_KEY = 19,
SELECT_KEY = 20,
GENERATE_DERIVED_KEYS = 21,
GENERATE_RSA_SIGNATURE = 22,
DECRYPT = 23,
DEACTIVATE_USAGE_INFORMATION = 24,
GENERATE_USAGE_REPORT = 25,
GENERATE_NONCE = 26,
LOAD_PROVISIONING = 27,
GET_HDCP_CAPABILITIES = 28,
GET_RANDOM = 29,
GET_NUMBER_OF_OPEN_SESSIONS = 30,
GET_MAX_NUMBER_OF_SESSIONS = 31,
GET_SRM_VERSION = 32,
SET_DECRYPT_HASH = 33,
GET_DECRYPT_HASH_ERROR = 34,
GENERIC_ENCRYPT = 35,
GENERIC_DECRYPT = 36,
GENERIC_SIGN = 37,
GENERIC_VERIFY = 38,
CREATE_USAGE_TABLE_HEADER = 39,
LOAD_USAGE_TABLE_HEADER = 40,
SHRINK_USAGE_TABLE_HEADER = 41,
CREATE_USAGE_ENTRY = 42,
LOAD_USAGE_ENTRY = 43,
UPDATE_USAGE_ENTRY = 44,
MOVE_USAGE_ENTRY = 45,
SET_DEBUG_IGNORE_KEYBOX_COUNT = 46,
SET_ALLOW_TEST_KEYBOX = 47,
PREPARE_OTA_PROVISIONING_REQUEST = 48,
LOAD_OTA_PROVISIONING = 49,
// insert new or renamed methods' enum below
};
static std::unordered_map<std::string, CryptoSessionApi> const table = {
{"ApiUnknown", API_UNKNOWN},
{"GetProvisioningMethod", GET_PROVISIONING_METHOD},
{"GetTokenFromKeybox", GET_TOKEN_FROM_KEYBOX},
{"GetTokenFromOemCert", GET_TOKEN_FROM_OEM_CERT},
{"GetProvisioningToken", GET_PROVISIONING_TOKEN},
{"GetInternalDeviceUniqueId", GET_INTERNAL_DEVICE_UNIQUE_ID},
{"GetExternalDeviceUniqueId", GET_EXTERNAL_DEVICE_UNIQUE_ID},
{"GetProvisioningId", GET_PROVISIONING_ID},
{"Open", OPEN},
{"PrepareAndSignLicenseRequest", PREPARE_AND_SIGN_LICENSE_REQUEST},
{"UseSecondaryKey", USE_SECONDARY_KEY},
{"LoadLicense", LOAD_LICENSE},
{"PrepareAndSignLicenseRequest", PREPARE_AND_SIGN_LICENSE_REQUEST},
{"LoadRenewal", LOAD_RENEWAL},
{"PrepareAndSignProvisioningRequest", PREPARE_AND_SIGN_PROVISIONING_REQUEST},
{"LoadEntitledContentKeys", LOAD_ENTITLED_CONTENT_KEYS},
{"LoadCertificatePrivateKey", LOAD_CERTIFICATE_PRIVATE_KEY},
{"GetBootCertificateChain", GET_BOOT_CERTIFICATE_CHAIN},
{"GenerateCertificateKeyPair", GENERATE_CERTIFICATE_KEY_PAIR},
{"LoadOemCertificatePrivateKey", LOAD_OEM_CERTIFICATE_PRIVATE_KEY},
{"SelectKey", SELECT_KEY},
{"GenerateDerivedKeys", GENERATE_DERIVED_KEYS},
{"GenerateRsaSignature", GENERATE_RSA_SIGNATURE},
{"Decrypt", DECRYPT},
{"DeactivateUsageInformation", DEACTIVATE_USAGE_INFORMATION},
{"GenerateUsageReport", GENERATE_USAGE_REPORT},
{"GenerateNonce", GENERATE_NONCE},
{"LoadProvisioning", LOAD_PROVISIONING},
{"GetHdcpCapabilities", GET_HDCP_CAPABILITIES},
{"GetRandom", GET_RANDOM},
{"GetNumberOfOpenSessions", GET_NUMBER_OF_OPEN_SESSIONS},
{"GetMaxNumberOfSessions", GET_MAX_NUMBER_OF_SESSIONS},
{"GetSrmVersion", GET_SRM_VERSION},
{"SetDecryptHash", SET_DECRYPT_HASH},
{"GetDecryptHashError", GET_DECRYPT_HASH_ERROR},
{"GenericEncrypt", GENERIC_ENCRYPT},
{"GenericDecrypt", GENERIC_DECRYPT},
{"GenericSign", GENERIC_SIGN},
{"GenericVerify", GENERIC_VERIFY},
{"CreateUsageTableHeader", CREATE_USAGE_TABLE_HEADER},
{"LoadUsageTableHeader", LOAD_USAGE_TABLE_HEADER},
{"ShrinkUsageTableHeader", SHRINK_USAGE_TABLE_HEADER},
{"CreateUsageEntry", CREATE_USAGE_ENTRY},
{"LoadUsageEntry", LOAD_USAGE_ENTRY},
{"UpdateUsageEntry", UPDATE_USAGE_ENTRY},
{"MoveUsageEntry", MOVE_USAGE_ENTRY},
{"SetDebugIgnoreKeyboxCount", SET_DEBUG_IGNORE_KEYBOX_COUNT},
{"SetAllowTestKeybox", SET_ALLOW_TEST_KEYBOX},
{"PrepareOtaProvisioningRequest", PREPARE_OTA_PROVISIONING_REQUEST},
{"LoadOtaProvisioning", LOAD_OTA_PROVISIONING},
// insert new or renamed methods below
};
} // namespace
namespace wvdrm {
CryptoSessionApi getCryptoSessionMethodEnum(const std::string& method) {
if (!method.empty()) {
auto it = table.find(method);
if (it != table.end()) {
return it->second;
}
}
return API_UNKNOWN;
}
::ndk::ScopedAStatus toNdkScopedAStatus(::wvdrm::WvStatus status,
const char* msg) {
if (status == ::aidl::android::hardware::drm::Status::OK) {
return ::ndk::ScopedAStatus::ok();
} else {
auto err = static_cast<int32_t>(status);
Json::Value jsonMsg(Json::objectValue);
auto cdmErr = status.getCdmErr();
auto cdmStatus = cdmErr.Enum();
if (cdmStatus) {
jsonMsg["cdmError"] = cdmStatus;
}
auto oemErr = cdmErr.getOEMCryptoResult();
if (oemErr) {
jsonMsg["oemError"] = oemErr;
}
auto cryptoSessionMethod = cdmErr.getCryptoSessionMethod();
if (cryptoSessionMethod != nullptr) {
jsonMsg["context"] =
getCryptoSessionMethodEnum(std::string(cryptoSessionMethod));
}
if (msg) {
jsonMsg["errorMessage"] = msg;
}
Json::FastWriter writer;
return ::ndk::ScopedAStatus::fromServiceSpecificErrorWithMessage(
err, writer.write(jsonMsg).c_str());
}
}
} // namespace wvdrm

View File

@@ -17,7 +17,7 @@ adb push $(OUT)/data/fuzz/arm64/lib/ /data/fuzz/arm64/lib/
adb shell<br>
cd /data/fuzz/arm64<br>
`LD_LIBRARY_PATH=/data/fuzz/arm65/lib /data/fuzz/arm64/android.hardware.drm-service.widevine.aidl_fuzzer/vendor/hw/android.hardware.drm-service.widevine.aidl_fuzzer`
`LD_LIBRARY_PATH=/data/fuzz/arm64/lib /data/fuzz/arm64/android.hardware.drm-service.widevine.aidl_fuzzer/vendor/hw/android.hardware.drm-service.widevine.aidl_fuzzer`
## Monitoring