// 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, const ODK_NonceValues* nonce_values) { /* 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); if (nonce_values->api_major_version >= 17) { 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]); } } if (nonce_values->api_major_version >= 18) { 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_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, &obj->core_message.nonce_values); if ((&obj->core_message.nonce_values)->api_major_version == 16) { 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, const ODK_NonceValues* nonce_values) { 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); if (nonce_values->api_major_version >= 17) { 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]); } } if (nonce_values->api_major_version >= 18) { 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_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_PreparedProvisioningRequestV180( ODK_Message* msg, ODK_PreparedProvisioningRequest* obj) { Unpack_ODK_CoreMessage(msg, &obj->core_message); 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, &obj->core_message.nonce_values); if ((&obj->core_message.nonce_values)->api_major_version == 16) { 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); }