blob: 780cfa330aa9d4a7663a70ca8b28ba1b8c05e9ce [file] [log] [blame]
Mateusz Starzyk6c2e9b62021-05-19 17:54:54 +02001#define MBEDTLS_ALLOW_PRIVATE_ACCESS
2
Philippe Antoine72333522018-05-03 16:40:24 +02003#include <string.h>
4#include <stdlib.h>
Philippe Antoine72333522018-05-03 16:40:24 +02005#include <stdint.h>
Philippe Antoine08633822019-06-04 14:03:06 +02006#include "common.h"
Philippe Antoine72333522018-05-03 16:40:24 +02007#include "mbedtls/ssl.h"
8#if defined(MBEDTLS_SSL_PROTO_DTLS)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02009# include "mbedtls/entropy.h"
10# include "mbedtls/ctr_drbg.h"
11# include "mbedtls/timing.h"
12# include "test/certs.h"
Philippe Antoine72333522018-05-03 16:40:24 +020013
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020014# if defined(MBEDTLS_SSL_CLI_C) && defined(MBEDTLS_ENTROPY_C) && \
15 defined(MBEDTLS_CTR_DRBG_C) && defined(MBEDTLS_TIMING_C)
Philippe Antoine42a2ce82019-07-10 14:26:31 +020016static int initialized = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020017# if defined(MBEDTLS_X509_CRT_PARSE_C) && defined(MBEDTLS_PEM_PARSE_C)
Philippe Antoine72333522018-05-03 16:40:24 +020018static mbedtls_x509_crt cacert;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020019# endif
Philippe Antoine72333522018-05-03 16:40:24 +020020
Philippe Antoine72333522018-05-03 16:40:24 +020021const char *pers = "fuzz_dtlsclient";
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020022# endif
Philippe Antoineadc23e62019-06-25 21:53:12 +020023#endif // MBEDTLS_SSL_PROTO_DTLS
Philippe Antoine72333522018-05-03 16:40:24 +020024
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020025int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
26{
27#if defined(MBEDTLS_SSL_PROTO_DTLS) && defined(MBEDTLS_SSL_CLI_C) && \
28 defined(MBEDTLS_ENTROPY_C) && defined(MBEDTLS_CTR_DRBG_C) && \
Manuel Pégourié-Gonnarda89040c2020-05-20 10:35:01 +020029 defined(MBEDTLS_TIMING_C)
Philippe Antoine72333522018-05-03 16:40:24 +020030 int ret;
31 size_t len;
32 mbedtls_ssl_context ssl;
33 mbedtls_ssl_config conf;
34 mbedtls_ctr_drbg_context ctr_drbg;
35 mbedtls_entropy_context entropy;
36 mbedtls_timing_delay_context timer;
37 unsigned char buf[4096];
38 fuzzBufferOffset_t biomemfuzz;
39
40 if (initialized == 0) {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020041# if defined(MBEDTLS_X509_CRT_PARSE_C) && defined(MBEDTLS_PEM_PARSE_C)
42 mbedtls_x509_crt_init(&cacert);
43 if (mbedtls_x509_crt_parse(&cacert,
44 (const unsigned char *)mbedtls_test_cas_pem,
45 mbedtls_test_cas_pem_len) != 0)
Philippe Antoine72333522018-05-03 16:40:24 +020046 return 1;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020047# endif
Philippe Antoine08633822019-06-04 14:03:06 +020048 dummy_init();
49
Philippe Antoine72333522018-05-03 16:40:24 +020050 initialized = 1;
51 }
52
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020053 mbedtls_ssl_init(&ssl);
54 mbedtls_ssl_config_init(&conf);
55 mbedtls_ctr_drbg_init(&ctr_drbg);
56 mbedtls_entropy_init(&entropy);
Philippe Antoine72333522018-05-03 16:40:24 +020057
Philippe Antoine2b7c9a22019-06-04 12:05:36 +020058 srand(1);
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020059 if (mbedtls_ctr_drbg_seed(&ctr_drbg, dummy_entropy, &entropy,
60 (const unsigned char *)pers, strlen(pers)) != 0)
Philippe Antoine72333522018-05-03 16:40:24 +020061 goto exit;
62
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020063 if (mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_CLIENT,
Philippe Antoine72333522018-05-03 16:40:24 +020064 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020065 MBEDTLS_SSL_PRESET_DEFAULT) != 0)
Philippe Antoine72333522018-05-03 16:40:24 +020066 goto exit;
67
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020068# if defined(MBEDTLS_X509_CRT_PARSE_C) && defined(MBEDTLS_PEM_PARSE_C)
69 mbedtls_ssl_conf_ca_chain(&conf, &cacert, NULL);
70# endif
71 mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_NONE);
72 mbedtls_ssl_conf_rng(&conf, dummy_random, &ctr_drbg);
Philippe Antoine72333522018-05-03 16:40:24 +020073
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020074 if (mbedtls_ssl_setup(&ssl, &conf) != 0)
Philippe Antoine72333522018-05-03 16:40:24 +020075 goto exit;
76
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020077 mbedtls_ssl_set_timer_cb(&ssl, &timer, mbedtls_timing_set_delay,
78 mbedtls_timing_get_delay);
Philippe Antoine72333522018-05-03 16:40:24 +020079
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020080# if defined(MBEDTLS_X509_CRT_PARSE_C) && defined(MBEDTLS_PEM_PARSE_C)
81 if (mbedtls_ssl_set_hostname(&ssl, "localhost") != 0)
Philippe Antoine72333522018-05-03 16:40:24 +020082 goto exit;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020083# endif
Philippe Antoine72333522018-05-03 16:40:24 +020084
85 biomemfuzz.Data = Data;
86 biomemfuzz.Size = Size;
87 biomemfuzz.Offset = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020088 mbedtls_ssl_set_bio(&ssl, &biomemfuzz, dummy_send, fuzz_recv,
89 fuzz_recv_timeout);
Philippe Antoine72333522018-05-03 16:40:24 +020090
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020091 ret = mbedtls_ssl_handshake(&ssl);
92 if (ret == 0) {
93 // keep reading data from server until the end
94 do {
95 len = sizeof(buf) - 1;
96 ret = mbedtls_ssl_read(&ssl, buf, len);
Philippe Antoine72333522018-05-03 16:40:24 +020097
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020098 if (ret == MBEDTLS_ERR_SSL_WANT_READ)
Philippe Antoine72333522018-05-03 16:40:24 +020099 continue;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200100 else if (ret <= 0)
101 // EOF or error
Philippe Antoine72333522018-05-03 16:40:24 +0200102 break;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200103 } while (1);
Philippe Antoine72333522018-05-03 16:40:24 +0200104 }
105
106exit:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200107 mbedtls_entropy_free(&entropy);
108 mbedtls_ctr_drbg_free(&ctr_drbg);
109 mbedtls_ssl_config_free(&conf);
110 mbedtls_ssl_free(&ssl);
Philippe Antoine72333522018-05-03 16:40:24 +0200111
112#else
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200113 (void)Data;
114 (void)Size;
Philippe Antoine72333522018-05-03 16:40:24 +0200115#endif
116 return 0;
117}