//////////////////////////////////////////////////////////////////////////////// // Copyright 2019 Google LLC. // // This software is licensed under the terms defined in the Widevine Master // License Agreement. For a copy of this agreement, please contact // widevine-licensing@google.com. //////////////////////////////////////////////////////////////////////////////// // Example of usage of wvpl_cas_proxy_environment. #include #include #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" 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); 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; }