1 /*
2 * SSL client with options
3 *
4 * Copyright The Mbed TLS Contributors
5 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19
20 #define MBEDTLS_ALLOW_PRIVATE_ACCESS
21
22 #include "ssl_test_lib.h"
23
24 #if defined(MBEDTLS_SSL_TEST_IMPOSSIBLE)
main(void)25 int main(void)
26 {
27 mbedtls_printf(MBEDTLS_SSL_TEST_IMPOSSIBLE);
28 mbedtls_exit(0);
29 }
30 #elif !defined(MBEDTLS_SSL_SRV_C)
main(void)31 int main(void)
32 {
33 mbedtls_printf("MBEDTLS_SSL_SRV_C not defined.\n");
34 mbedtls_exit(0);
35 }
36 #else /* !MBEDTLS_SSL_TEST_IMPOSSIBLE && MBEDTLS_SSL_SRV_C */
37
38 #include <stdint.h>
39
40 #if !defined(_MSC_VER)
41 #include <inttypes.h>
42 #endif
43
44 #if !defined(_WIN32)
45 #include <signal.h>
46 #endif
47
48 #if defined(MBEDTLS_SSL_CACHE_C)
49 #include "mbedtls/ssl_cache.h"
50 #endif
51
52 #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_TICKET_C)
53 #include "mbedtls/ssl_ticket.h"
54 #endif
55
56 #if defined(MBEDTLS_SSL_COOKIE_C)
57 #include "mbedtls/ssl_cookie.h"
58 #endif
59
60 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) && defined(MBEDTLS_FS_IO)
61 #define SNI_OPTION
62 #endif
63
64 #if defined(_WIN32)
65 #include <windows.h>
66 #endif
67
68 #if defined(MBEDTLS_USE_PSA_CRYPTO) || defined(MBEDTLS_SSL_PROTO_TLS1_3)
69 #include "test/psa_crypto_helpers.h"
70 #endif
71
72 #include "mbedtls/pk.h"
73
74 /* Size of memory to be allocated for the heap, when using the library's memory
75 * management and MBEDTLS_MEMORY_BUFFER_ALLOC_C is enabled. */
76 #define MEMORY_HEAP_SIZE 120000
77
78 #define DFL_SERVER_ADDR NULL
79 #define DFL_SERVER_PORT "4433"
80 #define DFL_RESPONSE_SIZE -1
81 #define DFL_DEBUG_LEVEL 0
82 #define DFL_NBIO 0
83 #define DFL_EVENT 0
84 #define DFL_READ_TIMEOUT 0
85 #define DFL_CA_FILE ""
86 #define DFL_CA_PATH ""
87 #define DFL_CRT_FILE ""
88 #define DFL_KEY_FILE ""
89 #define DFL_KEY_OPAQUE 0
90 #define DFL_KEY_PWD ""
91 #define DFL_CRT_FILE2 ""
92 #define DFL_KEY_FILE2 ""
93 #define DFL_KEY_PWD2 ""
94 #define DFL_ASYNC_OPERATIONS "-"
95 #define DFL_ASYNC_PRIVATE_DELAY1 (-1)
96 #define DFL_ASYNC_PRIVATE_DELAY2 (-1)
97 #define DFL_ASYNC_PRIVATE_ERROR (0)
98 #define DFL_PSK ""
99 #define DFL_PSK_OPAQUE 0
100 #define DFL_PSK_LIST_OPAQUE 0
101 #define DFL_PSK_IDENTITY "Client_identity"
102 #define DFL_ECJPAKE_PW NULL
103 #define DFL_ECJPAKE_PW_OPAQUE 0
104 #define DFL_PSK_LIST NULL
105 #define DFL_FORCE_CIPHER 0
106 #define DFL_TLS1_3_KEX_MODES MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_ALL
107 #define DFL_RENEGOTIATION MBEDTLS_SSL_RENEGOTIATION_DISABLED
108 #define DFL_ALLOW_LEGACY -2
109 #define DFL_RENEGOTIATE 0
110 #define DFL_RENEGO_DELAY -2
111 #define DFL_RENEGO_PERIOD ((uint64_t) -1)
112 #define DFL_EXCHANGES 1
113 #define DFL_MIN_VERSION -1
114 #define DFL_MAX_VERSION -1
115 #define DFL_SHA1 -1
116 #define DFL_CID_ENABLED 0
117 #define DFL_CID_VALUE ""
118 #define DFL_CID_ENABLED_RENEGO -1
119 #define DFL_CID_VALUE_RENEGO NULL
120 #define DFL_AUTH_MODE -1
121 #define DFL_CERT_REQ_CA_LIST MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED
122 #define DFL_CERT_REQ_DN_HINT 0
123 #define DFL_MFL_CODE MBEDTLS_SSL_MAX_FRAG_LEN_NONE
124 #define DFL_TRUNC_HMAC -1
125 #define DFL_TICKETS MBEDTLS_SSL_SESSION_TICKETS_ENABLED
126 #define DFL_DUMMY_TICKET 0
127 #define DFL_TICKET_ROTATE 0
128 #define DFL_TICKET_TIMEOUT 86400
129 #define DFL_TICKET_AEAD MBEDTLS_CIPHER_AES_256_GCM
130 #define DFL_CACHE_MAX -1
131 #define DFL_CACHE_TIMEOUT -1
132 #define DFL_CACHE_REMOVE 0
133 #define DFL_SNI NULL
134 #define DFL_ALPN_STRING NULL
135 #define DFL_CURVES NULL
136 #define DFL_MAX_EARLY_DATA_SIZE 0
137 #define DFL_SIG_ALGS NULL
138 #define DFL_DHM_FILE NULL
139 #define DFL_TRANSPORT MBEDTLS_SSL_TRANSPORT_STREAM
140 #define DFL_COOKIES 1
141 #define DFL_ANTI_REPLAY -1
142 #define DFL_HS_TO_MIN 0
143 #define DFL_HS_TO_MAX 0
144 #define DFL_DTLS_MTU -1
145 #define DFL_BADMAC_LIMIT -1
146 #define DFL_DGRAM_PACKING 1
147 #define DFL_EXTENDED_MS -1
148 #define DFL_ETM -1
149 #define DFL_SERIALIZE 0
150 #define DFL_CONTEXT_FILE ""
151 #define DFL_EXTENDED_MS_ENFORCE -1
152 #define DFL_CA_CALLBACK 0
153 #define DFL_EAP_TLS 0
154 #define DFL_REPRODUCIBLE 0
155 #define DFL_NSS_KEYLOG 0
156 #define DFL_NSS_KEYLOG_FILE NULL
157 #define DFL_QUERY_CONFIG_MODE 0
158 #define DFL_USE_SRTP 0
159 #define DFL_SRTP_FORCE_PROFILE 0
160 #define DFL_SRTP_SUPPORT_MKI 0
161 #define DFL_KEY_OPAQUE_ALG "none"
162
163 #define LONG_RESPONSE "<p>01-blah-blah-blah-blah-blah-blah-blah-blah-blah\r\n" \
164 "02-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah\r\n" \
165 "03-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah\r\n" \
166 "04-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah\r\n" \
167 "05-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah\r\n" \
168 "06-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah\r\n" \
169 "07-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah</p>\r\n"
170
171 /* Uncomment LONG_RESPONSE at the end of HTTP_RESPONSE to test sending longer
172 * packets (for fragmentation purposes) */
173 #define HTTP_RESPONSE \
174 "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n" \
175 "<h2>mbed TLS Test Server</h2>\r\n" \
176 "<p>Successful connection using: %s</p>\r\n" // LONG_RESPONSE
177
178 /*
179 * Size of the basic I/O buffer. Able to hold our default response.
180 */
181 #define DFL_IO_BUF_LEN 200
182
183 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
184 #if defined(MBEDTLS_FS_IO)
185 #define USAGE_IO \
186 " ca_file=%%s The single file containing the top-level CA(s) you fully trust\n" \
187 " default: \"\" (pre-loaded)\n" \
188 " use \"none\" to skip loading any top-level CAs.\n" \
189 " ca_path=%%s The path containing the top-level CA(s) you fully trust\n" \
190 " default: \"\" (pre-loaded) (overrides ca_file)\n" \
191 " use \"none\" to skip loading any top-level CAs.\n" \
192 " crt_file=%%s Your own cert and chain (in bottom to top order, top may be omitted)\n" \
193 " default: see note after key_file2\n" \
194 " key_file=%%s default: see note after key_file2\n" \
195 " key_pwd=%%s Password for key specified by key_file argument\n" \
196 " default: none\n" \
197 " crt_file2=%%s Your second cert and chain (in bottom to top order, top may be omitted)\n" \
198 " default: see note after key_file2\n" \
199 " key_file2=%%s default: see note below\n" \
200 " note: if neither crt_file/key_file nor crt_file2/key_file2 are used,\n" \
201 " preloaded certificate(s) and key(s) are used if available\n" \
202 " key_pwd2=%%s Password for key specified by key_file2 argument\n" \
203 " default: none\n" \
204 " dhm_file=%%s File containing Diffie-Hellman parameters\n" \
205 " default: preloaded parameters\n"
206 #else
207 #define USAGE_IO \
208 "\n" \
209 " No file operations available (MBEDTLS_FS_IO not defined)\n" \
210 "\n"
211 #endif /* MBEDTLS_FS_IO */
212 #else
213 #define USAGE_IO ""
214 #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
215 #if defined(MBEDTLS_USE_PSA_CRYPTO) && defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
216 #define USAGE_KEY_OPAQUE \
217 " key_opaque=%%d Handle your private keys as if they were opaque\n" \
218 " default: 0 (disabled)\n"
219 #else
220 #define USAGE_KEY_OPAQUE ""
221 #endif
222
223 #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
224 #define USAGE_SSL_ASYNC \
225 " async_operations=%%c... d=decrypt, s=sign (default: -=off)\n" \
226 " async_private_delay1=%%d Asynchronous delay for key_file or preloaded key\n" \
227 " async_private_delay2=%%d Asynchronous delay for key_file2 and sni\n" \
228 " default: -1 (not asynchronous)\n" \
229 " async_private_error=%%d Async callback error injection (default=0=none,\n" \
230 " 1=start, 2=cancel, 3=resume, negative=first time only)"
231 #else
232 #define USAGE_SSL_ASYNC ""
233 #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
234
235 #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
236 #define USAGE_CID \
237 " cid=%%d Disable (0) or enable (1) the use of the DTLS Connection ID extension.\n" \
238 " default: 0 (disabled)\n" \
239 " cid_renego=%%d Disable (0) or enable (1) the use of the DTLS Connection ID extension during renegotiation.\n" \
240 " default: same as 'cid' parameter\n" \
241 " cid_val=%%s The CID to use for incoming messages (in hex, without 0x).\n" \
242 " default: \"\"\n" \
243 " cid_val_renego=%%s The CID to use for incoming messages (in hex, without 0x) after renegotiation.\n" \
244 " default: same as 'cid_val' parameter\n"
245 #else /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
246 #define USAGE_CID ""
247 #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
248
249 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
250 #define USAGE_PSK_RAW \
251 " psk=%%s default: \"\" (disabled)\n" \
252 " The PSK values are in hex, without 0x.\n" \
253 " psk_list=%%s default: \"\"\n" \
254 " A list of (PSK identity, PSK value) pairs.\n" \
255 " The PSK values are in hex, without 0x.\n" \
256 " id1,psk1[,id2,psk2[,...]]\n" \
257 " psk_identity=%%s default: \"Client_identity\"\n"
258 #if defined(MBEDTLS_USE_PSA_CRYPTO)
259 #define USAGE_PSK_SLOT \
260 " psk_opaque=%%d default: 0 (don't use opaque static PSK)\n" \
261 " Enable this to store the PSK configured through command line\n" \
262 " parameter `psk` in a PSA-based key slot.\n" \
263 " Note: Currently only supported in conjunction with\n" \
264 " the use of min_version to force TLS 1.2 and force_ciphersuite \n" \
265 " to force a particular PSK-only ciphersuite.\n" \
266 " Note: This is to test integration of PSA-based opaque PSKs with\n" \
267 " Mbed TLS only. Production systems are likely to configure Mbed TLS\n" \
268 " with prepopulated key slots instead of importing raw key material.\n" \
269 " psk_list_opaque=%%d default: 0 (don't use opaque dynamic PSKs)\n" \
270 " Enable this to store the list of dynamically chosen PSKs configured\n" \
271 " through the command line parameter `psk_list` in PSA-based key slots.\n" \
272 " Note: Currently only supported in conjunction with\n" \
273 " the use of min_version to force TLS 1.2 and force_ciphersuite \n" \
274 " to force a particular PSK-only ciphersuite.\n" \
275 " Note: This is to test integration of PSA-based opaque PSKs with\n" \
276 " Mbed TLS only. Production systems are likely to configure Mbed TLS\n" \
277 " with prepopulated key slots instead of importing raw key material.\n"
278 #else
279 #define USAGE_PSK_SLOT ""
280 #endif /* MBEDTLS_USE_PSA_CRYPTO */
281 #define USAGE_PSK USAGE_PSK_RAW USAGE_PSK_SLOT
282 #else
283 #define USAGE_PSK ""
284 #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */
285 #if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
286 #define USAGE_CA_CALLBACK \
287 " ca_callback=%%d default: 0 (disabled)\n" \
288 " Enable this to use the trusted certificate callback function\n"
289 #else
290 #define USAGE_CA_CALLBACK ""
291 #endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
292 #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_TICKET_C)
293 #define USAGE_TICKETS \
294 " tickets=%%d default: 1 (enabled)\n" \
295 " ticket_rotate=%%d default: 0 (disabled)\n" \
296 " ticket_timeout=%%d default: 86400 (one day)\n" \
297 " ticket_aead=%%s default: \"AES-256-GCM\"\n"
298 #else
299 #define USAGE_TICKETS ""
300 #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_TICKET_C */
301
302 #define USAGE_EAP_TLS \
303 " eap_tls=%%d default: 0 (disabled)\n"
304 #define USAGE_NSS_KEYLOG \
305 " nss_keylog=%%d default: 0 (disabled)\n" \
306 " This cannot be used with eap_tls=1\n"
307 #define USAGE_NSS_KEYLOG_FILE \
308 " nss_keylog_file=%%s\n"
309 #if defined(MBEDTLS_SSL_DTLS_SRTP)
310 #define USAGE_SRTP \
311 " use_srtp=%%d default: 0 (disabled)\n" \
312 " srtp_force_profile=%%d default: 0 (all enabled)\n" \
313 " available profiles:\n" \
314 " 1 - SRTP_AES128_CM_HMAC_SHA1_80\n" \
315 " 2 - SRTP_AES128_CM_HMAC_SHA1_32\n" \
316 " 3 - SRTP_NULL_HMAC_SHA1_80\n" \
317 " 4 - SRTP_NULL_HMAC_SHA1_32\n" \
318 " support_mki=%%d default: 0 (not supported)\n"
319 #else /* MBEDTLS_SSL_DTLS_SRTP */
320 #define USAGE_SRTP ""
321 #endif
322
323 #if defined(MBEDTLS_SSL_CACHE_C)
324 #define USAGE_CACHE \
325 " cache_max=%%d default: cache default (50)\n" \
326 " cache_remove=%%d default: 0 (don't remove)\n"
327 #if defined(MBEDTLS_HAVE_TIME)
328 #define USAGE_CACHE_TIME \
329 " cache_timeout=%%d default: cache default (1d)\n"
330 #else
331 #define USAGE_CACHE_TIME ""
332 #endif
333 #else
334 #define USAGE_CACHE ""
335 #define USAGE_CACHE_TIME ""
336 #endif /* MBEDTLS_SSL_CACHE_C */
337
338 #if defined(SNI_OPTION)
339 #if defined(MBEDTLS_X509_CRL_PARSE_C)
340 #define SNI_CRL ",crl"
341 #else
342 #define SNI_CRL ""
343 #endif
344
345 #define USAGE_SNI \
346 " sni=%%s name1,cert1,key1,ca1"SNI_CRL ",auth1[,...]\n" \
347 " default: disabled\n"
348 #else
349 #define USAGE_SNI ""
350 #endif /* SNI_OPTION */
351
352 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
353 #define USAGE_MAX_FRAG_LEN \
354 " max_frag_len=%%d default: 16384 (tls default)\n" \
355 " options: 512, 1024, 2048, 4096\n"
356 #else
357 #define USAGE_MAX_FRAG_LEN ""
358 #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
359
360 #if defined(MBEDTLS_SSL_ALPN)
361 #define USAGE_ALPN \
362 " alpn=%%s default: \"\" (disabled)\n" \
363 " example: spdy/1,http/1.1\n"
364 #else
365 #define USAGE_ALPN ""
366 #endif /* MBEDTLS_SSL_ALPN */
367
368 #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
369 #define USAGE_COOKIES \
370 " cookies=0/1/-1 default: 1 (enabled)\n" \
371 " 0: disabled, -1: library default (broken)\n"
372 #else
373 #define USAGE_COOKIES ""
374 #endif
375
376 #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
377 #define USAGE_ANTI_REPLAY \
378 " anti_replay=0/1 default: (library default: enabled)\n"
379 #else
380 #define USAGE_ANTI_REPLAY ""
381 #endif
382
383 #define USAGE_BADMAC_LIMIT \
384 " badmac_limit=%%d default: (library default: disabled)\n"
385
386 #if defined(MBEDTLS_SSL_PROTO_DTLS)
387 #define USAGE_DTLS \
388 " dtls=%%d default: 0 (TLS)\n" \
389 " hs_timeout=%%d-%%d default: (library default: 1000-60000)\n" \
390 " range of DTLS handshake timeouts in millisecs\n" \
391 " mtu=%%d default: (library default: unlimited)\n" \
392 " dgram_packing=%%d default: 1 (allowed)\n" \
393 " allow or forbid packing of multiple\n" \
394 " records within a single datgram.\n"
395 #else
396 #define USAGE_DTLS ""
397 #endif
398
399 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
400 #define USAGE_EMS \
401 " extended_ms=0/1 default: (library default: on)\n"
402 #else
403 #define USAGE_EMS ""
404 #endif
405
406 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
407 #define USAGE_ETM \
408 " etm=0/1 default: (library default: on)\n"
409 #else
410 #define USAGE_ETM ""
411 #endif
412
413 #define USAGE_REPRODUCIBLE \
414 " reproducible=0/1 default: 0 (disabled)\n"
415
416 #if defined(MBEDTLS_SSL_RENEGOTIATION)
417 #define USAGE_RENEGO \
418 " renegotiation=%%d default: 0 (disabled)\n" \
419 " renegotiate=%%d default: 0 (disabled)\n" \
420 " renego_delay=%%d default: -2 (library default)\n" \
421 " renego_period=%%d default: (2^64 - 1 for TLS, 2^48 - 1 for DTLS)\n"
422 #else
423 #define USAGE_RENEGO ""
424 #endif
425
426 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
427 #if defined(MBEDTLS_USE_PSA_CRYPTO)
428 #define USAGE_ECJPAKE \
429 " ecjpake_pw=%%s default: none (disabled)\n" \
430 " ecjpake_pw_opaque=%%d default: 0 (disabled)\n"
431 #else /* MBEDTLS_USE_PSA_CRYPTO */
432 #define USAGE_ECJPAKE \
433 " ecjpake_pw=%%s default: none (disabled)\n"
434 #endif /* MBEDTLS_USE_PSA_CRYPTO */
435 #else /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
436 #define USAGE_ECJPAKE ""
437 #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
438
439 #if defined(MBEDTLS_SSL_EARLY_DATA)
440 #define USAGE_EARLY_DATA \
441 " max_early_data_size=%%d default: -1 (disabled)\n" \
442 " options: -1 (disabled), " \
443 " >= 0 (enabled, max amount of early data )\n"
444 #else
445 #define USAGE_EARLY_DATA ""
446 #endif /* MBEDTLS_SSL_EARLY_DATA */
447
448 #if defined(MBEDTLS_ECP_C)
449 #define USAGE_CURVES \
450 " curves=a,b,c,d default: \"default\" (library default)\n" \
451 " example: \"secp521r1,brainpoolP512r1\"\n" \
452 " - use \"none\" for empty list\n" \
453 " - see mbedtls_ecp_curve_list()\n" \
454 " for acceptable curve names\n"
455 #else
456 #define USAGE_CURVES ""
457 #endif
458
459 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
460 #define USAGE_SIG_ALGS \
461 " sig_algs=a,b,c,d default: \"default\" (library default)\n" \
462 " example: \"ecdsa_secp256r1_sha256,ecdsa_secp384r1_sha384\"\n"
463 #else
464 #define USAGE_SIG_ALGS ""
465 #endif
466
467 #if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
468 #define USAGE_SERIALIZATION \
469 " serialize=%%d default: 0 (do not serialize/deserialize)\n" \
470 " options: 1 (serialize)\n" \
471 " 2 (serialize with re-initialization)\n" \
472 " context_file=%%s The file path to write a serialized connection\n" \
473 " in the form of base64 code (serialize option\n" \
474 " must be set)\n" \
475 " default: \"\" (do nothing)\n" \
476 " option: a file path\n"
477 #else
478 #define USAGE_SERIALIZATION ""
479 #endif
480
481 #define USAGE_KEY_OPAQUE_ALGS \
482 " key_opaque_algs=%%s Allowed opaque key 1 algorithms.\n" \
483 " comma-separated pair of values among the following:\n" \
484 " rsa-sign-pkcs1, rsa-sign-pss, rsa-sign-pss-sha256,\n" \
485 " rsa-sign-pss-sha384, rsa-sign-pss-sha512, rsa-decrypt,\n" \
486 " ecdsa-sign, ecdh, none (only acceptable for\n" \
487 " the second value).\n" \
488 " key_opaque_algs2=%%s Allowed opaque key 2 algorithms.\n" \
489 " comma-separated pair of values among the following:\n" \
490 " rsa-sign-pkcs1, rsa-sign-pss, rsa-sign-pss-sha256,\n" \
491 " rsa-sign-pss-sha384, rsa-sign-pss-sha512, rsa-decrypt,\n" \
492 " ecdsa-sign, ecdh, none (only acceptable for\n" \
493 " the second value).\n"
494 #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
495 #define USAGE_TLS1_3_KEY_EXCHANGE_MODES \
496 " tls13_kex_modes=%%s default: all\n" \
497 " options: psk, psk_ephemeral, psk_all, ephemeral,\n" \
498 " ephemeral_all, all, psk_or_ephemeral\n"
499 #else
500 #define USAGE_TLS1_3_KEY_EXCHANGE_MODES ""
501 #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
502
503
504 /* USAGE is arbitrarily split to stay under the portable string literal
505 * length limit: 4095 bytes in C99. */
506 #define USAGE1 \
507 "\n usage: ssl_server2 param=<>...\n" \
508 "\n acceptable parameters:\n" \
509 " server_addr=%%s default: (all interfaces)\n" \
510 " server_port=%%d default: 4433\n" \
511 " debug_level=%%d default: 0 (disabled)\n" \
512 " build_version=%%d default: none (disabled)\n" \
513 " option: 1 (print build version only and stop)\n" \
514 " buffer_size=%%d default: 200 \n" \
515 " (minimum: 1)\n" \
516 " response_size=%%d default: about 152 (basic response)\n" \
517 " (minimum: 0, max: 16384)\n" \
518 " increases buffer_size if bigger\n" \
519 " nbio=%%d default: 0 (blocking I/O)\n" \
520 " options: 1 (non-blocking), 2 (added delays)\n" \
521 " event=%%d default: 0 (loop)\n" \
522 " options: 1 (level-triggered, implies nbio=1),\n" \
523 " read_timeout=%%d default: 0 ms (no timeout)\n" \
524 "\n" \
525 USAGE_DTLS \
526 USAGE_SRTP \
527 USAGE_COOKIES \
528 USAGE_ANTI_REPLAY \
529 USAGE_BADMAC_LIMIT \
530 "\n"
531 #define USAGE2 \
532 " auth_mode=%%s default: (library default: none)\n" \
533 " options: none, optional, required\n" \
534 " cert_req_ca_list=%%d default: 1 (send ca list)\n" \
535 " options: 1 (send ca list), 0 (don't send)\n" \
536 " 2 (send conf dn hint), 3 (send hs dn hint)\n" \
537 USAGE_IO \
538 USAGE_KEY_OPAQUE \
539 "\n" \
540 USAGE_PSK \
541 USAGE_CA_CALLBACK \
542 USAGE_ECJPAKE \
543 "\n"
544 #define USAGE3 \
545 " allow_legacy=%%d default: (library default: no)\n" \
546 USAGE_RENEGO \
547 " exchanges=%%d default: 1\n" \
548 "\n" \
549 USAGE_TICKETS \
550 USAGE_EAP_TLS \
551 USAGE_REPRODUCIBLE \
552 USAGE_NSS_KEYLOG \
553 USAGE_NSS_KEYLOG_FILE \
554 USAGE_CACHE \
555 USAGE_CACHE_TIME \
556 USAGE_MAX_FRAG_LEN \
557 USAGE_ALPN \
558 USAGE_EMS \
559 USAGE_ETM \
560 USAGE_CURVES \
561 USAGE_SIG_ALGS \
562 USAGE_KEY_OPAQUE_ALGS \
563 "\n"
564
565 #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
566 #define TLS1_3_VERSION_OPTIONS ", tls13"
567 #else /* MBEDTLS_SSL_PROTO_TLS1_3 */
568 #define TLS1_3_VERSION_OPTIONS ""
569 #endif /* !MBEDTLS_SSL_PROTO_TLS1_3 */
570
571 #define USAGE4 \
572 USAGE_SSL_ASYNC \
573 USAGE_SNI \
574 " allow_sha1=%%d default: 0\n" \
575 " min_version=%%s default: (library default: tls12)\n" \
576 " max_version=%%s default: (library default: tls12)\n" \
577 " force_version=%%s default: \"\" (none)\n" \
578 " options: tls12, dtls12" TLS1_3_VERSION_OPTIONS \
579 "\n\n" \
580 " force_ciphersuite=<name> default: all enabled\n" \
581 USAGE_TLS1_3_KEY_EXCHANGE_MODES \
582 " query_config=<name> return 0 if the specified\n" \
583 " configuration macro is defined and 1\n" \
584 " otherwise. The expansion of the macro\n" \
585 " is printed if it is defined\n" \
586 USAGE_SERIALIZATION \
587 " acceptable ciphersuite names:\n"
588
589 #define ALPN_LIST_SIZE 10
590 #define CURVE_LIST_SIZE 20
591 #define SIG_ALG_LIST_SIZE 5
592
593 #define PUT_UINT64_BE(out_be, in_le, i) \
594 { \
595 (out_be)[(i) + 0] = (unsigned char) (((in_le) >> 56) & 0xFF); \
596 (out_be)[(i) + 1] = (unsigned char) (((in_le) >> 48) & 0xFF); \
597 (out_be)[(i) + 2] = (unsigned char) (((in_le) >> 40) & 0xFF); \
598 (out_be)[(i) + 3] = (unsigned char) (((in_le) >> 32) & 0xFF); \
599 (out_be)[(i) + 4] = (unsigned char) (((in_le) >> 24) & 0xFF); \
600 (out_be)[(i) + 5] = (unsigned char) (((in_le) >> 16) & 0xFF); \
601 (out_be)[(i) + 6] = (unsigned char) (((in_le) >> 8) & 0xFF); \
602 (out_be)[(i) + 7] = (unsigned char) (((in_le) >> 0) & 0xFF); \
603 }
604
605 /* This is global so it can be easily accessed by callback functions */
606 rng_context_t rng;
607
608 /*
609 * global options
610 */
611 struct options {
612 const char *server_addr; /* address on which the ssl service runs */
613 const char *server_port; /* port on which the ssl service runs */
614 int debug_level; /* level of debugging */
615 int nbio; /* should I/O be blocking? */
616 int event; /* loop or event-driven IO? level or edge triggered? */
617 uint32_t read_timeout; /* timeout on mbedtls_ssl_read() in milliseconds */
618 int response_size; /* pad response with header to requested size */
619 uint16_t buffer_size; /* IO buffer size */
620 const char *ca_file; /* the file with the CA certificate(s) */
621 const char *ca_path; /* the path with the CA certificate(s) reside */
622 const char *crt_file; /* the file with the server certificate */
623 const char *key_file; /* the file with the server key */
624 int key_opaque; /* handle private key as if it were opaque */
625 const char *key_pwd; /* the password for the server key */
626 const char *crt_file2; /* the file with the 2nd server certificate */
627 const char *key_file2; /* the file with the 2nd server key */
628 const char *key_pwd2; /* the password for the 2nd server key */
629 const char *async_operations; /* supported SSL asynchronous operations */
630 int async_private_delay1; /* number of times f_async_resume needs to be called for key 1, or -1 for no async */
631 int async_private_delay2; /* number of times f_async_resume needs to be called for key 2, or -1 for no async */
632 int async_private_error; /* inject error in async private callback */
633 #if defined(MBEDTLS_USE_PSA_CRYPTO)
634 int psk_opaque;
635 int psk_list_opaque;
636 #endif
637 #if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
638 int ca_callback; /* Use callback for trusted certificate list */
639 #endif
640 const char *psk; /* the pre-shared key */
641 const char *psk_identity; /* the pre-shared key identity */
642 char *psk_list; /* list of PSK id/key pairs for callback */
643 const char *ecjpake_pw; /* the EC J-PAKE password */
644 #if defined(MBEDTLS_USE_PSA_CRYPTO)
645 int ecjpake_pw_opaque; /* set to 1 to use the opaque method for setting the password */
646 #endif
647 int force_ciphersuite[2]; /* protocol/ciphersuite to use, or all */
648 #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
649 int tls13_kex_modes; /* supported TLS 1.3 key exchange modes */
650 #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
651 int renegotiation; /* enable / disable renegotiation */
652 int allow_legacy; /* allow legacy renegotiation */
653 int renegotiate; /* attempt renegotiation? */
654 int renego_delay; /* delay before enforcing renegotiation */
655 uint64_t renego_period; /* period for automatic renegotiation */
656 int exchanges; /* number of data exchanges */
657 int min_version; /* minimum protocol version accepted */
658 int max_version; /* maximum protocol version accepted */
659 int allow_sha1; /* flag for SHA-1 support */
660 int auth_mode; /* verify mode for connection */
661 int cert_req_ca_list; /* should we send the CA list? */
662 int cert_req_dn_hint; /* mode to set DN hints for CA list to send */
663 unsigned char mfl_code; /* code for maximum fragment length */
664 int trunc_hmac; /* accept truncated hmac? */
665 int tickets; /* enable / disable session tickets */
666 int dummy_ticket; /* enable / disable dummy ticket generator */
667 int ticket_rotate; /* session ticket rotate (code coverage) */
668 int ticket_timeout; /* session ticket lifetime */
669 int ticket_aead; /* session ticket protection */
670 int cache_max; /* max number of session cache entries */
671 #if defined(MBEDTLS_HAVE_TIME)
672 int cache_timeout; /* expiration delay of session cache entries*/
673 #endif
674 int cache_remove; /* enable / disable cache removement */
675 char *sni; /* string describing sni information */
676 const char *curves; /* list of supported elliptic curves */
677 const char *sig_algs; /* supported TLS 1.3 signature algorithms */
678 const char *alpn_string; /* ALPN supported protocols */
679 const char *dhm_file; /* the file with the DH parameters */
680 int extended_ms; /* allow negotiation of extended MS? */
681 int etm; /* allow negotiation of encrypt-then-MAC? */
682 int transport; /* TLS or DTLS? */
683 int cookies; /* Use cookies for DTLS? -1 to break them */
684 int anti_replay; /* Use anti-replay for DTLS? -1 for default */
685 uint32_t hs_to_min; /* Initial value of DTLS handshake timer */
686 uint32_t hs_to_max; /* Max value of DTLS handshake timer */
687 int dtls_mtu; /* UDP Maximum transport unit for DTLS */
688 int dgram_packing; /* allow/forbid datagram packing */
689 int badmac_limit; /* Limit of records with bad MAC */
690 int eap_tls; /* derive EAP-TLS keying material? */
691 int nss_keylog; /* export NSS key log material */
692 const char *nss_keylog_file; /* NSS key log file */
693 int cid_enabled; /* whether to use the CID extension or not */
694 int cid_enabled_renego; /* whether to use the CID extension or not
695 * during renegotiation */
696 const char *cid_val; /* the CID to use for incoming messages */
697 int serialize; /* serialize/deserialize connection */
698 const char *context_file; /* the file to write a serialized connection
699 * in the form of base64 code (serialize
700 * option must be set) */
701 const char *cid_val_renego; /* the CID to use for incoming messages
702 * after renegotiation */
703 int reproducible; /* make communication reproducible */
704 uint32_t max_early_data_size; /* max amount of early data */
705 int query_config_mode; /* whether to read config */
706 int use_srtp; /* Support SRTP */
707 int force_srtp_profile; /* SRTP protection profile to use or all */
708 int support_mki; /* The dtls mki mki support */
709 const char *key1_opaque_alg1; /* Allowed opaque key 1 alg 1 */
710 const char *key1_opaque_alg2; /* Allowed opaque key 1 alg 2 */
711 const char *key2_opaque_alg1; /* Allowed opaque key 2 alg 1 */
712 const char *key2_opaque_alg2; /* Allowed opaque key 2 alg 2 */
713 } opt;
714
715 #include "ssl_test_common_source.c"
716
717 /*
718 * Return authmode from string, or -1 on error
719 */
get_auth_mode(const char * s)720 static int get_auth_mode(const char *s)
721 {
722 if (strcmp(s, "none") == 0) {
723 return MBEDTLS_SSL_VERIFY_NONE;
724 }
725 if (strcmp(s, "optional") == 0) {
726 return MBEDTLS_SSL_VERIFY_OPTIONAL;
727 }
728 if (strcmp(s, "required") == 0) {
729 return MBEDTLS_SSL_VERIFY_REQUIRED;
730 }
731
732 return -1;
733 }
734
735 /*
736 * Used by sni_parse and psk_parse to handle comma-separated lists
737 */
738 #define GET_ITEM(dst) \
739 do \
740 { \
741 (dst) = p; \
742 while (*p != ',') \
743 if (++p > end) \
744 goto error; \
745 *p++ = '\0'; \
746 } while (0)
747
748 #if defined(SNI_OPTION)
749 typedef struct _sni_entry sni_entry;
750
751 struct _sni_entry {
752 const char *name;
753 mbedtls_x509_crt *cert;
754 mbedtls_pk_context *key;
755 mbedtls_x509_crt *ca;
756 mbedtls_x509_crl *crl;
757 int authmode;
758 sni_entry *next;
759 };
760
sni_free(sni_entry * head)761 void sni_free(sni_entry *head)
762 {
763 sni_entry *cur = head, *next;
764
765 while (cur != NULL) {
766 mbedtls_x509_crt_free(cur->cert);
767 mbedtls_free(cur->cert);
768
769 mbedtls_pk_free(cur->key);
770 mbedtls_free(cur->key);
771
772 mbedtls_x509_crt_free(cur->ca);
773 mbedtls_free(cur->ca);
774 #if defined(MBEDTLS_X509_CRL_PARSE_C)
775 mbedtls_x509_crl_free(cur->crl);
776 mbedtls_free(cur->crl);
777 #endif
778 next = cur->next;
779 mbedtls_free(cur);
780 cur = next;
781 }
782 }
783
784 /*
785 * Parse a string of sextuples name1,crt1,key1,ca1,crl1,auth1[,...]
786 * into a usable sni_entry list. For ca1, crl1, auth1, the special value
787 * '-' means unset. If ca1 is unset, then crl1 is ignored too.
788 *
789 * Modifies the input string! This is not production quality!
790 */
sni_parse(char * sni_string)791 sni_entry *sni_parse(char *sni_string)
792 {
793 sni_entry *cur = NULL, *new = NULL;
794 char *p = sni_string;
795 char *end = p;
796 char *crt_file, *key_file, *ca_file, *auth_str;
797 #if defined(MBEDTLS_X509_CRL_PARSE_C)
798 char *crl_file;
799 #endif
800
801 while (*end != '\0') {
802 ++end;
803 }
804 *end = ',';
805
806 while (p <= end) {
807 if ((new = mbedtls_calloc(1, sizeof(sni_entry))) == NULL) {
808 sni_free(cur);
809 return NULL;
810 }
811
812 GET_ITEM(new->name);
813 GET_ITEM(crt_file);
814 GET_ITEM(key_file);
815 GET_ITEM(ca_file);
816 #if defined(MBEDTLS_X509_CRL_PARSE_C)
817 GET_ITEM(crl_file);
818 #endif
819 GET_ITEM(auth_str);
820
821 if ((new->cert = mbedtls_calloc(1, sizeof(mbedtls_x509_crt))) == NULL ||
822 (new->key = mbedtls_calloc(1, sizeof(mbedtls_pk_context))) == NULL) {
823 goto error;
824 }
825
826 mbedtls_x509_crt_init(new->cert);
827 mbedtls_pk_init(new->key);
828
829 if (mbedtls_x509_crt_parse_file(new->cert, crt_file) != 0 ||
830 mbedtls_pk_parse_keyfile(new->key, key_file, "", rng_get, &rng) != 0) {
831 goto error;
832 }
833
834 if (strcmp(ca_file, "-") != 0) {
835 if ((new->ca = mbedtls_calloc(1, sizeof(mbedtls_x509_crt))) == NULL) {
836 goto error;
837 }
838
839 mbedtls_x509_crt_init(new->ca);
840
841 if (mbedtls_x509_crt_parse_file(new->ca, ca_file) != 0) {
842 goto error;
843 }
844 }
845
846 #if defined(MBEDTLS_X509_CRL_PARSE_C)
847 if (strcmp(crl_file, "-") != 0) {
848 if ((new->crl = mbedtls_calloc(1, sizeof(mbedtls_x509_crl))) == NULL) {
849 goto error;
850 }
851
852 mbedtls_x509_crl_init(new->crl);
853
854 if (mbedtls_x509_crl_parse_file(new->crl, crl_file) != 0) {
855 goto error;
856 }
857 }
858 #endif
859
860 if (strcmp(auth_str, "-") != 0) {
861 if ((new->authmode = get_auth_mode(auth_str)) < 0) {
862 goto error;
863 }
864 } else {
865 new->authmode = DFL_AUTH_MODE;
866 }
867
868 new->next = cur;
869 cur = new;
870 }
871
872 return cur;
873
874 error:
875 sni_free(new);
876 sni_free(cur);
877 return NULL;
878 }
879
880 /*
881 * SNI callback.
882 */
sni_callback(void * p_info,mbedtls_ssl_context * ssl,const unsigned char * name,size_t name_len)883 int sni_callback(void *p_info, mbedtls_ssl_context *ssl,
884 const unsigned char *name, size_t name_len)
885 {
886 const sni_entry *cur = (const sni_entry *) p_info;
887
888 /* preserve behavior which checks for SNI match in sni_callback() for
889 * the benefits of tests using sni_callback(), even though the actual
890 * certificate assignment has moved to certificate selection callback
891 * in this application. This exercises sni_callback and cert_callback
892 * even though real applications might choose to do this differently.
893 * Application might choose to save name and name_len in user_data for
894 * later use in certificate selection callback.
895 */
896 while (cur != NULL) {
897 if (name_len == strlen(cur->name) &&
898 memcmp(name, cur->name, name_len) == 0) {
899 void *p;
900 *(const void **)&p = cur;
901 mbedtls_ssl_set_user_data_p(ssl, p);
902 return 0;
903 }
904
905 cur = cur->next;
906 }
907
908 return -1;
909 }
910
911 /*
912 * server certificate selection callback.
913 */
cert_callback(mbedtls_ssl_context * ssl)914 int cert_callback(mbedtls_ssl_context *ssl)
915 {
916 const sni_entry *cur = (sni_entry *) mbedtls_ssl_get_user_data_p(ssl);
917 if (cur != NULL) {
918 /*(exercise mbedtls_ssl_get_hs_sni(); not otherwise used here)*/
919 size_t name_len;
920 const unsigned char *name = mbedtls_ssl_get_hs_sni(ssl, &name_len);
921 if (strlen(cur->name) != name_len ||
922 memcmp(cur->name, name, name_len) != 0) {
923 return MBEDTLS_ERR_SSL_DECODE_ERROR;
924 }
925
926 if (cur->ca != NULL) {
927 mbedtls_ssl_set_hs_ca_chain(ssl, cur->ca, cur->crl);
928 }
929
930 if (cur->authmode != DFL_AUTH_MODE) {
931 mbedtls_ssl_set_hs_authmode(ssl, cur->authmode);
932 }
933
934 return mbedtls_ssl_set_hs_own_cert(ssl, cur->cert, cur->key);
935 }
936
937 return 0;
938 }
939
940 #endif /* SNI_OPTION */
941
942 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
943
944 typedef struct _psk_entry psk_entry;
945
946 struct _psk_entry {
947 const char *name;
948 size_t key_len;
949 unsigned char key[MBEDTLS_PSK_MAX_LEN];
950 #if defined(MBEDTLS_USE_PSA_CRYPTO)
951 mbedtls_svc_key_id_t slot;
952 #endif /* MBEDTLS_USE_PSA_CRYPTO */
953 psk_entry *next;
954 };
955
956 /*
957 * Free a list of psk_entry's
958 */
psk_free(psk_entry * head)959 int psk_free(psk_entry *head)
960 {
961 psk_entry *next;
962
963 while (head != NULL) {
964 #if defined(MBEDTLS_USE_PSA_CRYPTO)
965 psa_status_t status;
966 mbedtls_svc_key_id_t const slot = head->slot;
967
968 if (MBEDTLS_SVC_KEY_ID_GET_KEY_ID(slot) != 0) {
969 status = psa_destroy_key(slot);
970 if (status != PSA_SUCCESS) {
971 return status;
972 }
973 }
974 #endif /* MBEDTLS_USE_PSA_CRYPTO */
975
976 next = head->next;
977 mbedtls_free(head);
978 head = next;
979 }
980
981 return 0;
982 }
983
984 /*
985 * Parse a string of pairs name1,key1[,name2,key2[,...]]
986 * into a usable psk_entry list.
987 *
988 * Modifies the input string! This is not production quality!
989 */
psk_parse(char * psk_string)990 psk_entry *psk_parse(char *psk_string)
991 {
992 psk_entry *cur = NULL, *new = NULL;
993 char *p = psk_string;
994 char *end = p;
995 char *key_hex;
996
997 while (*end != '\0') {
998 ++end;
999 }
1000 *end = ',';
1001
1002 while (p <= end) {
1003 if ((new = mbedtls_calloc(1, sizeof(psk_entry))) == NULL) {
1004 goto error;
1005 }
1006
1007 memset(new, 0, sizeof(psk_entry));
1008
1009 GET_ITEM(new->name);
1010 GET_ITEM(key_hex);
1011
1012 if (mbedtls_test_unhexify(new->key, MBEDTLS_PSK_MAX_LEN,
1013 key_hex, &new->key_len) != 0) {
1014 goto error;
1015 }
1016
1017 new->next = cur;
1018 cur = new;
1019 }
1020
1021 return cur;
1022
1023 error:
1024 psk_free(new);
1025 psk_free(cur);
1026 return 0;
1027 }
1028
1029 /*
1030 * PSK callback
1031 */
psk_callback(void * p_info,mbedtls_ssl_context * ssl,const unsigned char * name,size_t name_len)1032 int psk_callback(void *p_info, mbedtls_ssl_context *ssl,
1033 const unsigned char *name, size_t name_len)
1034 {
1035 psk_entry *cur = (psk_entry *) p_info;
1036
1037 while (cur != NULL) {
1038 if (name_len == strlen(cur->name) &&
1039 memcmp(name, cur->name, name_len) == 0) {
1040 #if defined(MBEDTLS_USE_PSA_CRYPTO)
1041 if (MBEDTLS_SVC_KEY_ID_GET_KEY_ID(cur->slot) != 0) {
1042 return mbedtls_ssl_set_hs_psk_opaque(ssl, cur->slot);
1043 } else
1044 #endif
1045 return mbedtls_ssl_set_hs_psk(ssl, cur->key, cur->key_len);
1046 }
1047
1048 cur = cur->next;
1049 }
1050
1051 return -1;
1052 }
1053 #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */
1054
1055 static mbedtls_net_context listen_fd, client_fd;
1056
1057 /* Interruption handler to ensure clean exit (for valgrind testing) */
1058 #if !defined(_WIN32)
1059 static int received_sigterm = 0;
term_handler(int sig)1060 void term_handler(int sig)
1061 {
1062 ((void) sig);
1063 received_sigterm = 1;
1064 mbedtls_net_free(&listen_fd); /* causes mbedtls_net_accept() to abort */
1065 mbedtls_net_free(&client_fd); /* causes net_read() to abort */
1066 }
1067 #endif
1068
1069 /** Return true if \p ret is a status code indicating that there is an
1070 * operation in progress on an SSL connection, and false if it indicates
1071 * success or a fatal error.
1072 *
1073 * The possible operations in progress are:
1074 *
1075 * - A read, when the SSL input buffer does not contain a full message.
1076 * - A write, when the SSL output buffer contains some data that has not
1077 * been sent over the network yet.
1078 * - An asynchronous callback that has not completed yet. */
mbedtls_status_is_ssl_in_progress(int ret)1079 static int mbedtls_status_is_ssl_in_progress(int ret)
1080 {
1081 return ret == MBEDTLS_ERR_SSL_WANT_READ ||
1082 ret == MBEDTLS_ERR_SSL_WANT_WRITE ||
1083 ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
1084 }
1085
1086 #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
1087 typedef struct {
1088 mbedtls_x509_crt *cert; /*!< Certificate corresponding to the key */
1089 mbedtls_pk_context *pk; /*!< Private key */
1090 unsigned delay; /*!< Number of resume steps to go through */
1091 unsigned pk_owned : 1; /*!< Whether to free the pk object on exit */
1092 } ssl_async_key_slot_t;
1093
1094 typedef enum {
1095 SSL_ASYNC_INJECT_ERROR_NONE = 0, /*!< Let the callbacks succeed */
1096 SSL_ASYNC_INJECT_ERROR_START, /*!< Inject error during start */
1097 SSL_ASYNC_INJECT_ERROR_CANCEL, /*!< Close the connection after async start */
1098 SSL_ASYNC_INJECT_ERROR_RESUME, /*!< Inject error during resume */
1099 #define SSL_ASYNC_INJECT_ERROR_MAX SSL_ASYNC_INJECT_ERROR_RESUME
1100 } ssl_async_inject_error_t;
1101
1102 typedef struct {
1103 ssl_async_key_slot_t slots[4]; /* key, key2, sni1, sni2 */
1104 size_t slots_used;
1105 ssl_async_inject_error_t inject_error;
1106 int (*f_rng)(void *, unsigned char *, size_t);
1107 void *p_rng;
1108 } ssl_async_key_context_t;
1109
ssl_async_set_key(ssl_async_key_context_t * ctx,mbedtls_x509_crt * cert,mbedtls_pk_context * pk,int pk_take_ownership,unsigned delay)1110 int ssl_async_set_key(ssl_async_key_context_t *ctx,
1111 mbedtls_x509_crt *cert,
1112 mbedtls_pk_context *pk,
1113 int pk_take_ownership,
1114 unsigned delay)
1115 {
1116 if (ctx->slots_used >= sizeof(ctx->slots) / sizeof(*ctx->slots)) {
1117 return -1;
1118 }
1119 ctx->slots[ctx->slots_used].cert = cert;
1120 ctx->slots[ctx->slots_used].pk = pk;
1121 ctx->slots[ctx->slots_used].delay = delay;
1122 ctx->slots[ctx->slots_used].pk_owned = pk_take_ownership;
1123 ++ctx->slots_used;
1124 return 0;
1125 }
1126
1127 #define SSL_ASYNC_INPUT_MAX_SIZE 512
1128
1129 typedef enum {
1130 ASYNC_OP_SIGN,
1131 ASYNC_OP_DECRYPT,
1132 } ssl_async_operation_type_t;
1133
1134 typedef struct {
1135 unsigned slot;
1136 ssl_async_operation_type_t operation_type;
1137 mbedtls_md_type_t md_alg;
1138 unsigned char input[SSL_ASYNC_INPUT_MAX_SIZE];
1139 size_t input_len;
1140 unsigned remaining_delay;
1141 } ssl_async_operation_context_t;
1142
1143 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
1144
1145 /* Note that ssl_async_operation_type_t and the array below need to be kept in sync!
1146 * `ssl_async_operation_names[op]` is the name of op for each value `op`
1147 * of type `ssl_async_operation_type_t`. */
1148 static const char *const ssl_async_operation_names[] =
1149 {
1150 "sign",
1151 "decrypt",
1152 };
1153
ssl_async_start(mbedtls_ssl_context * ssl,mbedtls_x509_crt * cert,ssl_async_operation_type_t op_type,mbedtls_md_type_t md_alg,const unsigned char * input,size_t input_len)1154 static int ssl_async_start(mbedtls_ssl_context *ssl,
1155 mbedtls_x509_crt *cert,
1156 ssl_async_operation_type_t op_type,
1157 mbedtls_md_type_t md_alg,
1158 const unsigned char *input,
1159 size_t input_len)
1160 {
1161 ssl_async_key_context_t *config_data =
1162 mbedtls_ssl_conf_get_async_config_data(ssl->conf);
1163 unsigned slot;
1164 ssl_async_operation_context_t *ctx = NULL;
1165 const char *op_name = ssl_async_operation_names[op_type];
1166
1167 {
1168 char dn[100];
1169 if (mbedtls_x509_dn_gets(dn, sizeof(dn), &cert->subject) > 0) {
1170 mbedtls_printf("Async %s callback: looking for DN=%s\n",
1171 op_name, dn);
1172 }
1173 }
1174
1175 /* Look for a private key that matches the public key in cert.
1176 * Since this test code has the private key inside Mbed TLS,
1177 * we call mbedtls_pk_check_pair to match a private key with the
1178 * public key. */
1179 for (slot = 0; slot < config_data->slots_used; slot++) {
1180 if (mbedtls_pk_check_pair(&cert->pk,
1181 config_data->slots[slot].pk,
1182 rng_get, &rng) == 0) {
1183 break;
1184 }
1185 }
1186 if (slot == config_data->slots_used) {
1187 mbedtls_printf("Async %s callback: no key matches this certificate.\n",
1188 op_name);
1189 return MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH;
1190 }
1191 mbedtls_printf("Async %s callback: using key slot %u, delay=%u.\n",
1192 op_name, slot, config_data->slots[slot].delay);
1193
1194 if (config_data->inject_error == SSL_ASYNC_INJECT_ERROR_START) {
1195 mbedtls_printf("Async %s callback: injected error\n", op_name);
1196 return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE;
1197 }
1198
1199 if (input_len > SSL_ASYNC_INPUT_MAX_SIZE) {
1200 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
1201 }
1202
1203 ctx = mbedtls_calloc(1, sizeof(*ctx));
1204 if (ctx == NULL) {
1205 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
1206 }
1207 ctx->slot = slot;
1208 ctx->operation_type = op_type;
1209 ctx->md_alg = md_alg;
1210 memcpy(ctx->input, input, input_len);
1211 ctx->input_len = input_len;
1212 ctx->remaining_delay = config_data->slots[slot].delay;
1213 mbedtls_ssl_set_async_operation_data(ssl, ctx);
1214
1215 if (ctx->remaining_delay == 0) {
1216 return 0;
1217 } else {
1218 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
1219 }
1220 }
1221
ssl_async_sign(mbedtls_ssl_context * ssl,mbedtls_x509_crt * cert,mbedtls_md_type_t md_alg,const unsigned char * hash,size_t hash_len)1222 static int ssl_async_sign(mbedtls_ssl_context *ssl,
1223 mbedtls_x509_crt *cert,
1224 mbedtls_md_type_t md_alg,
1225 const unsigned char *hash,
1226 size_t hash_len)
1227 {
1228 return ssl_async_start(ssl, cert,
1229 ASYNC_OP_SIGN, md_alg,
1230 hash, hash_len);
1231 }
1232
ssl_async_decrypt(mbedtls_ssl_context * ssl,mbedtls_x509_crt * cert,const unsigned char * input,size_t input_len)1233 static int ssl_async_decrypt(mbedtls_ssl_context *ssl,
1234 mbedtls_x509_crt *cert,
1235 const unsigned char *input,
1236 size_t input_len)
1237 {
1238 return ssl_async_start(ssl, cert,
1239 ASYNC_OP_DECRYPT, MBEDTLS_MD_NONE,
1240 input, input_len);
1241 }
1242
ssl_async_resume(mbedtls_ssl_context * ssl,unsigned char * output,size_t * output_len,size_t output_size)1243 static int ssl_async_resume(mbedtls_ssl_context *ssl,
1244 unsigned char *output,
1245 size_t *output_len,
1246 size_t output_size)
1247 {
1248 ssl_async_operation_context_t *ctx = mbedtls_ssl_get_async_operation_data(ssl);
1249 ssl_async_key_context_t *config_data =
1250 mbedtls_ssl_conf_get_async_config_data(ssl->conf);
1251 ssl_async_key_slot_t *key_slot = &config_data->slots[ctx->slot];
1252 int ret;
1253 const char *op_name;
1254
1255 if (ctx->remaining_delay > 0) {
1256 --ctx->remaining_delay;
1257 mbedtls_printf("Async resume (slot %u): call %u more times.\n",
1258 ctx->slot, ctx->remaining_delay);
1259 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
1260 }
1261
1262 switch (ctx->operation_type) {
1263 case ASYNC_OP_DECRYPT:
1264 ret = mbedtls_pk_decrypt(key_slot->pk,
1265 ctx->input, ctx->input_len,
1266 output, output_len, output_size,
1267 config_data->f_rng, config_data->p_rng);
1268 break;
1269 case ASYNC_OP_SIGN:
1270 ret = mbedtls_pk_sign(key_slot->pk,
1271 ctx->md_alg,
1272 ctx->input, ctx->input_len,
1273 output, output_size, output_len,
1274 config_data->f_rng, config_data->p_rng);
1275 break;
1276 default:
1277 mbedtls_printf(
1278 "Async resume (slot %u): unknown operation type %ld. This shouldn't happen.\n",
1279 ctx->slot,
1280 (long) ctx->operation_type);
1281 mbedtls_free(ctx);
1282 return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE;
1283 break;
1284 }
1285
1286 op_name = ssl_async_operation_names[ctx->operation_type];
1287
1288 if (config_data->inject_error == SSL_ASYNC_INJECT_ERROR_RESUME) {
1289 mbedtls_printf("Async resume callback: %s done but injected error\n",
1290 op_name);
1291 mbedtls_free(ctx);
1292 return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE;
1293 }
1294
1295 mbedtls_printf("Async resume (slot %u): %s done, status=%d.\n",
1296 ctx->slot, op_name, ret);
1297 mbedtls_free(ctx);
1298 return ret;
1299 }
1300
ssl_async_cancel(mbedtls_ssl_context * ssl)1301 static void ssl_async_cancel(mbedtls_ssl_context *ssl)
1302 {
1303 ssl_async_operation_context_t *ctx = mbedtls_ssl_get_async_operation_data(ssl);
1304 mbedtls_printf("Async cancel callback.\n");
1305 mbedtls_free(ctx);
1306 }
1307 #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
1308 #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
1309
1310 #if defined(MBEDTLS_USE_PSA_CRYPTO)
1311 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
psa_setup_psk_key_slot(mbedtls_svc_key_id_t * slot,psa_algorithm_t alg,unsigned char * psk,size_t psk_len)1312 static psa_status_t psa_setup_psk_key_slot(mbedtls_svc_key_id_t *slot,
1313 psa_algorithm_t alg,
1314 unsigned char *psk,
1315 size_t psk_len)
1316 {
1317 psa_status_t status;
1318 psa_key_attributes_t key_attributes;
1319
1320 key_attributes = psa_key_attributes_init();
1321 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
1322 psa_set_key_algorithm(&key_attributes, alg);
1323 psa_set_key_type(&key_attributes, PSA_KEY_TYPE_DERIVE);
1324
1325 status = psa_import_key(&key_attributes, psk, psk_len, slot);
1326 if (status != PSA_SUCCESS) {
1327 fprintf(stderr, "IMPORT\n");
1328 return status;
1329 }
1330
1331 return PSA_SUCCESS;
1332 }
1333 #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */
1334 #endif /* MBEDTLS_USE_PSA_CRYPTO */
1335
1336 #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
report_cid_usage(mbedtls_ssl_context * ssl,const char * additional_description)1337 int report_cid_usage(mbedtls_ssl_context *ssl,
1338 const char *additional_description)
1339 {
1340 int ret;
1341 unsigned char peer_cid[MBEDTLS_SSL_CID_OUT_LEN_MAX];
1342 size_t peer_cid_len;
1343 int cid_negotiated;
1344
1345 if (opt.transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1346 return 0;
1347 }
1348
1349 /* Check if the use of a CID has been negotiated */
1350 ret = mbedtls_ssl_get_peer_cid(ssl, &cid_negotiated,
1351 peer_cid, &peer_cid_len);
1352 if (ret != 0) {
1353 mbedtls_printf(" failed\n ! mbedtls_ssl_get_peer_cid returned -0x%x\n\n",
1354 (unsigned int) -ret);
1355 return ret;
1356 }
1357
1358 if (cid_negotiated == MBEDTLS_SSL_CID_DISABLED) {
1359 if (opt.cid_enabled == MBEDTLS_SSL_CID_ENABLED) {
1360 mbedtls_printf("(%s) Use of Connection ID was not offered by client.\n",
1361 additional_description);
1362 }
1363 } else {
1364 size_t idx = 0;
1365 mbedtls_printf("(%s) Use of Connection ID has been negotiated.\n",
1366 additional_description);
1367 mbedtls_printf("(%s) Peer CID (length %u Bytes): ",
1368 additional_description,
1369 (unsigned) peer_cid_len);
1370 while (idx < peer_cid_len) {
1371 mbedtls_printf("%02x ", peer_cid[idx]);
1372 idx++;
1373 }
1374 mbedtls_printf("\n");
1375 }
1376
1377 return 0;
1378 }
1379 #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1380
1381 #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_HAVE_TIME)
put_unaligned_uint32(void * p,uint32_t x)1382 static inline void put_unaligned_uint32(void *p, uint32_t x)
1383 {
1384 memcpy(p, &x, sizeof(x));
1385 }
1386
1387 /* Functions for session ticket tests */
dummy_ticket_write(void * p_ticket,const mbedtls_ssl_session * session,unsigned char * start,const unsigned char * end,size_t * tlen,uint32_t * ticket_lifetime)1388 int dummy_ticket_write(void *p_ticket, const mbedtls_ssl_session *session,
1389 unsigned char *start, const unsigned char *end,
1390 size_t *tlen, uint32_t *ticket_lifetime)
1391 {
1392 int ret;
1393 unsigned char *p = start;
1394 size_t clear_len;
1395 ((void) p_ticket);
1396
1397 if (end - p < 4) {
1398 return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL;
1399 }
1400 put_unaligned_uint32(p, 7 * 24 * 3600);
1401 *ticket_lifetime = 7 * 24 * 3600;
1402 p += 4;
1403
1404 /* Dump session state */
1405 if ((ret = mbedtls_ssl_session_save(session, p, end - p,
1406 &clear_len)) != 0) {
1407 return ret;
1408 }
1409
1410 *tlen = 4 + clear_len;
1411
1412 return 0;
1413 }
1414
dummy_ticket_parse(void * p_ticket,mbedtls_ssl_session * session,unsigned char * buf,size_t len)1415 int dummy_ticket_parse(void *p_ticket, mbedtls_ssl_session *session,
1416 unsigned char *buf, size_t len)
1417 {
1418 int ret;
1419 ((void) p_ticket);
1420
1421 if ((ret = mbedtls_ssl_session_load(session, buf + 4, len - 4)) != 0) {
1422 return ret;
1423 }
1424
1425 switch (opt.dummy_ticket % 11) {
1426 case 1:
1427 return MBEDTLS_ERR_SSL_INVALID_MAC;
1428 case 2:
1429 return MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED;
1430 case 3:
1431 session->start = mbedtls_time(NULL) + 10;
1432 break;
1433 case 4:
1434 session->start = mbedtls_time(NULL) - 10 - 7 * 24 * 3600;
1435 break;
1436 case 5:
1437 session->start = mbedtls_time(NULL) - 10;
1438 break;
1439 case 6:
1440 session->start = mbedtls_time(NULL);
1441 #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
1442 session->ticket_age_add -= 1000;
1443 #endif
1444 break;
1445 #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
1446 case 7:
1447 session->ticket_flags = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_NONE;
1448 break;
1449 case 8:
1450 session->ticket_flags = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK;
1451 break;
1452 case 9:
1453 session->ticket_flags = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL;
1454 break;
1455 case 10:
1456 session->ticket_flags = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ALL;
1457 break;
1458 #endif
1459 default:
1460 break;
1461 }
1462
1463 return ret;
1464 }
1465 #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_HAVE_TIME */
1466
main(int argc,char * argv[])1467 int main(int argc, char *argv[])
1468 {
1469 int ret = 0, len, written, frags, exchanges_left;
1470 int query_config_ret = 0;
1471 io_ctx_t io_ctx;
1472 unsigned char *buf = 0;
1473 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
1474 #if defined(MBEDTLS_USE_PSA_CRYPTO)
1475 psa_algorithm_t alg = 0;
1476 mbedtls_svc_key_id_t psk_slot = MBEDTLS_SVC_KEY_ID_INIT;
1477 #endif /* MBEDTLS_USE_PSA_CRYPTO */
1478 unsigned char psk[MBEDTLS_PSK_MAX_LEN];
1479 size_t psk_len = 0;
1480 psk_entry *psk_info = NULL;
1481 #endif
1482 const char *pers = "ssl_server2";
1483 unsigned char client_ip[16] = { 0 };
1484 size_t cliip_len;
1485 #if defined(MBEDTLS_SSL_COOKIE_C)
1486 mbedtls_ssl_cookie_ctx cookie_ctx;
1487 #endif
1488
1489 mbedtls_ssl_context ssl;
1490 mbedtls_ssl_config conf;
1491 #if defined(MBEDTLS_TIMING_C)
1492 mbedtls_timing_delay_context timer;
1493 #endif
1494 #if defined(MBEDTLS_SSL_RENEGOTIATION)
1495 unsigned char renego_period[8] = { 0 };
1496 #endif
1497 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
1498 uint32_t flags;
1499 mbedtls_x509_crt cacert;
1500 mbedtls_x509_crt srvcert;
1501 mbedtls_pk_context pkey;
1502 mbedtls_x509_crt srvcert2;
1503 mbedtls_pk_context pkey2;
1504 mbedtls_x509_crt_profile crt_profile_for_test = mbedtls_x509_crt_profile_default;
1505 #if defined(MBEDTLS_USE_PSA_CRYPTO)
1506 mbedtls_svc_key_id_t key_slot = MBEDTLS_SVC_KEY_ID_INIT; /* invalid key slot */
1507 mbedtls_svc_key_id_t key_slot2 = MBEDTLS_SVC_KEY_ID_INIT; /* invalid key slot */
1508 #endif
1509 int key_cert_init = 0, key_cert_init2 = 0;
1510 #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
1511 #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
1512 ssl_async_key_context_t ssl_async_keys;
1513 #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
1514 #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_FS_IO)
1515 mbedtls_dhm_context dhm;
1516 #endif
1517 #if defined(MBEDTLS_SSL_CACHE_C)
1518 mbedtls_ssl_cache_context cache;
1519 #endif
1520 #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_TICKET_C)
1521 mbedtls_ssl_ticket_context ticket_ctx;
1522 #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_TICKET_C */
1523 #if defined(SNI_OPTION)
1524 sni_entry *sni_info = NULL;
1525 #endif
1526 #if defined(MBEDTLS_ECP_C)
1527 uint16_t group_list[CURVE_LIST_SIZE];
1528 const mbedtls_ecp_curve_info *curve_cur;
1529 #endif
1530 #if defined(MBEDTLS_SSL_ALPN)
1531 const char *alpn_list[ALPN_LIST_SIZE];
1532 #endif
1533 #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
1534 unsigned char alloc_buf[MEMORY_HEAP_SIZE];
1535 #endif
1536 #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
1537 unsigned char cid[MBEDTLS_SSL_CID_IN_LEN_MAX];
1538 unsigned char cid_renego[MBEDTLS_SSL_CID_IN_LEN_MAX];
1539 size_t cid_len = 0;
1540 size_t cid_renego_len = 0;
1541 #endif
1542 #if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
1543 unsigned char *context_buf = NULL;
1544 size_t context_buf_len = 0;
1545 #endif
1546 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) && \
1547 defined(MBEDTLS_USE_PSA_CRYPTO)
1548 mbedtls_svc_key_id_t ecjpake_pw_slot = MBEDTLS_SVC_KEY_ID_INIT; /* ecjpake password key slot */
1549 #endif /* MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1550
1551 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
1552 uint16_t sig_alg_list[SIG_ALG_LIST_SIZE];
1553 #endif
1554
1555 int i;
1556 char *p, *q;
1557 const int *list;
1558 #if defined(MBEDTLS_USE_PSA_CRYPTO) || defined(MBEDTLS_SSL_PROTO_TLS1_3)
1559 psa_status_t status;
1560 #endif
1561 unsigned char eap_tls_keymaterial[16];
1562 unsigned char eap_tls_iv[8];
1563 const char *eap_tls_label = "client EAP encryption";
1564 eap_tls_keys eap_tls_keying;
1565 #if defined(MBEDTLS_SSL_DTLS_SRTP)
1566 /*! master keys and master salt for SRTP generated during handshake */
1567 unsigned char dtls_srtp_key_material[MBEDTLS_TLS_SRTP_MAX_KEY_MATERIAL_LENGTH];
1568 const char *dtls_srtp_label = "EXTRACTOR-dtls_srtp";
1569 dtls_srtp_keys dtls_srtp_keying;
1570 const mbedtls_ssl_srtp_profile default_profiles[] = {
1571 MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_80,
1572 MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_32,
1573 MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_80,
1574 MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_32,
1575 MBEDTLS_TLS_SRTP_UNSET
1576 };
1577 #endif /* MBEDTLS_SSL_DTLS_SRTP */
1578
1579 #if defined(MBEDTLS_SSL_EARLY_DATA)
1580 int tls13_early_data_enabled = MBEDTLS_SSL_EARLY_DATA_DISABLED;
1581 #endif
1582 #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
1583 mbedtls_memory_buffer_alloc_init(alloc_buf, sizeof(alloc_buf));
1584 #if defined(MBEDTLS_MEMORY_DEBUG)
1585 size_t current_heap_memory, peak_heap_memory, heap_blocks;
1586 #endif /* MBEDTLS_MEMORY_DEBUG */
1587 #endif /* MBEDTLS_MEMORY_BUFFER_ALLOC_C */
1588
1589 #if defined(MBEDTLS_TEST_HOOKS)
1590 test_hooks_init();
1591 #endif /* MBEDTLS_TEST_HOOKS */
1592
1593 /*
1594 * Make sure memory references are valid in case we exit early.
1595 */
1596 mbedtls_net_init(&client_fd);
1597 mbedtls_net_init(&listen_fd);
1598 mbedtls_ssl_init(&ssl);
1599 mbedtls_ssl_config_init(&conf);
1600 rng_init(&rng);
1601 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
1602 mbedtls_x509_crt_init(&cacert);
1603 mbedtls_x509_crt_init(&srvcert);
1604 mbedtls_pk_init(&pkey);
1605 mbedtls_x509_crt_init(&srvcert2);
1606 mbedtls_pk_init(&pkey2);
1607 #endif
1608 #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
1609 memset(&ssl_async_keys, 0, sizeof(ssl_async_keys));
1610 #endif
1611 #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_FS_IO)
1612 mbedtls_dhm_init(&dhm);
1613 #endif
1614 #if defined(MBEDTLS_SSL_CACHE_C)
1615 mbedtls_ssl_cache_init(&cache);
1616 #endif
1617 #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_TICKET_C)
1618 mbedtls_ssl_ticket_init(&ticket_ctx);
1619 #endif
1620 #if defined(MBEDTLS_SSL_ALPN)
1621 memset((void *) alpn_list, 0, sizeof(alpn_list));
1622 #endif
1623 #if defined(MBEDTLS_SSL_COOKIE_C)
1624 mbedtls_ssl_cookie_init(&cookie_ctx);
1625 #endif
1626
1627 #if defined(MBEDTLS_USE_PSA_CRYPTO) || defined(MBEDTLS_SSL_PROTO_TLS1_3)
1628 status = psa_crypto_init();
1629 if (status != PSA_SUCCESS) {
1630 mbedtls_fprintf(stderr, "Failed to initialize PSA Crypto implementation: %d\n",
1631 (int) status);
1632 ret = MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
1633 goto exit;
1634 }
1635 #endif /* MBEDTLS_USE_PSA_CRYPTO */
1636 #if defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG)
1637 mbedtls_test_enable_insecure_external_rng();
1638 #endif /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */
1639
1640 #if !defined(_WIN32)
1641 /* Abort cleanly on SIGTERM and SIGINT */
1642 signal(SIGTERM, term_handler);
1643 signal(SIGINT, term_handler);
1644 #endif
1645
1646 if (argc < 2) {
1647 usage:
1648 if (ret == 0) {
1649 ret = 1;
1650 }
1651
1652 mbedtls_printf(USAGE1);
1653 mbedtls_printf(USAGE2);
1654 mbedtls_printf(USAGE3);
1655 mbedtls_printf(USAGE4);
1656
1657 list = mbedtls_ssl_list_ciphersuites();
1658 while (*list) {
1659 mbedtls_printf(" %-42s", mbedtls_ssl_get_ciphersuite_name(*list));
1660 list++;
1661 if (!*list) {
1662 break;
1663 }
1664 mbedtls_printf(" %s\n", mbedtls_ssl_get_ciphersuite_name(*list));
1665 list++;
1666 }
1667 mbedtls_printf("\n");
1668 goto exit;
1669 }
1670
1671 opt.buffer_size = DFL_IO_BUF_LEN;
1672 opt.server_addr = DFL_SERVER_ADDR;
1673 opt.server_port = DFL_SERVER_PORT;
1674 opt.debug_level = DFL_DEBUG_LEVEL;
1675 opt.event = DFL_EVENT;
1676 opt.response_size = DFL_RESPONSE_SIZE;
1677 opt.nbio = DFL_NBIO;
1678 opt.cid_enabled = DFL_CID_ENABLED;
1679 opt.cid_enabled_renego = DFL_CID_ENABLED_RENEGO;
1680 opt.cid_val = DFL_CID_VALUE;
1681 opt.cid_val_renego = DFL_CID_VALUE_RENEGO;
1682 opt.read_timeout = DFL_READ_TIMEOUT;
1683 opt.ca_file = DFL_CA_FILE;
1684 opt.ca_path = DFL_CA_PATH;
1685 opt.crt_file = DFL_CRT_FILE;
1686 opt.key_file = DFL_KEY_FILE;
1687 opt.key_opaque = DFL_KEY_OPAQUE;
1688 opt.key_pwd = DFL_KEY_PWD;
1689 opt.crt_file2 = DFL_CRT_FILE2;
1690 opt.key_file2 = DFL_KEY_FILE2;
1691 opt.key_pwd2 = DFL_KEY_PWD2;
1692 opt.async_operations = DFL_ASYNC_OPERATIONS;
1693 opt.async_private_delay1 = DFL_ASYNC_PRIVATE_DELAY1;
1694 opt.async_private_delay2 = DFL_ASYNC_PRIVATE_DELAY2;
1695 opt.async_private_error = DFL_ASYNC_PRIVATE_ERROR;
1696 opt.psk = DFL_PSK;
1697 #if defined(MBEDTLS_USE_PSA_CRYPTO)
1698 opt.psk_opaque = DFL_PSK_OPAQUE;
1699 opt.psk_list_opaque = DFL_PSK_LIST_OPAQUE;
1700 #endif
1701 #if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
1702 opt.ca_callback = DFL_CA_CALLBACK;
1703 #endif
1704 opt.psk_identity = DFL_PSK_IDENTITY;
1705 opt.psk_list = DFL_PSK_LIST;
1706 opt.ecjpake_pw = DFL_ECJPAKE_PW;
1707 #if defined(MBEDTLS_USE_PSA_CRYPTO)
1708 opt.ecjpake_pw_opaque = DFL_ECJPAKE_PW_OPAQUE;
1709 #endif
1710 opt.force_ciphersuite[0] = DFL_FORCE_CIPHER;
1711 #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
1712 opt.tls13_kex_modes = DFL_TLS1_3_KEX_MODES;
1713 #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
1714 opt.renegotiation = DFL_RENEGOTIATION;
1715 opt.allow_legacy = DFL_ALLOW_LEGACY;
1716 opt.renegotiate = DFL_RENEGOTIATE;
1717 opt.renego_delay = DFL_RENEGO_DELAY;
1718 opt.renego_period = DFL_RENEGO_PERIOD;
1719 opt.exchanges = DFL_EXCHANGES;
1720 opt.min_version = DFL_MIN_VERSION;
1721 opt.max_version = DFL_MAX_VERSION;
1722 opt.allow_sha1 = DFL_SHA1;
1723 opt.auth_mode = DFL_AUTH_MODE;
1724 opt.cert_req_ca_list = DFL_CERT_REQ_CA_LIST;
1725 opt.cert_req_dn_hint = DFL_CERT_REQ_DN_HINT;
1726 opt.mfl_code = DFL_MFL_CODE;
1727 opt.trunc_hmac = DFL_TRUNC_HMAC;
1728 opt.tickets = DFL_TICKETS;
1729 opt.dummy_ticket = DFL_DUMMY_TICKET;
1730 opt.ticket_rotate = DFL_TICKET_ROTATE;
1731 opt.ticket_timeout = DFL_TICKET_TIMEOUT;
1732 opt.ticket_aead = DFL_TICKET_AEAD;
1733 opt.cache_max = DFL_CACHE_MAX;
1734 #if defined(MBEDTLS_HAVE_TIME)
1735 opt.cache_timeout = DFL_CACHE_TIMEOUT;
1736 #endif
1737 opt.cache_remove = DFL_CACHE_REMOVE;
1738 opt.sni = DFL_SNI;
1739 opt.alpn_string = DFL_ALPN_STRING;
1740 opt.curves = DFL_CURVES;
1741 opt.max_early_data_size = DFL_MAX_EARLY_DATA_SIZE;
1742 opt.sig_algs = DFL_SIG_ALGS;
1743 opt.dhm_file = DFL_DHM_FILE;
1744 opt.transport = DFL_TRANSPORT;
1745 opt.cookies = DFL_COOKIES;
1746 opt.anti_replay = DFL_ANTI_REPLAY;
1747 opt.hs_to_min = DFL_HS_TO_MIN;
1748 opt.hs_to_max = DFL_HS_TO_MAX;
1749 opt.dtls_mtu = DFL_DTLS_MTU;
1750 opt.dgram_packing = DFL_DGRAM_PACKING;
1751 opt.badmac_limit = DFL_BADMAC_LIMIT;
1752 opt.extended_ms = DFL_EXTENDED_MS;
1753 opt.etm = DFL_ETM;
1754 opt.serialize = DFL_SERIALIZE;
1755 opt.context_file = DFL_CONTEXT_FILE;
1756 opt.eap_tls = DFL_EAP_TLS;
1757 opt.reproducible = DFL_REPRODUCIBLE;
1758 opt.nss_keylog = DFL_NSS_KEYLOG;
1759 opt.nss_keylog_file = DFL_NSS_KEYLOG_FILE;
1760 opt.query_config_mode = DFL_QUERY_CONFIG_MODE;
1761 opt.use_srtp = DFL_USE_SRTP;
1762 opt.force_srtp_profile = DFL_SRTP_FORCE_PROFILE;
1763 opt.support_mki = DFL_SRTP_SUPPORT_MKI;
1764 opt.key1_opaque_alg1 = DFL_KEY_OPAQUE_ALG;
1765 opt.key1_opaque_alg2 = DFL_KEY_OPAQUE_ALG;
1766 opt.key2_opaque_alg1 = DFL_KEY_OPAQUE_ALG;
1767 opt.key2_opaque_alg2 = DFL_KEY_OPAQUE_ALG;
1768
1769 for (i = 1; i < argc; i++) {
1770 p = argv[i];
1771 if ((q = strchr(p, '=')) == NULL) {
1772 goto usage;
1773 }
1774 *q++ = '\0';
1775
1776 if (strcmp(p, "server_port") == 0) {
1777 opt.server_port = q;
1778 } else if (strcmp(p, "server_addr") == 0) {
1779 opt.server_addr = q;
1780 } else if (strcmp(p, "dtls") == 0) {
1781 int t = atoi(q);
1782 if (t == 0) {
1783 opt.transport = MBEDTLS_SSL_TRANSPORT_STREAM;
1784 } else if (t == 1) {
1785 opt.transport = MBEDTLS_SSL_TRANSPORT_DATAGRAM;
1786 } else {
1787 goto usage;
1788 }
1789 } else if (strcmp(p, "debug_level") == 0) {
1790 opt.debug_level = atoi(q);
1791 if (opt.debug_level < 0 || opt.debug_level > 65535) {
1792 goto usage;
1793 }
1794 } else if (strcmp(p, "build_version") == 0) {
1795 if (strcmp(q, "1") == 0) {
1796 mbedtls_printf("build version: %s (build %d)\n",
1797 MBEDTLS_VERSION_STRING_FULL,
1798 MBEDTLS_VERSION_NUMBER);
1799 goto exit;
1800 }
1801 } else if (strcmp(p, "nbio") == 0) {
1802 opt.nbio = atoi(q);
1803 if (opt.nbio < 0 || opt.nbio > 2) {
1804 goto usage;
1805 }
1806 } else if (strcmp(p, "event") == 0) {
1807 opt.event = atoi(q);
1808 if (opt.event < 0 || opt.event > 2) {
1809 goto usage;
1810 }
1811 } else if (strcmp(p, "read_timeout") == 0) {
1812 opt.read_timeout = atoi(q);
1813 } else if (strcmp(p, "buffer_size") == 0) {
1814 opt.buffer_size = atoi(q);
1815 if (opt.buffer_size < 1) {
1816 goto usage;
1817 }
1818 } else if (strcmp(p, "response_size") == 0) {
1819 opt.response_size = atoi(q);
1820 if (opt.response_size < 0 || opt.response_size > MBEDTLS_SSL_OUT_CONTENT_LEN) {
1821 goto usage;
1822 }
1823 if (opt.buffer_size < opt.response_size) {
1824 opt.buffer_size = opt.response_size;
1825 }
1826 } else if (strcmp(p, "ca_file") == 0) {
1827 opt.ca_file = q;
1828 } else if (strcmp(p, "ca_path") == 0) {
1829 opt.ca_path = q;
1830 } else if (strcmp(p, "crt_file") == 0) {
1831 opt.crt_file = q;
1832 } else if (strcmp(p, "key_file") == 0) {
1833 opt.key_file = q;
1834 } else if (strcmp(p, "key_pwd") == 0) {
1835 opt.key_pwd = q;
1836 }
1837 #if defined(MBEDTLS_USE_PSA_CRYPTO) && defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
1838 else if (strcmp(p, "key_opaque") == 0) {
1839 opt.key_opaque = atoi(q);
1840 }
1841 #endif
1842 else if (strcmp(p, "crt_file2") == 0) {
1843 opt.crt_file2 = q;
1844 } else if (strcmp(p, "key_file2") == 0) {
1845 opt.key_file2 = q;
1846 } else if (strcmp(p, "key_pwd2") == 0) {
1847 opt.key_pwd2 = q;
1848 } else if (strcmp(p, "dhm_file") == 0) {
1849 opt.dhm_file = q;
1850 }
1851 #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
1852 else if (strcmp(p, "async_operations") == 0) {
1853 opt.async_operations = q;
1854 } else if (strcmp(p, "async_private_delay1") == 0) {
1855 opt.async_private_delay1 = atoi(q);
1856 } else if (strcmp(p, "async_private_delay2") == 0) {
1857 opt.async_private_delay2 = atoi(q);
1858 } else if (strcmp(p, "async_private_error") == 0) {
1859 int n = atoi(q);
1860 if (n < -SSL_ASYNC_INJECT_ERROR_MAX ||
1861 n > SSL_ASYNC_INJECT_ERROR_MAX) {
1862 ret = 2;
1863 goto usage;
1864 }
1865 opt.async_private_error = n;
1866 }
1867 #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
1868 #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
1869 else if (strcmp(p, "cid") == 0) {
1870 opt.cid_enabled = atoi(q);
1871 if (opt.cid_enabled != 0 && opt.cid_enabled != 1) {
1872 goto usage;
1873 }
1874 } else if (strcmp(p, "cid_renego") == 0) {
1875 opt.cid_enabled_renego = atoi(q);
1876 if (opt.cid_enabled_renego != 0 && opt.cid_enabled_renego != 1) {
1877 goto usage;
1878 }
1879 } else if (strcmp(p, "cid_val") == 0) {
1880 opt.cid_val = q;
1881 } else if (strcmp(p, "cid_val_renego") == 0) {
1882 opt.cid_val_renego = q;
1883 }
1884 #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1885 else if (strcmp(p, "psk") == 0) {
1886 opt.psk = q;
1887 }
1888 #if defined(MBEDTLS_USE_PSA_CRYPTO)
1889 else if (strcmp(p, "psk_opaque") == 0) {
1890 opt.psk_opaque = atoi(q);
1891 } else if (strcmp(p, "psk_list_opaque") == 0) {
1892 opt.psk_list_opaque = atoi(q);
1893 }
1894 #endif
1895 #if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
1896 else if (strcmp(p, "ca_callback") == 0) {
1897 opt.ca_callback = atoi(q);
1898 }
1899 #endif
1900 else if (strcmp(p, "psk_identity") == 0) {
1901 opt.psk_identity = q;
1902 } else if (strcmp(p, "psk_list") == 0) {
1903 opt.psk_list = q;
1904 } else if (strcmp(p, "ecjpake_pw") == 0) {
1905 opt.ecjpake_pw = q;
1906 }
1907 #if defined(MBEDTLS_USE_PSA_CRYPTO)
1908 else if (strcmp(p, "ecjpake_pw_opaque") == 0) {
1909 opt.ecjpake_pw_opaque = atoi(q);
1910 }
1911 #endif
1912 else if (strcmp(p, "force_ciphersuite") == 0) {
1913 opt.force_ciphersuite[0] = mbedtls_ssl_get_ciphersuite_id(q);
1914
1915 if (opt.force_ciphersuite[0] == 0) {
1916 ret = 2;
1917 goto usage;
1918 }
1919 opt.force_ciphersuite[1] = 0;
1920 } else if (strcmp(p, "curves") == 0) {
1921 opt.curves = q;
1922 }
1923 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
1924 else if (strcmp(p, "sig_algs") == 0) {
1925 opt.sig_algs = q;
1926 }
1927 #endif
1928 #if defined(MBEDTLS_SSL_EARLY_DATA)
1929 else if (strcmp(p, "max_early_data_size") == 0) {
1930 long long value = atoll(q);
1931 tls13_early_data_enabled =
1932 value >= 0 ? MBEDTLS_SSL_EARLY_DATA_ENABLED :
1933 MBEDTLS_SSL_EARLY_DATA_DISABLED;
1934 if (tls13_early_data_enabled) {
1935 opt.max_early_data_size = atoi(q);
1936 }
1937 }
1938 #endif /* MBEDTLS_SSL_EARLY_DATA */
1939 else if (strcmp(p, "renegotiation") == 0) {
1940 opt.renegotiation = (atoi(q)) ?
1941 MBEDTLS_SSL_RENEGOTIATION_ENABLED :
1942 MBEDTLS_SSL_RENEGOTIATION_DISABLED;
1943 } else if (strcmp(p, "allow_legacy") == 0) {
1944 switch (atoi(q)) {
1945 case -1:
1946 opt.allow_legacy = MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE;
1947 break;
1948 case 0:
1949 opt.allow_legacy = MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION;
1950 break;
1951 case 1:
1952 opt.allow_legacy = MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION;
1953 break;
1954 default: goto usage;
1955 }
1956 } else if (strcmp(p, "renegotiate") == 0) {
1957 opt.renegotiate = atoi(q);
1958 if (opt.renegotiate < 0 || opt.renegotiate > 1) {
1959 goto usage;
1960 }
1961 } else if (strcmp(p, "renego_delay") == 0) {
1962 opt.renego_delay = atoi(q);
1963 } else if (strcmp(p, "renego_period") == 0) {
1964 #if defined(_MSC_VER)
1965 opt.renego_period = _strtoui64(q, NULL, 10);
1966 #else
1967 if (sscanf(q, "%" SCNu64, &opt.renego_period) != 1) {
1968 goto usage;
1969 }
1970 #endif /* _MSC_VER */
1971 if (opt.renego_period < 2) {
1972 goto usage;
1973 }
1974 } else if (strcmp(p, "exchanges") == 0) {
1975 opt.exchanges = atoi(q);
1976 if (opt.exchanges < 0) {
1977 goto usage;
1978 }
1979 }
1980 #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
1981 else if (strcmp(p, "tls13_kex_modes") == 0) {
1982 if (strcmp(q, "psk") == 0) {
1983 opt.tls13_kex_modes = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK;
1984 } else if (strcmp(q, "psk_ephemeral") == 0) {
1985 opt.tls13_kex_modes = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL;
1986 } else if (strcmp(q, "ephemeral") == 0) {
1987 opt.tls13_kex_modes = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL;
1988 } else if (strcmp(q, "ephemeral_all") == 0) {
1989 opt.tls13_kex_modes = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ALL;
1990 } else if (strcmp(q, "psk_all") == 0) {
1991 opt.tls13_kex_modes = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ALL;
1992 } else if (strcmp(q, "all") == 0) {
1993 opt.tls13_kex_modes = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_ALL;
1994 }
1995 /* The purpose of `psk_or_ephemeral` is to improve test coverage. That
1996 * is not recommended in practice.
1997 * `psk_or_ephemeral` exists in theory, we need this mode to test if
1998 * this setting work correctly. With this key exchange setting, server
1999 * should always perform `ephemeral` handshake. `psk` or `psk_ephemeral`
2000 * is not expected.
2001 */
2002 else if (strcmp(q, "psk_or_ephemeral") == 0) {
2003 opt.tls13_kex_modes = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK |
2004 MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL;
2005 } else {
2006 goto usage;
2007 }
2008 }
2009 #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
2010
2011 else if (strcmp(p, "min_version") == 0) {
2012 if (strcmp(q, "tls12") == 0 ||
2013 strcmp(q, "dtls12") == 0) {
2014 opt.min_version = MBEDTLS_SSL_VERSION_TLS1_2;
2015 }
2016 #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2017 else if (strcmp(q, "tls13") == 0) {
2018 opt.min_version = MBEDTLS_SSL_VERSION_TLS1_3;
2019 }
2020 #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
2021 else {
2022 goto usage;
2023 }
2024 } else if (strcmp(p, "max_version") == 0) {
2025 if (strcmp(q, "tls12") == 0 ||
2026 strcmp(q, "dtls12") == 0) {
2027 opt.max_version = MBEDTLS_SSL_VERSION_TLS1_2;
2028 }
2029 #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2030 else if (strcmp(q, "tls13") == 0) {
2031 opt.max_version = MBEDTLS_SSL_VERSION_TLS1_3;
2032 }
2033 #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
2034 else {
2035 goto usage;
2036 }
2037 } else if (strcmp(p, "allow_sha1") == 0) {
2038 switch (atoi(q)) {
2039 case 0: opt.allow_sha1 = 0; break;
2040 case 1: opt.allow_sha1 = 1; break;
2041 default: goto usage;
2042 }
2043 } else if (strcmp(p, "force_version") == 0) {
2044 if (strcmp(q, "tls12") == 0) {
2045 opt.min_version = MBEDTLS_SSL_VERSION_TLS1_2;
2046 opt.max_version = MBEDTLS_SSL_VERSION_TLS1_2;
2047 } else if (strcmp(q, "dtls12") == 0) {
2048 opt.min_version = MBEDTLS_SSL_VERSION_TLS1_2;
2049 opt.max_version = MBEDTLS_SSL_VERSION_TLS1_2;
2050 opt.transport = MBEDTLS_SSL_TRANSPORT_DATAGRAM;
2051 }
2052 #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2053 else if (strcmp(q, "tls13") == 0) {
2054 opt.min_version = MBEDTLS_SSL_VERSION_TLS1_3;
2055 opt.max_version = MBEDTLS_SSL_VERSION_TLS1_3;
2056 }
2057 #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
2058 else {
2059 goto usage;
2060 }
2061 } else if (strcmp(p, "auth_mode") == 0) {
2062 if ((opt.auth_mode = get_auth_mode(q)) < 0) {
2063 goto usage;
2064 }
2065 } else if (strcmp(p, "cert_req_ca_list") == 0) {
2066 opt.cert_req_ca_list = atoi(q);
2067 if (opt.cert_req_ca_list < 0 || opt.cert_req_ca_list > 3) {
2068 goto usage;
2069 }
2070 if (opt.cert_req_ca_list > 1) {
2071 opt.cert_req_dn_hint = opt.cert_req_ca_list;
2072 opt.cert_req_ca_list = MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED;
2073 }
2074 } else if (strcmp(p, "max_frag_len") == 0) {
2075 if (strcmp(q, "512") == 0) {
2076 opt.mfl_code = MBEDTLS_SSL_MAX_FRAG_LEN_512;
2077 } else if (strcmp(q, "1024") == 0) {
2078 opt.mfl_code = MBEDTLS_SSL_MAX_FRAG_LEN_1024;
2079 } else if (strcmp(q, "2048") == 0) {
2080 opt.mfl_code = MBEDTLS_SSL_MAX_FRAG_LEN_2048;
2081 } else if (strcmp(q, "4096") == 0) {
2082 opt.mfl_code = MBEDTLS_SSL_MAX_FRAG_LEN_4096;
2083 } else {
2084 goto usage;
2085 }
2086 } else if (strcmp(p, "alpn") == 0) {
2087 opt.alpn_string = q;
2088 } else if (strcmp(p, "trunc_hmac") == 0) {
2089 switch (atoi(q)) {
2090 case 0: opt.trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_DISABLED; break;
2091 case 1: opt.trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED; break;
2092 default: goto usage;
2093 }
2094 } else if (strcmp(p, "extended_ms") == 0) {
2095 switch (atoi(q)) {
2096 case 0:
2097 opt.extended_ms = MBEDTLS_SSL_EXTENDED_MS_DISABLED;
2098 break;
2099 case 1:
2100 opt.extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
2101 break;
2102 default: goto usage;
2103 }
2104 } else if (strcmp(p, "etm") == 0) {
2105 switch (atoi(q)) {
2106 case 0: opt.etm = MBEDTLS_SSL_ETM_DISABLED; break;
2107 case 1: opt.etm = MBEDTLS_SSL_ETM_ENABLED; break;
2108 default: goto usage;
2109 }
2110 } else if (strcmp(p, "tickets") == 0) {
2111 opt.tickets = atoi(q);
2112 if (opt.tickets < 0) {
2113 goto usage;
2114 }
2115 } else if (strcmp(p, "dummy_ticket") == 0) {
2116 opt.dummy_ticket = atoi(q);
2117 if (opt.dummy_ticket < 0) {
2118 goto usage;
2119 }
2120 } else if (strcmp(p, "ticket_rotate") == 0) {
2121 opt.ticket_rotate = atoi(q);
2122 if (opt.ticket_rotate < 0 || opt.ticket_rotate > 1) {
2123 goto usage;
2124 }
2125 } else if (strcmp(p, "ticket_timeout") == 0) {
2126 opt.ticket_timeout = atoi(q);
2127 if (opt.ticket_timeout < 0) {
2128 goto usage;
2129 }
2130 } else if (strcmp(p, "ticket_aead") == 0) {
2131 const mbedtls_cipher_info_t *ci = mbedtls_cipher_info_from_string(q);
2132
2133 if (ci == NULL) {
2134 goto usage;
2135 }
2136 opt.ticket_aead = mbedtls_cipher_info_get_type(ci);
2137 } else if (strcmp(p, "cache_max") == 0) {
2138 opt.cache_max = atoi(q);
2139 if (opt.cache_max < 0) {
2140 goto usage;
2141 }
2142 }
2143 #if defined(MBEDTLS_HAVE_TIME)
2144 else if (strcmp(p, "cache_timeout") == 0) {
2145 opt.cache_timeout = atoi(q);
2146 if (opt.cache_timeout < 0) {
2147 goto usage;
2148 }
2149 }
2150 #endif
2151 else if (strcmp(p, "cache_remove") == 0) {
2152 opt.cache_remove = atoi(q);
2153 if (opt.cache_remove < 0 || opt.cache_remove > 1) {
2154 goto usage;
2155 }
2156 } else if (strcmp(p, "cookies") == 0) {
2157 opt.cookies = atoi(q);
2158 if (opt.cookies < -1 || opt.cookies > 1) {
2159 goto usage;
2160 }
2161 } else if (strcmp(p, "anti_replay") == 0) {
2162 opt.anti_replay = atoi(q);
2163 if (opt.anti_replay < 0 || opt.anti_replay > 1) {
2164 goto usage;
2165 }
2166 } else if (strcmp(p, "badmac_limit") == 0) {
2167 opt.badmac_limit = atoi(q);
2168 if (opt.badmac_limit < 0) {
2169 goto usage;
2170 }
2171 } else if (strcmp(p, "hs_timeout") == 0) {
2172 if ((p = strchr(q, '-')) == NULL) {
2173 goto usage;
2174 }
2175 *p++ = '\0';
2176 opt.hs_to_min = atoi(q);
2177 opt.hs_to_max = atoi(p);
2178 if (opt.hs_to_min == 0 || opt.hs_to_max < opt.hs_to_min) {
2179 goto usage;
2180 }
2181 } else if (strcmp(p, "mtu") == 0) {
2182 opt.dtls_mtu = atoi(q);
2183 if (opt.dtls_mtu < 0) {
2184 goto usage;
2185 }
2186 } else if (strcmp(p, "dgram_packing") == 0) {
2187 opt.dgram_packing = atoi(q);
2188 if (opt.dgram_packing != 0 &&
2189 opt.dgram_packing != 1) {
2190 goto usage;
2191 }
2192 } else if (strcmp(p, "sni") == 0) {
2193 opt.sni = q;
2194 } else if (strcmp(p, "query_config") == 0) {
2195 opt.query_config_mode = 1;
2196 query_config_ret = query_config(q);
2197 goto exit;
2198 } else if (strcmp(p, "serialize") == 0) {
2199 opt.serialize = atoi(q);
2200 if (opt.serialize < 0 || opt.serialize > 2) {
2201 goto usage;
2202 }
2203 } else if (strcmp(p, "context_file") == 0) {
2204 opt.context_file = q;
2205 } else if (strcmp(p, "eap_tls") == 0) {
2206 opt.eap_tls = atoi(q);
2207 if (opt.eap_tls < 0 || opt.eap_tls > 1) {
2208 goto usage;
2209 }
2210 } else if (strcmp(p, "reproducible") == 0) {
2211 opt.reproducible = 1;
2212 } else if (strcmp(p, "nss_keylog") == 0) {
2213 opt.nss_keylog = atoi(q);
2214 if (opt.nss_keylog < 0 || opt.nss_keylog > 1) {
2215 goto usage;
2216 }
2217 } else if (strcmp(p, "nss_keylog_file") == 0) {
2218 opt.nss_keylog_file = q;
2219 } else if (strcmp(p, "use_srtp") == 0) {
2220 opt.use_srtp = atoi(q);
2221 } else if (strcmp(p, "srtp_force_profile") == 0) {
2222 opt.force_srtp_profile = atoi(q);
2223 } else if (strcmp(p, "support_mki") == 0) {
2224 opt.support_mki = atoi(q);
2225 } else if (strcmp(p, "key_opaque_algs") == 0) {
2226 if (key_opaque_alg_parse(q, &opt.key1_opaque_alg1,
2227 &opt.key1_opaque_alg2) != 0) {
2228 goto usage;
2229 }
2230 } else if (strcmp(p, "key_opaque_algs2") == 0) {
2231 if (key_opaque_alg_parse(q, &opt.key2_opaque_alg1,
2232 &opt.key2_opaque_alg2) != 0) {
2233 goto usage;
2234 }
2235 } else {
2236 goto usage;
2237 }
2238 }
2239
2240 if (opt.nss_keylog != 0 && opt.eap_tls != 0) {
2241 mbedtls_printf("Error: eap_tls and nss_keylog options cannot be used together.\n");
2242 goto usage;
2243 }
2244
2245 /* Event-driven IO is incompatible with the above custom
2246 * receive and send functions, as the polling builds on
2247 * refers to the underlying net_context. */
2248 if (opt.event == 1 && opt.nbio != 1) {
2249 mbedtls_printf("Warning: event-driven IO mandates nbio=1 - overwrite\n");
2250 opt.nbio = 1;
2251 }
2252
2253 #if defined(MBEDTLS_DEBUG_C)
2254 mbedtls_debug_set_threshold(opt.debug_level);
2255 #endif
2256
2257 /* buf will alternatively contain the input read from the client and the
2258 * response that's about to be sent, plus a null byte in each case. */
2259 size_t buf_content_size = opt.buffer_size;
2260 /* The default response contains the ciphersuite name. Leave enough
2261 * room for that plus some margin. */
2262 if (buf_content_size < strlen(HTTP_RESPONSE) + 80) {
2263 buf_content_size = strlen(HTTP_RESPONSE) + 80;
2264 }
2265 if (opt.response_size != DFL_RESPONSE_SIZE &&
2266 buf_content_size < (size_t) opt.response_size) {
2267 buf_content_size = opt.response_size;
2268 }
2269 buf = mbedtls_calloc(1, buf_content_size + 1);
2270 if (buf == NULL) {
2271 mbedtls_printf("Could not allocate %lu bytes\n",
2272 (unsigned long) buf_content_size + 1);
2273 ret = 3;
2274 goto exit;
2275 }
2276
2277 #if defined(MBEDTLS_USE_PSA_CRYPTO)
2278 if (opt.psk_opaque != 0) {
2279 if (strlen(opt.psk) == 0) {
2280 mbedtls_printf("psk_opaque set but no psk to be imported specified.\n");
2281 ret = 2;
2282 goto usage;
2283 }
2284
2285 if (opt.force_ciphersuite[0] <= 0) {
2286 mbedtls_printf(
2287 "opaque PSKs are only supported in conjunction with forcing TLS 1.2 and a PSK-only ciphersuite through the 'force_ciphersuite' option.\n");
2288 ret = 2;
2289 goto usage;
2290 }
2291 }
2292
2293 if (opt.psk_list_opaque != 0) {
2294 if (opt.psk_list == NULL) {
2295 mbedtls_printf("psk_slot set but no psk to be imported specified.\n");
2296 ret = 2;
2297 goto usage;
2298 }
2299
2300 if (opt.force_ciphersuite[0] <= 0) {
2301 mbedtls_printf(
2302 "opaque PSKs are only supported in conjunction with forcing TLS 1.2 and a PSK-only ciphersuite through the 'force_ciphersuite' option.\n");
2303 ret = 2;
2304 goto usage;
2305 }
2306 }
2307 #endif /* MBEDTLS_USE_PSA_CRYPTO */
2308
2309 if (opt.force_ciphersuite[0] > 0) {
2310 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
2311 ciphersuite_info =
2312 mbedtls_ssl_ciphersuite_from_id(opt.force_ciphersuite[0]);
2313
2314 if (opt.max_version != -1 &&
2315 ciphersuite_info->min_tls_version > opt.max_version) {
2316 mbedtls_printf("forced ciphersuite not allowed with this protocol version\n");
2317 ret = 2;
2318 goto usage;
2319 }
2320 if (opt.min_version != -1 &&
2321 ciphersuite_info->max_tls_version < opt.min_version) {
2322 mbedtls_printf("forced ciphersuite not allowed with this protocol version\n");
2323 ret = 2;
2324 goto usage;
2325 }
2326
2327 /* If we select a version that's not supported by
2328 * this suite, then there will be no common ciphersuite... */
2329 if (opt.max_version == -1 ||
2330 opt.max_version > ciphersuite_info->max_tls_version) {
2331 opt.max_version = ciphersuite_info->max_tls_version;
2332 }
2333 if (opt.min_version < ciphersuite_info->min_tls_version) {
2334 opt.min_version = ciphersuite_info->min_tls_version;
2335 }
2336
2337 #if defined(MBEDTLS_USE_PSA_CRYPTO)
2338 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
2339 if (opt.psk_opaque != 0 || opt.psk_list_opaque != 0) {
2340 /* Determine KDF algorithm the opaque PSK will be used in. */
2341 #if defined(MBEDTLS_HAS_ALG_SHA_384_VIA_MD_OR_PSA_BASED_ON_USE_PSA)
2342 if (ciphersuite_info->mac == MBEDTLS_MD_SHA384) {
2343 alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_384);
2344 } else
2345 #endif /* MBEDTLS_HAS_ALG_SHA_384_VIA_MD_OR_PSA_BASED_ON_USE_PSA */
2346 alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_256);
2347 }
2348 #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */
2349 #endif /* MBEDTLS_USE_PSA_CRYPTO */
2350 }
2351
2352 #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
2353 if (mbedtls_test_unhexify(cid, sizeof(cid),
2354 opt.cid_val, &cid_len) != 0) {
2355 mbedtls_printf("CID not valid hex\n");
2356 goto exit;
2357 }
2358
2359 /* Keep CID settings for renegotiation unless
2360 * specified otherwise. */
2361 if (opt.cid_enabled_renego == DFL_CID_ENABLED_RENEGO) {
2362 opt.cid_enabled_renego = opt.cid_enabled;
2363 }
2364 if (opt.cid_val_renego == DFL_CID_VALUE_RENEGO) {
2365 opt.cid_val_renego = opt.cid_val;
2366 }
2367
2368 if (mbedtls_test_unhexify(cid_renego, sizeof(cid_renego),
2369 opt.cid_val_renego, &cid_renego_len) != 0) {
2370 mbedtls_printf("CID not valid hex\n");
2371 goto exit;
2372 }
2373 #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
2374
2375 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
2376 /*
2377 * Unhexify the pre-shared key and parse the list if any given
2378 */
2379 if (mbedtls_test_unhexify(psk, sizeof(psk),
2380 opt.psk, &psk_len) != 0) {
2381 mbedtls_printf("pre-shared key not valid hex\n");
2382 goto exit;
2383 }
2384
2385 if (opt.psk_list != NULL) {
2386 if ((psk_info = psk_parse(opt.psk_list)) == NULL) {
2387 mbedtls_printf("psk_list invalid");
2388 goto exit;
2389 }
2390 }
2391 #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */
2392
2393 #if defined(MBEDTLS_ECP_C)
2394 if (opt.curves != NULL) {
2395 p = (char *) opt.curves;
2396 i = 0;
2397
2398 if (strcmp(p, "none") == 0) {
2399 group_list[0] = 0;
2400 } else if (strcmp(p, "default") != 0) {
2401 /* Leave room for a final NULL in curve list */
2402 while (i < CURVE_LIST_SIZE - 1 && *p != '\0') {
2403 q = p;
2404
2405 /* Terminate the current string */
2406 while (*p != ',' && *p != '\0') {
2407 p++;
2408 }
2409 if (*p == ',') {
2410 *p++ = '\0';
2411 }
2412
2413 if ((curve_cur = mbedtls_ecp_curve_info_from_name(q)) != NULL) {
2414 group_list[i++] = curve_cur->tls_id;
2415 } else {
2416 mbedtls_printf("unknown curve %s\n", q);
2417 mbedtls_printf("supported curves: ");
2418 for (curve_cur = mbedtls_ecp_curve_list();
2419 curve_cur->grp_id != MBEDTLS_ECP_DP_NONE;
2420 curve_cur++) {
2421 mbedtls_printf("%s ", curve_cur->name);
2422 }
2423 mbedtls_printf("\n");
2424 goto exit;
2425 }
2426 }
2427
2428 mbedtls_printf("Number of curves: %d\n", i);
2429
2430 if (i == CURVE_LIST_SIZE - 1 && *p != '\0') {
2431 mbedtls_printf("curves list too long, maximum %d",
2432 CURVE_LIST_SIZE - 1);
2433 goto exit;
2434 }
2435
2436 group_list[i] = 0;
2437 }
2438 }
2439 #endif /* MBEDTLS_ECP_C */
2440
2441 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
2442 if (opt.sig_algs != NULL) {
2443 p = (char *) opt.sig_algs;
2444 i = 0;
2445
2446 /* Leave room for a final MBEDTLS_TLS1_3_SIG_NONE in signature algorithm list (sig_alg_list). */
2447 while (i < SIG_ALG_LIST_SIZE - 1 && *p != '\0') {
2448 q = p;
2449
2450 /* Terminate the current string */
2451 while (*p != ',' && *p != '\0') {
2452 p++;
2453 }
2454 if (*p == ',') {
2455 *p++ = '\0';
2456 }
2457
2458 if (strcmp(q, "rsa_pkcs1_sha256") == 0) {
2459 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA256;
2460 } else if (strcmp(q, "rsa_pkcs1_sha384") == 0) {
2461 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA384;
2462 } else if (strcmp(q, "rsa_pkcs1_sha512") == 0) {
2463 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA512;
2464 } else if (strcmp(q, "ecdsa_secp256r1_sha256") == 0) {
2465 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_ECDSA_SECP256R1_SHA256;
2466 } else if (strcmp(q, "ecdsa_secp384r1_sha384") == 0) {
2467 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_ECDSA_SECP384R1_SHA384;
2468 } else if (strcmp(q, "ecdsa_secp521r1_sha512") == 0) {
2469 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_ECDSA_SECP521R1_SHA512;
2470 } else if (strcmp(q, "rsa_pss_rsae_sha256") == 0) {
2471 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA256;
2472 } else if (strcmp(q, "rsa_pss_rsae_sha384") == 0) {
2473 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA384;
2474 } else if (strcmp(q, "rsa_pss_rsae_sha512") == 0) {
2475 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA512;
2476 } else if (strcmp(q, "ed25519") == 0) {
2477 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_ED25519;
2478 } else if (strcmp(q, "ed448") == 0) {
2479 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_ED448;
2480 } else if (strcmp(q, "rsa_pss_pss_sha256") == 0) {
2481 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_RSA_PSS_PSS_SHA256;
2482 } else if (strcmp(q, "rsa_pss_pss_sha384") == 0) {
2483 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_RSA_PSS_PSS_SHA384;
2484 } else if (strcmp(q, "rsa_pss_pss_sha512") == 0) {
2485 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_RSA_PSS_PSS_SHA512;
2486 } else if (strcmp(q, "rsa_pkcs1_sha1") == 0) {
2487 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA1;
2488 } else if (strcmp(q, "ecdsa_sha1") == 0) {
2489 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_ECDSA_SHA1;
2490 } else {
2491 ret = -1;
2492 mbedtls_printf("unknown signature algorithm \"%s\"\n", q);
2493 mbedtls_print_supported_sig_algs();
2494 goto exit;
2495 }
2496 }
2497
2498 if (i == (SIG_ALG_LIST_SIZE - 1) && *p != '\0') {
2499 mbedtls_printf("signature algorithm list too long, maximum %d",
2500 SIG_ALG_LIST_SIZE - 1);
2501 goto exit;
2502 }
2503
2504 sig_alg_list[i] = MBEDTLS_TLS1_3_SIG_NONE;
2505 }
2506 #endif
2507
2508 #if defined(MBEDTLS_SSL_ALPN)
2509 if (opt.alpn_string != NULL) {
2510 p = (char *) opt.alpn_string;
2511 i = 0;
2512
2513 /* Leave room for a final NULL in alpn_list */
2514 while (i < ALPN_LIST_SIZE - 1 && *p != '\0') {
2515 alpn_list[i++] = p;
2516
2517 /* Terminate the current string and move on to next one */
2518 while (*p != ',' && *p != '\0') {
2519 p++;
2520 }
2521 if (*p == ',') {
2522 *p++ = '\0';
2523 }
2524 }
2525 }
2526 #endif /* MBEDTLS_SSL_ALPN */
2527
2528 mbedtls_printf("build version: %s (build %d)\n",
2529 MBEDTLS_VERSION_STRING_FULL, MBEDTLS_VERSION_NUMBER);
2530
2531 /*
2532 * 0. Initialize the RNG and the session data
2533 */
2534 mbedtls_printf("\n . Seeding the random number generator...");
2535 fflush(stdout);
2536
2537 ret = rng_seed(&rng, opt.reproducible, pers);
2538 if (ret != 0) {
2539 goto exit;
2540 }
2541 mbedtls_printf(" ok\n");
2542
2543 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
2544 /*
2545 * 1.1. Load the trusted CA
2546 */
2547 mbedtls_printf(" . Loading the CA root certificate ...");
2548 fflush(stdout);
2549
2550 if (strcmp(opt.ca_path, "none") == 0 ||
2551 strcmp(opt.ca_file, "none") == 0) {
2552 ret = 0;
2553 } else
2554 #if defined(MBEDTLS_FS_IO)
2555 if (strlen(opt.ca_path)) {
2556 ret = mbedtls_x509_crt_parse_path(&cacert, opt.ca_path);
2557 } else if (strlen(opt.ca_file)) {
2558 ret = mbedtls_x509_crt_parse_file(&cacert, opt.ca_file);
2559 } else
2560 #endif
2561 {
2562 #if defined(MBEDTLS_PEM_PARSE_C)
2563 for (i = 0; mbedtls_test_cas[i] != NULL; i++) {
2564 ret = mbedtls_x509_crt_parse(&cacert,
2565 (const unsigned char *) mbedtls_test_cas[i],
2566 mbedtls_test_cas_len[i]);
2567 if (ret != 0) {
2568 break;
2569 }
2570 }
2571 #endif /* MBEDTLS_PEM_PARSE_C */
2572 if (ret == 0) {
2573 for (i = 0; mbedtls_test_cas_der[i] != NULL; i++) {
2574 ret = mbedtls_x509_crt_parse_der(&cacert,
2575 (const unsigned char *) mbedtls_test_cas_der[i],
2576 mbedtls_test_cas_der_len[i]);
2577 if (ret != 0) {
2578 break;
2579 }
2580 }
2581 }
2582 }
2583 if (ret < 0) {
2584 mbedtls_printf(" failed\n ! mbedtls_x509_crt_parse returned -0x%x\n\n",
2585 (unsigned int) -ret);
2586 goto exit;
2587 }
2588
2589 mbedtls_printf(" ok (%d skipped)\n", ret);
2590
2591 /*
2592 * 1.2. Load own certificate and private key
2593 */
2594 mbedtls_printf(" . Loading the server cert. and key...");
2595 fflush(stdout);
2596
2597 #if defined(MBEDTLS_FS_IO)
2598 if (strlen(opt.crt_file) && strcmp(opt.crt_file, "none") != 0) {
2599 key_cert_init++;
2600 if ((ret = mbedtls_x509_crt_parse_file(&srvcert, opt.crt_file)) != 0) {
2601 mbedtls_printf(" failed\n ! mbedtls_x509_crt_parse_file returned -0x%x\n\n",
2602 (unsigned int) -ret);
2603 goto exit;
2604 }
2605 }
2606 if (strlen(opt.key_file) && strcmp(opt.key_file, "none") != 0) {
2607 key_cert_init++;
2608 if ((ret = mbedtls_pk_parse_keyfile(&pkey, opt.key_file,
2609 opt.key_pwd, rng_get, &rng)) != 0) {
2610 mbedtls_printf(" failed\n ! mbedtls_pk_parse_keyfile returned -0x%x\n\n",
2611 (unsigned int) -ret);
2612 goto exit;
2613 }
2614 }
2615 if (key_cert_init == 1) {
2616 mbedtls_printf(" failed\n ! crt_file without key_file or vice-versa\n\n");
2617 goto exit;
2618 }
2619
2620 if (strlen(opt.crt_file2) && strcmp(opt.crt_file2, "none") != 0) {
2621 key_cert_init2++;
2622 if ((ret = mbedtls_x509_crt_parse_file(&srvcert2, opt.crt_file2)) != 0) {
2623 mbedtls_printf(" failed\n ! mbedtls_x509_crt_parse_file(2) returned -0x%x\n\n",
2624 (unsigned int) -ret);
2625 goto exit;
2626 }
2627 }
2628 if (strlen(opt.key_file2) && strcmp(opt.key_file2, "none") != 0) {
2629 key_cert_init2++;
2630 if ((ret = mbedtls_pk_parse_keyfile(&pkey2, opt.key_file2,
2631 opt.key_pwd2, rng_get, &rng)) != 0) {
2632 mbedtls_printf(" failed\n ! mbedtls_pk_parse_keyfile(2) returned -0x%x\n\n",
2633 (unsigned int) -ret);
2634 goto exit;
2635 }
2636 }
2637 if (key_cert_init2 == 1) {
2638 mbedtls_printf(" failed\n ! crt_file2 without key_file2 or vice-versa\n\n");
2639 goto exit;
2640 }
2641 #endif
2642 if (key_cert_init == 0 &&
2643 strcmp(opt.crt_file, "none") != 0 &&
2644 strcmp(opt.key_file, "none") != 0 &&
2645 key_cert_init2 == 0 &&
2646 strcmp(opt.crt_file2, "none") != 0 &&
2647 strcmp(opt.key_file2, "none") != 0) {
2648 #if defined(MBEDTLS_RSA_C)
2649 if ((ret = mbedtls_x509_crt_parse(&srvcert,
2650 (const unsigned char *) mbedtls_test_srv_crt_rsa,
2651 mbedtls_test_srv_crt_rsa_len)) != 0) {
2652 mbedtls_printf(" failed\n ! mbedtls_x509_crt_parse returned -0x%x\n\n",
2653 (unsigned int) -ret);
2654 goto exit;
2655 }
2656 if ((ret = mbedtls_pk_parse_key(&pkey,
2657 (const unsigned char *) mbedtls_test_srv_key_rsa,
2658 mbedtls_test_srv_key_rsa_len, NULL, 0,
2659 rng_get, &rng)) != 0) {
2660 mbedtls_printf(" failed\n ! mbedtls_pk_parse_key returned -0x%x\n\n",
2661 (unsigned int) -ret);
2662 goto exit;
2663 }
2664 key_cert_init = 2;
2665 #endif /* MBEDTLS_RSA_C */
2666 #if defined(MBEDTLS_PK_CAN_ECDSA_SOME)
2667 if ((ret = mbedtls_x509_crt_parse(&srvcert2,
2668 (const unsigned char *) mbedtls_test_srv_crt_ec,
2669 mbedtls_test_srv_crt_ec_len)) != 0) {
2670 mbedtls_printf(" failed\n ! x509_crt_parse2 returned -0x%x\n\n",
2671 (unsigned int) -ret);
2672 goto exit;
2673 }
2674 if ((ret = mbedtls_pk_parse_key(&pkey2,
2675 (const unsigned char *) mbedtls_test_srv_key_ec,
2676 mbedtls_test_srv_key_ec_len, NULL, 0,
2677 rng_get, &rng)) != 0) {
2678 mbedtls_printf(" failed\n ! pk_parse_key2 returned -0x%x\n\n",
2679 (unsigned int) -ret);
2680 goto exit;
2681 }
2682 key_cert_init2 = 2;
2683 #endif /* MBEDTLS_PK_CAN_ECDSA_SOME */
2684 }
2685
2686 #if defined(MBEDTLS_USE_PSA_CRYPTO)
2687 if (opt.key_opaque != 0) {
2688 psa_algorithm_t psa_alg, psa_alg2 = PSA_ALG_NONE;
2689 psa_key_usage_t psa_usage = 0;
2690
2691 if (key_opaque_set_alg_usage(opt.key1_opaque_alg1,
2692 opt.key1_opaque_alg2,
2693 &psa_alg, &psa_alg2,
2694 &psa_usage,
2695 mbedtls_pk_get_type(&pkey)) == 0) {
2696 ret = mbedtls_pk_wrap_as_opaque(&pkey, &key_slot,
2697 psa_alg, psa_usage, psa_alg2);
2698
2699 if (ret != 0) {
2700 mbedtls_printf(" failed\n ! "
2701 "mbedtls_pk_wrap_as_opaque returned -0x%x\n\n",
2702 (unsigned int) -ret);
2703 goto exit;
2704 }
2705 }
2706
2707 psa_alg = PSA_ALG_NONE; psa_alg2 = PSA_ALG_NONE;
2708 psa_usage = 0;
2709
2710 if (key_opaque_set_alg_usage(opt.key2_opaque_alg1,
2711 opt.key2_opaque_alg2,
2712 &psa_alg, &psa_alg2,
2713 &psa_usage,
2714 mbedtls_pk_get_type(&pkey2)) == 0) {
2715 ret = mbedtls_pk_wrap_as_opaque(&pkey2, &key_slot2,
2716 psa_alg, psa_usage, psa_alg2);
2717
2718 if (ret != 0) {
2719 mbedtls_printf(" failed\n ! "
2720 "mbedtls_pk_wrap_as_opaque returned -0x%x\n\n",
2721 (unsigned int) -ret);
2722 goto exit;
2723 }
2724 }
2725 }
2726 #endif /* MBEDTLS_USE_PSA_CRYPTO */
2727
2728 mbedtls_printf(" ok (key types: %s, %s)\n",
2729 key_cert_init ? mbedtls_pk_get_name(&pkey) : "none",
2730 key_cert_init2 ? mbedtls_pk_get_name(&pkey2) : "none");
2731 #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
2732
2733 #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_FS_IO)
2734 if (opt.dhm_file != NULL) {
2735 mbedtls_printf(" . Loading DHM parameters...");
2736 fflush(stdout);
2737
2738 if ((ret = mbedtls_dhm_parse_dhmfile(&dhm, opt.dhm_file)) != 0) {
2739 mbedtls_printf(" failed\n ! mbedtls_dhm_parse_dhmfile returned -0x%04X\n\n",
2740 (unsigned int) -ret);
2741 goto exit;
2742 }
2743
2744 mbedtls_printf(" ok\n");
2745 }
2746 #endif
2747
2748 #if defined(SNI_OPTION)
2749 if (opt.sni != NULL) {
2750 mbedtls_printf(" . Setting up SNI information...");
2751 fflush(stdout);
2752
2753 if ((sni_info = sni_parse(opt.sni)) == NULL) {
2754 mbedtls_printf(" failed\n");
2755 goto exit;
2756 }
2757
2758 mbedtls_printf(" ok\n");
2759 }
2760 #endif /* SNI_OPTION */
2761
2762 /*
2763 * 2. Setup stuff
2764 */
2765 mbedtls_printf(" . Setting up the SSL/TLS structure...");
2766 fflush(stdout);
2767
2768 if ((ret = mbedtls_ssl_config_defaults(&conf,
2769 MBEDTLS_SSL_IS_SERVER,
2770 opt.transport,
2771 MBEDTLS_SSL_PRESET_DEFAULT)) != 0) {
2772 mbedtls_printf(" failed\n ! mbedtls_ssl_config_defaults returned -0x%x\n\n",
2773 (unsigned int) -ret);
2774 goto exit;
2775 }
2776
2777 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
2778 /* The default algorithms profile disables SHA-1, but our tests still
2779 rely on it heavily. Hence we allow it here. A real-world server
2780 should use the default profile unless there is a good reason not to. */
2781 if (opt.allow_sha1 > 0) {
2782 crt_profile_for_test.allowed_mds |= MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA1);
2783 mbedtls_ssl_conf_cert_profile(&conf, &crt_profile_for_test);
2784 mbedtls_ssl_conf_sig_algs(&conf, ssl_sig_algs_for_test);
2785 }
2786 #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
2787
2788 if (opt.auth_mode != DFL_AUTH_MODE) {
2789 mbedtls_ssl_conf_authmode(&conf, opt.auth_mode);
2790 }
2791
2792 if (opt.cert_req_ca_list != DFL_CERT_REQ_CA_LIST) {
2793 mbedtls_ssl_conf_cert_req_ca_list(&conf, opt.cert_req_ca_list);
2794 }
2795
2796 #if defined(MBEDTLS_SSL_EARLY_DATA)
2797 mbedtls_ssl_tls13_conf_early_data(&conf, tls13_early_data_enabled);
2798 if (tls13_early_data_enabled == MBEDTLS_SSL_EARLY_DATA_ENABLED) {
2799 mbedtls_ssl_tls13_conf_max_early_data_size(
2800 &conf, opt.max_early_data_size);
2801 }
2802 #endif /* MBEDTLS_SSL_EARLY_DATA */
2803
2804 #if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
2805 /* exercise setting DN hints for server certificate request
2806 * (Intended for use where the client cert expected has been signed by
2807 * a specific CA which is an intermediate in a CA chain, not the root) */
2808 if (opt.cert_req_dn_hint == 2 && key_cert_init2) {
2809 mbedtls_ssl_conf_dn_hints(&conf, &srvcert2);
2810 }
2811 #endif
2812
2813 #if defined(MBEDTLS_SSL_PROTO_DTLS)
2814 if (opt.hs_to_min != DFL_HS_TO_MIN || opt.hs_to_max != DFL_HS_TO_MAX) {
2815 mbedtls_ssl_conf_handshake_timeout(&conf, opt.hs_to_min, opt.hs_to_max);
2816 }
2817
2818 if (opt.dgram_packing != DFL_DGRAM_PACKING) {
2819 mbedtls_ssl_set_datagram_packing(&ssl, opt.dgram_packing);
2820 }
2821 #endif /* MBEDTLS_SSL_PROTO_DTLS */
2822
2823 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
2824 if ((ret = mbedtls_ssl_conf_max_frag_len(&conf, opt.mfl_code)) != 0) {
2825 mbedtls_printf(" failed\n ! mbedtls_ssl_conf_max_frag_len returned %d\n\n", ret);
2826 goto exit;
2827 }
2828 #endif
2829
2830 #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
2831 if (opt.cid_enabled == 1 || opt.cid_enabled_renego == 1) {
2832 if (opt.cid_enabled == 1 &&
2833 opt.cid_enabled_renego == 1 &&
2834 cid_len != cid_renego_len) {
2835 mbedtls_printf("CID length must not change during renegotiation\n");
2836 goto usage;
2837 }
2838
2839 if (opt.cid_enabled == 1) {
2840 ret = mbedtls_ssl_conf_cid(&conf, cid_len,
2841 MBEDTLS_SSL_UNEXPECTED_CID_IGNORE);
2842 } else {
2843 ret = mbedtls_ssl_conf_cid(&conf, cid_renego_len,
2844 MBEDTLS_SSL_UNEXPECTED_CID_IGNORE);
2845 }
2846
2847 if (ret != 0) {
2848 mbedtls_printf(" failed\n ! mbedtls_ssl_conf_cid_len returned -%#04x\n\n",
2849 (unsigned int) -ret);
2850 goto exit;
2851 }
2852 }
2853 #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
2854
2855 #if defined(MBEDTLS_SSL_DTLS_SRTP)
2856 const mbedtls_ssl_srtp_profile forced_profile[] =
2857 { opt.force_srtp_profile, MBEDTLS_TLS_SRTP_UNSET };
2858 if (opt.use_srtp == 1) {
2859 if (opt.force_srtp_profile != 0) {
2860 ret = mbedtls_ssl_conf_dtls_srtp_protection_profiles(&conf, forced_profile);
2861 } else {
2862 ret = mbedtls_ssl_conf_dtls_srtp_protection_profiles(&conf, default_profiles);
2863 }
2864
2865 if (ret != 0) {
2866 mbedtls_printf(
2867 " failed\n ! mbedtls_ssl_conf_dtls_srtp_protection_profiles returned %d\n\n",
2868 ret);
2869 goto exit;
2870 }
2871
2872 mbedtls_ssl_conf_srtp_mki_value_supported(&conf,
2873 opt.support_mki ?
2874 MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED :
2875 MBEDTLS_SSL_DTLS_SRTP_MKI_UNSUPPORTED);
2876
2877 } else if (opt.force_srtp_profile != 0) {
2878 mbedtls_printf(" failed\n ! must enable use_srtp to force srtp profile\n\n");
2879 goto exit;
2880 }
2881 #endif /* MBEDTLS_SSL_DTLS_SRTP */
2882
2883 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
2884 if (opt.extended_ms != DFL_EXTENDED_MS) {
2885 mbedtls_ssl_conf_extended_master_secret(&conf, opt.extended_ms);
2886 }
2887 #endif
2888
2889 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
2890 if (opt.etm != DFL_ETM) {
2891 mbedtls_ssl_conf_encrypt_then_mac(&conf, opt.etm);
2892 }
2893 #endif
2894
2895 #if defined(MBEDTLS_SSL_ALPN)
2896 if (opt.alpn_string != NULL) {
2897 if ((ret = mbedtls_ssl_conf_alpn_protocols(&conf, alpn_list)) != 0) {
2898 mbedtls_printf(" failed\n ! mbedtls_ssl_conf_alpn_protocols returned %d\n\n", ret);
2899 goto exit;
2900 }
2901 }
2902 #endif
2903
2904 if (opt.reproducible) {
2905 #if defined(MBEDTLS_HAVE_TIME)
2906 #if defined(MBEDTLS_PLATFORM_TIME_ALT)
2907 mbedtls_platform_set_time(dummy_constant_time);
2908 #else
2909 fprintf(stderr, "Warning: reproducible option used without constant time\n");
2910 #endif
2911 #endif /* MBEDTLS_HAVE_TIME */
2912 }
2913 mbedtls_ssl_conf_rng(&conf, rng_get, &rng);
2914 mbedtls_ssl_conf_dbg(&conf, my_debug, stdout);
2915
2916 #if defined(MBEDTLS_SSL_CACHE_C)
2917 if (opt.cache_max != -1) {
2918 mbedtls_ssl_cache_set_max_entries(&cache, opt.cache_max);
2919 }
2920
2921 #if defined(MBEDTLS_HAVE_TIME)
2922 if (opt.cache_timeout != -1) {
2923 mbedtls_ssl_cache_set_timeout(&cache, opt.cache_timeout);
2924 }
2925 #endif
2926
2927 mbedtls_ssl_conf_session_cache(&conf, &cache,
2928 mbedtls_ssl_cache_get,
2929 mbedtls_ssl_cache_set);
2930 #endif
2931
2932 #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_TICKET_C)
2933 if (opt.tickets != MBEDTLS_SSL_SESSION_TICKETS_DISABLED) {
2934 #if defined(MBEDTLS_HAVE_TIME)
2935 if (opt.dummy_ticket) {
2936 mbedtls_ssl_conf_session_tickets_cb(&conf,
2937 dummy_ticket_write,
2938 dummy_ticket_parse,
2939 NULL);
2940 } else
2941 #endif /* MBEDTLS_HAVE_TIME */
2942 {
2943 if ((ret = mbedtls_ssl_ticket_setup(&ticket_ctx,
2944 rng_get, &rng,
2945 opt.ticket_aead,
2946 opt.ticket_timeout)) != 0) {
2947 mbedtls_printf(
2948 " failed\n ! mbedtls_ssl_ticket_setup returned %d\n\n",
2949 ret);
2950 goto exit;
2951 }
2952
2953 mbedtls_ssl_conf_session_tickets_cb(&conf,
2954 mbedtls_ssl_ticket_write,
2955 mbedtls_ssl_ticket_parse,
2956 &ticket_ctx);
2957 }
2958
2959 #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2960 mbedtls_ssl_conf_new_session_tickets(&conf, opt.tickets);
2961 #endif
2962 /* exercise manual ticket rotation (not required for typical use)
2963 * (used for external synchronization of session ticket encryption keys)
2964 */
2965 if (opt.ticket_rotate) {
2966 unsigned char kbuf[MBEDTLS_SSL_TICKET_MAX_KEY_BYTES];
2967 unsigned char name[MBEDTLS_SSL_TICKET_KEY_NAME_BYTES];
2968 if ((ret = rng_get(&rng, name, sizeof(name))) != 0 ||
2969 (ret = rng_get(&rng, kbuf, sizeof(kbuf))) != 0 ||
2970 (ret = mbedtls_ssl_ticket_rotate(&ticket_ctx,
2971 name, sizeof(name), kbuf, sizeof(kbuf),
2972 opt.ticket_timeout)) != 0) {
2973 mbedtls_printf(" failed\n ! mbedtls_ssl_ticket_rotate returned %d\n\n", ret);
2974 goto exit;
2975 }
2976 }
2977 }
2978 #endif
2979
2980 #if defined(MBEDTLS_SSL_PROTO_DTLS)
2981 if (opt.transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
2982 #if defined(MBEDTLS_SSL_COOKIE_C)
2983 if (opt.cookies > 0) {
2984 if ((ret = mbedtls_ssl_cookie_setup(&cookie_ctx,
2985 rng_get, &rng)) != 0) {
2986 mbedtls_printf(" failed\n ! mbedtls_ssl_cookie_setup returned %d\n\n", ret);
2987 goto exit;
2988 }
2989
2990 mbedtls_ssl_conf_dtls_cookies(&conf, mbedtls_ssl_cookie_write, mbedtls_ssl_cookie_check,
2991 &cookie_ctx);
2992 } else
2993 #endif /* MBEDTLS_SSL_COOKIE_C */
2994 #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
2995 if (opt.cookies == 0) {
2996 mbedtls_ssl_conf_dtls_cookies(&conf, NULL, NULL, NULL);
2997 } else
2998 #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
2999 {
3000 ; /* Nothing to do */
3001 }
3002
3003 #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
3004 if (opt.anti_replay != DFL_ANTI_REPLAY) {
3005 mbedtls_ssl_conf_dtls_anti_replay(&conf, opt.anti_replay);
3006 }
3007 #endif
3008
3009 if (opt.badmac_limit != DFL_BADMAC_LIMIT) {
3010 mbedtls_ssl_conf_dtls_badmac_limit(&conf, opt.badmac_limit);
3011 }
3012 }
3013 #endif /* MBEDTLS_SSL_PROTO_DTLS */
3014
3015 if (opt.force_ciphersuite[0] != DFL_FORCE_CIPHER) {
3016 mbedtls_ssl_conf_ciphersuites(&conf, opt.force_ciphersuite);
3017 }
3018
3019 #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
3020 mbedtls_ssl_conf_tls13_key_exchange_modes(&conf, opt.tls13_kex_modes);
3021 #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
3022
3023 if (opt.allow_legacy != DFL_ALLOW_LEGACY) {
3024 mbedtls_ssl_conf_legacy_renegotiation(&conf, opt.allow_legacy);
3025 }
3026 #if defined(MBEDTLS_SSL_RENEGOTIATION)
3027 mbedtls_ssl_conf_renegotiation(&conf, opt.renegotiation);
3028
3029 if (opt.renego_delay != DFL_RENEGO_DELAY) {
3030 mbedtls_ssl_conf_renegotiation_enforced(&conf, opt.renego_delay);
3031 }
3032
3033 if (opt.renego_period != DFL_RENEGO_PERIOD) {
3034 PUT_UINT64_BE(renego_period, opt.renego_period, 0);
3035 mbedtls_ssl_conf_renegotiation_period(&conf, renego_period);
3036 }
3037 #endif
3038
3039 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
3040 if (strcmp(opt.ca_path, "none") != 0 &&
3041 strcmp(opt.ca_file, "none") != 0) {
3042 #if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
3043 if (opt.ca_callback != 0) {
3044 mbedtls_ssl_conf_ca_cb(&conf, ca_callback, &cacert);
3045 } else
3046 #endif
3047 mbedtls_ssl_conf_ca_chain(&conf, &cacert, NULL);
3048 }
3049 if (key_cert_init) {
3050 mbedtls_pk_context *pk = &pkey;
3051 #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
3052 if (opt.async_private_delay1 >= 0) {
3053 ret = ssl_async_set_key(&ssl_async_keys, &srvcert, pk, 0,
3054 opt.async_private_delay1);
3055 if (ret < 0) {
3056 mbedtls_printf(" Test error: ssl_async_set_key failed (%d)\n",
3057 ret);
3058 goto exit;
3059 }
3060 pk = NULL;
3061 }
3062 #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
3063 if ((ret = mbedtls_ssl_conf_own_cert(&conf, &srvcert, pk)) != 0) {
3064 mbedtls_printf(" failed\n ! mbedtls_ssl_conf_own_cert returned %d\n\n", ret);
3065 goto exit;
3066 }
3067 }
3068 if (key_cert_init2) {
3069 mbedtls_pk_context *pk = &pkey2;
3070 #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
3071 if (opt.async_private_delay2 >= 0) {
3072 ret = ssl_async_set_key(&ssl_async_keys, &srvcert2, pk, 0,
3073 opt.async_private_delay2);
3074 if (ret < 0) {
3075 mbedtls_printf(" Test error: ssl_async_set_key failed (%d)\n",
3076 ret);
3077 goto exit;
3078 }
3079 pk = NULL;
3080 }
3081 #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
3082 if ((ret = mbedtls_ssl_conf_own_cert(&conf, &srvcert2, pk)) != 0) {
3083 mbedtls_printf(" failed\n ! mbedtls_ssl_conf_own_cert returned %d\n\n", ret);
3084 goto exit;
3085 }
3086 }
3087
3088 #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
3089 if (opt.async_operations[0] != '-') {
3090 mbedtls_ssl_async_sign_t *sign = NULL;
3091 mbedtls_ssl_async_decrypt_t *decrypt = NULL;
3092 const char *r;
3093 for (r = opt.async_operations; *r; r++) {
3094 switch (*r) {
3095 case 'd':
3096 decrypt = ssl_async_decrypt;
3097 break;
3098 case 's':
3099 sign = ssl_async_sign;
3100 break;
3101 }
3102 }
3103 ssl_async_keys.inject_error = (opt.async_private_error < 0 ?
3104 -opt.async_private_error :
3105 opt.async_private_error);
3106 ssl_async_keys.f_rng = rng_get;
3107 ssl_async_keys.p_rng = &rng;
3108 mbedtls_ssl_conf_async_private_cb(&conf,
3109 sign,
3110 decrypt,
3111 ssl_async_resume,
3112 ssl_async_cancel,
3113 &ssl_async_keys);
3114 }
3115 #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
3116 #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
3117
3118 #if defined(SNI_OPTION)
3119 if (opt.sni != NULL) {
3120 mbedtls_ssl_conf_sni(&conf, sni_callback, sni_info);
3121 mbedtls_ssl_conf_cert_cb(&conf, cert_callback);
3122 #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
3123 if (opt.async_private_delay2 >= 0) {
3124 sni_entry *cur;
3125 for (cur = sni_info; cur != NULL; cur = cur->next) {
3126 ret = ssl_async_set_key(&ssl_async_keys,
3127 cur->cert, cur->key, 1,
3128 opt.async_private_delay2);
3129 if (ret < 0) {
3130 mbedtls_printf(" Test error: ssl_async_set_key failed (%d)\n",
3131 ret);
3132 goto exit;
3133 }
3134 cur->key = NULL;
3135 }
3136 }
3137 #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
3138 }
3139 #endif
3140
3141 #if defined(MBEDTLS_ECP_C)
3142 if (opt.curves != NULL &&
3143 strcmp(opt.curves, "default") != 0) {
3144 mbedtls_ssl_conf_groups(&conf, group_list);
3145 }
3146 #endif
3147
3148 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
3149 if (opt.sig_algs != NULL) {
3150 mbedtls_ssl_conf_sig_algs(&conf, sig_alg_list);
3151 }
3152 #endif
3153
3154 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
3155
3156 if (strlen(opt.psk) != 0 && strlen(opt.psk_identity) != 0) {
3157 #if defined(MBEDTLS_USE_PSA_CRYPTO)
3158 if (opt.psk_opaque != 0) {
3159 /* The algorithm has already been determined earlier. */
3160 status = psa_setup_psk_key_slot(&psk_slot, alg, psk, psk_len);
3161 if (status != PSA_SUCCESS) {
3162 fprintf(stderr, "SETUP FAIL\n");
3163 ret = MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
3164 goto exit;
3165 }
3166 if ((ret = mbedtls_ssl_conf_psk_opaque(&conf, psk_slot,
3167 (const unsigned char *) opt.psk_identity,
3168 strlen(opt.psk_identity))) != 0) {
3169 mbedtls_printf(" failed\n ! mbedtls_ssl_conf_psk_opaque returned %d\n\n",
3170 ret);
3171 goto exit;
3172 }
3173 } else
3174 #endif /* MBEDTLS_USE_PSA_CRYPTO */
3175 if (psk_len > 0) {
3176 ret = mbedtls_ssl_conf_psk(&conf, psk, psk_len,
3177 (const unsigned char *) opt.psk_identity,
3178 strlen(opt.psk_identity));
3179 if (ret != 0) {
3180 mbedtls_printf(" failed\n mbedtls_ssl_conf_psk returned -0x%04X\n\n",
3181 (unsigned int) -ret);
3182 goto exit;
3183 }
3184 }
3185 }
3186
3187 if (opt.psk_list != NULL) {
3188 #if defined(MBEDTLS_USE_PSA_CRYPTO)
3189 if (opt.psk_list_opaque != 0) {
3190 psk_entry *cur_psk;
3191 for (cur_psk = psk_info; cur_psk != NULL; cur_psk = cur_psk->next) {
3192
3193 status = psa_setup_psk_key_slot(&cur_psk->slot, alg,
3194 cur_psk->key,
3195 cur_psk->key_len);
3196 if (status != PSA_SUCCESS) {
3197 ret = MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
3198 goto exit;
3199 }
3200 }
3201 }
3202 #endif /* MBEDTLS_USE_PSA_CRYPTO */
3203
3204 mbedtls_ssl_conf_psk_cb(&conf, psk_callback, psk_info);
3205 }
3206 #endif
3207
3208 #if defined(MBEDTLS_DHM_C)
3209 /*
3210 * Use different group than default DHM group
3211 */
3212 #if defined(MBEDTLS_FS_IO)
3213 if (opt.dhm_file != NULL) {
3214 ret = mbedtls_ssl_conf_dh_param_ctx(&conf, &dhm);
3215 }
3216 #endif
3217 if (ret != 0) {
3218 mbedtls_printf(" failed\n mbedtls_ssl_conf_dh_param returned -0x%04X\n\n",
3219 (unsigned int) -ret);
3220 goto exit;
3221 }
3222 #endif
3223
3224 if (opt.min_version != DFL_MIN_VERSION) {
3225 mbedtls_ssl_conf_min_tls_version(&conf, opt.min_version);
3226 }
3227
3228 if (opt.max_version != DFL_MIN_VERSION) {
3229 mbedtls_ssl_conf_max_tls_version(&conf, opt.max_version);
3230 }
3231
3232 if ((ret = mbedtls_ssl_setup(&ssl, &conf)) != 0) {
3233 mbedtls_printf(" failed\n ! mbedtls_ssl_setup returned -0x%x\n\n", (unsigned int) -ret);
3234 goto exit;
3235 }
3236
3237 if (opt.eap_tls != 0) {
3238 mbedtls_ssl_set_export_keys_cb(&ssl, eap_tls_key_derivation,
3239 &eap_tls_keying);
3240 } else if (opt.nss_keylog != 0) {
3241 mbedtls_ssl_set_export_keys_cb(&ssl,
3242 nss_keylog_export,
3243 NULL);
3244 }
3245 #if defined(MBEDTLS_SSL_DTLS_SRTP)
3246 else if (opt.use_srtp != 0) {
3247 mbedtls_ssl_set_export_keys_cb(&ssl, dtls_srtp_key_derivation,
3248 &dtls_srtp_keying);
3249 }
3250 #endif /* MBEDTLS_SSL_DTLS_SRTP */
3251
3252 io_ctx.ssl = &ssl;
3253 io_ctx.net = &client_fd;
3254 mbedtls_ssl_set_bio(&ssl, &io_ctx, send_cb, recv_cb,
3255 opt.nbio == 0 ? recv_timeout_cb : NULL);
3256
3257 #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
3258 if (opt.transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
3259 if ((ret = mbedtls_ssl_set_cid(&ssl, opt.cid_enabled,
3260 cid, cid_len)) != 0) {
3261 mbedtls_printf(" failed\n ! mbedtls_ssl_set_cid returned %d\n\n",
3262 ret);
3263 goto exit;
3264 }
3265 }
3266 #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
3267
3268 #if defined(MBEDTLS_SSL_PROTO_DTLS)
3269 if (opt.dtls_mtu != DFL_DTLS_MTU) {
3270 mbedtls_ssl_set_mtu(&ssl, opt.dtls_mtu);
3271 }
3272 #endif
3273
3274 #if defined(MBEDTLS_TIMING_C)
3275 mbedtls_ssl_set_timer_cb(&ssl, &timer, mbedtls_timing_set_delay,
3276 mbedtls_timing_get_delay);
3277 #endif
3278
3279 mbedtls_printf(" ok\n");
3280
3281 /*
3282 * 3. Setup the listening TCP socket
3283 */
3284 mbedtls_printf(" . Bind on %s://%s:%s/ ...",
3285 opt.transport == MBEDTLS_SSL_TRANSPORT_STREAM ? "tcp" : "udp",
3286 opt.server_addr ? opt.server_addr : "*",
3287 opt.server_port);
3288 fflush(stdout);
3289
3290 if ((ret = mbedtls_net_bind(&listen_fd, opt.server_addr, opt.server_port,
3291 opt.transport == MBEDTLS_SSL_TRANSPORT_STREAM ?
3292 MBEDTLS_NET_PROTO_TCP : MBEDTLS_NET_PROTO_UDP)) != 0) {
3293 mbedtls_printf(" failed\n ! mbedtls_net_bind returned -0x%x\n\n", (unsigned int) -ret);
3294 goto exit;
3295 }
3296 mbedtls_printf(" ok\n");
3297
3298 reset:
3299 #if !defined(_WIN32)
3300 if (received_sigterm) {
3301 mbedtls_printf(" interrupted by SIGTERM (not in net_accept())\n");
3302 if (ret == MBEDTLS_ERR_NET_INVALID_CONTEXT) {
3303 ret = 0;
3304 }
3305
3306 goto exit;
3307 }
3308 #endif
3309
3310 if (ret == MBEDTLS_ERR_SSL_CLIENT_RECONNECT) {
3311 mbedtls_printf(" ! Client initiated reconnection from same port\n");
3312 goto handshake;
3313 }
3314
3315 #ifdef MBEDTLS_ERROR_C
3316 if (ret != 0) {
3317 char error_buf[100];
3318 mbedtls_strerror(ret, error_buf, 100);
3319 mbedtls_printf("Last error was: %d - %s\n\n", ret, error_buf);
3320 }
3321 #endif
3322
3323 mbedtls_net_free(&client_fd);
3324
3325 mbedtls_ssl_session_reset(&ssl);
3326
3327 /*
3328 * 3. Wait until a client connects
3329 */
3330 mbedtls_printf(" . Waiting for a remote connection ...");
3331 fflush(stdout);
3332
3333 if ((ret = mbedtls_net_accept(&listen_fd, &client_fd,
3334 client_ip, sizeof(client_ip), &cliip_len)) != 0) {
3335 #if !defined(_WIN32)
3336 if (received_sigterm) {
3337 mbedtls_printf(" interrupted by SIGTERM (in net_accept())\n");
3338 if (ret == MBEDTLS_ERR_NET_ACCEPT_FAILED) {
3339 ret = 0;
3340 }
3341
3342 goto exit;
3343 }
3344 #endif
3345
3346 mbedtls_printf(" failed\n ! mbedtls_net_accept returned -0x%x\n\n", (unsigned int) -ret);
3347 goto exit;
3348 }
3349
3350 if (opt.nbio > 0) {
3351 ret = mbedtls_net_set_nonblock(&client_fd);
3352 } else {
3353 ret = mbedtls_net_set_block(&client_fd);
3354 }
3355 if (ret != 0) {
3356 mbedtls_printf(" failed\n ! net_set_(non)block() returned -0x%x\n\n", (unsigned int) -ret);
3357 goto exit;
3358 }
3359
3360 mbedtls_ssl_conf_read_timeout(&conf, opt.read_timeout);
3361
3362 #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
3363 if (opt.transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
3364 if ((ret = mbedtls_ssl_set_client_transport_id(&ssl,
3365 client_ip, cliip_len)) != 0) {
3366 mbedtls_printf(" failed\n ! mbedtls_ssl_set_client_transport_id() returned -0x%x\n\n",
3367 (unsigned int) -ret);
3368 goto exit;
3369 }
3370 }
3371 #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
3372
3373 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
3374 if (opt.ecjpake_pw != DFL_ECJPAKE_PW) {
3375 #if defined(MBEDTLS_USE_PSA_CRYPTO)
3376 if (opt.ecjpake_pw_opaque != DFL_ECJPAKE_PW_OPAQUE) {
3377 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
3378
3379 psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_DERIVE);
3380 psa_set_key_algorithm(&attributes, PSA_ALG_JPAKE);
3381 psa_set_key_type(&attributes, PSA_KEY_TYPE_PASSWORD);
3382
3383 status = psa_import_key(&attributes,
3384 (const unsigned char *) opt.ecjpake_pw,
3385 strlen(opt.ecjpake_pw),
3386 &ecjpake_pw_slot);
3387 if (status != PSA_SUCCESS) {
3388 mbedtls_printf(" failed\n ! psa_import_key returned %d\n\n",
3389 status);
3390 goto exit;
3391 }
3392 if ((ret = mbedtls_ssl_set_hs_ecjpake_password_opaque(&ssl,
3393 ecjpake_pw_slot)) != 0) {
3394 mbedtls_printf(
3395 " failed\n ! mbedtls_ssl_set_hs_ecjpake_password_opaque returned %d\n\n",
3396 ret);
3397 goto exit;
3398 }
3399 mbedtls_printf("using opaque password\n");
3400 } else
3401 #endif /* MBEDTLS_USE_PSA_CRYPTO */
3402 {
3403 if ((ret = mbedtls_ssl_set_hs_ecjpake_password(&ssl,
3404 (const unsigned char *) opt.ecjpake_pw,
3405 strlen(opt.ecjpake_pw))) != 0) {
3406 mbedtls_printf(" failed\n ! mbedtls_ssl_set_hs_ecjpake_password returned %d\n\n",
3407 ret);
3408 goto exit;
3409 }
3410 }
3411 }
3412 #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
3413
3414 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
3415 #if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
3416 /* exercise setting DN hints for server certificate request
3417 * (Intended for use where the client cert expected has been signed by
3418 * a specific CA which is an intermediate in a CA chain, not the root)
3419 * (Additionally, the CA choice would typically be influenced by SNI
3420 * if being set per-handshake using mbedtls_ssl_set_hs_dn_hints()) */
3421 if (opt.cert_req_dn_hint == 3 && key_cert_init2) {
3422 mbedtls_ssl_set_hs_dn_hints(&ssl, &srvcert2);
3423 }
3424 #endif
3425 #endif
3426
3427 mbedtls_printf(" ok\n");
3428
3429 /*
3430 * 4. Handshake
3431 */
3432 handshake:
3433 mbedtls_printf(" . Performing the SSL/TLS handshake...");
3434 fflush(stdout);
3435
3436 while ((ret = mbedtls_ssl_handshake(&ssl)) != 0) {
3437 #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
3438 if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS &&
3439 ssl_async_keys.inject_error == SSL_ASYNC_INJECT_ERROR_CANCEL) {
3440 mbedtls_printf(" cancelling on injected error\n");
3441 break;
3442 }
3443 #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
3444
3445 if (!mbedtls_status_is_ssl_in_progress(ret)) {
3446 break;
3447 }
3448
3449 /* For event-driven IO, wait for socket to become available */
3450 if (opt.event == 1 /* level triggered IO */) {
3451 #if defined(MBEDTLS_TIMING_C)
3452 ret = idle(&client_fd, &timer, ret);
3453 #else
3454 ret = idle(&client_fd, ret);
3455 #endif
3456 if (ret != 0) {
3457 goto reset;
3458 }
3459 }
3460 }
3461
3462 if (ret == MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED) {
3463 mbedtls_printf(" hello verification requested\n");
3464 ret = 0;
3465 goto reset;
3466 } else if (ret != 0) {
3467 mbedtls_printf(" failed\n ! mbedtls_ssl_handshake returned -0x%x\n\n",
3468 (unsigned int) -ret);
3469
3470 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
3471 if (ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED) {
3472 char vrfy_buf[512];
3473 flags = mbedtls_ssl_get_verify_result(&ssl);
3474
3475 x509_crt_verify_info(vrfy_buf, sizeof(vrfy_buf), " ! ", flags);
3476
3477 mbedtls_printf("%s\n", vrfy_buf);
3478 }
3479 #endif
3480
3481 #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
3482 if (opt.async_private_error < 0) {
3483 /* Injected error only the first time round, to test reset */
3484 ssl_async_keys.inject_error = SSL_ASYNC_INJECT_ERROR_NONE;
3485 }
3486 #endif
3487 goto reset;
3488 } else { /* ret == 0 */
3489 int suite_id = mbedtls_ssl_get_ciphersuite_id_from_ssl(&ssl);
3490 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
3491 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(suite_id);
3492
3493 mbedtls_printf(" ok\n [ Protocol is %s ]\n"
3494 " [ Ciphersuite is %s ]\n"
3495 " [ Key size is %u ]\n",
3496 mbedtls_ssl_get_version(&ssl),
3497 mbedtls_ssl_ciphersuite_get_name(ciphersuite_info),
3498 (unsigned int)
3499 mbedtls_ssl_ciphersuite_get_cipher_key_bitlen(ciphersuite_info));
3500 }
3501
3502 if ((ret = mbedtls_ssl_get_record_expansion(&ssl)) >= 0) {
3503 mbedtls_printf(" [ Record expansion is %d ]\n", ret);
3504 } else {
3505 mbedtls_printf(" [ Record expansion is unknown ]\n");
3506 }
3507
3508 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
3509 mbedtls_printf(" [ Maximum incoming record payload length is %u ]\n",
3510 (unsigned int) mbedtls_ssl_get_max_in_record_payload(&ssl));
3511 mbedtls_printf(" [ Maximum outgoing record payload length is %u ]\n",
3512 (unsigned int) mbedtls_ssl_get_max_out_record_payload(&ssl));
3513 #endif
3514
3515 #if defined(MBEDTLS_SSL_ALPN)
3516 if (opt.alpn_string != NULL) {
3517 const char *alp = mbedtls_ssl_get_alpn_protocol(&ssl);
3518 mbedtls_printf(" [ Application Layer Protocol is %s ]\n",
3519 alp ? alp : "(none)");
3520 }
3521 #endif
3522
3523 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
3524 /*
3525 * 5. Verify the client certificate
3526 */
3527 mbedtls_printf(" . Verifying peer X.509 certificate...");
3528
3529 if ((flags = mbedtls_ssl_get_verify_result(&ssl)) != 0) {
3530 char vrfy_buf[512];
3531
3532 mbedtls_printf(" failed\n");
3533
3534 x509_crt_verify_info(vrfy_buf, sizeof(vrfy_buf), " ! ", flags);
3535 mbedtls_printf("%s\n", vrfy_buf);
3536 } else {
3537 mbedtls_printf(" ok\n");
3538 }
3539
3540 #if !defined(MBEDTLS_X509_REMOVE_INFO)
3541 if (mbedtls_ssl_get_peer_cert(&ssl) != NULL) {
3542 char crt_buf[512];
3543
3544 mbedtls_printf(" . Peer certificate information ...\n");
3545 mbedtls_x509_crt_info(crt_buf, sizeof(crt_buf), " ",
3546 mbedtls_ssl_get_peer_cert(&ssl));
3547 mbedtls_printf("%s\n", crt_buf);
3548 }
3549 #endif /* MBEDTLS_X509_REMOVE_INFO */
3550 #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
3551
3552 if (opt.eap_tls != 0) {
3553 size_t j = 0;
3554
3555 if ((ret = mbedtls_ssl_tls_prf(eap_tls_keying.tls_prf_type,
3556 eap_tls_keying.master_secret,
3557 sizeof(eap_tls_keying.master_secret),
3558 eap_tls_label,
3559 eap_tls_keying.randbytes,
3560 sizeof(eap_tls_keying.randbytes),
3561 eap_tls_keymaterial,
3562 sizeof(eap_tls_keymaterial)))
3563 != 0) {
3564 mbedtls_printf(" failed\n ! mbedtls_ssl_tls_prf returned -0x%x\n\n",
3565 (unsigned int) -ret);
3566 goto reset;
3567 }
3568
3569 mbedtls_printf(" EAP-TLS key material is:");
3570 for (j = 0; j < sizeof(eap_tls_keymaterial); j++) {
3571 if (j % 8 == 0) {
3572 mbedtls_printf("\n ");
3573 }
3574 mbedtls_printf("%02x ", eap_tls_keymaterial[j]);
3575 }
3576 mbedtls_printf("\n");
3577
3578 if ((ret = mbedtls_ssl_tls_prf(eap_tls_keying.tls_prf_type, NULL, 0,
3579 eap_tls_label,
3580 eap_tls_keying.randbytes,
3581 sizeof(eap_tls_keying.randbytes),
3582 eap_tls_iv,
3583 sizeof(eap_tls_iv))) != 0) {
3584 mbedtls_printf(" failed\n ! mbedtls_ssl_tls_prf returned -0x%x\n\n",
3585 (unsigned int) -ret);
3586 goto reset;
3587 }
3588
3589 mbedtls_printf(" EAP-TLS IV is:");
3590 for (j = 0; j < sizeof(eap_tls_iv); j++) {
3591 if (j % 8 == 0) {
3592 mbedtls_printf("\n ");
3593 }
3594 mbedtls_printf("%02x ", eap_tls_iv[j]);
3595 }
3596 mbedtls_printf("\n");
3597 }
3598
3599 #if defined(MBEDTLS_SSL_DTLS_SRTP)
3600 else if (opt.use_srtp != 0) {
3601 size_t j = 0;
3602 mbedtls_dtls_srtp_info dtls_srtp_negotiation_result;
3603 mbedtls_ssl_get_dtls_srtp_negotiation_result(&ssl, &dtls_srtp_negotiation_result);
3604
3605 if (dtls_srtp_negotiation_result.chosen_dtls_srtp_profile
3606 == MBEDTLS_TLS_SRTP_UNSET) {
3607 mbedtls_printf(" Unable to negotiate "
3608 "the use of DTLS-SRTP\n");
3609 } else {
3610 if ((ret = mbedtls_ssl_tls_prf(dtls_srtp_keying.tls_prf_type,
3611 dtls_srtp_keying.master_secret,
3612 sizeof(dtls_srtp_keying.master_secret),
3613 dtls_srtp_label,
3614 dtls_srtp_keying.randbytes,
3615 sizeof(dtls_srtp_keying.randbytes),
3616 dtls_srtp_key_material,
3617 sizeof(dtls_srtp_key_material)))
3618 != 0) {
3619 mbedtls_printf(" failed\n ! mbedtls_ssl_tls_prf returned -0x%x\n\n",
3620 (unsigned int) -ret);
3621 goto exit;
3622 }
3623
3624 mbedtls_printf(" DTLS-SRTP key material is:");
3625 for (j = 0; j < sizeof(dtls_srtp_key_material); j++) {
3626 if (j % 8 == 0) {
3627 mbedtls_printf("\n ");
3628 }
3629 mbedtls_printf("%02x ", dtls_srtp_key_material[j]);
3630 }
3631 mbedtls_printf("\n");
3632
3633 /* produce a less readable output used to perform automatic checks
3634 * - compare client and server output
3635 * - interop test with openssl which client produces this kind of output
3636 */
3637 mbedtls_printf(" Keying material: ");
3638 for (j = 0; j < sizeof(dtls_srtp_key_material); j++) {
3639 mbedtls_printf("%02X", dtls_srtp_key_material[j]);
3640 }
3641 mbedtls_printf("\n");
3642
3643 if (dtls_srtp_negotiation_result.mki_len > 0) {
3644 mbedtls_printf(" DTLS-SRTP mki value: ");
3645 for (j = 0; j < dtls_srtp_negotiation_result.mki_len; j++) {
3646 mbedtls_printf("%02X", dtls_srtp_negotiation_result.mki_value[j]);
3647 }
3648 } else {
3649 mbedtls_printf(" DTLS-SRTP no mki value negotiated");
3650 }
3651 mbedtls_printf("\n");
3652
3653 }
3654 }
3655 #endif /* MBEDTLS_SSL_DTLS_SRTP */
3656
3657 #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
3658 ret = report_cid_usage(&ssl, "initial handshake");
3659 if (ret != 0) {
3660 goto exit;
3661 }
3662
3663 if (opt.transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
3664 if ((ret = mbedtls_ssl_set_cid(&ssl, opt.cid_enabled_renego,
3665 cid_renego, cid_renego_len)) != 0) {
3666 mbedtls_printf(" failed\n ! mbedtls_ssl_set_cid returned %d\n\n",
3667 ret);
3668 goto exit;
3669 }
3670 }
3671 #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
3672
3673 #if defined(MBEDTLS_MEMORY_DEBUG)
3674 mbedtls_memory_buffer_alloc_cur_get(¤t_heap_memory, &heap_blocks);
3675 mbedtls_memory_buffer_alloc_max_get(&peak_heap_memory, &heap_blocks);
3676 mbedtls_printf("Heap memory usage after handshake: %lu bytes. Peak memory usage was %lu\n",
3677 (unsigned long) current_heap_memory, (unsigned long) peak_heap_memory);
3678 #endif /* MBEDTLS_MEMORY_DEBUG */
3679
3680 if (opt.exchanges == 0) {
3681 goto close_notify;
3682 }
3683
3684 exchanges_left = opt.exchanges;
3685 data_exchange:
3686 /*
3687 * 6. Read the HTTP Request
3688 */
3689 mbedtls_printf(" < Read from client:");
3690 fflush(stdout);
3691
3692 /*
3693 * TLS and DTLS need different reading styles (stream vs datagram)
3694 */
3695 if (opt.transport == MBEDTLS_SSL_TRANSPORT_STREAM) {
3696 do {
3697 int terminated = 0;
3698 len = opt.buffer_size;
3699 memset(buf, 0, opt.buffer_size);
3700 ret = mbedtls_ssl_read(&ssl, buf, len);
3701
3702 if (mbedtls_status_is_ssl_in_progress(ret)) {
3703 if (opt.event == 1 /* level triggered IO */) {
3704 #if defined(MBEDTLS_TIMING_C)
3705 idle(&client_fd, &timer, ret);
3706 #else
3707 idle(&client_fd, ret);
3708 #endif
3709 }
3710
3711 continue;
3712 }
3713
3714 if (ret <= 0) {
3715 switch (ret) {
3716 case MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY:
3717 mbedtls_printf(" connection was closed gracefully\n");
3718 goto close_notify;
3719
3720 case 0:
3721 case MBEDTLS_ERR_NET_CONN_RESET:
3722 mbedtls_printf(" connection was reset by peer\n");
3723 ret = MBEDTLS_ERR_NET_CONN_RESET;
3724 goto reset;
3725
3726 default:
3727 mbedtls_printf(" mbedtls_ssl_read returned -0x%x\n", (unsigned int) -ret);
3728 goto reset;
3729 }
3730 }
3731
3732 if (mbedtls_ssl_get_bytes_avail(&ssl) == 0) {
3733 len = ret;
3734 buf[len] = '\0';
3735 mbedtls_printf(" %d bytes read\n\n%s\n", len, (char *) buf);
3736
3737 /* End of message should be detected according to the syntax of the
3738 * application protocol (eg HTTP), just use a dummy test here. */
3739 if (buf[len - 1] == '\n') {
3740 terminated = 1;
3741 }
3742 } else {
3743 int extra_len, ori_len;
3744 unsigned char *larger_buf;
3745
3746 ori_len = ret;
3747 extra_len = (int) mbedtls_ssl_get_bytes_avail(&ssl);
3748
3749 larger_buf = mbedtls_calloc(1, ori_len + extra_len + 1);
3750 if (larger_buf == NULL) {
3751 mbedtls_printf(" ! memory allocation failed\n");
3752 ret = 1;
3753 goto reset;
3754 }
3755
3756 memset(larger_buf, 0, ori_len + extra_len);
3757 memcpy(larger_buf, buf, ori_len);
3758
3759 /* This read should never fail and get the whole cached data */
3760 ret = mbedtls_ssl_read(&ssl, larger_buf + ori_len, extra_len);
3761 if (ret != extra_len ||
3762 mbedtls_ssl_get_bytes_avail(&ssl) != 0) {
3763 mbedtls_printf(" ! mbedtls_ssl_read failed on cached data\n");
3764 ret = 1;
3765 goto reset;
3766 }
3767
3768 larger_buf[ori_len + extra_len] = '\0';
3769 mbedtls_printf(" %d bytes read (%d + %d)\n\n%s\n",
3770 ori_len + extra_len, ori_len, extra_len,
3771 (char *) larger_buf);
3772
3773 /* End of message should be detected according to the syntax of the
3774 * application protocol (eg HTTP), just use a dummy test here. */
3775 if (larger_buf[ori_len + extra_len - 1] == '\n') {
3776 terminated = 1;
3777 }
3778
3779 mbedtls_free(larger_buf);
3780 }
3781
3782 if (terminated) {
3783 ret = 0;
3784 break;
3785 }
3786 } while (1);
3787 } else { /* Not stream, so datagram */
3788 len = opt.buffer_size;
3789 memset(buf, 0, opt.buffer_size);
3790
3791 do {
3792 /* Without the call to `mbedtls_ssl_check_pending`, it might
3793 * happen that the client sends application data in the same
3794 * datagram as the Finished message concluding the handshake.
3795 * In this case, the application data would be ready to be
3796 * processed while the underlying transport wouldn't signal
3797 * any further incoming data.
3798 *
3799 * See the test 'Event-driven I/O: session-id resume, UDP packing'
3800 * in tests/ssl-opt.sh.
3801 */
3802
3803 /* For event-driven IO, wait for socket to become available */
3804 if (mbedtls_ssl_check_pending(&ssl) == 0 &&
3805 opt.event == 1 /* level triggered IO */) {
3806 #if defined(MBEDTLS_TIMING_C)
3807 idle(&client_fd, &timer, MBEDTLS_ERR_SSL_WANT_READ);
3808 #else
3809 idle(&client_fd, MBEDTLS_ERR_SSL_WANT_READ);
3810 #endif
3811 }
3812
3813 ret = mbedtls_ssl_read(&ssl, buf, len);
3814
3815 /* Note that even if `mbedtls_ssl_check_pending` returns true,
3816 * it can happen that the subsequent call to `mbedtls_ssl_read`
3817 * returns `MBEDTLS_ERR_SSL_WANT_READ`, because the pending messages
3818 * might be discarded (e.g. because they are retransmissions). */
3819 } while (mbedtls_status_is_ssl_in_progress(ret));
3820
3821 if (ret <= 0) {
3822 switch (ret) {
3823 case MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY:
3824 mbedtls_printf(" connection was closed gracefully\n");
3825 ret = 0;
3826 goto close_notify;
3827
3828 default:
3829 mbedtls_printf(" mbedtls_ssl_read returned -0x%x\n", (unsigned int) -ret);
3830 goto reset;
3831 }
3832 }
3833
3834 len = ret;
3835 buf[len] = '\0';
3836 mbedtls_printf(" %d bytes read\n\n%s", len, (char *) buf);
3837 ret = 0;
3838 }
3839
3840 /*
3841 * 7a. Request renegotiation while client is waiting for input from us.
3842 * (only on the first exchange, to be able to test retransmission)
3843 */
3844 #if defined(MBEDTLS_SSL_RENEGOTIATION)
3845 if (opt.renegotiate && exchanges_left == opt.exchanges) {
3846 mbedtls_printf(" . Requestion renegotiation...");
3847 fflush(stdout);
3848
3849 while ((ret = mbedtls_ssl_renegotiate(&ssl)) != 0) {
3850 if (!mbedtls_status_is_ssl_in_progress(ret)) {
3851 mbedtls_printf(" failed\n ! mbedtls_ssl_renegotiate returned %d\n\n", ret);
3852 goto reset;
3853 }
3854
3855 /* For event-driven IO, wait for socket to become available */
3856 if (opt.event == 1 /* level triggered IO */) {
3857 #if defined(MBEDTLS_TIMING_C)
3858 idle(&client_fd, &timer, ret);
3859 #else
3860 idle(&client_fd, ret);
3861 #endif
3862 }
3863 }
3864
3865 mbedtls_printf(" ok\n");
3866 }
3867 #endif /* MBEDTLS_SSL_RENEGOTIATION */
3868
3869 #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
3870 ret = report_cid_usage(&ssl, "after renegotiation");
3871 if (ret != 0) {
3872 goto exit;
3873 }
3874 #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
3875
3876 /*
3877 * 7. Write the 200 Response
3878 */
3879 mbedtls_printf(" > Write to client:");
3880 fflush(stdout);
3881
3882 /* If the format of the response changes, make sure there is enough
3883 * room in buf (buf_content_size calculation above). */
3884 len = sprintf((char *) buf, HTTP_RESPONSE,
3885 mbedtls_ssl_get_ciphersuite(&ssl));
3886
3887 /* Add padding to the response to reach opt.response_size in length */
3888 if (opt.response_size != DFL_RESPONSE_SIZE &&
3889 len < opt.response_size) {
3890 memset(buf + len, 'B', opt.response_size - len);
3891 len += opt.response_size - len;
3892 }
3893
3894 /* Truncate if response size is smaller than the "natural" size */
3895 if (opt.response_size != DFL_RESPONSE_SIZE &&
3896 len > opt.response_size) {
3897 len = opt.response_size;
3898
3899 /* Still end with \r\n unless that's really not possible */
3900 if (len >= 2) {
3901 buf[len - 2] = '\r';
3902 }
3903 if (len >= 1) {
3904 buf[len - 1] = '\n';
3905 }
3906 }
3907
3908 if (opt.transport == MBEDTLS_SSL_TRANSPORT_STREAM) {
3909 for (written = 0, frags = 0; written < len; written += ret, frags++) {
3910 while ((ret = mbedtls_ssl_write(&ssl, buf + written, len - written))
3911 <= 0) {
3912 if (ret == MBEDTLS_ERR_NET_CONN_RESET) {
3913 mbedtls_printf(" failed\n ! peer closed the connection\n\n");
3914 goto reset;
3915 }
3916
3917 if (!mbedtls_status_is_ssl_in_progress(ret)) {
3918 mbedtls_printf(" failed\n ! mbedtls_ssl_write returned %d\n\n", ret);
3919 goto reset;
3920 }
3921
3922 /* For event-driven IO, wait for socket to become available */
3923 if (opt.event == 1 /* level triggered IO */) {
3924 #if defined(MBEDTLS_TIMING_C)
3925 idle(&client_fd, &timer, ret);
3926 #else
3927 idle(&client_fd, ret);
3928 #endif
3929 }
3930 }
3931 }
3932 } else { /* Not stream, so datagram */
3933 while (1) {
3934 ret = mbedtls_ssl_write(&ssl, buf, len);
3935
3936 if (!mbedtls_status_is_ssl_in_progress(ret)) {
3937 break;
3938 }
3939
3940 /* For event-driven IO, wait for socket to become available */
3941 if (opt.event == 1 /* level triggered IO */) {
3942 #if defined(MBEDTLS_TIMING_C)
3943 idle(&client_fd, &timer, ret);
3944 #else
3945 idle(&client_fd, ret);
3946 #endif
3947 }
3948 }
3949
3950 if (ret < 0) {
3951 mbedtls_printf(" failed\n ! mbedtls_ssl_write returned %d\n\n", ret);
3952 goto reset;
3953 }
3954
3955 frags = 1;
3956 written = ret;
3957 }
3958
3959 buf[written] = '\0';
3960 mbedtls_printf(" %d bytes written in %d fragments\n\n%s\n", written, frags, (char *) buf);
3961 ret = 0;
3962
3963 /*
3964 * 7b. Simulate serialize/deserialize and go back to data exchange
3965 */
3966 #if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
3967 if (opt.serialize != 0) {
3968 size_t buf_len;
3969
3970 mbedtls_printf(" . Serializing live connection...");
3971
3972 ret = mbedtls_ssl_context_save(&ssl, NULL, 0, &buf_len);
3973 if (ret != MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL) {
3974 mbedtls_printf(" failed\n ! mbedtls_ssl_context_save returned "
3975 "-0x%x\n\n", (unsigned int) -ret);
3976
3977 goto exit;
3978 }
3979
3980 if ((context_buf = mbedtls_calloc(1, buf_len)) == NULL) {
3981 mbedtls_printf(" failed\n ! Couldn't allocate buffer for "
3982 "serialized context");
3983
3984 goto exit;
3985 }
3986 context_buf_len = buf_len;
3987
3988 if ((ret = mbedtls_ssl_context_save(&ssl, context_buf,
3989 buf_len, &buf_len)) != 0) {
3990 mbedtls_printf(" failed\n ! mbedtls_ssl_context_save returned "
3991 "-0x%x\n\n", (unsigned int) -ret);
3992
3993 goto exit;
3994 }
3995
3996 mbedtls_printf(" ok\n");
3997
3998 /* Save serialized context to the 'opt.context_file' as a base64 code */
3999 if (0 < strlen(opt.context_file)) {
4000 FILE *b64_file;
4001 uint8_t *b64_buf;
4002 size_t b64_len;
4003
4004 mbedtls_printf(" . Save serialized context to a file... ");
4005
4006 mbedtls_base64_encode(NULL, 0, &b64_len, context_buf, buf_len);
4007
4008 if ((b64_buf = mbedtls_calloc(1, b64_len)) == NULL) {
4009 mbedtls_printf("failed\n ! Couldn't allocate buffer for "
4010 "the base64 code\n");
4011 goto exit;
4012 }
4013
4014 if ((ret = mbedtls_base64_encode(b64_buf, b64_len, &b64_len,
4015 context_buf, buf_len)) != 0) {
4016 mbedtls_printf("failed\n ! mbedtls_base64_encode returned "
4017 "-0x%x\n", (unsigned int) -ret);
4018 mbedtls_free(b64_buf);
4019 goto exit;
4020 }
4021
4022 if ((b64_file = fopen(opt.context_file, "w")) == NULL) {
4023 mbedtls_printf("failed\n ! Cannot open '%s' for writing.\n",
4024 opt.context_file);
4025 mbedtls_free(b64_buf);
4026 goto exit;
4027 }
4028
4029 if (b64_len != fwrite(b64_buf, 1, b64_len, b64_file)) {
4030 mbedtls_printf("failed\n ! fwrite(%ld bytes) failed\n",
4031 (long) b64_len);
4032 mbedtls_free(b64_buf);
4033 fclose(b64_file);
4034 goto exit;
4035 }
4036
4037 mbedtls_free(b64_buf);
4038 fclose(b64_file);
4039
4040 mbedtls_printf("ok\n");
4041 }
4042
4043 /*
4044 * This simulates a workflow where you have a long-lived server
4045 * instance, potentially with a pool of ssl_context objects, and you
4046 * just want to re-use one while the connection is inactive: in that
4047 * case you can just reset() it, and then it's ready to receive
4048 * serialized data from another connection (or the same here).
4049 */
4050 if (opt.serialize == 1) {
4051 /* nothing to do here, done by context_save() already */
4052 mbedtls_printf(" . Context has been reset... ok\n");
4053 }
4054
4055 /*
4056 * This simulates a workflow where you have one server instance per
4057 * connection, and want to release it entire when the connection is
4058 * inactive, and spawn it again when needed again - this would happen
4059 * between ssl_free() and ssl_init() below, together with any other
4060 * teardown/startup code needed - for example, preparing the
4061 * ssl_config again (see section 3 "setup stuff" in this file).
4062 */
4063 if (opt.serialize == 2) {
4064 mbedtls_printf(" . Freeing and reinitializing context...");
4065
4066 mbedtls_ssl_free(&ssl);
4067
4068 mbedtls_ssl_init(&ssl);
4069
4070 if ((ret = mbedtls_ssl_setup(&ssl, &conf)) != 0) {
4071 mbedtls_printf(" failed\n ! mbedtls_ssl_setup returned "
4072 "-0x%x\n\n", (unsigned int) -ret);
4073 goto exit;
4074 }
4075
4076 /*
4077 * This illustrates the minimum amount of things you need to set
4078 * up, however you could set up much more if desired, for example
4079 * if you want to share your set up code between the case of
4080 * establishing a new connection and this case.
4081 */
4082 if (opt.nbio == 2) {
4083 mbedtls_ssl_set_bio(&ssl, &client_fd, delayed_send,
4084 delayed_recv, NULL);
4085 } else {
4086 mbedtls_ssl_set_bio(&ssl, &client_fd, mbedtls_net_send,
4087 mbedtls_net_recv,
4088 opt.nbio == 0 ? mbedtls_net_recv_timeout : NULL);
4089 }
4090
4091 #if defined(MBEDTLS_TIMING_C)
4092 mbedtls_ssl_set_timer_cb(&ssl, &timer,
4093 mbedtls_timing_set_delay,
4094 mbedtls_timing_get_delay);
4095 #endif /* MBEDTLS_TIMING_C */
4096
4097 mbedtls_printf(" ok\n");
4098 }
4099
4100 mbedtls_printf(" . Deserializing connection...");
4101
4102 if ((ret = mbedtls_ssl_context_load(&ssl, context_buf,
4103 buf_len)) != 0) {
4104 mbedtls_printf("failed\n ! mbedtls_ssl_context_load returned "
4105 "-0x%x\n\n", (unsigned int) -ret);
4106
4107 goto exit;
4108 }
4109
4110 mbedtls_free(context_buf);
4111 context_buf = NULL;
4112 context_buf_len = 0;
4113
4114 mbedtls_printf(" ok\n");
4115 }
4116 #endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */
4117
4118 /*
4119 * 7c. Continue doing data exchanges?
4120 */
4121 if (--exchanges_left > 0) {
4122 goto data_exchange;
4123 }
4124
4125 /*
4126 * 8. Done, cleanly close the connection
4127 */
4128 close_notify:
4129 mbedtls_printf(" . Closing the connection...");
4130
4131 /* No error checking, the connection might be closed already */
4132 do {
4133 ret = mbedtls_ssl_close_notify(&ssl);
4134 } while (ret == MBEDTLS_ERR_SSL_WANT_WRITE);
4135 ret = 0;
4136
4137 mbedtls_printf(" done\n");
4138
4139 #if defined(MBEDTLS_SSL_CACHE_C)
4140 if (opt.cache_remove > 0) {
4141 mbedtls_ssl_cache_remove(&cache, ssl.session->id, ssl.session->id_len);
4142 }
4143 #endif
4144
4145 goto reset;
4146
4147 /*
4148 * Cleanup and exit
4149 */
4150 exit:
4151 #ifdef MBEDTLS_ERROR_C
4152 if (ret != 0) {
4153 char error_buf[100];
4154 mbedtls_strerror(ret, error_buf, 100);
4155 mbedtls_printf("Last error was: -0x%X - %s\n\n", (unsigned int) -ret, error_buf);
4156 }
4157 #endif
4158
4159 if (opt.query_config_mode == DFL_QUERY_CONFIG_MODE) {
4160 mbedtls_printf(" . Cleaning up...");
4161 fflush(stdout);
4162 }
4163
4164 mbedtls_net_free(&client_fd);
4165 mbedtls_net_free(&listen_fd);
4166
4167 mbedtls_ssl_free(&ssl);
4168 mbedtls_ssl_config_free(&conf);
4169
4170 #if defined(MBEDTLS_SSL_CACHE_C)
4171 mbedtls_ssl_cache_free(&cache);
4172 #endif
4173 #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_TICKET_C)
4174 mbedtls_ssl_ticket_free(&ticket_ctx);
4175 #endif
4176 #if defined(MBEDTLS_SSL_COOKIE_C)
4177 mbedtls_ssl_cookie_free(&cookie_ctx);
4178 #endif
4179
4180 #if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
4181 if (context_buf != NULL) {
4182 mbedtls_platform_zeroize(context_buf, context_buf_len);
4183 }
4184 mbedtls_free(context_buf);
4185 #endif
4186
4187 #if defined(SNI_OPTION)
4188 sni_free(sni_info);
4189 #endif
4190
4191 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
4192 ret = psk_free(psk_info);
4193 if ((ret != 0) && (opt.query_config_mode == DFL_QUERY_CONFIG_MODE)) {
4194 mbedtls_printf("Failed to list of opaque PSKs - error was %d\n", ret);
4195 }
4196 #endif
4197
4198 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
4199 mbedtls_x509_crt_free(&cacert);
4200 mbedtls_x509_crt_free(&srvcert);
4201 mbedtls_pk_free(&pkey);
4202 mbedtls_x509_crt_free(&srvcert2);
4203 mbedtls_pk_free(&pkey2);
4204 #if defined(MBEDTLS_USE_PSA_CRYPTO)
4205 psa_destroy_key(key_slot);
4206 psa_destroy_key(key_slot2);
4207 #endif
4208 #endif
4209
4210 #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_FS_IO)
4211 mbedtls_dhm_free(&dhm);
4212 #endif
4213
4214 #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
4215 for (i = 0; (size_t) i < ssl_async_keys.slots_used; i++) {
4216 if (ssl_async_keys.slots[i].pk_owned) {
4217 mbedtls_pk_free(ssl_async_keys.slots[i].pk);
4218 mbedtls_free(ssl_async_keys.slots[i].pk);
4219 ssl_async_keys.slots[i].pk = NULL;
4220 }
4221 }
4222 #endif
4223
4224 #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED) && \
4225 defined(MBEDTLS_USE_PSA_CRYPTO)
4226 if (opt.psk_opaque != 0) {
4227 /* This is ok even if the slot hasn't been
4228 * initialized (we might have jumed here
4229 * immediately because of bad cmd line params,
4230 * for example). */
4231 status = psa_destroy_key(psk_slot);
4232 if ((status != PSA_SUCCESS) &&
4233 (opt.query_config_mode == DFL_QUERY_CONFIG_MODE)) {
4234 mbedtls_printf("Failed to destroy key slot %u - error was %d",
4235 (unsigned) MBEDTLS_SVC_KEY_ID_GET_KEY_ID(psk_slot),
4236 (int) status);
4237 }
4238 }
4239 #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED &&
4240 MBEDTLS_USE_PSA_CRYPTO */
4241
4242 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) && \
4243 defined(MBEDTLS_USE_PSA_CRYPTO)
4244 /*
4245 * In case opaque keys it's the user responsibility to keep the key valid
4246 * for the duration of the handshake and destroy it at the end
4247 */
4248 if ((opt.ecjpake_pw_opaque != DFL_ECJPAKE_PW_OPAQUE)) {
4249 psa_key_attributes_t check_attributes = PSA_KEY_ATTRIBUTES_INIT;
4250
4251 /* Verify that the key is still valid before destroying it */
4252 if (psa_get_key_attributes(ecjpake_pw_slot, &check_attributes) !=
4253 PSA_SUCCESS) {
4254 if (ret == 0) {
4255 ret = 1;
4256 }
4257 mbedtls_printf("The EC J-PAKE password key has unexpectedly been already destroyed\n");
4258 } else {
4259 psa_destroy_key(ecjpake_pw_slot);
4260 }
4261 }
4262 #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED && MBEDTLS_USE_PSA_CRYPTO */
4263
4264 #if defined(MBEDTLS_USE_PSA_CRYPTO) || defined(MBEDTLS_SSL_PROTO_TLS1_3)
4265 const char *message = mbedtls_test_helper_is_psa_leaking();
4266 if (message) {
4267 if (ret == 0) {
4268 ret = 1;
4269 }
4270 mbedtls_printf("PSA memory leak detected: %s\n", message);
4271 }
4272 #endif
4273
4274 /* For builds with MBEDTLS_TEST_USE_PSA_CRYPTO_RNG psa crypto
4275 * resources are freed by rng_free(). */
4276 #if (defined(MBEDTLS_USE_PSA_CRYPTO) || defined(MBEDTLS_SSL_PROTO_TLS1_3)) \
4277 && !defined(MBEDTLS_TEST_USE_PSA_CRYPTO_RNG)
4278 mbedtls_psa_crypto_free();
4279 #endif
4280
4281 rng_free(&rng);
4282
4283 mbedtls_free(buf);
4284
4285 #if defined(MBEDTLS_TEST_HOOKS)
4286 /* Let test hooks detect errors such as resource leaks.
4287 * Don't do it in query_config mode, because some test code prints
4288 * information to stdout and this gets mixed with the regular output. */
4289 if (opt.query_config_mode == DFL_QUERY_CONFIG_MODE) {
4290 if (test_hooks_failure_detected()) {
4291 if (ret == 0) {
4292 ret = 1;
4293 }
4294 mbedtls_printf("Test hooks detected errors.\n");
4295 }
4296 }
4297 test_hooks_free();
4298 #endif /* MBEDTLS_TEST_HOOKS */
4299
4300 #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
4301 #if defined(MBEDTLS_MEMORY_DEBUG)
4302 mbedtls_memory_buffer_alloc_status();
4303 #endif
4304 mbedtls_memory_buffer_alloc_free();
4305 #endif /* MBEDTLS_MEMORY_BUFFER_ALLOC_C */
4306
4307 if (opt.query_config_mode == DFL_QUERY_CONFIG_MODE) {
4308 mbedtls_printf(" done.\n");
4309 }
4310
4311 // Shell can not handle large exit numbers -> 1 for errors
4312 if (ret < 0) {
4313 ret = 1;
4314 }
4315
4316 if (opt.query_config_mode == DFL_QUERY_CONFIG_MODE) {
4317 mbedtls_exit(ret);
4318 } else {
4319 mbedtls_exit(query_config_ret);
4320 }
4321 }
4322 #endif /* !MBEDTLS_SSL_TEST_IMPOSSIBLE && MBEDTLS_SSL_SRV_C */
4323