Added CDM support for production readiness reporting. am: cd5afa88a6
Original change: https://googleplex-android-review.googlesource.com/c/platform/vendor/widevine/+/18195696 Change-Id: I21f1bf89e4b9821f5b01ced5530a45763543947f Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -238,6 +238,7 @@ void WVDrmFactory::printCdmProperties(int fd) {
|
|||||||
{"can disable analog output:",
|
{"can disable analog output:",
|
||||||
wvcdm::QUERY_KEY_CAN_DISABLE_ANALOG_OUTPUT},
|
wvcdm::QUERY_KEY_CAN_DISABLE_ANALOG_OUTPUT},
|
||||||
{"watermarking support:", wvcdm::QUERY_KEY_WATERMARKING_SUPPORT},
|
{"watermarking support:", wvcdm::QUERY_KEY_WATERMARKING_SUPPORT},
|
||||||
|
{"production ready:", wvcdm::QUERY_KEY_PRODUCTION_READY},
|
||||||
};
|
};
|
||||||
|
|
||||||
string value;
|
string value;
|
||||||
|
|||||||
@@ -221,6 +221,11 @@ class CryptoSession {
|
|||||||
RequestedSecurityLevel requested_security_level,
|
RequestedSecurityLevel requested_security_level,
|
||||||
CdmWatermarkingSupport* support);
|
CdmWatermarkingSupport* support);
|
||||||
|
|
||||||
|
virtual bool GetProductionReadiness(CdmProductionReadiness* readiness);
|
||||||
|
virtual bool GetProductionReadiness(
|
||||||
|
RequestedSecurityLevel requested_security_level,
|
||||||
|
CdmProductionReadiness* readiness);
|
||||||
|
|
||||||
virtual bool GetMaximumUsageTableEntries(
|
virtual bool GetMaximumUsageTableEntries(
|
||||||
RequestedSecurityLevel security_level, size_t* number_of_entries);
|
RequestedSecurityLevel security_level, size_t* number_of_entries);
|
||||||
|
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ OEMCryptoResult OEMCrypto_GetOEMPublicCertificate(uint8_t* public_cert,
|
|||||||
RequestedSecurityLevel level);
|
RequestedSecurityLevel level);
|
||||||
OEMCrypto_WatermarkingSupport OEMCrypto_GetWatermarkingSupport(
|
OEMCrypto_WatermarkingSupport OEMCrypto_GetWatermarkingSupport(
|
||||||
RequestedSecurityLevel level);
|
RequestedSecurityLevel level);
|
||||||
|
OEMCryptoResult OEMCrypto_ProductionReady(RequestedSecurityLevel level);
|
||||||
} // namespace wvcdm
|
} // namespace wvcdm
|
||||||
|
|
||||||
/* The following functions are deprecated in OEMCrypto v13. They are defined
|
/* The following functions are deprecated in OEMCrypto v13. They are defined
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ static const std::string QUERY_KEY_ANALOG_OUTPUT_CAPABILITIES =
|
|||||||
static const std::string QUERY_KEY_CAN_DISABLE_ANALOG_OUTPUT =
|
static const std::string QUERY_KEY_CAN_DISABLE_ANALOG_OUTPUT =
|
||||||
"CanDisableAnalogOutput";
|
"CanDisableAnalogOutput";
|
||||||
static const std::string QUERY_KEY_WATERMARKING_SUPPORT = "WatermarkingSupport";
|
static const std::string QUERY_KEY_WATERMARKING_SUPPORT = "WatermarkingSupport";
|
||||||
|
static const std::string QUERY_KEY_PRODUCTION_READY = "ProductionReady";
|
||||||
|
|
||||||
static const std::string QUERY_VALUE_TRUE = "True";
|
static const std::string QUERY_VALUE_TRUE = "True";
|
||||||
static const std::string QUERY_VALUE_FALSE = "False";
|
static const std::string QUERY_VALUE_FALSE = "False";
|
||||||
|
|||||||
@@ -599,6 +599,12 @@ enum CdmWatermarkingSupport : int32_t {
|
|||||||
kWatermarkingAlwaysOn
|
kWatermarkingAlwaysOn
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum CdmProductionReadiness : int32_t {
|
||||||
|
kProductionReadinessUnknown,
|
||||||
|
kProductionReadinessTrue,
|
||||||
|
kProductionReadinessFalse,
|
||||||
|
};
|
||||||
|
|
||||||
class CdmKeyAllowedUsage {
|
class CdmKeyAllowedUsage {
|
||||||
public:
|
public:
|
||||||
CdmKeyAllowedUsage() { Clear(); }
|
CdmKeyAllowedUsage() { Clear(); }
|
||||||
@@ -842,6 +848,7 @@ const char* CdmUsageEntryStorageTypeToString(CdmUsageEntryStorageType type);
|
|||||||
const char* RequestedSecurityLevelToString(
|
const char* RequestedSecurityLevelToString(
|
||||||
RequestedSecurityLevel security_level);
|
RequestedSecurityLevel security_level);
|
||||||
const char* CdmWatermarkingSupportToString(CdmWatermarkingSupport support);
|
const char* CdmWatermarkingSupportToString(CdmWatermarkingSupport support);
|
||||||
|
const char* CdmProductionReadinessToString(CdmProductionReadiness readiness);
|
||||||
// Converts a generic, unknown enum value to a string representation
|
// Converts a generic, unknown enum value to a string representation
|
||||||
// containing its numeric value.
|
// containing its numeric value.
|
||||||
// The pointer returned from this function is thread_local.
|
// The pointer returned from this function is thread_local.
|
||||||
|
|||||||
@@ -817,6 +817,28 @@ CdmResponseType CdmEngine::QueryStatus(RequestedSecurityLevel security_level,
|
|||||||
}
|
}
|
||||||
return NO_ERROR;
|
return NO_ERROR;
|
||||||
}
|
}
|
||||||
|
if (query_token == QUERY_KEY_PRODUCTION_READY) {
|
||||||
|
CdmProductionReadiness readiness;
|
||||||
|
if (!crypto_session->GetProductionReadiness(security_level, &readiness)) {
|
||||||
|
LOGW("GetProductionReadiness failed");
|
||||||
|
return UNKNOWN_ERROR;
|
||||||
|
}
|
||||||
|
switch (readiness) {
|
||||||
|
case kProductionReadinessUnknown:
|
||||||
|
*query_response = QUERY_VALUE_UNKNOWN;
|
||||||
|
break;
|
||||||
|
case kProductionReadinessTrue:
|
||||||
|
*query_response = QUERY_VALUE_TRUE;
|
||||||
|
break;
|
||||||
|
case kProductionReadinessFalse:
|
||||||
|
*query_response = QUERY_VALUE_FALSE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOGW("Unknown readiness: %d", static_cast<int>(readiness));
|
||||||
|
return UNKNOWN_ERROR;
|
||||||
|
}
|
||||||
|
return NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
CdmResponseType status;
|
CdmResponseType status;
|
||||||
M_TIME(status = crypto_session->Open(security_level),
|
M_TIME(status = crypto_session->Open(security_level),
|
||||||
|
|||||||
@@ -2345,6 +2345,34 @@ bool CryptoSession::GetWatermarkingSupport(
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CryptoSession::GetProductionReadiness(CdmProductionReadiness* readiness) {
|
||||||
|
RETURN_IF_NOT_OPEN(false);
|
||||||
|
return GetProductionReadiness(requested_security_level_, readiness);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CryptoSession::GetProductionReadiness(
|
||||||
|
RequestedSecurityLevel security_level, CdmProductionReadiness* readiness) {
|
||||||
|
LOGV("security_level = %s", RequestedSecurityLevelToString(security_level));
|
||||||
|
RETURN_IF_UNINITIALIZED(false);
|
||||||
|
RETURN_IF_NULL(readiness, false);
|
||||||
|
const OEMCryptoResult result = WithOecReadLock("GetProductionReadiness", [&] {
|
||||||
|
return OEMCrypto_ProductionReady(security_level);
|
||||||
|
});
|
||||||
|
switch (result) {
|
||||||
|
case OEMCrypto_SUCCESS:
|
||||||
|
*readiness = kProductionReadinessTrue;
|
||||||
|
break;
|
||||||
|
case OEMCrypto_ERROR_NOT_IMPLEMENTED:
|
||||||
|
*readiness = kProductionReadinessUnknown;
|
||||||
|
break;
|
||||||
|
case OEMCrypto_ERROR_UNKNOWN_FAILURE:
|
||||||
|
default: // Other vendor-defined codes indicate not production ready.
|
||||||
|
*readiness = kProductionReadinessFalse;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool CryptoSession::GetMaximumUsageTableEntries(
|
bool CryptoSession::GetMaximumUsageTableEntries(
|
||||||
RequestedSecurityLevel security_level, size_t* number_of_entries) {
|
RequestedSecurityLevel security_level, size_t* number_of_entries) {
|
||||||
LOGV("Getting maximum usage table entries: security_level = %s",
|
LOGV("Getting maximum usage table entries: security_level = %s",
|
||||||
|
|||||||
@@ -1912,6 +1912,15 @@ OEMCrypto_WatermarkingSupport OEMCrypto_GetWatermarkingSupport(
|
|||||||
return OEMCrypto_WatermarkingError;
|
return OEMCrypto_WatermarkingError;
|
||||||
return fcn->GetWatermarkingSupport();
|
return fcn->GetWatermarkingSupport();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OEMCryptoResult OEMCrypto_ProductionReady(wvcdm::RequestedSecurityLevel level) {
|
||||||
|
if (!gAdapter) return OEMCrypto_ERROR_UNKNOWN_FAILURE;
|
||||||
|
const FunctionPointers* fcn = gAdapter->GetFunctionPointers(level);
|
||||||
|
if (!fcn) return OEMCrypto_ERROR_NOT_IMPLEMENTED;
|
||||||
|
if (fcn->version < 17) return OEMCrypto_ERROR_NOT_IMPLEMENTED;
|
||||||
|
if (fcn->ProductionReady == nullptr) return OEMCrypto_ERROR_NOT_IMPLEMENTED;
|
||||||
|
return fcn->ProductionReady();
|
||||||
|
}
|
||||||
} // namespace wvcdm
|
} // namespace wvcdm
|
||||||
|
|
||||||
extern "C" OEMCryptoResult OEMCrypto_SetSandbox(const uint8_t* sandbox_id,
|
extern "C" OEMCryptoResult OEMCrypto_SetSandbox(const uint8_t* sandbox_id,
|
||||||
@@ -3310,15 +3319,6 @@ extern "C" OEMCryptoResult OEMCrypto_LoadCasECMKeys(
|
|||||||
odd_key);
|
odd_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" OEMCryptoResult OEMCrypto_ProductionReady() {
|
|
||||||
if (!gAdapter) return OEMCrypto_ERROR_UNKNOWN_FAILURE;
|
|
||||||
const FunctionPointers* fcn = gAdapter->GetFunctionPointers(kLevelDefault);
|
|
||||||
if (!fcn) return OEMCrypto_ERROR_NOT_IMPLEMENTED;
|
|
||||||
if (fcn->version < 17) return OEMCrypto_ERROR_NOT_IMPLEMENTED;
|
|
||||||
if (fcn->ProductionReady == nullptr) return OEMCrypto_ERROR_NOT_IMPLEMENTED;
|
|
||||||
return fcn->ProductionReady();
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" OEMCryptoResult OEMCrypto_OPK_SerializationVersion(
|
extern "C" OEMCryptoResult OEMCrypto_OPK_SerializationVersion(
|
||||||
uint32_t* ree_major, uint32_t* ree_minor, uint32_t* tee_major,
|
uint32_t* ree_major, uint32_t* ree_minor, uint32_t* tee_major,
|
||||||
uint32_t* tee_minor) {
|
uint32_t* tee_minor) {
|
||||||
@@ -3423,3 +3423,7 @@ extern "C" OEMCrypto_WatermarkingSupport OEMCrypto_GetWatermarkingSupport(
|
|||||||
void) {
|
void) {
|
||||||
return wvcdm::OEMCrypto_GetWatermarkingSupport(kLevelDefault);
|
return wvcdm::OEMCrypto_GetWatermarkingSupport(kLevelDefault);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" OEMCryptoResult OEMCrypto_ProductionReady(void) {
|
||||||
|
return wvcdm::OEMCrypto_ProductionReady(kLevelDefault);
|
||||||
|
}
|
||||||
|
|||||||
@@ -131,6 +131,18 @@ const char* CdmWatermarkingSupportToString(CdmWatermarkingSupport support) {
|
|||||||
return UnknownValueRep(support);
|
return UnknownValueRep(support);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* CdmProductionReadinessToString(CdmProductionReadiness readiness) {
|
||||||
|
switch (readiness) {
|
||||||
|
case kProductionReadinessUnknown:
|
||||||
|
return QUERY_VALUE_UNKNOWN.c_str();
|
||||||
|
case kProductionReadinessTrue:
|
||||||
|
return QUERY_VALUE_TRUE.c_str();
|
||||||
|
case kProductionReadinessFalse:
|
||||||
|
return QUERY_VALUE_FALSE.c_str();
|
||||||
|
}
|
||||||
|
return UnknownValueRep(readiness);
|
||||||
|
}
|
||||||
|
|
||||||
const char* UnknownEnumValueToString(int value) {
|
const char* UnknownEnumValueToString(int value) {
|
||||||
snprintf(tl_unknown_rep_buf, sizeof(tl_unknown_rep_buf), "<unknown(%d)>",
|
snprintf(tl_unknown_rep_buf, sizeof(tl_unknown_rep_buf), "<unknown(%d)>",
|
||||||
value);
|
value);
|
||||||
|
|||||||
@@ -5284,6 +5284,14 @@ TEST_F(WvCdmRequestLicenseTest, QueryStatus) {
|
|||||||
value == wvcdm::QUERY_VALUE_CONFIGURABLE ||
|
value == wvcdm::QUERY_VALUE_CONFIGURABLE ||
|
||||||
value == wvcdm::QUERY_VALUE_ALWAYS_ON)
|
value == wvcdm::QUERY_VALUE_ALWAYS_ON)
|
||||||
<< "Watermarking support";
|
<< "Watermarking support";
|
||||||
|
|
||||||
|
EXPECT_EQ(wvcdm::NO_ERROR,
|
||||||
|
decryptor_->QueryStatus(kLevelDefault,
|
||||||
|
wvcdm::QUERY_KEY_PRODUCTION_READY, &value));
|
||||||
|
EXPECT_TRUE(value == wvcdm::QUERY_VALUE_TRUE ||
|
||||||
|
value == wvcdm::QUERY_VALUE_FALSE ||
|
||||||
|
value == wvcdm::QUERY_VALUE_UNKNOWN)
|
||||||
|
<< "Production ready";
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(WvCdmRequestLicenseTest, QueryStatusL3) {
|
TEST_F(WvCdmRequestLicenseTest, QueryStatusL3) {
|
||||||
@@ -5427,11 +5435,19 @@ TEST_F(WvCdmRequestLicenseTest, QueryStatusL3) {
|
|||||||
|
|
||||||
EXPECT_EQ(wvcdm::NO_ERROR,
|
EXPECT_EQ(wvcdm::NO_ERROR,
|
||||||
decryptor_->QueryStatus(
|
decryptor_->QueryStatus(
|
||||||
kLevelDefault, wvcdm::QUERY_KEY_WATERMARKING_SUPPORT, &value));
|
kLevel3, wvcdm::QUERY_KEY_WATERMARKING_SUPPORT, &value));
|
||||||
EXPECT_TRUE(value == wvcdm::QUERY_VALUE_NOT_SUPPORTED ||
|
EXPECT_TRUE(value == wvcdm::QUERY_VALUE_NOT_SUPPORTED ||
|
||||||
value == wvcdm::QUERY_VALUE_CONFIGURABLE ||
|
value == wvcdm::QUERY_VALUE_CONFIGURABLE ||
|
||||||
value == wvcdm::QUERY_VALUE_ALWAYS_ON)
|
value == wvcdm::QUERY_VALUE_ALWAYS_ON)
|
||||||
<< "Watermarking support";
|
<< "Watermarking support";
|
||||||
|
|
||||||
|
EXPECT_EQ(wvcdm::NO_ERROR,
|
||||||
|
decryptor_->QueryStatus(kLevel3, wvcdm::QUERY_KEY_PRODUCTION_READY,
|
||||||
|
&value));
|
||||||
|
EXPECT_TRUE(value == wvcdm::QUERY_VALUE_TRUE ||
|
||||||
|
value == wvcdm::QUERY_VALUE_FALSE ||
|
||||||
|
value == wvcdm::QUERY_VALUE_UNKNOWN)
|
||||||
|
<< "Production ready";
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(WvCdmRequestLicenseTest, QueryOemCryptoSessionId) {
|
TEST_F(WvCdmRequestLicenseTest, QueryOemCryptoSessionId) {
|
||||||
|
|||||||
@@ -1152,6 +1152,8 @@ Status WVDrmPlugin::unprovisionDevice() {
|
|||||||
}
|
}
|
||||||
} else if (name == "watermarkingSupport") {
|
} else if (name == "watermarkingSupport") {
|
||||||
status = queryProperty(wvcdm::QUERY_KEY_WATERMARKING_SUPPORT, value);
|
status = queryProperty(wvcdm::QUERY_KEY_WATERMARKING_SUPPORT, value);
|
||||||
|
} else if (name == "productionReady") {
|
||||||
|
status = queryProperty(wvcdm::QUERY_KEY_PRODUCTION_READY, value);
|
||||||
} else {
|
} else {
|
||||||
ALOGE("App requested unknown string property %s", name.c_str());
|
ALOGE("App requested unknown string property %s", name.c_str());
|
||||||
*_aidl_return = value;
|
*_aidl_return = value;
|
||||||
|
|||||||
@@ -1261,6 +1261,8 @@ Return<void> WVDrmPlugin::getPropertyString(const hidl_string& propertyName,
|
|||||||
}
|
}
|
||||||
} else if (name == "watermarkingSupport") {
|
} else if (name == "watermarkingSupport") {
|
||||||
status = queryProperty(wvcdm::QUERY_KEY_WATERMARKING_SUPPORT, value);
|
status = queryProperty(wvcdm::QUERY_KEY_WATERMARKING_SUPPORT, value);
|
||||||
|
} else if (name == "productionReady") {
|
||||||
|
status = queryProperty(wvcdm::QUERY_KEY_PRODUCTION_READY, value);
|
||||||
} else {
|
} else {
|
||||||
ALOGE("App requested unknown string property %s", name.c_str());
|
ALOGE("App requested unknown string property %s", name.c_str());
|
||||||
status = Status::ERROR_DRM_CANNOT_HANDLE;
|
status = Status::ERROR_DRM_CANNOT_HANDLE;
|
||||||
|
|||||||
@@ -217,6 +217,7 @@ void WVDrmFactory::printCdmProperties(FILE* out) {
|
|||||||
{"can disable analog output:",
|
{"can disable analog output:",
|
||||||
wvcdm::QUERY_KEY_CAN_DISABLE_ANALOG_OUTPUT},
|
wvcdm::QUERY_KEY_CAN_DISABLE_ANALOG_OUTPUT},
|
||||||
{"watermarking support:", wvcdm::QUERY_KEY_WATERMARKING_SUPPORT},
|
{"watermarking support:", wvcdm::QUERY_KEY_WATERMARKING_SUPPORT},
|
||||||
|
{"production ready:", wvcdm::QUERY_KEY_PRODUCTION_READY},
|
||||||
};
|
};
|
||||||
|
|
||||||
std::string value;
|
std::string value;
|
||||||
|
|||||||
Reference in New Issue
Block a user