From 244e6301bd0d2edbed8060ec87eee93f5083278d Mon Sep 17 00:00:00 2001 From: Alex Dale Date: Fri, 14 Oct 2022 12:51:57 -0700 Subject: [PATCH] Core CDM: Remove usage info API from DeviceFiles. [ Merge of http://go/wvgerrit/159219 ] Most API functions of DeviceFiles related to usage info files have been removed. Storing and retrieving usage info files are no longer required by the CDM. The only function remaining are the ones that enabled detecting and deleting the remaining usage info files on the device. Bug: 242289743 Test: run_x86_64_tests and device_files_unittest Change-Id: I002202b47141121a0e5adac569e47d8b8bb69b1a --- .../cdm/core/include/device_files.h | 97 +- libwvdrmengine/cdm/core/src/device_files.cpp | 613 ------- .../cdm/core/test/device_files_unittest.cpp | 1417 +---------------- 3 files changed, 19 insertions(+), 2108 deletions(-) diff --git a/libwvdrmengine/cdm/core/include/device_files.h b/libwvdrmengine/cdm/core/include/device_files.h index 016378a8..9edcd4c5 100644 --- a/libwvdrmengine/cdm/core/include/device_files.h +++ b/libwvdrmengine/cdm/core/include/device_files.h @@ -164,103 +164,10 @@ class DeviceFiles { virtual bool ReserveLicenseId(const std::string& key_set_id); virtual bool UnreserveLicenseId(const std::string& key_set_id); - // Use this method to create a |usage_info_file_name| from an |app_id| - static std::string GetUsageInfoFileName(const std::string& app_id); - - // The UsageInfo methods have been revised to use |usage_info_file_name| - // rather than |app_id| as a parameter. Use the helper method above to - // translate. - // OEMCrypto API 13 introduced big usage tables which required - // migration from usage tables stored by the TEE to usage table - // header+usage entries stored in unsecured persistent storage. The upgrade - // required creation of reverse lookup tables (CdmUsageEntryInfo). - // |app_id| however was hashed and unextractable, and necessitated the - // switch to |usage_info_file_name| - virtual bool StoreUsageInfo( - const std::string& provider_session_token, - const CdmKeyMessage& key_request, const CdmKeyResponse& key_response, - const std::string& usage_info_file_name, const std::string& key_set_id, - const CdmUsageEntry& usage_entry, uint32_t usage_entry_number, - const std::string& drm_certificate, const CryptoWrappedKey& wrapped_key); - - // Retrieve usage identifying information stored on the file system. - // The caller needs to specify at least one of |ksids| or - // |provider_session_tokens| - virtual bool ListUsageIds(const std::string& app_id, - std::vector* ksids, - std::vector* provider_session_tokens); - - // Get the provider session token for the given key_set_id. - virtual bool GetProviderSessionToken(const std::string& app_id, - const std::string& key_set_id, - std::string* provider_session_token); - - virtual bool DeleteUsageInfo(const std::string& usage_info_file_name, - const std::string& provider_session_token); - - // Deletes a set of provider sessions from the specified usage info. - // Sessions removed are based on the provided |key_set_ids|. If - // there are no remaining sessions associated with the usage info - // then the file will be deleted; otherwise, the remaining sessions - // are written back to the usage info file. - // - // Args: - // usage_info_file_name: name of the file containing the usage info - // message. This name should _not_ be the complete path, just - // the file name. - // key_set_ids: The list of key set IDs to be removed from the - // usage info. Note that any key set ids that are not present - // in the usage info are silently ignored. - // Returns: - // `true` if the file existed, and operations were completed as - // expected. `false` if the file does not exist or if there is an - // issue writing the result back to file. - virtual bool DeleteMultipleUsageInfoByKeySetIds( - const std::string& usage_info_file_name, - const std::vector& key_set_ids); - - // Delete usage information from the file system. Puts a list of all the - // psts that were deleted from the file into |provider_session_tokens|. - virtual bool DeleteAllUsageInfoForApp( - const std::string& usage_info_file_name, - std::vector* provider_session_tokens); - + // Usage info has been deprecated, however, these two methods remain + // for the removal of their storage data. virtual bool DeleteAllUsageInfo(); - - // Retrieve the usage info entry specified by |provider_session_token|. - // Returns false if the entry could not be found. - virtual bool RetrieveUsageInfo(const std::string& usage_info_file_name, - const std::string& provider_session_token, - CdmKeyMessage* license_request, - CdmKeyResponse* license_response, - CdmUsageEntry* usage_entry, - uint32_t* usage_entry_number, - std::string* drm_certificate, - CryptoWrappedKey* wrapped_key); - // Retrieve the usage info entry specified by |key_set_id|. - // Returns false if the entry could not be found. - virtual bool RetrieveUsageInfoByKeySetId( - const std::string& usage_info_file_name, const std::string& key_set_id, - std::string* provider_session_token, CdmKeyMessage* license_request, - CdmKeyResponse* license_response, CdmUsageEntry* usage_entry, - uint32_t* usage_entry_number, std::string* drm_certificate, - CryptoWrappedKey* wrapped_key); - - // These APIs support upgrading from usage tables to usage tabler header + - // entries introduced in OEMCrypto V13. - virtual bool ListUsageInfoFiles(std::vector* usage_file_names); - virtual bool RetrieveUsageInfo(const std::string& usage_info_file_name, - std::vector* usage_data); - virtual bool RetrieveUsageInfo(const std::string& usage_info_file_name, - const std::string& provider_session_token, - CdmUsageData* usage_data); - // This method overwrites rather than appends data to the usage file - 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, const CdmHlsMethod method, diff --git a/libwvdrmengine/cdm/core/src/device_files.cpp b/libwvdrmengine/cdm/core/src/device_files.cpp index 78aedb62..17888a86 100644 --- a/libwvdrmengine/cdm/core/src/device_files.cpp +++ b/libwvdrmengine/cdm/core/src/device_files.cpp @@ -184,111 +184,6 @@ bool ExtractFromDeviceCertificate(const DeviceCertificate& device_certificate, } return true; } - -bool FindOrInsertUsageCertificate(const std::string& drm_certificate, - const CryptoWrappedKey& wrapped_private_key, - UsageInfo* usage_info, - uint32_t* drm_certificate_id) { - RETURN_FALSE_IF_NULL(usage_info); - RETURN_FALSE_IF_NULL(drm_certificate_id); - - // Scan |drm_certificate_cache| for |drm_certificate|. If present, - // return the id - std::set ids; - for (const UsageInfo_DrmUsageCertificate& drm_device_cert : - usage_info->drm_certificate_cache()) { - if (drm_device_cert.drm_certificate().certificate() == drm_certificate) { - *drm_certificate_id = drm_device_cert.drm_certificate_id(); - return true; - } - ids.insert(drm_device_cert.drm_certificate_id()); - } - - uint32_t last_id = 0; - - // |drm_certificate| is not in the cache. Find the first non-contiguous - // id number to insert - for (uint32_t id : ids) { - if (id > last_id + 1) { - break; - } - last_id = id; - } - - if (ids.empty()) - *drm_certificate_id = 0; - else - *drm_certificate_id = last_id + 1; - - // Now insert into |drm_certificate_cache| - UsageInfo_DrmUsageCertificate* drm_usage_certificate = - usage_info->add_drm_certificate_cache(); - drm_usage_certificate->set_drm_certificate_id(*drm_certificate_id); - - return SetDeviceCertificate(drm_certificate, wrapped_private_key, - drm_usage_certificate->mutable_drm_certificate()); -} - -bool FindUsageCertificate( - uint32_t drm_certificate_id, - const google::protobuf::RepeatedPtrField& - drm_certificate_cache, - std::string* drm_certificate, CryptoWrappedKey* wrapped_private_key) { - for (const UsageInfo_DrmUsageCertificate& drm_usage_cert : - drm_certificate_cache) { - if (drm_usage_cert.drm_certificate_id() == drm_certificate_id) { - return ExtractFromDeviceCertificate(drm_usage_cert.drm_certificate(), - drm_certificate, wrapped_private_key); - } - } - - LOGE("Unable to find any certificate in usage cache for entry: %d", - drm_certificate_id); - return false; -} - -bool UsageCertificateCacheCleanUp(UsageInfo* usage_info) { - const google::protobuf::RepeatedPtrField& - provider_sessions = usage_info->sessions(); - google::protobuf::RepeatedPtrField* - drm_certificate_cache = usage_info->mutable_drm_certificate_cache(); - - // Find all the DRM certificate ids in |drm_certificate_cache| - std::set ids; - for (const UsageInfo_DrmUsageCertificate& drm_usage_cert : - *drm_certificate_cache) { - ids.insert(drm_usage_cert.drm_certificate_id()); - } - - // Next find all the DRM certificate ids in |provider_sessions| - std::set session_ids; - for (const UsageInfo_ProviderSession& session : provider_sessions) { - session_ids.insert(session.drm_certificate_id()); - } - - // Now find all the entry numbers for DRM certificates in - // |drm_device_certificates| but not in |provider_sessions|. These need to - // be removed. - std::set ids_to_erase; - std::set_difference(ids.begin(), ids.end(), session_ids.begin(), - session_ids.end(), - std::inserter(ids_to_erase, ids_to_erase.begin())); - - const auto is_deletable = - [&ids_to_erase]( - const UsageInfo_DrmUsageCertificate& usage_certificate) -> bool { - return std::find(ids_to_erase.cbegin(), ids_to_erase.cend(), - usage_certificate.drm_certificate_id()) != - ids_to_erase.cend(); - }; - - drm_certificate_cache->erase( - std::remove_if(drm_certificate_cache->begin(), - drm_certificate_cache->end(), is_deletable), - drm_certificate_cache->end()); - - return true; -} } // namespace // static @@ -1007,512 +902,12 @@ bool DeviceFiles::UnreserveLicenseId(const std::string& key_set_id) { return true; } -bool DeviceFiles::StoreUsageInfo( - const std::string& provider_session_token, const CdmKeyMessage& key_request, - const CdmKeyResponse& key_response, const std::string& usage_info_file_name, - const std::string& key_set_id, const std::string& usage_entry, - uint32_t usage_entry_number, const std::string& drm_certificate, - const CryptoWrappedKey& wrapped_private_key) { - RETURN_FALSE_IF_UNINITIALIZED(); - video_widevine_client::sdk::File file; - if (!FileExists(usage_info_file_name)) { - file.set_type(video_widevine_client::sdk::File::USAGE_INFO); - file.set_version(video_widevine_client::sdk::File::VERSION_1); - } else { - if (RetrieveHashedFile(usage_info_file_name, &file) != kNoError) { - LOGE("Unable to retrieve usage info file"); - return false; - } - } - - UsageInfo* usage_info = file.mutable_usage_info(); - UsageInfo_ProviderSession* provider_session = usage_info->add_sessions(); - - provider_session->set_token(provider_session_token.data(), - provider_session_token.size()); - provider_session->set_license_request(key_request.data(), key_request.size()); - provider_session->set_license(key_response.data(), key_response.size()); - provider_session->set_key_set_id(key_set_id.data(), key_set_id.size()); - provider_session->set_usage_entry(usage_entry); - provider_session->set_usage_entry_number(usage_entry_number); - - if (drm_certificate.size() > 0) { - uint32_t drm_certificate_id; - if (!FindOrInsertUsageCertificate(drm_certificate, wrapped_private_key, - usage_info, &drm_certificate_id)) { - LOGE("Unable to insert a certificate in the usage certificate cache"); - 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; -} - -bool DeviceFiles::ListUsageIds( - const std::string& app_id, std::vector* ksids, - std::vector* provider_session_tokens) { - RETURN_FALSE_IF_UNINITIALIZED(); - - if (ksids == nullptr && provider_session_tokens == nullptr) { - LOGE( - "Both output parameters |ksids| and |provider_session_tokens| are " - "not provided"); - return false; - } - - // Empty or non-existent file == no usage records. - std::string file_name = GetUsageInfoFileName(app_id); - if (!FileExists(file_name) || GetFileSize(file_name) == 0) { - if (ksids != nullptr) ksids->clear(); - if (provider_session_tokens != nullptr) provider_session_tokens->clear(); - return true; - } - - video_widevine_client::sdk::File file; - if (RetrieveHashedFile(file_name, &file) != kNoError) { - LOGE("Unable to retrieve usage info file"); - return false; - } - - if (ksids != nullptr) ksids->clear(); - if (provider_session_tokens != nullptr) provider_session_tokens->clear(); - - const int num_records = file.usage_info().sessions_size(); - for (int i = 0; i < num_records; ++i) { - if ((ksids != nullptr) && - !file.usage_info().sessions(i).key_set_id().empty()) { - ksids->push_back(file.usage_info().sessions(i).key_set_id()); - } - if ((provider_session_tokens != nullptr) && - !file.usage_info().sessions(i).token().empty()) { - provider_session_tokens->push_back(file.usage_info().sessions(i).token()); - } - } - return true; -} - -bool DeviceFiles::GetProviderSessionToken(const std::string& app_id, - const std::string& key_set_id, - std::string* provider_session_token) { - RETURN_FALSE_IF_UNINITIALIZED(); - RETURN_FALSE_IF_NULL(provider_session_token); - - std::string file_name = GetUsageInfoFileName(app_id); - if (!FileExists(file_name) || GetFileSize(file_name) == 0) { - LOGE("Usage info file does not exists or is an empty file"); - return false; - } - - video_widevine_client::sdk::File file; - if (RetrieveHashedFile(file_name, &file) != kNoError) { - LOGE("Unable to retrieve usage info file"); - return false; - } - - const int num_records = static_cast(file.usage_info().sessions_size()); - for (int i = 0; i < num_records; ++i) { - if (file.usage_info().sessions(i).key_set_id() == key_set_id) { - *provider_session_token = file.usage_info().sessions(i).token(); - return true; - } - } - return false; -} - -bool DeviceFiles::DeleteUsageInfo(const std::string& usage_info_file_name, - const std::string& provider_session_token) { - RETURN_FALSE_IF_UNINITIALIZED(); - video_widevine_client::sdk::File file; - if (RetrieveHashedFile(usage_info_file_name, &file) != kNoError) { - LOGE("Unable to retrieve usage info file"); - return false; - } - - UsageInfo* usage_info = file.mutable_usage_info(); - int index = 0; - bool found = false; - for (; index < usage_info->sessions_size(); ++index) { - if (usage_info->sessions(index).token() == provider_session_token) { - found = true; - break; - } - } - - if (!found) { - LOGE("Unable to find provider session token: pst = %s", - wvutil::b2a_hex(provider_session_token).c_str()); - return false; - } - - google::protobuf::RepeatedPtrField* sessions = - usage_info->mutable_sessions(); - if (index < usage_info->sessions_size() - 1) { - sessions->SwapElements(index, usage_info->sessions_size() - 1); - } - sessions->RemoveLast(); - UsageCertificateCacheCleanUp(usage_info); - - std::string serialized_file; - file.SerializeToString(&serialized_file); - return StoreFileWithHash(usage_info_file_name, serialized_file) == kNoError; -} - -bool DeviceFiles::DeleteAllUsageInfoForApp( - const std::string& usage_info_file_name, - std::vector* provider_session_tokens) { - RETURN_FALSE_IF_UNINITIALIZED(); - RETURN_FALSE_IF_NULL(provider_session_tokens); - - provider_session_tokens->clear(); - - if (!FileExists(usage_info_file_name)) return true; - - video_widevine_client::sdk::File file; - if (RetrieveHashedFile(usage_info_file_name, &file) == kNoError) { - for (int i = 0; i < file.usage_info().sessions_size(); ++i) { - provider_session_tokens->push_back(file.usage_info().sessions(i).token()); - } - } else { - LOGW("Unable to retrieve usage info file"); - } - return RemoveFile(usage_info_file_name); -} - -bool DeviceFiles::DeleteMultipleUsageInfoByKeySetIds( - const std::string& usage_info_file_name, - const std::vector& key_set_ids) { - if (!FileExists(usage_info_file_name)) return false; - if (key_set_ids.empty()) { - LOGW("No key set IDs provided"); - return true; - } - - video_widevine_client::sdk::File file; - if (RetrieveHashedFile(usage_info_file_name, &file) != kNoError) { - LOGW("Unable to retrieve usage info file"); - return false; - } - - const auto is_deletable = - [&key_set_ids]( - const video_widevine_client::sdk::UsageInfo::ProviderSession& session) - -> bool { - return std::find(key_set_ids.cbegin(), key_set_ids.cend(), - session.key_set_id()) != key_set_ids.cend(); - }; - - auto sessions = file.mutable_usage_info()->mutable_sessions(); - const int initial_size = sessions->size(); - sessions->erase( - std::remove_if(sessions->begin(), sessions->end(), is_deletable), - sessions->end()); - - if (sessions->size() == initial_size) { - // Nothing deleted. - return true; - } - - if (sessions->size() > 0) { - UsageCertificateCacheCleanUp(file.mutable_usage_info()); - std::string serialized_file; - file.SerializeToString(&serialized_file); - return StoreFileWithHash(usage_info_file_name, serialized_file) == kNoError; - } - - return RemoveFile(usage_info_file_name); -} - bool DeviceFiles::DeleteAllUsageInfo() { RETURN_FALSE_IF_UNINITIALIZED(); return RemoveFile(kUsageInfoFileNamePrefix + std::string(kWildcard) + kUsageInfoFileNameExt); } -bool DeviceFiles::RetrieveUsageInfo(const std::string& usage_info_file_name, - const std::string& provider_session_token, - CdmKeyMessage* license_request, - CdmKeyResponse* license, - std::string* usage_entry, - uint32_t* usage_entry_number, - std::string* drm_certificate, - CryptoWrappedKey* wrapped_private_key) { - RETURN_FALSE_IF_UNINITIALIZED(); - RETURN_FALSE_IF_NULL(license_request); - RETURN_FALSE_IF_NULL(license); - RETURN_FALSE_IF_NULL(usage_entry); - RETURN_FALSE_IF_NULL(usage_entry_number); - RETURN_FALSE_IF_NULL(drm_certificate); - RETURN_FALSE_IF_NULL(wrapped_private_key); - - video_widevine_client::sdk::File file; - if (RetrieveHashedFile(usage_info_file_name, &file) != kNoError) { - LOGE("Unable to retrieve usage info file"); - return false; - } - - int index = 0; - for (; index < file.usage_info().sessions_size(); ++index) { - if (file.usage_info().sessions(index).token() == provider_session_token) { - *license_request = file.usage_info().sessions(index).license_request(); - *license = file.usage_info().sessions(index).license(); - *usage_entry = file.usage_info().sessions(index).usage_entry(); - *usage_entry_number = static_cast( - file.usage_info().sessions(index).usage_entry_number()); - - if (!file.usage_info().sessions(index).has_drm_certificate_id()) { - drm_certificate->clear(); - wrapped_private_key->Clear(); - return true; - } - - if (!FindUsageCertificate( - file.usage_info().sessions(index).drm_certificate_id(), - file.usage_info().drm_certificate_cache(), drm_certificate, - wrapped_private_key)) { - LOGE("Unable to find DRM certificate information from usage cache"); - return false; - } - return true; - } - } - - return false; -} - -bool DeviceFiles::RetrieveUsageInfoByKeySetId( - const std::string& usage_info_file_name, const std::string& key_set_id, - std::string* provider_session_token, CdmKeyMessage* license_request, - CdmKeyResponse* license, std::string* usage_entry, - uint32_t* usage_entry_number, std::string* drm_certificate, - CryptoWrappedKey* wrapped_private_key) { - RETURN_FALSE_IF_UNINITIALIZED(); - RETURN_FALSE_IF_NULL(license_request); - RETURN_FALSE_IF_NULL(license); - RETURN_FALSE_IF_NULL(usage_entry); - RETURN_FALSE_IF_NULL(usage_entry_number); - RETURN_FALSE_IF_NULL(drm_certificate); - RETURN_FALSE_IF_NULL(wrapped_private_key); - - video_widevine_client::sdk::File file; - if (RetrieveHashedFile(usage_info_file_name, &file) != kNoError) { - LOGE("Unable to retrieve usage info file"); - return false; - } - - int index = 0; - for (; index < file.usage_info().sessions_size(); ++index) { - if (file.usage_info().sessions(index).key_set_id() == key_set_id) { - *provider_session_token = file.usage_info().sessions(index).token(); - *license_request = file.usage_info().sessions(index).license_request(); - *license = file.usage_info().sessions(index).license(); - *usage_entry = file.usage_info().sessions(index).usage_entry(); - *usage_entry_number = static_cast( - file.usage_info().sessions(index).usage_entry_number()); - - if (!file.usage_info().sessions(index).has_drm_certificate_id()) { - drm_certificate->clear(); - wrapped_private_key->Clear(); - return true; - } - - if (!FindUsageCertificate( - file.usage_info().sessions(index).drm_certificate_id(), - file.usage_info().drm_certificate_cache(), drm_certificate, - wrapped_private_key)) { - LOGE("Unable to find DRM certificate information from usage cache"); - return false; - } - return true; - } - } - - return false; -} - -bool DeviceFiles::StoreUsageInfo(const std::string& usage_info_file_name, - const std::vector& usage_data) { - RETURN_FALSE_IF_UNINITIALIZED(); - - video_widevine_client::sdk::File file; - file.set_type(video_widevine_client::sdk::File::USAGE_INFO); - file.set_version(video_widevine_client::sdk::File::VERSION_1); - - UsageInfo* usage_info = file.mutable_usage_info(); - - for (size_t i = 0; i < usage_data.size(); ++i) { - UsageInfo_ProviderSession* provider_session = usage_info->add_sessions(); - - provider_session->set_token(usage_data[i].provider_session_token.data(), - usage_data[i].provider_session_token.size()); - provider_session->set_license_request(usage_data[i].license_request.data(), - usage_data[i].license_request.size()); - provider_session->set_license(usage_data[i].license.data(), - usage_data[i].license.size()); - provider_session->set_key_set_id(usage_data[i].key_set_id.data(), - usage_data[i].key_set_id.size()); - provider_session->set_usage_entry(usage_data[i].usage_entry); - provider_session->set_usage_entry_number(usage_data[i].usage_entry_number); - - if (usage_data[i].drm_certificate.size() > 0) { - uint32_t drm_certificate_id; - if (!FindOrInsertUsageCertificate(usage_data[i].drm_certificate, - usage_data[i].wrapped_private_key, - usage_info, &drm_certificate_id)) { - LOGE("Unable to insert a certificate in the usage certificate cache"); - 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; -} - -bool DeviceFiles::UpdateUsageInfo(const std::string& usage_info_file_name, - const std::string& provider_session_token, - const CdmUsageData& usage_data) { - RETURN_FALSE_IF_UNINITIALIZED(); - - video_widevine_client::sdk::File file; - if (!FileExists(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; - } - - 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_number(usage_data.usage_entry_number); - - 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; - } - } - - return false; -} - -bool DeviceFiles::RetrieveUsageInfo(const std::string& usage_info_file_name, - std::vector* usage_data) { - RETURN_FALSE_IF_UNINITIALIZED(); - RETURN_FALSE_IF_NULL(usage_data); - - if (!FileExists(usage_info_file_name) || - GetFileSize(usage_info_file_name) == 0) { - usage_data->resize(0); - return true; - } - - video_widevine_client::sdk::File file; - if (RetrieveHashedFile(usage_info_file_name, &file) != kNoError) { - LOGE("Unable to retrieve usage info file"); - return false; - } - - usage_data->resize(file.usage_info().sessions_size()); - for (int i = 0; i < file.usage_info().sessions_size(); ++i) { - (*usage_data)[i].provider_session_token = - file.usage_info().sessions(i).token(); - (*usage_data)[i].license_request = - file.usage_info().sessions(i).license_request(); - (*usage_data)[i].license = file.usage_info().sessions(i).license(); - (*usage_data)[i].key_set_id = file.usage_info().sessions(i).key_set_id(); - (*usage_data)[i].usage_entry = file.usage_info().sessions(i).usage_entry(); - (*usage_data)[i].usage_entry_number = static_cast( - file.usage_info().sessions(i).usage_entry_number()); - - if (!file.usage_info().sessions(i).has_drm_certificate_id()) { - (*usage_data)[i].drm_certificate.clear(); - (*usage_data)[i].wrapped_private_key.Clear(); - } else { - if (!FindUsageCertificate( - file.usage_info().sessions(i).drm_certificate_id(), - file.usage_info().drm_certificate_cache(), - &(*usage_data)[i].drm_certificate, - &(*usage_data)[i].wrapped_private_key)) { - LOGW("Unable to find DRM certificate information from usage cache"); - } - } - } - - return true; -} - -bool DeviceFiles::RetrieveUsageInfo(const std::string& usage_info_file_name, - const std::string& provider_session_token, - CdmUsageData* usage_data) { - RETURN_FALSE_IF_UNINITIALIZED(); - RETURN_FALSE_IF_NULL(usage_data); - - video_widevine_client::sdk::File file; - if (RetrieveHashedFile(usage_info_file_name, &file) != kNoError) { - LOGE("Unable to retrieve usage info file"); - return false; - } - - int index = 0; - for (; index < file.usage_info().sessions_size(); ++index) { - if (file.usage_info().sessions(index).token() == provider_session_token) { - usage_data->provider_session_token = - file.usage_info().sessions(index).token(); - usage_data->license_request = - file.usage_info().sessions(index).license_request(); - usage_data->license = file.usage_info().sessions(index).license(); - usage_data->key_set_id = file.usage_info().sessions(index).key_set_id(); - usage_data->usage_entry = file.usage_info().sessions(index).usage_entry(); - usage_data->usage_entry_number = static_cast( - file.usage_info().sessions(index).usage_entry_number()); - - if (!file.usage_info().sessions(index).has_drm_certificate_id()) { - usage_data->drm_certificate.clear(); - usage_data->wrapped_private_key.Clear(); - return true; - } - - if (!FindUsageCertificate( - file.usage_info().sessions(index).drm_certificate_id(), - file.usage_info().drm_certificate_cache(), - &usage_data->drm_certificate, &usage_data->wrapped_private_key)) { - LOGE("Unable to find DRM certificate information from usage cache"); - return false; - } - return true; - } - } - - return false; -} - bool DeviceFiles::ListUsageInfoFiles( std::vector* usage_info_file_names) { RETURN_FALSE_IF_UNINITIALIZED(); @@ -2133,14 +1528,6 @@ std::string DeviceFiles::GetLicenseFileNameExtension() { return kLicenseFileNameExt; } -std::string DeviceFiles::GetUsageInfoFileName(const std::string& app_id) { - std::string hash; - if (app_id != "") { - hash = GetFileNameSafeHash(app_id); - } - return kUsageInfoFileNamePrefix + hash + kUsageInfoFileNameExt; -} - std::string DeviceFiles::GetOkpInfoFileName() { return kOkpInfoFileName; } std::string DeviceFiles::GetFileNameSafeHash(const std::string& input) { diff --git a/libwvdrmengine/cdm/core/test/device_files_unittest.cpp b/libwvdrmengine/cdm/core/test/device_files_unittest.cpp index 19f88511..668819cb 100644 --- a/libwvdrmengine/cdm/core/test/device_files_unittest.cpp +++ b/libwvdrmengine/cdm/core/test/device_files_unittest.cpp @@ -2888,729 +2888,6 @@ const LicenseInfo kLicenseAppParametersBackwardsCompatibilityTestData = { "365400048001220CD0599C2B85D9F2D573AC7893CE77CB5A10B326828BA8C89047505" "A8C9B606AC")}; // kLicenseAppParametersBackwardsCompatibilityTestData -struct DeviceFilesTestListUsageInfoData { - std::string file_name; - bool is_usage_info_file; -}; - -const DeviceFilesTestListUsageInfoData kTestListUsageInfoData[] = { - {"ksid056fe6e9c.lic", false}, {"usage.bin", true}, - {"cert.bin", false}, {"usage345agdf==.bin", true}, - {"usageyd6e.lic", false}, {"usgtable.bin", false}, - {"usaget3ED.bin", true}, -}; - -struct UsageInfo { - std::string app_id; - DeviceFiles::CdmUsageData usage_data; - std::string file_data; -}; - -const std::string kEmptyUsageInfoFileData = a2bs_hex( - "0A06080310012A001220468A9A97B23D0E17147416276CB133175F0A18534155C6FFEF024A" - "D80371D7C4"); - -const UsageInfo kUsageInfoTestData[] = { - // test vector 0, app id: "", usage entry 0 - {"", - { - a2bs_hex("b8e7f26b6b8b59babf05b5a1f8927b412a85bc8551a928f00856329814ae" - "5a82"), - a2bs_hex("4463dc57079c27e34ae115c6f65b08f6311c4ea604a6512c42470b6f692a" - "76ea769d60d0b6bcf8d565ef31eb925f38e2095039c9f2f113ecee020f11" - "26eb30165372d538b551ebd7bae5cf0bbeebb3cdb6f180d42868051aab8f" - "f4947460dd96f0f8259fc6001059c998d2eb6902c064f9ae08e6cd3c7807" - "e50379507b41620d15dd76c0b1e7ed9417efd6825959b5077f464e6429a4" - "dee467a1ba2b05d38049912d5539f1ee9f5d8a569aa1c384384f847ed64f" - "6ffc101036da70e69c06e4916493e82e9fe3f65d85254c8c14f6ca0579bf" - "b3eaa86b2d7bb5ff572eccfd70f2ea4695f326beadf241ae4311e428c7c1" - "2a0d4d1915cd0537ff0f62cf13eb2fa2"), - a2bs_hex( - "bbe6b4b60da9d9bc34dcc8502fb81d8fd5fdbc8fa89605c86205f2b8c6530ff64" - "c8c31f579bd8eca603dfd5e397ac35e48931fd330351d01361bb31caaa7dbf816" - "a6144a12b6c22d1dceba20669ed635a40831066abd8071342119d7da11c43696b" - "2898d3df3b36beb8da013d9dc145343494b19d6da085f4a41e421d3def2ad8b72" - "dffffb6e79bbceaf8594045d16a62eed16904a3569860c531a32eaa5abb868b1d" - "d6a0b03d69c1a3f8336af80eb80badbbc7b80ca5943bd5b374302147052201fae" - "d30e9ffa99fc00b47f7eeb469512a413e873f91d959cccacccd3585b7f00ed8d4" - "685022101713c3adc439f27512a45926c1d2473477662c4bace72f380d105ddc9" - "f7be49ed71991b3d9e29a2038201373f98a845a57624a692f44ebd316d26c48fe" - "e82b655583317eca4aaa4dac841524a2dca111749629637ef29fa7e72645a8759" - "57fb3d98a5e6c8065b1349cfa23011cd6349d911c535475fed50be9eacb6a1ff3" - "ea7458823f0229f2fa90b7a7099e8ec349d3d0fe0277cba5157ca62c8fbaa893f" - "37b8c8cea2a0d2d2912caccf92d31aa17439479711b4a5b77445cc02c18bfe019" - "5ce8f1fe59e317214005cee5e25904c9fb0af7e2b6b4dccdf78e61e179a9f9399" - "6ec3c76f6da9b5a291bf08a73032b37edcbbbdd20cff94088a489167c56e5e75b" - "376874e9750212fe94d7656d9cd835db3b771ba5b58d2b255"), - "ksid854c8a60a5a547e122c24fca", - a2bs_hex("7d2b905e5eafd4b28aeeb7633283579e48add21a68eb26cc8c3b2e344579" - "003b12a38554336305525fa6ab70f024a18c73631bb1531eca3f0782c72d" - "ba017311b3f1e98c739632e305e4bc0b2561ae2b"), - 5, - kEmptyString, - CryptoWrappedKey(), - }, - a2bs_hex( - "0AA407080310012A9D070A9A070A20B8E7F26B6B8B59BABF05B5A1F8927B412A85BC8" - "551A928F00856329814AE5A821280024463DC57079C27E34AE115C6F65B08F6311C4E" - "A604A6512C42470B6F692A76EA769D60D0B6BCF8D565EF31EB925F38E2095039C9F2F" - "113ECEE020F1126EB30165372D538B551EBD7BAE5CF0BBEEBB3CDB6F180D42868051A" - "AB8FF4947460DD96F0F8259FC6001059C998D2EB6902C064F9AE08E6CD3C7807E5037" - "9507B41620D15DD76C0B1E7ED9417EFD6825959B5077F464E6429A4DEE467A1BA2B05" - "D38049912D5539F1EE9F5D8A569AA1C384384F847ED64F6FFC101036DA70E69C06E49" - "16493E82E9FE3F65D85254C8C14F6CA0579BFB3EAA86B2D7BB5FF572ECCFD70F2EA46" - "95F326BEADF241AE4311E428C7C12A0D4D1915CD0537FF0F62CF13EB2FA21A8004BBE" - "6B4B60DA9D9BC34DCC8502FB81D8FD5FDBC8FA89605C86205F2B8C6530FF64C8C31F5" - "79BD8ECA603DFD5E397AC35E48931FD330351D01361BB31CAAA7DBF816A6144A12B6C" - "22D1DCEBA20669ED635A40831066ABD8071342119D7DA11C43696B2898D3DF3B36BEB" - "8DA013D9DC145343494B19D6DA085F4A41E421D3DEF2AD8B72DFFFFB6E79BBCEAF859" - "4045D16A62EED16904A3569860C531A32EAA5ABB868B1DD6A0B03D69C1A3F8336AF80" - "EB80BADBBC7B80CA5943BD5B374302147052201FAED30E9FFA99FC00B47F7EEB46951" - "2A413E873F91D959CCCACCCD3585B7F00ED8D4685022101713C3ADC439F27512A4592" - "6C1D2473477662C4BACE72F380D105DDC9F7BE49ED71991B3D9E29A2038201373F98A" - "845A57624A692F44EBD316D26C48FEE82B655583317ECA4AAA4DAC841524A2DCA1117" - "49629637EF29FA7E72645A875957FB3D98A5E6C8065B1349CFA23011CD6349D911C53" - "5475FED50BE9EACB6A1FF3EA7458823F0229F2FA90B7A7099E8EC349D3D0FE0277CBA" - "5157CA62C8FBAA893F37B8C8CEA2A0D2D2912CACCF92D31AA17439479711B4A5B7744" - "5CC02C18BFE0195CE8F1FE59E317214005CEE5E25904C9FB0AF7E2B6B4DCCDF78E61E" - "179A9F93996EC3C76F6DA9B5A291BF08A73032B37EDCBBBDD20CFF94088A489167C56" - "E5E75B376874E9750212FE94D7656D9CD835DB3B771BA5B58D2B255221C6B73696438" - "35346338613630613561353437653132326332346663612A507D2B905E5EAFD4B28AE" - "EB7633283579E48ADD21A68EB26CC8C3B2E344579003B12A38554336305525FA6AB70" - "F024A18C73631BB1531ECA3F0782C72DBA017311B3F1E98C739632E305E4BC0B2561A" - "E2B30051220BCA71B49A97A2CFD5A3C4619807FE9EFCB68F9C69C4D63254FF10B22F1" - "13FA82")}, - // test vector 1, app id: "", usage entry 1 - {"", - { - a2bs_hex("5d637be37a9722aa35c23d346470851aca7d2edcd1a27edf124ea6"), - a2bs_hex("bc96d6878e3086c33624821f1f3ece23f27e58222c2bb8d1615476a11792" - "63b58f6427e92911d961fc7a3afd947aed8c9aead1f08457925d2ce4e0f6" - "18b21942baa60b231eae864048f94f74ffa700e5777f812adb6f0cb6ba6f" - "0d145e3951191eb217140c32f2c7565053222131ff823bc36d80b24b561c" - "cbea9d397fe00942e7ff73b8152cdc083b63a9f9c4a77056a0d79f44f267" - "da0ed629d9c902f7e838957ea41aa442221c3aa9410db58302b468c6d7f2" - "113663809f0dcf187c108ced"), - a2bs_hex("f6fb3693413cc1d7d5e3459b856e4156c78f8d85d548939fd00474c8cded" - "c46835cc981758500fe61cc79383b4d9f87c3e33d19c2d25d7d15dd0f3d2" - "b1af4583b71e90c59886d297e78e929c2f3840c82c626914a4eb537b3a51" - "61d963472b6592c0fa1e415556bc009c2da22bcf743ac434e22f8a33b432" - "10dfd8aa09fe86105610f366e6fb7da18996cf7c7db425a9bb50e4a13190" - "a680b9f82d37d09658585abe3bf9f009a5c1ce38a7cefe17f71fb402768b" - "2d66b4ca523ed06729349695d7864d7cf7a1cc11d0da2b8a43db834d10b4" - "7d9579ec9e46986a133277b92c636cb2a6a823afe73317266c9c0601ddba" - "db76e1d254d6183b93a1ea91a7e6c567331b3ee3a5ab1484af91fd0f8dac" - "5fd980a67d8f33cc1d6cf20ee4c24582d03967ed48b6f28e7514e4d18f38" - "c8cb1e54fba59af7d6a79c6c5a7ab06baac964c7958d201910adca018022" - "fbeb8535b64f5ce83d3c"), - "ksid2f2e85ce8a677f60047d7024e07b5ae6", - a2bs_hex("b74880fbddc5bb9db82f09bc7de3ffd95a0a671b979d4c1f0564eaf63eb6" - "b5a8c3f16d9f964afbd011e2326f9c27afbe74536f3f0601a71d9c1c422f" - "335611bf3bf1a1c89e2dea27c17a9d9a58a74121e840b002e8a6fb590072" - "45be786c1f64"), - 9, - kEmptyString, - CryptoWrappedKey(), - }, - a2bs_hex( - "0AE80C080310012AE10C0A9A070A20B8E7F26B6B8B59BABF05B5A1F8927B412A85BC8" - "551A928F00856329814AE5A821280024463DC57079C27E34AE115C6F65B08F6311C4E" - "A604A6512C42470B6F692A76EA769D60D0B6BCF8D565EF31EB925F38E2095039C9F2F" - "113ECEE020F1126EB30165372D538B551EBD7BAE5CF0BBEEBB3CDB6F180D42868051A" - "AB8FF4947460DD96F0F8259FC6001059C998D2EB6902C064F9AE08E6CD3C7807E5037" - "9507B41620D15DD76C0B1E7ED9417EFD6825959B5077F464E6429A4DEE467A1BA2B05" - "D38049912D5539F1EE9F5D8A569AA1C384384F847ED64F6FFC101036DA70E69C06E49" - "16493E82E9FE3F65D85254C8C14F6CA0579BFB3EAA86B2D7BB5FF572ECCFD70F2EA46" - "95F326BEADF241AE4311E428C7C12A0D4D1915CD0537FF0F62CF13EB2FA21A8004BBE" - "6B4B60DA9D9BC34DCC8502FB81D8FD5FDBC8FA89605C86205F2B8C6530FF64C8C31F5" - "79BD8ECA603DFD5E397AC35E48931FD330351D01361BB31CAAA7DBF816A6144A12B6C" - "22D1DCEBA20669ED635A40831066ABD8071342119D7DA11C43696B2898D3DF3B36BEB" - "8DA013D9DC145343494B19D6DA085F4A41E421D3DEF2AD8B72DFFFFB6E79BBCEAF859" - "4045D16A62EED16904A3569860C531A32EAA5ABB868B1DD6A0B03D69C1A3F8336AF80" - "EB80BADBBC7B80CA5943BD5B374302147052201FAED30E9FFA99FC00B47F7EEB46951" - "2A413E873F91D959CCCACCCD3585B7F00ED8D4685022101713C3ADC439F27512A4592" - "6C1D2473477662C4BACE72F380D105DDC9F7BE49ED71991B3D9E29A2038201373F98A" - "845A57624A692F44EBD316D26C48FEE82B655583317ECA4AAA4DAC841524A2DCA1117" - "49629637EF29FA7E72645A875957FB3D98A5E6C8065B1349CFA23011CD6349D911C53" - "5475FED50BE9EACB6A1FF3EA7458823F0229F2FA90B7A7099E8EC349D3D0FE0277CBA" - "5157CA62C8FBAA893F37B8C8CEA2A0D2D2912CACCF92D31AA17439479711B4A5B7744" - "5CC02C18BFE0195CE8F1FE59E317214005CEE5E25904C9FB0AF7E2B6B4DCCDF78E61E" - "179A9F93996EC3C76F6DA9B5A291BF08A73032B37EDCBBBDD20CFF94088A489167C56" - "E5E75B376874E9750212FE94D7656D9CD835DB3B771BA5B58D2B255221C6B73696438" - "35346338613630613561353437653132326332346663612A507D2B905E5EAFD4B28AE" - "EB7633283579E48ADD21A68EB26CC8C3B2E344579003B12A38554336305525FA6AB70" - "F024A18C73631BB1531ECA3F0782C72DBA017311B3F1E98C739632E305E4BC0B2561A" - "E2B30050AC1050A1B5D637BE37A9722AA35C23D346470851ACA7D2EDCD1A27EDF124E" - "A612C001BC96D6878E3086C33624821F1F3ECE23F27E58222C2BB8D1615476A117926" - "3B58F6427E92911D961FC7A3AFD947AED8C9AEAD1F08457925D2CE4E0F618B21942BA" - "A60B231EAE864048F94F74FFA700E5777F812ADB6F0CB6BA6F0D145E3951191EB2171" - "40C32F2C7565053222131FF823BC36D80B24B561CCBEA9D397FE00942E7FF73B8152C" - "DC083B63A9F9C4A77056A0D79F44F267DA0ED629D9C902F7E838957EA41AA442221C3" - "AA9410DB58302B468C6D7F2113663809F0DCF187C108CED1AD402F6FB3693413CC1D7" - "D5E3459B856E4156C78F8D85D548939FD00474C8CDEDC46835CC981758500FE61CC79" - "383B4D9F87C3E33D19C2D25D7D15DD0F3D2B1AF4583B71E90C59886D297E78E929C2F" - "3840C82C626914A4EB537B3A5161D963472B6592C0FA1E415556BC009C2DA22BCF743" - "AC434E22F8A33B43210DFD8AA09FE86105610F366E6FB7DA18996CF7C7DB425A9BB50" - "E4A13190A680B9F82D37D09658585ABE3BF9F009A5C1CE38A7CEFE17F71FB402768B2" - "D66B4CA523ED06729349695D7864D7CF7A1CC11D0DA2B8A43DB834D10B47D9579EC9E" - "46986A133277B92C636CB2A6A823AFE73317266C9C0601DDBADB76E1D254D6183B93A" - "1EA91A7E6C567331B3EE3A5AB1484AF91FD0F8DAC5FD980A67D8F33CC1D6CF20EE4C2" - "4582D03967ED48B6F28E7514E4D18F38C8CB1E54FBA59AF7D6A79C6C5A7AB06BAAC96" - "4C7958D201910ADCA018022FBEB8535B64F5CE83D3C22246B73696432663265383563" - "653861363737663630303437643730323465303762356165362A60B74880FBDDC5BB9" - "DB82F09BC7DE3FFD95A0A671B979D4C1F0564EAF63EB6B5A8C3F16D9F964AFBD011E2" - "326F9C27AFBE74536F3F0601A71D9C1C422F335611BF3BF1A1C89E2DEA27C17A9D9A5" - "8A74121E840B002E8A6FB59007245BE786C1F6430091220B9626315C7601BC2BD1E1C" - "88F752C956261CE7509669B2AEAA1E7F1304017941")}, - // test vector 2, app id: "app_1", usage entry 0 - {"app_1", - { - a2bs_hex("bb3370ccd3c3c49573d6b74386d1886d9888bd81fe3241bcd2bac9407d1a" - "834e"), - a2bs_hex("dc0e51cfa5863f6c0b32a4ad7fa40625dadcc2dcde9e7fa3983b8804d996" - "6803181682fc8ae831472e0b2fc26276242fbce624d286eedecce5555804" - "913b4f8f86c5ae86160b8434b109169a63da04c5265102d772c1180543ef" - "226d2140357aca6cf87da3f7e370dfc08ca92a1f7c7d314eab36292a9170" - "8f6c6ad84b37ee1c7dfafb99289206cb752d063f330efd85885f4b72ba1c" - "a5823eed865a461345e3d6417872bf3b0608b3d9e1004c11e7326d3ed406" - "192e13455d0ec4e1f558a147"), - a2bs_hex("f42a68ca3a14fb68f5992e4519f57970c3dae73f8da1d5b0b1da3eff7a95" - "4012a0dc634357f3f5477a820e182182f24ae8e835ab10c18386cc8a0727" - "d3f38b628639bfbd69a94d4053eab1c31e075e014cc578b226cfe24d6b42" - "db242972def8f23a4aae88451307c2abaf54c1803ae54e3f1149aa6e6d42" - "88cc7d474e876be07954e8b2deff4ade4bf30229fb6c92df4d66cd463f68" - "6b4754b940210eb59f1581d658ddf8de8389e0e2d123e2cae3c2be6eb194" - "8ccc896dd4cdf45f9090c96dfb925795cfb4ccda83e3eb4f745577b17fc1" - "66bf5f4103c9085134cad7863a41b04f32ef20201e54b55f1817ce589619" - "b096c254fd2c2fa4a06f4de35ccfd23e"), - "kside11109bf20cde544083ef4ee", - a2bs_hex("ea106c124476b753d39368a5966972a2729bb8bbea734a2b3e812b705eac" - "e016c8a03c9a406094d80059ef4ca26f1928fa2daa5de9a6f22372e5c7a9" - "41e610d1efb56ed7ce2228a70e2e150afb66edc2da066d463aa90ba0caff" - "078fbfec05c8"), - 0, - kEmptyString, - CryptoWrappedKey(), - }, - a2bs_hex("0AF404080310012AED040AEA040A20BB3370CCD3C3C49573D6B74386D1886D98" - "88BD81FE3241BCD2BAC9407D1A834E12C001DC0E51CFA5863F6C0B32A4AD7FA4" - "0625DADCC2DCDE9E7FA3983B8804D9966803181682FC8AE831472E0B2FC26276" - "242FBCE624D286EEDECCE5555804913B4F8F86C5AE86160B8434B109169A63DA" - "04C5265102D772C1180543EF226D2140357ACA6CF87DA3F7E370DFC08CA92A1F" - "7C7D314EAB36292A91708F6C6AD84B37EE1C7DFAFB99289206CB752D063F330E" - "FD85885F4B72BA1CA5823EED865A461345E3D6417872BF3B0608B3D9E1004C11" - "E7326D3ED406192E13455D0EC4E1F558A1471A8002F42A68CA3A14FB68F5992E" - "4519F57970C3DAE73F8DA1D5B0B1DA3EFF7A954012A0DC634357F3F5477A820E" - "182182F24AE8E835AB10C18386CC8A0727D3F38B628639BFBD69A94D4053EAB1" - "C31E075E014CC578B226CFE24D6B42DB242972DEF8F23A4AAE88451307C2ABAF" - "54C1803AE54E3F1149AA6E6D4288CC7D474E876BE07954E8B2DEFF4ADE4BF302" - "29FB6C92DF4D66CD463F686B4754B940210EB59F1581D658DDF8DE8389E0E2D1" - "23E2CAE3C2BE6EB1948CCC896DD4CDF45F9090C96DFB925795CFB4CCDA83E3EB" - "4F745577B17FC166BF5F4103C9085134CAD7863A41B04F32EF20201E54B55F18" - "17CE589619B096C254FD2C2FA4A06F4DE35CCFD23E221C6B7369646531313130" - "396266323063646535343430383365663465652A60EA106C124476B753D39368" - "A5966972A2729BB8BBEA734A2B3E812B705EACE016C8A03C9A406094D80059EF" - "4CA26F1928FA2DAA5DE9A6F22372E5C7A941E610D1EFB56ED7CE2228A70E2E15" - "0AFB66EDC2DA066D463AA90BA0CAFF078FBFEC05C8300012203384AAAFD3A883" - "17E6ED20BB88B0B3C01388AB1DF721547AE6FCB586659BC437")}, - // test vector 3, app id: "app_2", usage entry 0 - {"app_2", - { - a2bs_hex( - "9212a6926f21c6727c1ee89d5607047a1636f206f70e21fda86e01b6a4b5"), - a2bs_hex("ef947abed64078edf5b21fe6d3fb65384595d63a6d03e4d1d397c5019dee" - "b6890d3ef8773002b91e255af0820fb594069df55d8abf96498e493f5c70" - "f6b85f50e12a1ed3c039ad0cd838fe44d3fa9e2bbddeb2919041203111ed" - "7778701b04d6b15f41d0bde799e20a38b27bf96fdbe844f10364baeb5935" - "96220993c608ac793de76c237ca350931a7e216538074dbd83ddf262d9f1" - "8acd91e1ea5372f7e773c5b64333"), - a2bs_hex("7709721b3aa48597e88c99e82eaf7dff07e87e0318d9d7cec29096ec5918" - "26aa7a359316d6de1d1329b408543e237de84c986987ead1bb6a0c38817e" - "93013e5c989d366f49590b834453ec64b7433bf0b3335b9e222bad4caf55" - "4d69575c58595283166fea42e89645fc7e2d3ac9e0c1399b096cf3fed1e5" - "deb1bc4e0ee894f0ae3f929dd7dba4530e5655edbbf6041df430482eb2e8" - "91b6a93af84d3c16dbad92733ffd34e8f4ce24506bead578d20cd3e291c2" - "fc2f811db875f49abc21a24277d2ba474fe6af6c14021cfead5513e0999e" - "094020ce08209bbc08f13fe2b96d7ba8213c8e9c85b6a623788d34da794e" - "17e4cd3bd65680b97fb30bad64ddc42b1bcfb0b83e5dda3501a5902ca609" - "f41837a0d5cd096e0659b67c"), - "ksid62d88ed7b292217b0238be", - a2bs_hex("5422463fd2e4dd47626e97dd6b4ee0b89523aaebe8d11e7e7be703ef01e4" - "9b17eaf020cede0a9e0e7b5d91e4db7abdce445936cb2deecdefefdb14b7" - "8f67b7ca5c733c9e88446fd814584584b86becbf6eb2b0e3d5603e8b"), - 25, - kEmptyString, - CryptoWrappedKey(), - }, - a2bs_hex( - "0AE604080310012ADF040ADC040A1E9212A6926F21C6727C1EE89D5607047A1636F20" - "6F70E21FDA86E01B6A4B512A401EF947ABED64078EDF5B21FE6D3FB65384595D63A6D" - "03E4D1D397C5019DEEB6890D3EF8773002B91E255AF0820FB594069DF55D8ABF96498" - "E493F5C70F6B85F50E12A1ED3C039AD0CD838FE44D3FA9E2BBDDEB2919041203111ED" - "7778701B04D6B15F41D0BDE799E20A38B27BF96FDBE844F10364BAEB593596220993C" - "608AC793DE76C237CA350931A7E216538074DBD83DDF262D9F18ACD91E1EA5372F7E7" - "73C5B643331A9A027709721B3AA48597E88C99E82EAF7DFF07E87E0318D9D7CEC2909" - "6EC591826AA7A359316D6DE1D1329B408543E237DE84C986987EAD1BB6A0C38817E93" - "013E5C989D366F49590B834453EC64B7433BF0B3335B9E222BAD4CAF554D69575C585" - "95283166FEA42E89645FC7E2D3AC9E0C1399B096CF3FED1E5DEB1BC4E0EE894F0AE3F" - "929DD7DBA4530E5655EDBBF6041DF430482EB2E891B6A93AF84D3C16DBAD92733FFD3" - "4E8F4CE24506BEAD578D20CD3E291C2FC2F811DB875F49ABC21A24277D2BA474FE6AF" - "6C14021CFEAD5513E0999E094020CE08209BBC08F13FE2B96D7BA8213C8E9C85B6A62" - "3788D34DA794E17E4CD3BD65680B97FB30BAD64DDC42B1BCFB0B83E5DDA3501A5902C" - "A609F41837A0D5CD096E0659B67C221A6B73696436326438386564376232393232313" - "7623032333862652A585422463FD2E4DD47626E97DD6B4EE0B89523AAEBE8D11E7E7B" - "E703EF01E49B17EAF020CEDE0A9E0E7B5D91E4DB7ABDCE445936CB2DEECDEFEFDB14B" - "78F67B7CA5C733C9E88446FD814584584B86BECBF6EB2B0E3D5603E8B30191220E964" - "7EB0AC28F0CB11C85111D69B5FA74E80015F4A07FB5C144E6CFE0E8E3709")}, - // test vector 4, app id: "app_2", usage entry 1 - {"app_2", - { - a2bs_hex("831fad51e52a403524539eab6a1b201e46674ca3b9167b1c1b53f5e5e3"), - a2bs_hex("36d83acbc5e4ed027ed583e3b2169d98f4abedda15b781408e68efa14fef" - "a9f3f0309bcb5a9fff6580636ebe3548e5acb43b76cfeb29a9c86324e62a" - "eb40556005c6686e718f9bf61b0681d43b5b1e88084b3aea27a6b0e844e5" - "500b6fcfacf2ee44d6af7f64154ab3fd4fbd0b8056cf63971076a1eb3642" - "b78d5e76b84f4ed9f6220089863f8a4911691e79feffc9f804c4c36c7f85" - "e45b1d276c85875875267eb65da70fd2d5e9176d6914"), - a2bs_hex("317bd7063bfb9fae1b2e46f4cf15b7bc8c92517ff5c32cbb52ae4b67afc5" - "d569cb66a462def7a18a7d0acebf9f6e8a604356ade2c81450c5466a4728" - "90b03eefcf65388f060e24551c67b7d46ae5d4d841d5cc63d137fd543fae" - "2c771756590b90e480ca0126f1fc0090ace62499e47569fc52196c788f80" - "139755bdf12a7acb29fd6e23a46a4c036f04ff1ed6cd714094253bf1c587" - "62c93f0ddf8a73c4be927ffec2723a16d8ffe5128851f58537461275f6aa" - "1976e3b399b7243919207e040ec16c5328e8ab082278fce0e5d3df5c5f92" - "dba51fa6613587d4ece31f2c001b49bfaed434f9512e895c2e09c88ddbf1" - "84bfafe4d82e5d05a26ac06cde29faf6ab05b96685649c923779ce5ef7f3" - "16531ada8e74e45ab1dc1d75648aa2de052674728867e87639ff9b782a3" - "3"), - "kside1d30b33b55f2deb4716", - a2bs_hex("d44a9d70a7c582559f089b1c0fdfcbdaf5e26b672fca5d58e889b407a0ba" - "8599079cde11fadfab23aa1b97622839f3b7e1a96f8332bec5fbcbc9eb64" - "fd5ed05887b8fa3bfd6ecc7bc91e621342732062d2f4411b763e20328af6" - "f8ef5030e2f8027aef9e"), - 6, - kEmptyString, - CryptoWrappedKey(), - }, - a2bs_hex( - "0AE809080310012AE1090ADC040A1E9212A6926F21C6727C1EE89D5607047A1636F20" - "6F70E21FDA86E01B6A4B512A401EF947ABED64078EDF5B21FE6D3FB65384595D63A6D" - "03E4D1D397C5019DEEB6890D3EF8773002B91E255AF0820FB594069DF55D8ABF96498" - "E493F5C70F6B85F50E12A1ED3C039AD0CD838FE44D3FA9E2BBDDEB2919041203111ED" - "7778701B04D6B15F41D0BDE799E20A38B27BF96FDBE844F10364BAEB593596220993C" - "608AC793DE76C237CA350931A7E216538074DBD83DDF262D9F18ACD91E1EA5372F7E7" - "73C5B643331A9A027709721B3AA48597E88C99E82EAF7DFF07E87E0318D9D7CEC2909" - "6EC591826AA7A359316D6DE1D1329B408543E237DE84C986987EAD1BB6A0C38817E93" - "013E5C989D366F49590B834453EC64B7433BF0B3335B9E222BAD4CAF554D69575C585" - "95283166FEA42E89645FC7E2D3AC9E0C1399B096CF3FED1E5DEB1BC4E0EE894F0AE3F" - "929DD7DBA4530E5655EDBBF6041DF430482EB2E891B6A93AF84D3C16DBAD92733FFD3" - "4E8F4CE24506BEAD578D20CD3E291C2FC2F811DB875F49ABC21A24277D2BA474FE6AF" - "6C14021CFEAD5513E0999E094020CE08209BBC08F13FE2B96D7BA8213C8E9C85B6A62" - "3788D34DA794E17E4CD3BD65680B97FB30BAD64DDC42B1BCFB0B83E5DDA3501A5902C" - "A609F41837A0D5CD096E0659B67C221A6B73696436326438386564376232393232313" - "7623032333862652A585422463FD2E4DD47626E97DD6B4EE0B89523AAEBE8D11E7E7B" - "E703EF01E49B17EAF020CEDE0A9E0E7B5D91E4DB7ABDCE445936CB2DEECDEFEFDB14B" - "78F67B7CA5C733C9E88446FD814584584B86BECBF6EB2B0E3D5603E8B30190AFF040A" - "1D831FAD51E52A403524539EAB6A1B201E46674CA3B9167B1C1B53F5E5E312AC0136D" - "83ACBC5E4ED027ED583E3B2169D98F4ABEDDA15B781408E68EFA14FEFA9F3F0309BCB" - "5A9FFF6580636EBE3548E5ACB43B76CFEB29A9C86324E62AEB40556005C6686E718F9" - "BF61B0681D43B5B1E88084B3AEA27A6B0E844E5500B6FCFACF2EE44D6AF7F64154AB3" - "FD4FBD0B8056CF63971076A1EB3642B78D5E76B84F4ED9F6220089863F8A4911691E7" - "9FEFFC9F804C4C36C7F85E45B1D276C85875875267EB65DA70FD2D5E9176D69141AAC" - "02317BD7063BFB9FAE1B2E46F4CF15B7BC8C92517FF5C32CBB52AE4B67AFC5D569CB6" - "6A462DEF7A18A7D0ACEBF9F6E8A604356ADE2C81450C5466A472890B03EEFCF65388F" - "060E24551C67B7D46AE5D4D841D5CC63D137FD543FAE2C771756590B90E480CA0126F" - "1FC0090ACE62499E47569FC52196C788F80139755BDF12A7ACB29FD6E23A46A4C036F" - "04FF1ED6CD714094253BF1C58762C93F0DDF8A73C4BE927FFEC2723A16D8FFE512885" - "1F58537461275F6AA1976E3B399B7243919207E040EC16C5328E8AB082278FCE0E5D3" - "DF5C5F92DBA51FA6613587D4ECE31F2C001B49BFAED434F9512E895C2E09C88DDBF18" - "4BFAFE4D82E5D05A26AC06CDE29FAF6AB05B96685649C923779CE5EF7F316531ADA8E" - "74E45AB1DC1D75648AA2DE052674728867E87639FF9B782A3322186B7369646531643" - "3306233336235356632646562343731362A64D44A9D70A7C582559F089B1C0FDFCBDA" - "F5E26B672FCA5D58E889B407A0BA8599079CDE11FADFAB23AA1B97622839F3B7E1A96" - "F8332BEC5FBCBC9EB64FD5ED05887B8FA3BFD6ECC7BC91E621342732062D2F4411B76" - "3E20328AF6F8EF5030E2F8027AEF9E300612203F1EEC1DDC56EE480AC744C1D72379E" - "AFFD4675FF15A7D53BD56AC9736D62FC1")}, - // test vector 5, app id: "app_1", usage entry 1 - {"app_1", - { - a2bs_hex("eace80e30bfda213f1ce4dbcfd9d4d24b8e2ae00054d167d9d7ae9954706" - "2b9113"), - a2bs_hex("68a7665a21348fc0590328608dc520be40f5b749328568fe383ef69c1a58" - "7ab2446cf9c41d821373d0856a883b316519a42218f80e7bd5764d16bac9" - "a9b427a7278f5940e563fcf6dee0ff3aadbb702ebf2c54ec354ae7acc84e" - "e6a54bca1f30e38ef71c44a81d0009b1484feaf4f1a56f58c35bb2372c80" - "c6dfb389e6de60bdd3d46c03975715260f6fdbe42facb64c22eda9635c04" - "da79434e1c41fbd2fdbbab6598283226c0278e8e0a96d780d3436523efd" - "1"), - a2bs_hex("ff6fecf7157828812a2d6dcb15383a6d9af4519ef804c6053a10c436002d" - "e3a4efcc017755f4ad1101bdc813e2d211732418dee529cbb413c48aa588" - "4c76a5c6f556a715055560d4247f5bf310956949a3a171a4aa608a484468" - "84e7676d558ff64d392b84e617805693d90f1e9b7b540c383d384d7f7ce0" - "6c23618681bd838ceb1a514047f1c562c43159cc5e21588fbfce8a354111" - "160f1a1e2bd3d798a000579bdfdb977252809ee1502df8045972fe8aac84" - "0211c2f8d9e4d5be18509c327c647d654c4b6cc430b98f1ff37c96fab087" - "fb561b8cc18480f877c873594d3148ff74b0e3c6327c27ca876dae742239" - "8fc5e85269cba49ad099"), - "ksid8e80350cbef6463a0025e6cc", - a2bs_hex("7ccc7ce96055e16a52fa192ea2cf3c9df3e89b9133a52286f71e6c6d82d0" - "435f6b2155dfde590b347d8c86f62d7dfbaae640c237256f609e5da9cc6c" - "103465fe3441612bbdfdf4d1c24b2147feb8565cef4993e439c9d564a39a" - "4ac5bb1da69acb44da06e4522c9a93d310cdda5dac1e1e0b91abff41e4e2" - "edda4001"), - 7, - kDrmCertificate, - kCryptoWrappedKey, - }, - a2bs_hex( - "0AA00A080310012A990A0AEA040A20BB3370CCD3C3C49573D6B74386D1886D9888BD8" - "1FE3241BCD2BAC9407D1A834E12C001DC0E51CFA5863F6C0B32A4AD7FA40625DADCC2" - "DCDE9E7FA3983B8804D9966803181682FC8AE831472E0B2FC26276242FBCE624D286E" - "EDECCE5555804913B4F8F86C5AE86160B8434B109169A63DA04C5265102D772C11805" - "43EF226D2140357ACA6CF87DA3F7E370DFC08CA92A1F7C7D314EAB36292A91708F6C6" - "AD84B37EE1C7DFAFB99289206CB752D063F330EFD85885F4B72BA1CA5823EED865A46" - "1345E3D6417872BF3B0608B3D9E1004C11E7326D3ED406192E13455D0EC4E1F558A14" - "71A8002F42A68CA3A14FB68F5992E4519F57970C3DAE73F8DA1D5B0B1DA3EFF7A9540" - "12A0DC634357F3F5477A820E182182F24AE8E835AB10C18386CC8A0727D3F38B62863" - "9BFBD69A94D4053EAB1C31E075E014CC578B226CFE24D6B42DB242972DEF8F23A4AAE" - "88451307C2ABAF54C1803AE54E3F1149AA6E6D4288CC7D474E876BE07954E8B2DEFF4" - "ADE4BF30229FB6C92DF4D66CD463F686B4754B940210EB59F1581D658DDF8DE8389E0" - "E2D123E2CAE3C2BE6EB1948CCC896DD4CDF45F9090C96DFB925795CFB4CCDA83E3EB4" - "F745577B17FC166BF5F4103C9085134CAD7863A41B04F32EF20201E54B55F1817CE58" - "9619B096C254FD2C2FA4A06F4DE35CCFD23E221C6B736964653131313039626632306" - "3646535343430383365663465652A60EA106C124476B753D39368A5966972A2729BB8" - "BBEA734A2B3E812B705EACE016C8A03C9A406094D80059EF4CA26F1928FA2DAA5DE9A" - "6F22372E5C7A941E610D1EFB56ED7CE2228A70E2E150AFB66EDC2DA066D463AA90BA0" - "CAFF078FBFEC05C830000AF7040A21EACE80E30BFDA213F1CE4DBCFD9D4D24B8E2AE0" - "0054D167D9D7AE99547062B911312B40168A7665A21348FC0590328608DC520BE40F5" - "B749328568FE383EF69C1A587AB2446CF9C41D821373D0856A883B316519A42218F80" - "E7BD5764D16BAC9A9B427A7278F5940E563FCF6DEE0FF3AADBB702EBF2C54EC354AE7" - "ACC84EE6A54BCA1F30E38EF71C44A81D0009B1484FEAF4F1A56F58C35BB2372C80C6D" - "FB389E6DE60BDD3D46C03975715260F6FDBE42FACB64C22EDA9635C04DA79434E1C41" - "FBD2FDBBAB6598283226C0278E8E0A96D780D3436523EFD11AFA01FF6FECF71578288" - "12A2D6DCB15383A6D9AF4519EF804C6053A10C436002DE3A4EFCC017755F4AD1101BD" - "C813E2D211732418DEE529CBB413C48AA5884C76A5C6F556A715055560D4247F5BF31" - "0956949A3A171A4AA608A48446884E7676D558FF64D392B84E617805693D90F1E9B7B" - "540C383D384D7F7CE06C23618681BD838CEB1A514047F1C562C43159CC5E21588FBF" - "CE8A354111160F1A1E2BD3D798A000579BDFDB977252809EE1502DF8045972FE8AAC8" - "40211C2F8D9E4D5BE18509C327C647D654C4B6CC430B98F1FF37C96FAB087FB561B8C" - "C18480F877C873594D3148FF74B0E3C6327C27CA876DAE7422398FC5E85269CBA49AD" - "099221C6B7369643865383033353063626566363436336130303235653663632A7C7C" - "CC7CE96055E16A52FA192EA2CF3C9DF3E89B9133A52286F71E6C6D82D0435F6B2155D" - "FDE590B347D8C86F62D7DFBAAE640C237256F609E5DA9CC6C103465FE3441612BBDFD" - "F4D1C24B2147FEB8565CEF4993E439C9D564A39A4AC5BB1DA69ACB44DA06E4522C9A9" - "3D310CDDA5DAC1E1E0B91ABFF41E4E2EDDA40013007380012300800122C0A11612064" - "726D20636572746966696361746512156120777261707065642070726976617465206" - "B657918001220BD67878F6AA958EC6996061F69BF65E9806221BCA1CF26FFA4BF1D0B" - "4ECE8806")}, - // test vector 6, app id: "", usage entry 2 - {"", - { - a2bs_hex("1fbf0a1d2432805a0f8292ff627a9a7c60b733a51b365892c832261d71"), - a2bs_hex("1ad116a26f423c7019fa8dca226c2d2bdeec91beb1fd38d6890e32745a4d" - "bb9409b65fe834c2522d92621b265a9d526b4fcadcacf4c4deb364661118" - "494fd1561621392bf4450e6833be290d49e59e665a031375ee56ad1f3392" - "436ba213abc5ac10a199e73123f84f7644282137da24cbde30c10a6eb847" - "ca72b8b311ad329d2c9cb0909c2ecbe3fbaf88e81bb5aeaa6480fff67e87" - "77fa00c783aa160f1e211cb9bf3835fa8f82923c05895c359cf306f5cb90" - "a73b8ce2ce9ed210485e1c57"), - a2bs_hex("0bf120627d01690d14321fa967d81997b959b35ed7745dee9e885dd402df" - "83c3b8f52999b16c2d1d47bf4724a9ced984175eb8a032d613294c148020" - "74154c34fd40fe6ea74fa830fdcb9cc7e0799a75aadaf41ddda3d0038896" - "da966b1a67ff4e6c7403debfdbe7d1d48f1a3304124f04c974bfa0eff4d0" - "b1733a84aa6f89ec74c89dad2168da4706f6dfcfd980502b573d0f7b3791" - "252cc918394e8b3a3e1ef37ce48b7fd6a2040db5915f55809f284ce4ec24" - "4149f53038b432964705e26c3bb6535461b7fff27ac8eff679dce8e5bfe1" - "d000b69a22d9efc1f310ba2f0115c96b00bc15888fbb3edd230834458491" - "eede2440550dd59c613dc8433efe979c71e9"), - "ksida5d27d7b0ccd433203e157", - a2bs_hex("1be7cd47cefdef69576348ef9a143be2311041a5f80259938fa886139679" - "4eabcc985a695be2ef4a8361d86979859c490922d92d3ed0484e1666270a" - "a96388bf6be3c4f4f0b7e2f59efc6b8e965d8fadd5ab86b2bb816d2573ec" - "36eb42b571297681be152d40639d"), - 0, - kEmptyString, - CryptoWrappedKey(), - }, - a2bs_hex( - "0ADA11080310012AD3110A9A070A20B8E7F26B6B8B59BABF05B5A1F8927B412A85BC8" - "551A928F00856329814AE5A821280024463DC57079C27E34AE115C6F65B08F6311C4E" - "A604A6512C42470B6F692A76EA769D60D0B6BCF8D565EF31EB925F38E2095039C9F2F" - "113ECEE020F1126EB30165372D538B551EBD7BAE5CF0BBEEBB3CDB6F180D42868051A" - "AB8FF4947460DD96F0F8259FC6001059C998D2EB6902C064F9AE08E6CD3C7807E5037" - "9507B41620D15DD76C0B1E7ED9417EFD6825959B5077F464E6429A4DEE467A1BA2B05" - "D38049912D5539F1EE9F5D8A569AA1C384384F847ED64F6FFC101036DA70E69C06E49" - "16493E82E9FE3F65D85254C8C14F6CA0579BFB3EAA86B2D7BB5FF572ECCFD70F2EA46" - "95F326BEADF241AE4311E428C7C12A0D4D1915CD0537FF0F62CF13EB2FA21A8004BBE" - "6B4B60DA9D9BC34DCC8502FB81D8FD5FDBC8FA89605C86205F2B8C6530FF64C8C31F5" - "79BD8ECA603DFD5E397AC35E48931FD330351D01361BB31CAAA7DBF816A6144A12B6C" - "22D1DCEBA20669ED635A40831066ABD8071342119D7DA11C43696B2898D3DF3B36BEB" - "8DA013D9DC145343494B19D6DA085F4A41E421D3DEF2AD8B72DFFFFB6E79BBCEAF859" - "4045D16A62EED16904A3569860C531A32EAA5ABB868B1DD6A0B03D69C1A3F8336AF80" - "EB80BADBBC7B80CA5943BD5B374302147052201FAED30E9FFA99FC00B47F7EEB46951" - "2A413E873F91D959CCCACCCD3585B7F00ED8D4685022101713C3ADC439F27512A4592" - "6C1D2473477662C4BACE72F380D105DDC9F7BE49ED71991B3D9E29A2038201373F98A" - "845A57624A692F44EBD316D26C48FEE82B655583317ECA4AAA4DAC841524A2DCA1117" - "49629637EF29FA7E72645A875957FB3D98A5E6C8065B1349CFA23011CD6349D911C53" - "5475FED50BE9EACB6A1FF3EA7458823F0229F2FA90B7A7099E8EC349D3D0FE0277CBA" - "5157CA62C8FBAA893F37B8C8CEA2A0D2D2912CACCF92D31AA17439479711B4A5B7744" - "5CC02C18BFE0195CE8F1FE59E317214005CEE5E25904C9FB0AF7E2B6B4DCCDF78E61E" - "179A9F93996EC3C76F6DA9B5A291BF08A73032B37EDCBBBDD20CFF94088A489167C56" - "E5E75B376874E9750212FE94D7656D9CD835DB3B771BA5B58D2B255221C6B73696438" - "35346338613630613561353437653132326332346663612A507D2B905E5EAFD4B28AE" - "EB7633283579E48ADD21A68EB26CC8C3B2E344579003B12A38554336305525FA6AB70" - "F024A18C73631BB1531ECA3F0782C72DBA017311B3F1E98C739632E305E4BC0B2561A" - "E2B30050AC1050A1B5D637BE37A9722AA35C23D346470851ACA7D2EDCD1A27EDF124E" - "A612C001BC96D6878E3086C33624821F1F3ECE23F27E58222C2BB8D1615476A117926" - "3B58F6427E92911D961FC7A3AFD947AED8C9AEAD1F08457925D2CE4E0F618B21942BA" - "A60B231EAE864048F94F74FFA700E5777F812ADB6F0CB6BA6F0D145E3951191EB2171" - "40C32F2C7565053222131FF823BC36D80B24B561CCBEA9D397FE00942E7FF73B8152C" - "DC083B63A9F9C4A77056A0D79F44F267DA0ED629D9C902F7E838957EA41AA442221C3" - "AA9410DB58302B468C6D7F2113663809F0DCF187C108CED1AD402F6FB3693413CC1D7" - "D5E3459B856E4156C78F8D85D548939FD00474C8CDEDC46835CC981758500FE61CC79" - "383B4D9F87C3E33D19C2D25D7D15DD0F3D2B1AF4583B71E90C59886D297E78E929C2F" - "3840C82C626914A4EB537B3A5161D963472B6592C0FA1E415556BC009C2DA22BCF743" - "AC434E22F8A33B43210DFD8AA09FE86105610F366E6FB7DA18996CF7C7DB425A9BB50" - "E4A13190A680B9F82D37D09658585ABE3BF9F009A5C1CE38A7CEFE17F71FB402768B2" - "D66B4CA523ED06729349695D7864D7CF7A1CC11D0DA2B8A43DB834D10B47D9579EC9E" - "46986A133277B92C636CB2A6A823AFE73317266C9C0601DDBADB76E1D254D6183B93A" - "1EA91A7E6C567331B3EE3A5AB1484AF91FD0F8DAC5FD980A67D8F33CC1D6CF20EE4C2" - "4582D03967ED48B6F28E7514E4D18F38C8CB1E54FBA59AF7D6A79C6C5A7AB06BAAC96" - "4C7958D201910ADCA018022FBEB8535B64F5CE83D3C22246B73696432663265383563" - "653861363737663630303437643730323465303762356165362A60B74880FBDDC5BB9" - "DB82F09BC7DE3FFD95A0A671B979D4C1F0564EAF63EB6B5A8C3F16D9F964AFBD011E2" - "326F9C27AFBE74536F3F0601A71D9C1C422F335611BF3BF1A1C89E2DEA27C17A9D9A5" - "8A74121E840B002E8A6FB59007245BE786C1F6430090AEF040A1D1FBF0A1D2432805A" - "0F8292FF627A9A7C60B733A51B365892C832261D7112C0011AD116A26F423C7019FA8" - "DCA226C2D2BDEEC91BEB1FD38D6890E32745A4DBB9409B65FE834C2522D92621B265A" - "9D526B4FCADCACF4C4DEB364661118494FD1561621392BF4450E6833BE290D49E59E6" - "65A031375EE56AD1F3392436BA213ABC5AC10A199E73123F84F7644282137DA24CBDE" - "30C10A6EB847CA72B8B311AD329D2C9CB0909C2ECBE3FBAF88E81BB5AEAA6480FFF67" - "E8777FA00C783AA160F1E211CB9BF3835FA8F82923C05895C359CF306F5CB90A73B8C" - "E2CE9ED210485E1C571A82020BF120627D01690D14321FA967D81997B959B35ED7745" - "DEE9E885DD402DF83C3B8F52999B16C2D1D47BF4724A9CED984175EB8A032D613294C" - "14802074154C34FD40FE6EA74FA830FDCB9CC7E0799A75AADAF41DDDA3D0038896DA9" - "66B1A67FF4E6C7403DEBFDBE7D1D48F1A3304124F04C974BFA0EFF4D0B1733A84AA6F" - "89EC74C89DAD2168DA4706F6DFCFD980502B573D0F7B3791252CC918394E8B3A3E1EF" - "37CE48B7FD6A2040DB5915F55809F284CE4EC244149F53038B432964705E26C3BB653" - "5461B7FFF27AC8EFF679DCE8E5BFE1D000B69A22D9EFC1F310BA2F0115C96B00BC158" - "88FBB3EDD230834458491EEDE2440550DD59C613DC8433EFE979C71E9221A6B736964" - "613564323764376230636364343333323033653135372A681BE7CD47CEFDEF6957634" - "8EF9A143BE2311041A5F80259938FA8861396794EABCC985A695BE2EF4A8361D86979" - "859C490922D92D3ED0484E1666270AA96388BF6BE3C4F4F0B7E2F59EFC6B8E965D8FA" - "DD5AB86B2BB816D2573EC36EB42B571297681BE152D40639D3000122076CFC9DBA6CD" - "93FFC6BB74D61C1B644CC32121553C50817A9F6F00633575E659")}, - // test vector 7, app id: "app_2", usage entry 2 - {"app_2", - { - a2bs_hex("8f922e955b269458ed1345bde9a24516520a536817e8e8612154a1"), - a2bs_hex("d4acc596a52055cee710e1fec44796dbf3ae6b017ab156d9bff7bfdb8f1e" - "6352bfbe453034968f940c36ac18800e22bb2ff71268053702ef3fce3fb2" - "d607a078e0d1449fcc9d0675d41b1a65f78e3c02370d18112aae1e2577ff" - "9087825a45125db5dee8e27bd14ea8666b4e8e6aba6811c40b585aabb9c9" - "185209a48d11130ff690316916961f28286c71c3e985d7dc3352166e414b" - "89da2c17cc5b69fc9c00990697f5"), - a2bs_hex("169d3c432f9c2f8b99e11632bd7d6a63f3d57679c567bedcb2e596ace105" - "0453732040cb468e9c43f6009b430ca4a4046d017e67a4badd5b71c0c9fc" - "e2274817f0bcda311a4f8703e6dc32aedf30e6f9abd40e249fc8b0a5045c" - "c1e47e60a60b4893ef92602f5584e1162f4ff3ee6d906228f97b442ace1f" - "b175d113b671bdbe4ceffdd98f2bb094c0dfac03b79541a44d8affdc987f" - "4268706b5a554e998907eb7126e8c6bc07c837d8aeebea3249e37b4b7dd7" - "327300fe7e62c15981cf73a13e806d065bcadc2c747256907a5493592b07" - "a0c07f9cd805fcdc0d30f70e4c4b2959a0f52385c6bd3e6eeb4e3d81fdc1" - "a9dc3c76faf1bfed913d58567fa9b296d27dff5217c583e7c134a642601f" - "8237"), - "kside684918d6c39bfa652a40ad936", - a2bs_hex("703f69807c8f4d140168874b924a625132eb3b896a381d617b8fb83c7314" - "a6b634d840925f711ae330599f0e0863800902b05d201a8a87b88a4bc170" - "65a1a8a556c34bf86b53afcc9951be15bea9ab55"), - 27, - kAnotherDrmCertificate, - kAnotherCryptoWrappedKey, - }, - a2bs_hex( - "0AF60E080310012AEF0E0ADC040A1E9212A6926F21C6727C1EE89D5607047A1636F20" - "6F70E21FDA86E01B6A4B512A401EF947ABED64078EDF5B21FE6D3FB65384595D63A6D" - "03E4D1D397C5019DEEB6890D3EF8773002B91E255AF0820FB594069DF55D8ABF96498" - "E493F5C70F6B85F50E12A1ED3C039AD0CD838FE44D3FA9E2BBDDEB2919041203111ED" - "7778701B04D6B15F41D0BDE799E20A38B27BF96FDBE844F10364BAEB593596220993C" - "608AC793DE76C237CA350931A7E216538074DBD83DDF262D9F18ACD91E1EA5372F7E7" - "73C5B643331A9A027709721B3AA48597E88C99E82EAF7DFF07E87E0318D9D7CEC2909" - "6EC591826AA7A359316D6DE1D1329B408543E237DE84C986987EAD1BB6A0C38817E93" - "013E5C989D366F49590B834453EC64B7433BF0B3335B9E222BAD4CAF554D69575C585" - "95283166FEA42E89645FC7E2D3AC9E0C1399B096CF3FED1E5DEB1BC4E0EE894F0AE3F" - "929DD7DBA4530E5655EDBBF6041DF430482EB2E891B6A93AF84D3C16DBAD92733FFD3" - "4E8F4CE24506BEAD578D20CD3E291C2FC2F811DB875F49ABC21A24277D2BA474FE6AF" - "6C14021CFEAD5513E0999E094020CE08209BBC08F13FE2B96D7BA8213C8E9C85B6A62" - "3788D34DA794E17E4CD3BD65680B97FB30BAD64DDC42B1BCFB0B83E5DDA3501A5902C" - "A609F41837A0D5CD096E0659B67C221A6B73696436326438386564376232393232313" - "7623032333862652A585422463FD2E4DD47626E97DD6B4EE0B89523AAEBE8D11E7E7B" - "E703EF01E49B17EAF020CEDE0A9E0E7B5D91E4DB7ABDCE445936CB2DEECDEFEFDB14B" - "78F67B7CA5C733C9E88446FD814584584B86BECBF6EB2B0E3D5603E8B30190AFF040A" - "1D831FAD51E52A403524539EAB6A1B201E46674CA3B9167B1C1B53F5E5E312AC0136D" - "83ACBC5E4ED027ED583E3B2169D98F4ABEDDA15B781408E68EFA14FEFA9F3F0309BCB" - "5A9FFF6580636EBE3548E5ACB43B76CFEB29A9C86324E62AEB40556005C6686E718F9" - "BF61B0681D43B5B1E88084B3AEA27A6B0E844E5500B6FCFACF2EE44D6AF7F64154AB3" - "FD4FBD0B8056CF63971076A1EB3642B78D5E76B84F4ED9F6220089863F8A4911691E7" - "9FEFFC9F804C4C36C7F85E45B1D276C85875875267EB65DA70FD2D5E9176D69141AAC" - "02317BD7063BFB9FAE1B2E46F4CF15B7BC8C92517FF5C32CBB52AE4B67AFC5D569CB6" - "6A462DEF7A18A7D0ACEBF9F6E8A604356ADE2C81450C5466A472890B03EEFCF65388F" - "060E24551C67B7D46AE5D4D841D5CC63D137FD543FAE2C771756590B90E480CA0126F" - "1FC0090ACE62499E47569FC52196C788F80139755BDF12A7ACB29FD6E23A46A4C036F" - "04FF1ED6CD714094253BF1C58762C93F0DDF8A73C4BE927FFEC2723A16D8FFE51288" - "51F58537461275F6AA1976E3B399B7243919207E040EC16C5328E8AB082278FCE0E5D" - "3DF5C5F92DBA51FA6613587D4ECE31F2C001B49BFAED434F9512E895C2E09C88DDBF1" - "84BFAFE4D82E5D05A26AC06CDE29FAF6AB05B96685649C923779CE5EF7F316531ADA8" - "E74E45AB1DC1D75648AA2DE052674728867E87639FF9B782A3322186B736964653164" - "33306233336235356632646562343731362A64D44A9D70A7C582559F089B1C0FDFCBD" - "AF5E26B672FCA5D58E889B407A0BA8599079CDE11FADFAB23AA1B97622839F3B7E1A9" - "6F8332BEC5FBCBC9EB64FD5ED05887B8FA3BFD6ECC7BC91E621342732062D2F4411B7" - "63E20328AF6F8EF5030E2F8027AEF9E30060ACD040A1B8F922E955B269458ED1345BD" - "E9A24516520A536817E8E8612154A112A401D4ACC596A52055CEE710E1FEC44796DBF" - "3AE6B017AB156D9BFF7BFDB8F1E6352BFBE453034968F940C36AC18800E22BB2FF712" - "68053702EF3FCE3FB2D607A078E0D1449FCC9D0675D41B1A65F78E3C02370D18112AA" - "E1E2577FF9087825A45125DB5DEE8E27BD14EA8666B4E8E6ABA6811C40B585AABB9C9" - "185209A48D11130FF690316916961F28286C71C3E985D7DC3352166E414B89DA2C17C" - "C5B69FC9C00990697F51A9002169D3C432F9C2F8B99E11632BD7D6A63F3D57679C567" - "BEDCB2E596ACE1050453732040CB468E9C43F6009B430CA4A4046D017E67A4BADD5B7" - "1C0C9FCE2274817F0BCDA311A4F8703E6DC32AEDF30E6F9ABD40E249FC8B0A5045CC1" - "E47E60A60B4893EF92602F5584E1162F4FF3EE6D906228F97B442ACE1FB175D113B67" - "1BDBE4CEFFDD98F2BB094C0DFAC03B79541A44D8AFFDC987F4268706B5A554E998907" - "EB7126E8C6BC07C837D8AEEBEA3249E37B4B7DD7327300FE7E62C15981CF73A13E806" - "D065BCADC2C747256907A5493592B07A0C07F9CD805FCDC0D30F70E4C4B2959A0F523" - "85C6BD3E6EEB4E3D81FDC1A9DC3C76FAF1BFED913D58567FA9B296D27DFF5217C583E" - "7C134A642601F8237221E6B7369646536383439313864366333396266613635326134" - "3061643933362A50703F69807C8F4D140168874B924A625132EB3B896A381D617B8FB" - "83C7314A6B634D840925F711AE330599F0E0863800902B05D201A8A87B88A4BC17065" - "A1A8A556C34BF86B53AFCC9951BE15BEA9AB55301B3800123C080012380A17616E6F7" - "46865722064726D206365727469666963617465121B616E6F74686572207772617070" - "65642070726976617465206B65791801122082BB366A1D04CD51FA6BE0E5E1F7B9393" - "0C2E887586E2E5FBC6838ADDD3A209B")}, - // test vector 8, app id: "app_1", usage entry 2 - {"app_1", - { - a2bs_hex("d0b9a07ad7ffeec13784bd60da011be3589f3e450227fd36b1a3f6786cdb" - "fe8f"), - a2bs_hex("a419c5687a592099dc67da8bc4f5ef238c80fe4ce3e2fcb025392efb1438" - "4b581b595a0e8fa95de637fb2184719eb36ad6539ee9df0f67697f91d018" - "6e04552e811196029cf4e256518ddf3215af8ec61442c17d6753b93f9d3a" - "9240bae39bacf5563659cf47d3a611ce20ed3ebbf86cddad60cc2847c459" - "5dcfd934d012ce205960052158461d7c5d480de2e597876e64e8f8de6928" - "29a3"), - a2bs_hex("f7c19357e50fc474437c1a635c5bae8f6f51afa20750766db19457dff7ae" - "f2cae78848a225cc6a088bbcffead5be6aab6fc8af091bf459c3bd9bcfa1" - "8de53ef76db1b4826cf0b8ff7b2d7c44bbadb3cd7aedd8f639d1f38c52a5" - "8611a9782aeace72be69a73d2e091a1120dc63f7ba6f1cb6cddd69e9a236" - "232ed8c14cee665756ba51f1d2e2530ab3662ce1b6efba91c5f10c53abc8" - "86d6f25b5dc40417e54270843f3b454c8c047fc366249e30379b0fbe0174" - "fcab8b8405ae7f20f6f2b81f11082ff0e270b75f1e1aa7ed5806f4e65b46" - "b872dbcb703d7bf20b9ecaa481425a5218d85a49595f3ed268d61f1be8e3" - "8e6126eb075fa6b7ae80431c8521c4bc2ce701e45d33bfca9a5b0b66b550" - "aab21eae41f84cadfd2517dee9a2c139ad475c387d25"), - "ksid321bb636f8a3f5cd5d54a236", - a2bs_hex("c3cb027611397b5d70cc0b08e0f5249cd19996da674e33722902173d45d7" - "09914a3d7e898d93170317bfcff34861c0d687048cc93542a75a2c99b232" - "3fafea1ee0c3e3d24edf2633"), - 7, - kDrmCertificate, - kCryptoWrappedKey, - }, - a2bs_hex( - "0AF30E080310012AEC0E0AEA040A20BB3370CCD3C3C49573D6B74386D1886D9888BD8" - "1FE3241BCD2BAC9407D1A834E12C001DC0E51CFA5863F6C0B32A4AD7FA40625DADCC2" - "DCDE9E7FA3983B8804D9966803181682FC8AE831472E0B2FC26276242FBCE624D286E" - "EDECCE5555804913B4F8F86C5AE86160B8434B109169A63DA04C5265102D772C11805" - "43EF226D2140357ACA6CF87DA3F7E370DFC08CA92A1F7C7D314EAB36292A91708F6C6" - "AD84B37EE1C7DFAFB99289206CB752D063F330EFD85885F4B72BA1CA5823EED865A46" - "1345E3D6417872BF3B0608B3D9E1004C11E7326D3ED406192E13455D0EC4E1F558A14" - "71A8002F42A68CA3A14FB68F5992E4519F57970C3DAE73F8DA1D5B0B1DA3EFF7A9540" - "12A0DC634357F3F5477A820E182182F24AE8E835AB10C18386CC8A0727D3F38B62863" - "9BFBD69A94D4053EAB1C31E075E014CC578B226CFE24D6B42DB242972DEF8F23A4AAE" - "88451307C2ABAF54C1803AE54E3F1149AA6E6D4288CC7D474E876BE07954E8B2DEFF4" - "ADE4BF30229FB6C92DF4D66CD463F686B4754B940210EB59F1581D658DDF8DE8389E0" - "E2D123E2CAE3C2BE6EB1948CCC896DD4CDF45F9090C96DFB925795CFB4CCDA83E3EB4" - "F745577B17FC166BF5F4103C9085134CAD7863A41B04F32EF20201E54B55F1817CE58" - "9619B096C254FD2C2FA4A06F4DE35CCFD23E221C6B736964653131313039626632306" - "3646535343430383365663465652A60EA106C124476B753D39368A5966972A2729BB8" - "BBEA734A2B3E812B705EACE016C8A03C9A406094D80059EF4CA26F1928FA2DAA5DE9A" - "6F22372E5C7A941E610D1EFB56ED7CE2228A70E2E150AFB66EDC2DA066D463AA90BA0" - "CAFF078FBFEC05C830000AF7040A21EACE80E30BFDA213F1CE4DBCFD9D4D24B8E2AE0" - "0054D167D9D7AE99547062B911312B40168A7665A21348FC0590328608DC520BE40F5" - "B749328568FE383EF69C1A587AB2446CF9C41D821373D0856A883B316519A42218F80" - "E7BD5764D16BAC9A9B427A7278F5940E563FCF6DEE0FF3AADBB702EBF2C54EC354AE7" - "ACC84EE6A54BCA1F30E38EF71C44A81D0009B1484FEAF4F1A56F58C35BB2372C80C6D" - "FB389E6DE60BDD3D46C03975715260F6FDBE42FACB64C22EDA9635C04DA79434E1C41" - "FBD2FDBBAB6598283226C0278E8E0A96D780D3436523EFD11AFA01FF6FECF71578288" - "12A2D6DCB15383A6D9AF4519EF804C6053A10C436002DE3A4EFCC017755F4AD1101BD" - "C813E2D211732418DEE529CBB413C48AA5884C76A5C6F556A715055560D4247F5BF31" - "0956949A3A171A4AA608A48446884E7676D558FF64D392B84E617805693D90F1E9B7B" - "540C383D384D7F7CE06C23618681BD838CEB1A514047F1C562C43159CC5E21588FBFC" - "E8A354111160F1A1E2BD3D798A000579BDFDB977252809EE1502DF8045972FE8AAC84" - "0211C2F8D9E4D5BE18509C327C647D654C4B6CC430B98F1FF37C96FAB087FB561B8CC" - "18480F877C873594D3148FF74B0E3C6327C27CA876DAE7422398FC5E85269CBA49AD0" - "99221C6B7369643865383033353063626566363436336130303235653663632A7C7CC" - "C7CE96055E16A52FA192EA2CF3C9DF3E89B9133A52286F71E6C6D82D0435F6B2155DF" - "DE590B347D8C86F62D7DFBAAE640C237256F609E5DA9CC6C103465FE3441612BBDFDF" - "4D1C24B2147FEB8565CEF4993E439C9D564A39A4AC5BB1DA69ACB44DA06E4522C9A93" - "D310CDDA5DAC1E1E0B91ABFF41E4E2EDDA4001300738000AD0040A20D0B9A07AD7FFE" - "EC13784BD60DA011BE3589F3E450227FD36B1A3F6786CDBFE8F129801A419C5687A59" - "2099DC67DA8BC4F5EF238C80FE4CE3E2FCB025392EFB14384B581B595A0E8FA95DE63" - "7FB2184719EB36AD6539EE9DF0F67697F91D0186E04552E811196029CF4E256518DDF" - "3215AF8EC61442C17D6753B93F9D3A9240BAE39BACF5563659CF47D3A611CE20ED3EB" - "BF86CDDAD60CC2847C4595DCFD934D012CE205960052158461D7C5D480DE2E597876E" - "64E8F8DE692829A31AA402F7C19357E50FC474437C1A635C5BAE8F6F51AFA20750766" - "DB19457DFF7AEF2CAE78848A225CC6A088BBCFFEAD5BE6AAB6FC8AF091BF459C3BD9B" - "CFA18DE53EF76DB1B4826CF0B8FF7B2D7C44BBADB3CD7AEDD8F639D1F38C52A58611A" - "9782AEACE72BE69A73D2E091A1120DC63F7BA6F1CB6CDDD69E9A236232ED8C14CEE66" - "5756BA51F1D2E2530AB3662CE1B6EFBA91C5F10C53ABC886D6F25B5DC40417E542708" - "43F3B454C8C047FC366249E30379B0FBE0174FCAB8B8405AE7F20F6F2B81F11082FF0" - "E270B75F1E1AA7ED5806F4E65B46B872DBCB703D7BF20B9ECAA481425A5218D85A495" - "95F3ED268D61F1BE8E38E6126EB075FA6B7AE80431C8521C4BC2CE701E45D33BFCA9A" - "5B0B66B550AAB21EAE41F84CADFD2517DEE9A2C139AD475C387D25221C6B736964333" - "2316262363336663861336635636435643534613233362A48C3CB027611397B5D70CC" - "0B08E0F5249CD19996DA674E33722902173D45D709914A3D7E898D93170317BFCFF34" - "861C0D687048CC93542A75A2C99B2323FAFEA1EE0C3E3D24EDF263330073800123008" - "00122C0A11612064726D2063657274696669636174651215612077726170706564207" - "0726976617465206B657918001220C662693A9E231B85CEB7A3A50DEAA8279777B363" - "2C6D9ABC12FBB295018482E4")}, -}; // kUsageInfoTestData - -const DeviceFiles::CdmUsageData kUsageInfoUpdateTestData = { - a2bs_hex("b8e7f26b6b83d6b74386d1886d9888bd81fe3241bca928f09407329814ae" - "5a82"), - a2bs_hex("4463dc57079c27e34ae115c6f65b08f6311c4ea604a6512c42470b6f692a" - "6803181682fc8ae831472e0b2fc26276242fbce624d286eedecce5555804" - "913b4f8f86c5ae86160b8434b109169a63da04c5265102d772c1180543ef" - "226d2140357aca6cf87da3f7e370dfc08ca92a1f7c7d314eab36292a9170" - "26eb30165372d538b551ebd7bae5cf0bbeebb3cdb6f180d42868051aab8f" - "e50379507b41620d15dd76c0b1e7ed9417efd6825959b5077f464e6429a4" - "6ffc101036da70e69c06e4916493e82e9fe3f65d85254c8c14f6ca0579bf" - "2a0d4d1915cd0537ff0f62cf13eb2fa2"), - a2bs_hex("bbe6b4b60da9d9bc34dcc8502fb81d8fd5fdbc8fa89605c86205f2b8c6530ff64" - "c84012a0dc634357f3f5477a820e182182f24ae8e835ab10c18386cc8a0727816" - "a6144a12b6c22d1dceba20669ed635a40831066abd8071342119d7da11c43696b" - "289d3f38b628639bfbd69a94d4053eab1c31e075e014cc578b226cfe24d6b4272" - "dffffb6e79bbceaf8594045d16a62eed16904a3569860c531a32eaa5abb868b1d" - "d6adb242972def8f23a4aae88451307c2abaf54c1803ae54e3f1149aa6e6d42ae" - "d30e9ffa99fc00b47f7eeb469512a413e873f91d959cccacccd3585b7f00ed8d4" - "685022101713c3adc439f27512a45926c1d2473477662c4bace72f380d105ddc9" - "f88cc7d474e876be07954e8b2deff4ade4bf30229fb6c92df4d66cd463f6848fe" - "e82b655583317eca4aaa4dac841524a2dca111749629637ef29fa7e72645a8759" - "57fb6b4754b940210eb59f1581d658ddf8de8389e0e2d123e2cae3c2be6eb1943" - "ea7458823f0229f2fa90b7a7099e8ec349d3d0fe0277cba5157ca62c8fbaa893f" - "37b8c8cea2a0d2d2912caccf92d31aa17439479711b4a5b77445cc02c18bfe019" - "5ce8ccc896dd4cdf45f9090c96dfb925795cfb4ccda83e3eb4f745577b17fc199" - "6ec66bf5f4103c9085134cad7863a41b04f32ef20201e54b55f1817ce5896195b" - "376874e9750212fe94d7656d9cd835db3b771ba5b58d2b255"), - "ksid854c89bf20cde54122c24fca", - a2bs_hex("7d2b905e368a5966972a2729bb8bbea734a2b21a68eb26cc8c3b2e344579" - "003b12a3855016c8a03c9a406094d80059ef4ca26f1928fa2a3f0782c72d" - "ba0e2228a70e2e150afb66e305e4bc0b2561ae2b"), - 6, - kEmptyString, - CryptoWrappedKey(), -}; // kUsageInfoUpdateTestData - struct HlsAttributesInfo { std::string key_set_id; CdmHlsMethod method; @@ -3850,12 +3127,7 @@ class DeviceFilesSecurityLevelTest : public DeviceFilesTest, public ::testing::WithParamInterface {}; -class DeviceFilesUsageInfoListTest : public DeviceFilesTest, - public ::testing::WithParamInterface { -}; - -class DeviceFilesUsageInfoTest : public DeviceFilesTest, - public ::testing::WithParamInterface {}; +class DeviceFilesUsageInfoListTest : public DeviceFilesTest {}; class DeviceFilesHlsAttributesTest : public DeviceFilesTest, @@ -3864,10 +3136,6 @@ class DeviceFilesHlsAttributesTest class DeviceFilesUsageTableTest : public DeviceFilesTest, public ::testing::WithParamInterface {}; -class DeviceFilesDeleteMultipleUsageInfoTest - : public DeviceFilesTest, - public ::testing::WithParamInterface {}; - MATCHER(IsCreateFileFlagSet, "") { return wvutil::FileSystem::kCreate & arg; } MATCHER_P(StrAndLenEq, str, "") { const std::string data(std::get<0>(arg), std::get<1>(arg)); @@ -4995,306 +4263,27 @@ TEST_F(DeviceFilesTest, OkpInfo_StoreAndRetrieve) { EXPECT_EQ(retrieved_info, info); } -// From a usage info file containing 3 provider sessions, 2 will be -// deleted using the |key_set_id| associated with them. -// It is expected that once the provider sessions are deleted, the -// usage info file will be overwritten with only the remaining provider -// session token present. -TEST_P(DeviceFilesDeleteMultipleUsageInfoTest, DeleteAllButOne) { - static const std::string kUsageInfoFileName = "usage_info_file.bin"; - const int key_set_id_index = GetParam(); +TEST_F(DeviceFilesUsageInfoListTest, UsageInfoList) { + struct FileNameAndType { + std::string file_name; + bool is_usage_info_file; + }; + const std::vector kDeviceFiles = { + {"ksid056fe6e9c.lic", false}, {"usage.bin", true}, + {"cert.bin", false}, {"usage345agdf==.bin", true}, + {"usageyd6e.lic", false}, {"usgtable.bin", false}, + {"usaget3ED.bin", true}, + }; - const std::string& result_hashed_usage_info_file = - kHashedUsageInfoFileWithSingleKeySetList[key_set_id_index]; - - MockFileSystem file_system; - DeviceFiles device_files(&file_system); - EXPECT_TRUE(device_files.Init(kSecurityLevelL1)); - std::string file_path; - ASSERT_TRUE(Properties::GetDeviceFilesBasePath(kSecurityLevelL1, &file_path)); - file_path += kUsageInfoFileName; - - EXPECT_CALL(file_system, Exists(_)).WillRepeatedly(Return(true)); - EXPECT_CALL(file_system, FileSize(file_path)) - .WillOnce(Return(kHashedUsageInfoFileWithThreeKeySetIds.size())); - - // File read expectations. - MockFile* file_in = new MockFile(); - EXPECT_CALL(file_system, Open(file_path, wvutil::FileSystem::kReadOnly)) - .WillOnce(Return(ByMove(std::unique_ptr(file_in)))); - Expectation read_original = - EXPECT_CALL(*file_in, Read(NotNull(), _)) - .WillOnce( - DoAll(SetArrayArgument<0>( - kHashedUsageInfoFileWithThreeKeySetIds.cbegin(), - kHashedUsageInfoFileWithThreeKeySetIds.cend()), - Return(kHashedUsageInfoFileWithThreeKeySetIds.size()))); - - // File write expectations. - MockFile* file_out = new MockFile(); - EXPECT_CALL(file_system, Open(file_path, wvutil::FileSystem::kCreate | - wvutil::FileSystem::kTruncate)) - .WillOnce(Return(ByMove(std::unique_ptr(file_out)))); - EXPECT_CALL(*file_out, Write(StrEq(result_hashed_usage_info_file), _)) - .After(read_original) - .WillOnce(Return(result_hashed_usage_info_file.size())); - - const auto not_current_key_set = - [key_set_id_index](const std::string& key_set_id) { - return key_set_id != kHashedUsageInfoFileKeySetList[key_set_id_index]; - }; - std::vector to_remove; - std::copy_if(kHashedUsageInfoFileKeySetList.cbegin(), - kHashedUsageInfoFileKeySetList.cend(), - std::back_inserter(to_remove), not_current_key_set); - EXPECT_TRUE(device_files.DeleteMultipleUsageInfoByKeySetIds( - kUsageInfoFileName, to_remove)); -} - -INSTANTIATE_TEST_SUITE_P(DeviceFilesTest, - DeviceFilesDeleteMultipleUsageInfoTest, - ::testing::Range(0, 3)); - -// Delete all provider sessions from a usage info file. It is expected -// that the usage info file will be deleted (not written back to with -// an empty provider session list). -TEST_F(DeviceFilesDeleteMultipleUsageInfoTest, DeleteAllKeySetIds) { - static const std::string kUsageInfoFileName = "usage_info_file.bin"; - - // Setup - MockFileSystem file_system; - DeviceFiles device_files(&file_system); - EXPECT_TRUE(device_files.Init(kSecurityLevelL1)); - std::string file_path; - ASSERT_TRUE(Properties::GetDeviceFilesBasePath(kSecurityLevelL1, &file_path)); - file_path += kUsageInfoFileName; - - // File read expectations. - MockFile* file_in = new MockFile(); - EXPECT_CALL(file_system, Exists(_)).WillRepeatedly(Return(true)); - EXPECT_CALL(file_system, FileSize(file_path)) - .WillOnce(Return(kHashedUsageInfoFileWithThreeKeySetIds.size())); - EXPECT_CALL(file_system, Open(file_path, wvutil::FileSystem::kReadOnly)) - .WillOnce(Return(ByMove(std::unique_ptr(file_in)))); - EXPECT_CALL(*file_in, Read(NotNull(), _)) - .WillOnce(DoAll( - SetArrayArgument<0>(kHashedUsageInfoFileWithThreeKeySetIds.cbegin(), - kHashedUsageInfoFileWithThreeKeySetIds.cend()), - Return(kHashedUsageInfoFileWithThreeKeySetIds.size()))); - EXPECT_CALL(file_system, Remove(file_path)).WillOnce(Return(true)); - - // Remove all sessions, and the file should be deleted. - EXPECT_TRUE(device_files.DeleteMultipleUsageInfoByKeySetIds( - kUsageInfoFileName, kHashedUsageInfoFileKeySetList)); -} - -// If the key set IDs provided cannot be found in the usage info file, -// then no action should be taken, and the function returns true. -TEST_F(DeviceFilesDeleteMultipleUsageInfoTest, DeleteNone) { - static const std::string kUsageInfoFileName = "usage_info_file.bin"; - - // Setup - MockFileSystem file_system; - DeviceFiles device_files(&file_system); - EXPECT_TRUE(device_files.Init(kSecurityLevelL1)); - std::string file_path; - ASSERT_TRUE(Properties::GetDeviceFilesBasePath(kSecurityLevelL1, &file_path)); - file_path += kUsageInfoFileName; - - EXPECT_CALL(file_system, Exists(_)).WillRepeatedly(Return(true)); - - // Call, not providing any key set IDs. Should return true without any - // action, assuming the file exists. - EXPECT_TRUE(device_files.DeleteMultipleUsageInfoByKeySetIds( - kUsageInfoFileName, std::vector())); - - MockFile* file_in = new MockFile(); - EXPECT_CALL(file_system, FileSize(file_path)) - .WillOnce(Return(kHashedUsageInfoFileWithThreeKeySetIds.size())); - EXPECT_CALL(file_system, Open(file_path, wvutil::FileSystem::kReadOnly)) - .WillOnce(Return(ByMove(std::unique_ptr(file_in)))); - EXPECT_CALL(*file_in, Read(NotNull(), _)) - .WillOnce(DoAll( - SetArrayArgument<0>(kHashedUsageInfoFileWithThreeKeySetIds.cbegin(), - kHashedUsageInfoFileWithThreeKeySetIds.cend()), - Return(kHashedUsageInfoFileWithThreeKeySetIds.size()))); - - // Call, providing key set IDs which do not exist in the usage info - // file. - const std::vector key_set_ids = {"fictional_key_set_id_1", - "fictional_key_set_id_2", - "fictional_key_set_id_3"}; - EXPECT_TRUE(device_files.DeleteMultipleUsageInfoByKeySetIds( - kUsageInfoFileName, key_set_ids)); -} - -// Delete a single key from the file. -// Test will delete "key_set_id_2" from the usage info file containing -// "key_set_id_1" & "key_set_id_2". -TEST_F(DeviceFilesDeleteMultipleUsageInfoTest, DeleteOne) { - static const std::string kUsageInfoFileName = "usage_info_file.bin"; - - MockFileSystem file_system; - DeviceFiles device_files(&file_system); - EXPECT_TRUE(device_files.Init(kSecurityLevelL1)); - std::string file_path; - ASSERT_TRUE(Properties::GetDeviceFilesBasePath(kSecurityLevelL1, &file_path)); - file_path += kUsageInfoFileName; - - EXPECT_CALL(file_system, Exists(_)).WillRepeatedly(Return(true)); - EXPECT_CALL(file_system, FileSize(file_path)) - .WillOnce(Return(kHashedUsageInfoFileWithTwoKeySetIds.size())); - - // File read expectations. - MockFile* file_in = new MockFile(); - EXPECT_CALL(file_system, Open(file_path, wvutil::FileSystem::kReadOnly)) - .WillOnce(Return(ByMove(std::unique_ptr(file_in)))); - Expectation read_original = - EXPECT_CALL(*file_in, Read(NotNull(), _)) - .WillOnce(DoAll( - SetArrayArgument<0>(kHashedUsageInfoFileWithTwoKeySetIds.cbegin(), - kHashedUsageInfoFileWithTwoKeySetIds.cend()), - Return(kHashedUsageInfoFileWithTwoKeySetIds.size()))); - - // File write expectations. - MockFile* file_out = new MockFile(); - EXPECT_CALL(file_system, Open(file_path, wvutil::FileSystem::kCreate | - wvutil::FileSystem::kTruncate)) - .WillOnce(Return(ByMove(std::unique_ptr(file_out)))); - EXPECT_CALL(*file_out, Write(StrEq(kHashedUsageInfoFileWithKeySet1), _)) - .After(read_original) - .WillOnce(Return(kHashedUsageInfoFileWithKeySet1.size())); - - const std::vector to_remove = {"key_set_id_2"}; - EXPECT_TRUE(device_files.DeleteMultipleUsageInfoByKeySetIds( - kUsageInfoFileName, to_remove)); -} - -// There are a few error cases where DeleteMultipleUsageInfoByKeySetIds() -// will fail. Such as if the specified file does not exist, or if it -// the file is found to have a hash mismatch. In both these cases, -// false should be returned. -TEST_F(DeviceFilesDeleteMultipleUsageInfoTest, BadFile) { - static const std::string kUsageInfoFileName = "usage_info_file.bin"; - static const std::string kHashlessUsageInfoFile = a2bs_hex( - "0A36080310012A300A0E220C6B65795F7365745F69645F310A0E220C6B65795F" - "7365745F69645F320A0E220C6B65795F7365745F69645F331220000000000000" - "0000000000000000000000000000000000000000000000000000"); - // Setup - MockFileSystem file_system; - DeviceFiles device_files(&file_system); - EXPECT_TRUE(device_files.Init(kSecurityLevelL1)); - std::string file_path; - ASSERT_TRUE(Properties::GetDeviceFilesBasePath(kSecurityLevelL1, &file_path)); - file_path += kUsageInfoFileName; - - // File does not exist. - EXPECT_CALL(file_system, Exists(_)).WillRepeatedly(Return(false)); - EXPECT_FALSE(device_files.DeleteMultipleUsageInfoByKeySetIds( - kUsageInfoFileName, kHashedUsageInfoFileKeySetList)); - - // File is missing hash. - MockFile* file_in = new MockFile(); - EXPECT_CALL(file_system, Exists(_)).WillRepeatedly(Return(true)); - EXPECT_CALL(file_system, FileSize(file_path)) - .WillOnce(Return(kHashlessUsageInfoFile.size())); - EXPECT_CALL(file_system, Open(file_path, wvutil::FileSystem::kReadOnly)) - .WillOnce(Return(ByMove(std::unique_ptr(file_in)))); - EXPECT_CALL(*file_in, Read(NotNull(), _)) - .WillOnce(DoAll(SetArrayArgument<0>(kHashlessUsageInfoFile.cbegin(), - kHashlessUsageInfoFile.cend()), - Return(kHashlessUsageInfoFile.size()))); - - EXPECT_CALL(file_system, Remove(file_path)).WillOnce(Return(true)); - // Remove all sessions, and the file should be deleted. - EXPECT_FALSE(device_files.DeleteMultipleUsageInfoByKeySetIds( - kUsageInfoFileName, kHashedUsageInfoFileKeySetList)); -} - -TEST_F(DeviceFilesUsageInfoTest, ListNullParam) { - MockFileSystem file_system; - - DeviceFiles device_files(&file_system); - EXPECT_TRUE(device_files.Init(kSecurityLevelL1)); - EXPECT_FALSE(device_files.ListUsageInfoFiles(nullptr)); -} - -TEST_F(DeviceFilesUsageInfoTest, ListIdsNull) { - MockFileSystem file_system; - - 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)); -} - -TEST_F(DeviceFilesUsageInfoTest, ListUsageIds) { - MockFileSystem file_system; - - int index = 8; - 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; - if (index >= 0) { - // Call to Open will return a unique_ptr, freeing this object. - MockFile* file = new MockFile(); - EXPECT_CALL(file_system, Exists(StrEq(path))) - .Times(2) - .WillRepeatedly(Return(true)); - EXPECT_CALL(file_system, FileSize(StrEq(path))) - .Times(2) - .WillRepeatedly(Return(kUsageInfoTestData[index].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()))) - .WillOnce(DoAll(SetArrayArgument<0>(file_data.begin(), file_data.end()), - Return(file_data.size()))); - } else { - EXPECT_CALL(file_system, Exists(StrEq(path))).WillOnce(Return(false)); - } - - DeviceFiles device_files(&file_system); - EXPECT_TRUE(device_files.Init(kSecurityLevelL1)); - - std::vector key_set_ids; - std::vector provider_session_tokens; - 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; - } - } - EXPECT_TRUE(found); - } - } -} - -TEST_P(DeviceFilesUsageInfoListTest, UsageInfoList) { - MockFileSystem file_system; - - int index = GetParam(); std::vector file_list; std::vector expected_usage_file_list; - for (int i = 0; i <= index; ++i) { - file_list.push_back(kTestListUsageInfoData[i].file_name); - if (kTestListUsageInfoData[i].is_usage_info_file) - expected_usage_file_list.push_back(kTestListUsageInfoData[i].file_name); + for (const auto& pair : kDeviceFiles) { + file_list.push_back(pair.file_name); + if (pair.is_usage_info_file) + expected_usage_file_list.push_back(pair.file_name); } + MockFileSystem file_system; EXPECT_CALL(file_system, List(StrEq(device_base_path_), NotNull())) .WillOnce(DoAll(SetArgPointee<1>(file_list), Return(true))); @@ -5308,378 +4297,6 @@ TEST_P(DeviceFilesUsageInfoListTest, UsageInfoList) { ::testing::UnorderedElementsAreArray(expected_usage_file_list)); } -INSTANTIATE_TEST_SUITE_P(UsageInfo, DeviceFilesUsageInfoListTest, - ::testing::Range(0, 7)); - -TEST_P(DeviceFilesUsageInfoTest, Store) { - MockFileSystem file_system; - // 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; - - 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()); - } - } - - EXPECT_CALL(file_system, Open(StrEq(path), _)) - .WillOnce(Return(ByMove(std::unique_ptr(file)))); - EXPECT_CALL(*file, Write(_, _)) - .With(AllArgs(StrAndLenContains(usage_data_fields))) - .WillOnce(ReturnArg<1>()); - - DeviceFiles device_files(&file_system); - EXPECT_TRUE(device_files.Init(kSecurityLevelL1)); - - EXPECT_TRUE(device_files.StoreUsageInfo(file_name, usage_data_list)); -} - -TEST_P(DeviceFilesUsageInfoTest, Retrieve) { - MockFileSystem file_system; - - 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; - if (index >= 0) { - // Call to Open will return a unique_ptr, freeing this object. - MockFile* file = new MockFile(); - EXPECT_CALL(file_system, Exists(StrEq(path))) - .Times(2) - .WillRepeatedly(Return(true)); - EXPECT_CALL(file_system, FileSize(StrEq(path))) - .Times(2) - .WillRepeatedly(Return(kUsageInfoTestData[index].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()))) - .WillOnce(DoAll(SetArrayArgument<0>(file_data.begin(), file_data.end()), - Return(file_data.size()))); - } else { - EXPECT_CALL(file_system, Exists(StrEq(path))).WillOnce(Return(false)); - } - - std::vector usage_data_list; - DeviceFiles device_files(&file_system); - EXPECT_TRUE(device_files.Init(kSecurityLevelL1)); - - EXPECT_TRUE(device_files.RetrieveUsageInfo(file_name, &usage_data_list)); - - for (size_t i = 0; i < usage_data_list.size(); ++i) { - 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_number, - usage_data_list[i].usage_entry_number); - 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; - } - EXPECT_TRUE(found); - } -} - -TEST_P(DeviceFilesUsageInfoTest, ListKeySetIds) { - MockFileSystem file_system; - - 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; - if (index >= 0) { - // Call to Open will return a unique_ptr, freeing this object. - MockFile* file = new MockFile(); - EXPECT_CALL(file_system, Exists(StrEq(path))) - .Times(2) - .WillRepeatedly(Return(true)); - EXPECT_CALL(file_system, FileSize(StrEq(path))) - .Times(2) - .WillRepeatedly(Return(kUsageInfoTestData[index].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()))) - .WillOnce(DoAll(SetArrayArgument<0>(file_data.begin(), file_data.end()), - Return(file_data.size()))); - } else { - EXPECT_CALL(file_system, Exists(StrEq(path))).WillOnce(Return(false)); - } - - DeviceFiles device_files(&file_system); - EXPECT_TRUE(device_files.Init(kSecurityLevelL1)); - - 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; - } - } - EXPECT_TRUE(found); - } - } -} - -TEST_P(DeviceFilesUsageInfoTest, ListProviderSessionTokenIds) { - MockFileSystem file_system; - - 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; - if (index >= 0) { - // Call to Open will return a unique_ptr, freeing this object. - MockFile* file = new MockFile(); - EXPECT_CALL(file_system, Exists(StrEq(path))) - .Times(2) - .WillRepeatedly(Return(true)); - EXPECT_CALL(file_system, FileSize(StrEq(path))) - .Times(2) - .WillRepeatedly(Return(kUsageInfoTestData[index].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()))) - .WillOnce(DoAll(SetArrayArgument<0>(file_data.begin(), file_data.end()), - Return(file_data.size()))); - } else { - EXPECT_CALL(file_system, Exists(StrEq(path))).WillOnce(Return(false)); - } - - DeviceFiles device_files(&file_system); - EXPECT_TRUE(device_files.Init(kSecurityLevelL1)); - - std::vector provider_session_tokens; - 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; - } - } - EXPECT_TRUE(found); - } - } -} - -TEST_P(DeviceFilesUsageInfoTest, RetrieveByProviderSessionToken) { - MockFileSystem file_system; - // 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; - - 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 = - (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))).WillOnce(Return(true)); - EXPECT_CALL(file_system, FileSize(StrEq(path))) - .WillOnce(Return(file_data.size())); - EXPECT_CALL(file_system, Open(StrEq(path), _)) - .WillOnce(Return(ByMove(std::unique_ptr(file)))); - EXPECT_CALL(*file, Read(NotNull(), Eq(file_data.size()))) - .WillOnce(DoAll(SetArrayArgument<0>(file_data.begin(), file_data.end()), - Return(file_data.size()))); - - DeviceFiles device_files(&file_system); - EXPECT_TRUE(device_files.Init(kSecurityLevelL1)); - - DeviceFiles::CdmUsageData usage_data; - - if (index < 0) { - EXPECT_FALSE(device_files.RetrieveUsageInfo( - file_name, provider_session_token, &usage_data)); - } else { - EXPECT_TRUE(device_files.RetrieveUsageInfo( - file_name, provider_session_token, &usage_data)); - - EXPECT_EQ(kUsageInfoTestData[index].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_number, - usage_data.usage_entry_number); - } -} - -TEST_P(DeviceFilesUsageInfoTest, UpdateUsageInfo) { - MockFileSystem file_system; - // 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; - - 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 (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); - } - - 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) - .WillRepeatedly(Return(true)); - EXPECT_CALL(file_system, FileSize(StrEq(path))) - .WillOnce(Return(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()))); - - bool write_called = false; - if (index < 0) { - EXPECT_CALL(file_system, Open(StrEq(path), _)) - .WillOnce(Return(ByMove(std::unique_ptr(file)))); - } else { - MockFile* next_file = new MockFile(); - EXPECT_CALL(file_system, Open(StrEq(path), _)) - .Times(2) - .WillOnce(Return(ByMove(std::unique_ptr(file)))) - .WillOnce(Return(ByMove(std::unique_ptr(next_file)))); - ON_CALL(*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>())); - } - - 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); -} - -INSTANTIATE_TEST_SUITE_P(UsageInfo, DeviceFilesUsageInfoTest, - ::testing::Range(-1, 9)); - TEST_P(DeviceFilesHlsAttributesTest, Read) { MockFileSystem file_system; // Call to Open will return a unique_ptr, freeing this object.