//////////////////////////////////////////////////////////////////////////////// // 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. //////////////////////////////////////////////////////////////////////////////// // // Description: // Definitions of the protocol buffer messages used in the Widevine license // exchange protocol for Media CAS. syntax = "proto2"; option java_package = "com.google.video.widevine.mediacaslicense"; import "protos/public/license_protocol.proto"; import "protos/public/license_server_sdk.proto"; import "protos/public/media_cas_encryption.proto"; package widevine; message CasDrmLicenseRequest { // The request payload. This is usually the HTTP Post body of a request. // Required. optional bytes payload = 1; // The content provider whose proxy is sending this license request onto the // Widevine license service. Required. optional string provider_id = 2; // An identifier supplied by a content provider, used to identify a piece of // content and derive key IDs and content keys. optional bytes content_id = 3; // A ContentKeySpec identifies a content key by track type name. It also // specifies the policy that should be used for this key. // TODO(user): Consolidate this ContentKeySpec with // ModularDrmLicenseRequest_ContentKeySpec. Both should include a common // ContentKeySpec. message ContentKeySpec { optional License.KeyContainer.SecurityLevel security_level = 1; optional License.KeyContainer.OutputProtection required_output_protection = 2; optional License.KeyContainer.OutputProtection requested_output_protection = 3; // Optionally specify even, odd or single slot for key rotation. repeated CasEncryptionResponse.KeyInfo entitlement_keys = 4; optional License.KeyContainer.KeyType key_type = 5; } repeated ContentKeySpec content_key_specs = 4; // Policy for the entire license such as playback duration. optional License.Policy policy = 5; } message CasDrmLicenseResponse { enum Status { UNKNOWN = 0; OK = 1; SIGNATURE_FAILED = 2; INVALID_LICENSE_CHALLENGE = 3; PROVIDER_ID_MISSING = 4; INVALID_CONTENT_INFO = 5; EMPTY_CONTENT_INFO = 6; CONTENT_ID_MISMATCH = 7; MISSING_CONTENT_ID = 8; MALFORMED_REQUEST = 9; INTERNAL_ERROR = 10; } optional Status status = 1; optional string status_message = 2; // Serialzed bytes for a CAS license. // TODO(user): Until a CAS license protocol is defined, this field is a // serialized License message defined in license_protocol.proto. optional bytes license = 3; // Actual SDK license status as defined in widevine/server/sdk/error.proto. optional uint32 internal_status = 4; // Indicates the type of message in the license response. optional SignedMessage.MessageType message_type = 5; // A subset of data from the Widevine PSSH. message PsshData { repeated bytes key_id = 1; optional bytes content_id = 2; } message LicenseMetadata { optional bytes content_id = 1; repeated bytes key_id = 2; } optional PsshData pssh_data = 6; optional SessionState session_state = 7; optional string content_owner = 8; optional string content_provider = 9; optional LicenseMetadata license_metadata = 10; } message SignedCasDrmRequest { optional bytes request = 1; optional bytes signature = 2; // Identifies the entity sending / signing the request. Required if signature // is present. optional string signer = 3; // The IP Address of the portal that is forwarding the request from the // original sender. optional string client_ip_address = 4; // The client software identifier, as used by HTTP. optional string user_agent = 5; optional string provider = 6; } message SignedCasDrmResponse { optional bytes response = 1; optional bytes signature = 2; }