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:
Rahul Frias
2019-10-16 16:53:11 -07:00
parent 2e22e2321e
commit af15f8c83d
6 changed files with 113 additions and 19 deletions

View File

@@ -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,