diff --git a/example/wvpl_cas_proxy_environment_example.cc b/example/wvpl_cas_proxy_environment_example.cc index 70a7032..f8db5b7 100644 --- a/example/wvpl_cas_proxy_environment_example.cc +++ b/example/wvpl_cas_proxy_environment_example.cc @@ -13,12 +13,133 @@ #include #include "media_cas_proxy_sdk/external/common/wvpl/wvpl_cas_proxy_environment.h" +#include "media_cas_proxy_sdk/external/common/wvpl/wvpl_cas_proxy_session.h" -int main(int argc, char **argv) { +using widevine_server::wv_pl_sdk::WvPLCASProxySession; +using widevine_server::wv_pl_sdk::WvPLStatus; + +namespace { +const char kValidRequestFromCdm[] = + "080712b90b0a840b080112ed090aae02080212108b8832fb7921b3e65419c6112f96d1" + "ce18e4edd4e105228e023082010a0282010100a729e70e43515708819fe6c62f9fc26e" + "a9f2300bd5cca79131b46997cc2822a8479a58ea287b7dceada6b77290cd0df3f7a98b" + "d4e91907631bfc4065afe93b08f95a5799f7391252de6a3d0a0e502dc116c0e0853c87" + "5e5ebff843858c322f2c06017d423981a7a41070ff8eae0c2ac135491187eb227907b1" + "185ecb76cd3f26eb0259a3e6c177c35ade2c07aa243d29599e251a6ab4dbb9bea00112" + "7bd39765bd40a1bb23b883b10ab829adde17311b90295059570936f0ee5ec6bdaba0be" + "07adbff30505537c67f1004daf469e6d760024f6f07095687fde35a62651b504beeaca" + "79282ce83001a914fdd9eface7e6d15959abee536b3c4cb53e573b39128d0203010001" + "2899201280023231afb3b643ea7db3095fdca3fe8df49e299d2b19fe9da7ab5f286ef2" + "17a08226bd0d530e9683fbb78edecca7d8bc3f1f9ac03a53a8d48029c0f490a6af301b" + "da27316e5920409a5a889acba49539d1d92c0b784b181da114f3bb45edbc7bba7cddfa" + "6e599500e92f8c0dd11ecebebb80fec73273d5c620bf30b30c0be1a90f1b86ea913497" + "39d961b589ce1b1b83d31e135e489b752a32431ad1bd6e8b6986dbd0c98073872b5349" + "11fc8ebfa528c62f6969b6d4b5079a640b02fa5989cccac708d4130e4686020f8b50f9" + "ea38f82424293555f82fc920ad33f41398b532fe01e28b50f76d35349835328714969b" + "ab67f68eb3cc30aac5d271fff3e1b1c9621ab6050ab00208011210084d60bc65937db6" + "ac7f992b41ecf5f218a2d38a8c05228e023082010a0282010100991b357bb714decac1" + "e70eaa36d1d0834df24a3d10369f90a22734a3ad4aebccfc2432bdd6dcd1ffd75699ba" + "5608c4457972d27c47abcff8c88cd9900938260b8c85795327b2aef3a1db27e8b96203" + "9284d602c6a74c6a143a67be64a16a1c8f44fafadac242ceb6d8ade9c4d4542ebd3ee9" + "d2a0a71eb7a4ccf916e02f26793b0c13a4921c3eed49c5c96cd455598ede040ce472b0" + "15a9af3cda82c49792aa7f6bbfbf4667293b44ec7429c39a038911ce1fe462c35e95c2" + "64d363343c3adb944fa2aabdba0fb61c402797585f3dfb796f6ce1dcf3b79c9887be98" + "1470ecbcb048e59e564fc3ad2c4b860f70aa468fb66c4a2847eec755ade89bd6225740" + "c9a502030100012899203001128003212de141c13057c1987218dd7fbc2dc9f84c82f9" + "1f5b163d0370c7069387c70c90c3060f0504573c6e0bd3acb984fc3ab7b221a77d3733" + "324d670a9a5eea64691d5666a9b67dd367803cd5753bd75ea7239bec0c008297695771" + "ce203c60898d4f264ad55d3d01c96f66d6fb6c53d1928a60ad040d7d48e9c83d6849c2" + "48e45c0f95bbb8cd0b1feee4458c5c60ab0d52e1fb0f8ee98766af9cf93307578657e8" + "00f1a4ed3f6a00e8951b2158f45cfcc2f7e5e5cc3d7f04ea2be34aa8dd49ebd78c618c" + "1404e308257e502aac8df00d52a8985301bfe5e6e784d77b0bc52c935a8b183fb5afed" + "25a5855a77fcf2715c907611624a58b037d819857bab926bee4d560277089efb070fb3" + "f5385d1dde1e486d8f32d253de8692e3098e35b3192647e79544cf0fb28b362133e942" + "97781cf3f68960531667ee74e7026bd72137eb1ddd057834cf1dabe8d7069f88acb4b7" + "a402470f2801264bb49c3bfee24fc640a46374d6c10bc7d2b960792d11da5086ab8ccf" + "f46180c243c395d22f1a9e4f6b021a130a0c636f6d70616e795f6e616d651203777777" + "1a110a0a6d6f64656c5f6e616d6512037777771a200a0c70726f647563745f6e616d65" + "12105769646576696e6543617354657374731a260a116172636869746563747572655f" + "6e616d6512116172636869746563747572655f6e616d651a1a0a0b6465766963655f6e" + "616d65120b6465766963655f6e616d653202280e12200a1e0a1c1a0d7769646576696e" + "655f746573742209436173547346616b655802180120e4edd4e105301538d3a2fbfe02" + "1a80020570d7809a297c640bc56234cfea3687e747dcbf8e6cc326de6a1102fecc43ec" + "674c02e5c8d31109a1ac7f2cb52f44a6b2b410a6d2632bb841ead6437be510efa7c8a5" + "02de1e734e057b9ac65eec6361afaf3b71f074ff37428580067d856d4bfbecef170d11" + "d5cb631bcf31193a66156b06a16119d0d19381cd57cacb0aeb6b6e5b3e427c8117be13" + "7b662332a1a80f48e599675325b5b8afd4010f7850ba332fa78eaf0ddeef7086890cce" + "194631e3d205cb459a7e1ff11b54791ef394b74fb8a729d0104b00e17b9e05c5d42fac" + "923f98d43aedc70ab0733039eb22f35c6961e4587085a14c4a9ace1db00508843e79ee" + "ba68321b559fbdfdf04c88813cdd"; + +const char kWidevineTestProvider[] = "widevine_test"; + +static const char hex_value[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, + 0, // '0'..'9' + 0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 'A'..'F' + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, + 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 'a'..'f' + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +void a2b_hex(const char* a, char* b, int num) { + for (int i = 0; i < num; i++) { + b[i] = (hex_value[a[i * 2] & 0xFF] << 4) + (hex_value[a[i * 2 + 1] & 0xFF]); + } +} + +std::string a2b_hex(const std::string& a) { + int len = a.size(); + char* b = new char[len]; + a2b_hex(a.data(), b, len); + // Binary length is half ascii length plus one byte if ascii length is odd. + std::string s(b, len / 2 + ((len % 2) ? 1 : 0)); + delete[](b); + return s; +} +} // namespace + +int main(int argc, char** argv) { std::map config_values; + config_values["drm_certficate_type"] = "test"; + config_values["provider"] = kWidevineTestProvider; widevine_server::wv_pl_sdk::WvPLCASProxyEnvironment environment( config_values); - std::cout << "Hello world!" << std::endl; + WvPLStatus status = environment.Initialize(); + if (!status.ok()) { + std::cerr << "Environment failed to initialize. Exiting." << std::endl; + exit(status.error_code()); + } + std::cout << "Environment created and initialized" << std::endl; + WvPLCASProxySession* wvpl_cas_proxy_session = nullptr; + status = environment.CreateSession(a2b_hex(kValidRequestFromCdm), + &wvpl_cas_proxy_session); + if (!status.ok()) { + std::cerr << "Session creation failed. Exiting. Error code = " + << std::to_string(status.error_code()) << std::endl; + exit(status.error_code()); + } + std::cout << "Session created." << std::endl; + + std::string json_signed_cas_drm_request; + status = wvpl_cas_proxy_session->GenerateLicenseRequestAsJSON( + &json_signed_cas_drm_request); + if (!status.ok()) { + std::cerr << "Failed to generate license request. Exiting. Error code = " + << std::to_string(status.error_code()) << std::endl; + exit(status.error_code()); + } + std::cout + << "Request to POST over HTTP(s) to " + "https://license.uat.widevine.com/cas/getlicense/widevine_test = " + << json_signed_cas_drm_request << std::endl; return 0; } diff --git a/media_cas_proxy_sdk/external/common/wvpl/wvpl_cas_proxy_session.h b/media_cas_proxy_sdk/external/common/wvpl/wvpl_cas_proxy_session.h index 41af1a9..c938651 100644 --- a/media_cas_proxy_sdk/external/common/wvpl/wvpl_cas_proxy_session.h +++ b/media_cas_proxy_sdk/external/common/wvpl/wvpl_cas_proxy_session.h @@ -27,7 +27,7 @@ namespace wv_pl_sdk { constexpr uint32_t kMajorVersion = 1; constexpr uint32_t kMinorVersion = 1; -constexpr uint32_t kRelease = 2; +constexpr uint32_t kRelease = 3; /** * Models a session for Widevine CAS Proxy functionality for