Source release 19.1.0
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
// Copyright 2019 Google LLC. All rights reserved. This file and proprietary
|
||||
// Copyright 2019 Google LLC. This file and proprietary
|
||||
// source code may only be used and distributed under the Widevine
|
||||
// License Agreement.
|
||||
|
||||
@@ -18,9 +18,11 @@
|
||||
#include "core_message_serialize_proto.h"
|
||||
#include "core_message_types.h"
|
||||
#include "gtest/gtest.h"
|
||||
#include "license_protocol.pb.h"
|
||||
#include "odk_overflow.h"
|
||||
#include "odk_structs.h"
|
||||
#include "odk_structs_priv.h"
|
||||
#include "odk_target.h"
|
||||
#include "odk_test_helper.h"
|
||||
|
||||
namespace wvodk_test {
|
||||
@@ -32,12 +34,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 +53,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;
|
||||
@@ -255,7 +260,7 @@ TEST(OdkTest, SerializeFieldsStress) {
|
||||
size_t total_size = 0;
|
||||
for (int i = 0; i < n; i++) {
|
||||
fields[i].type = static_cast<ODK_FieldType>(
|
||||
std::rand() % static_cast<int>(ODK_LAST_STRESSABLE_TYPE));
|
||||
std::rand() % (static_cast<int>(ODK_LAST_STRESSABLE_TYPE) + 1));
|
||||
fields[i].value = malloc(ODK_AllocSize(fields[i].type));
|
||||
fields[i].name = "stress";
|
||||
total_size += ODK_FieldLength(fields[i].type);
|
||||
@@ -686,6 +691,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;
|
||||
@@ -1095,7 +1129,7 @@ TEST_P(OdkVersionTest, LicenseResponseRoundtripMoreThanMaxKeys) {
|
||||
bool result =
|
||||
CreateCoreLicenseResponse(features_, parsed_license, core_request,
|
||||
request_hash_string, &oemcrypto_core_message);
|
||||
EXPECT_FALSE(result);
|
||||
EXPECT_TRUE(result);
|
||||
|
||||
delete[] buf;
|
||||
delete[] zero;
|
||||
@@ -1131,6 +1165,30 @@ TEST_P(OdkVersionTest, RenewalResponseRoundtrip) {
|
||||
kdo_prepare_func);
|
||||
}
|
||||
|
||||
TEST_P(OdkVersionTest, ReleaseResponseRoundtrip) {
|
||||
ODK_ReleaseResponseParams params;
|
||||
ODK_SetDefaultReleaseResponseParams(¶ms);
|
||||
SetRequestVersion(¶ms);
|
||||
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));
|
||||
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(¶ms,
|
||||
@@ -1216,7 +1274,8 @@ std::vector<VersionParameters> TestCases() {
|
||||
// number.
|
||||
{16, ODK_MAJOR_VERSION, ODK_MINOR_VERSION, 16, 5},
|
||||
{17, ODK_MAJOR_VERSION, ODK_MINOR_VERSION, 17, 2},
|
||||
{18, ODK_MAJOR_VERSION, ODK_MINOR_VERSION, 18, 5},
|
||||
{18, ODK_MAJOR_VERSION, ODK_MINOR_VERSION, 18, 4},
|
||||
{19, ODK_MAJOR_VERSION, ODK_MINOR_VERSION, 19, 1},
|
||||
// Here are some known good versions. Make extra sure they work.
|
||||
{ODK_MAJOR_VERSION, 16, 3, 16, 3},
|
||||
{ODK_MAJOR_VERSION, 16, 4, 16, 4},
|
||||
@@ -1226,15 +1285,17 @@ std::vector<VersionParameters> TestCases() {
|
||||
{ODK_MAJOR_VERSION, 18, 1, 18, 1},
|
||||
{ODK_MAJOR_VERSION, 18, 2, 18, 2},
|
||||
{ODK_MAJOR_VERSION, 18, 3, 18, 3},
|
||||
{ODK_MAJOR_VERSION, 18, 4, 18, 4},
|
||||
{ODK_MAJOR_VERSION, 18, 5, 18, 5},
|
||||
{ODK_MAJOR_VERSION, 19, 0, 19, 0},
|
||||
{ODK_MAJOR_VERSION, 19, 1, 19, 1},
|
||||
{0, 16, 3, 16, 3},
|
||||
{0, 16, 4, 16, 4},
|
||||
{0, 16, 5, 16, 5},
|
||||
{0, 17, 1, 17, 1},
|
||||
{0, 17, 2, 17, 2},
|
||||
{0, 18, 3, 18, 3},
|
||||
{0, 18, 4, 18, 4},
|
||||
{0, 18, 5, 18, 5},
|
||||
{0, 19, 0, 19, 0},
|
||||
{0, 19, 1, 19, 1},
|
||||
};
|
||||
return test_cases;
|
||||
}
|
||||
@@ -1376,6 +1437,130 @@ TEST(OdkOverflowTest, MultiplyUX) {
|
||||
EXPECT_TRUE(odk_mul_overflow_ux(4, SIZE_MAX >> 1, &result));
|
||||
}
|
||||
|
||||
TEST(OdkTest, GenerateKeyContexts_Success) {
|
||||
const uint8_t kContext[] = {
|
||||
0x0a, 0x4c, 0x08, 0x00, 0x12, 0x48, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
|
||||
0x10, 0x19, 0x07, 0xd9, 0xff, 0xde, 0x13, 0xaa, 0x95, 0xc1, 0x22, 0x67,
|
||||
0x80, 0x53, 0x36, 0x21, 0x36, 0xbd, 0xf8, 0x40, 0x8f, 0x82, 0x76, 0xe4,
|
||||
0xc2, 0xd8, 0x7e, 0xc5, 0x2b, 0x61, 0xaa, 0x1b, 0x9f, 0x64, 0x6e, 0x58,
|
||||
0x73, 0x49, 0x30, 0xac, 0xeb, 0xe8, 0x99, 0xb3, 0xe4, 0x64, 0x18, 0x9a,
|
||||
0x14, 0xa8, 0x72, 0x02, 0xfb, 0x02, 0x57, 0x4e, 0x70, 0x64, 0x0b, 0xd2,
|
||||
0x2e, 0xf4, 0x4b, 0x2d, 0x7e, 0x39, 0x12, 0x25, 0x0a, 0x23, 0x0a, 0x14,
|
||||
0x08, 0x01, 0x12, 0x10, 0x09, 0x15, 0x00, 0x7c, 0xaa, 0x9b, 0x59, 0x31,
|
||||
0xb7, 0x6a, 0x3a, 0x85, 0xf0, 0x46, 0x52, 0x3e, 0x10, 0x01, 0x1a, 0x09,
|
||||
0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x18, 0x01, 0x20,
|
||||
0x00, 0x2a, 0x0c, 0x31, 0x38, 0x38, 0x36, 0x37, 0x38, 0x37, 0x34, 0x30,
|
||||
0x35, 0x00, 0x00,
|
||||
};
|
||||
const uint8_t kMacKey[] = {
|
||||
0x41, 0x55, 0x54, 0x48, 0x45, 0x4e, 0x54, 0x49, 0x43, 0x41, 0x54, 0x49,
|
||||
0x4f, 0x4e, 0x00, 0x0a, 0x4c, 0x08, 0x00, 0x12, 0x48, 0x00, 0x00, 0x00,
|
||||
0x02, 0x00, 0x00, 0x10, 0x19, 0x07, 0xd9, 0xff, 0xde, 0x13, 0xaa, 0x95,
|
||||
0xc1, 0x22, 0x67, 0x80, 0x53, 0x36, 0x21, 0x36, 0xbd, 0xf8, 0x40, 0x8f,
|
||||
0x82, 0x76, 0xe4, 0xc2, 0xd8, 0x7e, 0xc5, 0x2b, 0x61, 0xaa, 0x1b, 0x9f,
|
||||
0x64, 0x6e, 0x58, 0x73, 0x49, 0x30, 0xac, 0xeb, 0xe8, 0x99, 0xb3, 0xe4,
|
||||
0x64, 0x18, 0x9a, 0x14, 0xa8, 0x72, 0x02, 0xfb, 0x02, 0x57, 0x4e, 0x70,
|
||||
0x64, 0x0b, 0xd2, 0x2e, 0xf4, 0x4b, 0x2d, 0x7e, 0x39, 0x12, 0x25, 0x0a,
|
||||
0x23, 0x0a, 0x14, 0x08, 0x01, 0x12, 0x10, 0x09, 0x15, 0x00, 0x7c, 0xaa,
|
||||
0x9b, 0x59, 0x31, 0xb7, 0x6a, 0x3a, 0x85, 0xf0, 0x46, 0x52, 0x3e, 0x10,
|
||||
0x01, 0x1a, 0x09, 0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31,
|
||||
0x18, 0x01, 0x20, 0x00, 0x2a, 0x0c, 0x31, 0x38, 0x38, 0x36, 0x37, 0x38,
|
||||
0x37, 0x34, 0x30, 0x35, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
|
||||
};
|
||||
const uint8_t kEncKey[] = {
|
||||
0x45, 0x4e, 0x43, 0x52, 0x59, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x0a,
|
||||
0x4c, 0x08, 0x00, 0x12, 0x48, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x10,
|
||||
0x19, 0x07, 0xd9, 0xff, 0xde, 0x13, 0xaa, 0x95, 0xc1, 0x22, 0x67, 0x80,
|
||||
0x53, 0x36, 0x21, 0x36, 0xbd, 0xf8, 0x40, 0x8f, 0x82, 0x76, 0xe4, 0xc2,
|
||||
0xd8, 0x7e, 0xc5, 0x2b, 0x61, 0xaa, 0x1b, 0x9f, 0x64, 0x6e, 0x58, 0x73,
|
||||
0x49, 0x30, 0xac, 0xeb, 0xe8, 0x99, 0xb3, 0xe4, 0x64, 0x18, 0x9a, 0x14,
|
||||
0xa8, 0x72, 0x02, 0xfb, 0x02, 0x57, 0x4e, 0x70, 0x64, 0x0b, 0xd2, 0x2e,
|
||||
0xf4, 0x4b, 0x2d, 0x7e, 0x39, 0x12, 0x25, 0x0a, 0x23, 0x0a, 0x14, 0x08,
|
||||
0x01, 0x12, 0x10, 0x09, 0x15, 0x00, 0x7c, 0xaa, 0x9b, 0x59, 0x31, 0xb7,
|
||||
0x6a, 0x3a, 0x85, 0xf0, 0x46, 0x52, 0x3e, 0x10, 0x01, 0x1a, 0x09, 0x39,
|
||||
0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x18, 0x01, 0x20, 0x00,
|
||||
0x2a, 0x0c, 0x31, 0x38, 0x38, 0x36, 0x37, 0x38, 0x37, 0x34, 0x30, 0x35,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
|
||||
};
|
||||
|
||||
std::vector<uint8_t> mac_key(sizeof(kMacKey) + 24);
|
||||
std::vector<uint8_t> enc_key(sizeof(kEncKey) + 24);
|
||||
size_t mac_key_size = mac_key.size();
|
||||
size_t enc_key_size = enc_key.size();
|
||||
ASSERT_EQ(OEMCrypto_SUCCESS,
|
||||
ODK_GenerateKeyContexts(kContext, sizeof(kContext), &mac_key[0],
|
||||
&mac_key_size, &enc_key[0], &enc_key_size));
|
||||
ASSERT_EQ(mac_key_size, sizeof(kMacKey));
|
||||
ASSERT_EQ(enc_key_size, sizeof(kEncKey));
|
||||
mac_key.resize(mac_key_size);
|
||||
enc_key.resize(enc_key_size);
|
||||
|
||||
EXPECT_EQ(std::vector<uint8_t>(kMacKey, kMacKey + sizeof(kMacKey)), mac_key);
|
||||
EXPECT_EQ(std::vector<uint8_t>(kEncKey, kEncKey + sizeof(kEncKey)), enc_key);
|
||||
}
|
||||
|
||||
TEST(OdkTest, GenerateKeyContexts_ShortBuffer) {
|
||||
const uint8_t kContext[] = {1, 2, 3};
|
||||
size_t mac_key_size = 0;
|
||||
size_t enc_key_size = 0;
|
||||
ASSERT_EQ(OEMCrypto_ERROR_SHORT_BUFFER,
|
||||
ODK_GenerateKeyContexts(kContext, sizeof(kContext), nullptr,
|
||||
&mac_key_size, nullptr, &enc_key_size));
|
||||
EXPECT_EQ(mac_key_size, sizeof(kContext) + 19);
|
||||
EXPECT_EQ(enc_key_size, sizeof(kContext) + 15);
|
||||
}
|
||||
|
||||
TEST(OdkTest, GenerateKeyContexts_ShortBufferMacOnly) {
|
||||
const uint8_t kContext[] = {1, 2, 3};
|
||||
uint8_t buffer[128];
|
||||
size_t mac_key_size = 0;
|
||||
size_t enc_key_size = sizeof(buffer);
|
||||
ASSERT_EQ(OEMCrypto_ERROR_SHORT_BUFFER,
|
||||
ODK_GenerateKeyContexts(kContext, sizeof(kContext), nullptr,
|
||||
&mac_key_size, buffer, &enc_key_size));
|
||||
EXPECT_EQ(mac_key_size, sizeof(kContext) + 19);
|
||||
EXPECT_EQ(enc_key_size, sizeof(kContext) + 15);
|
||||
}
|
||||
|
||||
TEST(OdkTest, GenerateKeyContexts_ShortBufferEncOnly) {
|
||||
const uint8_t kContext[] = {1, 2, 3};
|
||||
uint8_t buffer[128];
|
||||
size_t mac_key_size = sizeof(buffer);
|
||||
size_t enc_key_size = 0;
|
||||
ASSERT_EQ(OEMCrypto_ERROR_SHORT_BUFFER,
|
||||
ODK_GenerateKeyContexts(kContext, sizeof(kContext), buffer,
|
||||
&mac_key_size, buffer, &enc_key_size));
|
||||
EXPECT_EQ(mac_key_size, sizeof(kContext) + 19);
|
||||
EXPECT_EQ(enc_key_size, sizeof(kContext) + 15);
|
||||
}
|
||||
|
||||
TEST(OdkTest, GenerateKeyContexts_NullArgs) {
|
||||
const uint8_t kContext[] = {1, 2, 3};
|
||||
uint8_t buffer[24];
|
||||
size_t buffer_size = sizeof(buffer);
|
||||
size_t buffer_size2 = sizeof(buffer);
|
||||
|
||||
EXPECT_EQ(OEMCrypto_ERROR_INVALID_CONTEXT,
|
||||
ODK_GenerateKeyContexts(nullptr, sizeof(kContext), buffer,
|
||||
&buffer_size, buffer, &buffer_size2));
|
||||
buffer_size = buffer_size2 = sizeof(buffer); // Update to avoid short buffer.
|
||||
EXPECT_EQ(OEMCrypto_ERROR_SHORT_BUFFER,
|
||||
ODK_GenerateKeyContexts(kContext, sizeof(kContext), nullptr,
|
||||
&buffer_size, buffer, &buffer_size2));
|
||||
buffer_size = buffer_size2 = sizeof(buffer); // Update to avoid short buffer.
|
||||
EXPECT_EQ(OEMCrypto_ERROR_INVALID_CONTEXT,
|
||||
ODK_GenerateKeyContexts(kContext, sizeof(kContext), buffer, nullptr,
|
||||
buffer, &buffer_size2));
|
||||
buffer_size = buffer_size2 = sizeof(buffer); // Update to avoid short buffer.
|
||||
EXPECT_EQ(OEMCrypto_ERROR_SHORT_BUFFER,
|
||||
ODK_GenerateKeyContexts(kContext, sizeof(kContext), buffer,
|
||||
&buffer_size, nullptr, &buffer_size2));
|
||||
buffer_size = buffer_size2 = sizeof(buffer); // Update to avoid short buffer.
|
||||
EXPECT_EQ(OEMCrypto_ERROR_INVALID_CONTEXT,
|
||||
ODK_GenerateKeyContexts(kContext, sizeof(kContext), buffer,
|
||||
&buffer_size, buffer, nullptr));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
} // namespace wvodk_test
|
||||
|
||||
Reference in New Issue
Block a user