Allow server to send license with larger ODK_MAX_NUM_KEYS
PiperOrigin-RevId: 538676411 Merged from https://widevine-internal-review.googlesource.com/175915 Change-Id: Iadef2115fe3f9001034223e647cbfa6228484281
This commit is contained in:
@@ -116,19 +116,16 @@ bool CopyDeviceId(const ODK_ProvisioningRequest& src,
|
||||
} // namespace
|
||||
|
||||
bool CreateCoreLicenseResponse(const CoreMessageFeatures& features,
|
||||
const ODK_ParsedLicense& parsed_lic,
|
||||
const ODK_Packing_ParsedLicense& parsed_lic,
|
||||
const ODK_LicenseRequest& core_request,
|
||||
const std::string& core_request_sha256,
|
||||
std::string* oemcrypto_core_message) {
|
||||
ODK_LicenseResponse license_response{
|
||||
{}, const_cast<ODK_ParsedLicense*>(&parsed_lic), {}};
|
||||
ODK_Packing_LicenseResponse license_response{
|
||||
{}, const_cast<ODK_Packing_ParsedLicense*>(&parsed_lic), {}};
|
||||
if (!CreateResponseHeader(features, ODK_License_Response_Type,
|
||||
&license_response.core_message, core_request)) {
|
||||
return false;
|
||||
}
|
||||
if (ODK_MAX_NUM_KEYS < license_response.parsed_license->key_array_length) {
|
||||
return false;
|
||||
}
|
||||
if (license_response.core_message.nonce_values.api_major_version == 16) {
|
||||
if (core_request_sha256.size() != sizeof(license_response.request_hash))
|
||||
return false;
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include <cstdint>
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "core_message_serialize.h"
|
||||
#include "license_protocol.pb.h"
|
||||
@@ -83,7 +84,8 @@ bool CreateCoreLicenseResponseFromProto(const CoreMessageFeatures& features,
|
||||
return false;
|
||||
}
|
||||
|
||||
ODK_ParsedLicense parsed_lic{};
|
||||
ODK_Packing_ParsedLicense parsed_lic{};
|
||||
std::vector<OEMCrypto_KeyObject> key_array;
|
||||
bool any_content = false;
|
||||
bool any_entitlement = false;
|
||||
|
||||
@@ -110,12 +112,8 @@ bool CreateCoreLicenseResponseFromProto(const CoreMessageFeatures& features,
|
||||
} else {
|
||||
any_content = true;
|
||||
}
|
||||
if (parsed_lic.key_array_length >= ODK_MAX_NUM_KEYS) {
|
||||
return false;
|
||||
}
|
||||
uint32_t& n = parsed_lic.key_array_length;
|
||||
parsed_lic.key_array[n++] =
|
||||
KeyContainerToOecKey(serialized_license, k, uses_padding);
|
||||
key_array.push_back(
|
||||
KeyContainerToOecKey(serialized_license, k, uses_padding));
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
@@ -173,6 +171,9 @@ bool CreateCoreLicenseResponseFromProto(const CoreMessageFeatures& features,
|
||||
policy.renewal_delay_seconds() +
|
||||
policy.renewal_recovery_duration_seconds();
|
||||
|
||||
parsed_lic.key_array = key_array.data();
|
||||
parsed_lic.key_array_length = static_cast<uint32_t>(key_array.size());
|
||||
|
||||
return CreateCoreLicenseResponse(features, parsed_lic, core_request,
|
||||
core_request_sha256, oemcrypto_core_message);
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ 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_Packing_ParsedLicense const* obj,
|
||||
const ODK_NonceValues* nonce_values) {
|
||||
/* hand-coded */
|
||||
if (obj->key_array_length > ODK_MAX_NUM_KEYS) {
|
||||
@@ -172,9 +172,10 @@ void Pack_ODK_PreparedRenewedProvisioningRequest(
|
||||
/* @@ kdo serialize */
|
||||
|
||||
void Pack_ODK_LicenseResponse(ODK_Message* msg,
|
||||
ODK_LicenseResponse const* obj) {
|
||||
ODK_Packing_LicenseResponse const* obj) {
|
||||
Pack_ODK_CoreMessage(msg, &obj->core_message);
|
||||
Pack_ODK_ParsedLicense(msg, (const ODK_ParsedLicense*)obj->parsed_license,
|
||||
Pack_ODK_ParsedLicense(msg,
|
||||
(const ODK_Packing_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));
|
||||
|
||||
@@ -43,7 +43,8 @@ void Unpack_ODK_Provisioning40Response(ODK_Message* msg,
|
||||
ODK_Provisioning40Response* obj);
|
||||
|
||||
/* kdo pack */
|
||||
void Pack_ODK_LicenseResponse(ODK_Message* msg, const ODK_LicenseResponse* obj);
|
||||
void Pack_ODK_LicenseResponse(ODK_Message* msg,
|
||||
const ODK_Packing_LicenseResponse* obj);
|
||||
void Pack_ODK_RenewalResponse(ODK_Message* msg, const ODK_RenewalResponse* obj);
|
||||
void Pack_ODK_ProvisioningResponse(ODK_Message* msg,
|
||||
const ODK_ProvisioningResponse* obj);
|
||||
|
||||
@@ -91,6 +91,12 @@ typedef struct {
|
||||
uint8_t request_hash[ODK_SHA256_HASH_SIZE];
|
||||
} ODK_LicenseResponse;
|
||||
|
||||
typedef struct {
|
||||
ODK_CoreMessage core_message;
|
||||
ODK_Packing_ParsedLicense* parsed_license;
|
||||
uint8_t request_hash[ODK_SHA256_HASH_SIZE];
|
||||
} ODK_Packing_LicenseResponse;
|
||||
|
||||
typedef struct {
|
||||
ODK_PreparedRenewalRequest request;
|
||||
uint64_t renewal_duration_seconds;
|
||||
|
||||
Reference in New Issue
Block a user