diff --git a/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp b/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp index dbf32132..6668fc60 100644 --- a/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp +++ b/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp @@ -379,7 +379,7 @@ CdmResponseType WvContentDecryptionModule::Decrypt( cdm_engine->GetMetrics(), cdm_engine_find_session_for_key_, status); - if (!status) return KEY_NOT_FOUND_IN_SESSION; + if (!status && parameters.is_encrypted) return KEY_NOT_FOUND_IN_SESSION; } CdmResponseType sts; M_TIME( diff --git a/libwvdrmengine/cdm/test/request_license_test.cpp b/libwvdrmengine/cdm/test/request_license_test.cpp index e564fc86..7a9f74f5 100644 --- a/libwvdrmengine/cdm/test/request_license_test.cpp +++ b/libwvdrmengine/cdm/test/request_license_test.cpp @@ -3552,6 +3552,59 @@ INSTANTIATE_TEST_CASE_P(Cdm, WvCdmDecryptionTest, &switch_key_encrypted_sub_samples[0], &partial_encrypted_sub_samples[0])); +class WvCdmSessionSharingNoKeyTest + : public WvCdmRequestLicenseTest, + public ::testing::WithParamInterface {}; + +TEST_P(WvCdmSessionSharingNoKeyTest, DecryptionTest) { + SubSampleInfo* data = GetParam(); + + TestWvCdmClientPropertySet property_set; + property_set.set_session_sharing_mode(true); + + decryptor_.OpenSession(g_key_system, &property_set, kDefaultCdmIdentifier, + NULL, &session_id_); + CdmSessionId gp_session_id_1 = session_id_; + GenerateKeyRequest(g_key_id, kLicenseTypeStreaming); + + // TODO(rfrias): Move content information to ConfigTestEnv + std::string gp_client_auth2 = + "?source=YOUTUBE&video_id=z3S_NhwueaM&oauth=ya.gtsqawidevine"; + std::string gp_key_id2 = wvcdm::a2bs_hex( + "000000347073736800000000" // blob size and pssh + "edef8ba979d64acea3c827dcd51d21ed00000014" // Widevine system id + "08011210bdf1cb4fffc6506b8b7945b0bd2917fb"); // pssh data + + decryptor_.OpenSession(g_key_system, &property_set, kDefaultCdmIdentifier, + NULL, &session_id_); + CdmSessionId gp_session_id_2 = session_id_; + GenerateKeyRequest(gp_key_id2, kLicenseTypeStreaming); + + std::vector 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(data->is_encrypted ? KEY_NOT_FOUND_IN_SESSION : NO_ERROR, + decryptor_.Decrypt(gp_session_id_2, data->validate_key_id, + decryption_parameters)); + if (!data->is_encrypted) { + EXPECT_TRUE(std::equal(data->decrypt_data.begin(), data->decrypt_data.end(), + decrypt_buffer.begin())); + } + + decryptor_.CloseSession(gp_session_id_1); + decryptor_.CloseSession(gp_session_id_2); +} + +INSTANTIATE_TEST_CASE_P(Cdm, WvCdmSessionSharingNoKeyTest, + ::testing::Values(&clear_sub_sample, + &clear_sub_sample_no_key, + &single_encrypted_sub_sample)); + TEST(VersionNumberTest, VersionNumberChangeCanary) { char release_number[PROPERTY_VALUE_MAX]; ASSERT_GT(property_get("ro.build.version.release", release_number, "Unknown"),