OEMCrypto v16.2
Merge from Widevine repo of http://go/wvgerrit/93404 This is the unit tests, reference code, and documentation for OEMCrypto v16.2. Backwards compatibility should work for a v15 OEMCrypto. Some review comments will be addressed in future CLs. Bug: 141247171 Test: Unit tests Test: Media GTS tests on bonito Change-Id: I9d427c07580e180c0a4cfdc4a68f538d351c0ddd
This commit is contained in:
@@ -115,7 +115,7 @@ static bool kdo_fun_LicenseResponse(const ODK_ParseLicense_Args* args,
|
||||
static OEMCryptoResult odk_fun_RenewalResponse(
|
||||
const uint8_t* buf, size_t len, uint32_t api_version, uint32_t nonce,
|
||||
uint32_t session_id, ODK_ParseRenewal_Args* a,
|
||||
ODK_RenewalMessage& renewal_msg) {
|
||||
ODK_PreparedRenewalRequest& renewal_msg) {
|
||||
uint64_t timer_value = 0;
|
||||
OEMCryptoResult err =
|
||||
ODK_ParseRenewal(buf, len, api_version, nonce, session_id, a->system_time,
|
||||
@@ -125,15 +125,16 @@ static OEMCryptoResult odk_fun_RenewalResponse(
|
||||
AllocateMessage(&msg, message_block);
|
||||
InitMessage(msg, const_cast<uint8_t*>(buf), len);
|
||||
SetSize(msg, len);
|
||||
Unpack_ODK_RenewalMessage(msg, &renewal_msg);
|
||||
Unpack_ODK_PreparedRenewalRequest(msg, &renewal_msg);
|
||||
assert(ValidMessage(msg));
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
static bool kdo_fun_RenewalResponse(const ODK_ParseRenewal_Args* args,
|
||||
const ODK_RenewalMessage& renewal_msg,
|
||||
std::string* oemcrypto_core_message) {
|
||||
static bool kdo_fun_RenewalResponse(
|
||||
const ODK_ParseRenewal_Args* args,
|
||||
const ODK_PreparedRenewalRequest& renewal_msg,
|
||||
std::string* oemcrypto_core_message) {
|
||||
const auto& common = args->common;
|
||||
ODK_RenewalRequest core_request{common.api_version, common.nonce,
|
||||
common.session_id, renewal_msg.playback_time};
|
||||
@@ -217,7 +218,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
|
||||
odk_kdo<ODK_ParseLicense_Args, ODK_ParsedLicense>(
|
||||
odk_fun_LicenseResponse, kdo_fun_LicenseResponse));
|
||||
verify_roundtrip(data, size,
|
||||
odk_kdo<ODK_ParseRenewal_Args, ODK_RenewalMessage>(
|
||||
odk_kdo<ODK_ParseRenewal_Args, ODK_PreparedRenewalRequest>(
|
||||
odk_fun_RenewalResponse, kdo_fun_RenewalResponse));
|
||||
verify_roundtrip(
|
||||
data, size,
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
|
||||
#include "odk.h"
|
||||
|
||||
#include <endian.h> // TODO(b/147944591): use this one? Or odk_endian.h?
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
@@ -37,6 +39,7 @@ using oemcrypto_core_message::serialize::CreateCoreProvisioningResponse;
|
||||
using oemcrypto_core_message::serialize::CreateCoreRenewalResponse;
|
||||
|
||||
enum ODK_FieldType {
|
||||
ODK_UINT16,
|
||||
ODK_UINT32,
|
||||
ODK_UINT64,
|
||||
ODK_SUBSTRING,
|
||||
@@ -59,6 +62,8 @@ struct ODK_Field {
|
||||
|
||||
size_t ODK_FieldLength(ODK_FieldType type) {
|
||||
switch (type) {
|
||||
case ODK_UINT16:
|
||||
return sizeof(uint16_t);
|
||||
case ODK_UINT32:
|
||||
return sizeof(uint32_t);
|
||||
case ODK_UINT64:
|
||||
@@ -87,6 +92,11 @@ OEMCryptoResult ODK_WriteSingleField(uint8_t* const buf,
|
||||
return ODK_ERROR_CORE_MESSAGE;
|
||||
}
|
||||
switch (field->type) {
|
||||
case ODK_UINT16: {
|
||||
uint16_t u16 = htobe16(*static_cast<uint16_t*>(field->value));
|
||||
memcpy(buf, &u16, sizeof(u16));
|
||||
break;
|
||||
}
|
||||
case ODK_UINT32: {
|
||||
uint32_t u32 = htobe32(*static_cast<uint32_t*>(field->value));
|
||||
memcpy(buf, &u32, sizeof(u32));
|
||||
@@ -125,6 +135,12 @@ OEMCryptoResult ODK_ReadSingleField(const uint8_t* const buf,
|
||||
return ODK_ERROR_CORE_MESSAGE;
|
||||
}
|
||||
switch (field->type) {
|
||||
case ODK_UINT16: {
|
||||
memcpy(field->value, buf, sizeof(uint16_t));
|
||||
uint16_t* u16p = static_cast<uint16_t*>(field->value);
|
||||
*u16p = be16toh(*u16p);
|
||||
break;
|
||||
}
|
||||
case ODK_UINT32: {
|
||||
memcpy(field->value, buf, sizeof(uint32_t));
|
||||
uint32_t* u32p = static_cast<uint32_t*>(field->value);
|
||||
@@ -166,6 +182,14 @@ OEMCryptoResult ODK_DumpSingleField(const uint8_t* const buf,
|
||||
return ODK_ERROR_CORE_MESSAGE;
|
||||
}
|
||||
switch (field->type) {
|
||||
case ODK_UINT16: {
|
||||
uint16_t val;
|
||||
memcpy(&val, buf, sizeof(uint16_t));
|
||||
val = be16toh(val);
|
||||
std::cerr << field->name << ": " << val << " = 0x" << std::hex << val
|
||||
<< "\n";
|
||||
break;
|
||||
}
|
||||
case ODK_UINT32: {
|
||||
uint32_t val;
|
||||
memcpy(&val, buf, sizeof(uint32_t));
|
||||
@@ -230,14 +254,18 @@ OEMCryptoResult ODK_IterFields(ODK_FieldMode mode, uint8_t* const buf,
|
||||
return ODK_ERROR_CORE_MESSAGE;
|
||||
}
|
||||
uint8_t* const buf_off = buf + off;
|
||||
if (mode == ODK_WRITE) {
|
||||
ODK_WriteSingleField(buf_off, &fields[i]);
|
||||
} else if (mode == ODK_READ) {
|
||||
ODK_ReadSingleField(buf_off, &fields[i]);
|
||||
} else if (mode == ODK_DUMP) {
|
||||
ODK_DumpSingleField(buf_off, &fields[i]);
|
||||
} else {
|
||||
return ODK_ERROR_CORE_MESSAGE;
|
||||
switch (mode) {
|
||||
case ODK_WRITE:
|
||||
ODK_WriteSingleField(buf_off, &fields[i]);
|
||||
break;
|
||||
case ODK_READ:
|
||||
ODK_ReadSingleField(buf_off, &fields[i]);
|
||||
break;
|
||||
case ODK_DUMP:
|
||||
ODK_DumpSingleField(buf_off, &fields[i]);
|
||||
break;
|
||||
default:
|
||||
return ODK_ERROR_CORE_MESSAGE;
|
||||
}
|
||||
off = off2;
|
||||
}
|
||||
@@ -280,14 +308,17 @@ void ValidateRequest(uint32_t message_type,
|
||||
const std::vector<ODK_Field>& extra_fields,
|
||||
const F& odk_prepare_func, const G& kdo_parse_func) {
|
||||
uint32_t message_size = 0;
|
||||
uint32_t api_version = 16;
|
||||
uint16_t api_major_version = ODK_MAJOR_VERSION;
|
||||
uint16_t api_minor_version = ODK_MINOR_VERSION;
|
||||
uint32_t nonce = 0xdeadbeef;
|
||||
uint32_t session_id = 0xcafebabe;
|
||||
ODK_NonceValues nonce_values{api_version, nonce, session_id};
|
||||
ODK_NonceValues nonce_values{api_minor_version, api_major_version, nonce,
|
||||
session_id};
|
||||
std::vector<ODK_Field> total_fields = {
|
||||
{ODK_UINT32, &message_type, "message_type"},
|
||||
{ODK_UINT32, &message_size, "message_size"},
|
||||
{ODK_UINT32, &api_version, "api_version"},
|
||||
{ODK_UINT16, &api_minor_version, "api_minor_version"},
|
||||
{ODK_UINT16, &api_major_version, "api_major_version"},
|
||||
{ODK_UINT32, &nonce, "nonce"},
|
||||
{ODK_UINT32, &session_id, "session_id"},
|
||||
};
|
||||
@@ -317,7 +348,8 @@ void ValidateRequest(uint32_t message_type,
|
||||
std::string oemcrypto_core_message(reinterpret_cast<char*>(buf),
|
||||
message_size);
|
||||
EXPECT_TRUE(kdo_parse_func(oemcrypto_core_message, &t));
|
||||
nonce_values.api_version = t.api_version;
|
||||
nonce_values.api_minor_version = t.api_minor_version;
|
||||
nonce_values.api_major_version = t.api_major_version;
|
||||
nonce_values.nonce = t.nonce;
|
||||
nonce_values.session_id = t.session_id;
|
||||
EXPECT_EQ(OEMCrypto_SUCCESS,
|
||||
@@ -340,13 +372,15 @@ void ValidateResponse(uint32_t message_type,
|
||||
const std::vector<ODK_Field>& extra_fields,
|
||||
const F& odk_parse_func, const G& kdo_prepare_func) {
|
||||
uint32_t message_size = 0;
|
||||
uint32_t api_version = 16;
|
||||
uint16_t api_minor_version = ODK_MINOR_VERSION;
|
||||
uint16_t api_major_version = ODK_MAJOR_VERSION;
|
||||
uint32_t nonce = 0xdeadbeef;
|
||||
uint32_t session_id = 0xcafebabe;
|
||||
std::vector<ODK_Field> total_fields = {
|
||||
{ODK_UINT32, &message_type, "message_type"},
|
||||
{ODK_UINT32, &message_size, "message_size"},
|
||||
{ODK_UINT32, &api_version, "api_version"},
|
||||
{ODK_UINT16, &api_minor_version, "api_minor_version"},
|
||||
{ODK_UINT16, &api_major_version, "api_major_version"},
|
||||
{ODK_UINT32, &nonce, "nonce"},
|
||||
{ODK_UINT32, &session_id, "session_id"},
|
||||
};
|
||||
@@ -367,7 +401,8 @@ void ValidateResponse(uint32_t message_type,
|
||||
size_t bytes_read = 0, bytes_written = 0;
|
||||
|
||||
T t = {};
|
||||
t.api_version = api_version;
|
||||
t.api_minor_version = api_minor_version;
|
||||
t.api_major_version = api_major_version;
|
||||
t.nonce = nonce;
|
||||
t.session_id = session_id;
|
||||
|
||||
@@ -383,7 +418,8 @@ void ValidateResponse(uint32_t message_type,
|
||||
bytes_written - bytes_read == header_size);
|
||||
|
||||
// parse buf with odk
|
||||
ODK_NonceValues nonce_values{api_version, nonce, session_id};
|
||||
ODK_NonceValues nonce_values{ODK_MINOR_VERSION, api_major_version, nonce,
|
||||
session_id};
|
||||
EXPECT_EQ(OEMCrypto_SUCCESS,
|
||||
odk_parse_func(buf, bytes_written, &nonce_values));
|
||||
|
||||
@@ -465,16 +501,16 @@ TEST(OdkTest, LicenseRequest) {
|
||||
}
|
||||
|
||||
TEST(OdkTest, RenewalRequest) {
|
||||
const uint64_t system_time_seconds = 0xBADDCAFE000FF1CE;
|
||||
constexpr uint64_t system_time_seconds = 0xBADDCAFE000FF1CE;
|
||||
uint64_t playback_time = 0xCAFE00000000;
|
||||
const uint64_t playback_start = system_time_seconds - playback_time;
|
||||
std::vector<ODK_Field> extra_fields = {
|
||||
const std::vector<ODK_Field> extra_fields = {
|
||||
{ODK_UINT64, &playback_time, "playback_time"},
|
||||
};
|
||||
ODK_ClockValues clock_values = {0};
|
||||
clock_values.time_of_first_decrypt = playback_start;
|
||||
auto odk_prepare_func = [&](uint8_t* const buf, size_t* size,
|
||||
const ODK_NonceValues* nonce_values) {
|
||||
ODK_NonceValues* nonce_values) {
|
||||
return ODK_PrepareCoreRenewalRequest(buf, SIZE_MAX, size, nonce_values,
|
||||
&clock_values, system_time_seconds);
|
||||
};
|
||||
@@ -528,20 +564,17 @@ TEST(OdkTest, LicenseResponse) {
|
||||
.enc_mac_keys = {.offset = 2, .length = 3},
|
||||
.pst = {.offset = 4, .length = 5},
|
||||
.srm_restriction_data = {.offset = 6, .length = 7},
|
||||
.license_type = 8,
|
||||
.nonce_required = 0xDEADC0DE,
|
||||
.license_type = OEMCrypto_EntitlementLicense,
|
||||
.nonce_required = true,
|
||||
.timer_limits =
|
||||
{
|
||||
.soft_expiry = 9,
|
||||
.soft_enforce_rental_duration = true,
|
||||
.soft_enforce_playback_duration = false,
|
||||
.earliest_playback_start_seconds = 10,
|
||||
.latest_playback_start_seconds = 11,
|
||||
.initial_playback_duration_seconds = 12,
|
||||
.renewal_playback_duration_seconds = 13,
|
||||
.license_duration_seconds = 14,
|
||||
.rental_duration_seconds = 11,
|
||||
.total_playback_duration_seconds = 12,
|
||||
.initial_renewal_duration_seconds = 13,
|
||||
},
|
||||
.request_hash = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
||||
11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
|
||||
22, 23, 24, 25, 26, 27, 28, 29, 30, 31},
|
||||
.key_array_length = 3,
|
||||
.key_array =
|
||||
{
|
||||
@@ -569,6 +602,11 @@ TEST(OdkTest, LicenseResponse) {
|
||||
},
|
||||
};
|
||||
|
||||
const uint8_t request_hash[ODK_SHA256_HASH_SIZE] = {
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
||||
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
|
||||
uint8_t request_hash_read[ODK_SHA256_HASH_SIZE];
|
||||
memcpy(request_hash_read, request_hash, sizeof(request_hash));
|
||||
std::vector<ODK_Field> extra_fields = {
|
||||
{ODK_SUBSTRING, &parsed_license.enc_mac_keys_iv, ".enc_mac_keys_iv"},
|
||||
{ODK_SUBSTRING, &parsed_license.enc_mac_keys, ".enc_mac_keys"},
|
||||
@@ -577,20 +615,19 @@ TEST(OdkTest, LicenseResponse) {
|
||||
".srm_restriction_data"},
|
||||
{ODK_UINT32, &parsed_license.license_type, ".license_type"},
|
||||
{ODK_UINT32, &parsed_license.nonce_required, ".nonce_required"},
|
||||
{ODK_UINT32, &parsed_license.timer_limits.soft_expiry, ".soft_expiry"},
|
||||
{ODK_UINT32, &parsed_license.timer_limits.soft_enforce_rental_duration,
|
||||
".soft_enforce_rental_duration"},
|
||||
{ODK_UINT32, &parsed_license.timer_limits.soft_enforce_playback_duration,
|
||||
".soft_enforce_playback_duration"},
|
||||
{ODK_UINT64, &parsed_license.timer_limits.earliest_playback_start_seconds,
|
||||
".earliest_playback_start_seconds"},
|
||||
{ODK_UINT64, &parsed_license.timer_limits.latest_playback_start_seconds,
|
||||
".latest_playback_start_seconds"},
|
||||
{ODK_UINT64, &parsed_license.timer_limits.rental_duration_seconds,
|
||||
".rental_duration_seconds"},
|
||||
{ODK_UINT64, &parsed_license.timer_limits.total_playback_duration_seconds,
|
||||
".total_playback_duration_seconds"},
|
||||
{ODK_UINT64,
|
||||
&parsed_license.timer_limits.initial_playback_duration_seconds,
|
||||
".initial_playback_duration_seconds"},
|
||||
{ODK_UINT64,
|
||||
&parsed_license.timer_limits.renewal_playback_duration_seconds,
|
||||
".renewal_playback_duration_seconds"},
|
||||
{ODK_UINT64, &parsed_license.timer_limits.license_duration_seconds,
|
||||
".license_duration_seconds"},
|
||||
{ODK_HASH, &parsed_license.request_hash, ".request_hash"},
|
||||
&parsed_license.timer_limits.initial_renewal_duration_seconds,
|
||||
".initial_renewal_duration_seconds"},
|
||||
{ODK_UINT32, &parsed_license.key_array_length, ".key_array_length"},
|
||||
{ODK_SUBSTRING, &parsed_license.key_array[0].key_id, ".key_id"},
|
||||
{ODK_SUBSTRING, &parsed_license.key_array[0].key_data_iv, ".key_data_iv"},
|
||||
@@ -610,21 +647,24 @@ TEST(OdkTest, LicenseResponse) {
|
||||
{ODK_SUBSTRING, &parsed_license.key_array[2].key_control_iv,
|
||||
".key_control_iv"},
|
||||
{ODK_SUBSTRING, &parsed_license.key_array[2].key_control, ".key_control"},
|
||||
{ODK_HASH, request_hash_read, ".request_hash"},
|
||||
};
|
||||
|
||||
uint8_t request_hash[ODK_SHA256_HASH_SIZE] = {};
|
||||
memcpy(request_hash, parsed_license.request_hash, ODK_SHA256_HASH_SIZE);
|
||||
const std::string request_hash_string(
|
||||
reinterpret_cast<const char*>(request_hash), sizeof(request_hash));
|
||||
auto odk_parse_func = [&](const uint8_t* buf, size_t size,
|
||||
ODK_NonceValues* nonce_values) {
|
||||
ODK_TimerLimits timer_limits;
|
||||
ODK_ClockValues clock_values;
|
||||
return ODK_ParseLicense(buf, size + 128, size, true, false, request_hash,
|
||||
&timer_limits, &clock_values, nonce_values,
|
||||
&parsed_license);
|
||||
constexpr bool initial_license_load = true;
|
||||
constexpr bool usage_entry_present = true;
|
||||
return ODK_ParseLicense(buf, size + 128, size, initial_license_load,
|
||||
usage_entry_present, request_hash, &timer_limits,
|
||||
&clock_values, nonce_values, &parsed_license);
|
||||
};
|
||||
auto kdo_prepare_func = [&](const ODK_LicenseRequest& core_request,
|
||||
std::string* oemcrypto_core_message) {
|
||||
return CreateCoreLicenseResponse(parsed_license, core_request,
|
||||
request_hash_string,
|
||||
oemcrypto_core_message);
|
||||
};
|
||||
ValidateResponse<ODK_LicenseRequest>(ODK_License_Response_Type, extra_fields,
|
||||
@@ -636,26 +676,29 @@ TEST(OdkTest, RenewalResponse) {
|
||||
uint64_t playback_clock = 11;
|
||||
uint64_t playback_timer = 12;
|
||||
uint64_t message_playback_clock = 10;
|
||||
constexpr uint64_t renewal_duration = 130;
|
||||
uint64_t var_renewal_duration = renewal_duration;
|
||||
std::vector<ODK_Field> extra_fields = {
|
||||
{ODK_UINT64, &message_playback_clock, "message_playback_clock"},
|
||||
{ODK_UINT64, &var_renewal_duration, "renewal_duration"},
|
||||
};
|
||||
|
||||
ODK_TimerLimits timer_limits = {
|
||||
.soft_expiry = 0,
|
||||
.soft_enforce_rental_duration = false,
|
||||
.soft_enforce_playback_duration = false,
|
||||
.earliest_playback_start_seconds = 0,
|
||||
.latest_playback_start_seconds = 100,
|
||||
.initial_playback_duration_seconds = 10,
|
||||
.renewal_playback_duration_seconds = 20,
|
||||
.license_duration_seconds = 100,
|
||||
.rental_duration_seconds = 1000,
|
||||
.total_playback_duration_seconds = 2000,
|
||||
.initial_renewal_duration_seconds = 30,
|
||||
};
|
||||
|
||||
ODK_ClockValues clock_values = {
|
||||
.time_of_license_signed = 0,
|
||||
.time_of_license_signed = system_time - playback_clock - 42,
|
||||
.time_of_first_decrypt = system_time - playback_clock,
|
||||
.time_of_last_decrypt = 0,
|
||||
.time_of_renewal_request = message_playback_clock,
|
||||
.time_when_timer_expires = system_time + playback_timer,
|
||||
.timer_status = 0,
|
||||
.timer_status = ODK_CLOCK_TIMER_STATUS_LICENSE_LOADED,
|
||||
.status = kUnused,
|
||||
};
|
||||
|
||||
@@ -666,7 +709,7 @@ TEST(OdkTest, RenewalResponse) {
|
||||
&timer_limits, &clock_values, &playback_timer);
|
||||
|
||||
EXPECT_EQ(ODK_SET_TIMER, err);
|
||||
EXPECT_EQ(timer_limits.renewal_playback_duration_seconds, playback_timer);
|
||||
EXPECT_EQ(renewal_duration, playback_timer);
|
||||
EXPECT_EQ(clock_values.time_when_timer_expires,
|
||||
system_time + playback_timer);
|
||||
|
||||
@@ -678,7 +721,8 @@ TEST(OdkTest, RenewalResponse) {
|
||||
auto kdo_prepare_func = [&](ODK_RenewalRequest& core_request,
|
||||
std::string* oemcrypto_core_message) {
|
||||
core_request.playback_time_seconds = message_playback_clock;
|
||||
return CreateCoreRenewalResponse(core_request, oemcrypto_core_message);
|
||||
return CreateCoreRenewalResponse(core_request, renewal_duration,
|
||||
oemcrypto_core_message);
|
||||
};
|
||||
ValidateResponse<ODK_RenewalRequest>(ODK_Renewal_Response_Type, extra_fields,
|
||||
odk_parse_func, kdo_prepare_func);
|
||||
@@ -732,10 +776,12 @@ TEST(OdkSizeTest, LicenseRequest) {
|
||||
uint8_t* message = nullptr;
|
||||
size_t message_length = 0;
|
||||
size_t core_message_length = 0;
|
||||
uint32_t api_version = 0;
|
||||
uint16_t api_minor_version = ODK_MINOR_VERSION;
|
||||
uint16_t api_major_version = 0;
|
||||
uint32_t nonce = 0;
|
||||
uint32_t session_id = 0;
|
||||
ODK_NonceValues nonce_values{api_version, nonce, session_id};
|
||||
ODK_NonceValues nonce_values{api_minor_version, api_major_version, nonce,
|
||||
session_id};
|
||||
EXPECT_EQ(OEMCrypto_ERROR_SHORT_BUFFER,
|
||||
ODK_PrepareCoreLicenseRequest(message, message_length,
|
||||
&core_message_length, &nonce_values));
|
||||
@@ -748,13 +794,15 @@ TEST(OdkSizeTest, RenewalRequest) {
|
||||
uint8_t* message = nullptr;
|
||||
size_t message_length = 0;
|
||||
size_t core_message_length = 0;
|
||||
uint32_t api_version = 0;
|
||||
uint16_t api_minor_version = ODK_MINOR_VERSION;
|
||||
uint16_t api_major_version = 0;
|
||||
uint32_t nonce = 0;
|
||||
uint32_t session_id = 0;
|
||||
ODK_ClockValues clock_values = {};
|
||||
clock_values.time_of_first_decrypt = 10;
|
||||
uint64_t system_time_seconds = 15;
|
||||
ODK_NonceValues nonce_values{api_version, nonce, session_id};
|
||||
ODK_NonceValues nonce_values{api_minor_version, api_major_version, nonce,
|
||||
session_id};
|
||||
EXPECT_EQ(OEMCrypto_ERROR_SHORT_BUFFER,
|
||||
ODK_PrepareCoreRenewalRequest(message, message_length,
|
||||
&core_message_length, &nonce_values,
|
||||
@@ -768,11 +816,13 @@ TEST(OdkSizeTest, ProvisioningRequest) {
|
||||
uint8_t* message = nullptr;
|
||||
size_t message_length = 0;
|
||||
size_t core_message_length = 0;
|
||||
uint32_t api_version = 0;
|
||||
uint16_t api_minor_version = ODK_MINOR_VERSION;
|
||||
uint16_t api_major_version = 0;
|
||||
uint32_t nonce = 0;
|
||||
uint32_t session_id = 0;
|
||||
uint32_t device_id_length = 0;
|
||||
ODK_NonceValues nonce_values{api_version, nonce, session_id};
|
||||
ODK_NonceValues nonce_values{api_minor_version, api_major_version, nonce,
|
||||
session_id};
|
||||
EXPECT_EQ(OEMCrypto_ERROR_SHORT_BUFFER,
|
||||
ODK_PrepareCoreProvisioningRequest(
|
||||
message, message_length, &core_message_length, &nonce_values,
|
||||
|
||||
@@ -1,64 +0,0 @@
|
||||
/*
|
||||
* Copyright 2019 Google LLC. All Rights Reserved. This file and proprietary
|
||||
* source code may only be used and distributed under the Widevine Master
|
||||
* License Agreement.
|
||||
*/
|
||||
|
||||
#ifndef ODK_TEST_H_
|
||||
#define ODK_TEST_H_
|
||||
|
||||
#include "OEMCryptoCENCCommon.h"
|
||||
|
||||
typedef enum {
|
||||
ODK_License_Request_Type = 1,
|
||||
ODK_License_Response_Type = 2,
|
||||
ODK_Renewal_Request_Type = 3,
|
||||
ODK_Renewal_Response_Type = 4,
|
||||
ODK_Provisioning_Request_Type = 5,
|
||||
ODK_Provisioning_Response_Type = 6,
|
||||
} ODK_MessageType;
|
||||
|
||||
typedef enum {
|
||||
ODK_UINT32,
|
||||
ODK_UINT64,
|
||||
ODK_SUBSTRING,
|
||||
ODK_DEVICEID,
|
||||
ODK_HASH,
|
||||
ODK_NUMTYPES,
|
||||
} ODK_FieldType;
|
||||
|
||||
typedef enum {
|
||||
ODK_READ,
|
||||
ODK_WRITE,
|
||||
} ODK_FieldMode;
|
||||
|
||||
typedef struct {
|
||||
ODK_FieldType type;
|
||||
void* value;
|
||||
} ODK_Field;
|
||||
|
||||
#define DEVICE_ID_MAX (64)
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
size_t ODK_FieldLength(ODK_FieldType type);
|
||||
OEMCryptoResult ODK_WriteSingleField(uint8_t* const buf,
|
||||
const ODK_Field* const field);
|
||||
OEMCryptoResult ODK_ReadSingleField(const uint8_t* const buf,
|
||||
const ODK_Field* const field);
|
||||
|
||||
OEMCryptoResult ODK_ReadFields(const uint8_t* const buf, const size_t size_in,
|
||||
size_t* size_out, const size_t n,
|
||||
const ODK_Field* const fields);
|
||||
|
||||
OEMCryptoResult ODK_WriteFields(uint8_t* const buf, const size_t size_in,
|
||||
size_t* size_out, const size_t n,
|
||||
const ODK_Field* const fields);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // ODK_TEST_H_
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user