Adds support for specifying service type when creating a service certificate.
A recent change to the SDK allows for service certificates (DrmCertificate) to also specify a ServiceType indicating which type of service they are supposed to be used on. This CL adds certificate creation service support for this.
-------------
Fix typo in cas proxy SDK.
-------------
Migrate C++ proto_library rules to cc_proto_library.
We update dependency edges of cc_* rules on proto_library() rules to use a cc_proto_library() intermediary in preparation for eliminating proto_library()'s cc support as per []
More information: []
Tested:
TAP --sample for global presubmit queue
[]
-------------
Migrate cc proto_library to cc_proto_library. Also fixes build break introduced by []
-------------
Remove unnecessary #MOE directives
-------------
[Proxy_SDK] Move generateSignature in WvPLSDKEnvironment to signature_util.cc file.
-------------
[SDK]Add service_certificate type check in WVPL LSDK and PROXY SDK.
-------------
[Proxy_SDK] Add new API to get remote_attestation_cert_serial_number for proxy SDK.
-------------
[Proxy_SDK] Add getDrmDeviceId function
-------------
[Proxy_SDK] add getrequesttype function for proxy sdk
-------------
[SDK] Add videoFeature field to WvPLWidevinePsshData in WvPLWidevine.java and wvpl_type.h. Related to []
-------------
Allow specified devices to request licenses even if these devices are in TEST_ONLY state.
This will also override the global setting of TEST_ONLY devices not being allowed to
successfully receive licenses from Widevine License SDK.
-------------
[Proxy_SDK] Add ParseDCSL function and test case.
-------------
[Proxy_SDK] Return non-ok status for service_certificate_request when create proxy sdk session. Add test case in Java test.
-------------
[Proxy_SDK] Add video_feature parsing in GetPsshData function. Also check video_feature when geneateModularDrmLicenseRequest.
-------------
[SDK]Deprecated message_type() function, use request_type() instead.
-------------
Use JDK instead of JRE
The concept of a JRE is going away in JDK 11. The jre/ subdirectory in the JDK will no longer exist and the :jre targets will no longer make sense.
Currently in JDK 8, the JDK is a superset of the JRE (it contains all of the files in the JRE), so this is a safe change.
Tested:
TAP found no affected targets
[]
-------------
Renaming WvPLSDKSession.request_type() API.
Added LICENSE_TYPE_UNSPECIFIED enumeration to WvPLLicenseType.
-------------
Additional VLOG messaging for licensing with TEST_ONLY devices.
-------------
Remove forward declarations of absl names. The style guide bans this, and those names are not for external users to redeclare. External users should include the public headers instead.
-------------
Change Kokoro to use latest bazel version
-------------
Update the abseil build to the December 18 release.
This fixes a problem where the MOE build is failing because there was no definition for node_hash_map.
-------------
[CAS_Proxy]Add WvPLCASProxyEnvironmentJNI.cc and com_google_video_widevine_sdk_wvpl_WvPLCASProxyEnvironment.h file to implement JNI layer for WvPLCASProxyEnvironment.
-------------
Apply changes to sdk to match device certificate status list updates.
Cleans up some of the protos we're using for the new SignedDeviceInfo. Also, adjusts the sdk implementation to reflect the proto and service changes.
-------------
[CAS_PROXY]Add WvPLCASProxyEnvironment.java, WvPLCASProxySession.java and WvPLCASProxyTest.java file.
-------------
Add API to return the DRM service certificate by provider.
-------------
[CAS_PROXY]Implement SetDrmServiceCertificate and SetDeviceCertificateStatusList JNI layer.
-------------
Get DeviceInfo from request.
-------------
CAS Proxy SDK updated to 1.1.5.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=248640225
420 lines
16 KiB
Protocol Buffer
420 lines
16 KiB
Protocol Buffer
////////////////////////////////////////////////////////////////////////////////
|
|
// Copyright 2016 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.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Description:
|
|
// Definitions of the protocol buffer messages used in the Widevine license
|
|
// exchange protocol, described in Widevine license exchange protocol document
|
|
// TODO(user): find out a right way to strip out all the doc link.
|
|
|
|
syntax = "proto2";
|
|
|
|
package widevine;
|
|
|
|
import "protos/public/client_identification.proto";
|
|
import "protos/public/remote_attestation.proto";
|
|
|
|
option java_package = "com.google.video.widevine.protos";
|
|
|
|
// option optimize_for = LITE_RUNTIME;
|
|
enum LicenseType {
|
|
STREAMING = 1;
|
|
OFFLINE = 2;
|
|
}
|
|
|
|
enum PlatformVerificationStatus {
|
|
// The platform is not verified.
|
|
PLATFORM_UNVERIFIED = 0;
|
|
// Tampering detected on the platform.
|
|
PLATFORM_TAMPERED = 1;
|
|
// The platform has been verified by means of software.
|
|
PLATFORM_SOFTWARE_VERIFIED = 2;
|
|
// The platform has been verified by means of hardware (e.g. secure boot).
|
|
PLATFORM_HARDWARE_VERIFIED = 3;
|
|
// Platform verification was not performed.
|
|
PLATFORM_NO_VERIFICATION = 4;
|
|
// Platform and secure storage capability have been verified by means of
|
|
// software.
|
|
PLATFORM_SECURE_STORAGE_SOFTWARE_VERIFIED = 5;
|
|
}
|
|
|
|
// LicenseIdentification is propagated from LicenseRequest to License,
|
|
// incrementing version with each iteration.
|
|
message LicenseIdentification {
|
|
optional bytes request_id = 1;
|
|
optional bytes session_id = 2;
|
|
optional bytes purchase_id = 3;
|
|
optional LicenseType type = 4;
|
|
optional int32 version = 5;
|
|
optional bytes provider_session_token = 6;
|
|
}
|
|
|
|
message License {
|
|
// LINT.IfChange
|
|
message Policy {
|
|
// Indicates that playback of the content is allowed.
|
|
optional bool can_play = 1 [default = false];
|
|
|
|
// Indicates that the license may be persisted to non-volatile
|
|
// storage for offline use.
|
|
optional bool can_persist = 2 [default = false];
|
|
|
|
// Indicates that renewal of this license is allowed.
|
|
optional bool can_renew = 3 [default = false];
|
|
|
|
// For the |*duration*| fields, playback must halt when
|
|
// license_start_time (seconds since the epoch (UTC)) +
|
|
// license_duration_seconds is exceeded. A value of 0
|
|
// indicates that there is no limit to the duration.
|
|
|
|
// Indicates the rental window.
|
|
optional int64 rental_duration_seconds = 4 [default = 0];
|
|
|
|
// Indicates the viewing window, once playback has begun.
|
|
optional int64 playback_duration_seconds = 5 [default = 0];
|
|
|
|
// Indicates the time window for this specific license.
|
|
optional int64 license_duration_seconds = 6 [default = 0];
|
|
|
|
// The |renewal*| fields only apply if |can_renew| is true.
|
|
|
|
// 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.
|
|
optional int64 renewal_recovery_duration_seconds = 7 [default = 0];
|
|
|
|
// All renewal requests for this license shall be directed to the
|
|
// specified URL.
|
|
optional string renewal_server_url = 8;
|
|
|
|
// How many seconds after license_start_time, before renewal is first
|
|
// attempted.
|
|
optional int64 renewal_delay_seconds = 9 [default = 0];
|
|
|
|
// Specifies the delay in seconds between subsequent license
|
|
// renewal requests, in case of failure.
|
|
optional int64 renewal_retry_interval_seconds = 10 [default = 0];
|
|
|
|
// Indicates that the license shall be sent for renewal when usage is
|
|
// started.
|
|
optional bool renew_with_usage = 11 [default = false];
|
|
|
|
// Indicates to client that license renewal and release requests ought to
|
|
// include ClientIdentification (client_id).
|
|
optional bool always_include_client_id = 12 [default = false];
|
|
|
|
// Duration of grace period before playback_duration_seconds (short window)
|
|
// goes into effect. Optional.
|
|
optional int64 play_start_grace_period_seconds = 13 [default = 0];
|
|
|
|
// Enables "soft enforcement" of playback_duration_seconds, letting the user
|
|
// finish playback even if short window expires. Optional.
|
|
optional bool soft_enforce_playback_duration = 14 [default = false];
|
|
}
|
|
|
|
message KeyContainer {
|
|
enum KeyType {
|
|
SIGNING = 1; // Exactly one key of this type must appear.
|
|
CONTENT = 2; // Content key.
|
|
KEY_CONTROL = 3; // Key control block for license renewals. No key.
|
|
OPERATOR_SESSION = 4; // wrapped keys for auxiliary crypto operations.
|
|
ENTITLEMENT = 5; // Entitlement keys.
|
|
OEM_CONTENT = 6; // Partner-specific content key.
|
|
}
|
|
|
|
// The SecurityLevel enumeration allows the server to communicate the level
|
|
// of robustness required by the client, in order to use the key.
|
|
enum SecurityLevel {
|
|
// Software-based whitebox crypto is required.
|
|
SW_SECURE_CRYPTO = 1;
|
|
|
|
// Software crypto and an obfuscated decoder is required.
|
|
SW_SECURE_DECODE = 2;
|
|
|
|
// The key material and crypto operations must be performed within a
|
|
// hardware backed trusted execution environment.
|
|
HW_SECURE_CRYPTO = 3;
|
|
|
|
// The crypto and decoding of content must be performed within a hardware
|
|
// backed trusted execution environment.
|
|
HW_SECURE_DECODE = 4;
|
|
|
|
// The crypto, decoding and all handling of the media (compressed and
|
|
// uncompressed) must be handled within a hardware backed trusted
|
|
// execution environment.
|
|
HW_SECURE_ALL = 5;
|
|
}
|
|
|
|
message KeyControl {
|
|
// If present, the key control must be communicated to the secure
|
|
// environment prior to any usage. This message is automatically generated
|
|
// by the Widevine License Server SDK.
|
|
optional bytes key_control_block = 1;
|
|
optional bytes iv = 2;
|
|
}
|
|
|
|
message OutputProtection {
|
|
// Indicates whether HDCP is required on digital outputs, and which
|
|
// version should be used.
|
|
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;
|
|
}
|
|
optional HDCP hdcp = 1 [default = HDCP_NONE];
|
|
|
|
// Indicate the CGMS setting to be inserted on analog output.
|
|
enum CGMS {
|
|
CGMS_NONE = 42;
|
|
COPY_FREE = 0;
|
|
COPY_ONCE = 2;
|
|
COPY_NEVER = 3;
|
|
}
|
|
optional CGMS cgms_flags = 2 [default = CGMS_NONE];
|
|
|
|
enum HdcpSrmRule {
|
|
HDCP_SRM_RULE_NONE = 0;
|
|
// In 'required_protection', this means most current SRM is required.
|
|
// Update the SRM on the device. If update cannot happen,
|
|
// do not allow the key.
|
|
// In 'requested_protection', this means most current SRM is requested.
|
|
// Update the SRM on the device. If update cannot happen,
|
|
// allow use of the key anyway.
|
|
CURRENT_SRM = 1;
|
|
}
|
|
optional HdcpSrmRule hdcp_srm_rule = 3 [default = HDCP_SRM_RULE_NONE];
|
|
// Optional requirement to indicate analog output is not allowed.
|
|
optional bool disable_analog_output = 4 [default = false];
|
|
// Optional requirement to indicate digital output is not allowed.
|
|
optional bool disable_digital_output = 5 [default = false];
|
|
}
|
|
|
|
message VideoResolutionConstraint {
|
|
// Minimum and maximum video resolutions in the range (height x width).
|
|
optional uint32 min_resolution_pixels = 1;
|
|
optional uint32 max_resolution_pixels = 2;
|
|
// Optional output protection requirements for this range. If not
|
|
// specified, the OutputProtection in the KeyContainer applies.
|
|
optional OutputProtection required_protection = 3;
|
|
}
|
|
|
|
message OperatorSessionKeyPermissions {
|
|
// Permissions/key usage flags for operator service keys
|
|
// (type = OPERATOR_SESSION).
|
|
optional bool allow_encrypt = 1 [default = false];
|
|
optional bool allow_decrypt = 2 [default = false];
|
|
optional bool allow_sign = 3 [default = false];
|
|
optional bool allow_signature_verify = 4 [default = false];
|
|
}
|
|
|
|
optional bytes id = 1;
|
|
optional bytes iv = 2;
|
|
optional bytes key = 3;
|
|
optional KeyType type = 4;
|
|
optional SecurityLevel level = 5 [default = SW_SECURE_CRYPTO];
|
|
optional OutputProtection required_protection = 6;
|
|
// NOTE: Use of requested_protection is not recommended as it is only
|
|
// supported on a small number of platforms.
|
|
optional OutputProtection requested_protection = 7;
|
|
optional KeyControl key_control = 8;
|
|
optional OperatorSessionKeyPermissions operator_session_key_permissions = 9;
|
|
// Optional video resolution constraints. If the video resolution of the
|
|
// content being decrypted/decoded falls within one of the specified ranges,
|
|
// the optional 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.
|
|
repeated VideoResolutionConstraint video_resolution_constraints = 10;
|
|
// Optional 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.
|
|
optional bool anti_rollback_usage_table = 11 [default = false];
|
|
// Optional not limited to commonly known track types such as SD, HD.
|
|
// It can be some provider defined label to identify the track.
|
|
optional string track_label = 12;
|
|
}
|
|
|
|
optional LicenseIdentification id = 1;
|
|
optional Policy policy = 2;
|
|
repeated KeyContainer key = 3;
|
|
// Time of the request in seconds (UTC) as set in
|
|
// LicenseRequest.request_time. If this time is not set in the request,
|
|
// the local time at the license service is used in this field.
|
|
optional int64 license_start_time = 4;
|
|
// TODO(b/65054419): Deprecate remote_attestation_verified in favor of
|
|
// platform_verification_status, below.
|
|
optional bool remote_attestation_verified = 5 [default = false];
|
|
// Client token generated by the content provider. Optional.
|
|
optional bytes provider_client_token = 6;
|
|
// 4cc code specifying the CENC protection scheme as defined in the CENC 3.0
|
|
// specification. Propagated from Widevine PSSH box. Optional.
|
|
optional uint32 protection_scheme = 7;
|
|
// 8 byte verification field "HDCPDATA" followed by unsigned 32 bit minimum
|
|
// HDCP SRM version (whether the version is for HDCP1 SRM or HDCP2 SRM
|
|
// depends on client max_hdcp_version).
|
|
optional bytes srm_requirement = 8;
|
|
// If present this contains a signed SRM file (either HDCP1 SRM or HDCP2 SRM
|
|
// depending on client max_hdcp_version) that should be installed on the
|
|
// client device.
|
|
optional bytes srm_update = 9;
|
|
// Indicates the status of any type of platform verification performed by the
|
|
// server.
|
|
optional PlatformVerificationStatus platform_verification_status = 10
|
|
[default = PLATFORM_NO_VERIFICATION];
|
|
// IDs of the groups for which keys are delivered in this license, if any.
|
|
repeated bytes group_ids = 11;
|
|
}
|
|
|
|
enum ProtocolVersion {
|
|
VERSION_2_0 = 20;
|
|
VERSION_2_1 = 21;
|
|
VERSION_2_2 = 22;
|
|
}
|
|
|
|
message LicenseRequest {
|
|
message ContentIdentification {
|
|
message WidevinePsshData {
|
|
repeated bytes pssh_data = 1;
|
|
optional LicenseType license_type = 2;
|
|
optional bytes request_id = 3; // Opaque, client-specified.
|
|
}
|
|
|
|
message WebmKeyId {
|
|
optional bytes header = 1;
|
|
optional LicenseType license_type = 2;
|
|
optional bytes request_id = 3; // Opaque, client-specified.
|
|
}
|
|
|
|
message ExistingLicense {
|
|
optional LicenseIdentification license_id = 1;
|
|
optional int64 seconds_since_started = 2;
|
|
optional int64 seconds_since_last_played = 3;
|
|
optional bytes session_usage_table_entry = 4;
|
|
}
|
|
|
|
message InitData {
|
|
enum InitDataType {
|
|
CENC = 1;
|
|
WEBM = 2;
|
|
}
|
|
|
|
optional InitDataType init_data_type = 1 [default = CENC];
|
|
optional bytes init_data = 2;
|
|
optional LicenseType license_type = 3;
|
|
optional bytes request_id = 4;
|
|
}
|
|
|
|
oneof content_id_variant {
|
|
// Exactly one of these must be present.
|
|
WidevinePsshData widevine_pssh_data = 1;
|
|
WebmKeyId webm_key_id = 2;
|
|
ExistingLicense existing_license = 3;
|
|
InitData init_data = 4;
|
|
}
|
|
}
|
|
|
|
enum RequestType {
|
|
NEW = 1;
|
|
RENEWAL = 2;
|
|
RELEASE = 3;
|
|
}
|
|
|
|
// The client_id provides information authenticating the calling device. It
|
|
// contains the Widevine keybox token that was installed on the device at the
|
|
// factory. This field or encrypted_client_id below is required for a valid
|
|
// license request, but both should never be present in the same request.
|
|
optional ClientIdentification client_id = 1;
|
|
optional ContentIdentification content_id = 2;
|
|
optional RequestType type = 3;
|
|
// Time of the request in seconds (UTC) as set by the client.
|
|
optional int64 request_time = 4;
|
|
// Old-style decimal-encoded string key control nonce.
|
|
optional bytes key_control_nonce_deprecated = 5;
|
|
optional ProtocolVersion protocol_version = 6 [default = VERSION_2_0];
|
|
// New-style uint32 key control nonce, please use instead of
|
|
// key_control_nonce_deprecated.
|
|
optional uint32 key_control_nonce = 7;
|
|
// Encrypted ClientIdentification message, used for privacy purposes.
|
|
optional EncryptedClientIdentification encrypted_client_id = 8;
|
|
}
|
|
|
|
message LicenseError {
|
|
enum Error {
|
|
// The device credentials are invalid. The device must re-provision.
|
|
INVALID_DRM_DEVICE_CERTIFICATE = 1;
|
|
// The device credentials have been revoked. Re-provisioning is not
|
|
// possible.
|
|
REVOKED_DRM_DEVICE_CERTIFICATE = 2;
|
|
// The service is currently unavailable due to the backend being down
|
|
// or similar circumstances.
|
|
SERVICE_UNAVAILABLE = 3;
|
|
}
|
|
optional Error error_code = 1;
|
|
}
|
|
|
|
message MetricData {
|
|
enum MetricType {
|
|
// The time spent in the 'stage', specified in microseconds.
|
|
LATENCY = 1;
|
|
// The UNIX epoch timestamp at which the 'stage' was first accessed in
|
|
// microseconds.
|
|
TIMESTAMP = 2;
|
|
}
|
|
|
|
message TypeValue {
|
|
optional MetricType type = 1;
|
|
// The value associated with 'type'. For example if type == LATENCY, the
|
|
// value would be the time in microseconds spent in this 'stage'.
|
|
optional int64 value = 2 [default = 0];
|
|
}
|
|
|
|
// 'stage' that is currently processing the SignedMessage. Required.
|
|
optional string stage_name = 1;
|
|
// metric and associated value.
|
|
repeated TypeValue metric_data = 2;
|
|
}
|
|
|
|
message VersionInfo {
|
|
// License SDK version reported by the Widevine License SDK. This field
|
|
// is populated automatically by the SDK.
|
|
optional string license_sdk_version = 1;
|
|
// Version of the service hosting the license SDK. This field is optional.
|
|
// It may be provided by the hosting service.
|
|
optional string license_service_version = 2;
|
|
}
|
|
|
|
message SignedMessage {
|
|
enum MessageType {
|
|
LICENSE_REQUEST = 1;
|
|
LICENSE = 2;
|
|
ERROR_RESPONSE = 3;
|
|
SERVICE_CERTIFICATE_REQUEST = 4;
|
|
SERVICE_CERTIFICATE = 5;
|
|
SUB_LICENSE = 6;
|
|
CAS_LICENSE_REQUEST = 7;
|
|
CAS_LICENSE = 8;
|
|
}
|
|
|
|
optional MessageType type = 1;
|
|
optional bytes msg = 2;
|
|
optional bytes signature = 3;
|
|
optional bytes session_key = 4;
|
|
// Remote attestation data which will be present in the initial license
|
|
// request for ChromeOS client devices operating in verified mode. Remote
|
|
// attestation challenge data is |msg| field above. Optional.
|
|
optional RemoteAttestation remote_attestation = 5;
|
|
|
|
repeated MetricData metric_data = 6;
|
|
// Version information from the SDK and license service. This information is
|
|
// provided in the license response.
|
|
optional VersionInfo service_version_info = 7;
|
|
}
|