diff --git a/libwvdrmengine/cdm/test/request_license_test.cpp b/libwvdrmengine/cdm/test/request_license_test.cpp index 310d17c5..61ca9d1a 100644 --- a/libwvdrmengine/cdm/test/request_license_test.cpp +++ b/libwvdrmengine/cdm/test/request_license_test.cpp @@ -190,6 +190,31 @@ SubSampleInfo single_encrypted_sub_sample = { wvcdm::a2b_hex("f6f4b1e600a5b67813ed2bded913ba9f"), 0, OEMCrypto_FirstSubsample | OEMCrypto_LastSubsample}; +SubSampleInfo single_encrypted_offline_sub_sample = { + // key SD, encrypted, 256b + true, 1, true, true, false, + wvcdm::a2bs_hex("DD003BA34DA3CDA09AA3B6D5CC6C34B2"), + wvcdm::a2b_hex( + "64ab17b3e3dfab47245c7cce4543d4fc7a26dcf248f19f9b59f3c92601440b36" + "17c8ed0c96c656549e461f38708cd47a434066f8df28ccc28b79252eee3f9c2d" + "7f6c68ebe40141fe818fe082ca523c03d69ddaf183a93c022327fedc5582c5ab" + "ca9d342b71263a67f9cb2336f12108aaaef464f17177e44e9b0c4e56e61da53c" + "2150b4405cc82d994dfd9bf4087c761956d6688a9705db4cf350381085f383c4" + "9666d4aed135c519c1f0b5cba06e287feea96ea367bf54e7368dcf998276c6e4" + "6497e0c50e20fef74e42cb518fe7f22ef27202428688f86404e8278587017012" + "c1d65537c6cbd7dde04aae338d68115a9f430afc100ab83cdadf45dca39db685"), + wvcdm::a2b_hex( + "4E477383EDAFA01D4C31CBCF015AE3D256FF96052F24EB50C37AEC9E798A23AE" + "58D187C627769F11E72C712BFE269F7BEB04D7E636D508F9B623888416340730" + "36C0F409B49BD9EB2DBAAF7218527371A40AB9B93A7C3FACA246A9A37C560106" + "2F6C5C5F7C0F4DA528C70639268602E08D100079A6D8CDBD82C44BFF7FC8D304" + "277E5638AA275AD1CC08F0D4F850777E0453DEFD927B49D2B5CF0372FC95BEEE" + "4287F7AEB30E3FECBDEB2981BD0691FED2D7CFACB92E115A44CADD96843F240E" + "236A9F9B2E3CB075912FE15C5056B21D809538C3C19D5B2F5FA242CD7F550306" + "6DA2F6A78C5090D9B49F78632FB6F278AC1F680E690BF3AD4933FDE77922CF6A"), + wvcdm::a2b_hex("f6f4b1e600a5b67813ed2bded913ba9f"), 0, + OEMCrypto_FirstSubsample | OEMCrypto_LastSubsample}; + SubSampleInfo switch_key_encrypted_sub_samples[2] = { // block 0, key SD, encrypted, 256b {true, 2, true, true, false, @@ -2572,8 +2597,8 @@ TEST_F(WvCdmRequestLicenseTest, OfflineLicenseRenewal) { std::string client_auth; GetOfflineConfiguration(&key_id, &client_auth); - decryptor_.OpenSession(config_.key_system(), NULL, kDefaultCdmIdentifier, NULL, - &session_id_); + decryptor_.OpenSession(config_.key_system(), NULL, kDefaultCdmIdentifier, + NULL, &session_id_); GenerateKeyRequest(key_id, kLicenseTypeOffline); VerifyKeyRequestResponse(config_.license_server(), client_auth); @@ -2584,6 +2609,85 @@ TEST_F(WvCdmRequestLicenseTest, OfflineLicenseRenewal) { decryptor_.CloseSession(session_id_); } +TEST_F(WvCdmRequestLicenseTest, OfflineLicenseRenewalAndRelease) { + Unprovision(); + Provision(kLevelDefault); + + // override default settings unless configured through the command line + std::string key_id; + std::string client_auth; + GetOfflineConfiguration(&key_id, &client_auth); + + // Retrieve offline license + decryptor_.OpenSession(config_.key_system(), NULL, kDefaultCdmIdentifier, + NULL, &session_id_); + GenerateKeyRequest(key_id, kLicenseTypeOffline); + VerifyKeyRequestResponse(config_.license_server(), client_auth); + + CdmKeySetId key_set_id = key_set_id_; + EXPECT_FALSE(key_set_id_.empty()); + + // Verify that we can decrypt a subsample + SubSampleInfo* data = &single_encrypted_offline_sub_sample; + 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(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_); + session_id_.clear(); + + // Restore offline license and renew it + decryptor_.OpenSession(config_.key_system(), NULL, kDefaultCdmIdentifier, + NULL, &session_id_); + EXPECT_EQ(wvcdm::KEY_ADDED, decryptor_.RestoreKey(session_id_, key_set_id)); + + std::string license_server; + GenerateRenewalRequest(kLicenseTypeOffline, &license_server); + EXPECT_FALSE(license_server.empty()); + VerifyKeyRequestResponse(license_server, client_auth); + + // Verify that we can decrypt a subsample + decrypt_buffer = data->encrypt_data; + 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_); + session_id_.clear(); + + // Restore offline license and test it + decryptor_.OpenSession(config_.key_system(), NULL, kDefaultCdmIdentifier, + NULL, &session_id_); + EXPECT_EQ(wvcdm::KEY_ADDED, decryptor_.RestoreKey(session_id_, key_set_id)); + + // Verify that we can decrypt a subsample + decrypt_buffer = data->encrypt_data; + 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_); + session_id_.clear(); + + // Restore and release offline license + key_set_id_.clear(); + GenerateKeyRelease(key_set_id); + key_set_id_ = key_set_id; + VerifyKeyRequestResponse(config_.license_server(), client_auth); +} + TEST_F(WvCdmRequestLicenseTest, RemoveKeys) { ASSERT_EQ(NO_ERROR, decryptor_.OpenSession(config_.key_system(), NULL, kDefaultCdmIdentifier, NULL,