Send spoids in provisioning requests
[ Merge of http://go/wvgerrit/87283 ] SPOIDs (Stable Per-Origin IDentifiers) were not correctly being set during CdmEngine construction. This resulted in SPOID values not being sent in provisioning requests. This caused the serial number in the drm certificate to not be stable after a reprovision. This behaviour appears to be true going back to O. CdmEngine no longer takes a SPOID in the constructor since not all callers use SPOIDs. A setter has been added in its place. Previously spoid had a default argument to the constructor. Bug: 142368328 Test: android unit/integration tests Change-Id: I711346df609636ecf1475dc37873454a7ef000c0
This commit is contained in:
@@ -57,6 +57,9 @@ const wvcdm::CdmIdentifier kExampleIdentifier = {
|
||||
const wvcdm::CdmIdentifier kAlternateCdmIdentifier1 = {
|
||||
"alternate_spoid_1", "alternate_origin_1", "com.alternate1.url", 8};
|
||||
|
||||
const wvcdm::CdmIdentifier kAlternateCdmIdentifier2 = {
|
||||
"alternate_spoid_2", "" /* empty origin */, "com.alternate2.url", 8};
|
||||
|
||||
const std::string kEmptyServiceCertificate;
|
||||
const std::string kComma = ",";
|
||||
|
||||
@@ -66,6 +69,8 @@ const size_t kNonceTableSize = 4;
|
||||
// Protobuf generated classes
|
||||
using video_widevine::LicenseIdentification;
|
||||
using video_widevine::LicenseRequest_ContentIdentification;
|
||||
using video_widevine::ProvisioningResponse;
|
||||
using video_widevine::SignedProvisioningMessage;
|
||||
|
||||
// TODO(rfrias): refactor to print out the decryption test names
|
||||
struct SubSampleInfo {
|
||||
@@ -2003,7 +2008,8 @@ class WvCdmRequestLicenseTest : public WvCdmTestBase {
|
||||
Provision(kDefaultCdmIdentifier, level);
|
||||
}
|
||||
|
||||
void Provision(const CdmIdentifier& identifier, SecurityLevel level) {
|
||||
void Provision(const CdmIdentifier& identifier, SecurityLevel level,
|
||||
CdmProvisioningResponse* provisioning_response = nullptr) {
|
||||
TestWvCdmClientPropertySet property_set_L3;
|
||||
TestWvCdmClientPropertySet* property_set = nullptr;
|
||||
|
||||
@@ -2036,8 +2042,9 @@ class WvCdmRequestLicenseTest : public WvCdmTestBase {
|
||||
if (NO_ERROR != status) return;
|
||||
EXPECT_EQ(provisioning_server, config_.provisioning_server());
|
||||
|
||||
std::string response =
|
||||
CdmProvisioningResponse response =
|
||||
GetCertRequestResponse(config_.provisioning_server());
|
||||
if (provisioning_response != nullptr) *provisioning_response = response;
|
||||
EXPECT_NE(0, static_cast<int>(response.size()));
|
||||
EXPECT_EQ(wvcdm::NO_ERROR, decryptor_->HandleProvisioningResponse(
|
||||
identifier, response, &cert, &wrapped_key));
|
||||
@@ -2091,6 +2098,43 @@ class WvCdmRequestLicenseTest : public WvCdmTestBase {
|
||||
return value;
|
||||
}
|
||||
|
||||
bool GetSerialNumber(const CdmProvisioningResponse& response,
|
||||
std::string* serial_number) {
|
||||
if (serial_number == nullptr) {
|
||||
EXPECT_TRUE(false);
|
||||
return false;
|
||||
}
|
||||
|
||||
CdmProvisioningResponse provisioning_response;
|
||||
if (!CertificateProvisioning::ExtractAndDecodeSignedMessageForTesting(
|
||||
response, &provisioning_response)) {
|
||||
EXPECT_TRUE(false);
|
||||
return false;
|
||||
}
|
||||
|
||||
SignedProvisioningMessage signed_response;
|
||||
if (!signed_response.ParseFromString(provisioning_response) ||
|
||||
!signed_response.has_message()) {
|
||||
EXPECT_TRUE(false);
|
||||
return false;
|
||||
}
|
||||
|
||||
ProvisioningResponse prov_response;
|
||||
if (!prov_response.ParseFromString(signed_response.message()) ||
|
||||
!prov_response.has_device_certificate()) {
|
||||
EXPECT_TRUE(false);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!CertificateProvisioning::ExtractDeviceInfo(
|
||||
prov_response.device_certificate(), serial_number, nullptr)) {
|
||||
EXPECT_TRUE(false);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
android::sp<wvcdm::WvContentDecryptionModule> decryptor_;
|
||||
CdmKeyMessage key_msg_;
|
||||
CdmSessionId session_id_;
|
||||
@@ -2390,6 +2434,57 @@ TEST_F(WvCdmRequestLicenseTest, DISABLED_X509ProvisioningTest) {
|
||||
decryptor_->CloseSession(session_id_);
|
||||
}
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, ProvisioningSpoidTest) {
|
||||
CdmProvisioningResponse provisioning_response;
|
||||
|
||||
Unprovision();
|
||||
Provision(kDefaultCdmIdentifier, kLevelDefault, &provisioning_response);
|
||||
std::string default_cdm_id_serial_number_1;
|
||||
EXPECT_TRUE(
|
||||
GetSerialNumber(provisioning_response, &default_cdm_id_serial_number_1));
|
||||
|
||||
Unprovision();
|
||||
Provision(kDefaultCdmIdentifier, kLevelDefault, &provisioning_response);
|
||||
std::string default_cdm_id_serial_number_2;
|
||||
EXPECT_TRUE(
|
||||
GetSerialNumber(provisioning_response, &default_cdm_id_serial_number_2));
|
||||
|
||||
Unprovision();
|
||||
Provision(kAlternateCdmIdentifier1, kLevelDefault, &provisioning_response);
|
||||
std::string alternate_cdm_id_1_serial_number_1;
|
||||
EXPECT_TRUE(GetSerialNumber(provisioning_response,
|
||||
&alternate_cdm_id_1_serial_number_1));
|
||||
|
||||
Unprovision();
|
||||
Provision(kAlternateCdmIdentifier1, kLevelDefault, &provisioning_response);
|
||||
std::string alternate_cdm_id_1_serial_number_2;
|
||||
EXPECT_TRUE(GetSerialNumber(provisioning_response,
|
||||
&alternate_cdm_id_1_serial_number_2));
|
||||
|
||||
Unprovision();
|
||||
Provision(kAlternateCdmIdentifier2, kLevelDefault, &provisioning_response);
|
||||
std::string alternate_cdm_id_2_serial_number_1;
|
||||
EXPECT_TRUE(GetSerialNumber(provisioning_response,
|
||||
&alternate_cdm_id_2_serial_number_1));
|
||||
|
||||
Unprovision();
|
||||
Provision(kAlternateCdmIdentifier2, kLevelDefault, &provisioning_response);
|
||||
std::string alternate_cdm_id_2_serial_number_2;
|
||||
EXPECT_TRUE(GetSerialNumber(provisioning_response,
|
||||
&alternate_cdm_id_2_serial_number_2));
|
||||
|
||||
EXPECT_EQ(default_cdm_id_serial_number_1, default_cdm_id_serial_number_2);
|
||||
EXPECT_EQ(alternate_cdm_id_1_serial_number_1,
|
||||
alternate_cdm_id_1_serial_number_2);
|
||||
EXPECT_EQ(alternate_cdm_id_2_serial_number_1,
|
||||
alternate_cdm_id_2_serial_number_2);
|
||||
|
||||
EXPECT_NE(default_cdm_id_serial_number_1, alternate_cdm_id_1_serial_number_1);
|
||||
EXPECT_NE(default_cdm_id_serial_number_1, alternate_cdm_id_2_serial_number_1);
|
||||
EXPECT_NE(alternate_cdm_id_1_serial_number_1,
|
||||
alternate_cdm_id_2_serial_number_1);
|
||||
}
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, PropertySetTest) {
|
||||
TestWvCdmClientPropertySet property_set_L1;
|
||||
TestWvCdmClientPropertySet property_set_L3;
|
||||
@@ -2398,6 +2493,9 @@ TEST_F(WvCdmRequestLicenseTest, PropertySetTest) {
|
||||
CdmSessionId session_id_L3;
|
||||
CdmSessionId session_id_Ln;
|
||||
|
||||
Unprovision();
|
||||
Provision(kLevelDefault);
|
||||
|
||||
property_set_L1.set_security_level(QUERY_VALUE_SECURITY_LEVEL_L1);
|
||||
property_set_L1.set_use_privacy_mode(true);
|
||||
decryptor_->OpenSession(config_.key_system(), &property_set_L1,
|
||||
|
||||
Reference in New Issue
Block a user