|
| 1 | +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. |
| 2 | +// SPDX-License-Identifier: Apache-2.0 OR ISC |
| 3 | + |
| 4 | +#include <cstdint> |
| 5 | +#include <cstring> |
| 6 | + |
| 7 | +#include <openssl/bio.h> |
| 8 | +#include <openssl/err.h> |
| 9 | +#include <openssl/pem.h> |
| 10 | +#include <openssl/pkcs7.h> |
| 11 | +#include <openssl/rsa.h> |
| 12 | +#include <openssl/x509.h> |
| 13 | + |
| 14 | +static const char kCert[] = R"( |
| 15 | +-----BEGIN CERTIFICATE----- |
| 16 | +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 |
| 45 | +-----END CERTIFICATE----- |
| 46 | +)"; |
| 47 | + |
| 48 | +class SharedData { |
| 49 | +public: |
| 50 | + X509_STORE *store = nullptr; |
| 51 | + STACK_OF(X509) *certs = nullptr; |
| 52 | + |
| 53 | + SharedData() { |
| 54 | + X509 *cert = nullptr; |
| 55 | + { |
| 56 | + BIO *cert_bio = BIO_new_mem_buf(const_cast<char *>(kCert), sizeof(kCert) - 1); |
| 57 | + cert = PEM_read_bio_X509(cert_bio, nullptr, nullptr, nullptr); |
| 58 | + BIO_free(cert_bio); |
| 59 | + } |
| 60 | + store = X509_STORE_new(); |
| 61 | + if (!store) { |
| 62 | + abort(); |
| 63 | + } |
| 64 | + if (!X509_STORE_add_cert(store, cert)) { |
| 65 | + abort(); |
| 66 | + } |
| 67 | + certs = sk_X509_new_null(); |
| 68 | + if (!sk_X509_unshift(certs, cert)) { |
| 69 | + abort(); |
| 70 | + } |
| 71 | + X509_free(cert); |
| 72 | + } |
| 73 | + |
| 74 | + ~SharedData() { |
| 75 | + X509_STORE_free(store); |
| 76 | + sk_X509_free(certs); |
| 77 | + } |
| 78 | +}; |
| 79 | + |
| 80 | +static SharedData sharedData; |
| 81 | + |
| 82 | +OPENSSL_BEGIN_ALLOW_DEPRECATED |
| 83 | +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len) { |
| 84 | + BIO* data_bio = nullptr; |
| 85 | + |
| 86 | + PKCS7 *pkcs7 = d2i_PKCS7(nullptr, &buf, len); |
| 87 | + if (!pkcs7) { |
| 88 | + goto end; |
| 89 | + } |
| 90 | + |
| 91 | + static const char kSignedData[] = "signed data"; |
| 92 | + data_bio = BIO_new_mem_buf(kSignedData, strlen(kSignedData)); |
| 93 | + if (!data_bio) { |
| 94 | + goto end; |
| 95 | + } |
| 96 | + |
| 97 | + PKCS7_verify(pkcs7, sharedData.certs, sharedData.store, data_bio, nullptr, 0); |
| 98 | + |
| 99 | +end: |
| 100 | + BIO_free(data_bio); |
| 101 | + PKCS7_free(pkcs7); |
| 102 | + return 0; |
| 103 | +} |
| 104 | +OPENSSL_END_ALLOW_DEPRECATED |
0 commit comments