//////////////////////////////////////////////////////////////////////////////// // Copyright 2018 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. //////////////////////////////////////////////////////////////////////////////// #include #include #include #include "common/status.h" #include "media_cas_packager_sdk/public/wv_cas_key_fetcher.h" const char kContentId[] = "21140844"; const char kContentProvider[] = "widevine"; const char kTrackType[] = "SD"; const bool kKeyRotation = false; const char kSigningProvider[] = "widevine_test"; const char kSingingKey[] = "1ae8ccd0e7985cc0b6203a55855a1034afc252980e970ca90e5202689f947ab9"; const char kSingingIv[] = "d58ce954203b7c9a9a9d467f59839249"; const char kHttpResponse[] = "{\"response\":" "\"eyJzdGF0dXMiOiJPSyIsImNvbnRlbnRfaWQiOiJNakV4TkRBNE5EUT0iLCJlbnRpdGxlbWVu" "dF9rZXlzIjpbeyJrZXlfaWQiOiJNUGFndXhNb1hNNkUxUzhEOUF3RkNBPT0iLCJrZXkiOiJoZ1" "JycmdqeUg4NjQycjY3VHd0OHJ1cU5MUGNMRmtKcWRVSUROdm5GZDBNPSIsInRyYWNrX3R5cGUi" "OiJTRCIsImtleV9zbG90IjoiU0lOR0xFIn1dfQ==\"}"; using widevine::Status; using widevine::cas::EntitlementKeyInfo; using widevine::cas::EntitlementRequestParams; using widevine::cas::WvCasKeyFetcher; class ExampleKeyFetcher : public WvCasKeyFetcher { public: ExampleKeyFetcher(const std::string& signing_provider, const std::string& signing_key, const std::string& signing_iv) : WvCasKeyFetcher(signing_provider, signing_key, signing_iv) {} // An example that always returns the same response. Status MakeHttpRequest(const std::string& signed_request_json, std::string* http_response_json) const override { *http_response_json = kHttpResponse; return widevine::OkStatus(); } }; int main(int argc, char** argv) { // Initialize key fetcher. ExampleKeyFetcher key_fetcher(kSigningProvider, kSingingKey, kSingingIv); // Create request string. std::string request_str; EntitlementRequestParams request_params; request_params.content_id = kContentId; request_params.content_provider = kContentProvider; request_params.track_types = {kTrackType}; request_params.key_rotation = kKeyRotation; Status status = key_fetcher.CreateEntitlementRequest(request_params, &request_str); if (!status.ok()) { std::cerr << "Failed to create entitlement request, error: " << status << std::endl; } std::cout << "Request: " << request_str << std::endl; // Request entitlement keys. std::string signed_response_str; status = key_fetcher.MakeHttpRequest(request_str, &signed_response_str); if (!status.ok()) { std::cerr << "Failed to request entitlement key, error: " << status << std::endl; } std::cout << "Response: " << signed_response_str << std::endl; // Parse entitlement key response. std::vector entitlements; status = key_fetcher.ParseEntitlementResponse(signed_response_str, &entitlements); if (!status.ok()) { std::cerr << "Failed to parse entitlement response, error: " << status << std::endl; } std::cout << "Parsed: " << entitlements.size() << " entitlement keys." << std::endl; return 0; }