/src/PcapPlusPlus/Tests/Fuzzers/FuzzX509.cpp
Line | Count | Source |
1 | | #include <cstdint> |
2 | | #include <memory> |
3 | | #include <vector> |
4 | | |
5 | | #include <X509Decoder.h> |
6 | | #include <X509ExtensionDataDecoder.h> |
7 | | #include <Logger.h> |
8 | | |
9 | | extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) |
10 | 3.40k | { |
11 | 3.40k | if (size == 0) |
12 | 0 | return 0; |
13 | | |
14 | 3.40k | pcpp::Logger::getInstance().suppressLogs(); |
15 | | |
16 | | // fromDER needs a mutable buffer that outlives the parse |
17 | 3.40k | std::vector<uint8_t> buf(data, data + size); |
18 | | |
19 | 3.40k | try |
20 | 3.40k | { |
21 | 3.40k | auto cert = pcpp::X509Certificate::fromDER(buf.data(), buf.size()); |
22 | 3.40k | if (!cert) |
23 | 0 | return 0; |
24 | | |
25 | 3.40k | cert->getVersion(); |
26 | 3.40k | cert->getSerialNumber(); |
27 | 3.40k | cert->getIssuer(); |
28 | 3.40k | cert->getSubject(); |
29 | 3.40k | cert->getNotBefore(); |
30 | 3.40k | cert->getNotAfter(); |
31 | 3.40k | cert->getPublicKeyAlgorithm(); |
32 | 3.40k | cert->getPublicKey(); |
33 | 3.40k | cert->getSignatureAlgorithm(); |
34 | 3.40k | cert->getSignature(); |
35 | 3.40k | cert->toJson(); |
36 | | |
37 | 3.40k | for (const auto& ext : cert->getExtensions()) |
38 | 2.71k | { |
39 | 2.71k | ext.getType(); |
40 | 2.71k | ext.isCritical(); |
41 | | |
42 | 2.71k | auto extData = ext.getData(); |
43 | 2.71k | if (!extData) |
44 | 1.12k | continue; |
45 | | |
46 | 1.58k | switch (ext.getType()) |
47 | 1.58k | { |
48 | 335 | case pcpp::X509ExtensionType::BasicConstraints: |
49 | 335 | { |
50 | 335 | auto* bc = extData->castAs<pcpp::X509BasicConstraintsExtension>(); |
51 | 335 | bc->isCA(); |
52 | 335 | bc->getPathLenConstraint(); |
53 | 335 | break; |
54 | 0 | } |
55 | 347 | case pcpp::X509ExtensionType::KeyUsage: |
56 | 347 | { |
57 | 347 | auto* ku = extData->castAs<pcpp::X509KeyUsageExtension>(); |
58 | 347 | ku->isDigitalSignature(); |
59 | 347 | ku->isNonRepudiation(); |
60 | 347 | ku->isKeyEncipherment(); |
61 | 347 | ku->isDataEncipherment(); |
62 | 347 | ku->isKeyAgreement(); |
63 | 347 | ku->isKeyCertSign(); |
64 | 347 | ku->isCRLSign(); |
65 | 347 | ku->isEncipherOnly(); |
66 | 347 | ku->isDecipherOnly(); |
67 | 347 | break; |
68 | 0 | } |
69 | 397 | case pcpp::X509ExtensionType::ExtendedKeyUsage: |
70 | 397 | extData->castAs<pcpp::X509ExtendedKeyUsageExtension>()->getPurposes(); |
71 | 397 | break; |
72 | 216 | case pcpp::X509ExtensionType::SubjectKeyIdentifier: |
73 | 216 | extData->castAs<pcpp::X509SubjectKeyIdentifierExtension>()->getKeyIdentifier(); |
74 | 216 | break; |
75 | 0 | default: |
76 | 0 | break; |
77 | 1.58k | } |
78 | 1.58k | } |
79 | 3.40k | } |
80 | 3.40k | catch (...) |
81 | 3.40k | {} |
82 | | |
83 | 3.40k | return 0; |
84 | 3.40k | } |