Simplify fuzz tests using LicenseWithUsageEntryFuzz

Merged from https://widevine-internal-review.googlesource.com/175060

Change-Id: I2f245ac998883e2a31cde361e30b36f00681262c
This commit is contained in:
Ian Benz
2023-05-12 17:52:38 +00:00
committed by Robert Shih
parent 5c5433a8d8
commit 078682a897
8 changed files with 72 additions and 92 deletions

View File

@@ -11,19 +11,15 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
wvoec::LicenseWithUsageEntryFuzz entry;
entry.Initialize();
entry.CreateUsageTableHeader();
// Open a session, create a usage entry.
wvoec::Session* session = entry.license_messages().session();
session->open();
entry.InstallTestDrmKey(session);
session->CreateNewUsageEntry();
session->GenerateNonce();
entry.InstallTestDrmKey();
entry.session().CreateNewUsageEntry();
entry.session().GenerateNonce();
std::vector<uint8_t> encrypted_usage_header;
session->UpdateUsageEntry(&encrypted_usage_header);
entry.session().UpdateUsageEntry(&encrypted_usage_header);
// LoadLicense sets the pst for usage entry.
entry.LoadLicense();
OEMCrypto_DeactivateUsageEntry(entry.session().session_id(), data, size);
entry.Terminate();
OEMCrypto_DeactivateUsageEntry(session->session_id(), data, size);
session->close();
OEMCrypto_Terminate();
return 0;
}

View File

@@ -143,33 +143,36 @@ class OEMCryptoRenewalAPIFuzz {
class LicenseWithUsageEntryFuzz {
public:
LicenseWithUsageEntryFuzz() : license_messages_(&session_) {
LicenseWithUsageEntryFuzz() : license_messages_(&session_fuzz_.session()) {
license_messages_.set_pst("my_pst");
}
void Initialize() { InitializeFuzz(session_util_); }
void Initialize() { session_fuzz_.Initialize(); }
void InstallTestDrmKey(Session* session) {
session_util_.InstallTestDrmKey(session);
}
void Terminate() { session_fuzz_.Terminate(); }
void CreateUsageTableHeader();
void InstallTestDrmKey() { session_fuzz_.InstallTestDrmKey(); }
void LoadLicense();
LicenseRoundTrip& license_messages() { return license_messages_; }
const LicenseRoundTrip& license_messages() const { return license_messages_; }
const vector<uint8_t>& encrypted_usage_header() const {
const std::vector<uint8_t>& encrypted_usage_header() const {
return encrypted_usage_header_;
}
Session& session() { return session_fuzz_.session(); }
const Session& session() const { return session_fuzz_.session(); }
private:
SessionUtil session_util_;
vector<uint8_t> encrypted_usage_header_;
SessionFuzz session_fuzz_;
LicenseRoundTrip license_messages_;
Session session_;
std::vector<uint8_t> encrypted_usage_header_;
};
// Convert data from FuzzedDataProvider to valid enum value.

View File

@@ -35,17 +35,16 @@ extern "C" int LLVMFuzzerInitialize(int* argc, char*** argv) {
extern "C" size_t LLVMFuzzerCustomMutator(uint8_t* data, size_t size,
size_t max_size, unsigned int seed) {
entry.CreateUsageTableHeader();
wvoec::Session* s = entry.license_messages().session();
s->open();
entry.InstallTestDrmKey(s);
if (LoadUsageEntryWithFuzzedData(s->session_id(), data, size) !=
entry.session().open();
entry.InstallTestDrmKey();
if (LoadUsageEntryWithFuzzedData(entry.session().session_id(), data, size) !=
OEMCrypto_SUCCESS) {
s->CreateNewUsageEntry();
entry.session().CreateNewUsageEntry();
std::vector<uint8_t> encrypted_usage_header;
s->UpdateUsageEntry(&encrypted_usage_header);
const uint32_t usage_entry_number = s->usage_entry_number();
entry.session().UpdateUsageEntry(&encrypted_usage_header);
const uint32_t usage_entry_number = entry.session().usage_entry_number();
const std::vector<uint8_t>& encrypted_usage_entry =
s->encrypted_usage_entry();
entry.session().encrypted_usage_entry();
size = sizeof(usage_entry_number) + encrypted_usage_entry.size();
if (size > max_size) {
return 0;
@@ -55,14 +54,13 @@ extern "C" size_t LLVMFuzzerCustomMutator(uint8_t* data, size_t size,
memcpy(data + sizeof(usage_entry_number), encrypted_usage_entry.data(),
encrypted_usage_entry.size());
}
s->close();
entry.session().close();
return LLVMFuzzerMutate(data, size, max_size);
}
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
wvoec::Session s;
s.open();
LoadUsageEntryWithFuzzedData(s.session_id(), data, size);
s.close();
entry.session().open();
LoadUsageEntryWithFuzzedData(entry.session().session_id(), data, size);
entry.session().close();
return 0;
}

View File

@@ -20,7 +20,7 @@ extern "C" size_t LLVMFuzzerCustomMutator(uint8_t* data, size_t size,
memcpy(data, entry.encrypted_usage_header().data(),
entry.encrypted_usage_header().size());
}
OEMCrypto_Terminate();
entry.Terminate();
return LLVMFuzzerMutate(data, size, max_size);
}

View File

@@ -6,35 +6,24 @@
#include "OEMCryptoCENC.h"
#include "oemcrypto_fuzz_helper.h"
namespace {
// Avoid calling non-trivial destructor.
wvoec::LicenseWithUsageEntryFuzz& entry = *new wvoec::LicenseWithUsageEntryFuzz;
} // namespace
extern "C" int LLVMFuzzerInitialize(int* argc, char*** argv) {
wvoec::RedirectStdoutToFile();
entry.Initialize();
return 0;
}
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
wvoec::RedirectStdoutToFile();
wvoec::LicenseWithUsageEntryFuzz entry;
entry.Initialize();
entry.CreateUsageTableHeader();
wvoec::Session* s = entry.license_messages().session();
s->open();
entry.InstallTestDrmKey(s);
s->CreateNewUsageEntry();
entry.InstallTestDrmKey();
entry.session().CreateNewUsageEntry();
std::vector<uint8_t> encrypted_usage_header;
s->UpdateUsageEntry(&encrypted_usage_header);
s->close();
entry.session().UpdateUsageEntry(&encrypted_usage_header);
entry.session().close();
s->open();
s->ReloadUsageEntry();
entry.session().open();
entry.session().ReloadUsageEntry();
OEMCrypto_MoveEntry(
s->session_id(),
entry.session().session_id(),
FuzzedDataProvider(data, size).ConsumeIntegral<uint32_t>());
s->close();
entry.Terminate();
return 0;
}

View File

@@ -11,7 +11,7 @@ namespace {
constexpr size_t MAX_FUZZ_PST_REPORT_BUFFER_LENGTH = 5 * wvoec::MB;
} // namespace
} // namespace
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
wvoec::RedirectStdoutToFile();
@@ -19,30 +19,29 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
wvoec::LicenseWithUsageEntryFuzz entry;
entry.Initialize();
entry.CreateUsageTableHeader();
// Open a session, create a usage entry.
wvoec::Session* session = entry.license_messages().session();
session->open();
entry.InstallTestDrmKey(session);
session->CreateNewUsageEntry();
session->GenerateNonce();
entry.InstallTestDrmKey();
entry.session().CreateNewUsageEntry();
entry.session().GenerateNonce();
std::vector<uint8_t> encrypted_usage_header;
session->UpdateUsageEntry(&encrypted_usage_header);
entry.session().UpdateUsageEntry(&encrypted_usage_header);
// Sets pst for usage entry.
entry.LoadLicense();
FuzzedDataProvider fuzzed_data(data, size);
// pst_report_buffer and pst_report_buffer_length parameters
size_t pst_report_buffer_length_data =
fuzzed_data.ConsumeIntegralInRange<size_t>(
0, MAX_FUZZ_PST_REPORT_BUFFER_LENGTH);
std::vector<uint8_t> pst_report_buffer(pst_report_buffer_length_data);
size_t* const pst_report_buffer_length =
fuzzed_data.ConsumeBool() ? &pst_report_buffer_length_data : nullptr;
const std::vector<uint8_t> pst = fuzzed_data.ConsumeRemainingBytes<uint8_t>();
// Call API with fuzzed pst_buffer_length, pst.
OEMCrypto_ReportUsage(session->session_id(), pst.data(), pst.size(),
pst_report_buffer.data(), pst_report_buffer_length);
session->close();
OEMCrypto_Terminate();
const std::vector<uint8_t> pst = fuzzed_data.ConsumeRemainingBytes<uint8_t>();
OEMCrypto_ReportUsage(entry.session().session_id(), pst.data(), pst.size(),
pst_report_buffer.data(), pst_report_buffer_length);
entry.Terminate();
return 0;
}

View File

@@ -6,32 +6,21 @@
#include "OEMCryptoCENC.h"
#include "oemcrypto_fuzz_helper.h"
namespace {
// Avoid calling non-trivial destructor.
wvoec::LicenseWithUsageEntryFuzz& entry = *new wvoec::LicenseWithUsageEntryFuzz;
} // namespace
extern "C" int LLVMFuzzerInitialize(int* argc, char*** argv) {
wvoec::RedirectStdoutToFile();
entry.Initialize();
return 0;
}
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
wvoec::RedirectStdoutToFile();
wvoec::LicenseWithUsageEntryFuzz entry;
entry.Initialize();
entry.CreateUsageTableHeader();
wvoec::Session* s = entry.license_messages().session();
s->open();
entry.InstallTestDrmKey(s);
s->CreateNewUsageEntry();
s->close();
entry.InstallTestDrmKey();
entry.session().CreateNewUsageEntry();
entry.session().close();
s->open();
entry.session().open();
OEMCrypto_ReuseUsageEntry(
s->session_id(),
entry.session().session_id(),
FuzzedDataProvider(data, size).ConsumeIntegral<uint32_t>());
s->close();
entry.Terminate();
return 0;
}

View File

@@ -14,15 +14,21 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
wvoec::LicenseWithUsageEntryFuzz entry;
entry.Initialize();
entry.CreateUsageTableHeader();
FuzzedDataProvider fuzzed_data(data, size);
const uint32_t new_entry_count = fuzzed_data.ConsumeIntegral<uint32_t>();
// header_buffer and header_buffer_length parameters
size_t header_buffer_length_data = fuzzed_data.ConsumeIntegralInRange<size_t>(
0, wvoec::MAX_FUZZ_OUTPUT_LENGTH);
std::vector<uint8_t> header_buffer(header_buffer_length_data);
size_t* const header_buffer_length =
fuzzed_data.ConsumeBool() ? &header_buffer_length_data : nullptr;
OEMCrypto_ShrinkUsageTableHeader(new_entry_count, header_buffer.data(),
header_buffer_length);
OEMCrypto_Terminate();
entry.Terminate();
return 0;
}