Merge changes I6dd829f4,Id8384c58,I9228b9cc,I744a1e89 into sc-dev am: 03dff71bd8
Original change: https://googleplex-android-review.googlesource.com/c/platform/vendor/widevine/+/14212412 Change-Id: I1837921fb595a45514ce17befccc0fc82cd20193
This commit is contained in:
@@ -206,43 +206,3 @@ TEST_F(HttpSocketTest, RoundTripTest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} // namespace wvcdm
|
} // namespace wvcdm
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
|
||||||
using namespace wvcdm;
|
|
||||||
|
|
||||||
::testing::InitGoogleTest(&argc, argv);
|
|
||||||
|
|
||||||
std::string temp;
|
|
||||||
std::string test_server(kHttpsTestServer);
|
|
||||||
std::string test_data(gTestData);
|
|
||||||
for (int i = 1; i < argc; i++) {
|
|
||||||
temp.assign(argv[i]);
|
|
||||||
if (temp.find("--server=") == 0) {
|
|
||||||
gTestServer.assign(temp.substr(strlen("--server=")));
|
|
||||||
} else if (temp.find("--data=") == 0) {
|
|
||||||
gTestData.assign(temp.substr(strlen("--data=")));
|
|
||||||
} else {
|
|
||||||
std::cout << "error: unknown option '" << argv[i] << "'" << std::endl;
|
|
||||||
std::cout << "usage: http_socket_test [options]" << std::endl
|
|
||||||
<< std::endl;
|
|
||||||
std::cout << std::setw(30) << std::left << " --server=<server_url>";
|
|
||||||
std::cout
|
|
||||||
<< "configure the test server url, please include http[s] in the url"
|
|
||||||
<< std::endl;
|
|
||||||
std::cout << std::setw(30) << std::left << " ";
|
|
||||||
std::cout << "default: " << test_server << std::endl;
|
|
||||||
std::cout << std::setw(30) << std::left << " --data=<data>";
|
|
||||||
std::cout << "configure data to send, in ascii string format"
|
|
||||||
<< std::endl;
|
|
||||||
std::cout << std::setw(30) << std::left << " ";
|
|
||||||
std::cout << "default: " << test_data << std::endl << std::endl;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cout << std::endl;
|
|
||||||
std::cout << "Server: " << gTestServer << std::endl;
|
|
||||||
std::cout << "Data: " << gTestData << std::endl;
|
|
||||||
|
|
||||||
return RUN_ALL_TESTS();
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -74,7 +74,6 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) {
|
|||||||
case CERT_PROVISIONING_RESPONSE_ERROR_10:
|
case CERT_PROVISIONING_RESPONSE_ERROR_10:
|
||||||
*os << "CERT_PROVISIONING_RESPONSE_ERROR_10";
|
*os << "CERT_PROVISIONING_RESPONSE_ERROR_10";
|
||||||
break;
|
break;
|
||||||
break;
|
|
||||||
case CLIENT_ID_AES_ENCRYPT_ERROR:
|
case CLIENT_ID_AES_ENCRYPT_ERROR:
|
||||||
*os << "CLIENT_ID_AES_ENCRYPT_ERROR";
|
*os << "CLIENT_ID_AES_ENCRYPT_ERROR";
|
||||||
break;
|
break;
|
||||||
@@ -1184,6 +1183,9 @@ void PrintTo(const enum OEMCryptoResult& value, ::std::ostream* os) {
|
|||||||
case OEMCrypto_WARNING_MIXED_OUTPUT_PROTECTION:
|
case OEMCrypto_WARNING_MIXED_OUTPUT_PROTECTION:
|
||||||
*os << "MIXED_OUTPUT_PROTECTION";
|
*os << "MIXED_OUTPUT_PROTECTION";
|
||||||
break;
|
break;
|
||||||
|
case OEMCrypto_ERROR_INVALID_ENTITLED_KEY_SESSION:
|
||||||
|
*os << "OEMCrypto_ERROR_INVALID_ENTITLED_KEY_SESSION";
|
||||||
|
break;
|
||||||
// ODK Values.
|
// ODK Values.
|
||||||
case ODK_ERROR_CORE_MESSAGE:
|
case ODK_ERROR_CORE_MESSAGE:
|
||||||
*os << "CORE_MESSAGE";
|
*os << "CORE_MESSAGE";
|
||||||
|
|||||||
@@ -91,8 +91,7 @@ include $(LOCAL_PATH)/integration-test.mk
|
|||||||
|
|
||||||
test_name := http_socket_test
|
test_name := http_socket_test
|
||||||
test_src_dir := ../core/test
|
test_src_dir := ../core/test
|
||||||
test_main :=
|
include $(LOCAL_PATH)/unit-test.mk
|
||||||
include $(LOCAL_PATH)/integration-test.mk
|
|
||||||
|
|
||||||
test_name := initialization_data_unittest
|
test_name := initialization_data_unittest
|
||||||
test_src_dir := ../core/test
|
test_src_dir := ../core/test
|
||||||
|
|||||||
@@ -74,26 +74,26 @@ typedef struct {
|
|||||||
// without any padding added by the compiler. Make sure they get updated when
|
// without any padding added by the compiler. Make sure they get updated when
|
||||||
// request structs change. Refer to test suite OdkSizeTest in
|
// request structs change. Refer to test suite OdkSizeTest in
|
||||||
// ../test/odk_test.cpp for validations of each of the defined request sizes.
|
// ../test/odk_test.cpp for validations of each of the defined request sizes.
|
||||||
#define ODK_LICENSE_REQUEST_SIZE 20
|
#define ODK_LICENSE_REQUEST_SIZE 20u
|
||||||
#define ODK_RENEWAL_REQUEST_SIZE 28
|
#define ODK_RENEWAL_REQUEST_SIZE 28u
|
||||||
#define ODK_PROVISIONING_REQUEST_SIZE 88
|
#define ODK_PROVISIONING_REQUEST_SIZE 88u
|
||||||
|
|
||||||
// These are the possible timer status values.
|
// These are the possible timer status values.
|
||||||
#define ODK_CLOCK_TIMER_STATUS_UNDEFINED 0 // Should not happen.
|
#define ODK_CLOCK_TIMER_STATUS_UNDEFINED 0u // Should not happen.
|
||||||
// When the structure has been initialized, but no license is loaded.
|
// When the structure has been initialized, but no license is loaded.
|
||||||
#define ODK_CLOCK_TIMER_STATUS_LICENSE_NOT_LOADED 1
|
#define ODK_CLOCK_TIMER_STATUS_LICENSE_NOT_LOADED 1u
|
||||||
// After the license is loaded, before a successful decrypt.
|
// After the license is loaded, before a successful decrypt.
|
||||||
#define ODK_CLOCK_TIMER_STATUS_LICENSE_LOADED 2
|
#define ODK_CLOCK_TIMER_STATUS_LICENSE_LOADED 2u
|
||||||
// After the license is loaded, if a renewal has also been loaded.
|
// After the license is loaded, if a renewal has also been loaded.
|
||||||
#define ODK_CLOCK_TIMER_STATUS_RENEWAL_LOADED 3
|
#define ODK_CLOCK_TIMER_STATUS_RENEWAL_LOADED 3u
|
||||||
// The first decrypt has occurred and the timer is active.
|
// The first decrypt has occurred and the timer is active.
|
||||||
#define ODK_CLOCK_TIMER_STATUS_ACTIVE 4
|
#define ODK_CLOCK_TIMER_STATUS_ACTIVE 4u
|
||||||
// The first decrypt has occurred and the timer is unlimited.
|
// The first decrypt has occurred and the timer is unlimited.
|
||||||
#define ODK_CLOCK_TIMER_STATUS_UNLIMITED 5
|
#define ODK_CLOCK_TIMER_STATUS_UNLIMITED 5u
|
||||||
// The timer has transitioned from active to expired.
|
// The timer has transitioned from active to expired.
|
||||||
#define ODK_CLOCK_TIMER_STATUS_EXPIRED 6
|
#define ODK_CLOCK_TIMER_STATUS_EXPIRED 6u
|
||||||
// The license has been marked as inactive.
|
// The license has been marked as inactive.
|
||||||
#define ODK_CLOCK_TIMER_STATUS_LICENSE_INACTIVE 7
|
#define ODK_CLOCK_TIMER_STATUS_LICENSE_INACTIVE 7u
|
||||||
|
|
||||||
// A helper function for computing timer limits when a renewal is loaded.
|
// A helper function for computing timer limits when a renewal is loaded.
|
||||||
OEMCryptoResult ODK_ComputeRenewalDuration(const ODK_TimerLimits* timer_limits,
|
OEMCryptoResult ODK_ComputeRenewalDuration(const ODK_TimerLimits* timer_limits,
|
||||||
|
|||||||
@@ -6,13 +6,15 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "fuzzing/odk_fuzz_helper.h"
|
#include "fuzzing/odk_fuzz_helper.h"
|
||||||
|
#include "odk_attributes.h"
|
||||||
|
|
||||||
namespace oemcrypto_core_message {
|
namespace oemcrypto_core_message {
|
||||||
|
|
||||||
// The custom mutator: Ensure that each input can be deserialized properly
|
// The custom mutator: Ensure that each input can be deserialized properly
|
||||||
// by ODK function after mutation.
|
// by ODK function after mutation.
|
||||||
extern "C" size_t LLVMFuzzerCustomMutator(uint8_t* data, size_t size,
|
extern "C" size_t LLVMFuzzerCustomMutator(uint8_t* data, size_t size,
|
||||||
size_t max_size, unsigned int seed) {
|
size_t max_size,
|
||||||
|
unsigned int seed UNUSED) {
|
||||||
const size_t kProvisioningResponseArgsSize =
|
const size_t kProvisioningResponseArgsSize =
|
||||||
sizeof(ODK_ParseProvisioning_Args);
|
sizeof(ODK_ParseProvisioning_Args);
|
||||||
if (size < kProvisioningResponseArgsSize) {
|
if (size < kProvisioningResponseArgsSize) {
|
||||||
|
|||||||
@@ -6,13 +6,15 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "fuzzing/odk_fuzz_helper.h"
|
#include "fuzzing/odk_fuzz_helper.h"
|
||||||
|
#include "odk_attributes.h"
|
||||||
|
|
||||||
namespace oemcrypto_core_message {
|
namespace oemcrypto_core_message {
|
||||||
|
|
||||||
// The custom mutator: Ensure that each input can be deserialized properly
|
// The custom mutator: Ensure that each input can be deserialized properly
|
||||||
// by ODK function after mutation.
|
// by ODK function after mutation.
|
||||||
extern "C" size_t LLVMFuzzerCustomMutator(uint8_t* data, size_t size,
|
extern "C" size_t LLVMFuzzerCustomMutator(uint8_t* data, size_t size,
|
||||||
size_t max_size, unsigned int seed) {
|
size_t max_size,
|
||||||
|
unsigned int seed UNUSED) {
|
||||||
const size_t kRenewalResponseArgsSize = sizeof(ODK_ParseRenewal_Args);
|
const size_t kRenewalResponseArgsSize = sizeof(ODK_ParseRenewal_Args);
|
||||||
if (size < kRenewalResponseArgsSize) {
|
if (size < kRenewalResponseArgsSize) {
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -176,15 +176,15 @@ TEST(OdkTest, SerializeFieldsStress) {
|
|||||||
std::srand(0);
|
std::srand(0);
|
||||||
size_t total_size = 0;
|
size_t total_size = 0;
|
||||||
for (int i = 0; i < n; i++) {
|
for (int i = 0; i < n; i++) {
|
||||||
fields[i].type = static_cast<ODK_FieldType>(std::rand() %
|
fields[i].type = static_cast<ODK_FieldType>(
|
||||||
static_cast<int>(ODK_NUMTYPES));
|
std::rand() % static_cast<int>(ODK_LAST_STRESSABLE_TYPE));
|
||||||
fields[i].value = malloc(ODK_AllocSize(fields[i].type));
|
fields[i].value = malloc(ODK_AllocSize(fields[i].type));
|
||||||
fields[i].name = "stress";
|
fields[i].name = "stress";
|
||||||
total_size += ODK_FieldLength(fields[i].type);
|
total_size += ODK_FieldLength(fields[i].type);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t* buf = new uint8_t[total_size]{};
|
uint8_t* buf = new uint8_t[total_size]{};
|
||||||
for (int i = 0; i < total_size; i++) {
|
for (size_t i = 0; i < total_size; i++) {
|
||||||
buf[i] = std::rand() & 0xff;
|
buf[i] = std::rand() & 0xff;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -701,7 +701,7 @@ TEST(OdkSizeTest, ReleaseRequest) {
|
|||||||
&core_message_length, &nonce_values,
|
&core_message_length, &nonce_values,
|
||||||
&clock_values, system_time_seconds));
|
&clock_values, system_time_seconds));
|
||||||
// Release requests do not have a core message.
|
// Release requests do not have a core message.
|
||||||
EXPECT_GE(core_message_length, 0);
|
EXPECT_GE(core_message_length, 0u);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(OdkSizeTest, ProvisioningRequest) {
|
TEST(OdkSizeTest, ProvisioningRequest) {
|
||||||
|
|||||||
@@ -86,10 +86,10 @@ void ODK_SetDefaultLicenseResponseParams(ODK_LicenseResponseParams* params) {
|
|||||||
".srm_restriction_data"},
|
".srm_restriction_data"},
|
||||||
{ODK_UINT32, &(params->parsed_license.license_type), ".license_type"},
|
{ODK_UINT32, &(params->parsed_license.license_type), ".license_type"},
|
||||||
{ODK_UINT32, &(params->parsed_license.nonce_required), ".nonce_required"},
|
{ODK_UINT32, &(params->parsed_license.nonce_required), ".nonce_required"},
|
||||||
{ODK_UINT32,
|
{ODK_BOOL,
|
||||||
&(params->parsed_license.timer_limits.soft_enforce_rental_duration),
|
&(params->parsed_license.timer_limits.soft_enforce_rental_duration),
|
||||||
".soft_enforce_rental_duration"},
|
".soft_enforce_rental_duration"},
|
||||||
{ODK_UINT32,
|
{ODK_BOOL,
|
||||||
&(params->parsed_license.timer_limits.soft_enforce_playback_duration),
|
&(params->parsed_license.timer_limits.soft_enforce_playback_duration),
|
||||||
".soft_enforce_playback_duration"},
|
".soft_enforce_playback_duration"},
|
||||||
{ODK_UINT64,
|
{ODK_UINT64,
|
||||||
@@ -201,6 +201,8 @@ size_t ODK_FieldLength(ODK_FieldType type) {
|
|||||||
return sizeof(uint32_t);
|
return sizeof(uint32_t);
|
||||||
case ODK_UINT64:
|
case ODK_UINT64:
|
||||||
return sizeof(uint64_t);
|
return sizeof(uint64_t);
|
||||||
|
case ODK_BOOL: // Booleans are stored in the message as 32 bit ints.
|
||||||
|
return sizeof(uint32_t);
|
||||||
case ODK_SUBSTRING:
|
case ODK_SUBSTRING:
|
||||||
return sizeof(uint32_t) + sizeof(uint32_t);
|
return sizeof(uint32_t) + sizeof(uint32_t);
|
||||||
case ODK_DEVICEID:
|
case ODK_DEVICEID:
|
||||||
@@ -242,6 +244,12 @@ OEMCryptoResult ODK_WriteSingleField(uint8_t* buf, const ODK_Field* field) {
|
|||||||
memcpy(buf, &u64, sizeof(u64));
|
memcpy(buf, &u64, sizeof(u64));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ODK_BOOL: {
|
||||||
|
const bool value = *static_cast<bool*>(field->value);
|
||||||
|
const uint32_t u32 = oemcrypto_htobe32(value ? 1 : 0);
|
||||||
|
memcpy(buf, &u32, sizeof(u32));
|
||||||
|
break;
|
||||||
|
}
|
||||||
case ODK_SUBSTRING: {
|
case ODK_SUBSTRING: {
|
||||||
OEMCrypto_Substring* s = static_cast<OEMCrypto_Substring*>(field->value);
|
OEMCrypto_Substring* s = static_cast<OEMCrypto_Substring*>(field->value);
|
||||||
const uint32_t off = oemcrypto_htobe32(s->offset);
|
const uint32_t off = oemcrypto_htobe32(s->offset);
|
||||||
@@ -288,6 +296,13 @@ OEMCryptoResult ODK_ReadSingleField(const uint8_t* buf,
|
|||||||
*u64p = oemcrypto_be64toh(*u64p);
|
*u64p = oemcrypto_be64toh(*u64p);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ODK_BOOL: {
|
||||||
|
uint32_t value;
|
||||||
|
memcpy(&value, buf, sizeof(uint32_t));
|
||||||
|
value = oemcrypto_be32toh(value);
|
||||||
|
*static_cast<bool*>(field->value) = (value != 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case ODK_SUBSTRING: {
|
case ODK_SUBSTRING: {
|
||||||
OEMCrypto_Substring* s = static_cast<OEMCrypto_Substring*>(field->value);
|
OEMCrypto_Substring* s = static_cast<OEMCrypto_Substring*>(field->value);
|
||||||
uint32_t off = 0;
|
uint32_t off = 0;
|
||||||
@@ -325,6 +340,7 @@ OEMCryptoResult ODK_DumpSingleField(const uint8_t* buf,
|
|||||||
<< "\n";
|
<< "\n";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ODK_BOOL:
|
||||||
case ODK_UINT32: {
|
case ODK_UINT32: {
|
||||||
uint32_t val;
|
uint32_t val;
|
||||||
memcpy(&val, buf, sizeof(uint32_t));
|
memcpy(&val, buf, sizeof(uint32_t));
|
||||||
|
|||||||
@@ -21,7 +21,12 @@ enum ODK_FieldType {
|
|||||||
ODK_SUBSTRING,
|
ODK_SUBSTRING,
|
||||||
ODK_DEVICEID,
|
ODK_DEVICEID,
|
||||||
ODK_HASH,
|
ODK_HASH,
|
||||||
ODK_NUMTYPES,
|
// The "stressable" types are the ones we can put in a stress test that packs
|
||||||
|
// and unpacks random data and can expect to get back the same thing.
|
||||||
|
ODK_LAST_STRESSABLE_TYPE,
|
||||||
|
// Put boolean after ODK_LAST_STRESSABLE_TYPE, so that we skip boolean type in
|
||||||
|
// SerializeFieldsStress because we unpack any nonzero to 'true'.
|
||||||
|
ODK_BOOL,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ODK_FieldMode {
|
enum ODK_FieldMode {
|
||||||
|
|||||||
Reference in New Issue
Block a user