diff --git a/example/test_ecmg_messages.h b/example/test_ecmg_messages.h new file mode 100644 index 0000000..36e4a77 --- /dev/null +++ b/example/test_ecmg_messages.h @@ -0,0 +1,203 @@ +//////////////////////////////////////////////////////////////////////////////// +// 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. +//////////////////////////////////////////////////////////////////////////////// + +// Example ECMG messages used in unit tests and example client. + +#ifndef MEDIA_CAS_PACKAGER_SDK_EXAMPLE_TEST_ECMG_MESSAGES_H_ +#define MEDIA_CAS_PACKAGER_SDK_EXAMPLE_TEST_ECMG_MESSAGES_H_ + +namespace widevine { +namespace cas { + +const char kTestChannelSetup[] = { + '\x03', // protocol_version + '\x00', '\x01', // message_type - Channel_setup + '\x00', '\x0e', // message_length + '\x00', '\x0e', // parameter_type - ECM_channel_id + '\x00', '\x02', // parameter_length + '\x00', '\x01', // parameter_value + '\x00', '\x01', // parameter_type- SUPER_CAS_ID + '\x00', '\x04', // parameter_length + '\x4a', '\xd4', '\x00', '\x00' // parameter_value +}; + +const char kTestChannelStatus[] = { + '\x03', // protocol_version + '\x00', '\x03', // message_type - Channel_status + '\x00', '\x39', // message_length + '\x00', '\x0e', // parameter_type - ECM_channel_id + '\x00', '\x02', // parameter_length + '\x00', '\x01', // parameter_value + '\x00', '\x02', // parameter_type - setion_TSpkt_flag + '\x00', '\x01', // parameter_length + '\x01', // parameter_value + '\x00', '\x03', // parameter_type - delay_start + '\x00', '\x02', // parameter_length + '\x00', '\xc8', // parameter_value + '\x00', '\x04', // parameter_type - delay_stop + '\x00', '\x02', // parameter_length + '\x00', '\xc8', // parameter_value + '\x00', '\x07', // parameter_type - ECM_rep_period + '\x00', '\x02', // parameter_length + '\x00', '\x64', // parameter_value + '\x00', '\x08', // parameter_type - max_streams + '\x00', '\x02', // parameter_length + '\x00', '\x00', // parameter_value + '\x00', '\x09', // parameter_type - min_CP_duration + '\x00', '\x02', // parameter_length + '\x00', '\x64', // parameter_value + '\x00', '\x0a', // parameter_type - lead_CW + '\x00', '\x01', // parameter_value + '\x01', // parameter_value + '\x00', '\x0b', // parameter_type - CW_per_msg + '\x00', '\x01', // parameter_length + '\x02', // parameter_value + '\x00', '\x0c', // parameter_type - max_comp_time + '\x00', '\x02', // parameter_length + '\x00', '\x64' // parameter_value +}; + +const char kTestStreamSetup[] = { + '\x03', // protocol_version + '\x01', '\x01', // message_type - Stream_setup + '\x00', '\x18', // message_length + '\x00', '\x0e', // parameter_type - ECM_channel_id + '\x00', '\x02', // parameter_length + '\x00', '\x01', // parameter_value + '\x00', '\x0f', // parameter_type - ECM_stream_id + '\x00', '\x02', // parameter_length + '\x00', '\x01', // parameter_value + '\x00', '\x19', // parameter_type - ECM_id + '\x00', '\x02', // parameter_length + '\x00', '\x02', // parameter_value + '\x00', '\x10', // parameter_type - nominal_CP_duration + '\x00', '\x02', // parameter_length + '\x00', '\x64' // parameter_value +}; + +const char kTestStreamStatus[] = { + '\x03', // protocol_version + '\x01', '\x03', // message_type - Stream_status + '\x00', '\x17', // message_length + '\x00', '\x0e', // parameter_type - ECM_channel_id + '\x00', '\x02', // parameter_length + '\x00', '\x01', // parameter_value + '\x00', '\x0f', // parameter_type - ECM_stream_id + '\x00', '\x02', // parameter_length + '\x00', '\x01', // parameter_value + '\x00', '\x19', // parameter_type - ECM_id + '\x00', '\x02', // parameter_length + '\x00', '\x02', // parameter_value + '\x00', '\x11', // parameter_type - access_criteria_transfer_mode + '\x00', '\x01', // parameter_length + '\x01' // parameter_value +}; + +const char kTestCwProvision[] = { + '\x03', // protocol_version + '\x02', '\x01', // message_type - CW_provision + '\x00', '\x44', // message_length + '\x00', '\x0e', // parameter_type - ECM_channel_id + '\x00', '\x02', // parameter_length + '\x00', '\x01', // parameter_value + '\x00', '\x0f', // parameter_type - ECM_stream_id + '\x00', '\x02', // parameter_length + '\x00', '\x01', // parameter_value + '\x00', '\x12', // parameter_type - CP_number + '\x00', '\x02', // parameter_length + '\x00', '\x00', // parameter_value + '\x00', '\x13', // parameter_type - CP_duration + '\x00', '\x02', // parameter_length + '\x00', '\x64', // parameter_value + '\x00', '\x14', // parameter_type - CP_CW_Combination + '\x00', '\x12', // parameter_length + '\x00', '\x00', // parameter_value - CP (2 bytes) then CW next (16 bytes) + '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07', + '\x08', '\x09', '\x0a', '\x0b', '\x0c', '\x0d', '\x0e', '\x0f', + '\x00', '\x14', // parameter_type - CP_CW_Combination + '\x00', '\x12', // parameter_length + '\x00', '\x01', // parameter_value - CP (2 bytes) then CW next (16 bytes) + '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17', + '\x18', '\x19', '\x1a', '\x1b', '\x1c', '\x1d', '\x1e', '\x1f'}; + +// CW is encrypted using hardcoded fixed entitlement key. +const char kTestEcmResponse[] = { + '\x03', // protocol_version + '\x02', '\x02', // message_type - ECM_response + '\x00', '\xd2', // message_length + '\x00', '\x0e', // parameter_type - ECM_channel_id + '\x00', '\x02', // parameter_length + '\x00', '\x01', // parameter_value + '\x00', '\x0f', // parameter_type - ECM_stream_id + '\x00', '\x02', // parameter_length + '\x00', '\x01', // parameter_value + '\x00', '\x12', // parameter_type - CP_number + '\x00', '\x02', // parameter_length + '\x00', '\x00', // parameter_value + '\x00', '\x15', // parameter_type - ECM_datagram + '\x00', '\xbc', // parameter_length + // parameter_value - ECM_datagram + '\x47', '\x40', '\x02', '\x10', '\x00', '\x80', '\x70', '\x95', '\x4a', + '\xd4', '\x01', '\x05', '\x80', '\x66', '\x61', '\x6b', '\x65', '\x5f', + '\x6b', '\x65', '\x79', '\x5f', '\x69', '\x64', '\x31', '\x2e', '\x2e', + '\x2e', '\x2e', '\xef', '\x40', '\x57', '\x48', '\xa7', '\xad', '\xdd', + '\x34', '\x73', '\xfe', '\x5d', '\x1c', '\x65', '\xa0', '\xbf', '\x93', + '\xfe', '\x01', '\x4b', '\x1d', '\xcd', '\x9e', '\x1d', '\x3a', '\x36', + '\x99', '\x8f', '\x47', '\xa1', '\x3b', '\x46', '\xf1', '\xde', '\x9e', + '\xc2', '\x88', '\xf8', '\x27', '\x2f', '\xea', '\xa1', '\x63', '\x9b', + '\x1b', '\x6a', '\x56', '\x2d', '\x26', '\x31', '\x32', '\x33', '\x34', + '\x35', '\x36', '\x37', '\x38', '\x66', '\x61', '\x6b', '\x65', '\x5f', + '\x6b', '\x65', '\x79', '\x5f', '\x69', '\x64', '\x32', '\x2e', '\x2e', + '\x2e', '\x2e', '\xf4', '\x71', '\x2a', '\x4b', '\x6d', '\x6d', '\x14', + '\x4d', '\x2e', '\x53', '\xe7', '\x4b', '\x9f', '\x4b', '\x0a', '\x34', + '\xb4', '\xfd', '\xbe', '\x86', '\x21', '\x35', '\x1e', '\xda', '\x81', + '\x89', '\x6f', '\x70', '\xd3', '\xd2', '\xb2', '\x79', '\xf2', '\xcd', + '\xeb', '\xc5', '\xaf', '\x89', '\xab', '\xeb', '\xf0', '\x1b', '\xd0', + '\xd3', '\xe9', '\x7d', '\x81', '\x8a', '\x31', '\x32', '\x33', '\x34', + '\x35', '\x36', '\x37', '\x38', '\xff', '\xff', '\xff', '\xff', '\xff', + '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', + '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', + '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff'}; + +const char kTestStreamCloseRequest[] = { + '\x03', // protocol_version + '\x01', '\x04', // message_type - Stream_close_request + '\x00', '\x0c', // message_length + '\x00', '\x0e', // parameter_type - ECM_channel_id + '\x00', '\x02', // parameter_length + '\x00', '\x01', // parameter_value + '\x00', '\x0f', // parameter_type - ECM_stream_id + '\x00', '\x02', // parameter_length + '\x00', '\x01' // parameter_value +}; + +const char kTestStreamCloseResponse[] = { + '\x03', // protocol_version + '\x01', '\x05', // message_type - Stream_close_response + '\x00', '\x0c', // message_length + '\x00', '\x0e', // parameter_type - ECM_channel_id + '\x00', '\x02', // parameter_length + '\x00', '\x01', // parameter_value + '\x00', '\x0f', // parameter_type - ECM_stream_id + '\x00', '\x02', // parameter_length + '\x00', '\x01' // parameter_value +}; + +const char kTestChannelClose[] = { + '\x03', // protocol_version + '\x00', '\x04', // message_type - Channel_close + '\x00', '\x06', // message_length + '\x00', '\x0e', // parameter_type - ECM_channel_id + '\x00', '\x02', // parameter_length + '\x00', '\x01' // parameter_value +}; + +} // namespace cas +} // namespace widevine + +#endif // MEDIA_CAS_PACKAGER_SDK_EXAMPLE_TEST_ECMG_MESSAGES_H_ diff --git a/example/wv_cas_ecm_example b/example/wv_cas_ecm_example index 279d8c6..46fac26 100644 Binary files a/example/wv_cas_ecm_example and b/example/wv_cas_ecm_example differ diff --git a/libmedia_cas_packager_sdk.so b/libmedia_cas_packager_sdk.so index f8e4cb8..7d94941 100755 Binary files a/libmedia_cas_packager_sdk.so and b/libmedia_cas_packager_sdk.so differ diff --git a/media_cas_packager_sdk/public/wv_cas_key_fetcher.h b/media_cas_packager_sdk/public/wv_cas_key_fetcher.h index 03eddec..f91dbd6 100644 --- a/media_cas_packager_sdk/public/wv_cas_key_fetcher.h +++ b/media_cas_packager_sdk/public/wv_cas_key_fetcher.h @@ -12,7 +12,6 @@ #include #include "gflags/gflags.h" -#include "common/status.h" #include "media_cas_packager_sdk/internal/key_fetcher.h" DECLARE_string(license_server); @@ -41,15 +40,15 @@ class WvCasKeyFetcher : public KeyFetcher { // |signed_response_string| a serialized SignedCasEncryptionResponse // message. It should be passed into // widevine::cas::Ecm::ProcessCasEncryptionResponse(). - virtual util::Status RequestEntitlementKey(const std::string& request_string, - std::string* signed_response_string); + Status RequestEntitlementKey(const std::string& request_string, + std::string* signed_response_string) override; protected: // Makes a HTTP request to License Server for entitlement key(s). // Returns the HTTP response in Json format in |http_response_json|. // Protected visibility to support unit testing. - virtual util::Status MakeHttpRequest(const std::string& signed_request_json, - std::string* http_response_json) const; + virtual Status MakeHttpRequest(const std::string& signed_request_json, + std::string* http_response_json) const; }; } // namespace cas diff --git a/media_cas_packager_sdk/public/wv_ecmg b/media_cas_packager_sdk/public/wv_ecmg new file mode 100644 index 0000000..bc2c38e Binary files /dev/null and b/media_cas_packager_sdk/public/wv_ecmg differ