Move testing file which contains keysmith response to export/sdk/testing.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=221487408
This commit is contained in:
Widevine Buildbot
2018-11-14 22:21:12 +00:00
committed by Fang Yu
parent 6b4de78ce3
commit 57385ffb5e
9 changed files with 1620 additions and 0 deletions

View File

@@ -0,0 +1,132 @@
////////////////////////////////////////////////////////////////////////////////
// Copyright 2017 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.
////////////////////////////////////////////////////////////////////////////////
#ifndef SDK_EXTERNAL_COMMON_WVPL_WVPL_SDK_ENVIRONMENT_H_
#define SDK_EXTERNAL_COMMON_WVPL_WVPL_SDK_ENVIRONMENT_H_
#include <string>
#include "common/certificate_type.h"
#include "sdk/external/common/wvpl/wvpl_types.h"
#include "protos/public/device_certificate_status.pb.h"
#include "protos/public/provisioned_device_info.pb.h"
namespace widevine_server {
namespace wv_pl_sdk {
// These fields show the configuration options that can be initialized via
// the implementation classes (WvPLEnvironment and WvPLProxyEnvironment).
const char kDeviceCertificateExpiration[] = "device_certificate_expiration";
const char kAllowUnknownDevice[] = "allow_unknown_device";
const char kProvider[] = "provider";
const char kProviderIv[] = "provider_iv";
const char kProviderKey[] = "provider_key";
const char kApiVerInKcb[] = "api_ver_in_kcb";
const char kLimitUsageStatsToErrorsOnly[] = "limit_usage_stats_to_errors_only";
// Valid values are 'test' and 'prod'.
const char kDrmCertificateType[] = "drm_certificate_type";
/**
* Parent class of SDK environment. This class is not be instantiated directly,
* but its API can be accessed via the derived environment classes.
*/
class WvPLSDKEnvironment {
public:
virtual ~WvPLSDKEnvironment() {}
static void SetConfigValue(const std::map<std::string, std::string>& config_values);
// Generates a license response containing a message generated in response to
// an error condition. |create_session_status| is a previous error status
// returned by the CreateSession(). |license_response| points to a std::string to
// contain the license response and may not be NULL. This method returns true
// if there is an error license to be sent to the client, or false
// otherwise.
static bool GenerateErrorResponse(const WvPLStatus& create_session_status,
std::string* license_response);
/**
* Add a service certificate system-wide at the sdk. |service_certificate|
* is a Google-generated certificate used to authenticate the service
* provider. |service_private_key| is the encrypted PKCS#8 private RSA key
* corresponding to the service certificate. |service_private_key_passphrase|
* is the password required to decrypt |service_private_key|. This is a
* thread-safe call.
*
* @param service_certificate
* @param service_private_key
* @param service_private_key_passphrase
*
* @return WvPLStatus enumeration
*/
virtual WvPLStatus SetDrmServiceCertificate(
const std::string& service_certificate, const std::string& service_private_key,
const std::string& service_private_key_passphrase);
// Returns the DRM Root Certificate type. This would be a setting passed into
// the environment, by a derived class constructor.
virtual std::string GetDrmCertificateType() { return drm_certificate_type_; }
protected:
// Return the signature for the provider specified in the |config_values|
// parameter in the constructor. |signature| is owned by the caller.
static WvPLStatus GenerateSignature(const std::string& plain_text,
std::string* signature);
/**
* Insert or update provisionedDeviceInfoMap with device info in
* certificate_status_list.
*/
static WvPLStatus UpdateProvisionedDeviceInfoMap(
const widevine::DeviceCertificateStatusList&
certificate_status_list);
// Number of seconds until the certificate status list expires after its
// creation time. Default value is 604800 seconds.
uint32_t device_certificate_expiration_seconds_ = 604800;
// "config_values" setting for "kDrmCertificateType".
// Supported values are "test" and "prod". Default value is "prod".
std::string drm_certificate_type_ = "prod";
// name of the provider hosting this service.
std::string provider_;
// value of the "iv" specified for the provider.
std::string* provider_iv_;
// value of the "key" specified for the provider.
std::string* provider_key_;
static std::map<std::string, std::string>* config_values_;
// is_service_certificate_loaded_ is not thread safe.
bool is_service_certificate_loaded_ = false;
// If true, allow devices not in the certificate status list.
bool allow_unknown_device_ = false;
// DRM Certificate type.
widevine::CertificateType certificate_type_ =
widevine::kCertificateTypeProduction;
private:
/**
* Return provisioned_device_info if the device_info_map_ contains system_id.
*
* @return WvPLStatus - Status::OK if success, else error.
*/
static WvPLStatus LookupDeviceInfo(
uint32_t system_id,
widevine::ProvisionedDeviceInfo* provisioned_device_info);
/**
* Add a device to the current environment/session.
*/
static void AddDeviceInfo(
const widevine::ProvisionedDeviceInfo& provisioned_device_info);
static std::map<std::string, std::string>* GetConfigValue();
friend class WvPLSDKSession;
friend class WvPLProxySessionTest;
friend class WvPLSessionTest;
};
} // namespace wv_pl_sdk
} // namespace widevine_server
#endif // SDK_EXTERNAL_COMMON_WVPL_WVPL_SDK_ENVIRONMENT_H_

View File

@@ -0,0 +1,198 @@
////////////////////////////////////////////////////////////////////////////////
// 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.
////////////////////////////////////////////////////////////////////////////////
#ifndef SDK_EXTERNAL_COMMON_WVPL_WVPL_SDK_SESSION_H_
#define SDK_EXTERNAL_COMMON_WVPL_WVPL_SDK_SESSION_H_
#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 SessionInit;
}
namespace widevine_server {
namespace wv_pl_sdk {
class WvPLSDKSession {
public:
virtual ~WvPLSDKSession() = 0;
public:
// Add WvPLKey.
virtual WvPLStatus AddKey(const WvPLKey& key);
// Get the WvPLKey.
virtual const std::vector<WvPLKey>& key() const { return keys_; }
// Set the license policy.
virtual void set_policy(const WvPLPlaybackPolicy& policy) {
policy_ = policy;
}
// Get the license policy.
virtual const WvPLPlaybackPolicy& policy() const { return policy_; }
// Set the Session Init.
virtual void set_session_init(const WvPLSessionInit& session_init) {
session_init_ = session_init;
}
// Get the Session Init.
virtual const WvPLSessionInit& session_init() const { return session_init_; }
virtual bool IsChromeCDM() const;
/**
* Returns the Widevine PSSH data for the license request handled by this
* session.
*
* @param wvpl_widevine_pssh_data.
* @return WvPLStatus - Status::OK if success, else error.
*/
virtual WvPLStatus GetPsshData(
WvPLWidevinePsshData* wvpl_widevine_pssh_data) const;
/**
* Returns the ClientIdentification information for the license request
* handled by this session.
*
* @param client_info
* @return WvPLStatus - Status::OK if success, else error.
*/
virtual WvPLStatus GetClientInfo(WvPLClientInfo* client_info) const;
/**
* Returns the WvPL Client Capabilities information for the license request
* handled by this session.
*
* @param client_capabilities.
* @return WvPLStatus - Status::OK if success, else error.
*/
virtual WvPLStatus GetClientCapabilities(
WvPLClientCapabilities* client_capabilities) const;
/**
* Returns the WvPLDeviceInfo information for the license request
* handled by this session.
*
* @param device_info
* @return WvPLStatus - Status::OK if success, else error.
*/
virtual WvPLStatus GetDeviceInfo(WvPLDeviceInfo* device_info) const;
/**
* Returns the type of the message handled by this session.
*
* @return MessageType enumeration.
*/
virtual MessageType message_type() const;
virtual PlatformVerificationStatus VerifyPlatform() = 0;
virtual widevine::LicenseRequest::RequestType request_type() const {
return request_type_;
}
protected:
uint32_t system_id_ = 0xFFFFFFFF;
std::string user_agent_;
std::vector<WvPLKey> keys_;
WvPLPlaybackPolicy policy_;
WvPLSessionInit session_init_;
WvPLWidevinePsshData pssh_data_;
widevine::ClientIdentification client_id_;
bool has_pssh_data_ = false;
bool has_system_id_ = false;
bool has_client_id_ = false;
MessageType message_type_ = UNKNOWN;
PlatformVerificationStatus platform_verification_status_ =
PLATFORM_NO_VERIFICATION;
std::unique_ptr<widevine::SignedMessage>
signed_message_request_from_cdm_;
std::string license_request_from_cdm_;
std::string remote_attestation_cert_serial_number_;
std::unique_ptr<widevine::LicenseRequest> sdk_license_request_;
widevine::LicenseRequest::RequestType request_type_;
virtual WvPLStatus VerifyRemoteAttestation();
// Returns the WvPL Client Capabilities information for the license request
// handled by this session.
WvPLStatus GetWvPLClientCapabilities(
const widevine::ClientIdentification& client_id,
WvPLClientCapabilities* client_capabilities) const;
// Copies/translates the output protection from a WvPL Key into an SDK
// key container.
void CopyOutputProtection(
const WvPLKey& wvpl_key,
widevine::License_KeyContainer* sdk_key_container);
virtual void CopySecurityLevel(
const WvPLOutputProtection& output_protection, TrackType track_type,
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);
// 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);
// 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;
// Copy the WvPLSession Init into Session Init.
virtual void CopySessionInit(const WvPLSessionInit& wvpl_session_init,
widevine::SessionInit* session_init);
// Copy the WvPLDeviceInfo into ProvisionedDeviceInfo.
virtual void CopyProvisionedDeviceInfo(
const WvPLDeviceInfo& wvpl_device_info,
widevine::ProvisionedDeviceInfo* device_info);
// Populate deviceInfo, clientIdentification and psshdata for license request.
WvPLStatus ParseLicenseRequest();
// Copy the WvPLSessionState to SessionState.
void CopySessionState(const WvPLSessionState& wvpl_session_state,
widevine::SessionState* session_state);
private:
/**
* Parses WvPLWidevinePsshData in the new license request.
*
* @return WvPLStatus - Status::OK if success, else error.
*/
virtual WvPLStatus ParsePsshData(
WvPLWidevinePsshData* wvpl_widevine_pssh_data) const = 0;
};
} // namespace wv_pl_sdk
} // namespace widevine_server
#endif // SDK_EXTERNAL_COMMON_WVPL_WVPL_SDK_SESSION_H_

931
sdk/external/common/wvpl/wvpl_types.h vendored Normal file
View File

@@ -0,0 +1,931 @@
////////////////////////////////////////////////////////////////////////////////
// Copyright 2017 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.
////////////////////////////////////////////////////////////////////////////////
#ifndef SDK_EXTERNAL_COMMON_WVPL_WVPL_TYPES_H_
#define SDK_EXTERNAL_COMMON_WVPL_WVPL_TYPES_H_
#include <stdint.h>
#include <list>
#include <map>
#include <memory>
#include <vector>
#include "util/status.h"
// TODO(user) Split wvpl_types.h into wvpl_common_types.h ,
// wvpl_license_sdk_types.h, wvpl_proxy_sdk_types.h and
// wvpl_packager_sdk_types.h.
namespace widevine_server {
namespace wv_pl_sdk {
typedef widevine::util::Status WvPLStatus;
typedef uint32_t uint32_t;
typedef int64_t int64_t;
/**
* Represents the key type for the keys that are used when generating a license.
* The generated license includes a key container, which in turn, contains the
* key material, metadata and policy needed to use the key.
*/
enum KeyType {
UNKNOWN_KEY = 0,
// Key used to decrypt media content.
CONTENT = 1,
// Key used for wrapping content keys.
ENTITLEMENT = 2
};
enum LicenseType {
STREAMING = 1,
OFFLINE = 2,
};
/**
* Represents the type of message. This struct is used by Proxy SDK.
*/
enum MessageType {
UNKNOWN = 0,
LICENSE_REQUEST = 1,
SERVICE_CERTIFICATE_REQUEST = 4
};
enum CertificateKeyType {
RSA_2048 = 0,
RSA_3072 = 1,
};
enum PlatformVerificationStatus {
PLATFORM_UNVERIFIED = 0,
PLATFORM_TAMPERED = 1,
PLATFORM_SOFTWARE_VERIFIED = 2,
PLATFORM_HARDWARE_VERIFIED = 3,
PLATFORM_NO_VERIFICATION = 4,
PLATFORM_SECURE_STORAGE_SOFTWARE_VERIFIED = 5
};
// LINT.IfChange
enum HDCP {
HDCP_NONE = 0,
HDCP_V1 = 1,
HDCP_V2 = 2,
HDCP_V2_1 = 3,
HDCP_V2_2 = 4,
HDCP_V2_3 = 5,
HDCP_NO_DIGITAL_OUTPUT = 0xff
};
enum SecurityLevel {
SECURITY_LEVEL_UNDEFINED = 0,
SW_SECURE_CRYPTO = 1,
SW_SECURE_DECODE = 2,
HW_SECURE_CRYPTO = 3,
HW_SECURE_DECODE = 4,
HW_SECURE_ALL = 5
};
enum DeviceSecurityLevel {
DEVICE_LEVEL_UNSPECIFIED = 0,
DEVICE_LEVEL_1 = 1,
DEVICE_LEVEL_2 = 2,
DEVICE_LEVEL_3 = 3
};
enum CGMS {
CGMS_NONE = 42,
COPY_FREE = 0,
COPY_ONCE = 2,
COPY_NEVER = 3,
};
enum TrackType {
TRACK_TYPE_UNSPECIFIED = 0,
AUDIO = 1,
VIDEO_SD = 2,
VIDEO_HD = 3,
VIDEO_UHD1 = 4,
VIDEO_UHD2 = 5,
};
enum AnalogOutputCapabilities {
ANALOG_OUTPUT_UNKNOWN = 0,
ANALOG_OUTPUT_NONE = 1,
ANALOG_OUTPUT_SUPPORTED = 2,
ANALOG_OUTPUT_SUPPORTS_CGMS_A = 3,
};
struct WvPLPlaybackPolicy {
WvPLPlaybackPolicy() {
license_duration_seconds_ = 0;
playback_duration_seconds_ = 0;
renewal_interval_seconds_ = 0;
renewal_recovery_duration_seconds_ = 0;
renewal_retry_interval_seconds_ = 0;
can_play_ = true;
can_renew_ = false;
can_persist_ = false;
}
void set_license_duration_seconds(uint32_t duration) {
license_duration_seconds_ = duration;
}
uint32_t license_duration_seconds() const { return license_duration_seconds_; }
void set_playback_duration_seconds(uint32_t duration) {
playback_duration_seconds_ = duration;
}
uint32_t playback_duration_seconds() const {
return playback_duration_seconds_;
}
void set_renewal_interval_seconds(uint32_t duration) {
renewal_interval_seconds_ = duration;
}
uint32_t renewal_interval_seconds() const { return renewal_interval_seconds_; }
void set_renewal_recovery_duration_seconds(int64_t dur) {
renewal_recovery_duration_seconds_ = dur;
}
int64_t renewal_recovery_duration_seconds() const {
return renewal_recovery_duration_seconds_;
}
void set_renewal_retry_interval_seconds(int64_t retry_interval) {
renewal_retry_interval_seconds_ = retry_interval;
}
int64_t renewal_retry_interval_seconds() const {
return renewal_retry_interval_seconds_;
}
void set_renew_with_usage(bool usage_flag) { renew_with_usage_ = usage_flag; }
bool renew_with_usage() const { return renew_with_usage_; }
void set_renewal_url(const std::string& url) { renewal_url_ = url; }
const std::string& renewal_url() const { return renewal_url_; }
void set_can_play(bool play_flag) { can_play_ = play_flag; }
bool can_play() const { return can_play_; }
void set_can_persist(bool persist_flag) { can_persist_ = persist_flag; }
bool can_persist() const { return can_persist_; }
void set_can_renew(bool renew_flag) { can_renew_ = renew_flag; }
bool can_renew() const { return can_renew_; }
// The license window. Once a license is granted, the number of seconds to use
// this license. Default is 0, indicating unlimited license.
uint32_t license_duration_seconds_;
// The playback window. Once initial playback starts, the number of seconds
// to use the license. Default is 0, indicating unlimited but not to exceed
// the license_duration_window.
uint32_t playback_duration_seconds_;
// How many seconds after license_start_time, before renewal is first
// attempted.
uint32_t renewal_interval_seconds_;
// The window of time, in which playback is allowed to continue while
// renewal is attempted, yet unsuccessful due to backend problems with
// the license server.
int64_t renewal_recovery_duration_seconds_;
// Specifies the delay in seconds between subsequent license
// renewal requests, in case of failure.
int64_t renewal_retry_interval_seconds_;
// Indicates that the license shall be sent for renewal when usage is
// started.
bool renew_with_usage_;
// Renewal requests are sent to this URL.
std::string renewal_url_;
// Indicates that playback of ths content is allowed.
bool can_play_;
// Indicates that the license may be persisted to non-volatile storage for
// offline use.
bool can_persist_;
// Indicates that renewal of this license is allowed.
bool can_renew_;
};
/**
* LicenseIdentification is propagated from LicenseRequest to License,
* incrementing version with each iteration.
* */
struct LicenseIdentification {
LicenseIdentification() {
version_ = 0;
type_ = STREAMING;
}
// |request_id| must be specified in bytes.
void set_request_id(const std::string& request_id) {
request_id_ = request_id;
}
const std::string& request_id() { return request_id_; }
// |session_id| must be specified in bytes.
void set_session_id(const std::string& session_id) {
session_id_ = session_id;
}
const std::string& session_id() { return session_id_; }
// |purchase_id| must be specified in bytes.
void set_purchase_id(const std::string& purchase_id) {
purchase_id_ = purchase_id;
}
const std::string& purchase_id() { return purchase_id_; }
void set_type(LicenseType type) { type_ = type; }
LicenseType type() { return type_; }
uint32_t version() { return version_; }
void set_version(uint32_t version) { version_ = version; }
// |provider_session_token| must be specified in bytes.
void set_provider_session_token(const std::string& provider_session_token) {
provider_session_token_ = provider_session_token;
}
const std::string& provider_session_token() {
return provider_session_token_;
}
// License request id.
std::string request_id_; // NOLINT
// Session identifier for license request.
std::string session_id_; // NOLINT
// Session token for the session. This token is for use by the license
// provider, and is akin to a session cookie. It will be copied to
// LicenseIdentfication::provider_session_token, and sent back in all
std::string provider_session_token_; // NOLINT
// Purchase identifier.
std::string purchase_id_; // NOLINT
// Type of the license, default value is Streaming.
LicenseType type_; // NOLINT
// Version of license request.
uint32_t version_; // NOLINT
};
/**
* This message is used by the server to preserve and restore session state.
* */
struct WvPLSessionState {
WvPLSessionState() {
keybox_system_id_ = 0;
license_counter_ = 0;
}
void set_license_id(const LicenseIdentification& license_id) {
license_id_ = license_id;
}
const LicenseIdentification& license_id() const { return license_id_; }
LicenseIdentification* mutable_license_id() { return &license_id_; }
const std::string& signing_key() const { return signing_key_; }
// |signing_key| must be specified in bytes.
void set_signing_key(const std::string& signing_key) {
signing_key_ = signing_key;
}
uint32_t keybox_system_id() const { return keybox_system_id_; }
void set_keybox_system_id(uint32_t keybox_system_id) {
keybox_system_id_ = keybox_system_id;
}
uint32_t license_counter() const { return license_counter_; }
void set_license_counter(uint32_t license_counter) {
license_counter_ = license_counter;
}
const std::string& provider_client_token() const {
return provider_client_token_;
}
// |provider_client_token| must be specified in bytes.
void set_provider_client_token(const std::string& provider_client_token) {
provider_client_token_ = provider_client_token;
}
// License information propagated from license request to the license.
LicenseIdentification license_id_; // NOLINT
// Provider client token sent back in the license.
std::string provider_client_token_; // NOLINT
// Signing_key should be 512 bits in length to be split into two
// (server || client) HMAC-SHA256 keys.
std::string signing_key_; // NOLINT
// System_id in keybox.
uint32_t keybox_system_id_; // NOLINT
// License counter associated with the |provider_client_token|.
uint32_t license_counter_; // NOLINT
};
struct WvPLVideoResolutionConstraint {
WvPLVideoResolutionConstraint() {
min_resolution_pixels_ = 0;
max_resolution_pixels_ = 0;
hdcp_ = HDCP_NONE;
}
void set_min_resolution_pixels(uint32_t pixels) {
min_resolution_pixels_ = pixels;
}
void set_max_resolution_pixels(uint32_t pixels) {
max_resolution_pixels_ = pixels;
}
void set_hdcp(HDCP hdcp_value) { hdcp_ = hdcp_value; }
HDCP hdcp() const { return hdcp_; }
uint32_t min_resolution_pixels() const { return min_resolution_pixels_; }
uint32_t max_resolution_pixels() const { return max_resolution_pixels_; }
// Minimum and maximum video resolutions in the range (height x width).
uint32_t min_resolution_pixels_;
uint32_t max_resolution_pixels_;
// Optional output protection requirements for this range. If not
// specified, the output protection in WvPLKey applies.
HDCP hdcp_;
};
struct WvPLOutputProtection {
WvPLOutputProtection() {
hdcp_ = HDCP_NONE;
secure_data_path_ = false;
security_level_ = SECURITY_LEVEL_UNDEFINED;
disable_analog_output_ = false;
disable_digital_output_ = false;
cgms_ = CGMS_NONE;
}
void set_hdcp(HDCP hdcp_value) { hdcp_ = hdcp_value; }
HDCP hdcp() const { return hdcp_; }
// Setting true indicates security_level is HW_SECURE_ALL, otherwise the
// default is false which maps to security_level of SW_SECURE_CRYPTO. This
// value is ignored if security_level is set directly.
void set_secure_data_path(bool secure_flag) {
secure_data_path_ = secure_flag;
}
bool secure_data_path() const { return secure_data_path_; }
// Setting security_level directly takes precedence over setting the
// |secure_data_path|. For most applications, there is no need to set the
// security_level directly. Using |secure_data_path| is sufficient.
void set_security_level(SecurityLevel level) { security_level_ = level; }
SecurityLevel security_level() const { return security_level_; }
// Set to true to disable analog output.
void set_disable_analog_output(bool flag) { disable_analog_output_ = flag; }
bool disable_analog_output() const { return disable_analog_output_; }
// Set to true to disable digital output.
void set_disable_digital_output(bool flag) { disable_digital_output_ = flag; }
bool disable_digital_output() const { return disable_digital_output_; }
// CGMS-A setting
void set_cgms(CGMS cgms_value) { cgms_ = cgms_value; }
CGMS cgms() const { return cgms_; }
// Indicates whether HDCP is required on digital outputs. Default is None.
HDCP hdcp_;
// Crypto operations and handling of the media must be performed within a
// hardware backed trusted environment. Default is false.
bool secure_data_path_;
// Security level robustness defined by Widevine. Default is UNDEFINED in
// which case secure_data_path_ is used. If secure_data_path_ is false,
// security_level_ is set to SW_SECURE_CRYPTO. If secure_data_path_ is
// true, security_level_ is set to HW_SECURE_ALL;
SecurityLevel security_level_;
// Set to disable analog output.
bool disable_analog_output_;
// Set to disable digital output.
bool disable_digital_output_;
// CGMS-A analog output.
CGMS cgms_;
};
struct WvPLKey {
WvPLKey() {}
// |key_id| must be specified in bytes.
void set_key_id(const std::string& key_id) { key_id_ = key_id; }
const std::string& key_id() const { return key_id_; }
// |key_bytes| must be specified in bytes.
void set_key_bytes(const std::string& key_bytes) { key_bytes_ = key_bytes; }
const std::string& key_bytes() const { return key_bytes_; }
void set_output_protection(const WvPLOutputProtection& out_prot) {
output_protection_ = out_prot;
}
void set_requested_output_protection(const WvPLOutputProtection& out_prot) {
requested_output_protection_ = out_prot;
}
const WvPLOutputProtection& output_protection() const {
return output_protection_;
}
const WvPLOutputProtection& requested_output_protection() const {
return requested_output_protection_;
}
WvPLOutputProtection* mutable_output_protection() {
return &output_protection_;
}
WvPLOutputProtection* mutable_requested_output_protection() {
return &requested_output_protection_;
}
const std::vector<WvPLVideoResolutionConstraint>
video_resolution_constraints() const {
return video_resolution_constraints_;
}
void AddVideoResolutionConstraint(
const WvPLVideoResolutionConstraint& constraint) {
video_resolution_constraints_.push_back(constraint);
}
void set_track_type(const TrackType track_type) { track_type_ = track_type; }
TrackType track_type() const { return track_type_; }
void set_key_type(const KeyType key_type) { key_type_ = key_type; }
KeyType key_type() const { return key_type_; }
std::string key_id_;
std::string key_bytes_;
WvPLOutputProtection output_protection_;
WvPLOutputProtection requested_output_protection_;
// If the video resolution of the content being decrypted/decoded falls
// within one of the specified ranges, the optional output protections may
// be applied.
std::vector<WvPLVideoResolutionConstraint> video_resolution_constraints_;
TrackType track_type_ = TRACK_TYPE_UNSPECIFIED;
KeyType key_type_ = CONTENT;
};
struct WvPLDeviceInfo {
WvPLDeviceInfo() {
security_level_ = DEVICE_LEVEL_UNSPECIFIED;
system_id_ = 0;
test_device_ = false;
}
void set_system_id(uint32_t system_id) { system_id_ = system_id; }
uint32_t system_id() const { return system_id_; }
void set_soc(const std::string& soc) { soc_ = soc; }
const std::string& soc() const { return soc_; }
void set_manufacturer(const std::string& manufacturer) {
manufacturer_ = manufacturer;
}
const std::string& manufacturer() const { return manufacturer_; }
void set_model(const std::string& model) { model_ = model; }
const std::string& model() const { return model_; }
void set_device_type(const std::string& device_type) {
device_type_ = device_type;
}
const std::string& device_type() const { return device_type_; }
void set_security_level(DeviceSecurityLevel level) {
security_level_ = level;
}
DeviceSecurityLevel security_level() const { return security_level_; }
void set_test_device(bool test_device) { test_device_ = test_device; }
bool test_device() const { return test_device_; }
void set_serial_number(const std::string& serial_number) {
serial_number_ = serial_number;
}
const std::string& serial_number() const { return serial_number_; }
void set_service_id(const std::string& service_id) {
service_id_ = service_id;
}
const std::string& service_id() const { return service_id_; }
// Widevine system ID for this device family.
uint32_t system_id_;
// Name of system-on-a-chip.
std::string soc_;
// Name of manufacturer.
std::string manufacturer_;
// Manufacturer's model name.
std::string model_;
// Type of device (Phone, Tablet, TV, etc).
std::string device_type_;
// Widevine-defined security level.
DeviceSecurityLevel security_level_;
// True if the certificate corresponds to a test (non production) device.
bool test_device_;
// 128-bit globally unique serial number of certificate.
std::string serial_number_;
// Service identifier (web origin) for the provider which owns the
// certificate.
std::string service_id_;
};
// This message is used to hold usage data for each Widevine system Id.
struct WvPLLicenseStatusCounterData {
// Initialize members
WvPLLicenseStatusCounterData() : license_status_(0), status_count_(0) {}
uint32_t license_status_;
// Count of occurences of the above status;
uint32_t status_count_;
};
// This message is used to hold usage data for each device model.
struct WvPLDeviceModelCounterData {
std::string device_model_;
// Key is each status we returned associated with the above model;
std::map<uint32_t, WvPLLicenseStatusCounterData> status_map_;
};
// This message is used to hold usage data for each device make.
struct WvPLDeviceMakeCounterData {
std::string device_make_;
// Key is each model associated with this device make.
std::map<std::string, WvPLDeviceModelCounterData> model_map_;
};
// This message is used to hold usage data for each Widevine system Id.
struct WvPLSystemIdCounterData {
// Initialize members
WvPLSystemIdCounterData() : system_id_(0) {}
uint32_t system_id_;
// Key is each make we handled associated with the above system Id.
std::map<std::string, WvPLDeviceMakeCounterData> make_map_;
};
// This top level message contains aggregated usage data for license requests.
struct WvPLCounterData {
// Initialize members
WvPLCounterData() : start_time_utc_(0), end_time_utc_(0) {}
// Time of the first license in this structure, represented as seconds since
// Unix epoch.
time_t start_time_utc_;
// Time of the last license in this structure, represented as seconds since
// Unix epoch.
time_t end_time_utc_;
// Key is each system Id we handled.
std::map<uint32_t, WvPLSystemIdCounterData> system_id_map_;
};
struct WvPLSessionInit {
WvPLSessionInit()
: license_start_time_(0), override_provider_client_token_(false) {}
// Accessors
void set_session_id(const std::string& session_id) {
session_id_ = session_id;
}
std::string session_id() const { return session_id_; }
void set_purchase_id(const std::string& purchase_id) {
purchase_id_ = purchase_id;
}
std::string purchase_id() const { return purchase_id_; }
void set_master_signing_key(const std::string& master_signing_key) {
master_signing_key_ = master_signing_key;
}
std::string master_signing_key() const { return master_signing_key_; }
void set_license_start_time(const int64_t license_start_time) {
license_start_time_ = license_start_time;
}
int64_t license_start_time() const { return license_start_time_; }
void set_provider_client_token(const std::string& provider_client_token) {
provider_client_token_ = provider_client_token;
}
std::string provider_client_token() const { return provider_client_token_; }
void set_provider_session_token(const std::string& provider_session_token) {
provider_session_token_ = provider_session_token;
}
std::string provider_session_token() const { return provider_session_token_; }
void set_override_provider_client_token(bool override_provider_client_token) {
override_provider_client_token_ = override_provider_client_token;
}
bool override_provider_client_token() const {
return override_provider_client_token_;
}
// Identifier for the session.
std::string session_id_;
// Identifier for the purchased content.
std::string purchase_id_;
// Master signing key should be 128 bits in length.
std::string master_signing_key_;
// signing_key should be 512 bits in length to be split into two
// (server || client) HMAC-SHA256 keys.
std::string signing_key_;
// The reference time in UTC as calculated by the client clock.
int64_t license_start_time_;
// Client token for the session.
std::string provider_client_token_;
// Session token for the session.
std::string provider_session_token_;
// If false and the license request contains a |provider_client_token_|,
// use the token from that request even if |provider_client_token_| is
// specified.
// If true and the license request contains a |provider_client_token_|,
// use |provider_client_token_|.
bool override_provider_client_token_;
};
struct WvPLClientCapabilities {
WvPLClientCapabilities() {}
// Accessors
void set_client_token(bool client_token) { client_token_ = client_token; }
bool client_token() const { return client_token_; }
void set_session_token(bool session_token) { session_token_ = session_token; }
bool session_token() const { return session_token_; }
void set_video_resolution_constraints(bool video_resolution_constraints) {
video_resolution_constraints_ = video_resolution_constraints;
}
bool video_resolution_constraints() const {
return video_resolution_constraints_;
}
void set_max_hdcp_version(HDCP max_hdcp_version) {
max_hdcp_version_ = max_hdcp_version;
}
HDCP max_hdcp_version() const { return max_hdcp_version_; }
void set_oem_crypto_api_version(uint32_t oem_crypto_api_version) {
oem_crypto_api_version_ = oem_crypto_api_version;
}
uint32_t oem_crypto_api_version() const { return oem_crypto_api_version_; }
void set_anti_rollback_usage_table(bool anti_rollback_usage_table) {
anti_rollback_usage_table_ = anti_rollback_usage_table;
}
bool anti_rollback_usage_table() const { return anti_rollback_usage_table_; }
void set_srm_version(uint32_t srm_version) { srm_version_ = srm_version; }
uint32_t srm_version() const { return srm_version_; }
void set_can_update_srm(bool can_update_srm) {
can_update_srm_ = can_update_srm;
}
bool can_update_srm() const { return can_update_srm_; }
void add_supported_certificate_key_type(const CertificateKeyType key_type) {
supported_certificate_key_type_.push_back(key_type);
}
const std::list<CertificateKeyType> supported_certificate_key_type() const {
return supported_certificate_key_type_;
}
void set_analog_output_capabilities(
const AnalogOutputCapabilities analog_output_capabilities) {
analog_output_capabilities_ = analog_output_capabilities;
}
const AnalogOutputCapabilities analog_output_capabilities() const {
return analog_output_capabilities_;
}
void set_can_disable_analog_output(bool can_disable_analog_output) {
can_disable_analog_output_ = can_disable_analog_output;
}
bool can_disable_analog_output() const { return can_disable_analog_output_; }
// Member variables
// Client token generated by the content provider.
bool client_token_ = false;
// A token associated with the client session.
bool session_token_ = false;
// Video resolution constraints. If the video resolution of the
// content being decrypted/decoded falls within one of the specified ranges,
// the required_protections may be applied. Otherwise an error will be
// reported.
// NOTE: Use of this feature is not recommended, as it is only supported on
// a small number of platforms.
bool video_resolution_constraints_ = false;
// The max "High-bandwidth Digital Content Protection" (HDCP) version
// supported by the client.
HDCP max_hdcp_version_ = HDCP_NONE;
// The OEM Crypto API version supported by the client.
uint32_t oem_crypto_api_version_;
// Flag to indicate the key must only be used if the client
// supports anti rollback of the user table. Content provider can query the
// client capabilities to determine if the client support this feature.
bool anti_rollback_usage_table_ = false;
// The client shall report |srm_version| if available.
uint32_t srm_version_;
// A device may have SRM data, and report a version, but may not be capable
// of updating SRM data.
bool can_update_srm_ = false;
// A list of CertificateKeyTypes.
std::list<CertificateKeyType> supported_certificate_key_type_;
// Analog capabilities of the device.
AnalogOutputCapabilities analog_output_capabilities_ = ANALOG_OUTPUT_UNKNOWN;
// Indicates if the device can disable it's analog output.
bool can_disable_analog_output_ = false;
};
/**
* Represents the Client Identification information. In the License Proxy
* SDK, this structure is populated as a result of parsing the license
* request from the CDM. This struct is used by Proxy SDK.
*/
struct WvPLClientInfo {
WvPLClientInfo()
: max_hdcp_version_(HDCP_NONE),
oem_crypto_api_version_(0),
analog_output_capabilities_(ANALOG_OUTPUT_UNKNOWN),
can_disable_analog_output_(false) {}
// Accessors
void set_max_hdcp_version(HDCP max_hdcp_version) {
max_hdcp_version_ = max_hdcp_version;
}
HDCP max_hdcp_version() const { return max_hdcp_version_; }
void set_oem_crypto_api_version(uint32_t oem_crypto_api_version) {
oem_crypto_api_version_ = oem_crypto_api_version;
}
uint32_t oem_crypto_api_version() const { return oem_crypto_api_version_; }
void set_provider_client_token(const std::string& provider_client_token) {
provider_client_token_ = provider_client_token;
}
const std::string& provider_client_token() const {
return provider_client_token_;
}
void set_cdm_version(const std::string& cdm_version) {
cdm_version_ = cdm_version;
}
const std::string& cdm_version() const { return cdm_version_; }
void set_name_value(const std::string& name, const std::string& value) {
names_values_.insert(std::make_pair(name, value));
}
const std::map<std::string, std::string>& names_values() {
return names_values_;
}
void set_analog_output_capabilities(AnalogOutputCapabilities capability) {
analog_output_capabilities_ = capability;
}
const AnalogOutputCapabilities analog_output_capabilities() const {
return analog_output_capabilities_;
}
void set_can_disable_analog_output(bool can_disable) {
can_disable_analog_output_ = can_disable;
}
bool can_disable_analog_output() const { return can_disable_analog_output_; }
const WvPLClientCapabilities client_capabilities() const {
return client_capabilities_;
}
void set_client_capabilities(
const WvPLClientCapabilities& client_capabilities) {
client_capabilities_ = client_capabilities;
}
// Member variables
// The max "High-bandwidth Digital Content Protection" (HDCP) version
// supported by the device.
HDCP max_hdcp_version_;
// The OEM Crypto API version supported by the client.
uint32_t oem_crypto_api_version_;
// The client CDM version.
std::string cdm_version_;
// The client token generated by the content provider.
std::string provider_client_token_;
// Map of other fields specified as name-value pairs representing the
// client.
std::map<std::string, std::string> names_values_;
// Analog capabilities of the device.
AnalogOutputCapabilities analog_output_capabilities_;
// Indicates if the device can disable it's analog output.
bool can_disable_analog_output_;
// Capabilities which not all clients may support. Used for the license
// exchange protocol only.
WvPLClientCapabilities client_capabilities_;
};
struct WvPLEntitledKey {
WvPLEntitledKey() {}
// Accessors.
void set_entitlement_key_id(const std::string& entitlement_key_id) {
entitlement_key_id_ = entitlement_key_id;
}
const std::string& entitlement_key_id() const { return entitlement_key_id_; }
void set_key_id(const std::string& key_id) { key_id_ = key_id; }
const std::string& key_id() const { return key_id_; }
void set_key_bytes(const std::string& key_bytes) { key_bytes_ = key_bytes; }
const std::string& key_bytes() const { return key_bytes_; }
void set_entitlement_key_iv(const std::string& entitlement_key_iv) {
entitlement_key_iv_ = entitlement_key_iv;
}
const std::string& entitlement_key_iv() const { return entitlement_key_iv_; }
void set_entitlement_key_size_bytes(uint32_t entitlement_key_size_bytes) {
entitlement_key_size_bytes_ = entitlement_key_size_bytes;
}
uint32_t entitlement_key_size_bytes() const {
return entitlement_key_size_bytes_;
}
// Member variables.
// ID of entitlement key used for wrapping |key|.
std::string entitlement_key_id_;
// ID of the entitled key.
std::string key_id_;
// Wrapped key.
std::string key_bytes_;
// IV used for wrapping |key|.
std::string entitlement_key_iv_;
// Size of entitlement key used for wrapping |key|.
uint32_t entitlement_key_size_bytes_ = 32;
};
/*
* Defines the 'pssh' box for Common Encryption (CENC).
*/
struct WvPLWidevinePsshData {
WvPLWidevinePsshData() {}
// Accessors
void set_content_id(const std::string& content_id) {
content_id_ = content_id;
}
const std::string content_id() const { return content_id_; }
void set_key_id(const std::string& key_id) { key_ids_.push_back(key_id); }
const std::list<std::string>& key_ids() const { return key_ids_; }
void add_entitled_key(const WvPLEntitledKey& entitled_key) {
entitled_keys_.push_back(entitled_key);
}
const std::list<WvPLEntitledKey>& entitled_keys() const {
return entitled_keys_;
}
// Member variables
// A list of key identifiers, for entitlement keys or content keys.
std::list<std::string> key_ids_;
// The content identifier.
std::string content_id_;
// A list of wrapped keys.
std::list<WvPLEntitledKey> entitled_keys_;
};
} // namespace wv_pl_sdk
} // namespace widevine_server
#endif // SDK_EXTERNAL_COMMON_WVPL_WVPL_TYPES_H_