diff --git a/libwvdrmengine/oemcrypto/odk/src/core_message_serialize.cpp b/libwvdrmengine/oemcrypto/odk/src/core_message_serialize.cpp index 79a9398d..6b3caf4a 100644 --- a/libwvdrmengine/oemcrypto/odk/src/core_message_serialize.cpp +++ b/libwvdrmengine/oemcrypto/odk/src/core_message_serialize.cpp @@ -130,97 +130,10 @@ bool CreateCoreLicenseResponse(const CoreMessageFeatures& features, return false; } if (license_response.core_message.nonce_values.api_major_version == 16) { - ODK_LicenseResponseV16 license_response_v16; - license_response_v16.request.core_message = license_response.core_message; - license_response_v16.parsed_license.enc_mac_keys_iv = - license_response.parsed_license->enc_mac_keys_iv; - license_response_v16.parsed_license.enc_mac_keys = - license_response.parsed_license->enc_mac_keys; - license_response_v16.parsed_license.pst = - license_response.parsed_license->pst; - license_response_v16.parsed_license.srm_restriction_data = - license_response.parsed_license->srm_restriction_data; - license_response_v16.parsed_license.license_type = - license_response.parsed_license->license_type; - license_response_v16.parsed_license.nonce_required = - license_response.parsed_license->nonce_required; - license_response_v16.parsed_license.timer_limits = - license_response.parsed_license->timer_limits; - license_response_v16.parsed_license.key_array_length = - license_response.parsed_license->key_array_length; - uint32_t i; - for (i = 0; i < license_response_v16.parsed_license.key_array_length && - i < license_response.parsed_license->key_array_length; - i++) { - license_response_v16.parsed_license.key_array[i] = - license_response.parsed_license->key_array[i]; - } - if (core_request_sha256.size() != sizeof(license_response_v16.request_hash)) + if (core_request_sha256.size() != sizeof(license_response.request_hash)) return false; - memcpy(license_response_v16.request_hash, core_request_sha256.data(), - sizeof(license_response_v16.request_hash)); - return CreateResponse(ODK_License_Response_Type, oemcrypto_core_message, - &license_response_v16.request.core_message, - license_response_v16, Pack_ODK_LicenseResponseV16); - } else if (license_response.core_message.nonce_values.api_major_version == - 17) { - ODK_LicenseResponseV17 license_response_v17; - ODK_ParsedLicenseV17* dest = &license_response_v17.parsed_license; - ODK_ParsedLicense src = *license_response.parsed_license; - license_response_v17.request.core_message = license_response.core_message; - dest->enc_mac_keys_iv = src.enc_mac_keys_iv; - dest->enc_mac_keys = src.enc_mac_keys; - dest->pst = src.pst; - dest->srm_restriction_data = src.srm_restriction_data; - dest->license_type = src.license_type; - dest->nonce_required = src.nonce_required; - dest->timer_limits = src.timer_limits; - dest->watermarking = src.watermarking; - dest->dtcp2_required.dtcp2_required = src.dtcp2_required.dtcp2_required; - dest->dtcp2_required.cmi_descriptor_0.id = - src.dtcp2_required.cmi_descriptor_0.id; - dest->dtcp2_required.cmi_descriptor_0.extension = - src.dtcp2_required.cmi_descriptor_0.extension; - dest->dtcp2_required.cmi_descriptor_0.length = - src.dtcp2_required.cmi_descriptor_0.length; - dest->dtcp2_required.cmi_descriptor_0.data = - src.dtcp2_required.cmi_descriptor_0.data; - dest->dtcp2_required.cmi_descriptor_1.id = - src.dtcp2_required.cmi_descriptor_1.id; - dest->dtcp2_required.cmi_descriptor_1.extension = - src.dtcp2_required.cmi_descriptor_1.extension; - dest->dtcp2_required.cmi_descriptor_1.length = - src.dtcp2_required.cmi_descriptor_1.length; - dest->dtcp2_required.cmi_descriptor_1.data[0] = - src.dtcp2_required.cmi_descriptor_1.data[0]; - dest->dtcp2_required.cmi_descriptor_1.data[1] = - src.dtcp2_required.cmi_descriptor_1.data[1]; - dest->dtcp2_required.cmi_descriptor_1.data[2] = - src.dtcp2_required.cmi_descriptor_1.data[2]; - dest->dtcp2_required.cmi_descriptor_2.id = - src.dtcp2_required.cmi_descriptor_2.id; - dest->dtcp2_required.cmi_descriptor_2.extension = - src.dtcp2_required.cmi_descriptor_2.extension; - dest->dtcp2_required.cmi_descriptor_2.length = - src.dtcp2_required.cmi_descriptor_2.length; - dest->dtcp2_required.cmi_descriptor_2.data[0] = - src.dtcp2_required.cmi_descriptor_2.data[0]; - dest->dtcp2_required.cmi_descriptor_2.data[1] = - src.dtcp2_required.cmi_descriptor_2.data[1]; - dest->dtcp2_required.cmi_descriptor_2.data[2] = - src.dtcp2_required.cmi_descriptor_2.data[2]; - dest->key_array_length = src.key_array_length; - uint32_t i; - for (i = 0; i < dest->key_array_length && i < src.key_array_length; i++) { - dest->key_array[i] = src.key_array[i]; - } - if (core_request_sha256.size() != sizeof(license_response_v17.request_hash)) - return false; - memcpy(license_response_v17.request_hash, core_request_sha256.data(), - sizeof(license_response_v17.request_hash)); - return CreateResponse(ODK_License_Response_Type, oemcrypto_core_message, - &license_response_v17.request.core_message, - license_response_v17, Pack_ODK_LicenseResponseV17); + memcpy(license_response.request_hash, core_request_sha256.data(), + sizeof(license_response.request_hash)); } return CreateResponse(ODK_License_Response_Type, oemcrypto_core_message, &license_response.core_message, license_response, diff --git a/libwvdrmengine/oemcrypto/odk/src/odk.c b/libwvdrmengine/oemcrypto/odk/src/odk.c index db6f5101..60adca5b 100644 --- a/libwvdrmengine/oemcrypto/odk/src/odk.c +++ b/libwvdrmengine/oemcrypto/odk/src/odk.c @@ -342,132 +342,12 @@ OEMCryptoResult ODK_ParseLicense( ODK_Message msg = ODK_Message_Create((uint8_t*)message, message_length); ODK_Message_SetSize(&msg, core_message_length); - if (nonce_values->api_major_version == 16) { - ODK_LicenseResponseV16 license_response_v16 = {0}; - Unpack_ODK_LicenseResponseV16(&msg, &license_response_v16); - if (ODK_Message_GetStatus(&msg) != MESSAGE_STATUS_OK || - ODK_Message_GetOffset(&msg) != core_message_length) { - return ODK_ERROR_CORE_MESSAGE; - } + Unpack_ODK_LicenseResponse(&msg, &license_response); - // Need to manually set parsed_license fields to - // license_response_v16.parsed_license field values since - // license_response_v16 is no longer a pointer so parsed_license doesn't get - // updated during the unpacking. - parsed_license->enc_mac_keys_iv = - license_response_v16.parsed_license.enc_mac_keys_iv; - parsed_license->enc_mac_keys = - license_response_v16.parsed_license.enc_mac_keys; - parsed_license->pst = license_response_v16.parsed_license.pst; - parsed_license->srm_restriction_data = - license_response_v16.parsed_license.srm_restriction_data; - parsed_license->license_type = - license_response_v16.parsed_license.license_type; - parsed_license->nonce_required = - license_response_v16.parsed_license.nonce_required; - parsed_license->timer_limits = - license_response_v16.parsed_license.timer_limits; - parsed_license->key_array_length = - license_response_v16.parsed_license.key_array_length; - uint32_t i; - for (i = 0; i < parsed_license->key_array_length; i++) { - parsed_license->key_array[i] = - license_response_v16.parsed_license.key_array[i]; - } - // Set fields not used in V16 to default values. - parsed_license->watermarking = 0; - parsed_license->dtcp2_required.dtcp2_required = 0; - parsed_license->dtcp2_required.cmi_descriptor_0.id = 0; - parsed_license->dtcp2_required.cmi_descriptor_0.extension = 0; - parsed_license->dtcp2_required.cmi_descriptor_0.length = 1; - parsed_license->dtcp2_required.cmi_descriptor_0.data = 0; - parsed_license->dtcp2_required.cmi_descriptor_1.id = 1; - parsed_license->dtcp2_required.cmi_descriptor_1.extension = 0; - parsed_license->dtcp2_required.cmi_descriptor_1.length = 3; - parsed_license->dtcp2_required.cmi_descriptor_1.data[0] = 0; - parsed_license->dtcp2_required.cmi_descriptor_1.data[1] = 0; - parsed_license->dtcp2_required.cmi_descriptor_1.data[2] = 0; - parsed_license->dtcp2_required.cmi_descriptor_2.id = 2; - parsed_license->dtcp2_required.cmi_descriptor_2.extension = 0; - parsed_license->dtcp2_required.cmi_descriptor_2.length = 3; - parsed_license->dtcp2_required.cmi_descriptor_2.data[0] = 0; - parsed_license->dtcp2_required.cmi_descriptor_2.data[1] = 0; - parsed_license->dtcp2_required.cmi_descriptor_2.data[2] = 0; - license_response.core_message = license_response_v16.request.core_message; - parsed_license->renewal_delay_base = 0; - } else if (nonce_values->api_major_version == 17) { - ODK_LicenseResponseV17 license_response_v17 = {0}; - Unpack_ODK_LicenseResponseV17(&msg, &license_response_v17); - - if (ODK_Message_GetStatus(&msg) != MESSAGE_STATUS_OK || - ODK_Message_GetOffset(&msg) != core_message_length) { - return ODK_ERROR_CORE_MESSAGE; - } - - ODK_ParsedLicenseV17 src = license_response_v17.parsed_license; - - // Need to manually set parsed_license fields to - // license_response_v17.parsed_license field values since - // license_response_v17 is no longer a pointer so parsed_license doesn't get - // updated during the unpacking. - parsed_license->enc_mac_keys_iv = src.enc_mac_keys_iv; - parsed_license->enc_mac_keys = src.enc_mac_keys; - parsed_license->pst = src.pst; - parsed_license->srm_restriction_data = src.srm_restriction_data; - parsed_license->license_type = src.license_type; - parsed_license->nonce_required = src.nonce_required; - parsed_license->timer_limits = src.timer_limits; - parsed_license->watermarking = src.watermarking; - parsed_license->dtcp2_required.dtcp2_required = - src.dtcp2_required.dtcp2_required; - parsed_license->dtcp2_required.cmi_descriptor_0.id = - src.dtcp2_required.cmi_descriptor_0.id; - parsed_license->dtcp2_required.cmi_descriptor_0.extension = - src.dtcp2_required.cmi_descriptor_0.extension; - parsed_license->dtcp2_required.cmi_descriptor_0.length = - src.dtcp2_required.cmi_descriptor_0.length; - parsed_license->dtcp2_required.cmi_descriptor_0.data = - src.dtcp2_required.cmi_descriptor_0.data; - parsed_license->dtcp2_required.cmi_descriptor_1.id = - src.dtcp2_required.cmi_descriptor_1.id; - parsed_license->dtcp2_required.cmi_descriptor_1.extension = - src.dtcp2_required.cmi_descriptor_1.extension; - parsed_license->dtcp2_required.cmi_descriptor_1.length = - src.dtcp2_required.cmi_descriptor_1.length; - parsed_license->dtcp2_required.cmi_descriptor_1.data[0] = - src.dtcp2_required.cmi_descriptor_1.data[0]; - parsed_license->dtcp2_required.cmi_descriptor_1.data[1] = - src.dtcp2_required.cmi_descriptor_1.data[1]; - parsed_license->dtcp2_required.cmi_descriptor_1.data[2] = - src.dtcp2_required.cmi_descriptor_1.data[2]; - parsed_license->dtcp2_required.cmi_descriptor_2.id = - src.dtcp2_required.cmi_descriptor_2.id; - parsed_license->dtcp2_required.cmi_descriptor_2.extension = - src.dtcp2_required.cmi_descriptor_2.extension; - parsed_license->dtcp2_required.cmi_descriptor_2.length = - src.dtcp2_required.cmi_descriptor_2.length; - parsed_license->dtcp2_required.cmi_descriptor_2.data[0] = - src.dtcp2_required.cmi_descriptor_2.data[0]; - parsed_license->dtcp2_required.cmi_descriptor_2.data[1] = - src.dtcp2_required.cmi_descriptor_2.data[1]; - parsed_license->dtcp2_required.cmi_descriptor_2.data[2] = - src.dtcp2_required.cmi_descriptor_2.data[2]; - parsed_license->key_array_length = src.key_array_length; - uint32_t i; - for (i = 0; i < parsed_license->key_array_length; i++) { - parsed_license->key_array[i] = src.key_array[i]; - } - // Set fields not used in V17 to default values. - parsed_license->renewal_delay_base = 0; - license_response.core_message = license_response_v17.request.core_message; - } else { - Unpack_ODK_LicenseResponse(&msg, &license_response); - - if (ODK_Message_GetStatus(&msg) != MESSAGE_STATUS_OK || - ODK_Message_GetOffset(&msg) != core_message_length) { - return ODK_ERROR_CORE_MESSAGE; - } + if (ODK_Message_GetStatus(&msg) != MESSAGE_STATUS_OK || + ODK_Message_GetOffset(&msg) != core_message_length) { + return ODK_ERROR_CORE_MESSAGE; } /* If the license has a provider session token (pst), then OEMCrypto should diff --git a/libwvdrmengine/oemcrypto/odk/src/odk_serialize.c b/libwvdrmengine/oemcrypto/odk/src/odk_serialize.c index afbf5e77..82bffb4b 100644 --- a/libwvdrmengine/oemcrypto/odk/src/odk_serialize.c +++ b/libwvdrmengine/oemcrypto/odk/src/odk_serialize.c @@ -47,7 +47,8 @@ static void Pack_ODK_TimerLimits(ODK_Message* msg, ODK_TimerLimits const* obj) { } static void Pack_ODK_ParsedLicense(ODK_Message* msg, - ODK_ParsedLicense const* obj) { + 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); @@ -60,89 +61,31 @@ static void Pack_ODK_ParsedLicense(ODK_Message* msg, 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]); + 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]); + } } - 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]); + if (nonce_values->api_major_version >= 18) { + Pack_enum(msg, obj->renewal_delay_base); } -} - -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++) { @@ -231,20 +174,11 @@ void Pack_ODK_PreparedRenewedProvisioningRequest( 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)); + 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, @@ -307,7 +241,8 @@ static void Unpack_ODK_TimerLimits(ODK_Message* msg, ODK_TimerLimits* obj) { Unpack_uint64_t(msg, &obj->initial_renewal_duration_seconds); } -static void Unpack_ODK_ParsedLicense(ODK_Message* msg, ODK_ParsedLicense* obj) { +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); @@ -315,123 +250,31 @@ static void Unpack_ODK_ParsedLicense(ODK_Message* msg, ODK_ParsedLicense* obj) { 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; + 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]); + } } - 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; + if (nonce_values->api_major_version >= 18) { + Unpack_OEMCrypto_TimerDelayBase(msg, &obj->renewal_delay_base); } - 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); @@ -533,20 +376,11 @@ void Unpack_ODK_PreparedCommonRequest(ODK_Message* msg, 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)); + 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) { diff --git a/libwvdrmengine/oemcrypto/odk/src/odk_serialize.h b/libwvdrmengine/oemcrypto/odk/src/odk_serialize.h index 0942559b..b4334f05 100644 --- a/libwvdrmengine/oemcrypto/odk/src/odk_serialize.h +++ b/libwvdrmengine/oemcrypto/odk/src/odk_serialize.h @@ -34,10 +34,6 @@ void Pack_ODK_PreparedRenewedProvisioningRequest( /* odk unpack */ void Unpack_ODK_CoreMessage(ODK_Message* msg, ODK_CoreMessage* obj); void Unpack_ODK_LicenseResponse(ODK_Message* msg, ODK_LicenseResponse* obj); -void Unpack_ODK_LicenseResponseV17(ODK_Message* msg, - ODK_LicenseResponseV17* obj); -void Unpack_ODK_LicenseResponseV16(ODK_Message* msg, - ODK_LicenseResponseV16* obj); void Unpack_ODK_RenewalResponse(ODK_Message* msg, ODK_RenewalResponse* obj); void Unpack_ODK_ProvisioningResponse(ODK_Message* msg, ODK_ProvisioningResponse* obj); @@ -48,10 +44,6 @@ void Unpack_ODK_Provisioning40Response(ODK_Message* msg, /* kdo pack */ void Pack_ODK_LicenseResponse(ODK_Message* msg, const ODK_LicenseResponse* obj); -void Pack_ODK_LicenseResponseV17(ODK_Message* msg, - const ODK_LicenseResponseV17* obj); -void Pack_ODK_LicenseResponseV16(ODK_Message* msg, - const ODK_LicenseResponseV16* obj); void Pack_ODK_RenewalResponse(ODK_Message* msg, const ODK_RenewalResponse* obj); void Pack_ODK_ProvisioningResponse(ODK_Message* msg, const ODK_ProvisioningResponse* obj); diff --git a/libwvdrmengine/oemcrypto/odk/src/odk_structs_priv.h b/libwvdrmengine/oemcrypto/odk/src/odk_structs_priv.h index b20cc720..b8989f10 100644 --- a/libwvdrmengine/oemcrypto/odk/src/odk_structs_priv.h +++ b/libwvdrmengine/oemcrypto/odk/src/odk_structs_priv.h @@ -85,49 +85,12 @@ typedef struct { ODK_CoreMessage core_message; } ODK_PreparedCommonRequest; -typedef struct { - OEMCrypto_Substring enc_mac_keys_iv; - OEMCrypto_Substring enc_mac_keys; - OEMCrypto_Substring pst; - OEMCrypto_Substring srm_restriction_data; - OEMCrypto_LicenseType license_type; - bool nonce_required; - ODK_TimerLimits timer_limits; - uint32_t key_array_length; - OEMCrypto_KeyObject key_array[ODK_MAX_NUM_KEYS]; -} ODK_ParsedLicenseV16; - -typedef struct { - OEMCrypto_Substring enc_mac_keys_iv; - OEMCrypto_Substring enc_mac_keys; - OEMCrypto_Substring pst; - OEMCrypto_Substring srm_restriction_data; - OEMCrypto_LicenseType license_type; - bool nonce_required; - ODK_TimerLimits timer_limits; - uint32_t watermarking; - OEMCrypto_DTCP2_CMI_Packet dtcp2_required; - uint32_t key_array_length; - OEMCrypto_KeyObject key_array[ODK_MAX_NUM_KEYS]; -} ODK_ParsedLicenseV17; - typedef struct { ODK_CoreMessage core_message; ODK_ParsedLicense* parsed_license; + uint8_t request_hash[ODK_SHA256_HASH_SIZE]; } ODK_LicenseResponse; -typedef struct { - ODK_PreparedLicenseRequestV17 request; - ODK_ParsedLicenseV17 parsed_license; - uint8_t request_hash[ODK_SHA256_HASH_SIZE]; -} ODK_LicenseResponseV17; - -typedef struct { - ODK_PreparedLicenseRequestV17 request; - ODK_ParsedLicenseV16 parsed_license; - uint8_t request_hash[ODK_SHA256_HASH_SIZE]; -} ODK_LicenseResponseV16; - typedef struct { ODK_PreparedRenewalRequest request; uint64_t renewal_duration_seconds;