From 4af7ac78a3f452e896abd2ce570abac6525eaa47 Mon Sep 17 00:00:00 2001 From: Jeff Tinker Date: Fri, 30 May 2014 15:21:41 -0700 Subject: [PATCH] Fix offline test failures GPlay offline tests were failing due to additional query parameters that were introduced with b12789275. Additional changes caused offline failures, as the content pointed to by the test vectors was HD only and did not allow for offline playback. This addresses the problem by switching request license tests to point to UAT. UAT is now the default license server destination for request license tests. Test vectors for GPlay will be added back as a secondary option when they are available. b/13909635 Merge of https://widevine-internal-review.googlesource.com/#/c/10261/ from the widevine cdm repo. Change-Id: I5e5a2b477b6d591747123e8eeb3cd00b7f762090 --- .../cdm/core/test/config_test_env.cpp | 78 +- .../cdm/core/test/config_test_env.h | 6 + .../cdm/test/request_license_test.cpp | 921 ++++++++++-------- libwvdrmengine/run_all_unit_tests.sh | 3 - 4 files changed, 559 insertions(+), 449 deletions(-) diff --git a/libwvdrmengine/cdm/core/test/config_test_env.cpp b/libwvdrmengine/cdm/core/test/config_test_env.cpp index 704947a3..ad4fb9ce 100644 --- a/libwvdrmengine/cdm/core/test/config_test_env.cpp +++ b/libwvdrmengine/cdm/core/test/config_test_env.cpp @@ -3,14 +3,23 @@ #include "config_test_env.h" namespace { +const std::string kWidevineKeySystem = "com.widevine.alpha"; + // Youtube Content Protection license server data const std::string kYtCpLicenseServer = "http://wv-ref-eme-player.appspot.com/proxy"; const std::string kYtCpClientAuth = ""; const std::string kYtCpKeyId = - "000000347073736800000000" // blob size and pssh - "EDEF8BA979D64ACEA3C827DCD51D21ED00000014" // Widevine system id - "0801121030313233343536373839616263646566"; // pssh data + "000000427073736800000000" // blob size and pssh + "EDEF8BA979D64ACEA3C827DCD51D21ED00000022" // Widevine system id + "08011a0d7769646576696e655f7465737422" // pssh data (streaming) + "0f73747265616d696e675f636c697031"; + +const std::string kYtCpOfflineKeyId = + "000000407073736800000000" // blob size and pssh + "EDEF8BA979D64ACEA3C827DCD51D21ED00000020" // Widevine system id + "08011a0d7769646576696e655f7465737422" //pssh data (offline) + "0d6f66666c696e655f636c697031"; // Youtube license server data const std::string kYtLicenseServer = @@ -33,6 +42,13 @@ const std::string kGpLicenseServer = const std::string kGpClientAuth = "?source=YOUTUBE&video_id=EGHC6OHNbOo&oauth=ya.gtsqawidevine"; +const std::string kGpClientOfflineQueryParameters = + "&offline=true"; +const std::string kGpClientOfflineRenewalQueryParameters = + "&offline=true&renewal=true"; +const std::string kGpClientOfflineReleaseQueryParameters = + "&offline=true&release=true"; + const std::string kGpKeyId = "000000347073736800000000" // blob size and pssh "edef8ba979d64acea3c827dcd51d21ed00000014" // Widevine system id @@ -55,24 +71,54 @@ const std::string kServerSdkLicenseServer = const wvcdm::ConfigTestEnv::LicenseServerConfiguration license_servers[] = { { wvcdm::kGooglePlayServer, kGpLicenseServer, kGpClientAuth, kGpKeyId, - kDefaultHttpsPort, true, true }, + kGpKeyId, kDefaultHttpsPort, true, true }, { wvcdm::kYouTubeContentProtectionServer, kYtCpLicenseServer, - kYtCpClientAuth, kYtCpKeyId, kDefaultHttpPort, false, false } + kYtCpClientAuth, kYtCpKeyId, kYtCpOfflineKeyId, kDefaultHttpPort, + false, false } }; } // namespace namespace wvcdm { -ConfigTestEnv::ConfigTestEnv(LicenseServerId server_id) - : client_auth_(license_servers[server_id].client_tag), - key_id_(license_servers[server_id].key_id), - key_system_("com.widevine.alpha"), - license_server_(license_servers[server_id].url), - port_(license_servers[server_id].port), - provisioning_server_url_(kProductionProvisioningServerUrl), - server_sdk_license_server_(kServerSdkLicenseServer), - use_chunked_transfer_(license_servers[server_id].use_chunked_transfer), - use_secure_transfer_(license_servers[server_id].use_secure_transfer), - wrong_key_id_(kWrongKeyId) {} +ConfigTestEnv::ConfigTestEnv(LicenseServerId server_id) { + Init(server_id); +} + +ConfigTestEnv::ConfigTestEnv(LicenseServerId server_id, bool streaming) { + Init(server_id); + if (!streaming) + key_id_ = license_servers[server_id].offline_key_id; +} + +ConfigTestEnv::ConfigTestEnv(LicenseServerId server_id, bool streaming, + bool renew, bool release) { + Init(server_id); + if (!streaming) { + key_id_ = license_servers[server_id].offline_key_id; + + if (wvcdm::kGooglePlayServer == server_id) { + if (renew) { + client_auth_.append(kGpClientOfflineRenewalQueryParameters); + } else if (release) { + client_auth_.append(kGpClientOfflineReleaseQueryParameters); + } else { + client_auth_.append(kGpClientOfflineQueryParameters); + } + } + } +} + +void ConfigTestEnv::Init(LicenseServerId server_id) { + client_auth_ = license_servers[server_id].client_tag; + key_id_ = license_servers[server_id].key_id; + key_system_ = kWidevineKeySystem; + license_server_ = license_servers[server_id].url; + port_ = license_servers[server_id].port; + provisioning_server_url_ = kProductionProvisioningServerUrl; + server_sdk_license_server_ = kServerSdkLicenseServer; + use_chunked_transfer_ = license_servers[server_id].use_chunked_transfer; + use_secure_transfer_ = license_servers[server_id].use_secure_transfer; + wrong_key_id_= kWrongKeyId; +} } // namespace wvcdm diff --git a/libwvdrmengine/cdm/core/test/config_test_env.h b/libwvdrmengine/cdm/core/test/config_test_env.h index 46ce80fe..1109885d 100644 --- a/libwvdrmengine/cdm/core/test/config_test_env.h +++ b/libwvdrmengine/cdm/core/test/config_test_env.h @@ -25,12 +25,16 @@ class ConfigTestEnv { std::string url; std::string client_tag; std::string key_id; + std::string offline_key_id; std::string port; bool use_chunked_transfer; bool use_secure_transfer; } LicenseServerConfiguration; explicit ConfigTestEnv(LicenseServerId server_id); + ConfigTestEnv(LicenseServerId server_id, bool streaming); + ConfigTestEnv(LicenseServerId server_id, bool streaming, bool renew, + bool release); ~ConfigTestEnv() {}; const std::string& client_auth() const { return client_auth_; } @@ -58,6 +62,8 @@ class ConfigTestEnv { void set_port(std::string& port) { port_.assign(port); } private: + void Init(LicenseServerId server_id); + std::string client_auth_; KeyId key_id_; CdmKeySystem key_system_; diff --git a/libwvdrmengine/cdm/test/request_license_test.cpp b/libwvdrmengine/cdm/test/request_license_test.cpp index 695eb353..e0d87674 100644 --- a/libwvdrmengine/cdm/test/request_license_test.cpp +++ b/libwvdrmengine/cdm/test/request_license_test.cpp @@ -21,8 +21,11 @@ namespace { const char kPathDelimiter = '/'; -// Http OK response code. + +// HTTP response codes. const int kHttpOk = 200; +const int kHttpBadRequest = 400; +const int kHttpInternalServerError = 500; // Default license server, can be configured using --server command line option // Default key id (pssh), can be configured using --keyid command line option @@ -36,7 +39,8 @@ wvcdm::KeyId g_wrong_key_id; bool g_use_chunked_transfer = false; bool g_use_full_path = false; bool g_use_secure_transfer = false; -wvcdm::LicenseServerId g_license_server_id = wvcdm::kGooglePlayServer; +wvcdm::LicenseServerId g_license_server_id = + wvcdm::kYouTubeContentProtectionServer; std::string kServiceCertificate = "0803121028703454C008F63618ADE7443DB6C4C8188BE7F99005228E023082010" @@ -62,157 +66,166 @@ struct SubSampleInfo { std::vector decrypt_data; std::vector iv; size_t block_offset; + uint8_t subsample_flags; }; SubSampleInfo clear_sub_sample = { true, 1, true, false, false, - wvcdm::a2bs_hex("E02562E04CD55351B14B3D748D36ED8E"), + wvcdm::a2bs_hex("371EA35E1A985D75D198A7F41020DC23"), wvcdm::a2b_hex( - "9da401105ab8da443e93e6fe089dfc69e00a9a51690d406872f338c5fa7dd3d5" - "abf8dfd660aaff3e327850a56eedf707c03e2d1a00f9f0371e3e19ea32b13267" - "7bc083ccbb83e6d9c03794ee97f50081221a8e5eb123f6dfa895e7a971166483" - "cdadd61cd8d0f859501e750e9d356d57252ecd9f7388459f5470de9d92198c44" - "0b520055b3b9a1c6b2c9d21e78dce99622d9d031fc7dee28a6d1d6dfb81502eb" - "463c4c189555f496d9aa529b3f5522e9f46dcf70b2bfe8df47daf02b6a267f93" - "f80d871786eb4bd7f08f9c52079c034a9534d885ba4c00cbe2234cfbb5205a56" - "41dd760f83d0f09f27881ad490efa8b99b7ab24b34311a2e8416b1a80d736ad7"), + "217ce9bde99bd91e9733a1a00b9b557ac3a433dc92633546156817fae26b6e1c" + "942ac20a89ff79f4c2f25fba99d6a44618a8c0420b27d54e3da17b77c9d43cca" + "595d259a1e4a8b6d7744cd98c5d3f921adc252eb7d8af6b916044b676a574747" + "8df21fdc42f166880d97a2225cd5c9ea5e7b752f4cf81bbdbe98e542ee10e1c6" + "ad868a6ac55c10d564fc23b8acff407daaf4ed2743520e02cda9680d9ea88e91" + "029359c4cf5906b6ab5bf60fbb3f1a1c7c59acfc7e4fb4ad8e623c04d503a3dd" + "4884604c8da8a53ce33db9ff8f1c5bb6bb97f37b39906bf41596555c1bcce9ed" + "08a899cd760ff0899a1170c2f224b9c52997a0785b7fe170805fd3e8b1127659"), wvcdm::a2b_hex( - "9da401105ab8da443e93e6fe089dfc69e00a9a51690d406872f338c5fa7dd3d5" - "abf8dfd660aaff3e327850a56eedf707c03e2d1a00f9f0371e3e19ea32b13267" - "7bc083ccbb83e6d9c03794ee97f50081221a8e5eb123f6dfa895e7a971166483" - "cdadd61cd8d0f859501e750e9d356d57252ecd9f7388459f5470de9d92198c44" - "0b520055b3b9a1c6b2c9d21e78dce99622d9d031fc7dee28a6d1d6dfb81502eb" - "463c4c189555f496d9aa529b3f5522e9f46dcf70b2bfe8df47daf02b6a267f93" - "f80d871786eb4bd7f08f9c52079c034a9534d885ba4c00cbe2234cfbb5205a56" - "41dd760f83d0f09f27881ad490efa8b99b7ab24b34311a2e8416b1a80d736ad7"), - wvcdm::a2b_hex("50a6c61c3f7c2b37e72b0c047000dd4a"), 0}; + "217ce9bde99bd91e9733a1a00b9b557ac3a433dc92633546156817fae26b6e1c" + "942ac20a89ff79f4c2f25fba99d6a44618a8c0420b27d54e3da17b77c9d43cca" + "595d259a1e4a8b6d7744cd98c5d3f921adc252eb7d8af6b916044b676a574747" + "8df21fdc42f166880d97a2225cd5c9ea5e7b752f4cf81bbdbe98e542ee10e1c6" + "ad868a6ac55c10d564fc23b8acff407daaf4ed2743520e02cda9680d9ea88e91" + "029359c4cf5906b6ab5bf60fbb3f1a1c7c59acfc7e4fb4ad8e623c04d503a3dd" + "4884604c8da8a53ce33db9ff8f1c5bb6bb97f37b39906bf41596555c1bcce9ed" + "08a899cd760ff0899a1170c2f224b9c52997a0785b7fe170805fd3e8b1127659"), + wvcdm::a2b_hex("f6f4b1e600a5b67813ed2bded913ba9f"), 0, 3}; SubSampleInfo clear_sub_sample_no_key = { false, 1, false, false, false, wvcdm::a2bs_hex("77777777777777777777777777777777"), wvcdm::a2b_hex( - "9da401105ab8da443e93e6fe089dfc69e00a9a51690d406872f338c5fa7dd3d5" - "abf8dfd660aaff3e327850a56eedf707c03e2d1a00f9f0371e3e19ea32b13267" - "7bc083ccbb83e6d9c03794ee97f50081221a8e5eb123f6dfa895e7a971166483" - "cdadd61cd8d0f859501e750e9d356d57252ecd9f7388459f5470de9d92198c44" - "0b520055b3b9a1c6b2c9d21e78dce99622d9d031fc7dee28a6d1d6dfb81502eb" - "463c4c189555f496d9aa529b3f5522e9f46dcf70b2bfe8df47daf02b6a267f93" - "f80d871786eb4bd7f08f9c52079c034a9534d885ba4c00cbe2234cfbb5205a56" - "41dd760f83d0f09f27881ad490efa8b99b7ab24b34311a2e8416b1a80d736ad7"), + "217ce9bde99bd91e9733a1a00b9b557ac3a433dc92633546156817fae26b6e1c" + "942ac20a89ff79f4c2f25fba99d6a44618a8c0420b27d54e3da17b77c9d43cca" + "595d259a1e4a8b6d7744cd98c5d3f921adc252eb7d8af6b916044b676a574747" + "8df21fdc42f166880d97a2225cd5c9ea5e7b752f4cf81bbdbe98e542ee10e1c6" + "ad868a6ac55c10d564fc23b8acff407daaf4ed2743520e02cda9680d9ea88e91" + "029359c4cf5906b6ab5bf60fbb3f1a1c7c59acfc7e4fb4ad8e623c04d503a3dd" + "4884604c8da8a53ce33db9ff8f1c5bb6bb97f37b39906bf41596555c1bcce9ed" + "08a899cd760ff0899a1170c2f224b9c52997a0785b7fe170805fd3e8b1127659"), wvcdm::a2b_hex( - "9da401105ab8da443e93e6fe089dfc69e00a9a51690d406872f338c5fa7dd3d5" - "abf8dfd660aaff3e327850a56eedf707c03e2d1a00f9f0371e3e19ea32b13267" - "7bc083ccbb83e6d9c03794ee97f50081221a8e5eb123f6dfa895e7a971166483" - "cdadd61cd8d0f859501e750e9d356d57252ecd9f7388459f5470de9d92198c44" - "0b520055b3b9a1c6b2c9d21e78dce99622d9d031fc7dee28a6d1d6dfb81502eb" - "463c4c189555f496d9aa529b3f5522e9f46dcf70b2bfe8df47daf02b6a267f93" - "f80d871786eb4bd7f08f9c52079c034a9534d885ba4c00cbe2234cfbb5205a56" - "41dd760f83d0f09f27881ad490efa8b99b7ab24b34311a2e8416b1a80d736ad7"), - wvcdm::a2b_hex("50a6c61c3f7c2b37e72b0c047000dd4a"), 0}; + "217ce9bde99bd91e9733a1a00b9b557ac3a433dc92633546156817fae26b6e1c" + "942ac20a89ff79f4c2f25fba99d6a44618a8c0420b27d54e3da17b77c9d43cca" + "595d259a1e4a8b6d7744cd98c5d3f921adc252eb7d8af6b916044b676a574747" + "8df21fdc42f166880d97a2225cd5c9ea5e7b752f4cf81bbdbe98e542ee10e1c6" + "ad868a6ac55c10d564fc23b8acff407daaf4ed2743520e02cda9680d9ea88e91" + "029359c4cf5906b6ab5bf60fbb3f1a1c7c59acfc7e4fb4ad8e623c04d503a3dd" + "4884604c8da8a53ce33db9ff8f1c5bb6bb97f37b39906bf41596555c1bcce9ed" + "08a899cd760ff0899a1170c2f224b9c52997a0785b7fe170805fd3e8b1127659"), + wvcdm::a2b_hex("f6f4b1e600a5b67813ed2bded913ba9f"), 0, 3}; SubSampleInfo single_encrypted_sub_sample = { - // key 1, encrypted, 256b + // key SD, encrypted, 256b true, 1, true, true, false, - wvcdm::a2bs_hex("E02562E04CD55351B14B3D748D36ED8E"), + wvcdm::a2bs_hex("371EA35E1A985D75D198A7F41020DC23"), wvcdm::a2b_hex( - "3b2cbde084973539329bd5656da22d20396249bf4a18a51c38c4743360cc9fea" - "a1c78d53de1bd7e14dc5d256fd20a57178a98b83804258c239acd7aa38f2d7d2" - "eca614965b3d22049e19e236fc1800e60965d8b36415677bf2f843d50a6943c4" - "683c07c114a32f5e5fbc9939c483c3a1b2ecd3d82b554d649798866191724283" - "f0ab082eba2da79aaca5c4eaf186f9ee9a0c568f621f705a578f30e4e2ef7b96" - "5e14cc046ce6dbf272ee5558b098f332333e95fc879dea6c29bf34acdb649650" - "f08201b9e649960f2493fd7677cc3abf5ae70e5445845c947ba544456b431646" - "d95a133bff5f57614dda5e4446cd8837901d074149dadf4b775b5b07bb88ca20"), + "64ab17b3e3dfab47245c7cce4543d4fc7a26dcf248f19f9b59f3c92601440b36" + "17c8ed0c96c656549e461f38708cd47a434066f8df28ccc28b79252eee3f9c2d" + "7f6c68ebe40141fe818fe082ca523c03d69ddaf183a93c022327fedc5582c5ab" + "ca9d342b71263a67f9cb2336f12108aaaef464f17177e44e9b0c4e56e61da53c" + "2150b4405cc82d994dfd9bf4087c761956d6688a9705db4cf350381085f383c4" + "9666d4aed135c519c1f0b5cba06e287feea96ea367bf54e7368dcf998276c6e4" + "6497e0c50e20fef74e42cb518fe7f22ef27202428688f86404e8278587017012" + "c1d65537c6cbd7dde04aae338d68115a9f430afc100ab83cdadf45dca39db685"), wvcdm::a2b_hex( - "5a36c0b633b58faf22156d78fdfb608e54a8095788b2b0463ef78d030b4abf82" - "eff34b8d9b7b6352e7d72de991b599662aa475da355033620152e2356ebfadee" - "06172be9e1058fa177e223b9fdd191380cff53c3ea810c6fd852a1df4967b799" - "415179a2276ec388ef763bab89605b9c6952c28dc8d6bf86b03fabbb46b392a3" - "1dad15be602eeeeabb45070b3e25d6bb0217073b1fc44c9fe848594121fd6a91" - "304d605e21f69615e1b57db18312b6b948725724b74e91d8aea7371e99532469" - "1b358bdee873f1936b63efe83d190a53c2d21754d302d63ff285174023473755" - "58b938c2e3ca4c2ce48942da97f9e45797f2c074ac6004734e93784a48af6160"), - wvcdm::a2b_hex("4cca615fc013102892f91efee936639b"), 0}; + "217ce9bde99bd91e9733a1a00b9b557ac3a433dc92633546156817fae26b6e1c" + "942ac20a89ff79f4c2f25fba99d6a44618a8c0420b27d54e3da17b77c9d43cca" + "595d259a1e4a8b6d7744cd98c5d3f921adc252eb7d8af6b916044b676a574747" + "8df21fdc42f166880d97a2225cd5c9ea5e7b752f4cf81bbdbe98e542ee10e1c6" + "ad868a6ac55c10d564fc23b8acff407daaf4ed2743520e02cda9680d9ea88e91" + "029359c4cf5906b6ab5bf60fbb3f1a1c7c59acfc7e4fb4ad8e623c04d503a3dd" + "4884604c8da8a53ce33db9ff8f1c5bb6bb97f37b39906bf41596555c1bcce9ed" + "08a899cd760ff0899a1170c2f224b9c52997a0785b7fe170805fd3e8b1127659"), + wvcdm::a2b_hex("f6f4b1e600a5b67813ed2bded913ba9f"), 0, 3}; -SubSampleInfo switch_key_encrypted_sub_sample[2] = { - // block 0, key 1, encrypted, 256b +SubSampleInfo switch_key_encrypted_sub_samples[2] = { + // block 0, key SD, encrypted, 256b {true, 2, true, true, false, - wvcdm::a2bs_hex("E02562E04CD55351B14B3D748D36ED8E"), + wvcdm::a2bs_hex("371EA35E1A985D75D198A7F41020DC23"), wvcdm::a2b_hex( - "3b2cbde084973539329bd5656da22d20396249bf4a18a51c38c4743360cc9fea" - "a1c78d53de1bd7e14dc5d256fd20a57178a98b83804258c239acd7aa38f2d7d2" - "eca614965b3d22049e19e236fc1800e60965d8b36415677bf2f843d50a6943c4" - "683c07c114a32f5e5fbc9939c483c3a1b2ecd3d82b554d649798866191724283" - "f0ab082eba2da79aaca5c4eaf186f9ee9a0c568f621f705a578f30e4e2ef7b96" - "5e14cc046ce6dbf272ee5558b098f332333e95fc879dea6c29bf34acdb649650" - "f08201b9e649960f2493fd7677cc3abf5ae70e5445845c947ba544456b431646" - "d95a133bff5f57614dda5e4446cd8837901d074149dadf4b775b5b07bb88ca20"), + "9efe1b7a3973324525e9b8c516855e554b52a73ce35cd181731b005a6525624f" + "a03875c89aee02f1da7f556b7e7d9a3eba89fe3061194bc2d1446233ca022892" + "ab95083f127d6ccb01b1368e6b6fa77e3570d84477a5517f2965ff72f8e0740c" + "d8282c22e7724ce44d88526dcd2d601002b717d8ca3b97087d28f9e3810efb8e" + "d4b08ee2da6bdb05a790b6363f8ee65cae8328e86848e4caf9be92db3e5492ad" + "6363a26051c23cf23b9aee79a8002470c4a5834c6aae956b509a42f4110262e0" + "565a043befd8ef3a335c9dfedca8d218f364215859d7daf7d040b1f0cb2eda87" + "c1be18f323fb0235dd9a6e7b3b2fea1cb9c6e5bc2b349962f0b8f0b92e749db2"), wvcdm::a2b_hex( - "5a36c0b633b58faf22156d78fdfb608e54a8095788b2b0463ef78d030b4abf82" - "eff34b8d9b7b6352e7d72de991b599662aa475da355033620152e2356ebfadee" - "06172be9e1058fa177e223b9fdd191380cff53c3ea810c6fd852a1df4967b799" - "415179a2276ec388ef763bab89605b9c6952c28dc8d6bf86b03fabbb46b392a3" - "1dad15be602eeeeabb45070b3e25d6bb0217073b1fc44c9fe848594121fd6a91" - "304d605e21f69615e1b57db18312b6b948725724b74e91d8aea7371e99532469" - "1b358bdee873f1936b63efe83d190a53c2d21754d302d63ff285174023473755" - "58b938c2e3ca4c2ce48942da97f9e45797f2c074ac6004734e93784a48af6160"), - wvcdm::a2b_hex("4cca615fc013102892f91efee936639b"), 0}, - // block 1, key 3, encrypted, 256b + "38a715e73c9209544c47e5eb089146de8136df5c6ed01e3e8d9cea8ae18a81c9" + "8c9c8ec67bf379dd80a21f57b0b00575827a240cd11332c5212defe9f1ef8b8e" + "2399271767bfe81e5a11abf7bca1307578217c4d5f8b942ab04351b4725d6e24" + "cd171fa3083570f7d7ae2b297224f701fd04d699c12c53e9ce9d3dab64ee6332" + "5fba183b7a1f3f20acaeabc0c446c9ca0df39fafb1e2891c72500741ad5b7941" + "4651729e30e9ddbb22f47a5026e09c795ff15a858123a7979e7be716cb8cd075" + "e8bfb91bc0cc83f7cacd5c4772f7479a1193d9307bc5f837185faed5499e66a7" + "e27db50b5d018d022279032016862883befd113b6c784889be8f9e6eb0f335f7"), + wvcdm::a2b_hex("fd38d7f754a97128b78440433e1ef4a8"), 0, 3}, + // block 1, key HD, encrypted, 256b {true, 2, true, true, false, - wvcdm::a2bs_hex("0065901A64A25899A5193664ABF9AF62"), + wvcdm::a2bs_hex("6D665122C01767FC087F340E6C335EA4"), wvcdm::a2b_hex( - "337f294addb4c16d1015fd839e80314472432eda503bd0529422318bec7d2b34" - "2b28d24b2c0bf999fd31711901a2b90e03373cb9553ffd4b2e6e655b80a39fe8" - "61718220948f0031a37fe277f943409d09c83ff1c19fe8d601f5b4d139821750" - "47170006db5f38cb84706a9beeaa455fca3b17d8de90c143eb36aaaac3f4670a" - "7194064f4d59996c95992a3e6a848d4da8adddae3ad03c8d28110fda3e5c1d0a" - "35d175c816481275a02d2da96c7fc313864ae076f03887309cdf00ca856bad28" - "2146141964b7f7972e9b253b1fbed6d74ffedcfc51bb91fa78a602479b0b757f" - "53a16cca15c381a4eab3034ee38e12280982d575fe3de23dd65cf8ba240daa88"), + "d9392411d15f47de0d7dd854eae5eb5ffbd2d3f86c530d2ef619fc81725df866" + "2e6267041b947863e5779812da3220824a3d154e7b094c1af70238c65877454e" + "3c3bdcce836962ba29b69442d5e5b4a4ff32a4b026521f3fa4d442a400081cdd" + "ba6ed313c43cc34443c4dc2b9cdcc9dbd478bf6afc4d515c07b42d8b151c15cc" + "165270f6083ecd5c75313c496143068f45966bb53e35906c7568424e93e35989" + "7da702fb89eb7c970af838d56a64a7a68f7cffe529807765d62540bb06bbc633" + "6eeec62d20f5b639731e57a0851e23e146cb9502dbde93dc4aca20e471a3fa0b" + "df01a74ecb48d5f57ac2be98fb21d19de7587d8d1e6e1788726e1544d05137f6"), wvcdm::a2b_hex( - "c397c1c9bc6782cd859e92f7158e3ff2a54ee984869582b942b400c22ebb6843" - "7c50f999f73831fa12040f6aab607f57280189ff1db1ab1d0046ffaa55ce1790" - "3baf0f9c983351b2ff15cc4f61f0f8db6922804e74a207e1e5baaeca67b427c7" - "2dd7883ee8232041a9c4e56ccfb8bdc3016602c73fa8944e734ee34c41cf1a17" - "b009b404fd924d23dfee1f494b5e374c9e87c2910de36826044bff89939a70d2" - "47ff1a8a0baa7643026b8d9442fda69dde6802816ddd4b6e3b18f0a95e788d6d" - "166ed7435ef663ef019b4438d3e203734eb95d68758e028f29cd623f35cde4bd" - "edfea33ade378a92a356020bcf3fbba01c9ab16ad448ce6ebe708f768c6676a7"), - wvcdm::a2b_hex("6d4ee851e563b951119cd33c52aadbf5"), 0}}; + "c48a94d07c34c4315e01010dbcc63a038d50a023b1ff2a07deae6e498cb03f84" + "57911d8c9d72fa5184c738d81a49999504b7cd4532b465436b7044606a6d40a2" + "74a653c4b93ebaf8db585d180211a02e5501a8027f2235fe56682390325c88ee" + "2ada85483eddb955c56f79634a2ceeb36d04b5d6faf7611817577d9b0fda088e" + "921fbdd7fa594ee4f557f7393f51f3049cd36973f645badf7cc4672ef8d973da" + "7dae8e59f32bf950c6569845a5261b5ed9cc500706eccf8d41f015b32026e16e" + "ab274465d880ff99a5eaea603eea66c7b0e6679bfd87145de0ec1a73ebfff092" + "866346a1d66db2923bca30664f417a6b66c07e91fb491be7872ebe5c9c2d03c2"), + wvcdm::a2b_hex("f56ab022666de858920e532f19bb32f6"), 0, 3}}; -SubSampleInfo partial_single_encrypted_sub_sample = { - // key 3, encrypted, 125b, offset 0 - true, 1, true, true, false, - wvcdm::a2bs_hex("0065901A64A25899A5193664ABF9AF62"), - wvcdm::a2b_hex( - "337f294addb4c16d1015fd839e80314472432eda503bd0529422318bec7d2b34" - "2b28d24b2c0bf999fd31711901a2b90e03373cb9553ffd4b2e6e655b80a39fe8" - "61718220948f0031a37fe277f943409d09c83ff1c19fe8d601f5b4d139821750" - "47170006db5f38cb84706a9beeaa455fca3b17d8de90c143eb36aaaac3"), - wvcdm::a2b_hex( - "c397c1c9bc6782cd859e92f7158e3ff2a54ee984869582b942b400c22ebb6843" - "7c50f999f73831fa12040f6aab607f57280189ff1db1ab1d0046ffaa55ce1790" - "3baf0f9c983351b2ff15cc4f61f0f8db6922804e74a207e1e5baaeca67b427c7" - "2dd7883ee8232041a9c4e56ccfb8bdc3016602c73fa8944e734ee34c41"), - wvcdm::a2b_hex("6d4ee851e563b951119cd33c52aadbf5"), 0}; +SubSampleInfo partial_encrypted_sub_samples[3] = { + // block 1, key SD, encrypted, 1-125b, offset 0 + {true, 3, true, true, false, + wvcdm::a2bs_hex("371EA35E1A985D75D198A7F41020DC23"), + wvcdm::a2b_hex( + "53cc758763904ea5870458e6b23d36db1e6d7f7aaa2f3eeebb5393a7264991e7" + "ce4f57b198326e1a208a821799b2a29c90567ab57321b06e51fc20dc9bc5fc55" + "10720a8bb1f5e002c3e50ff70d2d806a9432cad237050d09581f5b0d59b00090" + "b3ad69b4087f5a155b17e13c44d33fa007475d207fc4ac2ef3b571ecb9"), + wvcdm::a2b_hex( + "52e65334501acadf78e2b26460def3ac973771ed7c64001a2e82917342a7eab3" + "047f5e85449692fae8f677be425a47bdea850df5a3ffff17043afb1f2b437ab2" + "b1d5e0784c4ed8f97fc24b8f565e85ed63fb7d1365980d9aea7b8b58f488f83c" + "1ce80b6096c60f3b113c988ff185b26e798da8fc6f327e4ff00e4b3fbf"), + wvcdm::a2b_hex("6ba18dd40f49da7f64c368e4db43fc88"), 0, 1}, + // block 2, key SD, encrypted, 126-187b, offset 5 + {true, 3, true, true, false, + wvcdm::a2bs_hex("371EA35E1A985D75D198A7F41020DC23"), + wvcdm::a2b_hex( + "f3c852" + "ce00dc4806f0c6856ae1732e20308096478e1d822d75c2bb768119565d3bd6e6" + "901e36164f4802355ee758fc46ef6cf5f852dd5256c7b1e5f96d29"), + wvcdm::a2b_hex( + "b1ed0a" + "a054bce40ccb0ebc70b181d1a12055f46ac55e29c7c2473a29d2a366d240ec48" + "7cede274f012813a877f99159e7062b6a37cfc9327a7bc2195814e"), + wvcdm::a2b_hex("6ba18dd40f49da7f64c368e4db43fc8f"), 13, 0}, + // block 3, key SD, encrypted, 188-256b, offset 5 + {true, 3, true, true, false, + wvcdm::a2bs_hex("371EA35E1A985D75D198A7F41020DC23"), + wvcdm::a2b_hex( + "3b20525d5e" + "78b8e5aa344d5c4e425e67ddf889ea7c4bb1d49af67eba67718b765e0a940402" + "8d306f4ce693ad6dc0a931d507fa14fff4d293d4170280b3e0fca2d628f722e8"), + wvcdm::a2b_hex( + "653b818d1d" + "4ab9a9128361d8ca6a9d2766df5c096ee29f4f5204febdf217a94a5b560cd692" + "cc36d3e071df789fdeac2fb7ec6dcd7af94bb1f85c22025b25e702e38212b927"), + wvcdm::a2b_hex("6ba18dd40f49da7f64c368e4db43fc93"), 11, 2}}; -SubSampleInfo partial_offset_single_encrypted_sub_sample = { - // key 3, encrypted, 123b, offset 5 - true, 1, true, true, false, - wvcdm::a2bs_hex("0065901A64A25899A5193664ABF9AF62"), - wvcdm::a2b_hex( - "97f39b919ba56f3c3a51ecdcd7318bc130f054320c74db3990f925" - "054734c03ec79ee0da68938dc4f8c2d91e46ec2342ef24f9328294a9475f7ead" - "8ad3e71db62d6328e826e4ab375f4796aa2bc8b9266551e3007fb3c253780293" - "31fbc32ed29afcb9e7152cf072712c5a22c6b52d60e381eb53eeb58d36528746"), - wvcdm::a2b_hex( - "d36911b44f470ff05d152a7bc69ea6b68aa812cd3676964acb4597" - "b518fe4b7ec0fe44469b1e4f8806922af9ac998d3e23349cea0e68f833564c15" - "e49584f94ef16b7ab6cd2d0b152430f1fb4d7644a0f591980388ac02012d3d42" - "73d6c9604517b1a622b66b8f4e8414e40b00351cc9859061bde810190c7b5df8"), - wvcdm::a2b_hex("43ba341482212c70f79d81c0f4faef8a"), 5}; - -SubSampleInfo single_encrypted_sub_sample_icp = { +SubSampleInfo single_encrypted_sub_sample_short_expiry = { // key 1, encrypted, 256b true, 1, true, true, false, wvcdm::a2bs_hex("9714593E1EEE57859D34ECFA821702BB"), @@ -234,115 +247,114 @@ SubSampleInfo single_encrypted_sub_sample_icp = { "304d605e21f69615e1b57db18312b6b948725724b74e91d8aea7371e99532469" "1b358bdee873f1936b63efe83d190a53c2d21754d302d63ff285174023473755" "58b938c2e3ca4c2ce48942da97f9e45797f2c074ac6004734e93784a48af6160"), - wvcdm::a2b_hex("4cca615fc013102892f91efee936639b"), 0}; + wvcdm::a2b_hex("4cca615fc013102892f91efee936639b"), 0, 3}; SubSampleInfo usage_info_sub_samples_icp[] = { {true, 1, true, true, false, - wvcdm::a2bs_hex("E82DDD1D07CBB31CDD31EBAAE0894609"), - wvcdm::a2b_hex( - "fe8670a01c86906c056b4bf85ad278464c4eb79c60de1da8480e66e78561350e" - "a25ae19a001f834c43aaeadf900b3c5a6745e885a4d1d1ae5bafac08dc1d60e5" - "f3465da303909ec4b09023490471f670b615d77db844192854fdab52b7806203" - "89b374594bbb6a2f2fcc31036d7cb8a3f80c0e27637b58a7650028fbf2470d68" - "1bbd77934af165d215ef325c74438c9d99a20fc628792db28c05ed5deff7d9d4" - "dba02ddb6cf11dc6e78cb5200940af9a2321c3a7c4c79be67b54a744dae1209c" - "fa02fc250ce18d30c7da9c3a4a6c9619bf8561a42ff1e55a7b14fa3c8de69196" - "c2b8e3ff672fc37003b479da5d567b7199917dbe5aa402890ebb066bce140b33"), - wvcdm::a2b_hex( - "d08733bd0ef671f467906b50ff8322091400f86fd6f016fea2b86e33923775b3" - "ebb4c8c6f3ba8b78dd200a74d3872a40264ab99e1d422e4f819abb7f249114aa" - "b334420b37c86ce81938615ab9d3a6b2de8db545cd88e35091031e73016fb386" - "1b754298329b52dbe483de3a532277815e659f3e05e89257333225b933d92e15" - "ef2deff287a192d2c8fc942a29a5f3a1d54440ac6385de7b34bb650b889e4ae9" - "58c957b5f5ff268f445c0a6b825fcad55290cb7b5c9814bc4c72984dcf4c8fd7" - "5f511c173b2e0a3163b18a1eac58539e5c188aeb0751b946ad4dcd08ea777a7f" - "37326df26fa509343faa98dff667629f557873f1284903202e451227ef465a62"), - wvcdm::a2b_hex("7362b5140c4ce0cd5f863858668d3f1a"), 0}, + wvcdm::a2bs_hex("E82DDD1D07CBB31CDD31EBAAE0894609"), + wvcdm::a2b_hex( + "fe8670a01c86906c056b4bf85ad278464c4eb79c60de1da8480e66e78561350e" + "a25ae19a001f834c43aaeadf900b3c5a6745e885a4d1d1ae5bafac08dc1d60e5" + "f3465da303909ec4b09023490471f670b615d77db844192854fdab52b7806203" + "89b374594bbb6a2f2fcc31036d7cb8a3f80c0e27637b58a7650028fbf2470d68" + "1bbd77934af165d215ef325c74438c9d99a20fc628792db28c05ed5deff7d9d4" + "dba02ddb6cf11dc6e78cb5200940af9a2321c3a7c4c79be67b54a744dae1209c" + "fa02fc250ce18d30c7da9c3a4a6c9619bf8561a42ff1e55a7b14fa3c8de69196" + "c2b8e3ff672fc37003b479da5d567b7199917dbe5aa402890ebb066bce140b33"), + wvcdm::a2b_hex( + "d08733bd0ef671f467906b50ff8322091400f86fd6f016fea2b86e33923775b3" + "ebb4c8c6f3ba8b78dd200a74d3872a40264ab99e1d422e4f819abb7f249114aa" + "b334420b37c86ce81938615ab9d3a6b2de8db545cd88e35091031e73016fb386" + "1b754298329b52dbe483de3a532277815e659f3e05e89257333225b933d92e15" + "ef2deff287a192d2c8fc942a29a5f3a1d54440ac6385de7b34bb650b889e4ae9" + "58c957b5f5ff268f445c0a6b825fcad55290cb7b5c9814bc4c72984dcf4c8fd7" + "5f511c173b2e0a3163b18a1eac58539e5c188aeb0751b946ad4dcd08ea777a7f" + "37326df26fa509343faa98dff667629f557873f1284903202e451227ef465a62"), + wvcdm::a2b_hex("7362b5140c4ce0cd5f863858668d3f1a"), 0, 3}, {true, 1, true, true, false, - wvcdm::a2bs_hex("04B2B456405CAD7170BE848CA75AA2DF"), - wvcdm::a2b_hex( - "ccb68f97b03e7af1a9e208d91655ba645cc5a5d454f3cb7c3d621e98a7592d90" - "4ff7023555f0e99bcf3918948f4fca7a430faf17d7d67268d81d8096d7c48809" - "c14220e634680fbe0c760571dd86a1905835035f4a238c2d7f17bd1363b113c1" - "91782aebb77a1064142a68b59ecdcc6990ed4244082464d91dbfe09e08744b2f" - "d1e850a008acbbe129fbd050c8dc1b28cb8cc2c1e2d920ea458f74809297b513" - "85307b481cbb81d6759385ee782d6c0e101c20ca1937cfd0d6e024da1a0f718a" - "fb7c4ff3df1ca87e67602d28168233cc2448d44b79f405d4c6e67eb88d705050" - "2a806cb986423e3b0e7a97738e1d1d143b4f5f926a4e2f37c7fbe65f56d5b690"), - wvcdm::a2b_hex( - "fa35aa1f5e5d7b958880d5eed9cc1bb81d36ebd04c0250a8c752ea5f413bbdcf" - "3785790c8dba7a0b21c71346bb7f946a9b71c0d2fe87d2e2fab14e35ee8400e7" - "097a7d2d9a25b468e848e8dee2388f890967516c7dab96db4713c7855f717aed" - "2ae9c2895baaa636e4a610ab26b35d771d62397ba40d78694dab70dcbdfa91c3" - "6af79ad6b6ebb479b4a5fbc242a8574ebe6717f0813fbd6f726ce2af4d522e66" - "b36c940fce519c913db56a6372c3636b10c0149b4cd97e74c576765b533abdc2" - "729f1470dd7f9a60d3572dcc9839582a4606ee17eaced39797daef8f885d3f8f" - "e14877ae530451c4242bbc3934f85a5bb71b363351894f881896471cfeaf68b2"), - wvcdm::a2b_hex("4a59e3e5f3e4f7e2f494ad09c12a9e4c"), 0}, + wvcdm::a2bs_hex("04B2B456405CAD7170BE848CA75AA2DF"), + wvcdm::a2b_hex( + "ccb68f97b03e7af1a9e208d91655ba645cc5a5d454f3cb7c3d621e98a7592d90" + "4ff7023555f0e99bcf3918948f4fca7a430faf17d7d67268d81d8096d7c48809" + "c14220e634680fbe0c760571dd86a1905835035f4a238c2d7f17bd1363b113c1" + "91782aebb77a1064142a68b59ecdcc6990ed4244082464d91dbfe09e08744b2f" + "d1e850a008acbbe129fbd050c8dc1b28cb8cc2c1e2d920ea458f74809297b513" + "85307b481cbb81d6759385ee782d6c0e101c20ca1937cfd0d6e024da1a0f718a" + "fb7c4ff3df1ca87e67602d28168233cc2448d44b79f405d4c6e67eb88d705050" + "2a806cb986423e3b0e7a97738e1d1d143b4f5f926a4e2f37c7fbe65f56d5b690"), + wvcdm::a2b_hex( + "fa35aa1f5e5d7b958880d5eed9cc1bb81d36ebd04c0250a8c752ea5f413bbdcf" + "3785790c8dba7a0b21c71346bb7f946a9b71c0d2fe87d2e2fab14e35ee8400e7" + "097a7d2d9a25b468e848e8dee2388f890967516c7dab96db4713c7855f717aed" + "2ae9c2895baaa636e4a610ab26b35d771d62397ba40d78694dab70dcbdfa91c3" + "6af79ad6b6ebb479b4a5fbc242a8574ebe6717f0813fbd6f726ce2af4d522e66" + "b36c940fce519c913db56a6372c3636b10c0149b4cd97e74c576765b533abdc2" + "729f1470dd7f9a60d3572dcc9839582a4606ee17eaced39797daef8f885d3f8f" + "e14877ae530451c4242bbc3934f85a5bb71b363351894f881896471cfeaf68b2"), + wvcdm::a2b_hex("4a59e3e5f3e4f7e2f494ad09c12a9e4c"), 0, 3}, {true, 1, true, true, false, - wvcdm::a2bs_hex("3AE243D83B93B3311A1D777FF5FBE01A"), - wvcdm::a2b_hex( - "934997779aa1aeb45d6ba8845f13786575d0adf85a5e93674d9597f8d4286ed7" - "dcce02f306e502bbd9f1cadf502f354038ca921276d158d911bdf3171d335b18" - "0ae0f9abece16ff31ee263228354f724da2f3723b19caa38ea02bd6563b01208" - "fb5bf57854ac0fe38d5883197ef90324b2721ff20fdcf9a53819515e6daa096e" - "70f6f5c1d29a4a13dafd127e2e1f761ea0e28fd451607552ecbaef5da3c780bc" - "aaf2667b4cc4f858f01d480cac9e32c3fbb5705e5d2adcceebefc2535c117208" - "e65f604799fc3d7223e16908550f287a4bea687008cb0064cf14d3aeedb8c705" - "09ebc5c2b8b5315f43c04d78d2f55f4b32c7d33e157114362106395cc0bb6d93"), - wvcdm::a2b_hex( - "2dd54eee1307753508e1f250d637044d6e8f5abf057dab73e9e95f83910e4efc" - "191c9bac63950f13fd51833dd94a4d03f2b64fb5c721970c418fe53fa6f74ad5" - "a6e16477a35c7aa6e28909b069cd25770ef80da20918fc30fe95fd5c87fd3522" - "1649de17ca2c7b3dc31f936f0cbdf97c7b1c15de3a86b279dc4b4de64943914a" - "99734556c4b7a1a0b022c1933cb0786068fc18d49fed2f2b49f3ac6d01c32d07" - "92175ce2844eaf9064e6a3fcffade038d690cbed81659351163a22432f0d0545" - "037e1c805d8e92a1272b4196ad0ce22f26bb80063137a8e454d3b97e2414283d" - "ed0716cd8bceb80cf59166a217006bd147c51b04dfb183088ce3f51e9b9f759e"), - wvcdm::a2b_hex("b358ab21ac90455bbf60490daad457e3"), 0}, + wvcdm::a2bs_hex("3AE243D83B93B3311A1D777FF5FBE01A"), + wvcdm::a2b_hex( + "934997779aa1aeb45d6ba8845f13786575d0adf85a5e93674d9597f8d4286ed7" + "dcce02f306e502bbd9f1cadf502f354038ca921276d158d911bdf3171d335b18" + "0ae0f9abece16ff31ee263228354f724da2f3723b19caa38ea02bd6563b01208" + "fb5bf57854ac0fe38d5883197ef90324b2721ff20fdcf9a53819515e6daa096e" + "70f6f5c1d29a4a13dafd127e2e1f761ea0e28fd451607552ecbaef5da3c780bc" + "aaf2667b4cc4f858f01d480cac9e32c3fbb5705e5d2adcceebefc2535c117208" + "e65f604799fc3d7223e16908550f287a4bea687008cb0064cf14d3aeedb8c705" + "09ebc5c2b8b5315f43c04d78d2f55f4b32c7d33e157114362106395cc0bb6d93"), + wvcdm::a2b_hex( + "2dd54eee1307753508e1f250d637044d6e8f5abf057dab73e9e95f83910e4efc" + "191c9bac63950f13fd51833dd94a4d03f2b64fb5c721970c418fe53fa6f74ad5" + "a6e16477a35c7aa6e28909b069cd25770ef80da20918fc30fe95fd5c87fd3522" + "1649de17ca2c7b3dc31f936f0cbdf97c7b1c15de3a86b279dc4b4de64943914a" + "99734556c4b7a1a0b022c1933cb0786068fc18d49fed2f2b49f3ac6d01c32d07" + "92175ce2844eaf9064e6a3fcffade038d690cbed81659351163a22432f0d0545" + "037e1c805d8e92a1272b4196ad0ce22f26bb80063137a8e454d3b97e2414283d" + "ed0716cd8bceb80cf59166a217006bd147c51b04dfb183088ce3f51e9b9f759e"), + wvcdm::a2b_hex("b358ab21ac90455bbf60490daad457e3"), 0, 3}, {true, 1, true, true, false, - wvcdm::a2bs_hex("5292104C011418973C31235953FC8205"), - wvcdm::a2b_hex( - "d433adfd3d892d5c3e7d54ab0218ee0712400a920d4b71d553912451169f9b79" - "3f103260cf04c34f6a5944bb96da79946a62bdbcd804ca28b17656338edfa700" - "5c090f2750663a026fd15a0b0e448adbbfd53f613ea3993d9fd504421b575f28" - "12020bb8cca0ce333eabee0403df9f410c6473d7673d6991caab6ea2ece8f743" - "5a3ca049fa00c96c9b7c47e3073d25d08f23b47ffc509c48a81a2f98c9ec8a1d" - "e41764c14a5010df8b4692e8612a45bf0645601d4910119e6268ca4f6d8016a8" - "3d933d53f44243674b522bae43043c068c8cae43f0ac224198de71315b3a6f82" - "c1b523bbdcdb3e9f162c308684dd17e364b448ed0e90b0e496b8cf633a982708"), - wvcdm::a2b_hex( - "5efb5e5b913785e9935e67e763b8ff29a6687ac6c18d5a7e16951beb704f9c95" - "f081ca28f54c3e237fb5a7b0444e9a3e17da91e5cf2c0a8f009a873fb079c339" - "81b0ebc565b2c56d983ee33686fa5057c9891e246b67bb6950400acb06d5ae50" - "0e61a7e9289ea67ec2e88e8d0cc3c494fd996e93270e9b264a21818987e969c5" - "1e2955c5a53202e5aec1e2c906e1c006325112eb5c33ee37d0c07ea97d80c17f" - "d56e0efcf40c8c98981a86c18a159f05d851891236c124641d4584c49ccd7478" - "4f328a9cacae0f945238d98741b2969fe258903e85f963daba7168f05c18b09f" - "660dae18de41b1c49769cd38e24b135c37a65b69533f5c7d085898faedfbed5d"), - wvcdm::a2b_hex("cef7e8aaa6ec1154cb68a988f7c9e803"), 0}, + wvcdm::a2bs_hex("5292104C011418973C31235953FC8205"), + wvcdm::a2b_hex( + "d433adfd3d892d5c3e7d54ab0218ee0712400a920d4b71d553912451169f9b79" + "3f103260cf04c34f6a5944bb96da79946a62bdbcd804ca28b17656338edfa700" + "5c090f2750663a026fd15a0b0e448adbbfd53f613ea3993d9fd504421b575f28" + "12020bb8cca0ce333eabee0403df9f410c6473d7673d6991caab6ea2ece8f743" + "5a3ca049fa00c96c9b7c47e3073d25d08f23b47ffc509c48a81a2f98c9ec8a1d" + "e41764c14a5010df8b4692e8612a45bf0645601d4910119e6268ca4f6d8016a8" + "3d933d53f44243674b522bae43043c068c8cae43f0ac224198de71315b3a6f82" + "c1b523bbdcdb3e9f162c308684dd17e364b448ed0e90b0e496b8cf633a982708"), + wvcdm::a2b_hex( + "5efb5e5b913785e9935e67e763b8ff29a6687ac6c18d5a7e16951beb704f9c95" + "f081ca28f54c3e237fb5a7b0444e9a3e17da91e5cf2c0a8f009a873fb079c339" + "81b0ebc565b2c56d983ee33686fa5057c9891e246b67bb6950400acb06d5ae50" + "0e61a7e9289ea67ec2e88e8d0cc3c494fd996e93270e9b264a21818987e969c5" + "1e2955c5a53202e5aec1e2c906e1c006325112eb5c33ee37d0c07ea97d80c17f" + "d56e0efcf40c8c98981a86c18a159f05d851891236c124641d4584c49ccd7478" + "4f328a9cacae0f945238d98741b2969fe258903e85f963daba7168f05c18b09f" + "660dae18de41b1c49769cd38e24b135c37a65b69533f5c7d085898faedfbed5d"), + wvcdm::a2b_hex("cef7e8aaa6ec1154cb68a988f7c9e803"), 0, 3}, {true, 1, true, true, false, - wvcdm::a2bs_hex("D7C01C2F868AE314BCB893E4E9C6AC75"), - wvcdm::a2b_hex( - "fa5d28677721de488ffc209321529728c77bc338accd45ccc98ab2063fc8c373" - "48c7698534175d72bf185690d19474d08c4fd4ed4eb46d858633f05337d70e92" - "03f7ee6bec0f7003bdf6fa665ba172855a51a82da406348ba651a2f62888c30a" - "7b4e1355bb94a9ff5c458f397c9a09e5d7785b286ef83142ddad324cc74e1929" - "60ad1c34c425cdefbedcb62ca9b21ac4f3df7f5922e263cb7798de54b622ab3f" - "64a0dd6ee1e40be6ecc857e657994ecac02ccfafc9036f382d7dbdf35c903356" - "40b7c9db088143060b24f24b21c4a7c2faeb3d308e57c5a75955fd704cfe4dee" - "71a4a7d823102b90eddded795ca6eb36282d777db8cfd783e50e5c2a816ee9ed"), - wvcdm::a2b_hex( - "d5db2f50c0f5a39414ddfa5129c2c641836a8c6312b26a210c996988e0c768d5" - "9a3adff117293b52b0653c0d6e22589edda804fb8caa7442362fe4caf9053b6a" - "2a34896399259a188f0c805de54b091a7eabff098b28d54584c01dd83301e4ca" - "a01b226c4541af1592d4440e103eb55bbd08c471efb0856ec9ced43211fc3325" - "3d402dff0d15f40833dd71259a8d40d527659ef3e5f9fd0826c9471dddb17e1e" - "fab916abc957fb07d7eac4a368ac92a8fb16d995613af47303034ee57b59b1d7" - "101aa031f5586b2f6b4c74372c4d7306db02509b5924d52c46a270f427743a85" - "614f080d83f3b15cbc6600ddda43adff5d2941da13ebe49d80fd0cea5025412b"), - wvcdm::a2b_hex("964c2dfda920357c668308d52d33c652"), 0} -}; + wvcdm::a2bs_hex("D7C01C2F868AE314BCB893E4E9C6AC75"), + wvcdm::a2b_hex( + "fa5d28677721de488ffc209321529728c77bc338accd45ccc98ab2063fc8c373" + "48c7698534175d72bf185690d19474d08c4fd4ed4eb46d858633f05337d70e92" + "03f7ee6bec0f7003bdf6fa665ba172855a51a82da406348ba651a2f62888c30a" + "7b4e1355bb94a9ff5c458f397c9a09e5d7785b286ef83142ddad324cc74e1929" + "60ad1c34c425cdefbedcb62ca9b21ac4f3df7f5922e263cb7798de54b622ab3f" + "64a0dd6ee1e40be6ecc857e657994ecac02ccfafc9036f382d7dbdf35c903356" + "40b7c9db088143060b24f24b21c4a7c2faeb3d308e57c5a75955fd704cfe4dee" + "71a4a7d823102b90eddded795ca6eb36282d777db8cfd783e50e5c2a816ee9ed"), + wvcdm::a2b_hex( + "d5db2f50c0f5a39414ddfa5129c2c641836a8c6312b26a210c996988e0c768d5" + "9a3adff117293b52b0653c0d6e22589edda804fb8caa7442362fe4caf9053b6a" + "2a34896399259a188f0c805de54b091a7eabff098b28d54584c01dd83301e4ca" + "a01b226c4541af1592d4440e103eb55bbd08c471efb0856ec9ced43211fc3325" + "3d402dff0d15f40833dd71259a8d40d527659ef3e5f9fd0826c9471dddb17e1e" + "fab916abc957fb07d7eac4a368ac92a8fb16d995613af47303034ee57b59b1d7" + "101aa031f5586b2f6b4c74372c4d7306db02509b5924d52c46a270f427743a85" + "614f080d83f3b15cbc6600ddda43adff5d2941da13ebe49d80fd0cea5025412b"), + wvcdm::a2b_hex("964c2dfda920357c668308d52d33c652"), 0, 3}}; // License duration + fudge factor const uint32_t kSingleEncryptedSubSampleIcpLicenseDurationExpiration = 5 + 2; @@ -353,13 +365,12 @@ struct SessionSharingSubSampleInfo { }; SessionSharingSubSampleInfo session_sharing_sub_samples[] = { - { &clear_sub_sample, false }, - { &clear_sub_sample, true }, - { &clear_sub_sample_no_key, false }, - { &clear_sub_sample_no_key, true }, - { &single_encrypted_sub_sample, false }, - { &single_encrypted_sub_sample, true } -}; + {&clear_sub_sample, false}, + {&clear_sub_sample, true}, + {&clear_sub_sample_no_key, false}, + {&clear_sub_sample_no_key, true}, + {&single_encrypted_sub_sample, false}, + {&single_encrypted_sub_sample, true}}; struct UsageInfoSubSampleInfo { SubSampleInfo* sub_sample; @@ -367,10 +378,9 @@ struct UsageInfoSubSampleInfo { }; UsageInfoSubSampleInfo usage_info_sub_sample_info[] = { - { &usage_info_sub_samples_icp[0], 1 }, - { &usage_info_sub_samples_icp[0], 3 }, - { &usage_info_sub_samples_icp[0], 5 } -}; + {&usage_info_sub_samples_icp[0], 1}, + {&usage_info_sub_samples_icp[0], 3}, + {&usage_info_sub_samples_icp[0], 5}}; } // namespace @@ -440,32 +450,28 @@ class WvCdmRequestLicenseTest : public testing::Test { ~WvCdmRequestLicenseTest() {} protected: - void GenerateKeyRequest(const std::string& key_system, - const std::string& init_data, + void GenerateKeyRequest(const std::string& init_data, CdmLicenseType license_type) { wvcdm::CdmAppParameterMap app_parameters; std::string server_url; std::string key_set_id; EXPECT_EQ(wvcdm::KEY_MESSAGE, - decryptor_.GenerateKeyRequest(session_id_, key_set_id, - "video/mp4", init_data, - license_type, app_parameters, - &key_msg_, &server_url)); + decryptor_.GenerateKeyRequest( + session_id_, key_set_id, "video/mp4", init_data, license_type, + app_parameters, &key_msg_, &server_url)); EXPECT_EQ(0u, server_url.size()); } - void GenerateRenewalRequest(const std::string& key_system, - CdmLicenseType license_type, + void GenerateRenewalRequest(CdmLicenseType license_type, std::string* server_url) { // TODO application makes a license request, CDM will renew the license // when appropriate. std::string init_data; wvcdm::CdmAppParameterMap app_parameters; EXPECT_EQ(wvcdm::KEY_MESSAGE, - decryptor_.GenerateKeyRequest(session_id_, key_set_id_, - "video/mp4", init_data, - license_type, app_parameters, - &key_msg_, server_url)); + decryptor_.GenerateKeyRequest( + session_id_, key_set_id_, "video/mp4", init_data, + license_type, app_parameters, &key_msg_, server_url)); // TODO(edwinwong, rfrias): Add tests cases for when license server url // is empty on renewal. Need appropriate key id at the server. EXPECT_NE(0u, server_url->size()); @@ -477,10 +483,9 @@ class WvCdmRequestLicenseTest : public testing::Test { wvcdm::CdmAppParameterMap app_parameters; std::string server_url; EXPECT_EQ(wvcdm::KEY_MESSAGE, - decryptor_.GenerateKeyRequest(session_id, key_set_id, "video/mp4", - init_data, kLicenseTypeRelease, - app_parameters, &key_msg_, - &server_url)); + decryptor_.GenerateKeyRequest( + session_id, key_set_id, "video/mp4", init_data, + kLicenseTypeRelease, app_parameters, &key_msg_, &server_url)); } // Post a request and extract the drm message from the response @@ -530,8 +535,8 @@ class WvCdmRequestLicenseTest : public testing::Test { // Post a request and extract the signed provisioning message from // the HTTP response. std::string GetUsageInfoResponse(const std::string& server_url, - const std::string& client_auth, - const std::string& usage_info_request) { + const std::string& client_auth, + const std::string& usage_info_request) { // Use secure connection and chunk transfer coding. UrlRequest url_request(server_url + client_auth, g_port, g_use_secure_transfer, g_use_chunked_transfer); @@ -556,7 +561,7 @@ class WvCdmRequestLicenseTest : public testing::Test { void VerifyKeyRequestResponse(const std::string& server_url, const std::string& client_auth, - std::string& init_data, bool is_renewal) { + bool is_renewal) { std::string resp = GetKeyRequestResponse(server_url, client_auth); if (is_renewal) { @@ -595,16 +600,15 @@ TEST_F(WvCdmRequestLicenseTest, ProvisioningTest) { std::string cert_authority, cert, wrapped_key; EXPECT_EQ(wvcdm::NO_ERROR, decryptor_.GetProvisioningRequest( - cert_type, cert_authority, - &key_msg_, &provisioning_server_url)); + cert_type, cert_authority, &key_msg_, + &provisioning_server_url)); EXPECT_EQ(provisioning_server_url, g_config->provisioning_server_url()); std::string response = GetCertRequestResponse(g_config->provisioning_server_url()); EXPECT_NE(0, static_cast(response.size())); - EXPECT_EQ(wvcdm::NO_ERROR, - decryptor_.HandleProvisioningResponse(response, &cert, - &wrapped_key)); + EXPECT_EQ(wvcdm::NO_ERROR, decryptor_.HandleProvisioningResponse( + response, &cert, &wrapped_key)); EXPECT_EQ(0, static_cast(cert.size())); EXPECT_EQ(0, static_cast(wrapped_key.size())); decryptor_.CloseSession(session_id_); @@ -617,30 +621,28 @@ TEST_F(WvCdmRequestLicenseTest, ProvisioningRetryTest) { std::string cert_authority, cert, wrapped_key; EXPECT_EQ(wvcdm::NO_ERROR, decryptor_.GetProvisioningRequest( - cert_type, cert_authority, - &key_msg_, &provisioning_server_url)); + cert_type, cert_authority, &key_msg_, + &provisioning_server_url)); EXPECT_EQ(provisioning_server_url, g_config->provisioning_server_url()); EXPECT_EQ(wvcdm::NO_ERROR, decryptor_.GetProvisioningRequest( - cert_type, cert_authority, - &key_msg_, &provisioning_server_url)); + cert_type, cert_authority, &key_msg_, + &provisioning_server_url)); EXPECT_EQ(provisioning_server_url, g_config->provisioning_server_url()); std::string response = GetCertRequestResponse(g_config->provisioning_server_url()); EXPECT_NE(0, static_cast(response.size())); - EXPECT_EQ(wvcdm::NO_ERROR, - decryptor_.HandleProvisioningResponse(response, &cert, - &wrapped_key)); + EXPECT_EQ(wvcdm::NO_ERROR, decryptor_.HandleProvisioningResponse( + response, &cert, &wrapped_key)); EXPECT_EQ(0, static_cast(cert.size())); EXPECT_EQ(0, static_cast(wrapped_key.size())); response = GetCertRequestResponse(g_config->provisioning_server_url()); EXPECT_NE(0, static_cast(response.size())); - EXPECT_EQ(wvcdm::UNKNOWN_ERROR, - decryptor_.HandleProvisioningResponse(response, &cert, - &wrapped_key)); + EXPECT_EQ(wvcdm::UNKNOWN_ERROR, decryptor_.HandleProvisioningResponse( + response, &cert, &wrapped_key)); EXPECT_EQ(0, static_cast(cert.size())); EXPECT_EQ(0, static_cast(wrapped_key.size())); decryptor_.CloseSession(session_id_); @@ -655,16 +657,15 @@ TEST_F(WvCdmRequestLicenseTest, DISABLED_X509ProvisioningTest) { std::string cert, wrapped_key; EXPECT_EQ(wvcdm::NO_ERROR, decryptor_.GetProvisioningRequest( - cert_type, cert_authority, - &key_msg_, &provisioning_server_url)); + cert_type, cert_authority, &key_msg_, + &provisioning_server_url)); EXPECT_EQ(provisioning_server_url, g_config->provisioning_server_url()); std::string response = GetCertRequestResponse(g_config->provisioning_server_url()); EXPECT_NE(0, static_cast(response.size())); - EXPECT_EQ(wvcdm::NO_ERROR, - decryptor_.HandleProvisioningResponse(response, &cert, - &wrapped_key)); + EXPECT_EQ(wvcdm::NO_ERROR, decryptor_.HandleProvisioningResponse( + response, &cert, &wrapped_key)); EXPECT_NE(0, static_cast(cert.size())); EXPECT_NE(0, static_cast(wrapped_key.size())); decryptor_.CloseSession(session_id_); @@ -691,17 +692,15 @@ TEST_F(WvCdmRequestLicenseTest, PropertySetTest) { std::string provisioning_server_url; CdmCertificateType cert_type = kCertificateWidevine; std::string cert_authority, cert, wrapped_key; - EXPECT_EQ( - NO_ERROR, - decryptor_.GetProvisioningRequest(cert_type, cert_authority, - &key_msg_, &provisioning_server_url)); + EXPECT_EQ(NO_ERROR, decryptor_.GetProvisioningRequest( + cert_type, cert_authority, &key_msg_, + &provisioning_server_url)); EXPECT_EQ(provisioning_server_url, g_config->provisioning_server_url()); std::string response = GetCertRequestResponse(g_config->provisioning_server_url()); EXPECT_NE(0, static_cast(response.size())); - EXPECT_EQ(NO_ERROR, - decryptor_.HandleProvisioningResponse(response, &cert, - &wrapped_key)); + EXPECT_EQ(NO_ERROR, decryptor_.HandleProvisioningResponse(response, &cert, + &wrapped_key)); EXPECT_EQ(NO_ERROR, decryptor_.OpenSession(g_key_system, &property_set_L3, &session_id_L3)); } else { @@ -741,56 +740,52 @@ TEST_F(WvCdmRequestLicenseTest, ForceL3Test) { std::string provisioning_server_url; CdmCertificateType cert_type = kCertificateWidevine; std::string cert_authority, cert, wrapped_key; - EXPECT_EQ(NO_ERROR, - decryptor_.GetProvisioningRequest(cert_type, cert_authority, - &key_msg_, - &provisioning_server_url)); + EXPECT_EQ(NO_ERROR, decryptor_.GetProvisioningRequest( + cert_type, cert_authority, &key_msg_, + &provisioning_server_url)); EXPECT_EQ(provisioning_server_url, g_config->provisioning_server_url()); std::string response = GetCertRequestResponse(g_config->provisioning_server_url()); EXPECT_NE(0, static_cast(response.size())); - EXPECT_EQ(NO_ERROR, - decryptor_.HandleProvisioningResponse(response, &cert, - &wrapped_key)); + EXPECT_EQ(NO_ERROR, decryptor_.HandleProvisioningResponse(response, &cert, + &wrapped_key)); EXPECT_EQ(NO_ERROR, decryptor_.OpenSession(g_key_system, &property_set, &session_id_)); - GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeStreaming); - VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); + GenerateKeyRequest(g_key_id, kLicenseTypeStreaming); + VerifyKeyRequestResponse(g_license_server, g_client_auth, false); decryptor_.CloseSession(session_id_); } -TEST_F(WvCdmRequestLicenseTest, DISABLED_PrivacyModeTest) { +TEST_F(WvCdmRequestLicenseTest, PrivacyModeTest) { TestWvCdmClientPropertySet property_set; property_set.set_use_privacy_mode(true); decryptor_.OpenSession(g_key_system, &property_set, &session_id_); - GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeStreaming); - std::string resp = - GetKeyRequestResponse(g_license_server, g_client_auth); + GenerateKeyRequest(g_key_id, kLicenseTypeStreaming); + std::string resp = GetKeyRequestResponse(g_license_server, g_client_auth); EXPECT_EQ(decryptor_.AddKey(session_id_, resp, &key_set_id_), wvcdm::NEED_KEY); - GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeStreaming); - VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); + GenerateKeyRequest(g_key_id, kLicenseTypeStreaming); + VerifyKeyRequestResponse(g_license_server, g_client_auth, false); decryptor_.CloseSession(session_id_); } -TEST_F(WvCdmRequestLicenseTest, - DISABLED_PrivacyModeWithServiceCertificateTest) { +TEST_F(WvCdmRequestLicenseTest, PrivacyModeWithServiceCertificateTest) { TestWvCdmClientPropertySet property_set; property_set.set_use_privacy_mode(true); property_set.set_service_certificate(a2b_hex(kServiceCertificate)); decryptor_.OpenSession(g_key_system, &property_set, &session_id_); - GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeStreaming); - VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); + GenerateKeyRequest(g_key_id, kLicenseTypeStreaming); + VerifyKeyRequestResponse(g_license_server, g_client_auth, false); decryptor_.CloseSession(session_id_); } TEST_F(WvCdmRequestLicenseTest, BaseMessageTest) { decryptor_.OpenSession(g_key_system, NULL, &session_id_); - GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeStreaming); + GenerateKeyRequest(g_key_id, kLicenseTypeStreaming); GetKeyRequestResponse(g_license_server, g_client_auth); decryptor_.CloseSession(session_id_); } @@ -799,31 +794,69 @@ TEST_F(WvCdmRequestLicenseTest, WrongMessageTest) { decryptor_.OpenSession(g_key_system, NULL, &session_id_); std::string wrong_message = wvcdm::a2bs_hex(g_wrong_key_id); - GenerateKeyRequest(g_key_system, wrong_message, kLicenseTypeStreaming); + GenerateKeyRequest(wrong_message, kLicenseTypeStreaming); // We should receive a response with no license, i.e. the extracted license - // response message should be empty. - EXPECT_EQ("", GetKeyRequestResponse(g_license_server, g_client_auth)); + // response message should be empty or an HTTP error + UrlRequest url_request(g_license_server + g_client_auth, g_port, + g_use_secure_transfer, g_use_chunked_transfer); + if (!url_request.is_connected()) { + return; + } + url_request.PostRequest(key_msg_); + std::string message; + int resp_bytes = url_request.GetResponse(&message); + + int status_code = url_request.GetStatusCode(message); + std::string drm_msg; + if (kHttpOk == status_code) { + LicenseRequest lic_request; + lic_request.GetDrmMessage(message, drm_msg); + LOGV("HTTP response body: (%u bytes)", drm_msg.size()); + } + EXPECT_TRUE(drm_msg.empty()); + EXPECT_TRUE(kHttpOk == status_code || kHttpBadRequest == status_code || + kHttpInternalServerError == status_code); decryptor_.CloseSession(session_id_); } TEST_F(WvCdmRequestLicenseTest, AddStreamingKeyTest) { decryptor_.OpenSession(g_key_system, NULL, &session_id_); - GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeStreaming); - VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); + GenerateKeyRequest(g_key_id, kLicenseTypeStreaming); + VerifyKeyRequestResponse(g_license_server, g_client_auth, false); decryptor_.CloseSession(session_id_); } TEST_F(WvCdmRequestLicenseTest, AddKeyOfflineTest) { + // override default settings unless configured through the command line + std::string key_id = g_key_id; + std::string client_auth = g_client_auth; + + ConfigTestEnv config(g_license_server_id, false); + if (g_key_id.compare(a2bs_hex(g_config->key_id())) == 0) + key_id.assign(wvcdm::a2bs_hex(config.key_id())); + if (g_client_auth.compare(g_config->client_auth()) == 0) + client_auth.assign(config.client_auth()); + decryptor_.OpenSession(g_key_system, NULL, &session_id_); - GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeOffline); - VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); + GenerateKeyRequest(key_id, kLicenseTypeOffline); + VerifyKeyRequestResponse(g_license_server, client_auth, false); decryptor_.CloseSession(session_id_); } TEST_F(WvCdmRequestLicenseTest, RestoreOfflineKeyTest) { + // override default settings unless configured through the command line + std::string key_id = g_key_id; + std::string client_auth = g_client_auth; + + ConfigTestEnv config(g_license_server_id, false); + if (g_key_id.compare(a2bs_hex(g_config->key_id())) == 0) + key_id.assign(wvcdm::a2bs_hex(config.key_id())); + if (g_client_auth.compare(g_config->client_auth()) == 0) + client_auth.assign(config.client_auth()); + decryptor_.OpenSession(g_key_system, NULL, &session_id_); - GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeOffline); - VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); + GenerateKeyRequest(key_id, kLicenseTypeOffline); + VerifyKeyRequestResponse(g_license_server, client_auth, false); CdmKeySetId key_set_id = key_set_id_; EXPECT_FALSE(key_set_id_.empty()); @@ -836,9 +869,19 @@ TEST_F(WvCdmRequestLicenseTest, RestoreOfflineKeyTest) { } TEST_F(WvCdmRequestLicenseTest, ReleaseOfflineKeyTest) { + // override default settings unless configured through the command line + std::string key_id = g_key_id; + std::string client_auth = g_client_auth; + + ConfigTestEnv config(g_license_server_id, false); + if (g_key_id.compare(a2bs_hex(g_config->key_id())) == 0) + key_id.assign(wvcdm::a2bs_hex(config.key_id())); + if (g_client_auth.compare(g_config->client_auth()) == 0) + client_auth.assign(config.client_auth()); + decryptor_.OpenSession(g_key_system, NULL, &session_id_); - GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeOffline); - VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); + GenerateKeyRequest(key_id, kLicenseTypeOffline); + VerifyKeyRequestResponse(g_license_server, client_auth, false); CdmKeySetId key_set_id = key_set_id_; EXPECT_FALSE(key_set_id_.empty()); @@ -854,13 +897,23 @@ TEST_F(WvCdmRequestLicenseTest, ReleaseOfflineKeyTest) { key_set_id_.clear(); GenerateKeyRelease(key_set_id); key_set_id_ = key_set_id; - VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); + VerifyKeyRequestResponse(g_license_server, client_auth, false); } TEST_F(WvCdmRequestLicenseTest, ExpiryOnReleaseOfflineKeyTest) { + // override default settings unless configured through the command line + std::string key_id = g_key_id; + std::string client_auth = g_client_auth; + + ConfigTestEnv config(g_license_server_id, false); + if (g_key_id.compare(a2bs_hex(g_config->key_id())) == 0) + key_id.assign(wvcdm::a2bs_hex(config.key_id())); + if (g_client_auth.compare(g_config->client_auth()) == 0) + client_auth.assign(config.client_auth()); + decryptor_.OpenSession(g_key_system, NULL, &session_id_); - GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeOffline); - VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); + GenerateKeyRequest(key_id, kLicenseTypeOffline); + VerifyKeyRequestResponse(g_license_server, client_auth, false); CdmKeySetId key_set_id = key_set_id_; EXPECT_FALSE(key_set_id_.empty()); @@ -883,33 +936,41 @@ TEST_F(WvCdmRequestLicenseTest, ExpiryOnReleaseOfflineKeyTest) { EXPECT_TRUE(listener.session_id().size() != 0); EXPECT_TRUE(listener.session_id().compare(restore_session_id) == 0); EXPECT_TRUE(listener.event_type() == LICENSE_EXPIRED_EVENT); - VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); + VerifyKeyRequestResponse(g_license_server, client_auth, false); decryptor_.CloseSession(restore_session_id); } TEST_F(WvCdmRequestLicenseTest, StreamingLicenseRenewal) { decryptor_.OpenSession(g_key_system, NULL, &session_id_); - GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeStreaming); - VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); + GenerateKeyRequest(g_key_id, kLicenseTypeStreaming); + VerifyKeyRequestResponse(g_license_server, g_client_auth, false); std::string license_server; - GenerateRenewalRequest(g_key_system, kLicenseTypeStreaming, &license_server); - if (license_server.empty()) - license_server = g_license_server; - VerifyKeyRequestResponse(license_server, g_client_auth, g_key_id, true); + GenerateRenewalRequest(kLicenseTypeStreaming, &license_server); + if (license_server.empty()) license_server = g_license_server; + VerifyKeyRequestResponse(license_server, g_client_auth, true); decryptor_.CloseSession(session_id_); } TEST_F(WvCdmRequestLicenseTest, OfflineLicenseRenewal) { + // override default settings unless configured through the command line + std::string key_id = g_key_id; + std::string client_auth = g_client_auth; + + ConfigTestEnv config(g_license_server_id, false); + if (g_key_id.compare(a2bs_hex(g_config->key_id())) == 0) + key_id.assign(wvcdm::a2bs_hex(config.key_id())); + if (g_client_auth.compare(g_config->client_auth()) == 0) + client_auth.assign(config.client_auth()); + decryptor_.OpenSession(g_key_system, NULL, &session_id_); - GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeOffline); - VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); + GenerateKeyRequest(key_id, kLicenseTypeOffline); + VerifyKeyRequestResponse(g_license_server, client_auth, false); std::string license_server; - GenerateRenewalRequest(g_key_system, kLicenseTypeOffline, &license_server); - if (license_server.empty()) - license_server = g_license_server; - VerifyKeyRequestResponse(license_server, g_client_auth, g_key_id, true); + GenerateRenewalRequest(kLicenseTypeOffline, &license_server); + if (license_server.empty()) license_server = g_license_server; + VerifyKeyRequestResponse(license_server, client_auth, true); decryptor_.CloseSession(session_id_); } @@ -947,9 +1008,8 @@ TEST_P(WvCdmUsageInfoTest, DISABLED_UsageInfo) { char ch = 0x33 + i; key_id.append(1, ch); - GenerateKeyRequest(g_key_system, key_id, kLicenseTypeStreaming); - VerifyKeyRequestResponse(g_license_server, g_client_auth, data->key_id, - false); + GenerateKeyRequest(key_id, kLicenseTypeStreaming); + VerifyKeyRequestResponse(g_license_server, g_client_auth, false); std::vector decrypt_buffer(data->encrypt_data.size()); CdmDecryptionParameters decryption_parameters( @@ -972,8 +1032,8 @@ TEST_P(WvCdmUsageInfoTest, DISABLED_UsageInfo) { EXPECT_EQ(usage_info.empty() ? NO_ERROR : KEY_MESSAGE, status); while (usage_info.size() > 0) { for (size_t i = 0; i < usage_info.size(); ++i) { - release_msg = GetUsageInfoResponse(g_license_server, g_client_auth, - usage_info[i]); + release_msg = + GetUsageInfoResponse(g_license_server, g_client_auth, usage_info[i]); EXPECT_EQ(NO_ERROR, decryptor_.ReleaseUsageInfo(release_msg)); } status = decryptor_.GetUsageInfo(&usage_info); @@ -981,11 +1041,10 @@ TEST_P(WvCdmUsageInfoTest, DISABLED_UsageInfo) { } } -INSTANTIATE_TEST_CASE_P( - Cdm, WvCdmUsageInfoTest, - ::testing::Values(&usage_info_sub_sample_info[0], - &usage_info_sub_sample_info[1], - &usage_info_sub_sample_info[2])); +INSTANTIATE_TEST_CASE_P(Cdm, WvCdmUsageInfoTest, + ::testing::Values(&usage_info_sub_sample_info[0], + &usage_info_sub_sample_info[1], + &usage_info_sub_sample_info[2])); TEST_F(WvCdmRequestLicenseTest, QueryUnmodifiedSessionStatus) { // Test that the global value is returned when no properties are modifying it. @@ -1008,8 +1067,8 @@ TEST_F(WvCdmRequestLicenseTest, QueryModifiedSessionStatus) { TEST_F(WvCdmRequestLicenseTest, QueryKeyStatus) { decryptor_.OpenSession(g_key_system, NULL, &session_id_); - GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeStreaming); - VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); + GenerateKeyRequest(g_key_id, kLicenseTypeStreaming); + VerifyKeyRequestResponse(g_license_server, g_client_auth, false); CdmQueryMap query_info; CdmQueryMap::iterator itr; @@ -1078,8 +1137,8 @@ TEST_F(WvCdmRequestLicenseTest, QueryStatus) { TEST_F(WvCdmRequestLicenseTest, QueryKeyControlInfo) { decryptor_.OpenSession(g_key_system, NULL, &session_id_); - GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeStreaming); - VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); + GenerateKeyRequest(g_key_id, kLicenseTypeStreaming); + VerifyKeyRequestResponse(g_license_server, g_client_auth, false); CdmQueryMap query_info; CdmQueryMap::iterator itr; @@ -1097,6 +1156,16 @@ TEST_F(WvCdmRequestLicenseTest, QueryKeyControlInfo) { } TEST_F(WvCdmRequestLicenseTest, SecurityLevelPathBackwardCompatibility) { + // override default settings unless configured through the command line + std::string key_id = g_key_id; + std::string client_auth = g_client_auth; + + ConfigTestEnv config(g_license_server_id, false); + if (g_key_id.compare(a2bs_hex(g_config->key_id())) == 0) + key_id.assign(wvcdm::a2bs_hex(config.key_id())); + if (g_client_auth.compare(g_config->client_auth()) == 0) + client_auth.assign(config.client_auth()); + CdmQueryMap query_info; CdmQueryMap::iterator itr; EXPECT_EQ(wvcdm::NO_ERROR, decryptor_.QueryStatus(&query_info)); @@ -1135,20 +1204,19 @@ TEST_F(WvCdmRequestLicenseTest, SecurityLevelPathBackwardCompatibility) { CdmCertificateType cert_type = kCertificateWidevine; std::string cert_authority, cert, wrapped_key; EXPECT_EQ(wvcdm::NO_ERROR, decryptor_.GetProvisioningRequest( - cert_type, cert_authority, - &key_msg_, &provisioning_server_url)); + cert_type, cert_authority, &key_msg_, + &provisioning_server_url)); EXPECT_EQ(provisioning_server_url, g_config->provisioning_server_url()); std::string response = GetCertRequestResponse(g_config->provisioning_server_url()); EXPECT_NE(0, static_cast(response.size())); - EXPECT_EQ(wvcdm::NO_ERROR, - decryptor_.HandleProvisioningResponse(response, &cert, - &wrapped_key)); + EXPECT_EQ(wvcdm::NO_ERROR, decryptor_.HandleProvisioningResponse( + response, &cert, &wrapped_key)); decryptor_.CloseSession(session_id_); decryptor_.OpenSession(g_key_system, NULL, &session_id_); - GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeOffline); - VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); + GenerateKeyRequest(key_id, kLicenseTypeOffline); + VerifyKeyRequestResponse(g_license_server, client_auth, false); CdmKeySetId key_set_id = key_set_id_; EXPECT_FALSE(key_set_id_.empty()); decryptor_.CloseSession(session_id_); @@ -1174,8 +1242,8 @@ TEST_F(WvCdmRequestLicenseTest, SecurityLevelPathBackwardCompatibility) { decryptor_.CloseSession(session_id_); decryptor_.OpenSession(g_key_system, NULL, &session_id_); - GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeStreaming); - VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); + GenerateKeyRequest(key_id, kLicenseTypeStreaming); + VerifyKeyRequestResponse(g_license_server, client_auth, false); decryptor_.CloseSession(session_id_); if (security_level != kSecurityLevelL1) return; @@ -1189,33 +1257,30 @@ TEST_F(WvCdmRequestLicenseTest, SecurityLevelPathBackwardCompatibility) { wvcdm::CdmAppParameterMap app_parameters; std::string server_url; EXPECT_EQ(wvcdm::NEED_PROVISIONING, - decryptor_.GenerateKeyRequest(session_id_, key_set_id, "video/mp4", - g_key_id, kLicenseTypeStreaming, - app_parameters, &key_msg_, - &server_url)); - EXPECT_EQ(NO_ERROR, - decryptor_.GetProvisioningRequest(cert_type, cert_authority, - &key_msg_, - &provisioning_server_url)); + decryptor_.GenerateKeyRequest( + session_id_, key_set_id, "video/mp4", key_id, + kLicenseTypeStreaming, app_parameters, &key_msg_, &server_url)); + EXPECT_EQ(NO_ERROR, decryptor_.GetProvisioningRequest( + cert_type, cert_authority, &key_msg_, + &provisioning_server_url)); EXPECT_EQ(provisioning_server_url, g_config->provisioning_server_url()); response = GetCertRequestResponse(g_config->provisioning_server_url()); EXPECT_NE(0, static_cast(response.size())); - EXPECT_EQ(NO_ERROR, - decryptor_.HandleProvisioningResponse(response, &cert, - &wrapped_key)); + EXPECT_EQ(NO_ERROR, decryptor_.HandleProvisioningResponse(response, &cert, + &wrapped_key)); EXPECT_EQ(NO_ERROR, decryptor_.OpenSession(g_key_system, &property_set, &session_id_)); - GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeStreaming); - VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); + GenerateKeyRequest(g_key_id, kLicenseTypeStreaming); + VerifyKeyRequestResponse(g_license_server, client_auth, false); decryptor_.CloseSession(session_id_); } TEST_F(WvCdmRequestLicenseTest, DISABLED_OfflineLicenseDecryptionTest) { decryptor_.OpenSession(g_key_system, NULL, &session_id_); - GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeOffline); - VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); + GenerateKeyRequest(g_key_id, kLicenseTypeOffline); + VerifyKeyRequestResponse(g_license_server, g_client_auth, false); /* // key 1, encrypted, 256b @@ -1267,8 +1332,8 @@ TEST_F(WvCdmRequestLicenseTest, DISABLED_OfflineLicenseDecryptionTest) { TEST_F(WvCdmRequestLicenseTest, DISABLED_RestoreOfflineLicenseDecryptionTest) { decryptor_.OpenSession(g_key_system, NULL, &session_id_); - GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeOffline); - VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); + GenerateKeyRequest(g_key_id, kLicenseTypeOffline); + VerifyKeyRequestResponse(g_license_server, g_client_auth, false); CdmKeySetId key_set_id = key_set_id_; EXPECT_FALSE(key_set_id_.empty()); decryptor_.CloseSession(session_id_); @@ -1328,8 +1393,8 @@ TEST_F(WvCdmRequestLicenseTest, DISABLED_RestoreOfflineLicenseDecryptionTest) { /* TEST_F(WvCdmRequestLicenseTest, KeyControlBlockDecryptionTest) { decryptor_.OpenSession(g_key_system, &session_id_); - GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeStreaming); - VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); + GenerateKeyRequest(g_key_id, kLicenseTypeStreaming); + VerifyKeyRequestResponse(g_license_server, g_client_auth, false); DecryptionData data; @@ -1393,79 +1458,75 @@ TEST_P(WvCdmSessionSharingTest, SessionSharingTest) { decryptor_.OpenSession(g_key_system, &property_set, &session_id_); CdmSessionId gp_session_id_1 = session_id_; - GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeStreaming); - VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); + GenerateKeyRequest(g_key_id, kLicenseTypeStreaming); + VerifyKeyRequestResponse(g_license_server, g_client_auth, false); // TODO(rfrias): Move content information to ConfigTestEnv std::string gp_client_auth2 = "?source=YOUTUBE&video_id=z3S_NhwueaM&oauth=ya.gtsqawidevine"; - std::string gp_key_id2 = - wvcdm::a2bs_hex( - "000000347073736800000000" // blob size and pssh - "edef8ba979d64acea3c827dcd51d21ed00000014" // Widevine system id - "08011210bdf1cb4fffc6506b8b7945b0bd2917fb"); // pssh data + std::string gp_key_id2 = wvcdm::a2bs_hex( + "000000347073736800000000" // blob size and pssh + "edef8ba979d64acea3c827dcd51d21ed00000014" // Widevine system id + "08011210bdf1cb4fffc6506b8b7945b0bd2917fb"); // pssh data decryptor_.OpenSession(g_key_system, &property_set, &session_id_); CdmSessionId gp_session_id_2 = session_id_; - GenerateKeyRequest(g_key_system, gp_key_id2, kLicenseTypeStreaming); - VerifyKeyRequestResponse(g_license_server, gp_client_auth2, gp_key_id2, false); + GenerateKeyRequest(gp_key_id2, kLicenseTypeStreaming); + VerifyKeyRequestResponse(g_license_server, gp_client_auth2, false); SubSampleInfo* data = session_sharing_info->sub_sample; std::vector decrypt_buffer(data->encrypt_data.size()); - CdmDecryptionParameters decryption_parameters(&data->key_id, - &data->encrypt_data.front(), - data->encrypt_data.size(), - &data->iv, - data->block_offset, - &decrypt_buffer[0]); + CdmDecryptionParameters decryption_parameters( + &data->key_id, &data->encrypt_data.front(), data->encrypt_data.size(), + &data->iv, data->block_offset, &decrypt_buffer[0]); decryption_parameters.is_encrypted = data->is_encrypted; decryption_parameters.is_secure = data->is_secure; if (session_sharing_info->session_sharing_enabled || !data->is_encrypted) { - EXPECT_EQ(NO_ERROR, decryptor_.Decrypt(gp_session_id_2, - data->validate_key_id, - decryption_parameters)); + EXPECT_EQ(NO_ERROR, + decryptor_.Decrypt(gp_session_id_2, data->validate_key_id, + decryption_parameters)); EXPECT_TRUE(std::equal(data->decrypt_data.begin(), data->decrypt_data.end(), decrypt_buffer.begin())); } else { - EXPECT_EQ(NEED_KEY, decryptor_.Decrypt(gp_session_id_2, - data->validate_key_id, - decryption_parameters)); + EXPECT_EQ(NEED_KEY, + decryptor_.Decrypt(gp_session_id_2, data->validate_key_id, + decryption_parameters)); } decryptor_.CloseSession(gp_session_id_1); decryptor_.CloseSession(gp_session_id_2); } -TEST_F(WvCdmRequestLicenseTest, DISABLED_DecryptionKeyExpiredTest) { - SubSampleInfo* data = &single_encrypted_sub_sample_icp; +TEST_F(WvCdmRequestLicenseTest, DecryptionKeyExpiredTest) { + const std::string kYtCpKeyId = a2bs_hex( + "000000347073736800000000" // blob size and pssh + "EDEF8BA979D64ACEA3C827DCD51D21ED00000014" // Widevine system id + "0801121030313233343536373839616263646566"); // pssh data + SubSampleInfo* data = &single_encrypted_sub_sample_short_expiry; decryptor_.OpenSession(g_key_system, NULL, &session_id_); if (data->retrieve_key) { - GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeStreaming); - VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); + GenerateKeyRequest(kYtCpKeyId, kLicenseTypeStreaming); + VerifyKeyRequestResponse(g_license_server, g_client_auth, false); } - std::vector decrypt_buffer(data->encrypt_data.size()); - CdmDecryptionParameters decryption_parameters( - &data->key_id, &data->encrypt_data.front(), - data->encrypt_data.size(), &data->iv, - data->block_offset, &decrypt_buffer[0]); - decryption_parameters.is_encrypted = data->is_encrypted; - decryption_parameters.is_secure = data->is_secure; - EXPECT_EQ(NO_ERROR, decryptor_.Decrypt(session_id_, - data->validate_key_id, - decryption_parameters)); - sleep(kSingleEncryptedSubSampleIcpLicenseDurationExpiration); - EXPECT_EQ(NEED_KEY, decryptor_.Decrypt(session_id_, - data->validate_key_id, - decryption_parameters)); + std::vector decrypt_buffer(data->encrypt_data.size()); + CdmDecryptionParameters decryption_parameters( + &data->key_id, &data->encrypt_data.front(), data->encrypt_data.size(), + &data->iv, data->block_offset, &decrypt_buffer[0]); + decryption_parameters.is_encrypted = data->is_encrypted; + decryption_parameters.is_secure = data->is_secure; + EXPECT_EQ(NO_ERROR, decryptor_.Decrypt(session_id_, data->validate_key_id, + decryption_parameters)); + sleep(kSingleEncryptedSubSampleIcpLicenseDurationExpiration); + EXPECT_EQ(NEED_KEY, decryptor_.Decrypt(session_id_, data->validate_key_id, + decryption_parameters)); decryptor_.CloseSession(session_id_); } -INSTANTIATE_TEST_CASE_P( - Cdm, WvCdmSessionSharingTest, - ::testing::Range(&session_sharing_sub_samples[0], - &session_sharing_sub_samples[6])); +INSTANTIATE_TEST_CASE_P(Cdm, WvCdmSessionSharingTest, + ::testing::Range(&session_sharing_sub_samples[0], + &session_sharing_sub_samples[6])); class WvCdmDecryptionTest : public WvCdmRequestLicenseTest, @@ -1475,8 +1536,8 @@ TEST_P(WvCdmDecryptionTest, DecryptionTest) { SubSampleInfo* data = GetParam(); decryptor_.OpenSession(g_key_system, NULL, &session_id_); if (data->retrieve_key) { - GenerateKeyRequest(g_key_system, g_key_id, kLicenseTypeStreaming); - VerifyKeyRequestResponse(g_license_server, g_client_auth, g_key_id, false); + GenerateKeyRequest(g_key_id, kLicenseTypeStreaming); + VerifyKeyRequestResponse(g_license_server, g_client_auth, false); } for (size_t i = 0; i < data->num_of_subsamples; i++) { @@ -1487,9 +1548,10 @@ TEST_P(WvCdmDecryptionTest, DecryptionTest) { (data + i)->block_offset, &decrypt_buffer[0]); decryption_parameters.is_encrypted = (data + i)->is_encrypted; decryption_parameters.is_secure = (data + i)->is_secure; - EXPECT_EQ(NO_ERROR, decryptor_.Decrypt(session_id_, - (data+i)->validate_key_id, - decryption_parameters)); + decryption_parameters.subsample_flags = (data + i)->subsample_flags; + EXPECT_EQ(NO_ERROR, + decryptor_.Decrypt(session_id_, (data + i)->validate_key_id, + decryption_parameters)); EXPECT_TRUE(std::equal((data + i)->decrypt_data.begin(), (data + i)->decrypt_data.end(), @@ -1498,12 +1560,12 @@ TEST_P(WvCdmDecryptionTest, DecryptionTest) { decryptor_.CloseSession(session_id_); } -INSTANTIATE_TEST_CASE_P( - Cdm, WvCdmDecryptionTest, - ::testing::Values(&clear_sub_sample, &clear_sub_sample_no_key, - &single_encrypted_sub_sample, - &switch_key_encrypted_sub_sample[0], - &partial_single_encrypted_sub_sample)); +INSTANTIATE_TEST_CASE_P(Cdm, WvCdmDecryptionTest, + ::testing::Values(&clear_sub_sample, + &clear_sub_sample_no_key, + &single_encrypted_sub_sample, + &switch_key_encrypted_sub_samples[0], + &partial_encrypted_sub_samples[0])); } // namespace wvcdm @@ -1652,7 +1714,6 @@ int main(int argc, char** argv) { g_key_id = wvcdm::a2bs_hex(g_key_id); g_config->set_license_server(g_license_server); g_config->set_port(g_port); - g_config->set_key_id(g_key_id); int status = RUN_ALL_TESTS(); delete g_config; diff --git a/libwvdrmengine/run_all_unit_tests.sh b/libwvdrmengine/run_all_unit_tests.sh index 06cbd224..5523b489 100755 --- a/libwvdrmengine/run_all_unit_tests.sh +++ b/libwvdrmengine/run_all_unit_tests.sh @@ -10,9 +10,6 @@ adb root && adb wait-for-device remount adb shell /system/bin/oemcrypto_test adb shell /system/bin/request_license_test -adb shell /system/bin/request_license_test -icp --gtest_filter=WvCdmRequestLicenseTest.DISABLED_PrivacyModeTest --gtest_also_run_disabled_tests -adb shell /system/bin/request_license_test -icp --gtest_filter=WvCdmRequestLicenseTest.DISABLED_PrivacyModeWithServiceCertificateTest --gtest_also_run_disabled_tests -adb shell /system/bin/request_license_test -icp --gtest_filter=WvCdmRequestLicenseTest.DISABLED_DecryptionKeyExpiredTest --gtest_also_run_disabled_tests adb shell /system/bin/policy_engine_unittest adb shell /system/bin/libwvdrmmediacrypto_test adb shell /system/bin/libwvdrmdrmplugin_test