103 lines
2.7 KiB
C++
103 lines
2.7 KiB
C++
|
|
// Copyright 2022 The Chromium Authors
|
||
|
|
// Use of this source code is governed by a BSD-style license that can be
|
||
|
|
// found in the LICENSE file.
|
||
|
|
|
||
|
|
#include <stdint.h>
|
||
|
|
|
||
|
|
#include <string>
|
||
|
|
#include <tuple>
|
||
|
|
|
||
|
|
#include <fuzzer/FuzzedDataProvider.h>
|
||
|
|
|
||
|
|
#include "net/der/input.h"
|
||
|
|
#include "net/der/parse_values.h"
|
||
|
|
#include "net/der/parser.h"
|
||
|
|
#include "net/der/tag.h"
|
||
|
|
#include "third_party/abseil-cpp/absl/types/optional.h"
|
||
|
|
|
||
|
|
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
|
||
|
|
FuzzedDataProvider provider(data, size);
|
||
|
|
|
||
|
|
std::string der = provider.ConsumeRandomLengthString();
|
||
|
|
net::der::Parser parser = net::der::Parser(net::der::Input(&der));
|
||
|
|
while (provider.remaining_bytes()) {
|
||
|
|
switch (provider.ConsumeIntegralInRange<int>(0, 13)) {
|
||
|
|
case 0: {
|
||
|
|
net::der::Tag tag;
|
||
|
|
net::der::Input value;
|
||
|
|
std::ignore = parser.ReadTagAndValue(&tag, &value);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
case 1: {
|
||
|
|
net::der::Input tlv;
|
||
|
|
std::ignore = parser.ReadRawTLV(&tlv);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
case 2: {
|
||
|
|
absl::optional<net::der::Input> value;
|
||
|
|
std::ignore = parser.ReadOptionalTag(
|
||
|
|
provider.ConsumeIntegral<net::der::Tag>(), &value);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
case 3: {
|
||
|
|
bool was_present;
|
||
|
|
std::ignore = parser.SkipOptionalTag(
|
||
|
|
provider.ConsumeIntegral<net::der::Tag>(), &was_present);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
case 4: {
|
||
|
|
net::der::Input value;
|
||
|
|
std::ignore =
|
||
|
|
parser.ReadTag(provider.ConsumeIntegral<net::der::Tag>(), &value);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
case 5: {
|
||
|
|
std::ignore = parser.SkipTag(provider.ConsumeIntegral<net::der::Tag>());
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
case 6: {
|
||
|
|
net::der::Parser new_parser;
|
||
|
|
std::ignore = parser.ReadConstructed(
|
||
|
|
provider.ConsumeIntegral<net::der::Tag>(), &new_parser);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
case 7: {
|
||
|
|
net::der::Parser new_parser;
|
||
|
|
std::ignore = parser.ReadSequence(&new_parser);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
case 8: {
|
||
|
|
uint8_t value;
|
||
|
|
std::ignore = parser.ReadUint8(&value);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
case 9: {
|
||
|
|
uint64_t value;
|
||
|
|
std::ignore = parser.ReadUint64(&value);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
case 10: {
|
||
|
|
std::ignore = parser.ReadBitString();
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
case 11: {
|
||
|
|
net::der::GeneralizedTime generalized_time;
|
||
|
|
std::ignore = parser.ReadGeneralizedTime(&generalized_time);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
case 12: {
|
||
|
|
net::der::Tag tag;
|
||
|
|
net::der::Input value;
|
||
|
|
std::ignore = parser.PeekTagAndValue(&tag, &value);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
case 13: {
|
||
|
|
std::ignore = parser.Advance();
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return 0;
|
||
|
|
}
|