diff --git a/media_cas_proxy_sdk/external/common/wvpl/BUILD b/media_cas_proxy_sdk/external/common/wvpl/BUILD index 182b9a4..7435064 100644 --- a/media_cas_proxy_sdk/external/common/wvpl/BUILD +++ b/media_cas_proxy_sdk/external/common/wvpl/BUILD @@ -12,6 +12,12 @@ package( default_visibility = ["//visibility:public"], ) +# Defines the common copts for cc_library targets. The main option here is +# -fvisibility=default, which exports symbols from the public APIs in the shared +# library. +# Note that the shared library should be built with -fvisibility=hidden. +PUBLIC_COPTS = ["-fvisibility=default"] + filegroup( name = "binary_release_files", srcs = glob(["*.h"]), @@ -44,6 +50,7 @@ cc_library( hdrs = [ "wvpl_cas_proxy_session.h", ], + copts = PUBLIC_COPTS, deps = [ "//base", "@abseil_repo//absl/strings", @@ -62,6 +69,7 @@ cc_library( "wvpl_cas_proxy_environment.h", "wvpl_cas_proxy_session.h", ], + copts = PUBLIC_COPTS, deps = [ "//base", "@abseil_repo//absl/strings", diff --git a/sdk/external/common/wvpl/wvpl_sdk_session.cc b/sdk/external/common/wvpl/wvpl_sdk_session.cc index 2a0e9e3..d86b17d 100644 --- a/sdk/external/common/wvpl/wvpl_sdk_session.cc +++ b/sdk/external/common/wvpl/wvpl_sdk_session.cc @@ -18,8 +18,10 @@ #include "license_server_sdk/internal/parse_content_id.h" #include "sdk/external/common/wvpl/wvpl_sdk_environment.h" #include "sdk/external/common/wvpl/wvpl_types.h" +#include "protos/public/client_identification.pb.h" #include "protos/public/errors.pb.h" #include "protos/public/license_protocol.pb.h" +#include "protos/public/license_server_sdk.pb.h" #include "protos/public/provisioned_device_info.pb.h" #include "protos/public/widevine_pssh.pb.h" @@ -58,6 +60,74 @@ namespace error = widevine::error; namespace widevine_server { namespace wv_pl_sdk { +namespace { +// Copy the |hdcp_value| into the client_capabilities. +void CopyHDCPToClientCapabilities( + widevine::ClientIdentification::ClientCapabilities::HdcpVersion + hdcp_value, + WvPLClientCapabilities* client_capabilities) { + DCHECK(client_capabilities); + if (!client_capabilities) { + return; + } + switch (hdcp_value) { + case ClientIdentification::ClientCapabilities::HDCP_NONE: + client_capabilities->set_max_hdcp_version(HDCP_NONE); + break; + case ClientIdentification::ClientCapabilities::HDCP_V1: + client_capabilities->set_max_hdcp_version(HDCP_V1); + break; + case ClientIdentification::ClientCapabilities::HDCP_V2: + client_capabilities->set_max_hdcp_version(HDCP_V2); + break; + case ClientIdentification::ClientCapabilities::HDCP_V2_1: + client_capabilities->set_max_hdcp_version(HDCP_V2_1); + break; + case ClientIdentification::ClientCapabilities::HDCP_V2_2: + client_capabilities->set_max_hdcp_version(HDCP_V2_2); + break; + case ClientIdentification::ClientCapabilities::HDCP_V2_3: + client_capabilities->set_max_hdcp_version(HDCP_V2_3); + break; + case ClientIdentification::ClientCapabilities::HDCP_NO_DIGITAL_OUTPUT: + client_capabilities->set_max_hdcp_version(HDCP_NO_DIGITAL_OUTPUT); + break; + default: + break; + } +} + +// Copy the |analog_output_capabilities| into the client_capabilities. +void CopyAnalogOutputCapabilities( + widevine::ClientIdentification::ClientCapabilities:: + AnalogOutputCapabilities analog_output_capabilities, + WvPLClientCapabilities* client_capabilities) { + DCHECK(client_capabilities); + if (!client_capabilities) { + return; + } + switch (analog_output_capabilities) { + case ClientIdentification::ClientCapabilities::ANALOG_OUTPUT_UNKNOWN: + client_capabilities->set_analog_output_capabilities( + ANALOG_OUTPUT_UNKNOWN); + break; + case ClientIdentification::ClientCapabilities::ANALOG_OUTPUT_NONE: + client_capabilities->set_analog_output_capabilities(ANALOG_OUTPUT_NONE); + break; + case ClientIdentification::ClientCapabilities::ANALOG_OUTPUT_SUPPORTED: + client_capabilities->set_analog_output_capabilities( + ANALOG_OUTPUT_SUPPORTED); + break; + case ClientIdentification::ClientCapabilities:: + ANALOG_OUTPUT_SUPPORTS_CGMS_A: + client_capabilities->set_analog_output_capabilities( + ANALOG_OUTPUT_SUPPORTS_CGMS_A); + break; + default: + break; + } +} +} // namespace WvPLSDKSession::WvPLSDKSession(const DrmRootCertificate* drm_root_certificate) : drm_root_certificate_(drm_root_certificate) {} @@ -244,70 +314,6 @@ void WvPLSDKSession::CopyHDCP( } } -void WvPLSDKSession::CopyHDCPToClientCapabilities( - ClientIdentification::ClientCapabilities::HdcpVersion hdcp_value, - WvPLClientCapabilities* client_capabilities) const { - DCHECK(client_capabilities); - if (!client_capabilities) { - return; - } - switch (hdcp_value) { - case ClientIdentification::ClientCapabilities::HDCP_NONE: - client_capabilities->set_max_hdcp_version(HDCP_NONE); - break; - case ClientIdentification::ClientCapabilities::HDCP_V1: - client_capabilities->set_max_hdcp_version(HDCP_V1); - break; - case ClientIdentification::ClientCapabilities::HDCP_V2: - client_capabilities->set_max_hdcp_version(HDCP_V2); - break; - case ClientIdentification::ClientCapabilities::HDCP_V2_1: - client_capabilities->set_max_hdcp_version(HDCP_V2_1); - break; - case ClientIdentification::ClientCapabilities::HDCP_V2_2: - client_capabilities->set_max_hdcp_version(HDCP_V2_2); - break; - case ClientIdentification::ClientCapabilities::HDCP_V2_3: - client_capabilities->set_max_hdcp_version(HDCP_V2_3); - break; - case ClientIdentification::ClientCapabilities::HDCP_NO_DIGITAL_OUTPUT: - client_capabilities->set_max_hdcp_version(HDCP_NO_DIGITAL_OUTPUT); - break; - default: - break; - } -} - -void WvPLSDKSession::CopyAnalogOutputCapabilities( - ClientIdentification::ClientCapabilities::AnalogOutputCapabilities - analog_output_capabilities, - WvPLClientCapabilities* client_capabilities) const { - DCHECK(client_capabilities); - if (!client_capabilities) { - return; - } - switch (analog_output_capabilities) { - case ClientIdentification::ClientCapabilities::ANALOG_OUTPUT_UNKNOWN: - client_capabilities->set_analog_output_capabilities( - ANALOG_OUTPUT_UNKNOWN); - break; - case ClientIdentification::ClientCapabilities::ANALOG_OUTPUT_NONE: - client_capabilities->set_analog_output_capabilities(ANALOG_OUTPUT_NONE); - break; - case ClientIdentification::ClientCapabilities::ANALOG_OUTPUT_SUPPORTED: - client_capabilities->set_analog_output_capabilities( - ANALOG_OUTPUT_SUPPORTED); - break; - case ClientIdentification::ClientCapabilities:: - ANALOG_OUTPUT_SUPPORTS_CGMS_A: - client_capabilities->set_analog_output_capabilities( - ANALOG_OUTPUT_SUPPORTS_CGMS_A); - break; - default: - break; - } -} - void WvPLSDKSession::CopyOutputProtection( const WvPLKey& wvpl_key, License::KeyContainer* sdk_key_container) { DCHECK(sdk_key_container); @@ -477,11 +483,13 @@ WvPLStatus WvPLSDKSession::ParseLicenseRequest() { "are both specified in the license request"); } if (sdk_license_request_->has_client_id()) { - client_id_ = sdk_license_request_->client_id(); + client_id_ = absl::make_unique( + sdk_license_request_->client_id()); has_client_id_ = true; } else if (sdk_license_request_->has_encrypted_client_id()) { + client_id_ = absl::make_unique(); if (!DrmServiceCertificate::DecryptClientIdentification( - sdk_license_request_->encrypted_client_id(), &client_id_) + sdk_license_request_->encrypted_client_id(), client_id_.get()) .ok()) { return WvPLStatus( error_space, @@ -491,10 +499,10 @@ WvPLStatus WvPLSDKSession::ParseLicenseRequest() { } has_client_id_ = true; } - if (client_id_.has_token() && - client_id_.type() == ClientIdentification::KEYBOX) { + if (client_id_->has_token() && + client_id_->type() == ClientIdentification::KEYBOX) { // Get system_id from token field in ClientIdentification. - SetSystemId(KeyboxClientCert::GetSystemId(client_id_.token())); + SetSystemId(KeyboxClientCert::GetSystemId(client_id_->token())); } if (!HasSystemId()) { ClientCert* client_cert_ptr = nullptr; @@ -518,7 +526,8 @@ WvPLStatus WvPLSDKSession::ParseLicenseRequest() { has_pssh_data_ = true; } } - request_type_ = sdk_license_request_->type(); + request_type_ = + static_cast(sdk_license_request_->type()); } return OkStatus(); } @@ -542,7 +551,7 @@ WvPLStatus WvPLSDKSession::GetClientInfo(WvPLClientInfo* client_info) const { error_space, widevine::MISSING_CLIENT_ID, "ClientIdentification is not found in the license request"); } - switch (client_id_.client_capabilities().max_hdcp_version()) { + switch (client_id_->client_capabilities().max_hdcp_version()) { case ClientIdentification::ClientCapabilities::HDCP_NONE: client_info->set_max_hdcp_version(HDCP_NONE); break; @@ -567,14 +576,14 @@ WvPLStatus WvPLSDKSession::GetClientInfo(WvPLClientInfo* client_info) const { default: break; } - if (client_id_.client_capabilities().has_oem_crypto_api_version()) { + if (client_id_->client_capabilities().has_oem_crypto_api_version()) { client_info->set_oem_crypto_api_version( - client_id_.client_capabilities().oem_crypto_api_version()); + client_id_->client_capabilities().oem_crypto_api_version()); } - if (client_id_.has_provider_client_token()) { - client_info->set_provider_client_token(client_id_.provider_client_token()); + if (client_id_->has_provider_client_token()) { + client_info->set_provider_client_token(client_id_->provider_client_token()); } - for (const auto& name_value : client_id_.client_info()) { + for (const auto& name_value : client_id_->client_info()) { client_info->set_name_value(name_value.name(), name_value.value()); } WvPLClientCapabilities client_capabilities; @@ -614,7 +623,7 @@ WvPLStatus WvPLSDKSession::GetClientCapabilities( error_space, widevine::MISSING_CLIENT_ID, "ClientIdentification is not found in the license request"); } - status = GetWvPLClientCapabilities(client_id_, client_capabilities); + status = GetWvPLClientCapabilities(*client_id_, client_capabilities); return status; } @@ -691,7 +700,7 @@ WvPLStatus WvPLSDKSession::GetPsshData( return WvPLStatus(error_space, error::INVALID_ARGUMENT, "sdk_license_request_ is null"); } - if (request_type() == LicenseRequest::NEW) { + if (request_type() == LicenseRequestType::NEW) { ContentInfo content_info; WvPLStatus status = widevine::ParseContentId( sdk_license_request_->content_id(), &content_info); diff --git a/sdk/external/common/wvpl/wvpl_sdk_session.h b/sdk/external/common/wvpl/wvpl_sdk_session.h index 8cf5d19..8b9c285 100644 --- a/sdk/external/common/wvpl/wvpl_sdk_session.h +++ b/sdk/external/common/wvpl/wvpl_sdk_session.h @@ -11,15 +11,18 @@ #include #include "sdk/external/common/wvpl/wvpl_types.h" -#include "protos/public/client_identification.pb.h" -#include "protos/public/device_certificate_status.pb.h" -#include "protos/public/license_protocol.pb.h" -#include "protos/public/license_server_sdk.pb.h" -#include "protos/public/provisioned_device_info.pb.h" namespace widevine { +class ClientIdentification; class DrmRootCertificate; +class LicenseRequest; +class License_KeyContainer_OutputProtection; +class License_KeyContainer; +class License_Policy; +class ProvisionedDeviceInfo; class SessionInit; +class SessionState; +class SignedMessage; } // namespace widevine namespace widevine_server { namespace wv_pl_sdk { @@ -28,7 +31,7 @@ class WvPLSDKSession { public: explicit WvPLSDKSession( const widevine::DrmRootCertificate* drm_root_certificate); - virtual ~WvPLSDKSession() = 0; + virtual ~WvPLSDKSession(); public: // Add WvPLKey. @@ -101,9 +104,7 @@ class WvPLSDKSession { virtual PlatformVerificationStatus VerifyPlatform() = 0; - virtual widevine::LicenseRequest::RequestType request_type() const { - return request_type_; - } + virtual LicenseRequestType request_type() const { return request_type_; } /** * Returns true if the license type is offline, otherwise return false. @@ -119,7 +120,7 @@ class WvPLSDKSession { WvPLPlaybackPolicy policy_; WvPLSessionInit session_init_; WvPLWidevinePsshData pssh_data_; - widevine::ClientIdentification client_id_; + std::unique_ptr client_id_; bool has_pssh_data_ = false; bool has_client_id_ = false; MessageType message_type_ = UNKNOWN; @@ -130,7 +131,7 @@ class WvPLSDKSession { std::string license_request_from_cdm_; std::string remote_attestation_cert_serial_number_; std::unique_ptr sdk_license_request_; - widevine::LicenseRequest::RequestType request_type_; + LicenseRequestType request_type_; virtual WvPLStatus VerifyRemoteAttestation(); // Returns the WvPL Client Capabilities information for the license request @@ -146,35 +147,23 @@ class WvPLSDKSession { widevine::License_KeyContainer* sdk_key_container); virtual void CopySecurityLevel( const WvPLOutputProtection& output_protection, TrackType track_type, - widevine::License::KeyContainer* key_container); + widevine::License_KeyContainer* key_container); // Copies/translates the policy from a WvPL policy into an SDK policy. A // helper function for GenerateLicenseRequestAsJSON. virtual void CopyPlaybackPolicy(const WvPLPlaybackPolicy& wvpl_policy, - widevine::License::Policy* sdk_policy); + widevine::License_Policy* sdk_policy); // Copy the |cgms_value| into the key container. A helper function for // GenerateLicenseRequestAsJSON. - virtual void CopyCGMS(CGMS cgms_value, - widevine::License::KeyContainer::OutputProtection* - output_protection); + virtual void CopyCGMS( + CGMS cgms_value, + widevine::License_KeyContainer_OutputProtection* output_protection); // Copy the |hdcp_value| into the key container. - virtual void CopyHDCP(HDCP hdcp_value, - widevine::License::KeyContainer::OutputProtection* - output_protection); - - // Copy the |hdcp_value| into the client_capabilities. - virtual void CopyHDCPToClientCapabilities( - widevine::ClientIdentification::ClientCapabilities::HdcpVersion - hdcp_value, - WvPLClientCapabilities* client_capabilities) const; - - // Copy the |analog_output_capabilities| into the client_capabilities. - virtual void CopyAnalogOutputCapabilities( - widevine::ClientIdentification::ClientCapabilities:: - AnalogOutputCapabilities analog_output_capabilities, - WvPLClientCapabilities* client_capabilities) const; + virtual void CopyHDCP( + HDCP hdcp_value, + widevine::License_KeyContainer_OutputProtection* output_protection); // Copy the WvPLSession Init into Session Init. virtual void CopySessionInit(const WvPLSessionInit& wvpl_session_init, diff --git a/sdk/external/common/wvpl/wvpl_types.h b/sdk/external/common/wvpl/wvpl_types.h index 0431ea6..1f3a7aa 100644 --- a/sdk/external/common/wvpl/wvpl_types.h +++ b/sdk/external/common/wvpl/wvpl_types.h @@ -59,6 +59,13 @@ enum CertificateKeyType { RSA_3072 = 1, }; +enum LicenseRequestType { + REQUEST_TYPE_UNSPECIFIED = 0, + NEW = 1, + RENEWAL = 2, + RELEASE = 3, +}; + enum PlatformVerificationStatus { PLATFORM_UNVERIFIED = 0, PLATFORM_TAMPERED = 1,