X-Git-Url: https://git.openssl.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=fuzz%2Fasn1.c;h=c45fd7932832fb8c1ee9c39f699c881cc5dc64b6;hb=b3c42fc2503a685a9e51427c1a83c8f09487389d;hp=5125f363ffc0172810c7c50348c5cd3b0bf1fe7f;hpb=68e71e9d000b72d964eb8b4106a1d879a0da4908;p=openssl.git diff --git a/fuzz/asn1.c b/fuzz/asn1.c index 5125f363ff..c45fd79328 100644 --- a/fuzz/asn1.c +++ b/fuzz/asn1.c @@ -27,8 +27,15 @@ #include #include #include +#include +#include #include "fuzzer.h" +#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION +extern int rand_predictable; +#endif +#define ENTROPY_NEEDED 32 + static ASN1_ITEM_EXP *item_type[] = { ASN1_ITEM_ref(ACCESS_DESCRIPTION), #ifndef OPENSSL_NO_RFC3779 @@ -99,7 +106,9 @@ static ASN1_ITEM_EXP *item_type[] = { ASN1_ITEM_ref(IPAddressRange), #endif ASN1_ITEM_ref(ISSUING_DIST_POINT), +#if OPENSSL_API_COMPAT < 0x10200000L ASN1_ITEM_ref(LONG), +#endif ASN1_ITEM_ref(NAME_CONSTRAINTS), ASN1_ITEM_ref(NETSCAPE_CERT_SEQUENCE), ASN1_ITEM_ref(NETSCAPE_SPKAC), @@ -179,25 +188,49 @@ static ASN1_ITEM_EXP *item_type[] = { ASN1_ITEM_ref(X509_REVOKED), ASN1_ITEM_ref(X509_SIG), ASN1_ITEM_ref(X509_VAL), +#if OPENSSL_API_COMPAT < 0x10200000L ASN1_ITEM_ref(ZLONG), +#endif + ASN1_ITEM_ref(INT32), + ASN1_ITEM_ref(ZINT32), + ASN1_ITEM_ref(UINT32), + ASN1_ITEM_ref(ZUINT32), + ASN1_ITEM_ref(INT64), + ASN1_ITEM_ref(ZINT64), + ASN1_ITEM_ref(UINT64), + ASN1_ITEM_ref(ZUINT64), NULL }; -int FuzzerInitialize(int *argc, char ***argv) { - return 1; -} - -int FuzzerTestOneInput(const uint8_t *buf, size_t len) { - int n; - - ASN1_PCTX *pctx = ASN1_PCTX_new(); +static ASN1_PCTX *pctx; +int FuzzerInitialize(int *argc, char ***argv) +{ + pctx = ASN1_PCTX_new(); ASN1_PCTX_set_flags(pctx, ASN1_PCTX_FLAGS_SHOW_ABSENT | ASN1_PCTX_FLAGS_SHOW_SEQUENCE | ASN1_PCTX_FLAGS_SHOW_SSOF | ASN1_PCTX_FLAGS_SHOW_TYPE | ASN1_PCTX_FLAGS_SHOW_FIELD_STRUCT_NAME); ASN1_PCTX_set_str_flags(pctx, ASN1_STRFLGS_UTF8_CONVERT | ASN1_STRFLGS_SHOW_TYPE | ASN1_STRFLGS_DUMP_ALL); + OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL); + ERR_get_state(); + CRYPTO_free_ex_index(0, -1); + RAND_add("", 1, ENTROPY_NEEDED); + RAND_status(); + +#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + rand_predictable = 1; +#endif + + return 1; +} + +int FuzzerTestOneInput(const uint8_t *buf, size_t len) +{ + int n; + + for (n = 0; item_type[n] != NULL; ++n) { const uint8_t *b = buf; unsigned char *der = NULL; @@ -216,7 +249,12 @@ int FuzzerTestOneInput(const uint8_t *buf, size_t len) { } } - ASN1_PCTX_free(pctx); + ERR_clear_error(); return 0; } + +void FuzzerCleanup(void) +{ + ASN1_PCTX_free(pctx); +}