Changes included in this CL: 166806: Update OEMCrypto_GetDeviceInformation() | https://widevine-internal-review.googlesource.com/c/cdm/+/166806 166808: Update Android L3 after OEMCrypto_GetDeviceInformation() signature changes | https://widevine-internal-review.googlesource.com/c/cdm/+/166808 166809: Decode device info and write it to CSR payload | https://widevine-internal-review.googlesource.com/c/cdm/+/166809 167158: Fix Android include path and copy_files | https://widevine-internal-review.googlesource.com/c/cdm/+/167158 167159: Fix common typos and use inclusive language suggested by Android linter | https://widevine-internal-review.googlesource.com/c/cdm/+/167159 165618: Explicitly state python3 where needed. | https://widevine-internal-review.googlesource.com/c/cdm/+/165618 166757: Update Android.bp for Android | https://widevine-internal-review.googlesource.com/c/cdm/+/166757 164993: Refactor basic oemcrypto unit tests | https://widevine-internal-review.googlesource.com/c/cdm/+/164993 164978: Update OEMCrypto Unit Test Docs | https://widevine-internal-review.googlesource.com/c/cdm/+/164978 166941: Update make files for OEMCrypto | https://widevine-internal-review.googlesource.com/c/cdm/+/166941 165279: Refactor license unit tests | https://widevine-internal-review.googlesource.com/c/cdm/+/165279 165318: Refactor provisioning unit tests | https://widevine-internal-review.googlesource.com/c/cdm/+/165318 164800: Add extra check for renew on license load unit test | https://widevine-internal-review.googlesource.com/c/cdm/+/164800 165860: Remove duplicate definition of MaybeHex() | https://widevine-internal-review.googlesource.com/c/cdm/+/165860 164889: Updated CoreCommonRequestFromMessage and fix test | https://widevine-internal-review.googlesource.com/c/cdm/+/164889 164967: Add OPK pre-hook and post-hook error codes | https://widevine-internal-review.googlesource.com/c/cdm/+/164967 165140: Add hidden device_id_length to v18 provisioning message | https://widevine-internal-review.googlesource.com/c/cdm/+/165140 165204: Fix memory leak in oemcrypto test | https://widevine-internal-review.googlesource.com/c/cdm/+/165204 165958: Fix oemcrypto_generic_verify_fuzz mutator signature offset | https://widevine-internal-review.googlesource.com/c/cdm/+/165958 166037: Support SHA-256 in OEMCrypto Session Util | https://widevine-internal-review.googlesource.com/c/cdm/+/166037 Test: Run GtsMediaTests on Pixel 7 Bug: 270612144 Change-Id: Iff0820a2de7d043a820470a130af65b0dcadb759
567 lines
24 KiB
C
567 lines
24 KiB
C
// Copyright 2019 Google LLC. All rights reserved. This file and proprietary
|
|
// source code may only be used and distributed under the Widevine
|
|
// License Agreement.
|
|
|
|
/*
|
|
* This code is auto-generated, do not edit
|
|
*/
|
|
|
|
#include "odk_serialize.h"
|
|
|
|
#include "odk_structs_priv.h"
|
|
#include "serialization_base.h"
|
|
|
|
/* @ serialize */
|
|
|
|
/* @@ private serialize */
|
|
|
|
static void Pack_ODK_NonceValues(ODK_Message* msg, ODK_NonceValues const* obj) {
|
|
Pack_uint16_t(msg, &obj->api_minor_version);
|
|
Pack_uint16_t(msg, &obj->api_major_version);
|
|
Pack_uint32_t(msg, &obj->nonce);
|
|
Pack_uint32_t(msg, &obj->session_id);
|
|
}
|
|
|
|
static void Pack_ODK_CoreMessage(ODK_Message* msg, ODK_CoreMessage const* obj) {
|
|
Pack_uint32_t(msg, &obj->message_type);
|
|
Pack_uint32_t(msg, &obj->message_length);
|
|
Pack_ODK_NonceValues(msg, &obj->nonce_values);
|
|
}
|
|
|
|
static void Pack_OEMCrypto_KeyObject(ODK_Message* msg,
|
|
OEMCrypto_KeyObject const* obj) {
|
|
Pack_OEMCrypto_Substring(msg, &obj->key_id);
|
|
Pack_OEMCrypto_Substring(msg, &obj->key_data_iv);
|
|
Pack_OEMCrypto_Substring(msg, &obj->key_data);
|
|
Pack_OEMCrypto_Substring(msg, &obj->key_control_iv);
|
|
Pack_OEMCrypto_Substring(msg, &obj->key_control);
|
|
}
|
|
|
|
static void Pack_ODK_TimerLimits(ODK_Message* msg, ODK_TimerLimits const* obj) {
|
|
Pack_bool(msg, &obj->soft_enforce_rental_duration);
|
|
Pack_bool(msg, &obj->soft_enforce_playback_duration);
|
|
Pack_uint64_t(msg, &obj->earliest_playback_start_seconds);
|
|
Pack_uint64_t(msg, &obj->rental_duration_seconds);
|
|
Pack_uint64_t(msg, &obj->total_playback_duration_seconds);
|
|
Pack_uint64_t(msg, &obj->initial_renewal_duration_seconds);
|
|
}
|
|
|
|
static void Pack_ODK_ParsedLicense(ODK_Message* msg,
|
|
ODK_ParsedLicense const* obj) {
|
|
/* hand-coded */
|
|
if (obj->key_array_length > ODK_MAX_NUM_KEYS) {
|
|
ODK_Message_SetStatus(msg, MESSAGE_STATUS_OVERFLOW_ERROR);
|
|
return;
|
|
}
|
|
Pack_OEMCrypto_Substring(msg, &obj->enc_mac_keys_iv);
|
|
Pack_OEMCrypto_Substring(msg, &obj->enc_mac_keys);
|
|
Pack_OEMCrypto_Substring(msg, &obj->pst);
|
|
Pack_OEMCrypto_Substring(msg, &obj->srm_restriction_data);
|
|
Pack_enum(msg, obj->license_type);
|
|
Pack_bool(msg, &obj->nonce_required);
|
|
Pack_ODK_TimerLimits(msg, &obj->timer_limits);
|
|
Pack_uint32_t(msg, &obj->watermarking);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.dtcp2_required);
|
|
if (obj->dtcp2_required.dtcp2_required) {
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_0.id);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_0.extension);
|
|
Pack_uint16_t(msg, &obj->dtcp2_required.cmi_descriptor_0.length);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_0.data);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_1.id);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_1.extension);
|
|
Pack_uint16_t(msg, &obj->dtcp2_required.cmi_descriptor_1.length);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_1.data[0]);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_1.data[1]);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_1.data[2]);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_2.id);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_2.extension);
|
|
Pack_uint16_t(msg, &obj->dtcp2_required.cmi_descriptor_2.length);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_2.data[0]);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_2.data[1]);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_2.data[2]);
|
|
}
|
|
Pack_enum(msg, obj->renewal_delay_base);
|
|
Pack_uint32_t(msg, &obj->key_array_length);
|
|
size_t i;
|
|
for (i = 0; i < (size_t)obj->key_array_length; i++) {
|
|
Pack_OEMCrypto_KeyObject(msg, &obj->key_array[i]);
|
|
}
|
|
}
|
|
|
|
static void Pack_ODK_ParsedLicenseV17(ODK_Message* msg,
|
|
ODK_ParsedLicenseV17 const* obj) {
|
|
/* hand-coded */
|
|
if (obj->key_array_length > ODK_MAX_NUM_KEYS) {
|
|
ODK_Message_SetStatus(msg, MESSAGE_STATUS_OVERFLOW_ERROR);
|
|
return;
|
|
}
|
|
Pack_OEMCrypto_Substring(msg, &obj->enc_mac_keys_iv);
|
|
Pack_OEMCrypto_Substring(msg, &obj->enc_mac_keys);
|
|
Pack_OEMCrypto_Substring(msg, &obj->pst);
|
|
Pack_OEMCrypto_Substring(msg, &obj->srm_restriction_data);
|
|
Pack_enum(msg, obj->license_type);
|
|
Pack_bool(msg, &obj->nonce_required);
|
|
Pack_ODK_TimerLimits(msg, &obj->timer_limits);
|
|
Pack_uint32_t(msg, &obj->watermarking);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.dtcp2_required);
|
|
if (obj->dtcp2_required.dtcp2_required) {
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_0.id);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_0.extension);
|
|
Pack_uint16_t(msg, &obj->dtcp2_required.cmi_descriptor_0.length);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_0.data);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_1.id);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_1.extension);
|
|
Pack_uint16_t(msg, &obj->dtcp2_required.cmi_descriptor_1.length);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_1.data[0]);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_1.data[1]);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_1.data[2]);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_2.id);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_2.extension);
|
|
Pack_uint16_t(msg, &obj->dtcp2_required.cmi_descriptor_2.length);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_2.data[0]);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_2.data[1]);
|
|
Pack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_2.data[2]);
|
|
}
|
|
Pack_uint32_t(msg, &obj->key_array_length);
|
|
size_t i;
|
|
for (i = 0; i < (size_t)obj->key_array_length; i++) {
|
|
Pack_OEMCrypto_KeyObject(msg, &obj->key_array[i]);
|
|
}
|
|
}
|
|
|
|
static void Pack_ODK_ParsedLicenseV16(ODK_Message* msg,
|
|
ODK_ParsedLicenseV16 const* obj) {
|
|
/* hand-coded */
|
|
if (obj->key_array_length > ODK_MAX_NUM_KEYS) {
|
|
ODK_Message_SetStatus(msg, MESSAGE_STATUS_OVERFLOW_ERROR);
|
|
return;
|
|
}
|
|
Pack_OEMCrypto_Substring(msg, &obj->enc_mac_keys_iv);
|
|
Pack_OEMCrypto_Substring(msg, &obj->enc_mac_keys);
|
|
Pack_OEMCrypto_Substring(msg, &obj->pst);
|
|
Pack_OEMCrypto_Substring(msg, &obj->srm_restriction_data);
|
|
Pack_enum(msg, obj->license_type);
|
|
Pack_bool(msg, &obj->nonce_required);
|
|
Pack_ODK_TimerLimits(msg, &obj->timer_limits);
|
|
Pack_uint32_t(msg, &obj->key_array_length);
|
|
size_t i;
|
|
for (i = 0; i < (size_t)obj->key_array_length; i++) {
|
|
Pack_OEMCrypto_KeyObject(msg, &obj->key_array[i]);
|
|
}
|
|
}
|
|
|
|
static void Pack_ODK_ParsedProvisioning(ODK_Message* msg,
|
|
ODK_ParsedProvisioning const* obj) {
|
|
Pack_enum(msg, obj->key_type);
|
|
Pack_OEMCrypto_Substring(msg, &obj->enc_private_key);
|
|
Pack_OEMCrypto_Substring(msg, &obj->enc_private_key_iv);
|
|
Pack_OEMCrypto_Substring(msg, &obj->encrypted_message_key);
|
|
}
|
|
|
|
static void Pack_ODK_MessageCounterInfo(ODK_Message* msg,
|
|
ODK_MessageCounterInfo const* obj) {
|
|
Pack_uint64_t(msg, &obj->master_generation_number);
|
|
Pack_uint32_t(msg, &obj->provisioning_count);
|
|
Pack_uint32_t(msg, &obj->license_count);
|
|
Pack_uint32_t(msg, &obj->decrypt_count);
|
|
Pack_uint16_t(msg, &obj->major_version);
|
|
Pack_uint16_t(msg, &obj->minor_version);
|
|
Pack_uint16_t(msg, &obj->patch_version);
|
|
PackArray(msg, &obj->soc_vendor[0], sizeof(obj->soc_vendor));
|
|
PackArray(msg, &obj->chipset_model[0], sizeof(obj->chipset_model));
|
|
PackArray(msg, &obj->extra[0], sizeof(obj->extra));
|
|
}
|
|
|
|
/* @@ odk serialize */
|
|
|
|
void Pack_ODK_PreparedLicenseRequest(ODK_Message* msg,
|
|
ODK_PreparedLicenseRequest const* obj) {
|
|
Pack_ODK_CoreMessage(msg, &obj->core_message);
|
|
Pack_ODK_MessageCounterInfo(msg, &obj->counter_info);
|
|
}
|
|
|
|
void Pack_ODK_PreparedLicenseRequestV17(
|
|
ODK_Message* msg, ODK_PreparedLicenseRequestV17 const* obj) {
|
|
Pack_ODK_CoreMessage(msg, &obj->core_message);
|
|
}
|
|
|
|
void Pack_ODK_PreparedRenewalRequest(ODK_Message* msg,
|
|
ODK_PreparedRenewalRequest const* obj) {
|
|
Pack_ODK_CoreMessage(msg, &obj->core_message);
|
|
Pack_uint64_t(msg, &obj->playback_time);
|
|
}
|
|
|
|
void Pack_ODK_PreparedProvisioningRequest(
|
|
ODK_Message* msg, const ODK_PreparedProvisioningRequest* obj) {
|
|
Pack_ODK_CoreMessage(msg, &obj->core_message);
|
|
// Fake device_id_length for older servers, since we removed device id from
|
|
// the v18 request
|
|
uint32_t device_id_len = 64;
|
|
Pack_uint32_t(msg, &device_id_len);
|
|
Pack_ODK_MessageCounterInfo(msg, &obj->counter_info);
|
|
}
|
|
|
|
void Pack_ODK_PreparedProvisioningRequestV17(
|
|
ODK_Message* msg, const ODK_PreparedProvisioningRequestV17* obj) {
|
|
Pack_ODK_CoreMessage(msg, &obj->core_message);
|
|
Pack_uint32_t(msg, &obj->device_id_length);
|
|
PackArray(msg, &obj->device_id[0], sizeof(obj->device_id));
|
|
}
|
|
|
|
void Pack_ODK_PreparedProvisioning40Request(
|
|
ODK_Message* msg, const ODK_PreparedProvisioning40Request* obj) {
|
|
Pack_ODK_CoreMessage(msg, &obj->core_message);
|
|
Pack_uint32_t(msg, &obj->device_info_length);
|
|
PackArray(msg, &obj->device_info[0], sizeof(obj->device_info));
|
|
Pack_ODK_MessageCounterInfo(msg, &obj->counter_info);
|
|
}
|
|
|
|
void Pack_ODK_PreparedRenewedProvisioningRequest(
|
|
ODK_Message* msg, const ODK_PreparedRenewedProvisioningRequest* obj) {
|
|
Pack_ODK_CoreMessage(msg, &obj->core_message);
|
|
Pack_uint32_t(msg, &obj->device_id_length);
|
|
PackArray(msg, &obj->device_id[0], sizeof(obj->device_id));
|
|
Pack_uint16_t(msg, &obj->renewal_type);
|
|
Pack_uint32_t(msg, &obj->renewal_data_length);
|
|
PackArray(msg, &obj->renewal_data[0], sizeof(obj->renewal_data));
|
|
}
|
|
|
|
/* @@ kdo serialize */
|
|
|
|
void Pack_ODK_LicenseResponse(ODK_Message* msg,
|
|
ODK_LicenseResponse const* obj) {
|
|
Pack_ODK_CoreMessage(msg, &obj->core_message);
|
|
Pack_ODK_ParsedLicense(msg, (const ODK_ParsedLicense*)obj->parsed_license);
|
|
}
|
|
|
|
void Pack_ODK_LicenseResponseV17(ODK_Message* msg,
|
|
ODK_LicenseResponseV17 const* obj) {
|
|
Pack_ODK_PreparedLicenseRequestV17(msg, &obj->request);
|
|
Pack_ODK_ParsedLicenseV17(msg, &obj->parsed_license);
|
|
}
|
|
|
|
void Pack_ODK_LicenseResponseV16(ODK_Message* msg,
|
|
ODK_LicenseResponseV16 const* obj) {
|
|
Pack_ODK_PreparedLicenseRequestV17(msg, &obj->request);
|
|
Pack_ODK_ParsedLicenseV16(msg, &obj->parsed_license);
|
|
PackArray(msg, &obj->request_hash[0], sizeof(obj->request_hash));
|
|
}
|
|
|
|
void Pack_ODK_RenewalResponse(ODK_Message* msg,
|
|
ODK_RenewalResponse const* obj) {
|
|
Pack_ODK_PreparedRenewalRequest(msg, &obj->request);
|
|
Pack_uint64_t(msg, &obj->renewal_duration_seconds);
|
|
}
|
|
|
|
void Pack_ODK_ProvisioningResponse(ODK_Message* msg,
|
|
const ODK_ProvisioningResponse* obj) {
|
|
Pack_ODK_CoreMessage(msg, &obj->core_message);
|
|
Pack_ODK_ParsedProvisioning(
|
|
msg, (const ODK_ParsedProvisioning*)obj->parsed_provisioning);
|
|
}
|
|
|
|
void Pack_ODK_ProvisioningResponseV16(ODK_Message* msg,
|
|
const ODK_ProvisioningResponseV16* obj) {
|
|
Pack_ODK_PreparedProvisioningRequestV17(msg, &obj->request);
|
|
Pack_ODK_ParsedProvisioning(
|
|
msg, (const ODK_ParsedProvisioning*)obj->parsed_provisioning);
|
|
}
|
|
|
|
void Pack_ODK_Provisioning40Response(ODK_Message* msg,
|
|
const ODK_Provisioning40Response* obj) {
|
|
Pack_ODK_CoreMessage(msg, &obj->core_message);
|
|
}
|
|
|
|
/* @ deserialize */
|
|
|
|
/* @@ private deserialize */
|
|
|
|
static void Unpack_ODK_NonceValues(ODK_Message* msg, ODK_NonceValues* obj) {
|
|
Unpack_uint16_t(msg, &obj->api_minor_version);
|
|
Unpack_uint16_t(msg, &obj->api_major_version);
|
|
Unpack_uint32_t(msg, &obj->nonce);
|
|
Unpack_uint32_t(msg, &obj->session_id);
|
|
}
|
|
|
|
void Unpack_ODK_CoreMessage(ODK_Message* msg, ODK_CoreMessage* obj) {
|
|
Unpack_uint32_t(msg, &obj->message_type);
|
|
Unpack_uint32_t(msg, &obj->message_length);
|
|
Unpack_ODK_NonceValues(msg, &obj->nonce_values);
|
|
}
|
|
|
|
static void Unpack_OEMCrypto_KeyObject(ODK_Message* msg,
|
|
OEMCrypto_KeyObject* obj) {
|
|
Unpack_OEMCrypto_Substring(msg, &obj->key_id);
|
|
Unpack_OEMCrypto_Substring(msg, &obj->key_data_iv);
|
|
Unpack_OEMCrypto_Substring(msg, &obj->key_data);
|
|
Unpack_OEMCrypto_Substring(msg, &obj->key_control_iv);
|
|
Unpack_OEMCrypto_Substring(msg, &obj->key_control);
|
|
}
|
|
|
|
static void Unpack_ODK_TimerLimits(ODK_Message* msg, ODK_TimerLimits* obj) {
|
|
Unpack_bool(msg, &obj->soft_enforce_rental_duration);
|
|
Unpack_bool(msg, &obj->soft_enforce_playback_duration);
|
|
Unpack_uint64_t(msg, &obj->earliest_playback_start_seconds);
|
|
Unpack_uint64_t(msg, &obj->rental_duration_seconds);
|
|
Unpack_uint64_t(msg, &obj->total_playback_duration_seconds);
|
|
Unpack_uint64_t(msg, &obj->initial_renewal_duration_seconds);
|
|
}
|
|
|
|
static void Unpack_ODK_ParsedLicense(ODK_Message* msg, ODK_ParsedLicense* obj) {
|
|
Unpack_OEMCrypto_Substring(msg, &obj->enc_mac_keys_iv);
|
|
Unpack_OEMCrypto_Substring(msg, &obj->enc_mac_keys);
|
|
Unpack_OEMCrypto_Substring(msg, &obj->pst);
|
|
Unpack_OEMCrypto_Substring(msg, &obj->srm_restriction_data);
|
|
Unpack_OEMCrypto_LicenseType(msg, &obj->license_type);
|
|
Unpack_bool(msg, &obj->nonce_required);
|
|
Unpack_ODK_TimerLimits(msg, &obj->timer_limits);
|
|
Unpack_uint32_t(msg, &obj->watermarking);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.dtcp2_required);
|
|
if (obj->dtcp2_required.dtcp2_required) {
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_0.id);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_0.extension);
|
|
Unpack_uint16_t(msg, &obj->dtcp2_required.cmi_descriptor_0.length);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_0.data);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_1.id);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_1.extension);
|
|
Unpack_uint16_t(msg, &obj->dtcp2_required.cmi_descriptor_1.length);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_1.data[0]);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_1.data[1]);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_1.data[2]);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_2.id);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_2.extension);
|
|
Unpack_uint16_t(msg, &obj->dtcp2_required.cmi_descriptor_2.length);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_2.data[0]);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_2.data[1]);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_2.data[2]);
|
|
} else {
|
|
obj->dtcp2_required.dtcp2_required = 0;
|
|
obj->dtcp2_required.cmi_descriptor_0.id = 0;
|
|
obj->dtcp2_required.cmi_descriptor_0.extension = 0;
|
|
obj->dtcp2_required.cmi_descriptor_0.length = 0;
|
|
obj->dtcp2_required.cmi_descriptor_0.data = 0;
|
|
obj->dtcp2_required.cmi_descriptor_1.id = 0;
|
|
obj->dtcp2_required.cmi_descriptor_1.extension = 0;
|
|
obj->dtcp2_required.cmi_descriptor_1.length = 0;
|
|
obj->dtcp2_required.cmi_descriptor_1.data[0] = 0;
|
|
obj->dtcp2_required.cmi_descriptor_1.data[1] = 0;
|
|
obj->dtcp2_required.cmi_descriptor_1.data[2] = 0;
|
|
obj->dtcp2_required.cmi_descriptor_2.id = 0;
|
|
obj->dtcp2_required.cmi_descriptor_2.extension = 0;
|
|
obj->dtcp2_required.cmi_descriptor_2.length = 0;
|
|
obj->dtcp2_required.cmi_descriptor_2.data[0] = 0;
|
|
obj->dtcp2_required.cmi_descriptor_2.data[1] = 0;
|
|
obj->dtcp2_required.cmi_descriptor_2.data[2] = 0;
|
|
}
|
|
Unpack_OEMCrypto_TimerDelayBase(msg, &obj->renewal_delay_base);
|
|
Unpack_uint32_t(msg, &obj->key_array_length);
|
|
if (obj->key_array_length > ODK_MAX_NUM_KEYS) {
|
|
ODK_Message_SetStatus(msg, MESSAGE_STATUS_OVERFLOW_ERROR);
|
|
return;
|
|
}
|
|
uint32_t i;
|
|
for (i = 0; i < obj->key_array_length; i++) {
|
|
Unpack_OEMCrypto_KeyObject(msg, &obj->key_array[i]);
|
|
}
|
|
}
|
|
|
|
static void Unpack_ODK_ParsedLicenseV17(ODK_Message* msg,
|
|
ODK_ParsedLicenseV17* obj) {
|
|
Unpack_OEMCrypto_Substring(msg, &obj->enc_mac_keys_iv);
|
|
Unpack_OEMCrypto_Substring(msg, &obj->enc_mac_keys);
|
|
Unpack_OEMCrypto_Substring(msg, &obj->pst);
|
|
Unpack_OEMCrypto_Substring(msg, &obj->srm_restriction_data);
|
|
Unpack_OEMCrypto_LicenseType(msg, &obj->license_type);
|
|
Unpack_bool(msg, &obj->nonce_required);
|
|
Unpack_ODK_TimerLimits(msg, &obj->timer_limits);
|
|
Unpack_uint32_t(msg, &obj->watermarking);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.dtcp2_required);
|
|
if (obj->dtcp2_required.dtcp2_required) {
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_0.id);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_0.extension);
|
|
Unpack_uint16_t(msg, &obj->dtcp2_required.cmi_descriptor_0.length);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_0.data);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_1.id);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_1.extension);
|
|
Unpack_uint16_t(msg, &obj->dtcp2_required.cmi_descriptor_1.length);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_1.data[0]);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_1.data[1]);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_1.data[2]);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_2.id);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_2.extension);
|
|
Unpack_uint16_t(msg, &obj->dtcp2_required.cmi_descriptor_2.length);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_2.data[0]);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_2.data[1]);
|
|
Unpack_uint8_t(msg, &obj->dtcp2_required.cmi_descriptor_2.data[2]);
|
|
} else {
|
|
obj->dtcp2_required.dtcp2_required = 0;
|
|
obj->dtcp2_required.cmi_descriptor_0.id = 0;
|
|
obj->dtcp2_required.cmi_descriptor_0.extension = 0;
|
|
obj->dtcp2_required.cmi_descriptor_0.length = 0;
|
|
obj->dtcp2_required.cmi_descriptor_0.data = 0;
|
|
obj->dtcp2_required.cmi_descriptor_1.id = 0;
|
|
obj->dtcp2_required.cmi_descriptor_1.extension = 0;
|
|
obj->dtcp2_required.cmi_descriptor_1.length = 0;
|
|
obj->dtcp2_required.cmi_descriptor_1.data[0] = 0;
|
|
obj->dtcp2_required.cmi_descriptor_1.data[1] = 0;
|
|
obj->dtcp2_required.cmi_descriptor_1.data[2] = 0;
|
|
obj->dtcp2_required.cmi_descriptor_2.id = 0;
|
|
obj->dtcp2_required.cmi_descriptor_2.extension = 0;
|
|
obj->dtcp2_required.cmi_descriptor_2.length = 0;
|
|
obj->dtcp2_required.cmi_descriptor_2.data[0] = 0;
|
|
obj->dtcp2_required.cmi_descriptor_2.data[1] = 0;
|
|
obj->dtcp2_required.cmi_descriptor_2.data[2] = 0;
|
|
}
|
|
Unpack_uint32_t(msg, &obj->key_array_length);
|
|
if (obj->key_array_length > ODK_MAX_NUM_KEYS) {
|
|
ODK_Message_SetStatus(msg, MESSAGE_STATUS_OVERFLOW_ERROR);
|
|
return;
|
|
}
|
|
uint32_t i;
|
|
for (i = 0; i < obj->key_array_length; i++) {
|
|
Unpack_OEMCrypto_KeyObject(msg, &obj->key_array[i]);
|
|
}
|
|
}
|
|
|
|
static void Unpack_ODK_ParsedLicenseV16(ODK_Message* msg,
|
|
ODK_ParsedLicenseV16* obj) {
|
|
Unpack_OEMCrypto_Substring(msg, &obj->enc_mac_keys_iv);
|
|
Unpack_OEMCrypto_Substring(msg, &obj->enc_mac_keys);
|
|
Unpack_OEMCrypto_Substring(msg, &obj->pst);
|
|
Unpack_OEMCrypto_Substring(msg, &obj->srm_restriction_data);
|
|
Unpack_OEMCrypto_LicenseType(msg, &obj->license_type);
|
|
Unpack_bool(msg, &obj->nonce_required);
|
|
Unpack_ODK_TimerLimits(msg, &obj->timer_limits);
|
|
Unpack_uint32_t(msg, &obj->key_array_length);
|
|
if (obj->key_array_length > ODK_MAX_NUM_KEYS) {
|
|
ODK_Message_SetStatus(msg, MESSAGE_STATUS_OVERFLOW_ERROR);
|
|
return;
|
|
}
|
|
uint32_t i;
|
|
for (i = 0; i < obj->key_array_length; i++) {
|
|
Unpack_OEMCrypto_KeyObject(msg, &obj->key_array[i]);
|
|
}
|
|
}
|
|
|
|
static void Unpack_ODK_ParsedProvisioning(ODK_Message* msg,
|
|
ODK_ParsedProvisioning* obj) {
|
|
Unpack_OEMCrypto_PrivateKeyType(msg, &obj->key_type);
|
|
Unpack_OEMCrypto_Substring(msg, &obj->enc_private_key);
|
|
Unpack_OEMCrypto_Substring(msg, &obj->enc_private_key_iv);
|
|
Unpack_OEMCrypto_Substring(msg, &obj->encrypted_message_key);
|
|
}
|
|
|
|
static void Unpack_ODK_MessageCounterInfo(ODK_Message* msg,
|
|
ODK_MessageCounterInfo* obj) {
|
|
Unpack_uint64_t(msg, &obj->master_generation_number);
|
|
Unpack_uint32_t(msg, &obj->provisioning_count);
|
|
Unpack_uint32_t(msg, &obj->license_count);
|
|
Unpack_uint32_t(msg, &obj->decrypt_count);
|
|
Unpack_uint16_t(msg, &obj->major_version);
|
|
Unpack_uint16_t(msg, &obj->minor_version);
|
|
Unpack_uint16_t(msg, &obj->patch_version);
|
|
UnpackArray(msg, &obj->soc_vendor[0], sizeof(obj->soc_vendor));
|
|
UnpackArray(msg, &obj->chipset_model[0], sizeof(obj->chipset_model));
|
|
UnpackArray(msg, &obj->extra[0], sizeof(obj->extra));
|
|
}
|
|
|
|
/* @ kdo deserialize */
|
|
|
|
void Unpack_ODK_PreparedLicenseRequest(ODK_Message* msg,
|
|
ODK_PreparedLicenseRequest* obj) {
|
|
Unpack_ODK_CoreMessage(msg, &obj->core_message);
|
|
Unpack_ODK_MessageCounterInfo(msg, &obj->counter_info);
|
|
}
|
|
|
|
void Unpack_ODK_PreparedLicenseRequestV17(ODK_Message* msg,
|
|
ODK_PreparedLicenseRequestV17* obj) {
|
|
Unpack_ODK_CoreMessage(msg, &obj->core_message);
|
|
}
|
|
|
|
void Unpack_ODK_PreparedRenewalRequest(ODK_Message* msg,
|
|
ODK_PreparedRenewalRequest* obj) {
|
|
Unpack_ODK_CoreMessage(msg, &obj->core_message);
|
|
Unpack_uint64_t(msg, &obj->playback_time);
|
|
}
|
|
|
|
void Unpack_ODK_PreparedProvisioningRequest(
|
|
ODK_Message* msg, ODK_PreparedProvisioningRequest* obj) {
|
|
Unpack_ODK_CoreMessage(msg, &obj->core_message);
|
|
// Fake device_id_length for older servers, since we removed device id from
|
|
// the v18 request
|
|
uint32_t device_id_len = 0;
|
|
Unpack_uint32_t(msg, &device_id_len);
|
|
Unpack_ODK_MessageCounterInfo(msg, &obj->counter_info);
|
|
}
|
|
|
|
void Unpack_ODK_PreparedProvisioningRequestV17(
|
|
ODK_Message* msg, ODK_PreparedProvisioningRequestV17* obj) {
|
|
Unpack_ODK_CoreMessage(msg, &obj->core_message);
|
|
Unpack_uint32_t(msg, &obj->device_id_length);
|
|
UnpackArray(msg, &obj->device_id[0], sizeof(obj->device_id));
|
|
}
|
|
|
|
void Unpack_ODK_PreparedProvisioning40Request(
|
|
ODK_Message* msg, ODK_PreparedProvisioning40Request* obj) {
|
|
Unpack_ODK_CoreMessage(msg, &obj->core_message);
|
|
Unpack_uint32_t(msg, &obj->device_info_length);
|
|
UnpackArray(msg, &obj->device_info[0], sizeof(obj->device_info));
|
|
Unpack_ODK_MessageCounterInfo(msg, &obj->counter_info);
|
|
}
|
|
|
|
void Unpack_ODK_PreparedRenewedProvisioningRequest(
|
|
ODK_Message* msg, ODK_PreparedRenewedProvisioningRequest* obj) {
|
|
Unpack_ODK_CoreMessage(msg, &obj->core_message);
|
|
Unpack_uint32_t(msg, &obj->device_id_length);
|
|
UnpackArray(msg, &obj->device_id[0], sizeof(obj->device_id));
|
|
Unpack_uint16_t(msg, &obj->renewal_type);
|
|
Unpack_uint32_t(msg, &obj->renewal_data_length);
|
|
UnpackArray(msg, &obj->renewal_data[0], obj->renewal_data_length);
|
|
}
|
|
|
|
void Unpack_ODK_PreparedCommonRequest(ODK_Message* msg,
|
|
ODK_PreparedCommonRequest* obj) {
|
|
Unpack_ODK_CoreMessage(msg, &obj->core_message);
|
|
}
|
|
/* @@ odk deserialize */
|
|
|
|
void Unpack_ODK_LicenseResponse(ODK_Message* msg, ODK_LicenseResponse* obj) {
|
|
Unpack_ODK_CoreMessage(msg, &obj->core_message);
|
|
Unpack_ODK_ParsedLicense(msg, obj->parsed_license);
|
|
}
|
|
|
|
void Unpack_ODK_LicenseResponseV17(ODK_Message* msg,
|
|
ODK_LicenseResponseV17* obj) {
|
|
Unpack_ODK_PreparedLicenseRequestV17(msg, &obj->request);
|
|
Unpack_ODK_ParsedLicenseV17(msg, &obj->parsed_license);
|
|
}
|
|
|
|
void Unpack_ODK_LicenseResponseV16(ODK_Message* msg,
|
|
ODK_LicenseResponseV16* obj) {
|
|
Unpack_ODK_PreparedLicenseRequestV17(msg, &obj->request);
|
|
Unpack_ODK_ParsedLicenseV16(msg, &obj->parsed_license);
|
|
UnpackArray(msg, &obj->request_hash[0], sizeof(obj->request_hash));
|
|
}
|
|
|
|
void Unpack_ODK_RenewalResponse(ODK_Message* msg, ODK_RenewalResponse* obj) {
|
|
Unpack_ODK_PreparedRenewalRequest(msg, &obj->request);
|
|
Unpack_uint64_t(msg, &obj->renewal_duration_seconds);
|
|
}
|
|
|
|
void Unpack_ODK_ProvisioningResponse(ODK_Message* msg,
|
|
ODK_ProvisioningResponse* obj) {
|
|
Unpack_ODK_CoreMessage(msg, &obj->core_message);
|
|
Unpack_ODK_ParsedProvisioning(msg, obj->parsed_provisioning);
|
|
}
|
|
|
|
void Unpack_ODK_ProvisioningResponseV16(ODK_Message* msg,
|
|
ODK_ProvisioningResponseV16* obj) {
|
|
Unpack_ODK_PreparedProvisioningRequestV17(msg, &obj->request);
|
|
Unpack_ODK_ParsedProvisioning(msg, obj->parsed_provisioning);
|
|
}
|
|
|
|
void Unpack_ODK_Provisioning40Response(ODK_Message* msg,
|
|
ODK_Provisioning40Response* obj) {
|
|
Unpack_ODK_CoreMessage(msg, &obj->core_message);
|
|
}
|