blob: 6581dcb1e698feaa7c1dca487a46195c0ff1a13a [file] [log] [blame]
Philippe Antoine72333522018-05-03 16:40:24 +02001#include <string.h>
2#include <stdlib.h>
Philippe Antoine72333522018-05-03 16:40:24 +02003#include <stdint.h>
Philippe Antoine08633822019-06-04 14:03:06 +02004#include "common.h"
Philippe Antoine72333522018-05-03 16:40:24 +02005#include "mbedtls/ssl.h"
6#if defined(MBEDTLS_SSL_PROTO_DTLS)
7#include "mbedtls/entropy.h"
8#include "mbedtls/ctr_drbg.h"
Philippe Antoine72333522018-05-03 16:40:24 +02009#include "mbedtls/timing.h"
Mateusz Starzyk1aec6462021-02-08 15:34:42 +010010#include "test/certs.h"
Philippe Antoine72333522018-05-03 16:40:24 +020011
Manuel Pégourié-Gonnarda89040c2020-05-20 10:35:01 +020012#if defined(MBEDTLS_SSL_CLI_C) && \
13 defined(MBEDTLS_ENTROPY_C) && \
14 defined(MBEDTLS_CTR_DRBG_C) && \
15 defined(MBEDTLS_TIMING_C)
Philippe Antoine42a2ce82019-07-10 14:26:31 +020016static int initialized = 0;
Philippe Antoinedaab28a2019-06-28 12:31:23 +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;
19#endif
20
Philippe Antoine72333522018-05-03 16:40:24 +020021const char *pers = "fuzz_dtlsclient";
Manuel Pégourié-Gonnarda89040c2020-05-20 10:35:01 +020022#endif
Philippe Antoineadc23e62019-06-25 21:53:12 +020023#endif // MBEDTLS_SSL_PROTO_DTLS
Philippe Antoine72333522018-05-03 16:40:24 +020024
25
26
Gilles Peskine449bd832023-01-11 14:50:10 +010027int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
28{
Manuel Pégourié-Gonnarda89040c2020-05-20 10:35:01 +020029#if defined(MBEDTLS_SSL_PROTO_DTLS) && \
30 defined(MBEDTLS_SSL_CLI_C) && \
31 defined(MBEDTLS_ENTROPY_C) && \
32 defined(MBEDTLS_CTR_DRBG_C) && \
33 defined(MBEDTLS_TIMING_C)
Philippe Antoine72333522018-05-03 16:40:24 +020034 int ret;
35 size_t len;
36 mbedtls_ssl_context ssl;
37 mbedtls_ssl_config conf;
38 mbedtls_ctr_drbg_context ctr_drbg;
39 mbedtls_entropy_context entropy;
40 mbedtls_timing_delay_context timer;
41 unsigned char buf[4096];
42 fuzzBufferOffset_t biomemfuzz;
43
44 if (initialized == 0) {
Philippe Antoinedaab28a2019-06-28 12:31:23 +020045#if defined(MBEDTLS_X509_CRT_PARSE_C) && defined(MBEDTLS_PEM_PARSE_C)
Gilles Peskine449bd832023-01-11 14:50:10 +010046 mbedtls_x509_crt_init(&cacert);
47 if (mbedtls_x509_crt_parse(&cacert, (const unsigned char *) mbedtls_test_cas_pem,
48 mbedtls_test_cas_pem_len) != 0) {
Philippe Antoine72333522018-05-03 16:40:24 +020049 return 1;
Gilles Peskine449bd832023-01-11 14:50:10 +010050 }
Philippe Antoine72333522018-05-03 16:40:24 +020051#endif
Philippe Antoine08633822019-06-04 14:03:06 +020052 dummy_init();
53
Philippe Antoine72333522018-05-03 16:40:24 +020054 initialized = 1;
55 }
56
Gilles Peskine449bd832023-01-11 14:50:10 +010057 mbedtls_ssl_init(&ssl);
58 mbedtls_ssl_config_init(&conf);
59 mbedtls_ctr_drbg_init(&ctr_drbg);
60 mbedtls_entropy_init(&entropy);
Philippe Antoine72333522018-05-03 16:40:24 +020061
Przemek Stekiel774f9de2023-04-19 11:47:01 +020062#if defined(MBEDTLS_USE_PSA_CRYPTO)
63 psa_status_t status = psa_crypto_init();
64 if (status != PSA_SUCCESS) {
65 goto exit;
66 }
67#endif /* MBEDTLS_USE_PSA_CRYPTO */
68
Philippe Antoine2b7c9a22019-06-04 12:05:36 +020069 srand(1);
Gilles Peskine449bd832023-01-11 14:50:10 +010070 if (mbedtls_ctr_drbg_seed(&ctr_drbg, dummy_entropy, &entropy,
71 (const unsigned char *) pers, strlen(pers)) != 0) {
Philippe Antoine72333522018-05-03 16:40:24 +020072 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +010073 }
Philippe Antoine72333522018-05-03 16:40:24 +020074
Gilles Peskine449bd832023-01-11 14:50:10 +010075 if (mbedtls_ssl_config_defaults(&conf,
Philippe Antoine72333522018-05-03 16:40:24 +020076 MBEDTLS_SSL_IS_CLIENT,
77 MBEDTLS_SSL_TRANSPORT_DATAGRAM,
Gilles Peskine449bd832023-01-11 14:50:10 +010078 MBEDTLS_SSL_PRESET_DEFAULT) != 0) {
Philippe Antoine72333522018-05-03 16:40:24 +020079 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +010080 }
Philippe Antoine72333522018-05-03 16:40:24 +020081
Philippe Antoinedaab28a2019-06-28 12:31:23 +020082#if defined(MBEDTLS_X509_CRT_PARSE_C) && defined(MBEDTLS_PEM_PARSE_C)
Gilles Peskine449bd832023-01-11 14:50:10 +010083 mbedtls_ssl_conf_ca_chain(&conf, &cacert, NULL);
Philippe Antoine72333522018-05-03 16:40:24 +020084#endif
Gilles Peskine449bd832023-01-11 14:50:10 +010085 mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_NONE);
86 mbedtls_ssl_conf_rng(&conf, dummy_random, &ctr_drbg);
Philippe Antoine72333522018-05-03 16:40:24 +020087
Gilles Peskine449bd832023-01-11 14:50:10 +010088 if (mbedtls_ssl_setup(&ssl, &conf) != 0) {
Philippe Antoine72333522018-05-03 16:40:24 +020089 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +010090 }
Philippe Antoine72333522018-05-03 16:40:24 +020091
Gilles Peskine449bd832023-01-11 14:50:10 +010092 mbedtls_ssl_set_timer_cb(&ssl, &timer, mbedtls_timing_set_delay,
93 mbedtls_timing_get_delay);
Philippe Antoine72333522018-05-03 16:40:24 +020094
Philippe Antoinedaab28a2019-06-28 12:31:23 +020095#if defined(MBEDTLS_X509_CRT_PARSE_C) && defined(MBEDTLS_PEM_PARSE_C)
Gilles Peskine449bd832023-01-11 14:50:10 +010096 if (mbedtls_ssl_set_hostname(&ssl, "localhost") != 0) {
Philippe Antoine72333522018-05-03 16:40:24 +020097 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +010098 }
Philippe Antoine72333522018-05-03 16:40:24 +020099#endif
100
101 biomemfuzz.Data = Data;
102 biomemfuzz.Size = Size;
103 biomemfuzz.Offset = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100104 mbedtls_ssl_set_bio(&ssl, &biomemfuzz, dummy_send, fuzz_recv, fuzz_recv_timeout);
Philippe Antoine72333522018-05-03 16:40:24 +0200105
Gilles Peskine449bd832023-01-11 14:50:10 +0100106 ret = mbedtls_ssl_handshake(&ssl);
107 if (ret == 0) {
Philippe Antoine72333522018-05-03 16:40:24 +0200108 //keep reading data from server until the end
Gilles Peskine449bd832023-01-11 14:50:10 +0100109 do {
110 len = sizeof(buf) - 1;
111 ret = mbedtls_ssl_read(&ssl, buf, len);
Philippe Antoine72333522018-05-03 16:40:24 +0200112
Gilles Peskine449bd832023-01-11 14:50:10 +0100113 if (ret == MBEDTLS_ERR_SSL_WANT_READ) {
Philippe Antoine72333522018-05-03 16:40:24 +0200114 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +0100115 } else if (ret <= 0) {
Philippe Antoine72333522018-05-03 16:40:24 +0200116 //EOF or error
117 break;
Gilles Peskine449bd832023-01-11 14:50:10 +0100118 }
119 } while (1);
Philippe Antoine72333522018-05-03 16:40:24 +0200120 }
121
122exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100123 mbedtls_entropy_free(&entropy);
124 mbedtls_ctr_drbg_free(&ctr_drbg);
125 mbedtls_ssl_config_free(&conf);
126 mbedtls_ssl_free(&ssl);
Przemek Stekiel758aef62023-04-19 13:47:43 +0200127#if defined(MBEDTLS_USE_PSA_CRYPTO)
Przemek Stekiel774f9de2023-04-19 11:47:01 +0200128 mbedtls_psa_crypto_free();
Przemek Stekiel758aef62023-04-19 13:47:43 +0200129#endif /* MBEDTLS_USE_PSA_CRYPTO */
Philippe Antoine72333522018-05-03 16:40:24 +0200130
131#else
132 (void) Data;
133 (void) Size;
134#endif
135 return 0;
136}