ODK implementation for license release

PiperOrigin-RevId: 580643396
Change-Id: I588ef20587acc347b510dfb7fd9e372d221100a0
This commit is contained in:
Vicky Min
2023-11-08 13:42:54 -08:00
committed by Robert Shih
parent 692cb259f3
commit 4d7025e517
13 changed files with 163 additions and 4 deletions

View File

@@ -11,6 +11,7 @@
#include <string>
#include "OEMCryptoCENCCommon.h"
#include "core_message_types.h"
#include "odk_message.h"
#include "odk_serialize.h"
#include "odk_structs.h"
@@ -147,6 +148,14 @@ bool CoreLicenseRequestFromMessage(const std::string& oemcrypto_core_message,
return true;
}
bool CoreReleaseRequestFromMessage(const std::string& oemcrypto_core_message,
ODK_ReleaseRequest* core_release_request) {
ODK_PreparedReleaseRequest prepared_release = {};
return ParseRequest(ODK_Release_Request_Type, oemcrypto_core_message,
core_release_request, &prepared_release,
Unpack_ODK_PreparedReleaseRequest);
}
bool CoreRenewalRequestFromMessage(const std::string& oemcrypto_core_message,
ODK_RenewalRequest* core_renewal_request) {
const auto unpacker = Unpack_ODK_PreparedRenewalRequest;

View File

@@ -10,6 +10,7 @@
#include <string>
#include <vector>
#include "core_message_types.h"
#include "odk_serialize.h"
#include "odk_structs.h"
#include "odk_structs_priv.h"
@@ -137,6 +138,21 @@ bool CreateCoreLicenseResponse(const CoreMessageFeatures& features,
Pack_ODK_LicenseResponse);
}
bool CreateCoreReleaseResponse(const CoreMessageFeatures& features,
const ODK_ReleaseRequest& core_request,
int64_t seconds_since_license_requested,
int64_t seconds_since_first_decrypt,
std::string* oemcrypto_core_message) {
ODK_ReleaseResponse release_response{};
if (!CreateResponseHeader(features, ODK_Release_Response_Type,
&release_response.core_message, core_request)) {
return false;
}
return CreateResponse(ODK_Release_Response_Type, oemcrypto_core_message,
&release_response.core_message, release_response,
Pack_ODK_ReleaseResponse);
}
bool CreateCoreRenewalResponse(const CoreMessageFeatures& features,
const ODK_RenewalRequest& core_request,
uint64_t renewal_duration_seconds,

View File

@@ -66,6 +66,15 @@ static OEMCryptoResult ODK_PrepareRequest(
}
break;
}
case ODK_Release_Request_Type: {
core_message->message_length = ODK_RELEASE_REQUEST_SIZE;
if (sizeof(ODK_PreparedReleaseRequest) > prepared_request_buffer_length) {
return ODK_ERROR_CORE_MESSAGE;
}
Pack_ODK_PreparedReleaseRequest(
&msg, (ODK_PreparedReleaseRequest*)prepared_request_buffer);
break;
}
case ODK_Renewal_Request_Type: {
core_message->message_length = ODK_RENEWAL_REQUEST_SIZE;
if (sizeof(ODK_PreparedRenewalRequest) > prepared_request_buffer_length) {
@@ -224,6 +233,29 @@ OEMCryptoResult ODK_PrepareCoreLicenseRequest(
}
}
OEMCryptoResult ODK_PrepareCoreReleaseRequest(
uint8_t* message, size_t message_length, size_t* core_message_size,
const ODK_NonceValues* nonce_values,
const ODK_MessageCounterInfo* counter_info, uint32_t status,
uint32_t clock_security_level, int64_t seconds_since_license_requested,
int64_t seconds_since_first_decrypt) {
if (core_message_size == NULL || nonce_values == NULL ||
counter_info == NULL) {
return ODK_ERROR_CORE_MESSAGE;
}
if (nonce_values->api_major_version >= 19) {
ODK_PreparedReleaseRequest release_request = {0};
return ODK_PrepareRequest(
message, message_length, core_message_size, ODK_Release_Request_Type,
nonce_values, &release_request, sizeof(ODK_PreparedReleaseRequest));
} else {
// If the version is pre 19 when license release isn't supported, create a
// license request.
return ODK_PrepareCoreLicenseRequest(
message, message_length, core_message_size, nonce_values, counter_info);
}
}
OEMCryptoResult ODK_PrepareCoreRenewalRequest(uint8_t* message,
size_t message_length,
size_t* core_message_size,

View File

@@ -124,6 +124,11 @@ void Pack_ODK_PreparedLicenseRequestV17(
Pack_ODK_CoreMessage(msg, &obj->core_message);
}
void Pack_ODK_PreparedReleaseRequest(ODK_Message* msg,
const ODK_PreparedReleaseRequest* 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);
@@ -178,6 +183,11 @@ void Pack_ODK_LicenseResponse(ODK_Message* msg,
}
}
void Pack_ODK_ReleaseResponse(ODK_Message* msg,
ODK_ReleaseResponse const* obj) {
Pack_ODK_CoreMessage(msg, &obj->core_message);
}
void Pack_ODK_RenewalResponse(ODK_Message* msg,
ODK_RenewalResponse const* obj) {
Pack_ODK_PreparedRenewalRequest(msg, &obj->request);
@@ -318,6 +328,11 @@ void Unpack_ODK_PreparedLicenseRequestV17(ODK_Message* msg,
Unpack_ODK_CoreMessage(msg, &obj->core_message);
}
void Unpack_ODK_PreparedReleaseRequest(ODK_Message* msg,
ODK_PreparedReleaseRequest* 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);
@@ -380,6 +395,10 @@ void Unpack_ODK_LicenseResponse(ODK_Message* msg, ODK_LicenseResponse* obj) {
}
}
void Unpack_ODK_ReleaseResponse(ODK_Message* msg, ODK_ReleaseResponse* obj) {
Unpack_ODK_CoreMessage(msg, &obj->core_message);
}
void Unpack_ODK_RenewalResponse(ODK_Message* msg, ODK_RenewalResponse* obj) {
Unpack_ODK_PreparedRenewalRequest(msg, &obj->request);
Unpack_uint64_t(msg, &obj->renewal_duration_seconds);

View File

@@ -20,6 +20,8 @@ void Pack_ODK_PreparedLicenseRequest(ODK_Message* msg,
const ODK_PreparedLicenseRequest* obj);
void Pack_ODK_PreparedLicenseRequestV17(
ODK_Message* msg, const ODK_PreparedLicenseRequestV17* obj);
void Pack_ODK_PreparedReleaseRequest(ODK_Message* msg,
const ODK_PreparedReleaseRequest* obj);
void Pack_ODK_PreparedRenewalRequest(ODK_Message* msg,
const ODK_PreparedRenewalRequest* obj);
void Pack_ODK_PreparedProvisioningRequest(
@@ -34,6 +36,7 @@ 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_ReleaseResponse(ODK_Message* msg, ODK_ReleaseResponse* obj);
void Unpack_ODK_RenewalResponse(ODK_Message* msg, ODK_RenewalResponse* obj);
void Unpack_ODK_ProvisioningResponse(ODK_Message* msg,
ODK_ProvisioningResponse* obj);
@@ -45,6 +48,7 @@ void Unpack_ODK_Provisioning40Response(ODK_Message* msg,
/* kdo pack */
void Pack_ODK_LicenseResponse(ODK_Message* msg,
const ODK_Packing_LicenseResponse* obj);
void Pack_ODK_ReleaseResponse(ODK_Message* msg, const ODK_ReleaseResponse* obj);
void Pack_ODK_RenewalResponse(ODK_Message* msg, const ODK_RenewalResponse* obj);
void Pack_ODK_ProvisioningResponse(ODK_Message* msg,
const ODK_ProvisioningResponse* obj);
@@ -58,6 +62,8 @@ void Unpack_ODK_PreparedLicenseRequest(ODK_Message* msg,
ODK_PreparedLicenseRequest* obj);
void Unpack_ODK_PreparedLicenseRequestV17(ODK_Message* msg,
ODK_PreparedLicenseRequestV17* obj);
void Unpack_ODK_PreparedReleaseRequest(ODK_Message* msg,
ODK_PreparedReleaseRequest* obj);
void Unpack_ODK_PreparedRenewalRequest(ODK_Message* msg,
ODK_PreparedRenewalRequest* obj);
void Unpack_ODK_PreparedProvisioningRequest(

View File

@@ -24,13 +24,13 @@ typedef uint32_t ODK_MessageType;
#define ODK_Renewal_Response_Type ((ODK_MessageType)4u)
#define ODK_Provisioning_Request_Type ((ODK_MessageType)5u)
#define ODK_Provisioning_Response_Type ((ODK_MessageType)6u)
#define ODK_Release_Request_Type ((ODK_MessageType)7u)
#define ODK_Release_Response_Type ((ODK_MessageType)8u)
#define ODK_Renewed_Provisioning_Request_Type ((ODK_MessageType)11u)
#define ODK_Provisioning40_Request_Type ((ODK_MessageType)12u)
// TODO(b/244580447): Reserve future message types to support
// forward compatibility.
#define ODK_Release_Request_Type ((ODK_MessageType)7u)
#define ODK_Release_Response_Type ((ODK_MessageType)8u)
#define ODK_Common_Request_Type ((ODK_MessageType)9u)
#define ODK_Common_Response_Type ((ODK_MessageType)10u)
@@ -49,6 +49,10 @@ typedef struct {
ODK_CoreMessage core_message;
} ODK_PreparedLicenseRequestV17;
typedef struct {
ODK_CoreMessage core_message;
} ODK_PreparedReleaseRequest;
typedef struct {
ODK_CoreMessage core_message;
uint64_t playback_time;
@@ -97,6 +101,10 @@ typedef struct {
uint8_t request_hash[ODK_SHA256_HASH_SIZE];
} ODK_Packing_LicenseResponse;
typedef struct {
ODK_CoreMessage core_message;
} ODK_ReleaseResponse;
typedef struct {
ODK_PreparedRenewalRequest request;
uint64_t renewal_duration_seconds;
@@ -124,6 +132,7 @@ typedef struct {
#define ODK_CORE_MESSAGE_SIZE 20u
#define ODK_LICENSE_REQUEST_SIZE 90u
#define ODK_LICENSE_REQUEST_SIZE_V17 20u
#define ODK_RELEASE_REQUEST_SIZE 90u
#define ODK_RENEWAL_REQUEST_SIZE 28u
#define ODK_PROVISIONING_REQUEST_SIZE 94u
#define ODK_PROVISIONING_REQUEST_SIZE_V17 88u