Cleanup design of ODK_ParsedLicense handling and maintain backwards compatibility
PiperOrigin-RevId: 529531139 Merged from https://widevine-internal-review.googlesource.com/172870 Change-Id: Id07dc82a8c2729cdbf10a9c8680ed979f8de51b5
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user