shaka-packager/packager/media/base/widevine_common_encryption....

163 lines
5.7 KiB
Protocol Buffer

// Copyright 2018 Google LLC. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd
//
// This file defines Widevine Common Encryption Request and Response proto
// format.
syntax = "proto2";
package shaka;
enum ModularDrmType { WIDEVINE = 0; }
message CommonEncryptionRequest {
enum ProtectionScheme {
UNSPECIFIED = 0; // Defaults to 'cenc'
CENC = 1667591779; // 'cenc' (AES-CTR) = 0x63656E63
CBC1 = 1667392305; // 'cbc1' (AES-CBC) = 0x63626331
CENS = 1667591795; // 'cens' (AES-CTR subsample) =
// 0x63656E73
CBCS = 1667392371; //'cbcs' (AES-CBC subsample) = 0x63626373
};
// 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 = 1;
// A policy name that refers to a stored policy in Widevine service.
optional string policy = 2;
// A list of tracks whose PSSHes and keys should be returned.
message Track { optional string type = 1; }
repeated Track tracks = 3;
// Indicates the drm system types whose PSSH should be generated. An empty
// list implies [ WIDEVINE ].
repeated ModularDrmType drm_types = 4;
// Optional starting period, if multiple keys are being requested for content
// that will rotate keys.
optional uint32 first_crypto_period_index = 8;
// Optional count of periods to return keys for, starting with
// first_crypto_period_index. If this count is set, then
// first_crypto_period_index must be provided in the request as well.
optional uint32 crypto_period_count = 9 [default = 1];
// 'pssh' box data which can be used in lieu of the content_id field in order
// to request keys for Widevine CENC content.
optional bytes pssh_data = 10;
// Widevine asset ID which can be used in lieu of the content_id field in
// order to request keys for Widevine "Classic" packaged content.
optional uint32 asset_id = 11;
// Optional value which can be used to indicate a group.
// If present the CommonEncryptionResponse will contain pssh data belonging
// to this group.
optional bytes group_id = 12;
// Optional value representing the duration of each crypto period in seconds.
optional uint32 crypto_period_seconds = 13;
// Protection scheme identifying the encryption algorithm. The protection
// scheme is represented as a uint32 value. The uint32 contains 4 bytes each
// representing a single ascii character in one of the 4CC protection scheme
// values.
// The protection scheme to set in the generated 'pssh' box data.
// This protection scheme value may be encoded into the content. If the
// protection scheme is available in the content, it will supercede this
// value.
optional ProtectionScheme protection_scheme = 14;
// Enable entitlement license if set to true.
optional bool enable_entitlement_license = 16;
// Video feature identifier, which is used in conjunction with |content_id|
// to derive key IDs and content keys. For example, it can be used to generate
// different keys for HDR and SDR. The value is propagated to PSSH.
// Ignored for tracks with type “AUDIO”.
// Current values are "HDR".
optional string video_feature = 19;
}
message CommonEncryptionResponse {
// Indicates the result of the operation.
enum Status {
OK = 0;
SIGNATURE_FAILED = 1;
CONTENT_ID_MISSING = 2;
POLICY_UNKNOWN = 3;
TRACK_TYPE_MISSING = 4;
TRACK_TYPE_UNKNOWN = 5;
MALFORMED_REQUEST = 6;
ACCESS_DENIED = 7;
INTERNAL_ERROR = 8;
INVALID_WIDEVINE_PSSH = 9;
TOO_MANY_CONTENT_SPECIFIERS = 10;
ASSET_NOT_FOUND = 11;
ASSET_MISSING_KEY = 12;
CONTENT_ID_MISMATCH = 13;
KEY_ID_MISMATCH = 14;
INVALID_GROUP_TRACK_TYPE = 15;
KEY_ROTATION_WITH_UNSUPPORTED_DRM_TYPE = 16;
NO_REQUESTED_CRYPTO_PERIODS = 17;
};
optional Status status = 1;
// A list of DRM systems whose PSSH is returned.
message Drm {
// The DRM system, e.g. widevine or playready.
optional ModularDrmType type = 1;
// Registered system Id for the DRM system.
optional string system_id = 2;
}
repeated Drm drm = 3;
// A list of tracks and their PSSH and key data. If crypto_period_count
// was given in the request, then there will be a separate Track message
// in the response for each period.
message Track {
// Track type. SD, HD, UHD1, UHD2 or AUDIO.
optional string type = 1;
optional bytes key_id = 2;
optional bytes key = 3;
optional bytes iv = 4;
message Pssh {
optional ModularDrmType drm_type = 1;
// Contains only PSSH data, i.e. no PSSH box header.
// Can be omitted if |boxes| is present.
// This field should become deprecated as it may not be populated when
// entitlement licenses become more widely used.
optional bytes data = 2;
// Contains full PSSH boxes (there can be more than one PSSH box).
// Always populated.
optional bytes boxes = 3;
}
repeated Pssh pssh = 5;
optional uint32 crypto_period_index = 6;
}
repeated Track tracks = 4;
// The content_id associated with the response. The content_id is either
// the content_id from the request or from the PSSH in the request.
optional bytes content_id = 6;
}
// A generic protobuf used as the request format of various Modular DRM APIs.
message SignedModularDrmRequest {
optional bytes request = 1;
optional bytes signature = 2;
// Identifies the entity sending / signing the request.
optional string signer = 3;
}
message SignedModularDrmResponse {
optional bytes response = 1;
optional bytes signature = 2;
}