Merge of http://go/wvgerrit/93404 This CL updates the Widevine CDM to support OEMCrypto v16.1 Test: Tested in 16.2 CL Bug: 141247171 Change-Id: I69bd993500f6fb63bf6010c8b0250dc7acc3d71b
97 lines
3.5 KiB
C
97 lines
3.5 KiB
C
/* Copyright 2019 Google LLC. All rights reserved. This file and proprietary */
|
||
/* source code may only be used and distributed under the Widevine Master */
|
||
/* License Agreement. */
|
||
|
||
#ifndef WIDEVINE_ODK_INCLUDE_ODK_STRUCTS_H_
|
||
#define WIDEVINE_ODK_INCLUDE_ODK_STRUCTS_H_
|
||
|
||
#include <stdint.h>
|
||
|
||
#include "OEMCryptoCENCCommon.h"
|
||
|
||
#define ODK_MAX_NUM_KEYS 32
|
||
#define ODK_DEVICE_ID_LEN_MAX 64
|
||
#define ODK_SHA256_HASH_SIZE 32
|
||
|
||
/*
|
||
* ODK_TimerLimits is filled out by the function ODK_ParseLicense.
|
||
*
|
||
* The fields in this structure are defined in the core license response
|
||
* message. This structure should be kept as part of the session and used
|
||
* when calling the ODK timer functions described in the document "License
|
||
* Duration and Renewal" distributed as part of the OEMCrypto v16 design.
|
||
*/
|
||
typedef struct {
|
||
uint32_t /*boolean*/ soft_expiry;
|
||
uint64_t earliest_playback_start_seconds; /* since license signed. */
|
||
uint64_t latest_playback_start_seconds; /* since license signed. */
|
||
uint64_t initial_playback_duration_seconds; /* since playback start. */
|
||
uint64_t renewal_playback_duration_seconds; /* since renewal signed. */
|
||
uint64_t license_duration_seconds; /* since license signed. */
|
||
} ODK_TimerLimits;
|
||
|
||
/*
|
||
* ODK_ParsedLicense holds fields from the core license response.
|
||
*/
|
||
typedef struct {
|
||
OEMCrypto_Substring enc_mac_keys_iv;
|
||
OEMCrypto_Substring enc_mac_keys;
|
||
OEMCrypto_Substring pst;
|
||
OEMCrypto_Substring srm_restriction_data;
|
||
uint32_t /* OEMCrypto_LicenseType */ license_type;
|
||
uint32_t nonce_required;
|
||
ODK_TimerLimits timer_limits;
|
||
uint8_t request_hash[ODK_SHA256_HASH_SIZE];
|
||
uint32_t key_array_length; /* num_keys */
|
||
OEMCrypto_KeyObject key_array[ODK_MAX_NUM_KEYS];
|
||
} ODK_ParsedLicense;
|
||
|
||
/*
|
||
* ODK_ParsedProvisioning holds fields from the core provisioning response.
|
||
*/
|
||
typedef struct {
|
||
uint32_t key_type;
|
||
OEMCrypto_Substring enc_private_key;
|
||
OEMCrypto_Substring enc_private_key_iv;
|
||
OEMCrypto_Substring encrypted_message_key; /* Used for Prov 3.0 */
|
||
} ODK_ParsedProvisioning;
|
||
|
||
/*
|
||
* ODK_ClockValues keeps information about a session's current clock values
|
||
* and timers.
|
||
*
|
||
* Most of the fields in this structure are saved in the usage entry for each
|
||
* session. This structure should be initialized when a usage entry is
|
||
* created or loaded, and should be used to save a usage entry. It is
|
||
* updated using ODK functions listed in the document "License Duration and
|
||
* Renewal". The time values are based on OEMCrypto’s system clock.
|
||
*/
|
||
typedef struct {
|
||
uint64_t time_of_license_signed;
|
||
uint64_t time_of_first_decrypt;
|
||
uint64_t time_of_last_decrypt;
|
||
uint64_t time_of_renewal_request;
|
||
uint64_t time_when_timer_expires;
|
||
uint32_t timer_status;
|
||
enum OEMCrypto_Usage_Entry_Status status;
|
||
} ODK_ClockValues;
|
||
|
||
/*
|
||
* ODK_NonceValues are used to match a license or provisioning request to a
|
||
* license or provisioning response. For this reason, the api_version might be
|
||
* lower than that supported by OEMCrypto. The api_version matches the version
|
||
* of the license. Similarly the nonce and session_id match the session that
|
||
* generated the license request. For an offline license, these might not match
|
||
* the session that is loading the license. We use the nonce to prevent a
|
||
* license from being replayed. By also including a session_id in the license
|
||
* request and license response, we prevent an attack using the birthday paradox
|
||
* to generate nonce collisions on a single device.
|
||
*/
|
||
typedef struct {
|
||
uint32_t api_version;
|
||
uint32_t nonce;
|
||
uint32_t session_id;
|
||
} ODK_NonceValues;
|
||
|
||
#endif /* WIDEVINE_ODK_INCLUDE_ODK_STRUCTS_H_ */
|