X-Git-Url: https://git.openssl.org/?a=blobdiff_plain;f=fuzz%2Fserver.c;h=3b5df9dc4215c95aef4fa03df6b6e36522723f21;hb=d69d8f904c9c558c7a9455ee816e494690d80ca8;hp=0076306db9c8c3f4f6ec8b32a75e9642f886d418;hpb=1d03b7b893223b1b049cb992e5c57c9a10f5846c;p=openssl.git diff --git a/fuzz/server.c b/fuzz/server.c index 0076306db9..3b5df9dc42 100644 --- a/fuzz/server.c +++ b/fuzz/server.c @@ -16,6 +16,7 @@ #include #include #include +#include #include "fuzzer.h" static const uint8_t kCertificateDER[] = { @@ -189,15 +190,57 @@ static const uint8_t kRSAPrivateKeyDER[] = { 0x98, 0x46, 0x89, 0x82, 0x40, }; -static SSL_CTX *ctx; +#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION +extern int rand_predictable; +#endif +#define ENTROPY_NEEDED 32 -int FuzzerInitialize(int *argc, char ***argv) { - const uint8_t *bufp = kRSAPrivateKeyDER; +/* unused, to avoid warning. */ +static int idx; + +int FuzzerInitialize(int *argc, char ***argv) +{ + STACK_OF(SSL_COMP) *comp_methods; + + OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS | OPENSSL_INIT_ASYNC, NULL); + OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS, NULL); + ERR_get_state(); + CRYPTO_free_ex_index(0, -1); + idx = SSL_get_ex_data_X509_STORE_CTX_idx(); + RAND_add("", 1, ENTROPY_NEEDED); + RAND_status(); + RSA_get_default_method(); + comp_methods = SSL_COMP_get_compression_methods(); + OPENSSL_sk_sort((OPENSSL_STACK *)comp_methods); + + +#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + rand_predictable = 1; +#endif + + return 1; +} + +int FuzzerTestOneInput(const uint8_t *buf, size_t len) +{ + SSL *server; + BIO *in; + BIO *out; + SSL_CTX *ctx; + int ret; RSA *privkey; + const uint8_t *bufp = kRSAPrivateKeyDER; EVP_PKEY *pkey; - int ret; X509 *cert; + if (len == 0) + return 0; + + /* + * TODO: use the ossltest engine (optionally?) to disable crypto checks. + */ + + /* This only fuzzes the initial flow from the client so far. */ ctx = SSL_CTX_new(SSLv23_method()); privkey = d2i_RSAPrivateKey(NULL, &bufp, sizeof(kRSAPrivateKeyDER)); OPENSSL_assert(privkey != NULL); @@ -206,6 +249,7 @@ int FuzzerInitialize(int *argc, char ***argv) { ret = SSL_CTX_use_PrivateKey(ctx, pkey); OPENSSL_assert(ret == 1); EVP_PKEY_free(pkey); + bufp = kCertificateDER; cert = d2i_X509(NULL, &bufp, sizeof(kCertificateDER)); OPENSSL_assert(cert != NULL); @@ -213,20 +257,9 @@ int FuzzerInitialize(int *argc, char ***argv) { OPENSSL_assert(ret == 1); X509_free(cert); - return 1; -} - -int FuzzerTestOneInput(const uint8_t *buf, size_t len) { - /* TODO: make this work for OpenSSL. There's a PREDICT define that may do - * the job. - * TODO: use the ossltest engine (optionally?) to disable crypto checks. - * RAND_reset_for_fuzzing(); - */ - - /* This only fuzzes the initial flow from the client so far. */ - SSL *server = SSL_new(ctx); - BIO *in = BIO_new(BIO_s_mem()); - BIO *out = BIO_new(BIO_s_mem()); + server = SSL_new(ctx); + in = BIO_new(BIO_s_mem()); + out = BIO_new(BIO_s_mem()); SSL_set_bio(server, in, out); SSL_set_accept_state(server); OPENSSL_assert((size_t)BIO_write(in, buf, len) == len); @@ -240,5 +273,12 @@ int FuzzerTestOneInput(const uint8_t *buf, size_t len) { } } SSL_free(server); + ERR_clear_error(); + SSL_CTX_free(ctx); + return 0; } + +void FuzzerCleanup(void) +{ +}