Coverage Report

Created: 2025-03-09 06:52

/src/libressl.fuzzers/asn1.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the Apache License 2.0 (the "License");
5
 * you may not use this file except in compliance with the License.
6
 * You may obtain a copy of the License at
7
 * https://www.openssl.org/source/license.html
8
 * or in the file LICENSE in the source distribution.
9
 */
10
11
/*
12
 * Fuzz ASN.1 parsing for various data structures. Specify which on the
13
 * command line:
14
 *
15
 * asn1 <data structure>
16
 */
17
18
#include <stdio.h>
19
#include <string.h>
20
#include <openssl/asn1.h>
21
#include <openssl/asn1t.h>
22
#include <openssl/dh.h>
23
#include <openssl/ec.h>
24
#include <openssl/ocsp.h>
25
#include <openssl/pkcs12.h>
26
#include <openssl/rsa.h>
27
#include <openssl/ts.h>
28
#include <openssl/x509v3.h>
29
#include <openssl/err.h>
30
#include <openssl/rand.h>
31
#include <openssl/bio.h>
32
#include <openssl/evp.h>
33
#include <openssl/ssl.h>
34
#include "fuzzer.h"
35
36
#include "rand.inc"
37
38
static ASN1_ITEM_EXP *item_type[] = {
39
    ASN1_ITEM_ref(ACCESS_DESCRIPTION),
40
#ifndef OPENSSL_NO_RFC3779
41
    ASN1_ITEM_ref(ASIdentifierChoice),
42
    ASN1_ITEM_ref(ASIdentifiers),
43
    ASN1_ITEM_ref(ASIdOrRange),
44
#endif
45
    ASN1_ITEM_ref(ASN1_ANY),
46
    ASN1_ITEM_ref(ASN1_BIT_STRING),
47
    ASN1_ITEM_ref(ASN1_BMPSTRING),
48
    ASN1_ITEM_ref(ASN1_BOOLEAN),
49
    ASN1_ITEM_ref(ASN1_ENUMERATED),
50
    ASN1_ITEM_ref(ASN1_FBOOLEAN),
51
    ASN1_ITEM_ref(ASN1_GENERALIZEDTIME),
52
    ASN1_ITEM_ref(ASN1_GENERALSTRING),
53
    ASN1_ITEM_ref(ASN1_IA5STRING),
54
    ASN1_ITEM_ref(ASN1_INTEGER),
55
    ASN1_ITEM_ref(ASN1_NULL),
56
    ASN1_ITEM_ref(ASN1_OBJECT),
57
    ASN1_ITEM_ref(ASN1_OCTET_STRING),
58
    ASN1_ITEM_ref(ASN1_OCTET_STRING_NDEF),
59
    ASN1_ITEM_ref(ASN1_PRINTABLE),
60
    ASN1_ITEM_ref(ASN1_PRINTABLESTRING),
61
    ASN1_ITEM_ref(ASN1_SEQUENCE),
62
    ASN1_ITEM_ref(ASN1_SEQUENCE_ANY),
63
    ASN1_ITEM_ref(ASN1_SET_ANY),
64
    ASN1_ITEM_ref(ASN1_T61STRING),
65
    ASN1_ITEM_ref(ASN1_TBOOLEAN),
66
    ASN1_ITEM_ref(ASN1_TIME),
67
    ASN1_ITEM_ref(ASN1_UNIVERSALSTRING),
68
    ASN1_ITEM_ref(ASN1_UTCTIME),
69
    ASN1_ITEM_ref(ASN1_UTF8STRING),
70
    ASN1_ITEM_ref(ASN1_VISIBLESTRING),
71
#ifndef OPENSSL_NO_RFC3779
72
    ASN1_ITEM_ref(ASRange),
73
#endif
74
    ASN1_ITEM_ref(AUTHORITY_INFO_ACCESS),
75
    ASN1_ITEM_ref(AUTHORITY_KEYID),
76
    ASN1_ITEM_ref(BASIC_CONSTRAINTS),
77
    ASN1_ITEM_ref(BIGNUM),
78
    ASN1_ITEM_ref(CBIGNUM),
79
    ASN1_ITEM_ref(CERTIFICATEPOLICIES),
80
/*
81
#ifndef OPENSSL_NO_CMS
82
    ASN1_ITEM_ref(CMS_ContentInfo),
83
    ASN1_ITEM_ref(CMS_ReceiptRequest),
84
    ASN1_ITEM_ref(CRL_DIST_POINTS),
85
#endif
86
*/
87
    ASN1_ITEM_ref(DIRECTORYSTRING),
88
    ASN1_ITEM_ref(DISPLAYTEXT),
89
    ASN1_ITEM_ref(DIST_POINT),
90
    ASN1_ITEM_ref(DIST_POINT_NAME),
91
    ASN1_ITEM_ref(EDIPARTYNAME),
92
    ASN1_ITEM_ref(EXTENDED_KEY_USAGE),
93
    ASN1_ITEM_ref(GENERAL_NAME),
94
    ASN1_ITEM_ref(GENERAL_NAMES),
95
    ASN1_ITEM_ref(GENERAL_SUBTREE),
96
#ifndef OPENSSL_NO_RFC3779
97
    ASN1_ITEM_ref(IPAddressChoice),
98
    ASN1_ITEM_ref(IPAddressFamily),
99
    ASN1_ITEM_ref(IPAddressOrRange),
100
    ASN1_ITEM_ref(IPAddressRange),
101
#endif
102
    ASN1_ITEM_ref(ISSUING_DIST_POINT),
103
#if !OPENSSL_API_3
104
    ASN1_ITEM_ref(LONG),
105
#endif
106
    ASN1_ITEM_ref(NAME_CONSTRAINTS),
107
    ASN1_ITEM_ref(NETSCAPE_SPKAC),
108
    ASN1_ITEM_ref(NETSCAPE_SPKI),
109
    ASN1_ITEM_ref(NOTICEREF),
110
#ifndef OPENSSL_NO_OCSP
111
    ASN1_ITEM_ref(OCSP_BASICRESP),
112
    ASN1_ITEM_ref(OCSP_CERTID),
113
    ASN1_ITEM_ref(OCSP_CERTSTATUS),
114
    ASN1_ITEM_ref(OCSP_CRLID),
115
    ASN1_ITEM_ref(OCSP_ONEREQ),
116
    ASN1_ITEM_ref(OCSP_REQINFO),
117
    ASN1_ITEM_ref(OCSP_REQUEST),
118
    ASN1_ITEM_ref(OCSP_RESPBYTES),
119
    ASN1_ITEM_ref(OCSP_RESPDATA),
120
    ASN1_ITEM_ref(OCSP_RESPID),
121
    ASN1_ITEM_ref(OCSP_RESPONSE),
122
    ASN1_ITEM_ref(OCSP_REVOKEDINFO),
123
    ASN1_ITEM_ref(OCSP_SERVICELOC),
124
    ASN1_ITEM_ref(OCSP_SIGNATURE),
125
    ASN1_ITEM_ref(OCSP_SINGLERESP),
126
#endif
127
    ASN1_ITEM_ref(OTHERNAME),
128
    ASN1_ITEM_ref(PBEPARAM),
129
    ASN1_ITEM_ref(PKCS12),
130
    ASN1_ITEM_ref(PKCS12_SAFEBAG),
131
    ASN1_ITEM_ref(PKCS7),
132
    ASN1_ITEM_ref(PKCS7_ATTR_SIGN),
133
    ASN1_ITEM_ref(PKCS7_ATTR_VERIFY),
134
    ASN1_ITEM_ref(PKCS7_DIGEST),
135
    ASN1_ITEM_ref(PKCS7_ENC_CONTENT),
136
    ASN1_ITEM_ref(PKCS7_ENCRYPT),
137
    ASN1_ITEM_ref(PKCS7_ENVELOPE),
138
    ASN1_ITEM_ref(PKCS7_ISSUER_AND_SERIAL),
139
    ASN1_ITEM_ref(PKCS7_RECIP_INFO),
140
    ASN1_ITEM_ref(PKCS7_SIGNED),
141
    ASN1_ITEM_ref(PKCS7_SIGN_ENVELOPE),
142
    ASN1_ITEM_ref(PKCS7_SIGNER_INFO),
143
    ASN1_ITEM_ref(PKCS8_PRIV_KEY_INFO),
144
    ASN1_ITEM_ref(PKEY_USAGE_PERIOD),
145
    ASN1_ITEM_ref(POLICY_CONSTRAINTS),
146
    ASN1_ITEM_ref(POLICYINFO),
147
    ASN1_ITEM_ref(POLICY_MAPPING),
148
    ASN1_ITEM_ref(POLICY_MAPPINGS),
149
    ASN1_ITEM_ref(POLICYQUALINFO),
150
    ASN1_ITEM_ref(RSAPrivateKey),
151
    ASN1_ITEM_ref(RSA_PSS_PARAMS),
152
    ASN1_ITEM_ref(RSAPublicKey),
153
    ASN1_ITEM_ref(USERNOTICE),
154
    ASN1_ITEM_ref(X509),
155
    ASN1_ITEM_ref(X509_ALGOR),
156
    ASN1_ITEM_ref(X509_ALGORS),
157
    ASN1_ITEM_ref(X509_ATTRIBUTE),
158
    ASN1_ITEM_ref(X509_CINF),
159
    ASN1_ITEM_ref(X509_CRL),
160
    ASN1_ITEM_ref(X509_CRL_INFO),
161
    ASN1_ITEM_ref(X509_EXTENSION),
162
    ASN1_ITEM_ref(X509_EXTENSIONS),
163
    ASN1_ITEM_ref(X509_NAME),
164
    ASN1_ITEM_ref(X509_NAME_ENTRY),
165
    ASN1_ITEM_ref(X509_PUBKEY),
166
    ASN1_ITEM_ref(X509_REQ),
167
    ASN1_ITEM_ref(X509_REQ_INFO),
168
    ASN1_ITEM_ref(X509_REVOKED),
169
    ASN1_ITEM_ref(X509_SIG),
170
    ASN1_ITEM_ref(X509_VAL),
171
#if !OPENSSL_API_3
172
    ASN1_ITEM_ref(ZLONG),
173
#endif
174
    NULL
175
};
176
177
84.9k
#define DO_TEST(TYPE, D2I, I2D, PRINT) { \
178
84.9k
    const unsigned char *p = buf; \
179
84.9k
    unsigned char *der = NULL; \
180
84.9k
    TYPE *type = D2I(NULL, &p, len); \
181
84.9k
    \
182
84.9k
    if (type != NULL) { \
183
2.17k
        int len2; \
184
2.17k
        BIO *bio = BIO_new(BIO_s_null()); \
185
2.17k
        \
186
2.17k
        PRINT(bio, type); \
187
2.17k
        BIO_free(bio); \
188
2.17k
        len2 = I2D(type, &der); \
189
2.17k
        if (len2 != 0) {} \
190
2.17k
        OPENSSL_free(der); \
191
2.17k
        TYPE ## _free(type); \
192
2.17k
    } \
193
84.9k
}
194
195
53.0k
#define DO_TEST_PRINT_OFFSET(TYPE, D2I, I2D, PRINT) { \
196
53.0k
    const unsigned char *p = buf; \
197
53.0k
    unsigned char *der = NULL; \
198
53.0k
    TYPE *type = D2I(NULL, &p, len); \
199
53.0k
    \
200
53.0k
    if (type != NULL) { \
201
708
        BIO *bio = BIO_new(BIO_s_null()); \
202
708
        \
203
708
        PRINT(bio, type, 0); \
204
708
        BIO_free(bio); \
205
708
        I2D(type, &der); \
206
708
        OPENSSL_free(der); \
207
708
        TYPE ## _free(type); \
208
708
    } \
209
53.0k
}
210
211
10.6k
#define DO_TEST_PRINT_PCTX(TYPE, D2I, I2D, PRINT) { \
212
10.6k
    const unsigned char *p = buf; \
213
10.6k
    unsigned char *der = NULL; \
214
10.6k
    TYPE *type = D2I(NULL, &p, len); \
215
10.6k
    \
216
10.6k
    if (type != NULL) { \
217
178
        BIO *bio = BIO_new(BIO_s_null()); \
218
178
        \
219
178
        PRINT(bio, type, 0, NULL); \
220
178
        BIO_free(bio); \
221
178
        I2D(type, &der); \
222
178
        OPENSSL_free(der); \
223
178
        TYPE ## _free(type); \
224
178
    } \
225
10.6k
}
226
227
228
63.6k
#define DO_TEST_NO_PRINT(TYPE, D2I, I2D) { \
229
63.6k
    const unsigned char *p = buf; \
230
63.6k
    unsigned char *der = NULL; \
231
63.6k
    TYPE *type = D2I(NULL, &p, len); \
232
63.6k
    \
233
63.6k
    if (type != NULL) { \
234
826
        BIO *bio = BIO_new(BIO_s_null()); \
235
826
        \
236
826
        BIO_free(bio); \
237
826
        I2D(type, &der); \
238
826
        OPENSSL_free(der); \
239
826
        TYPE ## _free(type); \
240
826
    } \
241
63.6k
}
242
243
244
int FuzzerInitialize(int *argc, char ***argv)
245
16
{
246
16
    OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL);
247
16
    OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS, NULL);
248
16
    FuzzerSetRand();
249
250
16
    return 1;
251
16
}
252
253
int FuzzerTestOneInput(const uint8_t *buf, size_t len)
254
10.6k
{
255
10.6k
    int n;
256
257
258
1.24M
    for (n = 0; item_type[n] != NULL; ++n) {
259
1.23M
        const uint8_t *b = buf;
260
1.23M
        unsigned char *der = NULL;
261
1.23M
        const ASN1_ITEM *i = ASN1_ITEM_ptr(item_type[n]);
262
1.23M
        ASN1_VALUE *o = ASN1_item_d2i(NULL, &b, len, i);
263
264
1.23M
        if (o != NULL) {
265
37.4k
            BIO *bio = BIO_new(BIO_s_null());
266
267
37.4k
            ASN1_item_print(bio, o, 4, i, NULL);
268
37.4k
            BIO_free(bio);
269
37.4k
            ASN1_item_i2d(o, &der, i);
270
37.4k
            OPENSSL_free(der);
271
37.4k
            ASN1_item_free(o, i);
272
37.4k
        }
273
1.23M
    }
274
275
10.6k
#ifndef OPENSSL_NO_TS
276
10.6k
    DO_TEST(TS_REQ, d2i_TS_REQ, i2d_TS_REQ, TS_REQ_print_bio);
277
10.6k
    DO_TEST(TS_MSG_IMPRINT, d2i_TS_MSG_IMPRINT, i2d_TS_MSG_IMPRINT, TS_MSG_IMPRINT_print_bio);
278
10.6k
    DO_TEST(TS_RESP, d2i_TS_RESP, i2d_TS_RESP, TS_RESP_print_bio);
279
10.6k
    DO_TEST(TS_STATUS_INFO, d2i_TS_STATUS_INFO, i2d_TS_STATUS_INFO, TS_STATUS_INFO_print_bio);
280
10.6k
    DO_TEST(TS_TST_INFO, d2i_TS_TST_INFO, i2d_TS_TST_INFO, TS_TST_INFO_print_bio);
281
10.6k
    DO_TEST_NO_PRINT(TS_ACCURACY, d2i_TS_ACCURACY, i2d_TS_ACCURACY);
282
10.6k
    DO_TEST_NO_PRINT(ESS_ISSUER_SERIAL, d2i_ESS_ISSUER_SERIAL, i2d_ESS_ISSUER_SERIAL);
283
10.6k
    DO_TEST_NO_PRINT(ESS_CERT_ID, d2i_ESS_CERT_ID, i2d_ESS_CERT_ID);
284
10.6k
    DO_TEST_NO_PRINT(ESS_SIGNING_CERT, d2i_ESS_SIGNING_CERT, i2d_ESS_SIGNING_CERT);
285
10.6k
#endif
286
10.6k
#ifndef OPENSSL_NO_DSA
287
10.6k
    DO_TEST_NO_PRINT(DSA_SIG, d2i_DSA_SIG, i2d_DSA_SIG);
288
10.6k
    DO_TEST_PRINT_OFFSET(DSA, d2i_DSAPrivateKey, i2d_DSAPrivateKey, DSA_print);
289
10.6k
    DO_TEST_PRINT_OFFSET(DSA, d2i_DSAPublicKey, i2d_DSAPublicKey, DSA_print);
290
10.6k
    DO_TEST(DSA, d2i_DSAparams, i2d_DSAparams, DSAparams_print);
291
10.6k
#endif
292
10.6k
    DO_TEST_PRINT_OFFSET(RSA, d2i_RSAPublicKey, i2d_RSAPublicKey, RSA_print);
293
10.6k
#ifndef OPENSSL_NO_EC
294
10.6k
    DO_TEST_PRINT_OFFSET(EC_GROUP, d2i_ECPKParameters, i2d_ECPKParameters, ECPKParameters_print);
295
10.6k
    DO_TEST_PRINT_OFFSET(EC_KEY, d2i_ECPrivateKey, i2d_ECPrivateKey, EC_KEY_print);
296
10.6k
    DO_TEST(EC_KEY, d2i_ECParameters, i2d_ECParameters, ECParameters_print);
297
10.6k
    DO_TEST_NO_PRINT(ECDSA_SIG, d2i_ECDSA_SIG, i2d_ECDSA_SIG);
298
10.6k
#endif
299
10.6k
    DO_TEST_PRINT_PCTX(EVP_PKEY, d2i_AutoPrivateKey, i2d_PrivateKey, EVP_PKEY_print_private);
300
10.6k
    DO_TEST(SSL_SESSION, d2i_SSL_SESSION, i2d_SSL_SESSION, SSL_SESSION_print);
301
302
10.6k
    ERR_clear_error();
303
304
10.6k
    return 0;
305
10.6k
}
306
307
void FuzzerCleanup(void)
308
0
{
309
0
}