diff --git a/Tests/Fuzzers/CMakeLists.txt b/Tests/Fuzzers/CMakeLists.txt index c22c13be65..b871929a4c 100644 --- a/Tests/Fuzzers/CMakeLists.txt +++ b/Tests/Fuzzers/CMakeLists.txt @@ -20,3 +20,7 @@ target_compile_definitions(FuzzWriter PUBLIC FILE_EXT=".pcap" NG_WRITER) add_executable(FuzzWriterNg FuzzWriter.cpp) target_link_libraries(FuzzWriterNg PRIVATE Pcap++ -fsanitize=fuzzer) target_compile_definitions(FuzzWriterNg PUBLIC FILE_EXT=".pcapng") + +add_executable(FuzzX509 FuzzX509.cpp) +target_link_libraries(FuzzX509 PRIVATE Pcap++ -fsanitize=fuzzer) +target_include_directories(FuzzX509 PRIVATE $) diff --git a/Tests/Fuzzers/FuzzX509.cpp b/Tests/Fuzzers/FuzzX509.cpp new file mode 100644 index 0000000000..18f2c1fd0d --- /dev/null +++ b/Tests/Fuzzers/FuzzX509.cpp @@ -0,0 +1,84 @@ +#include +#include +#include + +#include +#include +#include + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) +{ + if (size == 0) + return 0; + + pcpp::Logger::getInstance().suppressLogs(); + + // fromDER needs a mutable buffer that outlives the parse + std::vector buf(data, data + size); + + try + { + auto cert = pcpp::X509Certificate::fromDER(buf.data(), buf.size()); + if (!cert) + return 0; + + cert->getVersion(); + cert->getSerialNumber(); + cert->getIssuer(); + cert->getSubject(); + cert->getNotBefore(); + cert->getNotAfter(); + cert->getPublicKeyAlgorithm(); + cert->getPublicKey(); + cert->getSignatureAlgorithm(); + cert->getSignature(); + cert->toJson(); + + for (const auto& ext : cert->getExtensions()) + { + ext.getType(); + ext.isCritical(); + + auto extData = ext.getData(); + if (!extData) + continue; + + switch (ext.getType()) + { + case pcpp::X509ExtensionType::BasicConstraints: + { + auto* bc = extData->castAs(); + bc->isCA(); + bc->getPathLenConstraint(); + break; + } + case pcpp::X509ExtensionType::KeyUsage: + { + auto* ku = extData->castAs(); + ku->isDigitalSignature(); + ku->isNonRepudiation(); + ku->isKeyEncipherment(); + ku->isDataEncipherment(); + ku->isKeyAgreement(); + ku->isKeyCertSign(); + ku->isCRLSign(); + ku->isEncipherOnly(); + ku->isDecipherOnly(); + break; + } + case pcpp::X509ExtensionType::ExtendedKeyUsage: + extData->castAs()->getPurposes(); + break; + case pcpp::X509ExtensionType::SubjectKeyIdentifier: + extData->castAs()->getKeyIdentifier(); + break; + default: + break; + } + } + } + catch (...) + {} + + return 0; +} diff --git a/Tests/Fuzzers/ossfuzz.sh b/Tests/Fuzzers/ossfuzz.sh index 6d461ff649..7915257f10 100755 --- a/Tests/Fuzzers/ossfuzz.sh +++ b/Tests/Fuzzers/ossfuzz.sh @@ -20,7 +20,8 @@ FUZZERS="FuzzTarget \ FuzzTargetNg \ FuzzTargetSnoop \ FuzzWriter \ - FuzzWriterNg" + FuzzWriterNg \ + FuzzX509" for fuzzer in $FUZZERS; do cp $TARGETS_DIR/Tests/Fuzzers/${fuzzer} $OUT @@ -34,3 +35,4 @@ find $SRC/ -iname "*.pcapng" | xargs zip $OUT/FuzzTargetNg_seed_corpus.zip find $SRC/ -iname "*.snoop" | xargs zip $OUT/FuzzTargetSnoop_seed_corpus.zip find $SRC/ -iname "*.pcap" | xargs zip $OUT/FuzzWriter_seed_corpus.zip find $SRC/ -iname "*.pcapng" | xargs zip $OUT/FuzzWriterNg_seed_corpus.zip +find $SRC/ -iname "*.der" | xargs zip $OUT/FuzzX509_seed_corpus.zip