189 lines
7.9 KiB
Protocol Buffer
189 lines
7.9 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:
|
|
// Public protocol buffer definitions for Widevine Device Certificate
|
|
// Provisioning protocol.
|
|
|
|
syntax = "proto2";
|
|
|
|
package widevine;
|
|
|
|
import "protos/public/client_identification.proto";
|
|
import "protos/public/hash_algorithm.proto";
|
|
import "protos/public/remote_attestation.proto";
|
|
|
|
option java_package = "com.google.video.widevine.protos";
|
|
|
|
|
|
// ProvisioningOptions specifies the type of certificate to specify and
|
|
// in the case of X509 certificates, the certificate authority to use.
|
|
message ProvisioningOptions {
|
|
enum CertificateType {
|
|
WIDEVINE_DRM = 0; // Default. The original certificate type.
|
|
X509 = 1; // X.509 certificate.
|
|
WIDEVINE_KEYBOX = 2;
|
|
}
|
|
|
|
optional CertificateType certificate_type = 1 [default = WIDEVINE_DRM];
|
|
|
|
// Contains the application-specific name used to identify the certificate
|
|
// authority for signing the generated certificate. This is required iff the
|
|
// certificate type is X509.
|
|
optional string certificate_authority = 2;
|
|
// System ID for OTA keybox provisioning. Requires device secure boot.
|
|
optional uint32 system_id = 3;
|
|
}
|
|
|
|
// Provisioning request sent by client devices to provisioning service.
|
|
message ProvisioningRequest {
|
|
message EncryptedSessionKeys {
|
|
message SessionKeys {
|
|
// 16 bytes encryption key generated by client, used by the server to:
|
|
// (1) AES-128-CBC decrypt encrypted_client_id in
|
|
// EncryptedClientIdentification which is in RemoteAttestation
|
|
// (2) AES-128-CBC encrypt device_key to be returned in
|
|
// ProvisioningResponse.
|
|
optional bytes encryption_key = 1;
|
|
// 32 bytes mac key generated by client, used by server to sign
|
|
// the ProvisioningResponse.
|
|
optional bytes mac_key = 2;
|
|
}
|
|
// Serial number of certificate which was used to encrypt the session keys.
|
|
// Required.
|
|
optional bytes certificate_serial_number = 1;
|
|
// Serialized, encrypted session keys. Required.
|
|
optional bytes encrypted_session_keys = 2;
|
|
}
|
|
oneof clear_or_encrypted_client_id {
|
|
// Device root of trust and other client identification. Required.
|
|
ClientIdentification client_id = 1;
|
|
EncryptedClientIdentification encrypted_client_id = 5;
|
|
}
|
|
// Nonce value used to prevent replay attacks. Required.
|
|
optional bytes nonce = 2;
|
|
// Options for type of certificate to generate. Optional.
|
|
optional ProvisioningOptions options = 3;
|
|
oneof spoid_param {
|
|
// Stable identifier, unique for each device + application (or origin).
|
|
// To be deprecated.
|
|
bytes stable_id = 4;
|
|
// Service provider ID from the service certificate's provider_id field.
|
|
// Preferred parameter.
|
|
bytes provider_id = 6;
|
|
// Client-generated stable per-origin identifier to be copied directly
|
|
// to the client certificate serial number.
|
|
bytes spoid = 7;
|
|
}
|
|
// SessionKeys encrypted using a service cert public key.
|
|
// Required for keybox provisioning.
|
|
optional EncryptedSessionKeys encrypted_session_keys = 8;
|
|
}
|
|
|
|
// Provisioning response sent by the provisioning server to client devices.
|
|
// This message is used for both regular Widevine DRM certificates and for
|
|
// application-specific X.509 certificates.
|
|
message ProvisioningResponse {
|
|
message OtaKeybox {
|
|
// Iv used along with SessionKeys.encryption_key for encrypting device key.
|
|
optional bytes device_key_encryption_iv = 1;
|
|
// Device key component of the keybox, encrypted using the
|
|
// SessionKeys.encryption_key in the request and |device_key_encryption_iv|
|
|
// above.
|
|
optional bytes encrypted_device_key = 2;
|
|
// Device CA token component of the keybox.
|
|
optional bytes device_ca_token = 3;
|
|
}
|
|
// AES-128 encrypted device private RSA key. PKCS#1 ASN.1 DER-encoded.
|
|
// Required. For X.509 certificates, the private RSA key may also include
|
|
// a prefix as specified by private_key_prefix in the X509CertificateMetadata
|
|
// proto message.
|
|
optional bytes device_rsa_key = 1;
|
|
// Initialization vector used to encrypt device_rsa_key. Required.
|
|
optional bytes device_rsa_key_iv = 2;
|
|
// For Widevine DRM certificates, this contains the serialized
|
|
// SignedDrmCertificate. For X.509 certificates, this contains the PEM
|
|
// encoded X.509 certificate. Required.
|
|
optional bytes device_certificate = 3;
|
|
// Nonce value matching nonce in ProvisioningRequest. Required.
|
|
optional bytes nonce = 4;
|
|
// Key used to wrap device_rsa_key when DRM provisioning an OEM factory
|
|
// provisioned device. Encrypted with the device OEM public key using
|
|
// RSA-OAEP.
|
|
optional bytes wrapping_key = 5;
|
|
// Only populated in OTA keybox provisioning response.
|
|
optional OtaKeybox ota_keybox = 6;
|
|
}
|
|
|
|
// Protocol-specific context data used to hold the state of the server in
|
|
// stateful provisioning protocols. For more information, please refer to
|
|
// mE_ZP4WmSX-JNldg
|
|
message ProvisioningContext {
|
|
// Serialized ProvisioningContextKeyData. Required.
|
|
optional bytes key_data = 1;
|
|
// Protocol-dependent context data, encrypted with key and IV in key_data.
|
|
// Required.
|
|
optional bytes context_data = 2;
|
|
}
|
|
|
|
message SignedProvisioningContext {
|
|
// ProvisioningContext in bytes.
|
|
optional bytes provisioning_context = 1;
|
|
// RSASSA-PSS signature of provisioning_context. Signed with service private
|
|
// key.
|
|
optional bytes signature = 2;
|
|
// Optional field that indicates the hash algorithm used in signature scheme.
|
|
optional HashAlgorithmProto hash_algorithm = 3;
|
|
}
|
|
|
|
// Cryptographic tokens to be used for ProvisioningContext.
|
|
message ProvisioningContextKeyData {
|
|
// Encryption key, usually 32 bytes used for AES-256-CBC. Required.
|
|
optional bytes encryption_key = 1;
|
|
// Encryption IV, 16 bytes. Required.
|
|
optional bytes encryption_iv = 2;
|
|
}
|
|
|
|
// Serialized ProvisioningRequest or ProvisioningResponse signed with
|
|
// The message authentication key.
|
|
message SignedProvisioningMessage {
|
|
enum ProtocolVersion {
|
|
SERVICE_CERTIFICATE_REQUEST = 1; // Service certificate request.
|
|
PROVISIONING_20 = 2; // Keybox factory-provisioned devices.
|
|
PROVISIONING_30 = 3; // OEM certificate factory-provisioned devices.
|
|
}
|
|
|
|
// Serialized protobuf message for the corresponding protocol and stage of
|
|
// the provisioning exchange. ProvisioningRequest or ProvisioningResponse
|
|
// in the case of Provisioning 2.0, 3.0 and ARCPP_PROVISIONING. Required.
|
|
optional bytes message = 1;
|
|
// HMAC-SHA256 (Keybox) or RSASSA-PSS (OEM) signature of message. Required
|
|
// for provisioning 2.0 and 3.0. For ARCPP_PROVISIONING, only used in
|
|
// response.
|
|
optional bytes signature = 2;
|
|
// Version number of provisioning protocol.
|
|
optional ProtocolVersion protocol_version = 3 [default = PROVISIONING_20];
|
|
// Protocol-specific context / state information for multiple-exchange,
|
|
// stateful provisioing protocols. Optional.
|
|
optional SignedProvisioningContext signed_provisioning_context = 4;
|
|
// Remote attestation data to authenticate that the ChromeOS client device
|
|
// is operating in verified mode. Remote attestation challenge data is
|
|
// |message| field above. Required for ARCPP_PROVISIONING request.
|
|
// It contains signature of |message|.
|
|
optional RemoteAttestation remote_attestation = 5;
|
|
// The core message is the simple serialization of fields used by OEMCrypto.
|
|
// This field was introduced in OEMCrypto API v16. The core message format is
|
|
// documented in the "Widevine Core Message Serialization", found internally
|
|
// at
|
|
// https://docs.google.com/document/d/1M5f0OA8zrIFufpZiny_M9WkvJkCUs9DpRpeDmk9QKKY/edit
|
|
optional bytes oemcrypto_core_message = 6;
|
|
// Optional field that indicates the hash algorithm used in signature scheme.
|
|
optional HashAlgorithmProto hash_algorithm = 7;
|
|
}
|