Secure stop API related changes
[ Merge of http://go/wvgerrit/44921 ] * Added the ability to remove a single usage information record. * Added a method to retrieve all secure stop Ids. Bug: 69674645 Test: WV unit, integration tests Change-Id: I04ac8224b4bdda69541e61ff1103af3836138228
This commit is contained in:
@@ -37,6 +37,7 @@ using ::testing::IsEmpty;
|
||||
using ::testing::Not;
|
||||
using ::testing::Pair;
|
||||
using ::testing::StrictMock;
|
||||
using ::testing::UnorderedElementsAreArray;
|
||||
|
||||
namespace {
|
||||
|
||||
@@ -418,6 +419,55 @@ UsageInfoSubSampleInfo usage_info_sub_sample_info[] = {
|
||||
{&usage_info_sub_samples_icp[0], 5, wvcdm::kLevel3, ""},
|
||||
{&usage_info_sub_samples_icp[0], 3, wvcdm::kLevel3, "other app id"}};
|
||||
|
||||
struct UsageLicenseAndSubSampleInfo {
|
||||
std::string pssh;
|
||||
SubSampleInfo* sub_sample;
|
||||
std::string provider_session_token;
|
||||
};
|
||||
|
||||
std::string kPsshStreamingClip3 = wvcdm::a2bs_hex(
|
||||
"000000427073736800000000" // blob size and pssh
|
||||
"EDEF8BA979D64ACEA3C827DCD51D21ED00000022" // Widevine system id
|
||||
"08011a0d7769646576696e655f74657374220f73" // pssh data
|
||||
"747265616d696e675f636c697033");
|
||||
std::string kPsshStreamingClip4 = wvcdm::a2bs_hex(
|
||||
"000000427073736800000000" // blob size and pssh
|
||||
"EDEF8BA979D64ACEA3C827DCD51D21ED00000022" // Widevine system id
|
||||
"08011a0d7769646576696e655f74657374220f73" // pssh data
|
||||
"747265616d696e675f636c697034");
|
||||
std::string kPsshStreamingClip5 = wvcdm::a2bs_hex(
|
||||
"000000427073736800000000" // blob size and pssh
|
||||
"EDEF8BA979D64ACEA3C827DCD51D21ED00000022" // Widevine system id
|
||||
"08011a0d7769646576696e655f74657374220f73" // pssh data
|
||||
"747265616d696e675f636c697035");
|
||||
std::string kPsshStreamingClip7 = wvcdm::a2bs_hex(
|
||||
"000000427073736800000000" // blob size and pssh
|
||||
"EDEF8BA979D64ACEA3C827DCD51D21ED00000022" // Widevine system id
|
||||
"08011a0d7769646576696e655f74657374220f73" // pssh data
|
||||
"747265616d696e675f636c697037");
|
||||
|
||||
std::string kProviderSessionTokenStreamingClip3 = wvcdm::a2bs_hex(
|
||||
"4851305A4A4156485A554936444E4931");
|
||||
std::string kProviderSessionTokenStreamingClip4 = wvcdm::a2bs_hex(
|
||||
"4942524F4355544E5557553145463243");
|
||||
std::string kProviderSessionTokenStreamingClip7 = wvcdm::a2bs_hex(
|
||||
"44434C53524F4E30394C4E5535544B4C");
|
||||
|
||||
UsageLicenseAndSubSampleInfo kUsageLicenseTestVector1[] = {
|
||||
{ kPsshStreamingClip3, &usage_info_sub_samples_icp[0],
|
||||
kProviderSessionTokenStreamingClip3 },
|
||||
{ kPsshStreamingClip4, &usage_info_sub_samples_icp[1],
|
||||
kProviderSessionTokenStreamingClip4 },
|
||||
};
|
||||
|
||||
UsageLicenseAndSubSampleInfo kUsageLicenseTestVector2[] = {
|
||||
{ kPsshStreamingClip7, &usage_info_sub_samples_icp[4],
|
||||
kProviderSessionTokenStreamingClip7 },
|
||||
// TODO(rfrias): Add another streaming usage license. Streaming
|
||||
// clip 5 has includes a randomly generated PST, while
|
||||
// streaming clip 6 does not include a PST.
|
||||
};
|
||||
|
||||
struct RenewWithClientIdTestConfiguration {
|
||||
bool always_include_client_id;
|
||||
bool specify_app_parameters;
|
||||
@@ -1273,6 +1323,18 @@ class WvCdmRequestLicenseTest : public WvCdmTestBase {
|
||||
CdmAppParameterMap& app_parameters,
|
||||
CdmLicenseType license_type,
|
||||
CdmClientPropertySet* property_set) {
|
||||
GenerateKeyRequest(expected_response, init_data_type, init_data,
|
||||
app_parameters, license_type, kDefaultCdmIdentifier,
|
||||
property_set);
|
||||
}
|
||||
|
||||
void GenerateKeyRequest(CdmResponseType expected_response,
|
||||
const std::string& init_data_type,
|
||||
const std::string& init_data,
|
||||
CdmAppParameterMap& app_parameters,
|
||||
CdmLicenseType license_type,
|
||||
const CdmIdentifier& cdm_identifier,
|
||||
CdmClientPropertySet* property_set) {
|
||||
CdmKeyRequest key_request;
|
||||
std::string key_set_id;
|
||||
license_type_ = license_type;
|
||||
@@ -1280,7 +1342,7 @@ class WvCdmRequestLicenseTest : public WvCdmTestBase {
|
||||
decryptor_.GenerateKeyRequest(
|
||||
session_id_, key_set_id, init_data_type, init_data,
|
||||
license_type, app_parameters, property_set,
|
||||
kDefaultCdmIdentifier, &key_request));
|
||||
cdm_identifier, &key_request));
|
||||
key_msg_ = key_request.message;
|
||||
EXPECT_EQ(0u, key_request.url.size());
|
||||
}
|
||||
@@ -3054,6 +3116,291 @@ TEST_F(WvCdmRequestLicenseTest, UsageRemoveAllTest) {
|
||||
EXPECT_TRUE(usage_info.empty());
|
||||
}
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, GetSecureStopIdsTest) {
|
||||
Unprovision();
|
||||
|
||||
std::string app_id_empty = "";
|
||||
|
||||
TestWvCdmClientPropertySet property_set;
|
||||
Provision(kLevelDefault);
|
||||
|
||||
CdmSecurityLevel security_level = GetDefaultSecurityLevel();
|
||||
FileSystem file_system;
|
||||
DeviceFiles handle(&file_system);
|
||||
EXPECT_TRUE(handle.Init(security_level));
|
||||
std::vector<std::string> psts;
|
||||
EXPECT_TRUE(handle.DeleteAllUsageInfoForApp(
|
||||
DeviceFiles::GetUsageInfoFileName(""), &psts));
|
||||
|
||||
std::vector<CdmSecureStopId> retrieved_secure_stop_ids;
|
||||
EXPECT_EQ(
|
||||
NO_ERROR,
|
||||
decryptor_.GetSecureStopIds(app_id_empty, kDefaultCdmIdentifier,
|
||||
&retrieved_secure_stop_ids));
|
||||
EXPECT_TRUE(retrieved_secure_stop_ids.empty());
|
||||
|
||||
// First fetch licenses for the default app
|
||||
for (size_t i = 0; i < N_ELEM(kUsageLicenseTestVector1); ++i) {
|
||||
SubSampleInfo* data = kUsageLicenseTestVector1[i].sub_sample;
|
||||
|
||||
property_set.set_app_id(app_id_empty);
|
||||
decryptor_.OpenSession(g_key_system, &property_set, kDefaultCdmIdentifier,
|
||||
NULL, &session_id_);
|
||||
GenerateKeyRequest(kUsageLicenseTestVector1[i].pssh, kLicenseTypeStreaming,
|
||||
&property_set);
|
||||
|
||||
VerifyUsageKeyRequestResponse(g_license_server, g_client_auth);
|
||||
|
||||
std::vector<uint8_t> decrypt_buffer(data->encrypt_data.size());
|
||||
CdmDecryptionParameters decryption_parameters(
|
||||
&data->key_id, &data->encrypt_data.front(), data->encrypt_data.size(),
|
||||
&data->iv, data->block_offset, &decrypt_buffer[0]);
|
||||
decryption_parameters.is_encrypted = data->is_encrypted;
|
||||
decryption_parameters.is_secure = data->is_secure;
|
||||
decryption_parameters.subsample_flags = data->subsample_flags;
|
||||
EXPECT_EQ(NO_ERROR, decryptor_.Decrypt(session_id_, data->validate_key_id,
|
||||
decryption_parameters));
|
||||
|
||||
EXPECT_TRUE(std::equal(data->decrypt_data.begin(), data->decrypt_data.end(),
|
||||
decrypt_buffer.begin()));
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
|
||||
// Provision the other identifier
|
||||
Provision(kExampleIdentifier, kLevelDefault);
|
||||
|
||||
// Verify that there are usage records for the default identifier but
|
||||
// none yet for the non-default one
|
||||
std::vector<CdmSecureStopId> expected_provider_session_tokens;
|
||||
for (size_t i = 0; i < N_ELEM(kUsageLicenseTestVector1); ++i) {
|
||||
expected_provider_session_tokens.push_back(
|
||||
kUsageLicenseTestVector1[i].provider_session_token);
|
||||
}
|
||||
|
||||
EXPECT_EQ(
|
||||
NO_ERROR,
|
||||
decryptor_.GetSecureStopIds(app_id_empty, kDefaultCdmIdentifier,
|
||||
&retrieved_secure_stop_ids));
|
||||
EXPECT_EQ(N_ELEM(kUsageLicenseTestVector1), retrieved_secure_stop_ids.size());
|
||||
EXPECT_THAT(retrieved_secure_stop_ids,
|
||||
UnorderedElementsAreArray(expected_provider_session_tokens));
|
||||
|
||||
EXPECT_EQ(
|
||||
NO_ERROR,
|
||||
decryptor_.GetSecureStopIds(kExampleIdentifier.app_package_name,
|
||||
kDefaultCdmIdentifier,
|
||||
&retrieved_secure_stop_ids));
|
||||
EXPECT_TRUE(retrieved_secure_stop_ids.empty());
|
||||
|
||||
// Now fetch licenses for the other identifier
|
||||
for (size_t i = 0; i < N_ELEM(kUsageLicenseTestVector2); ++i) {
|
||||
SubSampleInfo* data = kUsageLicenseTestVector2[i].sub_sample;
|
||||
|
||||
property_set.set_app_id(kExampleIdentifier.app_package_name);
|
||||
EXPECT_EQ(NO_ERROR,
|
||||
decryptor_.OpenSession(g_key_system, &property_set,
|
||||
kExampleIdentifier, NULL,
|
||||
&session_id_));
|
||||
std::string init_data_type = "video/mp4";
|
||||
CdmAppParameterMap app_parameters;
|
||||
GenerateKeyRequest(wvcdm::KEY_MESSAGE, init_data_type,
|
||||
kUsageLicenseTestVector2[i].pssh, app_parameters,
|
||||
kLicenseTypeStreaming, kExampleIdentifier,
|
||||
&property_set);
|
||||
|
||||
VerifyUsageKeyRequestResponse(g_license_server, g_client_auth);
|
||||
|
||||
std::vector<uint8_t> decrypt_buffer(data->encrypt_data.size());
|
||||
CdmDecryptionParameters decryption_parameters(
|
||||
&data->key_id, &data->encrypt_data.front(), data->encrypt_data.size(),
|
||||
&data->iv, data->block_offset, &decrypt_buffer[0]);
|
||||
decryption_parameters.is_encrypted = data->is_encrypted;
|
||||
decryption_parameters.is_secure = data->is_secure;
|
||||
decryption_parameters.subsample_flags = data->subsample_flags;
|
||||
EXPECT_EQ(NO_ERROR, decryptor_.Decrypt(session_id_, data->validate_key_id,
|
||||
decryption_parameters));
|
||||
|
||||
EXPECT_TRUE(std::equal(data->decrypt_data.begin(), data->decrypt_data.end(),
|
||||
decrypt_buffer.begin()));
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
|
||||
// Verify that there are usage records for both the default and
|
||||
// non-default identifier.
|
||||
EXPECT_EQ(
|
||||
NO_ERROR,
|
||||
decryptor_.GetSecureStopIds(kDefaultCdmIdentifier.app_package_name,
|
||||
kDefaultCdmIdentifier,
|
||||
&retrieved_secure_stop_ids));
|
||||
EXPECT_EQ(N_ELEM(kUsageLicenseTestVector1), retrieved_secure_stop_ids.size());
|
||||
EXPECT_THAT(retrieved_secure_stop_ids,
|
||||
UnorderedElementsAreArray(expected_provider_session_tokens));
|
||||
|
||||
retrieved_secure_stop_ids.clear();
|
||||
expected_provider_session_tokens.clear();
|
||||
|
||||
for (size_t i = 0; i < N_ELEM(kUsageLicenseTestVector2); ++i) {
|
||||
expected_provider_session_tokens.push_back(
|
||||
kUsageLicenseTestVector2[i].provider_session_token);
|
||||
}
|
||||
|
||||
EXPECT_EQ(
|
||||
NO_ERROR,
|
||||
decryptor_.GetSecureStopIds(kExampleIdentifier.app_package_name,
|
||||
kExampleIdentifier,
|
||||
&retrieved_secure_stop_ids));
|
||||
EXPECT_EQ(N_ELEM(kUsageLicenseTestVector2), retrieved_secure_stop_ids.size());
|
||||
EXPECT_THAT(retrieved_secure_stop_ids,
|
||||
UnorderedElementsAreArray(expected_provider_session_tokens));
|
||||
|
||||
EXPECT_EQ(
|
||||
NO_ERROR,
|
||||
decryptor_.RemoveAllUsageInfo(kDefaultCdmIdentifier.app_package_name,
|
||||
kDefaultCdmIdentifier));
|
||||
EXPECT_EQ(
|
||||
NO_ERROR,
|
||||
decryptor_.RemoveAllUsageInfo(kExampleIdentifier.app_package_name,
|
||||
kExampleIdentifier));
|
||||
|
||||
EXPECT_EQ(
|
||||
NO_ERROR,
|
||||
decryptor_.GetSecureStopIds(kDefaultCdmIdentifier.app_package_name,
|
||||
kDefaultCdmIdentifier,
|
||||
&retrieved_secure_stop_ids));
|
||||
EXPECT_TRUE(retrieved_secure_stop_ids.empty());
|
||||
EXPECT_EQ(
|
||||
NO_ERROR,
|
||||
decryptor_.GetSecureStopIds(kExampleIdentifier.app_package_name,
|
||||
kExampleIdentifier,
|
||||
&retrieved_secure_stop_ids));
|
||||
EXPECT_TRUE(retrieved_secure_stop_ids.empty());
|
||||
}
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, UsageRemoveSecureStopTest) {
|
||||
Unprovision();
|
||||
|
||||
std::string app_id_empty = "";
|
||||
|
||||
TestWvCdmClientPropertySet property_set;
|
||||
Provision(kLevelDefault);
|
||||
|
||||
CdmSecurityLevel security_level = GetDefaultSecurityLevel();
|
||||
FileSystem file_system;
|
||||
DeviceFiles handle(&file_system);
|
||||
EXPECT_TRUE(handle.Init(security_level));
|
||||
std::vector<std::string> psts;
|
||||
EXPECT_TRUE(handle.DeleteAllUsageInfoForApp(
|
||||
DeviceFiles::GetUsageInfoFileName(""), &psts));
|
||||
|
||||
// First fetch licenses for the default app
|
||||
for (size_t i = 0; i < N_ELEM(kUsageLicenseTestVector1); ++i) {
|
||||
SubSampleInfo* data = kUsageLicenseTestVector1[i].sub_sample;
|
||||
|
||||
property_set.set_app_id(app_id_empty);
|
||||
decryptor_.OpenSession(g_key_system, &property_set, kDefaultCdmIdentifier,
|
||||
NULL, &session_id_);
|
||||
GenerateKeyRequest(kUsageLicenseTestVector1[i].pssh, kLicenseTypeStreaming,
|
||||
&property_set);
|
||||
|
||||
VerifyUsageKeyRequestResponse(g_license_server, g_client_auth);
|
||||
|
||||
std::vector<uint8_t> decrypt_buffer(data->encrypt_data.size());
|
||||
CdmDecryptionParameters decryption_parameters(
|
||||
&data->key_id, &data->encrypt_data.front(), data->encrypt_data.size(),
|
||||
&data->iv, data->block_offset, &decrypt_buffer[0]);
|
||||
decryption_parameters.is_encrypted = data->is_encrypted;
|
||||
decryption_parameters.is_secure = data->is_secure;
|
||||
decryption_parameters.subsample_flags = data->subsample_flags;
|
||||
EXPECT_EQ(NO_ERROR, decryptor_.Decrypt(session_id_, data->validate_key_id,
|
||||
decryption_parameters));
|
||||
|
||||
EXPECT_TRUE(std::equal(data->decrypt_data.begin(), data->decrypt_data.end(),
|
||||
decrypt_buffer.begin()));
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
|
||||
// Provision and fetch licenses for the other identifier
|
||||
Provision(kExampleIdentifier, kLevelDefault);
|
||||
|
||||
for (size_t i = 0; i < N_ELEM(kUsageLicenseTestVector2); ++i) {
|
||||
SubSampleInfo* data = kUsageLicenseTestVector2[i].sub_sample;
|
||||
|
||||
property_set.set_app_id(kExampleIdentifier.app_package_name);
|
||||
EXPECT_EQ(NO_ERROR,
|
||||
decryptor_.OpenSession(g_key_system, &property_set,
|
||||
kExampleIdentifier, NULL,
|
||||
&session_id_));
|
||||
std::string init_data_type = "video/mp4";
|
||||
CdmAppParameterMap app_parameters;
|
||||
GenerateKeyRequest(wvcdm::KEY_MESSAGE, init_data_type,
|
||||
kUsageLicenseTestVector2[i].pssh, app_parameters,
|
||||
kLicenseTypeStreaming, kExampleIdentifier,
|
||||
&property_set);
|
||||
|
||||
VerifyUsageKeyRequestResponse(g_license_server, g_client_auth);
|
||||
|
||||
std::vector<uint8_t> decrypt_buffer(data->encrypt_data.size());
|
||||
CdmDecryptionParameters decryption_parameters(
|
||||
&data->key_id, &data->encrypt_data.front(), data->encrypt_data.size(),
|
||||
&data->iv, data->block_offset, &decrypt_buffer[0]);
|
||||
decryption_parameters.is_encrypted = data->is_encrypted;
|
||||
decryption_parameters.is_secure = data->is_secure;
|
||||
decryption_parameters.subsample_flags = data->subsample_flags;
|
||||
EXPECT_EQ(NO_ERROR, decryptor_.Decrypt(session_id_, data->validate_key_id,
|
||||
decryption_parameters));
|
||||
|
||||
EXPECT_TRUE(std::equal(data->decrypt_data.begin(), data->decrypt_data.end(),
|
||||
decrypt_buffer.begin()));
|
||||
decryptor_.CloseSession(session_id_);
|
||||
}
|
||||
|
||||
// Release usage records for both the default and non-default identifier.
|
||||
std::vector<CdmSecureStopId> secure_stop_ids;
|
||||
EXPECT_EQ(
|
||||
NO_ERROR,
|
||||
decryptor_.GetSecureStopIds(kDefaultCdmIdentifier.app_package_name,
|
||||
kDefaultCdmIdentifier,
|
||||
&secure_stop_ids));
|
||||
EXPECT_EQ(N_ELEM(kUsageLicenseTestVector1), secure_stop_ids.size());
|
||||
|
||||
for (size_t i = 0; i < N_ELEM(kUsageLicenseTestVector1); ++i) {
|
||||
EXPECT_EQ(
|
||||
NO_ERROR,
|
||||
decryptor_.RemoveUsageInfo(kDefaultCdmIdentifier.app_package_name,
|
||||
kDefaultCdmIdentifier,
|
||||
secure_stop_ids[i]));
|
||||
}
|
||||
|
||||
EXPECT_EQ(
|
||||
NO_ERROR,
|
||||
decryptor_.GetSecureStopIds(kDefaultCdmIdentifier.app_package_name,
|
||||
kDefaultCdmIdentifier,
|
||||
&secure_stop_ids));
|
||||
EXPECT_TRUE(secure_stop_ids.empty());
|
||||
|
||||
EXPECT_EQ(
|
||||
NO_ERROR,
|
||||
decryptor_.GetSecureStopIds(kExampleIdentifier.app_package_name,
|
||||
kExampleIdentifier,
|
||||
&secure_stop_ids));
|
||||
EXPECT_EQ(N_ELEM(kUsageLicenseTestVector2), secure_stop_ids.size());
|
||||
|
||||
for (size_t i = 0; i < N_ELEM(kUsageLicenseTestVector2); ++i) {
|
||||
EXPECT_EQ(
|
||||
NO_ERROR,
|
||||
decryptor_.RemoveUsageInfo(kExampleIdentifier.app_package_name,
|
||||
kExampleIdentifier,
|
||||
secure_stop_ids[i]));
|
||||
}
|
||||
|
||||
EXPECT_EQ(
|
||||
NO_ERROR,
|
||||
decryptor_.GetSecureStopIds(kExampleIdentifier.app_package_name,
|
||||
kExampleIdentifier,
|
||||
&secure_stop_ids));
|
||||
EXPECT_TRUE(secure_stop_ids.empty());
|
||||
}
|
||||
|
||||
TEST_F(WvCdmRequestLicenseTest, QueryUnmodifiedSessionStatus) {
|
||||
// Test that the global value is returned when no properties are modifying it.
|
||||
std::string security_level;
|
||||
|
||||
Reference in New Issue
Block a user