From 5ae1d0fa6e03059075bfefb183a207c9e2ecf269 Mon Sep 17 00:00:00 2001 From: Alex Dale Date: Wed, 1 Feb 2023 15:33:13 -0800 Subject: [PATCH] Update secure stops by key set ID. [ Merge of http://go/wvgerrit/165191 ] Previously, when updating a secure stop / usage info record, the existing record was identified by PST. It was assumed that apps would never use the same PST for different licenses; however, this was never enforced. Certain GTS tests use the same PST across multiple tests to identify different licenses. Depending on the order of operations, the periodic updating of the usage entry might overwrite the wrong entry. Key set IDs are generated by the CDM, and are guaranteed to be unique within the scope of the same file system. Given that key set IDs are not expected to be transfered to different licenses, using the key set ID to identify secure stop / usage info records eliminates the possibility of overwriting the wrong entry. Bug: 263316107 Test: device_files_unittest Test: GTS MediaDrmParameterizedTests and MediaDrmStressTest Change-Id: I2e2d50d188e05c8ca6b8095549796b913ea72d7a --- .../cdm/core/include/device_files.h | 1 - libwvdrmengine/cdm/core/src/cdm_session.cpp | 3 +- libwvdrmengine/cdm/core/src/device_files.cpp | 68 +- .../cdm/core/test/device_files_unittest.cpp | 1070 +++++++++++++---- 4 files changed, 901 insertions(+), 241 deletions(-) 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,