From 24302f0f3d26fa9209e61e2927de59fbc26d788b Mon Sep 17 00:00:00 2001 From: Rahul Frias Date: Wed, 25 Jul 2018 22:59:11 -0700 Subject: [PATCH] Avoid sending clear subsamples to the decoder before keys are loaded [ Merge of http://go/wvgerrit/55900 ] Sending clear subsamples but filtering out encrypted ones, before the keys have been loaded, causes problems during decode. This is because subsamples that contain the first and last subsample flags may be filtered out. Clear subsamples that have first and last subsample flags set will still be allowed to be passed to the decoder. Bug: 110251447 Bug: 73447733 Test: Unit/integration tests. Netflix, GPlay playback tests. Change-Id: I977ae35aac57dc7f86cfd3d7163b87b052a2f09d --- .../cdm/src/wv_content_decryption_module.cpp | 12 +++-- .../cdm/test/request_license_test.cpp | 46 +++++++++++++++++-- 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp b/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp index 80d5bbd3..d18135d9 100644 --- a/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp +++ b/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp @@ -310,10 +310,14 @@ CdmResponseType WvContentDecryptionModule::Decrypt( cdm_engine->FindSessionForKey(*parameters.key_id, &local_session_id); cdm_engine->GetMetrics()->cdm_engine_find_session_for_key_.Increment( status); - if (!status && parameters.is_encrypted) { - LOGE("WvContentDecryptionModule::Decrypt: unable to find session: %s", - session_id.c_str()); - return KEY_NOT_FOUND_IN_SESSION; + if (!status) { + // key does not need to be loaded if clear lead/frame has a + // single subsample. It does in all other cases. + if (parameters.is_encrypted || + !(parameters.subsample_flags & OEMCrypto_FirstSubsample) || + !(parameters.subsample_flags & OEMCrypto_LastSubsample)) { + return KEY_NOT_FOUND_IN_SESSION; + } } } CdmResponseType sts; diff --git a/libwvdrmengine/cdm/test/request_license_test.cpp b/libwvdrmengine/cdm/test/request_license_test.cpp index 76dc3400..54321334 100644 --- a/libwvdrmengine/cdm/test/request_license_test.cpp +++ b/libwvdrmengine/cdm/test/request_license_test.cpp @@ -115,6 +115,39 @@ SubSampleInfo clear_sub_sample = { wvcdm::a2b_hex("f6f4b1e600a5b67813ed2bded913ba9f"), 0, OEMCrypto_FirstSubsample | OEMCrypto_LastSubsample}; +SubSampleInfo clear_sub_samples[2] = { + // block 0, key SD, encrypted, 128b + { true, 1, true, false, false, + wvcdm::a2bs_hex("371EA35E1A985D75D198A7F41020DC23"), + wvcdm::a2b_hex( + "217ce9bde99bd91e9733a1a00b9b557ac3a433dc92633546156817fae26b6e1c" + "942ac20a89ff79f4c2f25fba99d6a44618a8c0420b27d54e3da17b77c9d43cca" + "595d259a1e4a8b6d7744cd98c5d3f921adc252eb7d8af6b916044b676a574747" + "8df21fdc42f166880d97a2225cd5c9ea5e7b752f4cf81bbdbe98e542ee10e1c6"), + wvcdm::a2b_hex( + "217ce9bde99bd91e9733a1a00b9b557ac3a433dc92633546156817fae26b6e1c" + "942ac20a89ff79f4c2f25fba99d6a44618a8c0420b27d54e3da17b77c9d43cca" + "595d259a1e4a8b6d7744cd98c5d3f921adc252eb7d8af6b916044b676a574747" + "8df21fdc42f166880d97a2225cd5c9ea5e7b752f4cf81bbdbe98e542ee10e1c6"), + wvcdm::a2b_hex("f6f4b1e600a5b67813ed2bded913ba9f"), 0, + OEMCrypto_FirstSubsample}, + // block 1, key SD, encrypted, 128b + { true, 1, true, false, false, + wvcdm::a2bs_hex("371EA35E1A985D75D198A7F41020DC23"), + wvcdm::a2b_hex( + "ad868a6ac55c10d564fc23b8acff407daaf4ed2743520e02cda9680d9ea88e91" + "029359c4cf5906b6ab5bf60fbb3f1a1c7c59acfc7e4fb4ad8e623c04d503a3dd" + "4884604c8da8a53ce33db9ff8f1c5bb6bb97f37b39906bf41596555c1bcce9ed" + "08a899cd760ff0899a1170c2f224b9c52997a0785b7fe170805fd3e8b1127659"), + wvcdm::a2b_hex( + "ad868a6ac55c10d564fc23b8acff407daaf4ed2743520e02cda9680d9ea88e91" + "029359c4cf5906b6ab5bf60fbb3f1a1c7c59acfc7e4fb4ad8e623c04d503a3dd" + "4884604c8da8a53ce33db9ff8f1c5bb6bb97f37b39906bf41596555c1bcce9ed" + "08a899cd760ff0899a1170c2f224b9c52997a0785b7fe170805fd3e8b1127659"), + wvcdm::a2b_hex("f6f4b1e600a5b67813ed2bded913ba9f"), 0, + OEMCrypto_LastSubsample} +}; + SubSampleInfo clear_sub_sample_no_key = { false, 1, false, false, false, wvcdm::a2bs_hex("77777777777777777777777777777777"), @@ -4720,10 +4753,13 @@ TEST_P(WvCdmSessionSharingNoKeyTest, DecryptionTest) { 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) { + bool can_decrypt = !data->is_encrypted && + data->subsample_flags & OEMCrypto_FirstSubsample && + data->subsample_flags & OEMCrypto_LastSubsample; + EXPECT_EQ(can_decrypt ? NO_ERROR : KEY_NOT_FOUND_IN_SESSION, + decryptor_.Decrypt(gp_session_id_2, data->validate_key_id, + decryption_parameters)); + if (can_decrypt) { EXPECT_TRUE(std::equal(data->decrypt_data.begin(), data->decrypt_data.end(), decrypt_buffer.begin())); } @@ -4734,6 +4770,8 @@ TEST_P(WvCdmSessionSharingNoKeyTest, DecryptionTest) { INSTANTIATE_TEST_CASE_P(Cdm, WvCdmSessionSharingNoKeyTest, ::testing::Values(&clear_sub_sample, + &clear_sub_samples[0], + &clear_sub_samples[1], &clear_sub_sample_no_key, &single_encrypted_sub_sample));