Skip to content

Commit 035d841

Browse files
committed
Add fuzz test for PKCS7_verify
1 parent 57133c0 commit 035d841

File tree

3 files changed

+111
-0
lines changed

3 files changed

+111
-0
lines changed

crypto/pkcs7/pkcs7.c

+6
Original file line numberDiff line numberDiff line change
@@ -1590,8 +1590,11 @@ int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store,
15901590
}
15911591
// NOTE: unlike most of our functions, |X509_verify_cert| can return <= 0
15921592
if (X509_verify_cert(cert_ctx) <= 0) {
1593+
#if !defined(BORINGSSL_UNSAFE_FUZZER_MODE)
1594+
// For fuzz testing, we do not want to bail out early.
15931595
OPENSSL_PUT_ERROR(PKCS7, PKCS7_R_CERTIFICATE_VERIFY_ERROR);
15941596
goto out;
1597+
#endif
15951598
}
15961599
}
15971600

@@ -1607,8 +1610,11 @@ int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store,
16071610
PKCS7_SIGNER_INFO *si = sk_PKCS7_SIGNER_INFO_value(sinfos, ii);
16081611
X509 *signer = sk_X509_value(signers, ii);
16091612
if (!pkcs7_signature_verify(p7bio, p7, si, signer)) {
1613+
#if !defined(BORINGSSL_UNSAFE_FUZZER_MODE)
1614+
// For fuzz testing, we do not want to bail out early.
16101615
OPENSSL_PUT_ERROR(PKCS7, PKCS7_R_SIGNATURE_FAILURE);
16111616
goto out;
1617+
#endif
16121618
}
16131619
}
16141620

fuzz/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ fuzzer(ocsp)
2929
fuzzer(ocsp_http)
3030
fuzzer(ocsp_parse_url)
3131
fuzzer(pkcs12)
32+
fuzzer(pkcs7_verify)
3233
fuzzer(pkcs8)
3334
fuzzer(pkcs8_v2)
3435
fuzzer(privkey)

fuzz/pkcs7_verify.cc

+104
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
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+
MIIFazCCA1OgAwIBAgIURVkPzF/4dwy7419Qk75uhIuyf0EwDQYJKoZIhvcNAQEL
17+
BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
18+
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMTA5MjExOTIyMTJaFw0yMjA5
19+
MjExOTIyMTJaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
20+
HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggIiMA0GCSqGSIb3DQEB
21+
AQUAA4ICDwAwggIKAoICAQC1+MOn+BopcEVR4QMvjXdAxGkWFllXyQFDToL+qOiP
22+
RU1yN7C8KCtkbOAFttJIO4O/i0iZ7KqYbnmB6YUA/ONAcakocnrdoESgRJcVMeAx
23+
Dk/11OtMF5yIfeOOO/TUeVNmAUaT63gFbKy/adpqhzJtOv9BBl5VcYNGGSE+0wtb
24+
mjpmNsxunEQR1KLDc97fGYHeRfKoSyrCIEE8IaAEpKGR2Sku3v9Jwh7RpjupgiUA
25+
kH6pJk7VMZm5vl2wFjYvfysgjeN5ZtsxFDMaPYZStpxMxpNd5C9DsO2Ljp5NMpGf
26+
NGmG4ZqiaQg8z2cIM6ESmN1zDJdUh5IXed1fOxBZD/poUFH0wDRFWnvzlaPmjJEF
27+
rYLMK8svnE5nEQp9vu93ISFBx7cofs+niMaUXPEqaRSqruifN2M1it3kOf/8YZl1
28+
vurs+VtHD6nOJo6bd11+37aBidIB/BaWnzLrDmSTcPFa1tkTHwoLqc9+jThTq9jZ
29+
6w3lAMPpsoenyD19UmQB589+4kNp2SIO/TtzVQCGgQPXE2jDCl6G9aIPMkfvpPZK
30+
4THVil3WQRCFYnYdDO4HQXo2ZuC4RiqgY5ygfeoL+fa9k383lgxxAHQLS7xsbaVB
31+
40RmfdbdevgPYIwZNNO78ddRmMdSv6IknSW9gydGzY//btY+t1SWcBZWzn1Ewq8g
32+
2QIDAQABo1MwUTAdBgNVHQ4EFgQUotZD9ajEvnQYVezIWzcW4pzvMcUwHwYDVR0j
33+
BBgwFoAUotZD9ajEvnQYVezIWzcW4pzvMcUwDwYDVR0TAQH/BAUwAwEB/zANBgkq
34+
hkiG9w0BAQsFAAOCAgEAqCe42PIWoyLDx9bR+5cSp99N5xo5lLiSLtWx2emDbZB2
35+
AunqKYeEgIV+TWNF2w1SZ/ckFgV7SlL2Yl73N/veSNRfNAnpjLksGDFpdJb7YXrx
36+
cUvxdy1mr8oau6J7PC9JGjBTBrnhqwCQX1FtcAxODKll2Lsfuj6+bdC3rCK7KBEo
37+
ENamMJZIeo8lRP9qFF2xwCEzZjRv2zvB6O5o9045aTUcdCrwUfKE2sqY6EXRzFTC
38+
waK0HRCd1FLv9omhz/Ug5PMHP4d6MZfnAbFm+AzAhnpkrk/9TJYSOoNTNLWsuqhp
39+
dN0rKqiFWv1zIwfknXvTh1P1Ap+G5jffAca0zWUH1oKjE7ZZioSsaZ6gySnD8+WQ
40+
TPbOYtG+n0mhCH1TrU8Dqi3rd8g5IbC8loYLRH94QtodOnevD4Qo9Orfrsr8hGOW
41+
ABespanZArhoQ03DAtpNhtHm2NWJQF2uHNqcTrkq0omqZBTbMD1GKMBujoNooAUu
42+
w51U9r+RycPJTFqEGHb0nd7EjoyXEXtuX1Ld5fTZjQ9SszmQKQ8w3lHqRGNlkSiO
43+
e3IOOq2ruXmq1jykxpmi82IcTRUE8TZBfL/yz0nxpHKAYC1VwMezrkgZDGz4npxf
44+
1z2+qd58xU6/jsf7/+3xdPFubeEJujdbCkWQsQC5Rzm48zDWGq/pyzFji44K3TA=
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

Comments
 (0)