diff --git a/libwvdrmengine/cdm/core/include/device_files.h b/libwvdrmengine/cdm/core/include/device_files.h index 91ea13b2..89539977 100644 --- a/libwvdrmengine/cdm/core/include/device_files.h +++ b/libwvdrmengine/cdm/core/include/device_files.h @@ -262,7 +262,6 @@ class DeviceFiles { virtual bool StoreUsageInfo(const std::string& usage_info_file_name, const std::vector& usage_data); virtual bool UpdateUsageInfo(const std::string& usage_info_file_name, - const std::string& provider_session_token, const CdmUsageData& usage_data); virtual bool StoreHlsAttributes(const std::string& key_set_id, diff --git a/libwvdrmengine/cdm/core/src/cdm_session.cpp b/libwvdrmengine/cdm/core/src/cdm_session.cpp index ff096cbd..30940e7f 100644 --- a/libwvdrmengine/cdm/core/src/cdm_session.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_session.cpp @@ -1159,8 +1159,7 @@ bool CdmSession::UpdateUsageInfo() { usage_data.usage_entry_index = usage_entry_index_; return file_handle_->UpdateUsageInfo( - DeviceFiles::GetUsageInfoFileName(app_id), usage_provider_session_token_, - usage_data); + DeviceFiles::GetUsageInfoFileName(app_id), usage_data); } void CdmSession::UpdateRequestLatencyTiming(CdmResponseType sts) { diff --git a/libwvdrmengine/cdm/core/src/device_files.cpp b/libwvdrmengine/cdm/core/src/device_files.cpp index f38f5eca..5e2e5325 100644 --- a/libwvdrmengine/cdm/core/src/device_files.cpp +++ b/libwvdrmengine/cdm/core/src/device_files.cpp @@ -1379,7 +1379,6 @@ bool DeviceFiles::StoreUsageInfo(const std::string& usage_info_file_name, } bool DeviceFiles::UpdateUsageInfo(const std::string& usage_info_file_name, - const std::string& provider_session_token, const CdmUsageData& usage_data) { RETURN_FALSE_IF_UNINITIALIZED(); @@ -1388,43 +1387,52 @@ bool DeviceFiles::UpdateUsageInfo(const std::string& usage_info_file_name, LOGE("Usage info file does not exist"); return false; } - if (RetrieveHashedFile(usage_info_file_name, &file) != kNoError) { LOGE("Unable to retrieve usage info file"); return false; } + video_widevine_client::sdk::UsageInfo* usage_info = file.mutable_usage_info(); int index = 0; - for (; index < file.usage_info().sessions_size(); ++index) { - if (file.usage_info().sessions(index).token() == provider_session_token) { - UsageInfo* usage_info = file.mutable_usage_info(); - UsageInfo_ProviderSession* provider_session = - usage_info->mutable_sessions(index); - provider_session->set_license_request(usage_data.license_request); - provider_session->set_license(usage_data.license); - provider_session->set_key_set_id(usage_data.key_set_id); - provider_session->set_usage_entry(usage_data.usage_entry); - provider_session->set_usage_entry_index(usage_data.usage_entry_index); - - if (usage_data.drm_certificate.size() > 0) { - uint32_t drm_certificate_id; - if (!FindOrInsertUsageCertificate(usage_data.drm_certificate, - usage_data.wrapped_private_key, - usage_info, &drm_certificate_id)) { - LOGE("Unable to find a certificate in to update the usage info"); - return false; - } - provider_session->set_drm_certificate_id(drm_certificate_id); - } - - std::string serialized_file; - file.SerializeToString(&serialized_file); - return StoreFileWithHash(usage_info_file_name, serialized_file) == - kNoError; - } + for (; index < usage_info->sessions_size(); ++index) { + // Use key set ID to identify usage info. PST is not guaranteed + // to be unique. + if (usage_info->sessions(index).key_set_id() == usage_data.key_set_id) + break; + } + if (index == usage_info->sessions_size()) { + LOGE("Failed to find usage info: key_set_id = %s", + IdToString(usage_data.key_set_id)); + return false; } - return false; + video_widevine_client::sdk::UsageInfo::ProviderSession* session = + usage_info->mutable_sessions(index); + // Verify that the PST are the same. + if (session->token() != usage_data.provider_session_token) { + LOGE("Mismatch PST: key_set_id = %s", IdToString(usage_data.key_set_id)); + return false; + } + + // Update session. + session->set_license_request(usage_data.license_request); + session->set_license(usage_data.license); + session->set_usage_entry(usage_data.usage_entry); + session->set_usage_entry_index(usage_data.usage_entry_index); + if (usage_data.drm_certificate.size() > 0) { + uint32_t drm_certificate_id; + if (!FindOrInsertUsageCertificate(usage_data.drm_certificate, + usage_data.wrapped_private_key, + usage_info, &drm_certificate_id)) { + LOGE("Unable to find a certificate in to update the usage info"); + return false; + } + session->set_drm_certificate_id(drm_certificate_id); + } + + std::string serialized_file; + file.SerializeToString(&serialized_file); + return StoreFileWithHash(usage_info_file_name, serialized_file) == kNoError; } bool DeviceFiles::RetrieveUsageInfo(const std::string& usage_info_file_name, diff --git a/libwvdrmengine/cdm/core/test/device_files_unittest.cpp b/libwvdrmengine/cdm/core/test/device_files_unittest.cpp index 3f50765a..dbc82358 100644 --- a/libwvdrmengine/cdm/core/test/device_files_unittest.cpp +++ b/libwvdrmengine/cdm/core/test/device_files_unittest.cpp @@ -2900,7 +2900,7 @@ const DeviceFilesTestListUsageInfoData kTestListUsageInfoData[] = { {"usaget3ED.bin", true}, }; -struct UsageInfo { +struct UsageInfoTestContext { std::string app_id; DeviceFiles::CdmUsageData usage_data; std::string file_data; @@ -2910,12 +2910,14 @@ const std::string kEmptyUsageInfoFileData = a2bs_hex( "0A06080310012A001220468A9A97B23D0E17147416276CB133175F0A18534155C6FFEF024A" "D80371D7C4"); -const UsageInfo kUsageInfoTestData[] = { - // test vector 0, app id: "", usage entry 0 +const UsageInfoTestContext kUsageInfoTestData[] = { + // Test vector 0 - app id: "", usage entry count: 1 {"", { + // PST: a2bs_hex("b8e7f26b6b8b59babf05b5a1f8927b412a85bc8551a928f00856329814ae" "5a82"), + // License request: a2bs_hex("4463dc57079c27e34ae115c6f65b08f6311c4ea604a6512c42470b6f692a" "76ea769d60d0b6bcf8d565ef31eb925f38e2095039c9f2f113ecee020f11" "26eb30165372d538b551ebd7bae5cf0bbeebb3cdb6f180d42868051aab8f" @@ -2925,6 +2927,7 @@ const UsageInfo kUsageInfoTestData[] = { "6ffc101036da70e69c06e4916493e82e9fe3f65d85254c8c14f6ca0579bf" "b3eaa86b2d7bb5ff572eccfd70f2ea4695f326beadf241ae4311e428c7c1" "2a0d4d1915cd0537ff0f62cf13eb2fa2"), + // License: a2bs_hex( "bbe6b4b60da9d9bc34dcc8502fb81d8fd5fdbc8fa89605c86205f2b8c6530ff64" "c8c31f579bd8eca603dfd5e397ac35e48931fd330351d01361bb31caaa7dbf816" @@ -2942,14 +2945,61 @@ const UsageInfo kUsageInfoTestData[] = { "5ce8f1fe59e317214005cee5e25904c9fb0af7e2b6b4dccdf78e61e179a9f9399" "6ec3c76f6da9b5a291bf08a73032b37edcbbbdd20cff94088a489167c56e5e75b" "376874e9750212fe94d7656d9cd835db3b771ba5b58d2b255"), + // Key set ID: "ksid854c8a60a5a547e122c24fca", + // Usage entry: a2bs_hex("7d2b905e5eafd4b28aeeb7633283579e48add21a68eb26cc8c3b2e344579" "003b12a38554336305525fa6ab70f024a18c73631bb1531eca3f0782c72d" "ba017311b3f1e98c739632e305e4bc0b2561ae2b"), + // Usage entry index: 5, + // DRM certificate: kEmptyString, + // Wrapped private key: CryptoWrappedKey(), }, + // File contents for test vector 0 + // sessions: + // -token: + // b8e7f26b6b8b59babf05b5a1f8927b412a85bc8551a928f00856329814ae + // 5a82 + // license_request: + // 4463dc57079c27e34ae115c6f65b08f6311c4ea604a6512c42470b6f692a + // 76ea769d60d0b6bcf8d565ef31eb925f38e2095039c9f2f113ecee020f11 + // 26eb30165372d538b551ebd7bae5cf0bbeebb3cdb6f180d42868051aab8f + // f4947460dd96f0f8259fc6001059c998d2eb6902c064f9ae08e6cd3c7807 + // e50379507b41620d15dd76c0b1e7ed9417efd6825959b5077f464e6429a4 + // dee467a1ba2b05d38049912d5539f1ee9f5d8a569aa1c384384f847ed64f + // 6ffc101036da70e69c06e4916493e82e9fe3f65d85254c8c14f6ca0579bf + // b3eaa86b2d7bb5ff572eccfd70f2ea4695f326beadf241ae4311e428c7c1 + // 2a0d4d1915cd0537ff0f62cf13eb2fa2 + // license: + // bbe6b4b60da9d9bc34dcc8502fb81d8fd5fdbc8fa89605c86205f2b8c653 + // 0ff64c8c31f579bd8eca603dfd5e397ac35e48931fd330351d01361bb31c + // aaa7dbf816a6144a12b6c22d1dceba20669ed635a40831066abd80713421 + // 19d7da11c43696b2898d3df3b36beb8da013d9dc145343494b19d6da085f + // 4a41e421d3def2ad8b72dffffb6e79bbceaf8594045d16a62eed16904a35 + // 69860c531a32eaa5abb868b1dd6a0b03d69c1a3f8336af80eb80badbbc7b + // 80ca5943bd5b374302147052201faed30e9ffa99fc00b47f7eeb469512a4 + // 13e873f91d959cccacccd3585b7f00ed8d4685022101713c3adc439f2751 + // 2a45926c1d2473477662c4bace72f380d105ddc9f7be49ed71991b3d9e29 + // a2038201373f98a845a57624a692f44ebd316d26c48fee82b655583317ec + // a4aaa4dac841524a2dca111749629637ef29fa7e72645a875957fb3d98a5 + // e6c8065b1349cfa23011cd6349d911c535475fed50be9eacb6a1ff3ea745 + // 8823f0229f2fa90b7a7099e8ec349d3d0fe0277cba5157ca62c8fbaa893f + // 37b8c8cea2a0d2d2912caccf92d31aa17439479711b4a5b77445cc02c18b + // fe0195ce8f1fe59e317214005cee5e25904c9fb0af7e2b6b4dccdf78e61e + // 179a9f93996ec3c76f6da9b5a291bf08a73032b37edcbbbdd20cff94088a + // 489167c56e5e75b376874e9750212fe94d7656d9cd835db3b771ba5b58d2 + // b255 + // key_set_id: "ksid854c8a60a5a547e122c24fca" + // usage_entry: + // 7d2b905e5eafd4b28aeeb7633283579e48add21a68eb26cc8c3b2e344579 + // 003b12a38554336305525fa6ab70f024a18c73631bb1531eca3f0782c72d + // ba017311b3f1e98c739632e305e4bc0b2561ae2b + // usage_entry_index: 5 + // drm_certificate_id: 0 + // drm_certificate_cache: a2bs_hex( "0AA407080310012A9D070A9A070A20B8E7F26B6B8B59BABF05B5A1F8927B412A85BC8" "551A928F00856329814AE5A821280024463DC57079C27E34AE115C6F65B08F6311C4E" @@ -2980,10 +3030,12 @@ const UsageInfo kUsageInfoTestData[] = { "F024A18C73631BB1531ECA3F0782C72DBA017311B3F1E98C739632E305E4BC0B2561A" "E2B30051220BCA71B49A97A2CFD5A3C4619807FE9EFCB68F9C69C4D63254FF10B22F1" "13FA82")}, - // test vector 1, app id: "", usage entry 1 + // Test vector 1 - app id: "", usage entry count: 2 {"", { + // PST: a2bs_hex("5d637be37a9722aa35c23d346470851aca7d2edcd1a27edf124ea6"), + // License request: a2bs_hex("bc96d6878e3086c33624821f1f3ece23f27e58222c2bb8d1615476a11792" "63b58f6427e92911d961fc7a3afd947aed8c9aead1f08457925d2ce4e0f6" "18b21942baa60b231eae864048f94f74ffa700e5777f812adb6f0cb6ba6f" @@ -2991,6 +3043,7 @@ const UsageInfo kUsageInfoTestData[] = { "cbea9d397fe00942e7ff73b8152cdc083b63a9f9c4a77056a0d79f44f267" "da0ed629d9c902f7e838957ea41aa442221c3aa9410db58302b468c6d7f2" "113663809f0dcf187c108ced"), + // License: a2bs_hex("f6fb3693413cc1d7d5e3459b856e4156c78f8d85d548939fd00474c8cded" "c46835cc981758500fe61cc79383b4d9f87c3e33d19c2d25d7d15dd0f3d2" "b1af4583b71e90c59886d297e78e929c2f3840c82c626914a4eb537b3a51" @@ -3003,15 +3056,93 @@ const UsageInfo kUsageInfoTestData[] = { "5fd980a67d8f33cc1d6cf20ee4c24582d03967ed48b6f28e7514e4d18f38" "c8cb1e54fba59af7d6a79c6c5a7ab06baac964c7958d201910adca018022" "fbeb8535b64f5ce83d3c"), + // Key set ID: "ksid2f2e85ce8a677f60047d7024e07b5ae6", + // Usge entry: a2bs_hex("b74880fbddc5bb9db82f09bc7de3ffd95a0a671b979d4c1f0564eaf63eb6" "b5a8c3f16d9f964afbd011e2326f9c27afbe74536f3f0601a71d9c1c422f" "335611bf3bf1a1c89e2dea27c17a9d9a58a74121e840b002e8a6fb590072" "45be786c1f64"), + // Usage entry index: 9, + // DRM certificate: kEmptyString, + // Wrapped private key: CryptoWrappedKey(), }, + // File contents for test vector 1 + // sessions: + // -token: + // b8e7f26b6b8b59babf05b5a1f8927b412a85bc8551a928f00856329814ae + // 5a82 + // license_request: + // 4463dc57079c27e34ae115c6f65b08f6311c4ea604a6512c42470b6f692a + // 76ea769d60d0b6bcf8d565ef31eb925f38e2095039c9f2f113ecee020f11 + // 26eb30165372d538b551ebd7bae5cf0bbeebb3cdb6f180d42868051aab8f + // f4947460dd96f0f8259fc6001059c998d2eb6902c064f9ae08e6cd3c7807 + // e50379507b41620d15dd76c0b1e7ed9417efd6825959b5077f464e6429a4 + // dee467a1ba2b05d38049912d5539f1ee9f5d8a569aa1c384384f847ed64f + // 6ffc101036da70e69c06e4916493e82e9fe3f65d85254c8c14f6ca0579bf + // b3eaa86b2d7bb5ff572eccfd70f2ea4695f326beadf241ae4311e428c7c1 + // 2a0d4d1915cd0537ff0f62cf13eb2fa2 + // license: + // bbe6b4b60da9d9bc34dcc8502fb81d8fd5fdbc8fa89605c86205f2b8c653 + // 0ff64c8c31f579bd8eca603dfd5e397ac35e48931fd330351d01361bb31c + // aaa7dbf816a6144a12b6c22d1dceba20669ed635a40831066abd80713421 + // 19d7da11c43696b2898d3df3b36beb8da013d9dc145343494b19d6da085f + // 4a41e421d3def2ad8b72dffffb6e79bbceaf8594045d16a62eed16904a35 + // 69860c531a32eaa5abb868b1dd6a0b03d69c1a3f8336af80eb80badbbc7b + // 80ca5943bd5b374302147052201faed30e9ffa99fc00b47f7eeb469512a4 + // 13e873f91d959cccacccd3585b7f00ed8d4685022101713c3adc439f2751 + // 2a45926c1d2473477662c4bace72f380d105ddc9f7be49ed71991b3d9e29 + // a2038201373f98a845a57624a692f44ebd316d26c48fee82b655583317ec + // a4aaa4dac841524a2dca111749629637ef29fa7e72645a875957fb3d98a5 + // e6c8065b1349cfa23011cd6349d911c535475fed50be9eacb6a1ff3ea745 + // 8823f0229f2fa90b7a7099e8ec349d3d0fe0277cba5157ca62c8fbaa893f + // 37b8c8cea2a0d2d2912caccf92d31aa17439479711b4a5b77445cc02c18b + // fe0195ce8f1fe59e317214005cee5e25904c9fb0af7e2b6b4dccdf78e61e + // 179a9f93996ec3c76f6da9b5a291bf08a73032b37edcbbbdd20cff94088a + // 489167c56e5e75b376874e9750212fe94d7656d9cd835db3b771ba5b58d2 + // b255 + // key_set_id: "ksid854c8a60a5a547e122c24fca" + // usage_entry: + // 7d2b905e5eafd4b28aeeb7633283579e48add21a68eb26cc8c3b2e344579 + // 003b12a38554336305525fa6ab70f024a18c73631bb1531eca3f0782c72d + // ba017311b3f1e98c739632e305e4bc0b2561ae2b + // usage_entry_index: 5 + // drm_certificate_id: 0 + // -token: + // 5d637be37a9722aa35c23d346470851aca7d2edcd1a27edf124ea6 + // license_request: + // bc96d6878e3086c33624821f1f3ece23f27e58222c2bb8d1615476a11792 + // 63b58f6427e92911d961fc7a3afd947aed8c9aead1f08457925d2ce4e0f6 + // 18b21942baa60b231eae864048f94f74ffa700e5777f812adb6f0cb6ba6f + // 0d145e3951191eb217140c32f2c7565053222131ff823bc36d80b24b561c + // cbea9d397fe00942e7ff73b8152cdc083b63a9f9c4a77056a0d79f44f267 + // da0ed629d9c902f7e838957ea41aa442221c3aa9410db58302b468c6d7f2 + // 113663809f0dcf187c108ced + // license: + // f6fb3693413cc1d7d5e3459b856e4156c78f8d85d548939fd00474c8cded + // c46835cc981758500fe61cc79383b4d9f87c3e33d19c2d25d7d15dd0f3d2 + // b1af4583b71e90c59886d297e78e929c2f3840c82c626914a4eb537b3a51 + // 61d963472b6592c0fa1e415556bc009c2da22bcf743ac434e22f8a33b432 + // 10dfd8aa09fe86105610f366e6fb7da18996cf7c7db425a9bb50e4a13190 + // a680b9f82d37d09658585abe3bf9f009a5c1ce38a7cefe17f71fb402768b + // 2d66b4ca523ed06729349695d7864d7cf7a1cc11d0da2b8a43db834d10b4 + // 7d9579ec9e46986a133277b92c636cb2a6a823afe73317266c9c0601ddba + // db76e1d254d6183b93a1ea91a7e6c567331b3ee3a5ab1484af91fd0f8dac + // 5fd980a67d8f33cc1d6cf20ee4c24582d03967ed48b6f28e7514e4d18f38 + // c8cb1e54fba59af7d6a79c6c5a7ab06baac964c7958d201910adca018022 + // fbeb8535b64f5ce83d3c + // key_set_id: "ksid2f2e85ce8a677f60047d7024e07b5ae6" + // usage_entry: + // b74880fbddc5bb9db82f09bc7de3ffd95a0a671b979d4c1f0564eaf63eb6 + // b5a8c3f16d9f964afbd011e2326f9c27afbe74536f3f0601a71d9c1c422f + // 335611bf3bf1a1c89e2dea27c17a9d9a58a74121e840b002e8a6fb590072 + // 45be786c1f64 + // usage_entry_index: 9 + // drm_certificate_id: 0 + // drm_certificate_cache: a2bs_hex( "0AE80C080310012AE10C0A9A070A20B8E7F26B6B8B59BABF05B5A1F8927B412A85BC8" "551A928F00856329814AE5A821280024463DC57079C27E34AE115C6F65B08F6311C4E" @@ -3062,11 +3193,13 @@ const UsageInfo kUsageInfoTestData[] = { "326F9C27AFBE74536F3F0601A71D9C1C422F335611BF3BF1A1C89E2DEA27C17A9D9A5" "8A74121E840B002E8A6FB59007245BE786C1F6430091220B9626315C7601BC2BD1E1C" "88F752C956261CE7509669B2AEAA1E7F1304017941")}, - // test vector 2, app id: "app_1", usage entry 0 + // Test vector 2 - app id: "app_1", usage entry count: 1 {"app_1", { + // PST: a2bs_hex("bb3370ccd3c3c49573d6b74386d1886d9888bd81fe3241bcd2bac9407d1a" "834e"), + // License request: a2bs_hex("dc0e51cfa5863f6c0b32a4ad7fa40625dadcc2dcde9e7fa3983b8804d996" "6803181682fc8ae831472e0b2fc26276242fbce624d286eedecce5555804" "913b4f8f86c5ae86160b8434b109169a63da04c5265102d772c1180543ef" @@ -3074,6 +3207,7 @@ const UsageInfo kUsageInfoTestData[] = { "8f6c6ad84b37ee1c7dfafb99289206cb752d063f330efd85885f4b72ba1c" "a5823eed865a461345e3d6417872bf3b0608b3d9e1004c11e7326d3ed406" "192e13455d0ec4e1f558a147"), + // License: a2bs_hex("f42a68ca3a14fb68f5992e4519f57970c3dae73f8da1d5b0b1da3eff7a95" "4012a0dc634357f3f5477a820e182182f24ae8e835ab10c18386cc8a0727" "d3f38b628639bfbd69a94d4053eab1c31e075e014cc578b226cfe24d6b42" @@ -3083,7 +3217,9 @@ const UsageInfo kUsageInfoTestData[] = { "8ccc896dd4cdf45f9090c96dfb925795cfb4ccda83e3eb4f745577b17fc1" "66bf5f4103c9085134cad7863a41b04f32ef20201e54b55f1817ce589619" "b096c254fd2c2fa4a06f4de35ccfd23e"), + // Key set ID: "kside11109bf20cde544083ef4ee", + // Usage entry: a2bs_hex("ea106c124476b753d39368a5966972a2729bb8bbea734a2b3e812b705eac" "e016c8a03c9a406094d80059ef4ca26f1928fa2daa5de9a6f22372e5c7a9" "41e610d1efb56ed7ce2228a70e2e150afb66edc2da066d463aa90ba0caff" @@ -3092,6 +3228,38 @@ const UsageInfo kUsageInfoTestData[] = { kEmptyString, CryptoWrappedKey(), }, + // File contents for test vector 2 + // sessions: + // -token: + // bb3370ccd3c3c49573d6b74386d1886d9888bd81fe3241bcd2bac9407d1a + // 834e + // license_request: + // dc0e51cfa5863f6c0b32a4ad7fa40625dadcc2dcde9e7fa3983b8804d996 + // 6803181682fc8ae831472e0b2fc26276242fbce624d286eedecce5555804 + // 913b4f8f86c5ae86160b8434b109169a63da04c5265102d772c1180543ef + // 226d2140357aca6cf87da3f7e370dfc08ca92a1f7c7d314eab36292a9170 + // 8f6c6ad84b37ee1c7dfafb99289206cb752d063f330efd85885f4b72ba1c + // a5823eed865a461345e3d6417872bf3b0608b3d9e1004c11e7326d3ed406 + // 192e13455d0ec4e1f558a147 + // license: + // f42a68ca3a14fb68f5992e4519f57970c3dae73f8da1d5b0b1da3eff7a95 + // 4012a0dc634357f3f5477a820e182182f24ae8e835ab10c18386cc8a0727 + // d3f38b628639bfbd69a94d4053eab1c31e075e014cc578b226cfe24d6b42 + // db242972def8f23a4aae88451307c2abaf54c1803ae54e3f1149aa6e6d42 + // 88cc7d474e876be07954e8b2deff4ade4bf30229fb6c92df4d66cd463f68 + // 6b4754b940210eb59f1581d658ddf8de8389e0e2d123e2cae3c2be6eb194 + // 8ccc896dd4cdf45f9090c96dfb925795cfb4ccda83e3eb4f745577b17fc1 + // 66bf5f4103c9085134cad7863a41b04f32ef20201e54b55f1817ce589619 + // b096c254fd2c2fa4a06f4de35ccfd23e + // key_set_id: "kside11109bf20cde544083ef4ee" + // usage_entry: + // ea106c124476b753d39368a5966972a2729bb8bbea734a2b3e812b705eac + // e016c8a03c9a406094d80059ef4ca26f1928fa2daa5de9a6f22372e5c7a9 + // 41e610d1efb56ed7ce2228a70e2e150afb66edc2da066d463aa90ba0caff + // 078fbfec05c8 + // usage_entry_index: 0 + // drm_certificate_id: 0 + // drm_certificate_cache: a2bs_hex("0AF404080310012AED040AEA040A20BB3370CCD3C3C49573D6B74386D1886D98" "88BD81FE3241BCD2BAC9407D1A834E12C001DC0E51CFA5863F6C0B32A4AD7FA4" "0625DADCC2DCDE9E7FA3983B8804D9966803181682FC8AE831472E0B2FC26276" @@ -3113,17 +3281,20 @@ const UsageInfo kUsageInfoTestData[] = { "4CA26F1928FA2DAA5DE9A6F22372E5C7A941E610D1EFB56ED7CE2228A70E2E15" "0AFB66EDC2DA066D463AA90BA0CAFF078FBFEC05C8300012203384AAAFD3A883" "17E6ED20BB88B0B3C01388AB1DF721547AE6FCB586659BC437")}, - // test vector 3, app id: "app_2", usage entry 0 + // Test vector 3 - app id: "app_2", usage entry count: 1 {"app_2", { + // PST: a2bs_hex( "9212a6926f21c6727c1ee89d5607047a1636f206f70e21fda86e01b6a4b5"), + // License request: a2bs_hex("ef947abed64078edf5b21fe6d3fb65384595d63a6d03e4d1d397c5019dee" "b6890d3ef8773002b91e255af0820fb594069df55d8abf96498e493f5c70" "f6b85f50e12a1ed3c039ad0cd838fe44d3fa9e2bbddeb2919041203111ed" "7778701b04d6b15f41d0bde799e20a38b27bf96fdbe844f10364baeb5935" "96220993c608ac793de76c237ca350931a7e216538074dbd83ddf262d9f1" "8acd91e1ea5372f7e773c5b64333"), + // License: a2bs_hex("7709721b3aa48597e88c99e82eaf7dff07e87e0318d9d7cec29096ec5918" "26aa7a359316d6de1d1329b408543e237de84c986987ead1bb6a0c38817e" "93013e5c989d366f49590b834453ec64b7433bf0b3335b9e222bad4caf55" @@ -3134,14 +3305,49 @@ const UsageInfo kUsageInfoTestData[] = { "094020ce08209bbc08f13fe2b96d7ba8213c8e9c85b6a623788d34da794e" "17e4cd3bd65680b97fb30bad64ddc42b1bcfb0b83e5dda3501a5902ca609" "f41837a0d5cd096e0659b67c"), + // Key set ID: "ksid62d88ed7b292217b0238be", + // Usage entry: a2bs_hex("5422463fd2e4dd47626e97dd6b4ee0b89523aaebe8d11e7e7be703ef01e4" "9b17eaf020cede0a9e0e7b5d91e4db7abdce445936cb2deecdefefdb14b7" "8f67b7ca5c733c9e88446fd814584584b86becbf6eb2b0e3d5603e8b"), + // Usage entry index: 25, + // DRM certificate: kEmptyString, + // Wrapped private key: CryptoWrappedKey(), }, + // File contents for test vector 3 + // sessions: + // -token: + // 9212a6926f21c6727c1ee89d5607047a1636f206f70e21fda86e01b6a4b5 + // license_request: + // ef947abed64078edf5b21fe6d3fb65384595d63a6d03e4d1d397c5019dee + // b6890d3ef8773002b91e255af0820fb594069df55d8abf96498e493f5c70 + // f6b85f50e12a1ed3c039ad0cd838fe44d3fa9e2bbddeb2919041203111ed + // 7778701b04d6b15f41d0bde799e20a38b27bf96fdbe844f10364baeb5935 + // 96220993c608ac793de76c237ca350931a7e216538074dbd83ddf262d9f1 + // 8acd91e1ea5372f7e773c5b64333 + // license: + // 7709721b3aa48597e88c99e82eaf7dff07e87e0318d9d7cec29096ec5918 + // 26aa7a359316d6de1d1329b408543e237de84c986987ead1bb6a0c38817e + // 93013e5c989d366f49590b834453ec64b7433bf0b3335b9e222bad4caf55 + // 4d69575c58595283166fea42e89645fc7e2d3ac9e0c1399b096cf3fed1e5 + // deb1bc4e0ee894f0ae3f929dd7dba4530e5655edbbf6041df430482eb2e8 + // 91b6a93af84d3c16dbad92733ffd34e8f4ce24506bead578d20cd3e291c2 + // fc2f811db875f49abc21a24277d2ba474fe6af6c14021cfead5513e0999e + // 094020ce08209bbc08f13fe2b96d7ba8213c8e9c85b6a623788d34da794e + // 17e4cd3bd65680b97fb30bad64ddc42b1bcfb0b83e5dda3501a5902ca609 + // f41837a0d5cd096e0659b67c + // key_set_id: "ksid62d88ed7b292217b0238be" + // usage_entry: + // 5422463fd2e4dd47626e97dd6b4ee0b89523aaebe8d11e7e7be703ef01e4 + // 9b17eaf020cede0a9e0e7b5d91e4db7abdce445936cb2deecdefefdb14b7 + // 8f67b7ca5c733c9e88446fd814584584b86becbf6eb2b0e3d5603e8b + // usage_entry_index: 25 + // drm_certificate_id: 0 + // drm_certificate_cache: a2bs_hex( "0AE604080310012ADF040ADC040A1E9212A6926F21C6727C1EE89D5607047A1636F20" "6F70E21FDA86E01B6A4B512A401EF947ABED64078EDF5B21FE6D3FB65384595D63A6D" @@ -3162,16 +3368,19 @@ const UsageInfo kUsageInfoTestData[] = { "E703EF01E49B17EAF020CEDE0A9E0E7B5D91E4DB7ABDCE445936CB2DEECDEFEFDB14B" "78F67B7CA5C733C9E88446FD814584584B86BECBF6EB2B0E3D5603E8B30191220E964" "7EB0AC28F0CB11C85111D69B5FA74E80015F4A07FB5C144E6CFE0E8E3709")}, - // test vector 4, app id: "app_2", usage entry 1 + // Test vector 4 - app id: "app_2", usage entry count: 2 {"app_2", { + // PST: a2bs_hex("831fad51e52a403524539eab6a1b201e46674ca3b9167b1c1b53f5e5e3"), + // License request: a2bs_hex("36d83acbc5e4ed027ed583e3b2169d98f4abedda15b781408e68efa14fef" "a9f3f0309bcb5a9fff6580636ebe3548e5acb43b76cfeb29a9c86324e62a" "eb40556005c6686e718f9bf61b0681d43b5b1e88084b3aea27a6b0e844e5" "500b6fcfacf2ee44d6af7f64154ab3fd4fbd0b8056cf63971076a1eb3642" "b78d5e76b84f4ed9f6220089863f8a4911691e79feffc9f804c4c36c7f85" "e45b1d276c85875875267eb65da70fd2d5e9176d6914"), + // License: a2bs_hex("317bd7063bfb9fae1b2e46f4cf15b7bc8c92517ff5c32cbb52ae4b67afc5" "d569cb66a462def7a18a7d0acebf9f6e8a604356ade2c81450c5466a4728" "90b03eefcf65388f060e24551c67b7d46ae5d4d841d5cc63d137fd543fae" @@ -3183,15 +3392,78 @@ const UsageInfo kUsageInfoTestData[] = { "84bfafe4d82e5d05a26ac06cde29faf6ab05b96685649c923779ce5ef7f3" "16531ada8e74e45ab1dc1d75648aa2de052674728867e87639ff9b782a3" "3"), + // Key set ID. "kside1d30b33b55f2deb4716", + // Usage entry: a2bs_hex("d44a9d70a7c582559f089b1c0fdfcbdaf5e26b672fca5d58e889b407a0ba" "8599079cde11fadfab23aa1b97622839f3b7e1a96f8332bec5fbcbc9eb64" "fd5ed05887b8fa3bfd6ecc7bc91e621342732062d2f4411b763e20328af6" "f8ef5030e2f8027aef9e"), + // Usage entry index: 6, + // DRM certirficate: kEmptyString, + // Wrapped private key: CryptoWrappedKey(), }, + // File contents for test vector 4 + // sessions: + // -token: + // 9212a6926f21c6727c1ee89d5607047a1636f206f70e21fda86e01b6a4b5 + // license_request: + // ef947abed64078edf5b21fe6d3fb65384595d63a6d03e4d1d397c5019dee + // b6890d3ef8773002b91e255af0820fb594069df55d8abf96498e493f5c70 + // f6b85f50e12a1ed3c039ad0cd838fe44d3fa9e2bbddeb2919041203111ed + // 7778701b04d6b15f41d0bde799e20a38b27bf96fdbe844f10364baeb5935 + // 96220993c608ac793de76c237ca350931a7e216538074dbd83ddf262d9f1 + // 8acd91e1ea5372f7e773c5b64333 + // license: + // 7709721b3aa48597e88c99e82eaf7dff07e87e0318d9d7cec29096ec5918 + // 26aa7a359316d6de1d1329b408543e237de84c986987ead1bb6a0c38817e + // 93013e5c989d366f49590b834453ec64b7433bf0b3335b9e222bad4caf55 + // 4d69575c58595283166fea42e89645fc7e2d3ac9e0c1399b096cf3fed1e5 + // deb1bc4e0ee894f0ae3f929dd7dba4530e5655edbbf6041df430482eb2e8 + // 91b6a93af84d3c16dbad92733ffd34e8f4ce24506bead578d20cd3e291c2 + // fc2f811db875f49abc21a24277d2ba474fe6af6c14021cfead5513e0999e + // 094020ce08209bbc08f13fe2b96d7ba8213c8e9c85b6a623788d34da794e + // 17e4cd3bd65680b97fb30bad64ddc42b1bcfb0b83e5dda3501a5902ca609 + // f41837a0d5cd096e0659b67c + // key_set_id: "ksid62d88ed7b292217b0238be" + // usage_entry: + // 5422463fd2e4dd47626e97dd6b4ee0b89523aaebe8d11e7e7be703ef01e4 + // 9b17eaf020cede0a9e0e7b5d91e4db7abdce445936cb2deecdefefdb14b7 + // 8f67b7ca5c733c9e88446fd814584584b86becbf6eb2b0e3d5603e8b + // usage_entry_index: 25 + // drm_certificate_id: 0 + // -token: + // 831fad51e52a403524539eab6a1b201e46674ca3b9167b1c1b53f5e5e3 + // license_request: + // 36d83acbc5e4ed027ed583e3b2169d98f4abedda15b781408e68efa14fef + // a9f3f0309bcb5a9fff6580636ebe3548e5acb43b76cfeb29a9c86324e62a + // eb40556005c6686e718f9bf61b0681d43b5b1e88084b3aea27a6b0e844e5 + // 500b6fcfacf2ee44d6af7f64154ab3fd4fbd0b8056cf63971076a1eb3642 + // b78d5e76b84f4ed9f6220089863f8a4911691e79feffc9f804c4c36c7f85 + // e45b1d276c85875875267eb65da70fd2d5e9176d6914 + // license: + // 317bd7063bfb9fae1b2e46f4cf15b7bc8c92517ff5c32cbb52ae4b67afc5 + // d569cb66a462def7a18a7d0acebf9f6e8a604356ade2c81450c5466a4728 + // 90b03eefcf65388f060e24551c67b7d46ae5d4d841d5cc63d137fd543fae + // 2c771756590b90e480ca0126f1fc0090ace62499e47569fc52196c788f80 + // 139755bdf12a7acb29fd6e23a46a4c036f04ff1ed6cd714094253bf1c587 + // 62c93f0ddf8a73c4be927ffec2723a16d8ffe5128851f58537461275f6aa + // 1976e3b399b7243919207e040ec16c5328e8ab082278fce0e5d3df5c5f92 + // dba51fa6613587d4ece31f2c001b49bfaed434f9512e895c2e09c88ddbf1 + // 84bfafe4d82e5d05a26ac06cde29faf6ab05b96685649c923779ce5ef7f3 + // 16531ada8e74e45ab1dc1d75648aa2de052674728867e87639ff9b782a33 + // key_set_id: "kside1d30b33b55f2deb4716" + // usage_entry: + // d44a9d70a7c582559f089b1c0fdfcbdaf5e26b672fca5d58e889b407a0ba + // 8599079cde11fadfab23aa1b97622839f3b7e1a96f8332bec5fbcbc9eb64 + // fd5ed05887b8fa3bfd6ecc7bc91e621342732062d2f4411b763e20328af6 + // f8ef5030e2f8027aef9e + // usage_entry_index: 6 + // drm_certificate_id: 0 + // drm_certificate_cache: a2bs_hex( "0AE809080310012AE1090ADC040A1E9212A6926F21C6727C1EE89D5607047A1636F20" "6F70E21FDA86E01B6A4B512A401EF947ABED64078EDF5B21FE6D3FB65384595D63A6D" @@ -3231,18 +3503,21 @@ const UsageInfo kUsageInfoTestData[] = { "F8332BEC5FBCBC9EB64FD5ED05887B8FA3BFD6ECC7BC91E621342732062D2F4411B76" "3E20328AF6F8EF5030E2F8027AEF9E300612203F1EEC1DDC56EE480AC744C1D72379E" "AFFD4675FF15A7D53BD56AC9736D62FC1")}, - // test vector 5, app id: "app_1", usage entry 1 + // Test vector 5 - app id: "app_1", usage entry 2 {"app_1", { + // PST a2bs_hex("eace80e30bfda213f1ce4dbcfd9d4d24b8e2ae00054d167d9d7ae9954706" "2b9113"), - a2bs_hex("68a7665a21348fc0590328608dc520be40f5b749328568fe383ef69c1a58" - "7ab2446cf9c41d821373d0856a883b316519a42218f80e7bd5764d16bac9" - "a9b427a7278f5940e563fcf6dee0ff3aadbb702ebf2c54ec354ae7acc84e" - "e6a54bca1f30e38ef71c44a81d0009b1484feaf4f1a56f58c35bb2372c80" - "c6dfb389e6de60bdd3d46c03975715260f6fdbe42facb64c22eda9635c04" - "da79434e1c41fbd2fdbbab6598283226c0278e8e0a96d780d3436523efd" - "1"), + // License request: + a2bs_hex( + "68a7665a21348fc0590328608dc520be40f5b749328568fe383ef69c1a58" + "7ab2446cf9c41d821373d0856a883b316519a42218f80e7bd5764d16bac9" + "a9b427a7278f5940e563fcf6dee0ff3aadbb702ebf2c54ec354ae7acc84e" + "e6a54bca1f30e38ef71c44a81d0009b1484feaf4f1a56f58c35bb2372c80" + "c6dfb389e6de60bdd3d46c03975715260f6fdbe42facb64c22eda9635c04" + "da79434e1c41fbd2fdbbab6598283226c0278e8e0a96d780d3436523efd1"), + // License: a2bs_hex("ff6fecf7157828812a2d6dcb15383a6d9af4519ef804c6053a10c436002d" "e3a4efcc017755f4ad1101bdc813e2d211732418dee529cbb413c48aa588" "4c76a5c6f556a715055560d4247f5bf310956949a3a171a4aa608a484468" @@ -3252,16 +3527,89 @@ const UsageInfo kUsageInfoTestData[] = { "0211c2f8d9e4d5be18509c327c647d654c4b6cc430b98f1ff37c96fab087" "fb561b8cc18480f877c873594d3148ff74b0e3c6327c27ca876dae742239" "8fc5e85269cba49ad099"), + // Key set ID: "ksid8e80350cbef6463a0025e6cc", + // Usage entry: a2bs_hex("7ccc7ce96055e16a52fa192ea2cf3c9df3e89b9133a52286f71e6c6d82d0" "435f6b2155dfde590b347d8c86f62d7dfbaae640c237256f609e5da9cc6c" "103465fe3441612bbdfdf4d1c24b2147feb8565cef4993e439c9d564a39a" "4ac5bb1da69acb44da06e4522c9a93d310cdda5dac1e1e0b91abff41e4e2" "edda4001"), + // Usage entry index: 7, + // DRM certificate: kDrmCertificate, + // Wrapped private key: kCryptoWrappedKey, }, + // File contents for test vector 5 + // sessions: + // -token: + // bb3370ccd3c3c49573d6b74386d1886d9888bd81fe3241bcd2bac9407d1a + // 834e + // license_request: + // dc0e51cfa5863f6c0b32a4ad7fa40625dadcc2dcde9e7fa3983b8804d996 + // 6803181682fc8ae831472e0b2fc26276242fbce624d286eedecce5555804 + // 913b4f8f86c5ae86160b8434b109169a63da04c5265102d772c1180543ef + // 226d2140357aca6cf87da3f7e370dfc08ca92a1f7c7d314eab36292a9170 + // 8f6c6ad84b37ee1c7dfafb99289206cb752d063f330efd85885f4b72ba1c + // a5823eed865a461345e3d6417872bf3b0608b3d9e1004c11e7326d3ed406 + // 192e13455d0ec4e1f558a147 + // license: + // f42a68ca3a14fb68f5992e4519f57970c3dae73f8da1d5b0b1da3eff7a95 + // 4012a0dc634357f3f5477a820e182182f24ae8e835ab10c18386cc8a0727 + // d3f38b628639bfbd69a94d4053eab1c31e075e014cc578b226cfe24d6b42 + // db242972def8f23a4aae88451307c2abaf54c1803ae54e3f1149aa6e6d42 + // 88cc7d474e876be07954e8b2deff4ade4bf30229fb6c92df4d66cd463f68 + // 6b4754b940210eb59f1581d658ddf8de8389e0e2d123e2cae3c2be6eb194 + // 8ccc896dd4cdf45f9090c96dfb925795cfb4ccda83e3eb4f745577b17fc1 + // 66bf5f4103c9085134cad7863a41b04f32ef20201e54b55f1817ce589619 + // b096c254fd2c2fa4a06f4de35ccfd23e + // key_set_id: "kside11109bf20cde544083ef4ee" + // usage_entry: + // ea106c124476b753d39368a5966972a2729bb8bbea734a2b3e812b705eac + // e016c8a03c9a406094d80059ef4ca26f1928fa2daa5de9a6f22372e5c7a9 + // 41e610d1efb56ed7ce2228a70e2e150afb66edc2da066d463aa90ba0caff + // 078fbfec05c8 + // usage_entry_index: 0 + // drm_certificate_id: 0 + // -token: + // eace80e30bfda213f1ce4dbcfd9d4d24b8e2ae00054d167d9d7ae9954706 + // 2b9113 + // license_request: + // 68a7665a21348fc0590328608dc520be40f5b749328568fe383ef69c1a58 + // 7ab2446cf9c41d821373d0856a883b316519a42218f80e7bd5764d16bac9 + // a9b427a7278f5940e563fcf6dee0ff3aadbb702ebf2c54ec354ae7acc84e + // e6a54bca1f30e38ef71c44a81d0009b1484feaf4f1a56f58c35bb2372c80 + // c6dfb389e6de60bdd3d46c03975715260f6fdbe42facb64c22eda9635c04 + // da79434e1c41fbd2fdbbab6598283226c0278e8e0a96d780d3436523efd1 + // license: + // ff6fecf7157828812a2d6dcb15383a6d9af4519ef804c6053a10c436002d + // e3a4efcc017755f4ad1101bdc813e2d211732418dee529cbb413c48aa588 + // 4c76a5c6f556a715055560d4247f5bf310956949a3a171a4aa608a484468 + // 84e7676d558ff64d392b84e617805693d90f1e9b7b540c383d384d7f7ce0 + // 6c23618681bd838ceb1a514047f1c562c43159cc5e21588fbfce8a354111 + // 160f1a1e2bd3d798a000579bdfdb977252809ee1502df8045972fe8aac84 + // 0211c2f8d9e4d5be18509c327c647d654c4b6cc430b98f1ff37c96fab087 + // fb561b8cc18480f877c873594d3148ff74b0e3c6327c27ca876dae742239 + // 8fc5e85269cba49ad099 + // key_set_id: "ksid8e80350cbef6463a0025e6cc" + // usage_entry: + // 7ccc7ce96055e16a52fa192ea2cf3c9df3e89b9133a52286f71e6c6d82d0 + // 435f6b2155dfde590b347d8c86f62d7dfbaae640c237256f609e5da9cc6c + // 103465fe3441612bbdfdf4d1c24b2147feb8565cef4993e439c9d564a39a + // 4ac5bb1da69acb44da06e4522c9a93d310cdda5dac1e1e0b91abff41e4e2 + // edda4001 + // usage_entry_index: 7 + // drm_certificate_id: 0 + // drm_certificate_cache: + // -drm_certificate_id: 0 + // drm_certificate: + // certificate: "a drm certificate" + // wrapped_private_key: "a wrapped private key" + // key_type: RSA + // acquisition_time_seconds: 0 + // expiration_time_seconds: 0 a2bs_hex( "0AA00A080310012A990A0AEA040A20BB3370CCD3C3C49573D6B74386D1886D9888BD8" "1FE3241BCD2BAC9407D1A834E12C001DC0E51CFA5863F6C0B32A4AD7FA40625DADCC2" @@ -3303,10 +3651,12 @@ const UsageInfo kUsageInfoTestData[] = { "726D20636572746966696361746512156120777261707065642070726976617465206" "B657918001220BD67878F6AA958EC6996061F69BF65E9806221BCA1CF26FFA4BF1D0B" "4ECE8806")}, - // test vector 6, app id: "", usage entry 2 + // Test vector 6 - app id: "", usage entry count: 3 {"", { + // PST: a2bs_hex("1fbf0a1d2432805a0f8292ff627a9a7c60b733a51b365892c832261d71"), + // License request: a2bs_hex("1ad116a26f423c7019fa8dca226c2d2bdeec91beb1fd38d6890e32745a4d" "bb9409b65fe834c2522d92621b265a9d526b4fcadcacf4c4deb364661118" "494fd1561621392bf4450e6833be290d49e59e665a031375ee56ad1f3392" @@ -3314,6 +3664,7 @@ const UsageInfo kUsageInfoTestData[] = { "ca72b8b311ad329d2c9cb0909c2ecbe3fbaf88e81bb5aeaa6480fff67e87" "77fa00c783aa160f1e211cb9bf3835fa8f82923c05895c359cf306f5cb90" "a73b8ce2ce9ed210485e1c57"), + // License: a2bs_hex("0bf120627d01690d14321fa967d81997b959b35ed7745dee9e885dd402df" "83c3b8f52999b16c2d1d47bf4724a9ced984175eb8a032d613294c148020" "74154c34fd40fe6ea74fa830fdcb9cc7e0799a75aadaf41ddda3d0038896" @@ -3323,15 +3674,121 @@ const UsageInfo kUsageInfoTestData[] = { "4149f53038b432964705e26c3bb6535461b7fff27ac8eff679dce8e5bfe1" "d000b69a22d9efc1f310ba2f0115c96b00bc15888fbb3edd230834458491" "eede2440550dd59c613dc8433efe979c71e9"), + // Key set ID: "ksida5d27d7b0ccd433203e157", + // Usage entry: a2bs_hex("1be7cd47cefdef69576348ef9a143be2311041a5f80259938fa886139679" "4eabcc985a695be2ef4a8361d86979859c490922d92d3ed0484e1666270a" "a96388bf6be3c4f4f0b7e2f59efc6b8e965d8fadd5ab86b2bb816d2573ec" "36eb42b571297681be152d40639d"), + // Usage entry index: 0, + // DRM certificate: kEmptyString, + // Wrapped private key. CryptoWrappedKey(), }, + // File contents for test vector 6 + // sessions: + // -token: + // b8e7f26b6b8b59babf05b5a1f8927b412a85bc8551a928f00856329814ae + // 5a82 + // license_request: + // 4463dc57079c27e34ae115c6f65b08f6311c4ea604a6512c42470b6f692a + // 76ea769d60d0b6bcf8d565ef31eb925f38e2095039c9f2f113ecee020f11 + // 26eb30165372d538b551ebd7bae5cf0bbeebb3cdb6f180d42868051aab8f + // f4947460dd96f0f8259fc6001059c998d2eb6902c064f9ae08e6cd3c7807 + // e50379507b41620d15dd76c0b1e7ed9417efd6825959b5077f464e6429a4 + // dee467a1ba2b05d38049912d5539f1ee9f5d8a569aa1c384384f847ed64f + // 6ffc101036da70e69c06e4916493e82e9fe3f65d85254c8c14f6ca0579bf + // b3eaa86b2d7bb5ff572eccfd70f2ea4695f326beadf241ae4311e428c7c1 + // 2a0d4d1915cd0537ff0f62cf13eb2fa2 + // license: + // bbe6b4b60da9d9bc34dcc8502fb81d8fd5fdbc8fa89605c86205f2b8c653 + // 0ff64c8c31f579bd8eca603dfd5e397ac35e48931fd330351d01361bb31c + // aaa7dbf816a6144a12b6c22d1dceba20669ed635a40831066abd80713421 + // 19d7da11c43696b2898d3df3b36beb8da013d9dc145343494b19d6da085f + // 4a41e421d3def2ad8b72dffffb6e79bbceaf8594045d16a62eed16904a35 + // 69860c531a32eaa5abb868b1dd6a0b03d69c1a3f8336af80eb80badbbc7b + // 80ca5943bd5b374302147052201faed30e9ffa99fc00b47f7eeb469512a4 + // 13e873f91d959cccacccd3585b7f00ed8d4685022101713c3adc439f2751 + // 2a45926c1d2473477662c4bace72f380d105ddc9f7be49ed71991b3d9e29 + // a2038201373f98a845a57624a692f44ebd316d26c48fee82b655583317ec + // a4aaa4dac841524a2dca111749629637ef29fa7e72645a875957fb3d98a5 + // e6c8065b1349cfa23011cd6349d911c535475fed50be9eacb6a1ff3ea745 + // 8823f0229f2fa90b7a7099e8ec349d3d0fe0277cba5157ca62c8fbaa893f + // 37b8c8cea2a0d2d2912caccf92d31aa17439479711b4a5b77445cc02c18b + // fe0195ce8f1fe59e317214005cee5e25904c9fb0af7e2b6b4dccdf78e61e + // 179a9f93996ec3c76f6da9b5a291bf08a73032b37edcbbbdd20cff94088a + // 489167c56e5e75b376874e9750212fe94d7656d9cd835db3b771ba5b58d2 + // b255 + // key_set_id: "ksid854c8a60a5a547e122c24fca" + // usage_entry: + // 7d2b905e5eafd4b28aeeb7633283579e48add21a68eb26cc8c3b2e344579 + // 003b12a38554336305525fa6ab70f024a18c73631bb1531eca3f0782c72d + // ba017311b3f1e98c739632e305e4bc0b2561ae2b + // usage_entry_index: 5 + // drm_certificate_id: 0 + // -token: + // 5d637be37a9722aa35c23d346470851aca7d2edcd1a27edf124ea6 + // license_request: + // bc96d6878e3086c33624821f1f3ece23f27e58222c2bb8d1615476a11792 + // 63b58f6427e92911d961fc7a3afd947aed8c9aead1f08457925d2ce4e0f6 + // 18b21942baa60b231eae864048f94f74ffa700e5777f812adb6f0cb6ba6f + // 0d145e3951191eb217140c32f2c7565053222131ff823bc36d80b24b561c + // cbea9d397fe00942e7ff73b8152cdc083b63a9f9c4a77056a0d79f44f267 + // da0ed629d9c902f7e838957ea41aa442221c3aa9410db58302b468c6d7f2 + // 113663809f0dcf187c108ced + // license: + // f6fb3693413cc1d7d5e3459b856e4156c78f8d85d548939fd00474c8cded + // c46835cc981758500fe61cc79383b4d9f87c3e33d19c2d25d7d15dd0f3d2 + // b1af4583b71e90c59886d297e78e929c2f3840c82c626914a4eb537b3a51 + // 61d963472b6592c0fa1e415556bc009c2da22bcf743ac434e22f8a33b432 + // 10dfd8aa09fe86105610f366e6fb7da18996cf7c7db425a9bb50e4a13190 + // a680b9f82d37d09658585abe3bf9f009a5c1ce38a7cefe17f71fb402768b + // 2d66b4ca523ed06729349695d7864d7cf7a1cc11d0da2b8a43db834d10b4 + // 7d9579ec9e46986a133277b92c636cb2a6a823afe73317266c9c0601ddba + // db76e1d254d6183b93a1ea91a7e6c567331b3ee3a5ab1484af91fd0f8dac + // 5fd980a67d8f33cc1d6cf20ee4c24582d03967ed48b6f28e7514e4d18f38 + // c8cb1e54fba59af7d6a79c6c5a7ab06baac964c7958d201910adca018022 + // fbeb8535b64f5ce83d3c + // key_set_id: "ksid2f2e85ce8a677f60047d7024e07b5ae6" + // usage_entry: + // b74880fbddc5bb9db82f09bc7de3ffd95a0a671b979d4c1f0564eaf63eb6 + // b5a8c3f16d9f964afbd011e2326f9c27afbe74536f3f0601a71d9c1c422f + // 335611bf3bf1a1c89e2dea27c17a9d9a58a74121e840b002e8a6fb590072 + // 45be786c1f64 + // usage_entry_index: 9 + // drm_certificate_id: 0 + // -token: + // 1fbf0a1d2432805a0f8292ff627a9a7c60b733a51b365892c832261d71 + // license_request: + // 1ad116a26f423c7019fa8dca226c2d2bdeec91beb1fd38d6890e32745a4d + // bb9409b65fe834c2522d92621b265a9d526b4fcadcacf4c4deb364661118 + // 494fd1561621392bf4450e6833be290d49e59e665a031375ee56ad1f3392 + // 436ba213abc5ac10a199e73123f84f7644282137da24cbde30c10a6eb847 + // ca72b8b311ad329d2c9cb0909c2ecbe3fbaf88e81bb5aeaa6480fff67e87 + // 77fa00c783aa160f1e211cb9bf3835fa8f82923c05895c359cf306f5cb90 + // a73b8ce2ce9ed210485e1c57 + // license: + // 0bf120627d01690d14321fa967d81997b959b35ed7745dee9e885dd402df + // 83c3b8f52999b16c2d1d47bf4724a9ced984175eb8a032d613294c148020 + // 74154c34fd40fe6ea74fa830fdcb9cc7e0799a75aadaf41ddda3d0038896 + // da966b1a67ff4e6c7403debfdbe7d1d48f1a3304124f04c974bfa0eff4d0 + // b1733a84aa6f89ec74c89dad2168da4706f6dfcfd980502b573d0f7b3791 + // 252cc918394e8b3a3e1ef37ce48b7fd6a2040db5915f55809f284ce4ec24 + // 4149f53038b432964705e26c3bb6535461b7fff27ac8eff679dce8e5bfe1 + // d000b69a22d9efc1f310ba2f0115c96b00bc15888fbb3edd230834458491 + // eede2440550dd59c613dc8433efe979c71e9 + // key_set_id: "ksida5d27d7b0ccd433203e157" + // usage_entry: + // 1be7cd47cefdef69576348ef9a143be2311041a5f80259938fa886139679 + // 4eabcc985a695be2ef4a8361d86979859c490922d92d3ed0484e1666270a + // a96388bf6be3c4f4f0b7e2f59efc6b8e965d8fadd5ab86b2bb816d2573ec + // 36eb42b571297681be152d40639d + // usage_entry_index: 0 + // drm_certificate_id: 0 + // drm_certificate_cache: a2bs_hex( "0ADA11080310012AD3110A9A070A20B8E7F26B6B8B59BABF05B5A1F8927B412A85BC8" "551A928F00856329814AE5A821280024463DC57079C27E34AE115C6F65B08F6311C4E" @@ -3400,16 +3857,19 @@ const UsageInfo kUsageInfoTestData[] = { "859C490922D92D3ED0484E1666270AA96388BF6BE3C4F4F0B7E2F59EFC6B8E965D8FA" "DD5AB86B2BB816D2573EC36EB42B571297681BE152D40639D3000122076CFC9DBA6CD" "93FFC6BB74D61C1B644CC32121553C50817A9F6F00633575E659")}, - // test vector 7, app id: "app_2", usage entry 2 + // Test vector 7 - app id: "app_2", usage entry count: 3 {"app_2", { + // PST: a2bs_hex("8f922e955b269458ed1345bde9a24516520a536817e8e8612154a1"), + // License request: a2bs_hex("d4acc596a52055cee710e1fec44796dbf3ae6b017ab156d9bff7bfdb8f1e" "6352bfbe453034968f940c36ac18800e22bb2ff71268053702ef3fce3fb2" "d607a078e0d1449fcc9d0675d41b1a65f78e3c02370d18112aae1e2577ff" "9087825a45125db5dee8e27bd14ea8666b4e8e6aba6811c40b585aabb9c9" "185209a48d11130ff690316916961f28286c71c3e985d7dc3352166e414b" "89da2c17cc5b69fc9c00990697f5"), + // License: a2bs_hex("169d3c432f9c2f8b99e11632bd7d6a63f3d57679c567bedcb2e596ace105" "0453732040cb468e9c43f6009b430ca4a4046d017e67a4badd5b71c0c9fc" "e2274817f0bcda311a4f8703e6dc32aedf30e6f9abd40e249fc8b0a5045c" @@ -3420,14 +3880,110 @@ const UsageInfo kUsageInfoTestData[] = { "a0c07f9cd805fcdc0d30f70e4c4b2959a0f52385c6bd3e6eeb4e3d81fdc1" "a9dc3c76faf1bfed913d58567fa9b296d27dff5217c583e7c134a642601f" "8237"), + // Key set ID: "kside684918d6c39bfa652a40ad936", + // Usage entry: a2bs_hex("703f69807c8f4d140168874b924a625132eb3b896a381d617b8fb83c7314" "a6b634d840925f711ae330599f0e0863800902b05d201a8a87b88a4bc170" "65a1a8a556c34bf86b53afcc9951be15bea9ab55"), + // Usage entry index: 27, + // DRM certificate: kAnotherDrmCertificate, + // Wrapped private key: kAnotherCryptoWrappedKey, }, + // File contents for test vector 7 + // sessions: + // -token: + // 9212a6926f21c6727c1ee89d5607047a1636f206f70e21fda86e01b6a4b5 + // license_request: + // ef947abed64078edf5b21fe6d3fb65384595d63a6d03e4d1d397c5019dee + // b6890d3ef8773002b91e255af0820fb594069df55d8abf96498e493f5c70 + // f6b85f50e12a1ed3c039ad0cd838fe44d3fa9e2bbddeb2919041203111ed + // 7778701b04d6b15f41d0bde799e20a38b27bf96fdbe844f10364baeb5935 + // 96220993c608ac793de76c237ca350931a7e216538074dbd83ddf262d9f1 + // 8acd91e1ea5372f7e773c5b64333 + // license: + // 7709721b3aa48597e88c99e82eaf7dff07e87e0318d9d7cec29096ec5918 + // 26aa7a359316d6de1d1329b408543e237de84c986987ead1bb6a0c38817e + // 93013e5c989d366f49590b834453ec64b7433bf0b3335b9e222bad4caf55 + // 4d69575c58595283166fea42e89645fc7e2d3ac9e0c1399b096cf3fed1e5 + // deb1bc4e0ee894f0ae3f929dd7dba4530e5655edbbf6041df430482eb2e8 + // 91b6a93af84d3c16dbad92733ffd34e8f4ce24506bead578d20cd3e291c2 + // fc2f811db875f49abc21a24277d2ba474fe6af6c14021cfead5513e0999e + // 094020ce08209bbc08f13fe2b96d7ba8213c8e9c85b6a623788d34da794e + // 17e4cd3bd65680b97fb30bad64ddc42b1bcfb0b83e5dda3501a5902ca609 + // f41837a0d5cd096e0659b67c + // key_set_id: "ksid62d88ed7b292217b0238be" + // usage_entry: + // 5422463fd2e4dd47626e97dd6b4ee0b89523aaebe8d11e7e7be703ef01e4 + // 9b17eaf020cede0a9e0e7b5d91e4db7abdce445936cb2deecdefefdb14b7 + // 8f67b7ca5c733c9e88446fd814584584b86becbf6eb2b0e3d5603e8b + // usage_entry_index: 25 + // drm_certificate_id: 0 + // -token: + // 831fad51e52a403524539eab6a1b201e46674ca3b9167b1c1b53f5e5e3 + // license_request: + // 36d83acbc5e4ed027ed583e3b2169d98f4abedda15b781408e68efa14fef + // a9f3f0309bcb5a9fff6580636ebe3548e5acb43b76cfeb29a9c86324e62a + // eb40556005c6686e718f9bf61b0681d43b5b1e88084b3aea27a6b0e844e5 + // 500b6fcfacf2ee44d6af7f64154ab3fd4fbd0b8056cf63971076a1eb3642 + // b78d5e76b84f4ed9f6220089863f8a4911691e79feffc9f804c4c36c7f85 + // e45b1d276c85875875267eb65da70fd2d5e9176d6914 + // license: + // 317bd7063bfb9fae1b2e46f4cf15b7bc8c92517ff5c32cbb52ae4b67afc5 + // d569cb66a462def7a18a7d0acebf9f6e8a604356ade2c81450c5466a4728 + // 90b03eefcf65388f060e24551c67b7d46ae5d4d841d5cc63d137fd543fae + // 2c771756590b90e480ca0126f1fc0090ace62499e47569fc52196c788f80 + // 139755bdf12a7acb29fd6e23a46a4c036f04ff1ed6cd714094253bf1c587 + // 62c93f0ddf8a73c4be927ffec2723a16d8ffe5128851f58537461275f6aa + // 1976e3b399b7243919207e040ec16c5328e8ab082278fce0e5d3df5c5f92 + // dba51fa6613587d4ece31f2c001b49bfaed434f9512e895c2e09c88ddbf1 + // 84bfafe4d82e5d05a26ac06cde29faf6ab05b96685649c923779ce5ef7f3 + // 16531ada8e74e45ab1dc1d75648aa2de052674728867e87639ff9b782a33 + // key_set_id: "kside1d30b33b55f2deb4716" + // usage_entry: + // d44a9d70a7c582559f089b1c0fdfcbdaf5e26b672fca5d58e889b407a0ba + // 8599079cde11fadfab23aa1b97622839f3b7e1a96f8332bec5fbcbc9eb64 + // fd5ed05887b8fa3bfd6ecc7bc91e621342732062d2f4411b763e20328af6 + // f8ef5030e2f8027aef9e + // usage_entry_index: 6 + // drm_certificate_id: 0 + // -token: 8f922e955b269458ed1345bde9a24516520a536817e8e8612154a1 + // license_request: + // d4acc596a52055cee710e1fec44796dbf3ae6b017ab156d9bff7bfdb8f1e + // 6352bfbe453034968f940c36ac18800e22bb2ff71268053702ef3fce3fb2 + // d607a078e0d1449fcc9d0675d41b1a65f78e3c02370d18112aae1e2577ff + // 9087825a45125db5dee8e27bd14ea8666b4e8e6aba6811c40b585aabb9c9 + // 185209a48d11130ff690316916961f28286c71c3e985d7dc3352166e414b + // 89da2c17cc5b69fc9c00990697f5 + // license: + // 169d3c432f9c2f8b99e11632bd7d6a63f3d57679c567bedcb2e596ace105 + // 0453732040cb468e9c43f6009b430ca4a4046d017e67a4badd5b71c0c9fc + // e2274817f0bcda311a4f8703e6dc32aedf30e6f9abd40e249fc8b0a5045c + // c1e47e60a60b4893ef92602f5584e1162f4ff3ee6d906228f97b442ace1f + // b175d113b671bdbe4ceffdd98f2bb094c0dfac03b79541a44d8affdc987f + // 4268706b5a554e998907eb7126e8c6bc07c837d8aeebea3249e37b4b7dd7 + // 327300fe7e62c15981cf73a13e806d065bcadc2c747256907a5493592b07 + // a0c07f9cd805fcdc0d30f70e4c4b2959a0f52385c6bd3e6eeb4e3d81fdc1 + // a9dc3c76faf1bfed913d58567fa9b296d27dff5217c583e7c134a642601f + // 8237 + // key_set_id: "kside684918d6c39bfa652a40ad936" + // usage_entry: + // 703f69807c8f4d140168874b924a625132eb3b896a381d617b8fb83c7314 + // a6b634d840925f711ae330599f0e0863800902b05d201a8a87b88a4bc170 + // 65a1a8a556c34bf86b53afcc9951be15bea9ab55 + // usage_entry_index: 27 + // drm_certificate_id: 0 + // drm_certificate_cache: + // -drm_certificate_id: 0 + // drm_certificate: + // certificate: "another drm certificate" + // wrapped_private_key: "another wrapped private key" + // key_type: ECC + // acquisition_time_seconds: 0 + // expiration_time_seconds: 0 a2bs_hex( "0AF60E080310012AEF0E0ADC040A1E9212A6926F21C6727C1EE89D5607047A1636F20" "6F70E21FDA86E01B6A4B512A401EF947ABED64078EDF5B21FE6D3FB65384595D63A6D" @@ -3486,17 +4042,20 @@ const UsageInfo kUsageInfoTestData[] = { "46865722064726D206365727469666963617465121B616E6F74686572207772617070" "65642070726976617465206B65791801122082BB366A1D04CD51FA6BE0E5E1F7B9393" "0C2E887586E2E5FBC6838ADDD3A209B")}, - // test vector 8, app id: "app_1", usage entry 2 + // Test vector 8 - app id: "app_1", usage entry count: 2 {"app_1", { + // PST: a2bs_hex("d0b9a07ad7ffeec13784bd60da011be3589f3e450227fd36b1a3f6786cdb" "fe8f"), + // License request: a2bs_hex("a419c5687a592099dc67da8bc4f5ef238c80fe4ce3e2fcb025392efb1438" "4b581b595a0e8fa95de637fb2184719eb36ad6539ee9df0f67697f91d018" "6e04552e811196029cf4e256518ddf3215af8ec61442c17d6753b93f9d3a" "9240bae39bacf5563659cf47d3a611ce20ed3ebbf86cddad60cc2847c459" "5dcfd934d012ce205960052158461d7c5d480de2e597876e64e8f8de6928" "29a3"), + // Licenes: a2bs_hex("f7c19357e50fc474437c1a635c5bae8f6f51afa20750766db19457dff7ae" "f2cae78848a225cc6a088bbcffead5be6aab6fc8af091bf459c3bd9bcfa1" "8de53ef76db1b4826cf0b8ff7b2d7c44bbadb3cd7aedd8f639d1f38c52a5" @@ -3507,14 +4066,115 @@ const UsageInfo kUsageInfoTestData[] = { "b872dbcb703d7bf20b9ecaa481425a5218d85a49595f3ed268d61f1be8e3" "8e6126eb075fa6b7ae80431c8521c4bc2ce701e45d33bfca9a5b0b66b550" "aab21eae41f84cadfd2517dee9a2c139ad475c387d25"), + // Key set ID: "ksid321bb636f8a3f5cd5d54a236", + // Usage entry: a2bs_hex("c3cb027611397b5d70cc0b08e0f5249cd19996da674e33722902173d45d7" "09914a3d7e898d93170317bfcff34861c0d687048cc93542a75a2c99b232" "3fafea1ee0c3e3d24edf2633"), + // Usage entry index: 7, + // DRM certificate: kDrmCertificate, + // Wrapped private key. kCryptoWrappedKey, }, + // File contents for test vector 8 + // sessions: + // -token: + // bb3370ccd3c3c49573d6b74386d1886d9888bd81fe3241bcd2bac9407d1a + // 834e + // license_request: + // dc0e51cfa5863f6c0b32a4ad7fa40625dadcc2dcde9e7fa3983b8804d996 + // 6803181682fc8ae831472e0b2fc26276242fbce624d286eedecce5555804 + // 913b4f8f86c5ae86160b8434b109169a63da04c5265102d772c1180543ef + // 226d2140357aca6cf87da3f7e370dfc08ca92a1f7c7d314eab36292a9170 + // 8f6c6ad84b37ee1c7dfafb99289206cb752d063f330efd85885f4b72ba1c + // a5823eed865a461345e3d6417872bf3b0608b3d9e1004c11e7326d3ed406 + // 192e13455d0ec4e1f558a147 + // license: + // f42a68ca3a14fb68f5992e4519f57970c3dae73f8da1d5b0b1da3eff7a95 + // 4012a0dc634357f3f5477a820e182182f24ae8e835ab10c18386cc8a0727 + // d3f38b628639bfbd69a94d4053eab1c31e075e014cc578b226cfe24d6b42 + // db242972def8f23a4aae88451307c2abaf54c1803ae54e3f1149aa6e6d42 + // 88cc7d474e876be07954e8b2deff4ade4bf30229fb6c92df4d66cd463f68 + // 6b4754b940210eb59f1581d658ddf8de8389e0e2d123e2cae3c2be6eb194 + // 8ccc896dd4cdf45f9090c96dfb925795cfb4ccda83e3eb4f745577b17fc1 + // 66bf5f4103c9085134cad7863a41b04f32ef20201e54b55f1817ce589619 + // b096c254fd2c2fa4a06f4de35ccfd23e + // key_set_id: "kside11109bf20cde544083ef4ee" + // usage_entry: + // ea106c124476b753d39368a5966972a2729bb8bbea734a2b3e812b705eac + // e016c8a03c9a406094d80059ef4ca26f1928fa2daa5de9a6f22372e5c7a9 + // 41e610d1efb56ed7ce2228a70e2e150afb66edc2da066d463aa90ba0caff + // 078fbfec05c8 + // usage_entry_index: 0 + // drm_certificate_id: 0 + // -token: + // eace80e30bfda213f1ce4dbcfd9d4d24b8e2ae00054d167d9d7ae9954706 + // 2b9113 + // license_request: + // 68a7665a21348fc0590328608dc520be40f5b749328568fe383ef69c1a58 + // 7ab2446cf9c41d821373d0856a883b316519a42218f80e7bd5764d16bac9 + // a9b427a7278f5940e563fcf6dee0ff3aadbb702ebf2c54ec354ae7acc84e + // e6a54bca1f30e38ef71c44a81d0009b1484feaf4f1a56f58c35bb2372c80 + // c6dfb389e6de60bdd3d46c03975715260f6fdbe42facb64c22eda9635c04 + // da79434e1c41fbd2fdbbab6598283226c0278e8e0a96d780d3436523efd1 + // license: + // ff6fecf7157828812a2d6dcb15383a6d9af4519ef804c6053a10c436002d + // e3a4efcc017755f4ad1101bdc813e2d211732418dee529cbb413c48aa588 + // 4c76a5c6f556a715055560d4247f5bf310956949a3a171a4aa608a484468 + // 84e7676d558ff64d392b84e617805693d90f1e9b7b540c383d384d7f7ce0 + // 6c23618681bd838ceb1a514047f1c562c43159cc5e21588fbfce8a354111 + // 160f1a1e2bd3d798a000579bdfdb977252809ee1502df8045972fe8aac84 + // 0211c2f8d9e4d5be18509c327c647d654c4b6cc430b98f1ff37c96fab087 + // fb561b8cc18480f877c873594d3148ff74b0e3c6327c27ca876dae742239 + // 8fc5e85269cba49ad099 + // key_set_id: "ksid8e80350cbef6463a0025e6cc" + // usage_entry: + // 7ccc7ce96055e16a52fa192ea2cf3c9df3e89b9133a52286f71e6c6d82d0 + // 435f6b2155dfde590b347d8c86f62d7dfbaae640c237256f609e5da9cc6c + // 103465fe3441612bbdfdf4d1c24b2147feb8565cef4993e439c9d564a39a + // 4ac5bb1da69acb44da06e4522c9a93d310cdda5dac1e1e0b91abff41e4e2 + // edda4001 + // usage_entry_index: 7 + // drm_certificate_id: 0 + // -token: + // d0b9a07ad7ffeec13784bd60da011be3589f3e450227fd36b1a3f6786cdb + // fe8f + // license_request: + // a419c5687a592099dc67da8bc4f5ef238c80fe4ce3e2fcb025392efb1438 + // 4b581b595a0e8fa95de637fb2184719eb36ad6539ee9df0f67697f91d018 + // 6e04552e811196029cf4e256518ddf3215af8ec61442c17d6753b93f9d3a + // 9240bae39bacf5563659cf47d3a611ce20ed3ebbf86cddad60cc2847c459 + // 5dcfd934d012ce205960052158461d7c5d480de2e597876e64e8f8de6928 + // 29a3 + // license: + // f7c19357e50fc474437c1a635c5bae8f6f51afa20750766db19457dff7ae + // f2cae78848a225cc6a088bbcffead5be6aab6fc8af091bf459c3bd9bcfa1 + // 8de53ef76db1b4826cf0b8ff7b2d7c44bbadb3cd7aedd8f639d1f38c52a5 + // 8611a9782aeace72be69a73d2e091a1120dc63f7ba6f1cb6cddd69e9a236 + // 232ed8c14cee665756ba51f1d2e2530ab3662ce1b6efba91c5f10c53abc8 + // 86d6f25b5dc40417e54270843f3b454c8c047fc366249e30379b0fbe0174 + // fcab8b8405ae7f20f6f2b81f11082ff0e270b75f1e1aa7ed5806f4e65b46 + // b872dbcb703d7bf20b9ecaa481425a5218d85a49595f3ed268d61f1be8e3 + // 8e6126eb075fa6b7ae80431c8521c4bc2ce701e45d33bfca9a5b0b66b550 + // aab21eae41f84cadfd2517dee9a2c139ad475c387d25 + // key_set_id: "ksid321bb636f8a3f5cd5d54a236" + // usage_entry: + // c3cb027611397b5d70cc0b08e0f5249cd19996da674e33722902173d45d7 + // 09914a3d7e898d93170317bfcff34861c0d687048cc93542a75a2c99b232 + // 3fafea1ee0c3e3d24edf2633 + // usage_entry_index: 7 + // drm_certificate_id: 0 + // drm_certificate_cache: + // -drm_certificate_id: 0 + // drm_certificate: + // certificate: "a drm certificate" + // wrapped_private_key: "a wrapped private key" + // key_type: RSA + // acquisition_time_seconds: 0 + // expiration_time_seconds: 0 a2bs_hex( "0AF30E080310012AEC0E0AEA040A20BB3370CCD3C3C49573D6B74386D1886D9888BD8" "1FE3241BCD2BAC9407D1A834E12C001DC0E51CFA5863F6C0B32A4AD7FA40625DADCC2" @@ -5223,8 +5883,7 @@ TEST_F(DeviceFilesUsageInfoTest, ListNullParam) { TEST_F(DeviceFilesUsageInfoTest, ListIdsNull) { MockFileSystem file_system; - std::string app_id = kUsageInfoTestData[0].app_id; - + const std::string& app_id = kUsageInfoTestData[0].app_id; DeviceFiles device_files(&file_system); EXPECT_TRUE(device_files.Init(kSecurityLevelL1)); EXPECT_FALSE(device_files.ListUsageIds(app_id, nullptr, nullptr)); @@ -5233,13 +5892,14 @@ TEST_F(DeviceFilesUsageInfoTest, ListIdsNull) { TEST_F(DeviceFilesUsageInfoTest, ListUsageIds) { MockFileSystem file_system; - int index = 8; - std::string app_id = kUsageInfoTestData[index].app_id; + const int index = 8; + const std::string& app_id = kUsageInfoTestData[index].app_id; - std::string file_name = DeviceFiles::GetUsageInfoFileName(app_id); - std::string path = device_base_path_ + file_name; - std::string file_data = (index < 0) ? kEmptyUsageInfoFileData - : kUsageInfoTestData[index].file_data; + const std::string file_name = DeviceFiles::GetUsageInfoFileName(app_id); + const std::string path = device_base_path_ + file_name; + const std::string& file_data = (index < 0) + ? kEmptyUsageInfoFileData + : kUsageInfoTestData[index].file_data; if (index >= 0) { // Call to Open will return a unique_ptr, freeing this object. MockFile* file = new MockFile(); @@ -5248,11 +5908,10 @@ TEST_F(DeviceFilesUsageInfoTest, ListUsageIds) { .WillRepeatedly(Return(true)); EXPECT_CALL(file_system, FileSize(StrEq(path))) .Times(2) - .WillRepeatedly(Return(kUsageInfoTestData[index].file_data.size())); + .WillRepeatedly(Return(file_data.size())); EXPECT_CALL(file_system, Open(StrEq(path), _)) .WillOnce(Return(ByMove(std::unique_ptr(file)))); - EXPECT_CALL(*file, - Read(NotNull(), Eq(kUsageInfoTestData[index].file_data.size()))) + EXPECT_CALL(*file, Read(NotNull(), Eq(file_data.size()))) .WillOnce(DoAll(SetArrayArgument<0>(file_data.begin(), file_data.end()), Return(file_data.size()))); } else { @@ -5267,28 +5926,36 @@ TEST_F(DeviceFilesUsageInfoTest, ListUsageIds) { EXPECT_TRUE(device_files.ListUsageIds(app_id, &key_set_ids, &provider_session_tokens)); - EXPECT_EQ(key_set_ids.size(), provider_session_tokens.size()); - if (index >= 0) { - for (size_t i = 0; i < provider_session_tokens.size(); ++i) { - bool found = false; - for (int j = 0; !found && j <= index; ++j) { - if (app_id == kUsageInfoTestData[j].app_id && - kUsageInfoTestData[j].usage_data.provider_session_token == - provider_session_tokens[i] && - kUsageInfoTestData[j].usage_data.key_set_id == key_set_ids[i]) { - found = true; - } + ASSERT_EQ(key_set_ids.size(), provider_session_tokens.size()); + if (index < 0) return; + // Ensure that all the listed key set IDs and PSTs are found within + // the list of usage entries. + // Note: Any entry found in |.file_data| would have been defined in + // in |.usage_data| at or before the current |index|. + for (size_t i = 0; i < provider_session_tokens.size(); ++i) { + const std::string& pst = provider_session_tokens[i]; + const CdmKeySetId& ksid = key_set_ids[i]; + bool found = false; + for (int j = 0; !found && j <= index; ++j) { + if (kUsageInfoTestData[j].app_id != app_id) continue; + const DeviceFiles::CdmUsageData& usage_data = + kUsageInfoTestData[j].usage_data; + if (pst == usage_data.provider_session_token && + ksid == usage_data.key_set_id) { + found = true; } - EXPECT_TRUE(found); } + EXPECT_TRUE(found); } } TEST_P(DeviceFilesUsageInfoListTest, UsageInfoList) { MockFileSystem file_system; - int index = GetParam(); + const int index = GetParam(); + // List of all file names. std::vector file_list; + // List of only usage info files. std::vector expected_usage_file_list; for (int i = 0; i <= index; ++i) { file_list.push_back(kTestListUsageInfoData[i].file_name); @@ -5317,31 +5984,31 @@ TEST_P(DeviceFilesUsageInfoTest, Store) { // Call to Open will return a unique_ptr, freeing this object. MockFile* file = new MockFile(); - int index = GetParam(); + const int index = GetParam(); - std::string app_id; - if (index >= 0) app_id = kUsageInfoTestData[index].app_id; - std::string file_name = DeviceFiles::GetUsageInfoFileName(app_id); - std::string path = device_base_path_ + file_name; + const std::string app_id = + (index >= 0) ? kUsageInfoTestData[index].app_id : ""; + const std::string file_name = DeviceFiles::GetUsageInfoFileName(app_id); + const std::string path = device_base_path_ + file_name; + // Raw data fields for each usage info record matching belonging + // to the same |app_id|. std::vector usage_data_fields; std::vector usage_data_list; for (int i = 0; i <= index; ++i) { - if (kUsageInfoTestData[i].app_id == app_id) { - usage_data_list.push_back(kUsageInfoTestData[i].usage_data); - usage_data_fields.push_back( - kUsageInfoTestData[i].usage_data.provider_session_token); - usage_data_fields.push_back( - kUsageInfoTestData[i].usage_data.license_request); - usage_data_fields.push_back(kUsageInfoTestData[i].usage_data.license); - usage_data_fields.push_back(kUsageInfoTestData[i].usage_data.key_set_id); - usage_data_fields.push_back(kUsageInfoTestData[i].usage_data.usage_entry); - usage_data_fields.push_back( - kUsageInfoTestData[i].usage_data.drm_certificate); - usage_data_fields.push_back( - kUsageInfoTestData[i].usage_data.wrapped_private_key.key()); - } + if (kUsageInfoTestData[i].app_id != app_id) continue; + const DeviceFiles::CdmUsageData& usage_data = + kUsageInfoTestData[i].usage_data; + usage_data_list.push_back(kUsageInfoTestData[i].usage_data); + + usage_data_fields.push_back(usage_data.provider_session_token); + usage_data_fields.push_back(usage_data.license_request); + usage_data_fields.push_back(usage_data.license); + usage_data_fields.push_back(usage_data.key_set_id); + usage_data_fields.push_back(usage_data.usage_entry); + usage_data_fields.push_back(usage_data.drm_certificate); + usage_data_fields.push_back(usage_data.wrapped_private_key.key()); } EXPECT_CALL(file_system, Open(StrEq(path), _)) @@ -5359,15 +6026,15 @@ TEST_P(DeviceFilesUsageInfoTest, Store) { TEST_P(DeviceFilesUsageInfoTest, Retrieve) { MockFileSystem file_system; - int index = GetParam(); + const int index = GetParam(); - std::string app_id; - if (index >= 0) app_id = kUsageInfoTestData[index].app_id; - - std::string file_name = DeviceFiles::GetUsageInfoFileName(app_id); - std::string path = device_base_path_ + file_name; - std::string file_data = (index < 0) ? kEmptyUsageInfoFileData - : kUsageInfoTestData[index].file_data; + const std::string app_id = + (index >= 0) ? kUsageInfoTestData[index].app_id : ""; + const std::string file_name = DeviceFiles::GetUsageInfoFileName(app_id); + const std::string path = device_base_path_ + file_name; + const std::string& file_data = (index < 0) + ? kEmptyUsageInfoFileData + : kUsageInfoTestData[index].file_data; if (index >= 0) { // Call to Open will return a unique_ptr, freeing this object. MockFile* file = new MockFile(); @@ -5376,11 +6043,10 @@ TEST_P(DeviceFilesUsageInfoTest, Retrieve) { .WillRepeatedly(Return(true)); EXPECT_CALL(file_system, FileSize(StrEq(path))) .Times(2) - .WillRepeatedly(Return(kUsageInfoTestData[index].file_data.size())); + .WillRepeatedly(Return(file_data.size())); EXPECT_CALL(file_system, Open(StrEq(path), _)) .WillOnce(Return(ByMove(std::unique_ptr(file)))); - EXPECT_CALL(*file, - Read(NotNull(), Eq(kUsageInfoTestData[index].file_data.size()))) + EXPECT_CALL(*file, Read(NotNull(), Eq(file_data.size()))) .WillOnce(DoAll(SetArrayArgument<0>(file_data.begin(), file_data.end()), Return(file_data.size()))); } else { @@ -5393,49 +6059,45 @@ TEST_P(DeviceFilesUsageInfoTest, Retrieve) { EXPECT_TRUE(device_files.RetrieveUsageInfo(file_name, &usage_data_list)); - for (size_t i = 0; i < usage_data_list.size(); ++i) { + for (const auto& retrieved_usage_data : usage_data_list) { bool found = false; - int j = 0; - while (!found && j <= index) { - if (app_id == kUsageInfoTestData[j].app_id && - usage_data_list[i].provider_session_token == - kUsageInfoTestData[j].usage_data.provider_session_token) { - EXPECT_EQ(kUsageInfoTestData[j].usage_data.license_request, - usage_data_list[i].license_request); - EXPECT_EQ(kUsageInfoTestData[j].usage_data.license, - usage_data_list[i].license); - EXPECT_EQ(kUsageInfoTestData[j].usage_data.key_set_id, - usage_data_list[i].key_set_id); - EXPECT_EQ(kUsageInfoTestData[j].usage_data.usage_entry, - usage_data_list[i].usage_entry); - EXPECT_EQ(kUsageInfoTestData[j].usage_data.usage_entry_index, - usage_data_list[i].usage_entry_index); - EXPECT_EQ(kUsageInfoTestData[j].usage_data.drm_certificate, - usage_data_list[i].drm_certificate); - EXPECT_EQ(kUsageInfoTestData[j].usage_data.wrapped_private_key.type(), - usage_data_list[i].wrapped_private_key.type()); - EXPECT_EQ(kUsageInfoTestData[j].usage_data.wrapped_private_key.key(), - usage_data_list[i].wrapped_private_key.key()); - found = true; - } - ++j; + for (int i = 0; !found && i <= index; i++) { + if (kUsageInfoTestData[i].app_id != app_id) continue; + const auto& known_usage_data = kUsageInfoTestData[i].usage_data; + if (known_usage_data.key_set_id != retrieved_usage_data.key_set_id) + continue; + // Rest of the entry data must match. + EXPECT_EQ(retrieved_usage_data.provider_session_token, + known_usage_data.provider_session_token); + EXPECT_EQ(retrieved_usage_data.license_request, + known_usage_data.license_request); + EXPECT_EQ(retrieved_usage_data.license, known_usage_data.license); + EXPECT_EQ(retrieved_usage_data.key_set_id, known_usage_data.key_set_id); + EXPECT_EQ(retrieved_usage_data.usage_entry, known_usage_data.usage_entry); + EXPECT_EQ(retrieved_usage_data.usage_entry_index, + known_usage_data.usage_entry_index); + EXPECT_EQ(retrieved_usage_data.drm_certificate, + known_usage_data.drm_certificate); + EXPECT_EQ(retrieved_usage_data.wrapped_private_key, + known_usage_data.wrapped_private_key); + found = true; } - EXPECT_TRUE(found); + EXPECT_TRUE(found) << "key_set_id = " << retrieved_usage_data.key_set_id; } } TEST_P(DeviceFilesUsageInfoTest, ListKeySetIds) { MockFileSystem file_system; - int index = GetParam(); + const int index = GetParam(); + const std::string app_id = + (index >= 0) ? kUsageInfoTestData[index].app_id : ""; + const std::string file_name = DeviceFiles::GetUsageInfoFileName(app_id); + const std::string path = device_base_path_ + file_name; + const std::string& file_data = (index < 0) + ? kEmptyUsageInfoFileData + : kUsageInfoTestData[index].file_data; - std::string app_id; - if (index >= 0) app_id = kUsageInfoTestData[index].app_id; - - std::string file_name = DeviceFiles::GetUsageInfoFileName(app_id); - std::string path = device_base_path_ + file_name; - std::string file_data = (index < 0) ? kEmptyUsageInfoFileData - : kUsageInfoTestData[index].file_data; if (index >= 0) { // Call to Open will return a unique_ptr, freeing this object. MockFile* file = new MockFile(); @@ -5444,11 +6106,10 @@ TEST_P(DeviceFilesUsageInfoTest, ListKeySetIds) { .WillRepeatedly(Return(true)); EXPECT_CALL(file_system, FileSize(StrEq(path))) .Times(2) - .WillRepeatedly(Return(kUsageInfoTestData[index].file_data.size())); + .WillRepeatedly(Return(file_data.size())); EXPECT_CALL(file_system, Open(StrEq(path), _)) .WillOnce(Return(ByMove(std::unique_ptr(file)))); - EXPECT_CALL(*file, - Read(NotNull(), Eq(kUsageInfoTestData[index].file_data.size()))) + EXPECT_CALL(*file, Read(NotNull(), Eq(file_data.size()))) .WillOnce(DoAll(SetArrayArgument<0>(file_data.begin(), file_data.end()), Return(file_data.size()))); } else { @@ -5458,35 +6119,37 @@ TEST_P(DeviceFilesUsageInfoTest, ListKeySetIds) { DeviceFiles device_files(&file_system); EXPECT_TRUE(device_files.Init(kSecurityLevelL1)); - std::vector key_set_ids; + std::vector key_set_ids; EXPECT_TRUE(device_files.ListUsageIds(app_id, &key_set_ids, nullptr)); - if (index >= 0) { - for (size_t i = 0; i < key_set_ids.size(); ++i) { - bool found = false; - for (int j = 0; !found && j <= index; ++j) { - if (app_id == kUsageInfoTestData[j].app_id && - kUsageInfoTestData[j].usage_data.key_set_id == key_set_ids[i]) { - found = true; - } + if (index < 0) { + EXPECT_TRUE(key_set_ids.empty()); + return; + } + for (const CdmKeySetId& key_set_id : key_set_ids) { + bool found = false; + for (int i = 0; !found && i <= index; i++) { + if (app_id == kUsageInfoTestData[i].app_id && + kUsageInfoTestData[i].usage_data.key_set_id == key_set_id) { + found = true; } - EXPECT_TRUE(found); } + EXPECT_TRUE(found); } } TEST_P(DeviceFilesUsageInfoTest, ListProviderSessionTokenIds) { MockFileSystem file_system; - int index = GetParam(); + const int index = GetParam(); + const std::string app_id = + (index >= 0) ? kUsageInfoTestData[index].app_id : ""; + const std::string file_name = DeviceFiles::GetUsageInfoFileName(app_id); + const std::string path = device_base_path_ + file_name; + const std::string& file_data = (index < 0) + ? kEmptyUsageInfoFileData + : kUsageInfoTestData[index].file_data; - std::string app_id; - if (index >= 0) app_id = kUsageInfoTestData[index].app_id; - - std::string file_name = DeviceFiles::GetUsageInfoFileName(app_id); - std::string path = device_base_path_ + file_name; - std::string file_data = (index < 0) ? kEmptyUsageInfoFileData - : kUsageInfoTestData[index].file_data; if (index >= 0) { // Call to Open will return a unique_ptr, freeing this object. MockFile* file = new MockFile(); @@ -5495,11 +6158,10 @@ TEST_P(DeviceFilesUsageInfoTest, ListProviderSessionTokenIds) { .WillRepeatedly(Return(true)); EXPECT_CALL(file_system, FileSize(StrEq(path))) .Times(2) - .WillRepeatedly(Return(kUsageInfoTestData[index].file_data.size())); + .WillRepeatedly(Return(file_data.size())); EXPECT_CALL(file_system, Open(StrEq(path), _)) .WillOnce(Return(ByMove(std::unique_ptr(file)))); - EXPECT_CALL(*file, - Read(NotNull(), Eq(kUsageInfoTestData[index].file_data.size()))) + EXPECT_CALL(*file, Read(NotNull(), Eq(file_data.size()))) .WillOnce(DoAll(SetArrayArgument<0>(file_data.begin(), file_data.end()), Return(file_data.size()))); } else { @@ -5513,18 +6175,19 @@ TEST_P(DeviceFilesUsageInfoTest, ListProviderSessionTokenIds) { EXPECT_TRUE( device_files.ListUsageIds(app_id, nullptr, &provider_session_tokens)); - if (index >= 0) { - for (size_t i = 0; i < provider_session_tokens.size(); ++i) { - bool found = false; - for (int j = 0; !found && j <= index; ++j) { - if (app_id == kUsageInfoTestData[j].app_id && - kUsageInfoTestData[j].usage_data.provider_session_token == - provider_session_tokens[i]) { - found = true; - } + if (index < 0) { + EXPECT_TRUE(provider_session_tokens.empty()); + return; + } + for (const std::string& pst : provider_session_tokens) { + bool found = false; + for (int i = 0; !found && i <= index; i++) { + if (app_id == kUsageInfoTestData[i].app_id && + kUsageInfoTestData[i].usage_data.provider_session_token == pst) { + found = true; } - EXPECT_TRUE(found); } + EXPECT_TRUE(found); } } @@ -5533,23 +6196,24 @@ TEST_P(DeviceFilesUsageInfoTest, RetrieveByProviderSessionToken) { // Call to Open will return a unique_ptr, freeing this object. MockFile* file = new MockFile(); - int index = GetParam(); - - std::string app_id; - if (index >= 0) app_id = kUsageInfoTestData[index].app_id; - - std::string file_name = DeviceFiles::GetUsageInfoFileName(app_id); - std::string path = device_base_path_ + file_name; + const int index = GetParam(); + const std::string app_id = + (index >= 0) ? kUsageInfoTestData[index].app_id : ""; + const std::string file_name = DeviceFiles::GetUsageInfoFileName(app_id); + const std::string path = device_base_path_ + file_name; + // Use the file info which contains all usage info sessions for the + // current |app_id|. size_t max_index_by_app_id = 0; for (size_t i = 0; i < ArraySize(kUsageInfoTestData); ++i) { if (app_id == kUsageInfoTestData[i].app_id) max_index_by_app_id = i; } - std::string file_data = + const std::string& file_data = (index < 0) ? kEmptyUsageInfoFileData : kUsageInfoTestData[max_index_by_app_id].file_data; - std::string provider_session_token = kUsageInfoTestData[index < 0 ? 0 : index] - .usage_data.provider_session_token; + const std::string& provider_session_token = + kUsageInfoTestData[index < 0 ? 0 : index] + .usage_data.provider_session_token; EXPECT_CALL(file_system, Exists(StrEq(path))).WillOnce(Return(true)); EXPECT_CALL(file_system, FileSize(StrEq(path))) @@ -5571,17 +6235,16 @@ TEST_P(DeviceFilesUsageInfoTest, RetrieveByProviderSessionToken) { } else { EXPECT_TRUE(device_files.RetrieveUsageInfo( file_name, provider_session_token, &usage_data)); + const DeviceFiles::CdmUsageData& expected_usage_data = + kUsageInfoTestData[index].usage_data; - EXPECT_EQ(kUsageInfoTestData[index].usage_data.provider_session_token, + EXPECT_EQ(expected_usage_data.provider_session_token, usage_data.provider_session_token); - EXPECT_EQ(kUsageInfoTestData[index].usage_data.license_request, - usage_data.license_request); - EXPECT_EQ(kUsageInfoTestData[index].usage_data.license, usage_data.license); - EXPECT_EQ(kUsageInfoTestData[index].usage_data.key_set_id, - usage_data.key_set_id); - EXPECT_EQ(kUsageInfoTestData[index].usage_data.usage_entry, - usage_data.usage_entry); - EXPECT_EQ(kUsageInfoTestData[index].usage_data.usage_entry_index, + EXPECT_EQ(expected_usage_data.license_request, usage_data.license_request); + EXPECT_EQ(expected_usage_data.license, usage_data.license); + EXPECT_EQ(expected_usage_data.key_set_id, usage_data.key_set_id); + EXPECT_EQ(expected_usage_data.usage_entry, usage_data.usage_entry); + EXPECT_EQ(expected_usage_data.usage_entry_index, usage_data.usage_entry_index); } } @@ -5591,49 +6254,50 @@ TEST_P(DeviceFilesUsageInfoTest, UpdateUsageInfo) { // Call to Open will return a unique_ptr, freeing this object. MockFile* file = new MockFile(); - int index = GetParam(); - - std::string app_id; - if (index >= 0) app_id = kUsageInfoTestData[index].app_id; - - std::string file_name = DeviceFiles::GetUsageInfoFileName(app_id); - std::string path = device_base_path_ + file_name; + const int index = GetParam(); + const std::string app_id = + (index >= 0) ? kUsageInfoTestData[index].app_id : ""; + const std::string file_name = DeviceFiles::GetUsageInfoFileName(app_id); + const std::string path = device_base_path_ + file_name; + // Fields expected to be written back when usage info is updated. std::vector usage_data_fields; size_t max_index_by_app_id = 0; for (size_t i = 0; i < ArraySize(kUsageInfoTestData); ++i) { - if (app_id == kUsageInfoTestData[i].app_id) { - max_index_by_app_id = i; - - if ((int)i != index) { - usage_data_fields.push_back( - kUsageInfoTestData[i].usage_data.provider_session_token); - usage_data_fields.push_back( - kUsageInfoTestData[i].usage_data.license_request); - usage_data_fields.push_back(kUsageInfoTestData[i].usage_data.license); - usage_data_fields.push_back( - kUsageInfoTestData[i].usage_data.key_set_id); - usage_data_fields.push_back( - kUsageInfoTestData[i].usage_data.usage_entry); - } - } + if (app_id != kUsageInfoTestData[i].app_id) continue; + max_index_by_app_id = i; + // Skip the entry that will be overwritten. + if ((int)i == index) continue; + usage_data_fields.push_back( + kUsageInfoTestData[i].usage_data.provider_session_token); + usage_data_fields.push_back( + kUsageInfoTestData[i].usage_data.license_request); + usage_data_fields.push_back(kUsageInfoTestData[i].usage_data.license); + usage_data_fields.push_back(kUsageInfoTestData[i].usage_data.key_set_id); + usage_data_fields.push_back(kUsageInfoTestData[i].usage_data.usage_entry); } + DeviceFiles::CdmUsageData updated_entry = kUsageInfoUpdateTestData; + if (index >= 0) { - usage_data_fields.push_back( - kUsageInfoTestData[index].usage_data.provider_session_token); - usage_data_fields.push_back(kUsageInfoUpdateTestData.license_request); - usage_data_fields.push_back(kUsageInfoUpdateTestData.license); - usage_data_fields.push_back(kUsageInfoUpdateTestData.key_set_id); - usage_data_fields.push_back(kUsageInfoUpdateTestData.usage_entry); + // Updated entry must keep the same PST and key set ID. + updated_entry.provider_session_token = + kUsageInfoTestData[index].usage_data.provider_session_token; + updated_entry.key_set_id = kUsageInfoTestData[index].usage_data.key_set_id; + + usage_data_fields.push_back(updated_entry.provider_session_token); + usage_data_fields.push_back(updated_entry.license_request); + usage_data_fields.push_back(updated_entry.license); + usage_data_fields.push_back(updated_entry.key_set_id); + usage_data_fields.push_back(updated_entry.usage_entry); + usage_data_fields.push_back(updated_entry.drm_certificate); + usage_data_fields.push_back(updated_entry.wrapped_private_key.key()); } - std::string file_data = + const std::string& file_data = (index < 0) ? kEmptyUsageInfoFileData : kUsageInfoTestData[max_index_by_app_id].file_data; - std::string provider_session_token = kUsageInfoTestData[index < 0 ? 0 : index] - .usage_data.provider_session_token; EXPECT_CALL(file_system, Exists(StrEq(path))) .Times(2) @@ -5644,7 +6308,6 @@ TEST_P(DeviceFilesUsageInfoTest, UpdateUsageInfo) { .WillOnce(DoAll(SetArrayArgument<0>(file_data.begin(), file_data.end()), Return(file_data.size()))); - bool write_called = false; if (index < 0) { EXPECT_CALL(file_system, Open(StrEq(path), _)) .WillOnce(Return(ByMove(std::unique_ptr(file)))); @@ -5654,28 +6317,19 @@ TEST_P(DeviceFilesUsageInfoTest, UpdateUsageInfo) { .Times(2) .WillOnce(Return(ByMove(std::unique_ptr(file)))) .WillOnce(Return(ByMove(std::unique_ptr(next_file)))); - ON_CALL(*file, Write(_, _)) + + EXPECT_CALL(*next_file, Write(_, _)) .With(AllArgs(StrAndLenContains(usage_data_fields))) - .WillByDefault(DoAll(InvokeWithoutArgs([&write_called]() -> void { - write_called = true; - }), - ReturnArg<1>())); - ON_CALL(*next_file, Write(_, _)) - .With(AllArgs(StrAndLenContains(usage_data_fields))) - .WillByDefault(DoAll(InvokeWithoutArgs([&write_called]() -> void { - write_called = true; - }), - ReturnArg<1>())); + .WillOnce(ReturnArg<1>()); } DeviceFiles device_files(&file_system); EXPECT_TRUE(device_files.Init(kSecurityLevelL1)); - - bool expected_result = index >= 0; - EXPECT_EQ(expected_result, - device_files.UpdateUsageInfo(file_name, provider_session_token, - kUsageInfoUpdateTestData)); - if (index >= 0) EXPECT_TRUE(write_called); + if (index < 0) { + EXPECT_FALSE(device_files.UpdateUsageInfo(file_name, updated_entry)); + } else { + EXPECT_TRUE(device_files.UpdateUsageInfo(file_name, updated_entry)); + } } INSTANTIATE_TEST_SUITE_P(UsageInfo, DeviceFilesUsageInfoTest,