ODK unit tests for release request

PiperOrigin-RevId: 584427947
Change-Id: I7a131739c5ea0d27c2f9e9c5ecb7b138176ce049
This commit is contained in:
Vicky Min
2023-11-21 14:21:06 -08:00
committed by Robert Shih
parent 91e573f574
commit 726f2d51e9
7 changed files with 160 additions and 15 deletions

View File

@@ -32,12 +32,14 @@ using oemcrypto_core_message::ODK_LicenseRequest;
using oemcrypto_core_message::ODK_MessageCounter;
using oemcrypto_core_message::ODK_Provisioning40Request;
using oemcrypto_core_message::ODK_ProvisioningRequest;
using oemcrypto_core_message::ODK_ReleaseRequest;
using oemcrypto_core_message::ODK_RenewalRequest;
using oemcrypto_core_message::deserialize::CoreCommonRequestFromMessage;
using oemcrypto_core_message::deserialize::CoreLicenseRequestFromMessage;
using oemcrypto_core_message::deserialize::CoreProvisioning40RequestFromMessage;
using oemcrypto_core_message::deserialize::CoreProvisioningRequestFromMessage;
using oemcrypto_core_message::deserialize::CoreReleaseRequestFromMessage;
using oemcrypto_core_message::deserialize::CoreRenewalRequestFromMessage;
using oemcrypto_core_message::deserialize::
CoreRenewedProvisioningRequestFromMessage;
@@ -49,6 +51,7 @@ using oemcrypto_core_message::serialize::CreateCoreProvisioning40Response;
using oemcrypto_core_message::serialize::CreateCoreProvisioningResponse;
using oemcrypto_core_message::serialize::
CreateCoreProvisioningResponseFromProto;
using oemcrypto_core_message::serialize::CreateCoreReleaseResponse;
using oemcrypto_core_message::serialize::CreateCoreRenewalResponse;
constexpr uint32_t kExtraPayloadSize = 128u;
@@ -686,6 +689,35 @@ TEST(OdkTest, RenewalRequestRoundtrip) {
odk_prepare_func, kdo_parse_func);
}
TEST(OdkTest, ReleaseRequestRoundTrip) {
const uint32_t clock_security_level = 1;
const uint32_t status = 1;
constexpr uint64_t system_time_seconds = 0xBADDCAFE000FF1CE;
uint64_t playback_time = 0xCAFE00000000;
const int64_t seconds_since_license_requested = 1;
const int64_t seconds_since_first_decrypt =
static_cast<int64_t>(system_time_seconds - playback_time);
ODK_ClockValues clock_values;
memset(&clock_values, 0, sizeof(clock_values));
clock_values.time_of_first_decrypt = seconds_since_first_decrypt;
std::vector<ODK_Field> extra_fields = {};
auto odk_prepare_func = [&](uint8_t* const buf, size_t* size,
ODK_NonceValues* nonce_values) {
return ODK_PrepareCoreReleaseRequest(
buf, SIZE_MAX, size, nonce_values, status, clock_security_level,
seconds_since_license_requested, seconds_since_first_decrypt,
&clock_values, system_time_seconds);
};
auto kdo_parse_func = [&](const std::string& oemcrypto_core_message,
ODK_ReleaseRequest* core_release_request) {
bool ok = CoreReleaseRequestFromMessage(oemcrypto_core_message,
core_release_request);
return ok;
};
ValidateRequest<ODK_ReleaseRequest>(ODK_Release_Request_Type, extra_fields,
odk_prepare_func, kdo_parse_func);
}
TEST(OdkTest, ProvisionRequestRoundtrip) {
ODK_MessageCounterInfo counter_info;
counter_info.master_generation_number = 0x12345678abcdffff;
@@ -1131,6 +1163,32 @@ TEST_P(OdkVersionTest, RenewalResponseRoundtrip) {
kdo_prepare_func);
}
TEST_P(OdkVersionTest, ReleaseResponseRoundtrip) {
ODK_ReleaseResponseParams params;
ODK_SetDefaultReleaseResponseParams(&params);
SetRequestVersion(&params);
const int64_t seconds_since_license_requested =
params.seconds_since_license_requested;
const int64_t seconds_since_first_decrypt =
params.seconds_since_first_decrypt;
auto odk_parse_func = [&](const uint8_t* buf, size_t size) {
OEMCryptoResult err =
ODK_ParseRelease(buf, size, size, &(params.core_message.nonce_values),
params.seconds_since_license_requested,
params.seconds_since_first_decrypt);
return err;
};
auto kdo_prepare_func = [&](ODK_ReleaseRequest& core_request,
std::string* oemcrypto_core_message) {
return CreateCoreReleaseResponse(
features_, core_request, seconds_since_license_requested,
seconds_since_first_decrypt, oemcrypto_core_message);
};
ValidateResponse<ODK_ReleaseRequest>(GetParam(), &(params.core_message),
params.extra_fields, odk_parse_func,
kdo_prepare_func);
}
TEST_P(OdkVersionTest, ProvisionResponseRoundtrip) {
ODK_ProvisioningResponseParams params;
ODK_SetDefaultProvisioningResponseParams(&params,

View File

@@ -358,6 +358,8 @@ size_t ODK_FieldLength(ODK_FieldType type) {
return sizeof(uint32_t);
case ODK_UINT64:
return sizeof(uint64_t);
case ODK_INT64:
return sizeof(uint64_t);
case ODK_BOOL: // Booleans are stored in the message as 32 bit ints.
return sizeof(uint32_t);
case ODK_SUBSTRING:
@@ -414,6 +416,12 @@ OEMCryptoResult ODK_WriteSingleField(uint8_t* buf, const ODK_Field* field) {
memcpy(buf, &u64, sizeof(u64));
break;
}
case ODK_INT64: {
const int64_t i64 =
oemcrypto_htobe64(*static_cast<int64_t*>(field->value));
memcpy(buf, &i64, sizeof(i64));
break;
}
case ODK_BOOL: {
const bool value = *static_cast<bool*>(field->value);
const uint32_t u32 = oemcrypto_htobe32(value ? 1 : 0);
@@ -493,6 +501,12 @@ OEMCryptoResult ODK_ReadSingleField(const uint8_t* buf,
*u64p = oemcrypto_be64toh(*u64p);
break;
}
case ODK_INT64: {
memcpy(field->value, buf, sizeof(int64_t));
int64_t* i64p = static_cast<int64_t*>(field->value);
*i64p = oemcrypto_be64toh(*i64p);
break;
}
case ODK_BOOL: {
uint32_t value;
memcpy(&value, buf, sizeof(uint32_t));
@@ -612,6 +626,14 @@ OEMCryptoResult ODK_DumpSingleField(const uint8_t* buf,
<< "\n";
break;
}
case ODK_INT64: {
int64_t val;
memcpy(&val, buf, sizeof(int64_t));
val = oemcrypto_be64toh(val);
std::cerr << field->name << ": " << val << " = 0x" << std::hex << val
<< "\n";
break;
}
case ODK_SUBSTRING: {
uint32_t off = 0;
uint32_t len = 0;

View File

@@ -19,6 +19,7 @@ enum ODK_FieldType {
ODK_UINT16,
ODK_UINT32,
ODK_UINT64,
ODK_INT64,
ODK_SUBSTRING,
ODK_DEVICEID,
ODK_DEVICEINFO,
@@ -98,8 +99,7 @@ void ODK_SetDefaultCoreFields(ODK_CoreMessage* core_message,
ODK_MessageType message_type);
void ODK_SetDefaultLicenseResponseParams(ODK_LicenseResponseParams* params,
uint32_t odk_major_version);
void ODK_SetDefaultReleaseResponseParams(ODK_ReleaseResponseParams* params,
uint32_t odk_major_version);
void ODK_SetDefaultReleaseResponseParams(ODK_ReleaseResponseParams* params);
void ODK_SetDefaultRenewalResponseParams(ODK_RenewalResponseParams* params);
void ODK_SetDefaultProvisioningResponseParams(
ODK_ProvisioningResponseParams* params, uint32_t odk_major_version);