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