blob: b9153deb76b36a6e1b5ce34428b1a7972cab9a62 [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 "mbedtls/ssl.h"
4#include "mbedtls/entropy.h"
5#include "mbedtls/ctr_drbg.h"
Philippe Antoine72333522018-05-03 16:40:24 +02006#include "mbedtls/ssl_ticket.h"
Mateusz Starzyk1aec6462021-02-08 15:34:42 +01007#include "test/certs.h"
Philippe Antoine08633822019-06-04 14:03:06 +02008#include "common.h"
Philippe Antoine72333522018-05-03 16:40:24 +02009#include <string.h>
10#include <stdlib.h>
Philippe Antoine72333522018-05-03 16:40:24 +020011#include <stdint.h>
12
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020013#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_ENTROPY_C) && \
Manuel Pégourié-Gonnarda89040c2020-05-20 10:35:01 +020014 defined(MBEDTLS_CTR_DRBG_C)
Philippe Antoine72333522018-05-03 16:40:24 +020015const char *pers = "fuzz_server";
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 srvcert;
19static mbedtls_pk_context pkey;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020020# endif
Philippe Antoine72333522018-05-03 16:40:24 +020021const char *alpn_list[3];
22
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020023# if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
24const unsigned char psk[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
25 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
Philippe Antoine72333522018-05-03 16:40:24 +020026const char psk_id[] = "Client_identity";
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020027# endif
Manuel Pégourié-Gonnarda89040c2020-05-20 10:35:01 +020028#endif // MBEDTLS_SSL_SRV_C && MBEDTLS_ENTROPY_C && MBEDTLS_CTR_DRBG_C
Philippe Antoine72333522018-05-03 16:40:24 +020029
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020030int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
31{
32#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_ENTROPY_C) && \
Manuel Pégourié-Gonnarda89040c2020-05-20 10:35:01 +020033 defined(MBEDTLS_CTR_DRBG_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;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020040# if defined(MBEDTLS_SSL_SESSION_TICKETS)
Philippe Antoine72333522018-05-03 16:40:24 +020041 mbedtls_ssl_ticket_context ticket_ctx;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020042# endif
Philippe Antoine72333522018-05-03 16:40:24 +020043 unsigned char buf[4096];
44 fuzzBufferOffset_t biomemfuzz;
45 uint8_t options;
46
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020047 // we take 1 byte as options input
Philippe Antoine72333522018-05-03 16:40:24 +020048 if (Size < 1) {
49 return 0;
50 }
51 options = Data[Size - 1];
52
53 if (initialized == 0) {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020054 mbedtls_ctr_drbg_init(&ctr_drbg);
55 mbedtls_entropy_init(&entropy);
Manuel Pégourié-Gonnard7f93da12021-06-16 10:20:30 +020056
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020057 if (mbedtls_ctr_drbg_seed(&ctr_drbg, dummy_entropy, &entropy,
58 (const unsigned char *)pers,
59 strlen(pers)) != 0)
Manuel Pégourié-Gonnard7f93da12021-06-16 10:20:30 +020060 return 1;
61
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020062# if defined(MBEDTLS_X509_CRT_PARSE_C) && defined(MBEDTLS_PEM_PARSE_C)
63 mbedtls_x509_crt_init(&srvcert);
64 mbedtls_pk_init(&pkey);
65 if (mbedtls_x509_crt_parse(&srvcert,
66 (const unsigned char *)mbedtls_test_srv_crt,
67 mbedtls_test_srv_crt_len) != 0)
Philippe Antoine72333522018-05-03 16:40:24 +020068 return 1;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020069 if (mbedtls_x509_crt_parse(&srvcert,
70 (const unsigned char *)mbedtls_test_cas_pem,
71 mbedtls_test_cas_pem_len) != 0)
Philippe Antoine72333522018-05-03 16:40:24 +020072 return 1;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020073 if (mbedtls_pk_parse_key(&pkey,
74 (const unsigned char *)mbedtls_test_srv_key,
Manuel Pégourié-Gonnard84dea012021-06-15 11:29:26 +020075 mbedtls_test_srv_key_len, NULL, 0,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020076 dummy_random, &ctr_drbg) != 0)
Philippe Antoine72333522018-05-03 16:40:24 +020077 return 1;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020078# endif
Philippe Antoine72333522018-05-03 16:40:24 +020079
80 alpn_list[0] = "HTTP";
81 alpn_list[1] = "fuzzalpn";
82 alpn_list[2] = NULL;
83
Philippe Antoine08633822019-06-04 14:03:06 +020084 dummy_init();
85
Philippe Antoine72333522018-05-03 16:40:24 +020086 initialized = 1;
87 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020088 mbedtls_ssl_init(&ssl);
89 mbedtls_ssl_config_init(&conf);
90# if defined(MBEDTLS_SSL_SESSION_TICKETS)
91 mbedtls_ssl_ticket_init(&ticket_ctx);
92# endif
Philippe Antoine72333522018-05-03 16:40:24 +020093
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020094 if (mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_SERVER,
Philippe Antoine72333522018-05-03 16:40:24 +020095 MBEDTLS_SSL_TRANSPORT_STREAM,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020096 MBEDTLS_SSL_PRESET_DEFAULT) != 0)
Philippe Antoine72333522018-05-03 16:40:24 +020097 goto exit;
98
Philippe Antoine2b7c9a22019-06-04 12:05:36 +020099 srand(1);
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200100 mbedtls_ssl_conf_rng(&conf, dummy_random, &ctr_drbg);
Philippe Antoine72333522018-05-03 16:40:24 +0200101
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200102# if defined(MBEDTLS_X509_CRT_PARSE_C) && defined(MBEDTLS_PEM_PARSE_C)
103 mbedtls_ssl_conf_ca_chain(&conf, srvcert.next, NULL);
104 if (mbedtls_ssl_conf_own_cert(&conf, &srvcert, &pkey) != 0)
Philippe Antoine72333522018-05-03 16:40:24 +0200105 goto exit;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200106# endif
Philippe Antoine72333522018-05-03 16:40:24 +0200107
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200108 mbedtls_ssl_conf_cert_req_ca_list(
109 &conf, (options & 0x1) ? MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED :
110 MBEDTLS_SSL_CERT_REQ_CA_LIST_DISABLED);
111# if defined(MBEDTLS_SSL_ALPN)
Philippe Antoine72333522018-05-03 16:40:24 +0200112 if (options & 0x2) {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200113 mbedtls_ssl_conf_alpn_protocols(&conf, alpn_list);
Philippe Antoine72333522018-05-03 16:40:24 +0200114 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200115# endif
116# if defined(MBEDTLS_SSL_SESSION_TICKETS)
117 if (options & 0x4) {
118 if (mbedtls_ssl_ticket_setup(&ticket_ctx, dummy_random, &ctr_drbg,
119 MBEDTLS_CIPHER_AES_256_GCM, 86400) != 0)
Philippe Antoine72333522018-05-03 16:40:24 +0200120 goto exit;
121
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200122 mbedtls_ssl_conf_session_tickets_cb(&conf, mbedtls_ssl_ticket_write,
Philippe Antoine72333522018-05-03 16:40:24 +0200123 mbedtls_ssl_ticket_parse,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200124 &ticket_ctx);
Philippe Antoine72333522018-05-03 16:40:24 +0200125 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200126# endif
127# if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
128 mbedtls_ssl_conf_extended_master_secret(
129 &conf, (options & 0x10) ? MBEDTLS_SSL_EXTENDED_MS_DISABLED :
130 MBEDTLS_SSL_EXTENDED_MS_ENABLED);
131# endif
132# if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
133 mbedtls_ssl_conf_encrypt_then_mac(&conf, (options & 0x20) ?
134 MBEDTLS_SSL_ETM_ENABLED :
135 MBEDTLS_SSL_ETM_DISABLED);
136# endif
137# if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Philippe Antoine72333522018-05-03 16:40:24 +0200138 if (options & 0x40) {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200139 mbedtls_ssl_conf_psk(&conf, psk, sizeof(psk),
140 (const unsigned char *)psk_id, sizeof(psk_id) - 1);
Philippe Antoine72333522018-05-03 16:40:24 +0200141 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200142# endif
143# if defined(MBEDTLS_SSL_RENEGOTIATION)
144 mbedtls_ssl_conf_renegotiation(
145 &conf, (options & 0x80) ? MBEDTLS_SSL_RENEGOTIATION_ENABLED :
146 MBEDTLS_SSL_RENEGOTIATION_DISABLED);
147# endif
Philippe Antoine72333522018-05-03 16:40:24 +0200148
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200149 if (mbedtls_ssl_setup(&ssl, &conf) != 0)
Philippe Antoine72333522018-05-03 16:40:24 +0200150 goto exit;
151
152 biomemfuzz.Data = Data;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200153 biomemfuzz.Size = Size - 1;
Philippe Antoine72333522018-05-03 16:40:24 +0200154 biomemfuzz.Offset = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200155 mbedtls_ssl_set_bio(&ssl, &biomemfuzz, dummy_send, fuzz_recv, NULL);
Philippe Antoine72333522018-05-03 16:40:24 +0200156
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200157 mbedtls_ssl_session_reset(&ssl);
158 ret = mbedtls_ssl_handshake(&ssl);
159 if (ret == 0) {
160 // keep reading data from server until the end
161 do {
162 len = sizeof(buf) - 1;
163 ret = mbedtls_ssl_read(&ssl, buf, len);
Philippe Antoine72333522018-05-03 16:40:24 +0200164
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200165 if (ret == MBEDTLS_ERR_SSL_WANT_READ)
Philippe Antoine72333522018-05-03 16:40:24 +0200166 continue;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200167 else if (ret <= 0)
168 // EOF or error
Philippe Antoine72333522018-05-03 16:40:24 +0200169 break;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200170 } while (1);
Philippe Antoine72333522018-05-03 16:40:24 +0200171 }
172
173exit:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200174# if defined(MBEDTLS_SSL_SESSION_TICKETS)
175 mbedtls_ssl_ticket_free(&ticket_ctx);
176# endif
177 mbedtls_entropy_free(&entropy);
178 mbedtls_ctr_drbg_free(&ctr_drbg);
179 mbedtls_ssl_config_free(&conf);
180 mbedtls_ssl_free(&ssl);
Philippe Antoine72333522018-05-03 16:40:24 +0200181
Philippe Antoinec32fd242019-06-06 09:12:53 +0200182#else
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200183 (void)Data;
184 (void)Size;
Manuel Pégourié-Gonnarda89040c2020-05-20 10:35:01 +0200185#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_ENTROPY_C && MBEDTLS_CTR_DRBG_C */
Philippe Antoinec32fd242019-06-06 09:12:53 +0200186
Philippe Antoine72333522018-05-03 16:40:24 +0200187 return 0;
188}