xref: /aosp_15_r20/external/mbedtls/programs/ssl/ssl_client2.c (revision 62c56f9862f102b96d72393aff6076c951fb8148)
1*62c56f98SSadaf Ebrahimi /*
2*62c56f98SSadaf Ebrahimi  *  SSL client with certificate authentication
3*62c56f98SSadaf Ebrahimi  *
4*62c56f98SSadaf Ebrahimi  *  Copyright The Mbed TLS Contributors
5*62c56f98SSadaf Ebrahimi  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6*62c56f98SSadaf Ebrahimi  */
7*62c56f98SSadaf Ebrahimi 
8*62c56f98SSadaf Ebrahimi #define MBEDTLS_ALLOW_PRIVATE_ACCESS
9*62c56f98SSadaf Ebrahimi 
10*62c56f98SSadaf Ebrahimi #include "ssl_test_lib.h"
11*62c56f98SSadaf Ebrahimi 
12*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO) || defined(MBEDTLS_SSL_PROTO_TLS1_3)
13*62c56f98SSadaf Ebrahimi #include "test/psa_crypto_helpers.h"
14*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO || MBEDTLS_SSL_PROTO_TLS1_3 */
15*62c56f98SSadaf Ebrahimi 
16*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_TEST_IMPOSSIBLE)
main(void)17*62c56f98SSadaf Ebrahimi int main(void)
18*62c56f98SSadaf Ebrahimi {
19*62c56f98SSadaf Ebrahimi     mbedtls_printf(MBEDTLS_SSL_TEST_IMPOSSIBLE);
20*62c56f98SSadaf Ebrahimi     mbedtls_exit(0);
21*62c56f98SSadaf Ebrahimi }
22*62c56f98SSadaf Ebrahimi #elif !defined(MBEDTLS_SSL_CLI_C)
main(void)23*62c56f98SSadaf Ebrahimi int main(void)
24*62c56f98SSadaf Ebrahimi {
25*62c56f98SSadaf Ebrahimi     mbedtls_printf("MBEDTLS_SSL_CLI_C not defined.\n");
26*62c56f98SSadaf Ebrahimi     mbedtls_exit(0);
27*62c56f98SSadaf Ebrahimi }
28*62c56f98SSadaf Ebrahimi #else /* !MBEDTLS_SSL_TEST_IMPOSSIBLE && MBEDTLS_SSL_CLI_C */
29*62c56f98SSadaf Ebrahimi 
30*62c56f98SSadaf Ebrahimi /* Size of memory to be allocated for the heap, when using the library's memory
31*62c56f98SSadaf Ebrahimi  * management and MBEDTLS_MEMORY_BUFFER_ALLOC_C is enabled. */
32*62c56f98SSadaf Ebrahimi #define MEMORY_HEAP_SIZE      120000
33*62c56f98SSadaf Ebrahimi 
34*62c56f98SSadaf Ebrahimi #define MAX_REQUEST_SIZE      20000
35*62c56f98SSadaf Ebrahimi #define MAX_REQUEST_SIZE_STR "20000"
36*62c56f98SSadaf Ebrahimi 
37*62c56f98SSadaf Ebrahimi #define DFL_SERVER_NAME         "localhost"
38*62c56f98SSadaf Ebrahimi #define DFL_SERVER_ADDR         NULL
39*62c56f98SSadaf Ebrahimi #define DFL_SERVER_PORT         "4433"
40*62c56f98SSadaf Ebrahimi #define DFL_REQUEST_PAGE        "/"
41*62c56f98SSadaf Ebrahimi #define DFL_REQUEST_SIZE        -1
42*62c56f98SSadaf Ebrahimi #define DFL_DEBUG_LEVEL         0
43*62c56f98SSadaf Ebrahimi #define DFL_CONTEXT_CRT_CB      0
44*62c56f98SSadaf Ebrahimi #define DFL_NBIO                0
45*62c56f98SSadaf Ebrahimi #define DFL_EVENT               0
46*62c56f98SSadaf Ebrahimi #define DFL_READ_TIMEOUT        0
47*62c56f98SSadaf Ebrahimi #define DFL_MAX_RESEND          0
48*62c56f98SSadaf Ebrahimi #define DFL_CA_FILE             ""
49*62c56f98SSadaf Ebrahimi #define DFL_CA_PATH             ""
50*62c56f98SSadaf Ebrahimi #define DFL_CRT_FILE            ""
51*62c56f98SSadaf Ebrahimi #define DFL_KEY_FILE            ""
52*62c56f98SSadaf Ebrahimi #define DFL_KEY_OPAQUE          0
53*62c56f98SSadaf Ebrahimi #define DFL_KEY_PWD             ""
54*62c56f98SSadaf Ebrahimi #define DFL_PSK                 ""
55*62c56f98SSadaf Ebrahimi #define DFL_EARLY_DATA          MBEDTLS_SSL_EARLY_DATA_DISABLED
56*62c56f98SSadaf Ebrahimi #define DFL_PSK_OPAQUE          0
57*62c56f98SSadaf Ebrahimi #define DFL_PSK_IDENTITY        "Client_identity"
58*62c56f98SSadaf Ebrahimi #define DFL_ECJPAKE_PW          NULL
59*62c56f98SSadaf Ebrahimi #define DFL_ECJPAKE_PW_OPAQUE   0
60*62c56f98SSadaf Ebrahimi #define DFL_EC_MAX_OPS          -1
61*62c56f98SSadaf Ebrahimi #define DFL_FORCE_CIPHER        0
62*62c56f98SSadaf Ebrahimi #define DFL_TLS1_3_KEX_MODES    MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_ALL
63*62c56f98SSadaf Ebrahimi #define DFL_RENEGOTIATION       MBEDTLS_SSL_RENEGOTIATION_DISABLED
64*62c56f98SSadaf Ebrahimi #define DFL_ALLOW_LEGACY        -2
65*62c56f98SSadaf Ebrahimi #define DFL_RENEGOTIATE         0
66*62c56f98SSadaf Ebrahimi #define DFL_EXCHANGES           1
67*62c56f98SSadaf Ebrahimi #define DFL_MIN_VERSION         -1
68*62c56f98SSadaf Ebrahimi #define DFL_MAX_VERSION         -1
69*62c56f98SSadaf Ebrahimi #define DFL_SHA1                -1
70*62c56f98SSadaf Ebrahimi #define DFL_AUTH_MODE           -1
71*62c56f98SSadaf Ebrahimi #define DFL_MFL_CODE            MBEDTLS_SSL_MAX_FRAG_LEN_NONE
72*62c56f98SSadaf Ebrahimi #define DFL_TRUNC_HMAC          -1
73*62c56f98SSadaf Ebrahimi #define DFL_RECSPLIT            -1
74*62c56f98SSadaf Ebrahimi #define DFL_DHMLEN              -1
75*62c56f98SSadaf Ebrahimi #define DFL_RECONNECT           0
76*62c56f98SSadaf Ebrahimi #define DFL_RECO_SERVER_NAME    NULL
77*62c56f98SSadaf Ebrahimi #define DFL_RECO_DELAY          0
78*62c56f98SSadaf Ebrahimi #define DFL_RECO_MODE           1
79*62c56f98SSadaf Ebrahimi #define DFL_CID_ENABLED         0
80*62c56f98SSadaf Ebrahimi #define DFL_CID_VALUE           ""
81*62c56f98SSadaf Ebrahimi #define DFL_CID_ENABLED_RENEGO  -1
82*62c56f98SSadaf Ebrahimi #define DFL_CID_VALUE_RENEGO    NULL
83*62c56f98SSadaf Ebrahimi #define DFL_RECONNECT_HARD      0
84*62c56f98SSadaf Ebrahimi #define DFL_TICKETS             MBEDTLS_SSL_SESSION_TICKETS_ENABLED
85*62c56f98SSadaf Ebrahimi #define DFL_ALPN_STRING         NULL
86*62c56f98SSadaf Ebrahimi #define DFL_GROUPS              NULL
87*62c56f98SSadaf Ebrahimi #define DFL_SIG_ALGS            NULL
88*62c56f98SSadaf Ebrahimi #define DFL_TRANSPORT           MBEDTLS_SSL_TRANSPORT_STREAM
89*62c56f98SSadaf Ebrahimi #define DFL_HS_TO_MIN           0
90*62c56f98SSadaf Ebrahimi #define DFL_HS_TO_MAX           0
91*62c56f98SSadaf Ebrahimi #define DFL_DTLS_MTU            -1
92*62c56f98SSadaf Ebrahimi #define DFL_DGRAM_PACKING        1
93*62c56f98SSadaf Ebrahimi #define DFL_FALLBACK            -1
94*62c56f98SSadaf Ebrahimi #define DFL_EXTENDED_MS         -1
95*62c56f98SSadaf Ebrahimi #define DFL_ETM                 -1
96*62c56f98SSadaf Ebrahimi #define DFL_SERIALIZE           0
97*62c56f98SSadaf Ebrahimi #define DFL_CONTEXT_FILE        ""
98*62c56f98SSadaf Ebrahimi #define DFL_EXTENDED_MS_ENFORCE -1
99*62c56f98SSadaf Ebrahimi #define DFL_CA_CALLBACK         0
100*62c56f98SSadaf Ebrahimi #define DFL_EAP_TLS             0
101*62c56f98SSadaf Ebrahimi #define DFL_REPRODUCIBLE        0
102*62c56f98SSadaf Ebrahimi #define DFL_NSS_KEYLOG          0
103*62c56f98SSadaf Ebrahimi #define DFL_NSS_KEYLOG_FILE     NULL
104*62c56f98SSadaf Ebrahimi #define DFL_SKIP_CLOSE_NOTIFY   0
105*62c56f98SSadaf Ebrahimi #define DFL_QUERY_CONFIG_MODE   0
106*62c56f98SSadaf Ebrahimi #define DFL_USE_SRTP            0
107*62c56f98SSadaf Ebrahimi #define DFL_SRTP_FORCE_PROFILE  0
108*62c56f98SSadaf Ebrahimi #define DFL_SRTP_MKI            ""
109*62c56f98SSadaf Ebrahimi #define DFL_KEY_OPAQUE_ALG      "none"
110*62c56f98SSadaf Ebrahimi 
111*62c56f98SSadaf Ebrahimi #define GET_REQUEST "GET %s HTTP/1.0\r\nExtra-header: "
112*62c56f98SSadaf Ebrahimi #define GET_REQUEST_END "\r\n\r\n"
113*62c56f98SSadaf Ebrahimi 
114*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
115*62c56f98SSadaf Ebrahimi #define USAGE_CONTEXT_CRT_CB \
116*62c56f98SSadaf Ebrahimi     "    context_crt_cb=%%d   This determines whether the CRT verification callback is bound\n" \
117*62c56f98SSadaf Ebrahimi     "                        to the SSL configuration of the SSL context.\n" \
118*62c56f98SSadaf Ebrahimi     "                        Possible values:\n" \
119*62c56f98SSadaf Ebrahimi     "                        - 0 (default): Use CRT callback bound to configuration\n" \
120*62c56f98SSadaf Ebrahimi     "                        - 1: Use CRT callback bound to SSL context\n"
121*62c56f98SSadaf Ebrahimi #else
122*62c56f98SSadaf Ebrahimi #define USAGE_CONTEXT_CRT_CB ""
123*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
124*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
125*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_FS_IO)
126*62c56f98SSadaf Ebrahimi #define USAGE_IO \
127*62c56f98SSadaf Ebrahimi     "    ca_file=%%s          The single file containing the top-level CA(s) you fully trust\n" \
128*62c56f98SSadaf Ebrahimi     "                        default: \"\" (pre-loaded)\n" \
129*62c56f98SSadaf Ebrahimi     "                        use \"none\" to skip loading any top-level CAs.\n" \
130*62c56f98SSadaf Ebrahimi     "    ca_path=%%s          The path containing the top-level CA(s) you fully trust\n" \
131*62c56f98SSadaf Ebrahimi     "                        default: \"\" (pre-loaded) (overrides ca_file)\n" \
132*62c56f98SSadaf Ebrahimi     "                        use \"none\" to skip loading any top-level CAs.\n" \
133*62c56f98SSadaf Ebrahimi     "    crt_file=%%s         Your own cert and chain (in bottom to top order, top may be omitted)\n" \
134*62c56f98SSadaf Ebrahimi     "                        default: \"\" (pre-loaded)\n" \
135*62c56f98SSadaf Ebrahimi     "    key_file=%%s         default: \"\" (pre-loaded)\n" \
136*62c56f98SSadaf Ebrahimi     "    key_pwd=%%s          Password for key specified by key_file argument\n" \
137*62c56f98SSadaf Ebrahimi     "                        default: none\n"
138*62c56f98SSadaf Ebrahimi #else
139*62c56f98SSadaf Ebrahimi #define USAGE_IO \
140*62c56f98SSadaf Ebrahimi     "    No file operations available (MBEDTLS_FS_IO not defined)\n"
141*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_FS_IO */
142*62c56f98SSadaf Ebrahimi #else /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
143*62c56f98SSadaf Ebrahimi #define USAGE_IO ""
144*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
145*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO) && defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
146*62c56f98SSadaf Ebrahimi #define USAGE_KEY_OPAQUE \
147*62c56f98SSadaf Ebrahimi     "    key_opaque=%%d       Handle your private key as if it were opaque\n" \
148*62c56f98SSadaf Ebrahimi     "                        default: 0 (disabled)\n"
149*62c56f98SSadaf Ebrahimi #else
150*62c56f98SSadaf Ebrahimi #define USAGE_KEY_OPAQUE ""
151*62c56f98SSadaf Ebrahimi #endif
152*62c56f98SSadaf Ebrahimi 
153*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
154*62c56f98SSadaf Ebrahimi #define USAGE_CID \
155*62c56f98SSadaf Ebrahimi     "    cid=%%d             Disable (0) or enable (1) the use of the DTLS Connection ID extension.\n" \
156*62c56f98SSadaf Ebrahimi     "                       default: 0 (disabled)\n"     \
157*62c56f98SSadaf Ebrahimi     "    cid_renego=%%d      Disable (0) or enable (1) the use of the DTLS Connection ID extension during renegotiation.\n" \
158*62c56f98SSadaf Ebrahimi     "                       default: same as 'cid' parameter\n"     \
159*62c56f98SSadaf Ebrahimi     "    cid_val=%%s          The CID to use for incoming messages (in hex, without 0x).\n"  \
160*62c56f98SSadaf Ebrahimi     "                        default: \"\"\n" \
161*62c56f98SSadaf Ebrahimi     "    cid_val_renego=%%s   The CID to use for incoming messages (in hex, without 0x) after renegotiation.\n"  \
162*62c56f98SSadaf Ebrahimi     "                        default: same as 'cid_val' parameter\n"
163*62c56f98SSadaf Ebrahimi #else /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
164*62c56f98SSadaf Ebrahimi #define USAGE_CID ""
165*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
166*62c56f98SSadaf Ebrahimi 
167*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
168*62c56f98SSadaf Ebrahimi #define USAGE_PSK_RAW                                               \
169*62c56f98SSadaf Ebrahimi     "    psk=%%s              default: \"\" (disabled)\n"     \
170*62c56f98SSadaf Ebrahimi     "                          The PSK values are in hex, without 0x.\n" \
171*62c56f98SSadaf Ebrahimi     "    psk_identity=%%s     default: \"Client_identity\"\n"
172*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
173*62c56f98SSadaf Ebrahimi #define USAGE_PSK_SLOT                          \
174*62c56f98SSadaf Ebrahimi     "    psk_opaque=%%d       default: 0 (don't use opaque static PSK)\n"     \
175*62c56f98SSadaf Ebrahimi     "                          Enable this to store the PSK configured through command line\n" \
176*62c56f98SSadaf Ebrahimi     "                          parameter `psk` in a PSA-based key slot.\n" \
177*62c56f98SSadaf Ebrahimi     "                          Note: Currently only supported in conjunction with\n"                  \
178*62c56f98SSadaf Ebrahimi     "                          the use of min_version to force TLS 1.2 and force_ciphersuite \n"      \
179*62c56f98SSadaf Ebrahimi     "                          to force a particular PSK-only ciphersuite.\n"                         \
180*62c56f98SSadaf Ebrahimi     "                          Note: This is to test integration of PSA-based opaque PSKs with\n"     \
181*62c56f98SSadaf Ebrahimi     "                          Mbed TLS only. Production systems are likely to configure Mbed TLS\n"  \
182*62c56f98SSadaf Ebrahimi     "                          with prepopulated key slots instead of importing raw key material.\n"
183*62c56f98SSadaf Ebrahimi #else
184*62c56f98SSadaf Ebrahimi #define USAGE_PSK_SLOT ""
185*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
186*62c56f98SSadaf Ebrahimi #define USAGE_PSK USAGE_PSK_RAW USAGE_PSK_SLOT
187*62c56f98SSadaf Ebrahimi #else
188*62c56f98SSadaf Ebrahimi #define USAGE_PSK ""
189*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */
190*62c56f98SSadaf Ebrahimi 
191*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
192*62c56f98SSadaf Ebrahimi #define USAGE_CA_CALLBACK                       \
193*62c56f98SSadaf Ebrahimi     "   ca_callback=%%d       default: 0 (disabled)\n"      \
194*62c56f98SSadaf Ebrahimi     "                         Enable this to use the trusted certificate callback function\n"
195*62c56f98SSadaf Ebrahimi #else
196*62c56f98SSadaf Ebrahimi #define USAGE_CA_CALLBACK ""
197*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
198*62c56f98SSadaf Ebrahimi 
199*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SESSION_TICKETS)
200*62c56f98SSadaf Ebrahimi #define USAGE_TICKETS                                       \
201*62c56f98SSadaf Ebrahimi     "    tickets=%%d          default: 1 (enabled)\n"
202*62c56f98SSadaf Ebrahimi #else
203*62c56f98SSadaf Ebrahimi #define USAGE_TICKETS ""
204*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SESSION_TICKETS */
205*62c56f98SSadaf Ebrahimi 
206*62c56f98SSadaf Ebrahimi #define USAGE_EAP_TLS                                       \
207*62c56f98SSadaf Ebrahimi     "    eap_tls=%%d          default: 0 (disabled)\n"
208*62c56f98SSadaf Ebrahimi #define USAGE_NSS_KEYLOG                                    \
209*62c56f98SSadaf Ebrahimi     "    nss_keylog=%%d          default: 0 (disabled)\n"               \
210*62c56f98SSadaf Ebrahimi     "                             This cannot be used with eap_tls=1\n"
211*62c56f98SSadaf Ebrahimi #define USAGE_NSS_KEYLOG_FILE                               \
212*62c56f98SSadaf Ebrahimi     "    nss_keylog_file=%%s\n"
213*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_SRTP)
214*62c56f98SSadaf Ebrahimi #define USAGE_SRTP \
215*62c56f98SSadaf Ebrahimi     "    use_srtp=%%d         default: 0 (disabled)\n" \
216*62c56f98SSadaf Ebrahimi     "                          This cannot be used with eap_tls=1 or " \
217*62c56f98SSadaf Ebrahimi     "                          nss_keylog=1\n"             \
218*62c56f98SSadaf Ebrahimi     "    srtp_force_profile=%%d  default: 0 (all enabled)\n"   \
219*62c56f98SSadaf Ebrahimi     "                        available profiles:\n"       \
220*62c56f98SSadaf Ebrahimi     "                        1 - SRTP_AES128_CM_HMAC_SHA1_80\n"  \
221*62c56f98SSadaf Ebrahimi     "                        2 - SRTP_AES128_CM_HMAC_SHA1_32\n"  \
222*62c56f98SSadaf Ebrahimi     "                        3 - SRTP_NULL_HMAC_SHA1_80\n"       \
223*62c56f98SSadaf Ebrahimi     "                        4 - SRTP_NULL_HMAC_SHA1_32\n"       \
224*62c56f98SSadaf Ebrahimi     "    mki=%%s              default: \"\" (in hex, without 0x)\n"
225*62c56f98SSadaf Ebrahimi #else /* MBEDTLS_SSL_DTLS_SRTP */
226*62c56f98SSadaf Ebrahimi #define USAGE_SRTP ""
227*62c56f98SSadaf Ebrahimi #endif
228*62c56f98SSadaf Ebrahimi 
229*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
230*62c56f98SSadaf Ebrahimi #define USAGE_MAX_FRAG_LEN                                      \
231*62c56f98SSadaf Ebrahimi     "    max_frag_len=%%d     default: 16384 (tls default)\n"   \
232*62c56f98SSadaf Ebrahimi     "                        options: 512, 1024, 2048, 4096\n"
233*62c56f98SSadaf Ebrahimi #else
234*62c56f98SSadaf Ebrahimi #define USAGE_MAX_FRAG_LEN ""
235*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
236*62c56f98SSadaf Ebrahimi 
237*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_DHM_C)
238*62c56f98SSadaf Ebrahimi #define USAGE_DHMLEN \
239*62c56f98SSadaf Ebrahimi     "    dhmlen=%%d           default: (library default: 1024 bits)\n"
240*62c56f98SSadaf Ebrahimi #else
241*62c56f98SSadaf Ebrahimi #define USAGE_DHMLEN
242*62c56f98SSadaf Ebrahimi #endif
243*62c56f98SSadaf Ebrahimi 
244*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ALPN)
245*62c56f98SSadaf Ebrahimi #define USAGE_ALPN \
246*62c56f98SSadaf Ebrahimi     "    alpn=%%s             default: \"\" (disabled)\n"   \
247*62c56f98SSadaf Ebrahimi     "                        example: spdy/1,http/1.1\n"
248*62c56f98SSadaf Ebrahimi #else
249*62c56f98SSadaf Ebrahimi #define USAGE_ALPN ""
250*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_ALPN */
251*62c56f98SSadaf Ebrahimi 
252*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PK_HAVE_ECC_KEYS) || \
253*62c56f98SSadaf Ebrahimi     (defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED) && \
254*62c56f98SSadaf Ebrahimi     defined(PSA_WANT_ALG_FFDH))
255*62c56f98SSadaf Ebrahimi #define USAGE_GROUPS \
256*62c56f98SSadaf Ebrahimi     "    groups=a,b,c,d      default: \"default\" (library default)\n"        \
257*62c56f98SSadaf Ebrahimi     "                        example: \"secp521r1,brainpoolP512r1\"\n"        \
258*62c56f98SSadaf Ebrahimi     "                        - use \"none\" for empty list\n"                 \
259*62c56f98SSadaf Ebrahimi     "                        - see mbedtls_ecp_curve_list()\n"                \
260*62c56f98SSadaf Ebrahimi     "                          for acceptable EC group names\n"               \
261*62c56f98SSadaf Ebrahimi     "                        - the following ffdh groups are supported:\n"    \
262*62c56f98SSadaf Ebrahimi     "                          ffdhe2048, ffdhe3072, ffdhe4096, ffdhe6144,\n" \
263*62c56f98SSadaf Ebrahimi     "                          ffdhe8192\n"
264*62c56f98SSadaf Ebrahimi #else
265*62c56f98SSadaf Ebrahimi #define USAGE_GROUPS ""
266*62c56f98SSadaf Ebrahimi #endif
267*62c56f98SSadaf Ebrahimi 
268*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
269*62c56f98SSadaf Ebrahimi #define USAGE_SIG_ALGS \
270*62c56f98SSadaf Ebrahimi     "    sig_algs=a,b,c,d      default: \"default\" (library default)\n"  \
271*62c56f98SSadaf Ebrahimi     "                          example: \"ecdsa_secp256r1_sha256,ecdsa_secp384r1_sha384\"\n"
272*62c56f98SSadaf Ebrahimi #else
273*62c56f98SSadaf Ebrahimi #define USAGE_SIG_ALGS ""
274*62c56f98SSadaf Ebrahimi #endif
275*62c56f98SSadaf Ebrahimi 
276*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
277*62c56f98SSadaf Ebrahimi #define USAGE_DTLS \
278*62c56f98SSadaf Ebrahimi     "    dtls=%%d             default: 0 (TLS)\n"                           \
279*62c56f98SSadaf Ebrahimi     "    hs_timeout=%%d-%%d    default: (library default: 1000-60000)\n"    \
280*62c56f98SSadaf Ebrahimi     "                        range of DTLS handshake timeouts in millisecs\n" \
281*62c56f98SSadaf Ebrahimi     "    mtu=%%d              default: (library default: unlimited)\n"  \
282*62c56f98SSadaf Ebrahimi     "    dgram_packing=%%d    default: 1 (allowed)\n"                   \
283*62c56f98SSadaf Ebrahimi     "                        allow or forbid packing of multiple\n" \
284*62c56f98SSadaf Ebrahimi     "                        records within a single datgram.\n"
285*62c56f98SSadaf Ebrahimi #else
286*62c56f98SSadaf Ebrahimi #define USAGE_DTLS ""
287*62c56f98SSadaf Ebrahimi #endif
288*62c56f98SSadaf Ebrahimi 
289*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
290*62c56f98SSadaf Ebrahimi #define USAGE_EMS \
291*62c56f98SSadaf Ebrahimi     "    extended_ms=0/1     default: (library default: on)\n"
292*62c56f98SSadaf Ebrahimi #else
293*62c56f98SSadaf Ebrahimi #define USAGE_EMS ""
294*62c56f98SSadaf Ebrahimi #endif
295*62c56f98SSadaf Ebrahimi 
296*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
297*62c56f98SSadaf Ebrahimi #define USAGE_ETM \
298*62c56f98SSadaf Ebrahimi     "    etm=0/1             default: (library default: on)\n"
299*62c56f98SSadaf Ebrahimi #else
300*62c56f98SSadaf Ebrahimi #define USAGE_ETM ""
301*62c56f98SSadaf Ebrahimi #endif
302*62c56f98SSadaf Ebrahimi 
303*62c56f98SSadaf Ebrahimi #define USAGE_REPRODUCIBLE \
304*62c56f98SSadaf Ebrahimi     "    reproducible=0/1     default: 0 (disabled)\n"
305*62c56f98SSadaf Ebrahimi 
306*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_RENEGOTIATION)
307*62c56f98SSadaf Ebrahimi #define USAGE_RENEGO \
308*62c56f98SSadaf Ebrahimi     "    renegotiation=%%d    default: 0 (disabled)\n"      \
309*62c56f98SSadaf Ebrahimi     "    renegotiate=%%d      default: 0 (disabled)\n"
310*62c56f98SSadaf Ebrahimi #else
311*62c56f98SSadaf Ebrahimi #define USAGE_RENEGO ""
312*62c56f98SSadaf Ebrahimi #endif
313*62c56f98SSadaf Ebrahimi 
314*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
315*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
316*62c56f98SSadaf Ebrahimi #define USAGE_ECJPAKE \
317*62c56f98SSadaf Ebrahimi     "    ecjpake_pw=%%s           default: none (disabled)\n"   \
318*62c56f98SSadaf Ebrahimi     "    ecjpake_pw_opaque=%%d    default: 0 (disabled)\n"
319*62c56f98SSadaf Ebrahimi #else /* MBEDTLS_USE_PSA_CRYPTO */
320*62c56f98SSadaf Ebrahimi #define USAGE_ECJPAKE \
321*62c56f98SSadaf Ebrahimi     "    ecjpake_pw=%%s           default: none (disabled)\n"
322*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
323*62c56f98SSadaf Ebrahimi #else /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
324*62c56f98SSadaf Ebrahimi #define USAGE_ECJPAKE ""
325*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
326*62c56f98SSadaf Ebrahimi 
327*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_RESTARTABLE)
328*62c56f98SSadaf Ebrahimi #define USAGE_ECRESTART \
329*62c56f98SSadaf Ebrahimi     "    ec_max_ops=%%s       default: library default (restart disabled)\n"
330*62c56f98SSadaf Ebrahimi #else
331*62c56f98SSadaf Ebrahimi #define USAGE_ECRESTART ""
332*62c56f98SSadaf Ebrahimi #endif
333*62c56f98SSadaf Ebrahimi 
334*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
335*62c56f98SSadaf Ebrahimi #define USAGE_SERIALIZATION \
336*62c56f98SSadaf Ebrahimi     "    serialize=%%d        default: 0 (do not serialize/deserialize)\n"     \
337*62c56f98SSadaf Ebrahimi     "                        options: 1 (serialize)\n"                         \
338*62c56f98SSadaf Ebrahimi     "                                 2 (serialize with re-initialization)\n"  \
339*62c56f98SSadaf Ebrahimi     "    context_file=%%s     The file path to write a serialized connection\n" \
340*62c56f98SSadaf Ebrahimi     "                        in the form of base64 code (serialize option\n"   \
341*62c56f98SSadaf Ebrahimi     "                        must be set)\n"                                   \
342*62c56f98SSadaf Ebrahimi     "                         default: \"\" (do nothing)\n"                    \
343*62c56f98SSadaf Ebrahimi     "                         option: a file path\n"
344*62c56f98SSadaf Ebrahimi #else
345*62c56f98SSadaf Ebrahimi #define USAGE_SERIALIZATION ""
346*62c56f98SSadaf Ebrahimi #endif
347*62c56f98SSadaf Ebrahimi 
348*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_EARLY_DATA)
349*62c56f98SSadaf Ebrahimi #define USAGE_EARLY_DATA \
350*62c56f98SSadaf Ebrahimi     "    early_data=%%d        default: 0 (disabled)\n"      \
351*62c56f98SSadaf Ebrahimi     "                        options: 0 (disabled), 1 (enabled)\n"
352*62c56f98SSadaf Ebrahimi #else
353*62c56f98SSadaf Ebrahimi #define USAGE_EARLY_DATA ""
354*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_EARLY_DATA && MBEDTLS_SSL_PROTO_TLS1_3 */
355*62c56f98SSadaf Ebrahimi 
356*62c56f98SSadaf Ebrahimi #define USAGE_KEY_OPAQUE_ALGS \
357*62c56f98SSadaf Ebrahimi     "    key_opaque_algs=%%s  Allowed opaque key algorithms.\n"                      \
358*62c56f98SSadaf Ebrahimi     "                        comma-separated pair of values among the following:\n"    \
359*62c56f98SSadaf Ebrahimi     "                        rsa-sign-pkcs1, rsa-sign-pss, rsa-sign-pss-sha256,\n"     \
360*62c56f98SSadaf Ebrahimi     "                        rsa-sign-pss-sha384, rsa-sign-pss-sha512, rsa-decrypt,\n" \
361*62c56f98SSadaf Ebrahimi     "                        ecdsa-sign, ecdh, none (only acceptable for\n"            \
362*62c56f98SSadaf Ebrahimi     "                        the second value).\n"                                     \
363*62c56f98SSadaf Ebrahimi 
364*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
365*62c56f98SSadaf Ebrahimi #define USAGE_TLS1_3_KEY_EXCHANGE_MODES \
366*62c56f98SSadaf Ebrahimi     "    tls13_kex_modes=%%s   default: all\n"     \
367*62c56f98SSadaf Ebrahimi     "                          options: psk, psk_ephemeral, psk_all, ephemeral,\n"     \
368*62c56f98SSadaf Ebrahimi     "                                   ephemeral_all, all, psk_or_ephemeral\n"
369*62c56f98SSadaf Ebrahimi #else
370*62c56f98SSadaf Ebrahimi #define USAGE_TLS1_3_KEY_EXCHANGE_MODES ""
371*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
372*62c56f98SSadaf Ebrahimi 
373*62c56f98SSadaf Ebrahimi /* USAGE is arbitrarily split to stay under the portable string literal
374*62c56f98SSadaf Ebrahimi  * length limit: 4095 bytes in C99. */
375*62c56f98SSadaf Ebrahimi #define USAGE1 \
376*62c56f98SSadaf Ebrahimi     "\n usage: ssl_client2 param=<>...\n"                   \
377*62c56f98SSadaf Ebrahimi     "\n acceptable parameters:\n"                           \
378*62c56f98SSadaf Ebrahimi     "    server_name=%%s      default: localhost\n"         \
379*62c56f98SSadaf Ebrahimi     "    server_addr=%%s      default: given by name\n"     \
380*62c56f98SSadaf Ebrahimi     "    server_port=%%d      default: 4433\n"              \
381*62c56f98SSadaf Ebrahimi     "    request_page=%%s     default: \".\"\n"             \
382*62c56f98SSadaf Ebrahimi     "    request_size=%%d     default: about 34 (basic request)\n"           \
383*62c56f98SSadaf Ebrahimi     "                        (minimum: 0, max: " MAX_REQUEST_SIZE_STR ")\n"  \
384*62c56f98SSadaf Ebrahimi                                                                       "                        If 0, in the first exchange only an empty\n"    \
385*62c56f98SSadaf Ebrahimi                                                                       "                        application data message is sent followed by\n" \
386*62c56f98SSadaf Ebrahimi                                                                       "                        a second non-empty message before attempting\n" \
387*62c56f98SSadaf Ebrahimi                                                                       "                        to read a response from the server\n"           \
388*62c56f98SSadaf Ebrahimi                                                                       "    debug_level=%%d      default: 0 (disabled)\n"             \
389*62c56f98SSadaf Ebrahimi                                                                       "    build_version=%%d    default: none (disabled)\n"                     \
390*62c56f98SSadaf Ebrahimi                                                                       "                        option: 1 (print build version only and stop)\n" \
391*62c56f98SSadaf Ebrahimi                                                                       "    nbio=%%d             default: 0 (blocking I/O)\n"         \
392*62c56f98SSadaf Ebrahimi                                                                       "                        options: 1 (non-blocking), 2 (added delays)\n"   \
393*62c56f98SSadaf Ebrahimi                                                                       "    event=%%d            default: 0 (loop)\n"                            \
394*62c56f98SSadaf Ebrahimi                                                                       "                        options: 1 (level-triggered, implies nbio=1),\n" \
395*62c56f98SSadaf Ebrahimi                                                                       "    read_timeout=%%d     default: 0 ms (no timeout)\n"        \
396*62c56f98SSadaf Ebrahimi                                                                       "    max_resend=%%d       default: 0 (no resend on timeout)\n" \
397*62c56f98SSadaf Ebrahimi                                                                       "    skip_close_notify=%%d default: 0 (send close_notify)\n" \
398*62c56f98SSadaf Ebrahimi                                                                       "\n"                                                    \
399*62c56f98SSadaf Ebrahimi     USAGE_DTLS                                              \
400*62c56f98SSadaf Ebrahimi     USAGE_CID                                               \
401*62c56f98SSadaf Ebrahimi     USAGE_SRTP                                              \
402*62c56f98SSadaf Ebrahimi     "\n"
403*62c56f98SSadaf Ebrahimi #define USAGE2 \
404*62c56f98SSadaf Ebrahimi     "    auth_mode=%%s        default: (library default: none)\n" \
405*62c56f98SSadaf Ebrahimi     "                        options: none, optional, required\n" \
406*62c56f98SSadaf Ebrahimi     USAGE_IO                                                \
407*62c56f98SSadaf Ebrahimi     USAGE_KEY_OPAQUE                                        \
408*62c56f98SSadaf Ebrahimi     USAGE_CA_CALLBACK                                       \
409*62c56f98SSadaf Ebrahimi     "\n"                                                    \
410*62c56f98SSadaf Ebrahimi     USAGE_PSK                                               \
411*62c56f98SSadaf Ebrahimi     USAGE_ECJPAKE                                           \
412*62c56f98SSadaf Ebrahimi     USAGE_ECRESTART                                         \
413*62c56f98SSadaf Ebrahimi     "\n"
414*62c56f98SSadaf Ebrahimi #define USAGE3 \
415*62c56f98SSadaf Ebrahimi     "    allow_legacy=%%d     default: (library default: no)\n"   \
416*62c56f98SSadaf Ebrahimi     USAGE_RENEGO                                            \
417*62c56f98SSadaf Ebrahimi     "    exchanges=%%d        default: 1\n"                 \
418*62c56f98SSadaf Ebrahimi     "    reconnect=%%d        number of reconnections using session resumption\n" \
419*62c56f98SSadaf Ebrahimi     "                        default: 0 (disabled)\n"       \
420*62c56f98SSadaf Ebrahimi     "    reco_server_name=%%s  default: NULL\n"             \
421*62c56f98SSadaf Ebrahimi     "    reco_delay=%%d       default: 0 milliseconds\n"         \
422*62c56f98SSadaf Ebrahimi     "    reco_mode=%%d        0: copy session, 1: serialize session\n" \
423*62c56f98SSadaf Ebrahimi     "                        default: 1\n"      \
424*62c56f98SSadaf Ebrahimi     "    reconnect_hard=%%d   default: 0 (disabled)\n"      \
425*62c56f98SSadaf Ebrahimi     USAGE_TICKETS                                           \
426*62c56f98SSadaf Ebrahimi     USAGE_EAP_TLS                                           \
427*62c56f98SSadaf Ebrahimi     USAGE_MAX_FRAG_LEN                                      \
428*62c56f98SSadaf Ebrahimi     USAGE_CONTEXT_CRT_CB                                    \
429*62c56f98SSadaf Ebrahimi     USAGE_ALPN                                              \
430*62c56f98SSadaf Ebrahimi     USAGE_EMS                                               \
431*62c56f98SSadaf Ebrahimi     USAGE_ETM                                               \
432*62c56f98SSadaf Ebrahimi     USAGE_REPRODUCIBLE                                      \
433*62c56f98SSadaf Ebrahimi     USAGE_GROUPS                                            \
434*62c56f98SSadaf Ebrahimi     USAGE_SIG_ALGS                                          \
435*62c56f98SSadaf Ebrahimi     USAGE_EARLY_DATA                                        \
436*62c56f98SSadaf Ebrahimi     USAGE_DHMLEN                                            \
437*62c56f98SSadaf Ebrahimi     USAGE_KEY_OPAQUE_ALGS                                   \
438*62c56f98SSadaf Ebrahimi     "\n"
439*62c56f98SSadaf Ebrahimi 
440*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
441*62c56f98SSadaf Ebrahimi #define TLS1_3_VERSION_OPTIONS  ", tls13"
442*62c56f98SSadaf Ebrahimi #else /* MBEDTLS_SSL_PROTO_TLS1_3 */
443*62c56f98SSadaf Ebrahimi #define TLS1_3_VERSION_OPTIONS  ""
444*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_SSL_PROTO_TLS1_3 */
445*62c56f98SSadaf Ebrahimi 
446*62c56f98SSadaf Ebrahimi #define USAGE4 \
447*62c56f98SSadaf Ebrahimi     "    allow_sha1=%%d       default: 0\n"                                   \
448*62c56f98SSadaf Ebrahimi     "    min_version=%%s      default: (library default: tls12)\n"            \
449*62c56f98SSadaf Ebrahimi     "    max_version=%%s      default: (library default: tls12)\n"            \
450*62c56f98SSadaf Ebrahimi     "    force_version=%%s    default: \"\" (none)\n"                         \
451*62c56f98SSadaf Ebrahimi     "                         options: tls12, dtls12" TLS1_3_VERSION_OPTIONS  \
452*62c56f98SSadaf Ebrahimi     "\n\n"                                                                    \
453*62c56f98SSadaf Ebrahimi     "    force_ciphersuite=<name>    default: all enabled\n"                  \
454*62c56f98SSadaf Ebrahimi     USAGE_TLS1_3_KEY_EXCHANGE_MODES                                           \
455*62c56f98SSadaf Ebrahimi     "    query_config=<name>         return 0 if the specified\n"             \
456*62c56f98SSadaf Ebrahimi     "                                configuration macro is defined and 1\n"  \
457*62c56f98SSadaf Ebrahimi     "                                otherwise. The expansion of the macro\n" \
458*62c56f98SSadaf Ebrahimi     "                                is printed if it is defined\n"           \
459*62c56f98SSadaf Ebrahimi     USAGE_SERIALIZATION                                                       \
460*62c56f98SSadaf Ebrahimi     " acceptable ciphersuite names:\n"
461*62c56f98SSadaf Ebrahimi 
462*62c56f98SSadaf Ebrahimi /*
463*62c56f98SSadaf Ebrahimi  * global options
464*62c56f98SSadaf Ebrahimi  */
465*62c56f98SSadaf Ebrahimi struct options {
466*62c56f98SSadaf Ebrahimi     const char *server_name;    /* hostname of the server (client only)     */
467*62c56f98SSadaf Ebrahimi     const char *server_addr;    /* address of the server (client only)      */
468*62c56f98SSadaf Ebrahimi     const char *server_port;    /* port on which the ssl service runs       */
469*62c56f98SSadaf Ebrahimi     int debug_level;            /* level of debugging                       */
470*62c56f98SSadaf Ebrahimi     int nbio;                   /* should I/O be blocking?                  */
471*62c56f98SSadaf Ebrahimi     int event;                  /* loop or event-driven IO? level or edge triggered? */
472*62c56f98SSadaf Ebrahimi     uint32_t read_timeout;      /* timeout on mbedtls_ssl_read() in milliseconds     */
473*62c56f98SSadaf Ebrahimi     int max_resend;             /* DTLS times to resend on read timeout     */
474*62c56f98SSadaf Ebrahimi     const char *request_page;   /* page on server to request                */
475*62c56f98SSadaf Ebrahimi     int request_size;           /* pad request with header to requested size */
476*62c56f98SSadaf Ebrahimi     const char *ca_file;        /* the file with the CA certificate(s)      */
477*62c56f98SSadaf Ebrahimi     const char *ca_path;        /* the path with the CA certificate(s) reside */
478*62c56f98SSadaf Ebrahimi     const char *crt_file;       /* the file with the client certificate     */
479*62c56f98SSadaf Ebrahimi     const char *key_file;       /* the file with the client key             */
480*62c56f98SSadaf Ebrahimi     int key_opaque;             /* handle private key as if it were opaque  */
481*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
482*62c56f98SSadaf Ebrahimi     int psk_opaque;
483*62c56f98SSadaf Ebrahimi #endif
484*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
485*62c56f98SSadaf Ebrahimi     int ca_callback;            /* Use callback for trusted certificate list */
486*62c56f98SSadaf Ebrahimi #endif
487*62c56f98SSadaf Ebrahimi     const char *key_pwd;        /* the password for the client key          */
488*62c56f98SSadaf Ebrahimi     const char *psk;            /* the pre-shared key                       */
489*62c56f98SSadaf Ebrahimi     const char *psk_identity;   /* the pre-shared key identity              */
490*62c56f98SSadaf Ebrahimi     const char *ecjpake_pw;     /* the EC J-PAKE password                   */
491*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
492*62c56f98SSadaf Ebrahimi     int ecjpake_pw_opaque;      /* set to 1 to use the opaque method for setting the password */
493*62c56f98SSadaf Ebrahimi #endif
494*62c56f98SSadaf Ebrahimi     int ec_max_ops;             /* EC consecutive operations limit          */
495*62c56f98SSadaf Ebrahimi     int force_ciphersuite[2];   /* protocol/ciphersuite to use, or all      */
496*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
497*62c56f98SSadaf Ebrahimi     int tls13_kex_modes;        /* supported TLS 1.3 key exchange modes     */
498*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
499*62c56f98SSadaf Ebrahimi     int renegotiation;          /* enable / disable renegotiation           */
500*62c56f98SSadaf Ebrahimi     int allow_legacy;           /* allow legacy renegotiation               */
501*62c56f98SSadaf Ebrahimi     int renegotiate;            /* attempt renegotiation?                   */
502*62c56f98SSadaf Ebrahimi     int renego_delay;           /* delay before enforcing renegotiation     */
503*62c56f98SSadaf Ebrahimi     int exchanges;              /* number of data exchanges                 */
504*62c56f98SSadaf Ebrahimi     int min_version;            /* minimum protocol version accepted        */
505*62c56f98SSadaf Ebrahimi     int max_version;            /* maximum protocol version accepted        */
506*62c56f98SSadaf Ebrahimi     int allow_sha1;             /* flag for SHA-1 support                   */
507*62c56f98SSadaf Ebrahimi     int auth_mode;              /* verify mode for connection               */
508*62c56f98SSadaf Ebrahimi     unsigned char mfl_code;     /* code for maximum fragment length         */
509*62c56f98SSadaf Ebrahimi     int trunc_hmac;             /* negotiate truncated hmac or not          */
510*62c56f98SSadaf Ebrahimi     int recsplit;               /* enable record splitting?                 */
511*62c56f98SSadaf Ebrahimi     int dhmlen;                 /* minimum DHM params len in bits           */
512*62c56f98SSadaf Ebrahimi     int reconnect;              /* attempt to resume session                */
513*62c56f98SSadaf Ebrahimi     const char *reco_server_name;     /* hostname of the server (re-connect)     */
514*62c56f98SSadaf Ebrahimi     int reco_delay;             /* delay in seconds before resuming session */
515*62c56f98SSadaf Ebrahimi     int reco_mode;              /* how to keep the session around           */
516*62c56f98SSadaf Ebrahimi     int reconnect_hard;         /* unexpectedly reconnect from the same port */
517*62c56f98SSadaf Ebrahimi     int tickets;                /* enable / disable session tickets         */
518*62c56f98SSadaf Ebrahimi     const char *groups;         /* list of supported groups                 */
519*62c56f98SSadaf Ebrahimi     const char *sig_algs;       /* supported TLS 1.3 signature algorithms   */
520*62c56f98SSadaf Ebrahimi     const char *alpn_string;    /* ALPN supported protocols                 */
521*62c56f98SSadaf Ebrahimi     int transport;              /* TLS or DTLS?                             */
522*62c56f98SSadaf Ebrahimi     uint32_t hs_to_min;         /* Initial value of DTLS handshake timer    */
523*62c56f98SSadaf Ebrahimi     uint32_t hs_to_max;         /* Max value of DTLS handshake timer        */
524*62c56f98SSadaf Ebrahimi     int dtls_mtu;               /* UDP Maximum transport unit for DTLS       */
525*62c56f98SSadaf Ebrahimi     int fallback;               /* is this a fallback connection?           */
526*62c56f98SSadaf Ebrahimi     int dgram_packing;          /* allow/forbid datagram packing            */
527*62c56f98SSadaf Ebrahimi     int extended_ms;            /* negotiate extended master secret?        */
528*62c56f98SSadaf Ebrahimi     int etm;                    /* negotiate encrypt then mac?              */
529*62c56f98SSadaf Ebrahimi     int context_crt_cb;         /* use context-specific CRT verify callback */
530*62c56f98SSadaf Ebrahimi     int eap_tls;                /* derive EAP-TLS keying material?          */
531*62c56f98SSadaf Ebrahimi     int nss_keylog;             /* export NSS key log material              */
532*62c56f98SSadaf Ebrahimi     const char *nss_keylog_file; /* NSS key log file                        */
533*62c56f98SSadaf Ebrahimi     int cid_enabled;            /* whether to use the CID extension or not  */
534*62c56f98SSadaf Ebrahimi     int cid_enabled_renego;     /* whether to use the CID extension or not
535*62c56f98SSadaf Ebrahimi                                  * during renegotiation                     */
536*62c56f98SSadaf Ebrahimi     const char *cid_val;        /* the CID to use for incoming messages     */
537*62c56f98SSadaf Ebrahimi     int serialize;              /* serialize/deserialize connection         */
538*62c56f98SSadaf Ebrahimi     const char *context_file;   /* the file to write a serialized connection
539*62c56f98SSadaf Ebrahimi                                  * in the form of base64 code (serialize
540*62c56f98SSadaf Ebrahimi                                  * option must be set)                      */
541*62c56f98SSadaf Ebrahimi     const char *cid_val_renego; /* the CID to use for incoming messages
542*62c56f98SSadaf Ebrahimi                                  * after renegotiation                      */
543*62c56f98SSadaf Ebrahimi     int reproducible;           /* make communication reproducible          */
544*62c56f98SSadaf Ebrahimi     int skip_close_notify;      /* skip sending the close_notify alert      */
545*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_EARLY_DATA)
546*62c56f98SSadaf Ebrahimi     int early_data;             /* support for early data                   */
547*62c56f98SSadaf Ebrahimi #endif
548*62c56f98SSadaf Ebrahimi     int query_config_mode;      /* whether to read config                   */
549*62c56f98SSadaf Ebrahimi     int use_srtp;               /* Support SRTP                             */
550*62c56f98SSadaf Ebrahimi     int force_srtp_profile;     /* SRTP protection profile to use or all    */
551*62c56f98SSadaf Ebrahimi     const char *mki;            /* The dtls mki value to use                */
552*62c56f98SSadaf Ebrahimi     const char *key_opaque_alg1; /* Allowed opaque key alg 1                */
553*62c56f98SSadaf Ebrahimi     const char *key_opaque_alg2; /* Allowed Opaque key alg 2                */
554*62c56f98SSadaf Ebrahimi } opt;
555*62c56f98SSadaf Ebrahimi 
556*62c56f98SSadaf Ebrahimi #include "ssl_test_common_source.c"
557*62c56f98SSadaf Ebrahimi 
558*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
559*62c56f98SSadaf Ebrahimi static unsigned char peer_crt_info[1024];
560*62c56f98SSadaf Ebrahimi 
561*62c56f98SSadaf Ebrahimi /*
562*62c56f98SSadaf Ebrahimi  * Enabled if debug_level > 1 in code below
563*62c56f98SSadaf Ebrahimi  */
my_verify(void * data,mbedtls_x509_crt * crt,int depth,uint32_t * flags)564*62c56f98SSadaf Ebrahimi static int my_verify(void *data, mbedtls_x509_crt *crt,
565*62c56f98SSadaf Ebrahimi                      int depth, uint32_t *flags)
566*62c56f98SSadaf Ebrahimi {
567*62c56f98SSadaf Ebrahimi     char buf[1024];
568*62c56f98SSadaf Ebrahimi     ((void) data);
569*62c56f98SSadaf Ebrahimi 
570*62c56f98SSadaf Ebrahimi     mbedtls_printf("\nVerify requested for (Depth %d):\n", depth);
571*62c56f98SSadaf Ebrahimi 
572*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_X509_REMOVE_INFO)
573*62c56f98SSadaf Ebrahimi     mbedtls_x509_crt_info(buf, sizeof(buf) - 1, "", crt);
574*62c56f98SSadaf Ebrahimi     if (depth == 0) {
575*62c56f98SSadaf Ebrahimi         memcpy(peer_crt_info, buf, sizeof(buf));
576*62c56f98SSadaf Ebrahimi     }
577*62c56f98SSadaf Ebrahimi 
578*62c56f98SSadaf Ebrahimi     if (opt.debug_level == 0) {
579*62c56f98SSadaf Ebrahimi         return 0;
580*62c56f98SSadaf Ebrahimi     }
581*62c56f98SSadaf Ebrahimi 
582*62c56f98SSadaf Ebrahimi     mbedtls_printf("%s", buf);
583*62c56f98SSadaf Ebrahimi #else
584*62c56f98SSadaf Ebrahimi     ((void) crt);
585*62c56f98SSadaf Ebrahimi     ((void) depth);
586*62c56f98SSadaf Ebrahimi #endif
587*62c56f98SSadaf Ebrahimi 
588*62c56f98SSadaf Ebrahimi     if ((*flags) == 0) {
589*62c56f98SSadaf Ebrahimi         mbedtls_printf("  This certificate has no flags\n");
590*62c56f98SSadaf Ebrahimi     } else {
591*62c56f98SSadaf Ebrahimi         x509_crt_verify_info(buf, sizeof(buf), "  ! ", *flags);
592*62c56f98SSadaf Ebrahimi         mbedtls_printf("%s\n", buf);
593*62c56f98SSadaf Ebrahimi     }
594*62c56f98SSadaf Ebrahimi 
595*62c56f98SSadaf Ebrahimi     return 0;
596*62c56f98SSadaf Ebrahimi }
597*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
598*62c56f98SSadaf Ebrahimi 
599*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
report_cid_usage(mbedtls_ssl_context * ssl,const char * additional_description)600*62c56f98SSadaf Ebrahimi int report_cid_usage(mbedtls_ssl_context *ssl,
601*62c56f98SSadaf Ebrahimi                      const char *additional_description)
602*62c56f98SSadaf Ebrahimi {
603*62c56f98SSadaf Ebrahimi     int ret;
604*62c56f98SSadaf Ebrahimi     unsigned char peer_cid[MBEDTLS_SSL_CID_OUT_LEN_MAX];
605*62c56f98SSadaf Ebrahimi     size_t peer_cid_len;
606*62c56f98SSadaf Ebrahimi     int cid_negotiated;
607*62c56f98SSadaf Ebrahimi 
608*62c56f98SSadaf Ebrahimi     if (opt.transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
609*62c56f98SSadaf Ebrahimi         return 0;
610*62c56f98SSadaf Ebrahimi     }
611*62c56f98SSadaf Ebrahimi 
612*62c56f98SSadaf Ebrahimi     /* Check if the use of a CID has been negotiated,
613*62c56f98SSadaf Ebrahimi      * but don't ask for the CID value and length.
614*62c56f98SSadaf Ebrahimi      *
615*62c56f98SSadaf Ebrahimi      * Note: Here and below, we're demonstrating the various ways
616*62c56f98SSadaf Ebrahimi      *       in which mbedtls_ssl_get_peer_cid() can be called,
617*62c56f98SSadaf Ebrahimi      *       depending on whether or not the length/value of the
618*62c56f98SSadaf Ebrahimi      *       peer's CID is needed.
619*62c56f98SSadaf Ebrahimi      *
620*62c56f98SSadaf Ebrahimi      *       An actual application, however, should use
621*62c56f98SSadaf Ebrahimi      *       just one call to mbedtls_ssl_get_peer_cid(). */
622*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_get_peer_cid(ssl, &cid_negotiated,
623*62c56f98SSadaf Ebrahimi                                    NULL, NULL);
624*62c56f98SSadaf Ebrahimi     if (ret != 0) {
625*62c56f98SSadaf Ebrahimi         mbedtls_printf(" failed\n  ! mbedtls_ssl_get_peer_cid returned -0x%x\n\n",
626*62c56f98SSadaf Ebrahimi                        (unsigned int) -ret);
627*62c56f98SSadaf Ebrahimi         return ret;
628*62c56f98SSadaf Ebrahimi     }
629*62c56f98SSadaf Ebrahimi 
630*62c56f98SSadaf Ebrahimi     if (cid_negotiated == MBEDTLS_SSL_CID_DISABLED) {
631*62c56f98SSadaf Ebrahimi         if (opt.cid_enabled == MBEDTLS_SSL_CID_ENABLED) {
632*62c56f98SSadaf Ebrahimi             mbedtls_printf("(%s) Use of Connection ID was rejected by the server.\n",
633*62c56f98SSadaf Ebrahimi                            additional_description);
634*62c56f98SSadaf Ebrahimi         }
635*62c56f98SSadaf Ebrahimi     } else {
636*62c56f98SSadaf Ebrahimi         size_t idx = 0;
637*62c56f98SSadaf Ebrahimi         mbedtls_printf("(%s) Use of Connection ID has been negotiated.\n",
638*62c56f98SSadaf Ebrahimi                        additional_description);
639*62c56f98SSadaf Ebrahimi 
640*62c56f98SSadaf Ebrahimi         /* Ask for just the length of the peer's CID. */
641*62c56f98SSadaf Ebrahimi         ret = mbedtls_ssl_get_peer_cid(ssl, &cid_negotiated,
642*62c56f98SSadaf Ebrahimi                                        NULL, &peer_cid_len);
643*62c56f98SSadaf Ebrahimi         if (ret != 0) {
644*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! mbedtls_ssl_get_peer_cid returned -0x%x\n\n",
645*62c56f98SSadaf Ebrahimi                            (unsigned int) -ret);
646*62c56f98SSadaf Ebrahimi             return ret;
647*62c56f98SSadaf Ebrahimi         }
648*62c56f98SSadaf Ebrahimi 
649*62c56f98SSadaf Ebrahimi         /* Ask for just length + value of the peer's CID. */
650*62c56f98SSadaf Ebrahimi         ret = mbedtls_ssl_get_peer_cid(ssl, &cid_negotiated,
651*62c56f98SSadaf Ebrahimi                                        peer_cid, &peer_cid_len);
652*62c56f98SSadaf Ebrahimi         if (ret != 0) {
653*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! mbedtls_ssl_get_peer_cid returned -0x%x\n\n",
654*62c56f98SSadaf Ebrahimi                            (unsigned int) -ret);
655*62c56f98SSadaf Ebrahimi             return ret;
656*62c56f98SSadaf Ebrahimi         }
657*62c56f98SSadaf Ebrahimi         mbedtls_printf("(%s) Peer CID (length %u Bytes): ",
658*62c56f98SSadaf Ebrahimi                        additional_description,
659*62c56f98SSadaf Ebrahimi                        (unsigned) peer_cid_len);
660*62c56f98SSadaf Ebrahimi         while (idx < peer_cid_len) {
661*62c56f98SSadaf Ebrahimi             mbedtls_printf("%02x ", peer_cid[idx]);
662*62c56f98SSadaf Ebrahimi             idx++;
663*62c56f98SSadaf Ebrahimi         }
664*62c56f98SSadaf Ebrahimi         mbedtls_printf("\n");
665*62c56f98SSadaf Ebrahimi     }
666*62c56f98SSadaf Ebrahimi 
667*62c56f98SSadaf Ebrahimi     return 0;
668*62c56f98SSadaf Ebrahimi }
669*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
670*62c56f98SSadaf Ebrahimi 
ssl_save_session_serialize(mbedtls_ssl_context * ssl,unsigned char ** session_data,size_t * session_data_len)671*62c56f98SSadaf Ebrahimi static int ssl_save_session_serialize(mbedtls_ssl_context *ssl,
672*62c56f98SSadaf Ebrahimi                                       unsigned char **session_data,
673*62c56f98SSadaf Ebrahimi                                       size_t *session_data_len)
674*62c56f98SSadaf Ebrahimi {
675*62c56f98SSadaf Ebrahimi     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
676*62c56f98SSadaf Ebrahimi     mbedtls_ssl_session exported_session;
677*62c56f98SSadaf Ebrahimi 
678*62c56f98SSadaf Ebrahimi     /* free any previously saved data */
679*62c56f98SSadaf Ebrahimi     if (*session_data != NULL) {
680*62c56f98SSadaf Ebrahimi         mbedtls_platform_zeroize(*session_data, *session_data_len);
681*62c56f98SSadaf Ebrahimi         mbedtls_free(*session_data);
682*62c56f98SSadaf Ebrahimi         *session_data = NULL;
683*62c56f98SSadaf Ebrahimi         *session_data_len = 0;
684*62c56f98SSadaf Ebrahimi     }
685*62c56f98SSadaf Ebrahimi 
686*62c56f98SSadaf Ebrahimi     mbedtls_ssl_session_init(&exported_session);
687*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_get_session(ssl, &exported_session);
688*62c56f98SSadaf Ebrahimi     if (ret != 0) {
689*62c56f98SSadaf Ebrahimi         mbedtls_printf(
690*62c56f98SSadaf Ebrahimi             "failed\n  ! mbedtls_ssl_get_session() returned -%#02x\n",
691*62c56f98SSadaf Ebrahimi             (unsigned) -ret);
692*62c56f98SSadaf Ebrahimi         goto exit;
693*62c56f98SSadaf Ebrahimi     }
694*62c56f98SSadaf Ebrahimi 
695*62c56f98SSadaf Ebrahimi     /* get size of the buffer needed */
696*62c56f98SSadaf Ebrahimi     mbedtls_ssl_session_save(&exported_session, NULL, 0, session_data_len);
697*62c56f98SSadaf Ebrahimi     *session_data = mbedtls_calloc(1, *session_data_len);
698*62c56f98SSadaf Ebrahimi     if (*session_data == NULL) {
699*62c56f98SSadaf Ebrahimi         mbedtls_printf(" failed\n  ! alloc %u bytes for session data\n",
700*62c56f98SSadaf Ebrahimi                        (unsigned) *session_data_len);
701*62c56f98SSadaf Ebrahimi         ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
702*62c56f98SSadaf Ebrahimi         goto exit;
703*62c56f98SSadaf Ebrahimi     }
704*62c56f98SSadaf Ebrahimi 
705*62c56f98SSadaf Ebrahimi     /* actually save session data */
706*62c56f98SSadaf Ebrahimi     if ((ret = mbedtls_ssl_session_save(&exported_session,
707*62c56f98SSadaf Ebrahimi                                         *session_data, *session_data_len,
708*62c56f98SSadaf Ebrahimi                                         session_data_len)) != 0) {
709*62c56f98SSadaf Ebrahimi         mbedtls_printf(" failed\n  ! mbedtls_ssl_session_saved returned -0x%04x\n\n",
710*62c56f98SSadaf Ebrahimi                        (unsigned int) -ret);
711*62c56f98SSadaf Ebrahimi         goto exit;
712*62c56f98SSadaf Ebrahimi     }
713*62c56f98SSadaf Ebrahimi 
714*62c56f98SSadaf Ebrahimi exit:
715*62c56f98SSadaf Ebrahimi     mbedtls_ssl_session_free(&exported_session);
716*62c56f98SSadaf Ebrahimi     return ret;
717*62c56f98SSadaf Ebrahimi }
718*62c56f98SSadaf Ebrahimi 
main(int argc,char * argv[])719*62c56f98SSadaf Ebrahimi int main(int argc, char *argv[])
720*62c56f98SSadaf Ebrahimi {
721*62c56f98SSadaf Ebrahimi     int ret = 0, len, tail_len, i, written, frags, retry_left;
722*62c56f98SSadaf Ebrahimi     int query_config_ret = 0;
723*62c56f98SSadaf Ebrahimi     mbedtls_net_context server_fd;
724*62c56f98SSadaf Ebrahimi     io_ctx_t io_ctx;
725*62c56f98SSadaf Ebrahimi 
726*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
727*62c56f98SSadaf Ebrahimi     uint16_t sig_alg_list[SIG_ALG_LIST_SIZE];
728*62c56f98SSadaf Ebrahimi #endif
729*62c56f98SSadaf Ebrahimi 
730*62c56f98SSadaf Ebrahimi     unsigned char buf[MAX_REQUEST_SIZE + 1];
731*62c56f98SSadaf Ebrahimi 
732*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
733*62c56f98SSadaf Ebrahimi     unsigned char psk[MBEDTLS_PSK_MAX_LEN];
734*62c56f98SSadaf Ebrahimi     size_t psk_len = 0;
735*62c56f98SSadaf Ebrahimi #endif
736*62c56f98SSadaf Ebrahimi 
737*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
738*62c56f98SSadaf Ebrahimi     unsigned char cid[MBEDTLS_SSL_CID_IN_LEN_MAX];
739*62c56f98SSadaf Ebrahimi     unsigned char cid_renego[MBEDTLS_SSL_CID_IN_LEN_MAX];
740*62c56f98SSadaf Ebrahimi     size_t cid_len = 0;
741*62c56f98SSadaf Ebrahimi     size_t cid_renego_len = 0;
742*62c56f98SSadaf Ebrahimi #endif
743*62c56f98SSadaf Ebrahimi 
744*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ALPN)
745*62c56f98SSadaf Ebrahimi     const char *alpn_list[ALPN_LIST_SIZE];
746*62c56f98SSadaf Ebrahimi #endif
747*62c56f98SSadaf Ebrahimi 
748*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
749*62c56f98SSadaf Ebrahimi     unsigned char alloc_buf[MEMORY_HEAP_SIZE];
750*62c56f98SSadaf Ebrahimi #endif
751*62c56f98SSadaf Ebrahimi     uint16_t group_list[GROUP_LIST_SIZE];
752*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_SRTP)
753*62c56f98SSadaf Ebrahimi     unsigned char mki[MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH];
754*62c56f98SSadaf Ebrahimi     size_t mki_len = 0;
755*62c56f98SSadaf Ebrahimi #endif
756*62c56f98SSadaf Ebrahimi 
757*62c56f98SSadaf Ebrahimi     const char *pers = "ssl_client2";
758*62c56f98SSadaf Ebrahimi 
759*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
760*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
761*62c56f98SSadaf Ebrahimi     mbedtls_svc_key_id_t slot = MBEDTLS_SVC_KEY_ID_INIT;
762*62c56f98SSadaf Ebrahimi     psa_algorithm_t alg = 0;
763*62c56f98SSadaf Ebrahimi     psa_key_attributes_t key_attributes;
764*62c56f98SSadaf Ebrahimi #endif
765*62c56f98SSadaf Ebrahimi     psa_status_t status;
766*62c56f98SSadaf Ebrahimi #elif defined(MBEDTLS_SSL_PROTO_TLS1_3)
767*62c56f98SSadaf Ebrahimi     psa_status_t status;
768*62c56f98SSadaf Ebrahimi #endif
769*62c56f98SSadaf Ebrahimi 
770*62c56f98SSadaf Ebrahimi     rng_context_t rng;
771*62c56f98SSadaf Ebrahimi     mbedtls_ssl_context ssl;
772*62c56f98SSadaf Ebrahimi     mbedtls_ssl_config conf;
773*62c56f98SSadaf Ebrahimi     mbedtls_ssl_session saved_session;
774*62c56f98SSadaf Ebrahimi     unsigned char *session_data = NULL;
775*62c56f98SSadaf Ebrahimi     size_t session_data_len = 0;
776*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_TIMING_C)
777*62c56f98SSadaf Ebrahimi     mbedtls_timing_delay_context timer;
778*62c56f98SSadaf Ebrahimi #endif
779*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
780*62c56f98SSadaf Ebrahimi     uint32_t flags;
781*62c56f98SSadaf Ebrahimi     mbedtls_x509_crt cacert;
782*62c56f98SSadaf Ebrahimi     mbedtls_x509_crt clicert;
783*62c56f98SSadaf Ebrahimi     mbedtls_pk_context pkey;
784*62c56f98SSadaf Ebrahimi     mbedtls_x509_crt_profile crt_profile_for_test = mbedtls_x509_crt_profile_default;
785*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
786*62c56f98SSadaf Ebrahimi     mbedtls_svc_key_id_t key_slot = MBEDTLS_SVC_KEY_ID_INIT; /* invalid key slot */
787*62c56f98SSadaf Ebrahimi #endif
788*62c56f98SSadaf Ebrahimi #endif  /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
789*62c56f98SSadaf Ebrahimi     char *p, *q;
790*62c56f98SSadaf Ebrahimi     const int *list;
791*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
792*62c56f98SSadaf Ebrahimi     unsigned char *context_buf = NULL;
793*62c56f98SSadaf Ebrahimi     size_t context_buf_len;
794*62c56f98SSadaf Ebrahimi #endif
795*62c56f98SSadaf Ebrahimi     unsigned char eap_tls_keymaterial[16];
796*62c56f98SSadaf Ebrahimi     unsigned char eap_tls_iv[8];
797*62c56f98SSadaf Ebrahimi     const char *eap_tls_label = "client EAP encryption";
798*62c56f98SSadaf Ebrahimi     eap_tls_keys eap_tls_keying;
799*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_SRTP)
800*62c56f98SSadaf Ebrahimi     /*! master keys and master salt for SRTP generated during handshake */
801*62c56f98SSadaf Ebrahimi     unsigned char dtls_srtp_key_material[MBEDTLS_TLS_SRTP_MAX_KEY_MATERIAL_LENGTH];
802*62c56f98SSadaf Ebrahimi     const char *dtls_srtp_label = "EXTRACTOR-dtls_srtp";
803*62c56f98SSadaf Ebrahimi     dtls_srtp_keys dtls_srtp_keying;
804*62c56f98SSadaf Ebrahimi     const mbedtls_ssl_srtp_profile default_profiles[] = {
805*62c56f98SSadaf Ebrahimi         MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_80,
806*62c56f98SSadaf Ebrahimi         MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_32,
807*62c56f98SSadaf Ebrahimi         MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_80,
808*62c56f98SSadaf Ebrahimi         MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_32,
809*62c56f98SSadaf Ebrahimi         MBEDTLS_TLS_SRTP_UNSET
810*62c56f98SSadaf Ebrahimi     };
811*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_DTLS_SRTP */
812*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) && \
813*62c56f98SSadaf Ebrahimi     defined(MBEDTLS_USE_PSA_CRYPTO)
814*62c56f98SSadaf Ebrahimi     mbedtls_svc_key_id_t ecjpake_pw_slot = MBEDTLS_SVC_KEY_ID_INIT; /* ecjpake password key slot */
815*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
816*62c56f98SSadaf Ebrahimi 
817*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
818*62c56f98SSadaf Ebrahimi     mbedtls_memory_buffer_alloc_init(alloc_buf, sizeof(alloc_buf));
819*62c56f98SSadaf Ebrahimi #endif
820*62c56f98SSadaf Ebrahimi 
821*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_TEST_HOOKS)
822*62c56f98SSadaf Ebrahimi     test_hooks_init();
823*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_TEST_HOOKS */
824*62c56f98SSadaf Ebrahimi 
825*62c56f98SSadaf Ebrahimi     /*
826*62c56f98SSadaf Ebrahimi      * Make sure memory references are valid.
827*62c56f98SSadaf Ebrahimi      */
828*62c56f98SSadaf Ebrahimi     mbedtls_net_init(&server_fd);
829*62c56f98SSadaf Ebrahimi     mbedtls_ssl_init(&ssl);
830*62c56f98SSadaf Ebrahimi     mbedtls_ssl_config_init(&conf);
831*62c56f98SSadaf Ebrahimi     memset(&saved_session, 0, sizeof(mbedtls_ssl_session));
832*62c56f98SSadaf Ebrahimi     rng_init(&rng);
833*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
834*62c56f98SSadaf Ebrahimi     mbedtls_x509_crt_init(&cacert);
835*62c56f98SSadaf Ebrahimi     mbedtls_x509_crt_init(&clicert);
836*62c56f98SSadaf Ebrahimi     mbedtls_pk_init(&pkey);
837*62c56f98SSadaf Ebrahimi #endif
838*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ALPN)
839*62c56f98SSadaf Ebrahimi     memset((void *) alpn_list, 0, sizeof(alpn_list));
840*62c56f98SSadaf Ebrahimi #endif
841*62c56f98SSadaf Ebrahimi 
842*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO) || defined(MBEDTLS_SSL_PROTO_TLS1_3)
843*62c56f98SSadaf Ebrahimi     status = psa_crypto_init();
844*62c56f98SSadaf Ebrahimi     if (status != PSA_SUCCESS) {
845*62c56f98SSadaf Ebrahimi         mbedtls_fprintf(stderr, "Failed to initialize PSA Crypto implementation: %d\n",
846*62c56f98SSadaf Ebrahimi                         (int) status);
847*62c56f98SSadaf Ebrahimi         ret = MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
848*62c56f98SSadaf Ebrahimi         goto exit;
849*62c56f98SSadaf Ebrahimi     }
850*62c56f98SSadaf Ebrahimi #endif  /* MBEDTLS_USE_PSA_CRYPTO || MBEDTLS_SSL_PROTO_TLS1_3 */
851*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG)
852*62c56f98SSadaf Ebrahimi     mbedtls_test_enable_insecure_external_rng();
853*62c56f98SSadaf Ebrahimi #endif  /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */
854*62c56f98SSadaf Ebrahimi 
855*62c56f98SSadaf Ebrahimi     if (argc < 2) {
856*62c56f98SSadaf Ebrahimi usage:
857*62c56f98SSadaf Ebrahimi         if (ret == 0) {
858*62c56f98SSadaf Ebrahimi             ret = 1;
859*62c56f98SSadaf Ebrahimi         }
860*62c56f98SSadaf Ebrahimi 
861*62c56f98SSadaf Ebrahimi         mbedtls_printf(USAGE1);
862*62c56f98SSadaf Ebrahimi         mbedtls_printf(USAGE2);
863*62c56f98SSadaf Ebrahimi         mbedtls_printf(USAGE3);
864*62c56f98SSadaf Ebrahimi         mbedtls_printf(USAGE4);
865*62c56f98SSadaf Ebrahimi 
866*62c56f98SSadaf Ebrahimi         list = mbedtls_ssl_list_ciphersuites();
867*62c56f98SSadaf Ebrahimi         while (*list) {
868*62c56f98SSadaf Ebrahimi             mbedtls_printf(" %-42s", mbedtls_ssl_get_ciphersuite_name(*list));
869*62c56f98SSadaf Ebrahimi             list++;
870*62c56f98SSadaf Ebrahimi             if (!*list) {
871*62c56f98SSadaf Ebrahimi                 break;
872*62c56f98SSadaf Ebrahimi             }
873*62c56f98SSadaf Ebrahimi             mbedtls_printf(" %s\n", mbedtls_ssl_get_ciphersuite_name(*list));
874*62c56f98SSadaf Ebrahimi             list++;
875*62c56f98SSadaf Ebrahimi         }
876*62c56f98SSadaf Ebrahimi         mbedtls_printf("\n");
877*62c56f98SSadaf Ebrahimi         goto exit;
878*62c56f98SSadaf Ebrahimi     }
879*62c56f98SSadaf Ebrahimi 
880*62c56f98SSadaf Ebrahimi     opt.server_name         = DFL_SERVER_NAME;
881*62c56f98SSadaf Ebrahimi     opt.server_addr         = DFL_SERVER_ADDR;
882*62c56f98SSadaf Ebrahimi     opt.server_port         = DFL_SERVER_PORT;
883*62c56f98SSadaf Ebrahimi     opt.debug_level         = DFL_DEBUG_LEVEL;
884*62c56f98SSadaf Ebrahimi     opt.cid_enabled         = DFL_CID_ENABLED;
885*62c56f98SSadaf Ebrahimi     opt.cid_val             = DFL_CID_VALUE;
886*62c56f98SSadaf Ebrahimi     opt.cid_enabled_renego  = DFL_CID_ENABLED_RENEGO;
887*62c56f98SSadaf Ebrahimi     opt.cid_val_renego      = DFL_CID_VALUE_RENEGO;
888*62c56f98SSadaf Ebrahimi     opt.nbio                = DFL_NBIO;
889*62c56f98SSadaf Ebrahimi     opt.event               = DFL_EVENT;
890*62c56f98SSadaf Ebrahimi     opt.context_crt_cb      = DFL_CONTEXT_CRT_CB;
891*62c56f98SSadaf Ebrahimi     opt.read_timeout        = DFL_READ_TIMEOUT;
892*62c56f98SSadaf Ebrahimi     opt.max_resend          = DFL_MAX_RESEND;
893*62c56f98SSadaf Ebrahimi     opt.request_page        = DFL_REQUEST_PAGE;
894*62c56f98SSadaf Ebrahimi     opt.request_size        = DFL_REQUEST_SIZE;
895*62c56f98SSadaf Ebrahimi     opt.ca_file             = DFL_CA_FILE;
896*62c56f98SSadaf Ebrahimi     opt.ca_path             = DFL_CA_PATH;
897*62c56f98SSadaf Ebrahimi     opt.crt_file            = DFL_CRT_FILE;
898*62c56f98SSadaf Ebrahimi     opt.key_file            = DFL_KEY_FILE;
899*62c56f98SSadaf Ebrahimi     opt.key_opaque          = DFL_KEY_OPAQUE;
900*62c56f98SSadaf Ebrahimi     opt.key_pwd             = DFL_KEY_PWD;
901*62c56f98SSadaf Ebrahimi     opt.psk                 = DFL_PSK;
902*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
903*62c56f98SSadaf Ebrahimi     opt.psk_opaque          = DFL_PSK_OPAQUE;
904*62c56f98SSadaf Ebrahimi #endif
905*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
906*62c56f98SSadaf Ebrahimi     opt.ca_callback         = DFL_CA_CALLBACK;
907*62c56f98SSadaf Ebrahimi #endif
908*62c56f98SSadaf Ebrahimi     opt.psk_identity        = DFL_PSK_IDENTITY;
909*62c56f98SSadaf Ebrahimi     opt.ecjpake_pw          = DFL_ECJPAKE_PW;
910*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
911*62c56f98SSadaf Ebrahimi     opt.ecjpake_pw_opaque   = DFL_ECJPAKE_PW_OPAQUE;
912*62c56f98SSadaf Ebrahimi #endif
913*62c56f98SSadaf Ebrahimi     opt.ec_max_ops          = DFL_EC_MAX_OPS;
914*62c56f98SSadaf Ebrahimi     opt.force_ciphersuite[0] = DFL_FORCE_CIPHER;
915*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
916*62c56f98SSadaf Ebrahimi     opt.tls13_kex_modes     = DFL_TLS1_3_KEX_MODES;
917*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
918*62c56f98SSadaf Ebrahimi     opt.renegotiation       = DFL_RENEGOTIATION;
919*62c56f98SSadaf Ebrahimi     opt.allow_legacy        = DFL_ALLOW_LEGACY;
920*62c56f98SSadaf Ebrahimi     opt.renegotiate         = DFL_RENEGOTIATE;
921*62c56f98SSadaf Ebrahimi     opt.exchanges           = DFL_EXCHANGES;
922*62c56f98SSadaf Ebrahimi     opt.min_version         = DFL_MIN_VERSION;
923*62c56f98SSadaf Ebrahimi     opt.max_version         = DFL_MAX_VERSION;
924*62c56f98SSadaf Ebrahimi     opt.allow_sha1          = DFL_SHA1;
925*62c56f98SSadaf Ebrahimi     opt.auth_mode           = DFL_AUTH_MODE;
926*62c56f98SSadaf Ebrahimi     opt.mfl_code            = DFL_MFL_CODE;
927*62c56f98SSadaf Ebrahimi     opt.trunc_hmac          = DFL_TRUNC_HMAC;
928*62c56f98SSadaf Ebrahimi     opt.recsplit            = DFL_RECSPLIT;
929*62c56f98SSadaf Ebrahimi     opt.dhmlen              = DFL_DHMLEN;
930*62c56f98SSadaf Ebrahimi     opt.reconnect           = DFL_RECONNECT;
931*62c56f98SSadaf Ebrahimi     opt.reco_server_name    = DFL_RECO_SERVER_NAME;
932*62c56f98SSadaf Ebrahimi     opt.reco_delay          = DFL_RECO_DELAY;
933*62c56f98SSadaf Ebrahimi     opt.reco_mode           = DFL_RECO_MODE;
934*62c56f98SSadaf Ebrahimi     opt.reconnect_hard      = DFL_RECONNECT_HARD;
935*62c56f98SSadaf Ebrahimi     opt.tickets             = DFL_TICKETS;
936*62c56f98SSadaf Ebrahimi     opt.alpn_string         = DFL_ALPN_STRING;
937*62c56f98SSadaf Ebrahimi     opt.groups              = DFL_GROUPS;
938*62c56f98SSadaf Ebrahimi     opt.sig_algs            = DFL_SIG_ALGS;
939*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_EARLY_DATA)
940*62c56f98SSadaf Ebrahimi     opt.early_data          = DFL_EARLY_DATA;
941*62c56f98SSadaf Ebrahimi #endif
942*62c56f98SSadaf Ebrahimi     opt.transport           = DFL_TRANSPORT;
943*62c56f98SSadaf Ebrahimi     opt.hs_to_min           = DFL_HS_TO_MIN;
944*62c56f98SSadaf Ebrahimi     opt.hs_to_max           = DFL_HS_TO_MAX;
945*62c56f98SSadaf Ebrahimi     opt.dtls_mtu            = DFL_DTLS_MTU;
946*62c56f98SSadaf Ebrahimi     opt.fallback            = DFL_FALLBACK;
947*62c56f98SSadaf Ebrahimi     opt.extended_ms         = DFL_EXTENDED_MS;
948*62c56f98SSadaf Ebrahimi     opt.etm                 = DFL_ETM;
949*62c56f98SSadaf Ebrahimi     opt.dgram_packing       = DFL_DGRAM_PACKING;
950*62c56f98SSadaf Ebrahimi     opt.serialize           = DFL_SERIALIZE;
951*62c56f98SSadaf Ebrahimi     opt.context_file        = DFL_CONTEXT_FILE;
952*62c56f98SSadaf Ebrahimi     opt.eap_tls             = DFL_EAP_TLS;
953*62c56f98SSadaf Ebrahimi     opt.reproducible        = DFL_REPRODUCIBLE;
954*62c56f98SSadaf Ebrahimi     opt.nss_keylog          = DFL_NSS_KEYLOG;
955*62c56f98SSadaf Ebrahimi     opt.nss_keylog_file     = DFL_NSS_KEYLOG_FILE;
956*62c56f98SSadaf Ebrahimi     opt.skip_close_notify   = DFL_SKIP_CLOSE_NOTIFY;
957*62c56f98SSadaf Ebrahimi     opt.query_config_mode   = DFL_QUERY_CONFIG_MODE;
958*62c56f98SSadaf Ebrahimi     opt.use_srtp            = DFL_USE_SRTP;
959*62c56f98SSadaf Ebrahimi     opt.force_srtp_profile  = DFL_SRTP_FORCE_PROFILE;
960*62c56f98SSadaf Ebrahimi     opt.mki                 = DFL_SRTP_MKI;
961*62c56f98SSadaf Ebrahimi     opt.key_opaque_alg1     = DFL_KEY_OPAQUE_ALG;
962*62c56f98SSadaf Ebrahimi     opt.key_opaque_alg2     = DFL_KEY_OPAQUE_ALG;
963*62c56f98SSadaf Ebrahimi 
964*62c56f98SSadaf Ebrahimi     for (i = 1; i < argc; i++) {
965*62c56f98SSadaf Ebrahimi         p = argv[i];
966*62c56f98SSadaf Ebrahimi         if ((q = strchr(p, '=')) == NULL) {
967*62c56f98SSadaf Ebrahimi             goto usage;
968*62c56f98SSadaf Ebrahimi         }
969*62c56f98SSadaf Ebrahimi         *q++ = '\0';
970*62c56f98SSadaf Ebrahimi 
971*62c56f98SSadaf Ebrahimi         if (strcmp(p, "server_name") == 0) {
972*62c56f98SSadaf Ebrahimi             opt.server_name = q;
973*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "server_addr") == 0) {
974*62c56f98SSadaf Ebrahimi             opt.server_addr = q;
975*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "server_port") == 0) {
976*62c56f98SSadaf Ebrahimi             opt.server_port = q;
977*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "dtls") == 0) {
978*62c56f98SSadaf Ebrahimi             int t = atoi(q);
979*62c56f98SSadaf Ebrahimi             if (t == 0) {
980*62c56f98SSadaf Ebrahimi                 opt.transport = MBEDTLS_SSL_TRANSPORT_STREAM;
981*62c56f98SSadaf Ebrahimi             } else if (t == 1) {
982*62c56f98SSadaf Ebrahimi                 opt.transport = MBEDTLS_SSL_TRANSPORT_DATAGRAM;
983*62c56f98SSadaf Ebrahimi             } else {
984*62c56f98SSadaf Ebrahimi                 goto usage;
985*62c56f98SSadaf Ebrahimi             }
986*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "debug_level") == 0) {
987*62c56f98SSadaf Ebrahimi             opt.debug_level = atoi(q);
988*62c56f98SSadaf Ebrahimi             if (opt.debug_level < 0 || opt.debug_level > 65535) {
989*62c56f98SSadaf Ebrahimi                 goto usage;
990*62c56f98SSadaf Ebrahimi             }
991*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "build_version") == 0) {
992*62c56f98SSadaf Ebrahimi             if (strcmp(q, "1") == 0) {
993*62c56f98SSadaf Ebrahimi                 mbedtls_printf("build version: %s (build %d)\n",
994*62c56f98SSadaf Ebrahimi                                MBEDTLS_VERSION_STRING_FULL,
995*62c56f98SSadaf Ebrahimi                                MBEDTLS_VERSION_NUMBER);
996*62c56f98SSadaf Ebrahimi                 goto exit;
997*62c56f98SSadaf Ebrahimi             }
998*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "context_crt_cb") == 0) {
999*62c56f98SSadaf Ebrahimi             opt.context_crt_cb = atoi(q);
1000*62c56f98SSadaf Ebrahimi             if (opt.context_crt_cb != 0 && opt.context_crt_cb != 1) {
1001*62c56f98SSadaf Ebrahimi                 goto usage;
1002*62c56f98SSadaf Ebrahimi             }
1003*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "nbio") == 0) {
1004*62c56f98SSadaf Ebrahimi             opt.nbio = atoi(q);
1005*62c56f98SSadaf Ebrahimi             if (opt.nbio < 0 || opt.nbio > 2) {
1006*62c56f98SSadaf Ebrahimi                 goto usage;
1007*62c56f98SSadaf Ebrahimi             }
1008*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "event") == 0) {
1009*62c56f98SSadaf Ebrahimi             opt.event = atoi(q);
1010*62c56f98SSadaf Ebrahimi             if (opt.event < 0 || opt.event > 2) {
1011*62c56f98SSadaf Ebrahimi                 goto usage;
1012*62c56f98SSadaf Ebrahimi             }
1013*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "read_timeout") == 0) {
1014*62c56f98SSadaf Ebrahimi             opt.read_timeout = atoi(q);
1015*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "max_resend") == 0) {
1016*62c56f98SSadaf Ebrahimi             opt.max_resend = atoi(q);
1017*62c56f98SSadaf Ebrahimi             if (opt.max_resend < 0) {
1018*62c56f98SSadaf Ebrahimi                 goto usage;
1019*62c56f98SSadaf Ebrahimi             }
1020*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "request_page") == 0) {
1021*62c56f98SSadaf Ebrahimi             opt.request_page = q;
1022*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "request_size") == 0) {
1023*62c56f98SSadaf Ebrahimi             opt.request_size = atoi(q);
1024*62c56f98SSadaf Ebrahimi             if (opt.request_size < 0 ||
1025*62c56f98SSadaf Ebrahimi                 opt.request_size > MAX_REQUEST_SIZE) {
1026*62c56f98SSadaf Ebrahimi                 goto usage;
1027*62c56f98SSadaf Ebrahimi             }
1028*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "ca_file") == 0) {
1029*62c56f98SSadaf Ebrahimi             opt.ca_file = q;
1030*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "ca_path") == 0) {
1031*62c56f98SSadaf Ebrahimi             opt.ca_path = q;
1032*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "crt_file") == 0) {
1033*62c56f98SSadaf Ebrahimi             opt.crt_file = q;
1034*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "key_file") == 0) {
1035*62c56f98SSadaf Ebrahimi             opt.key_file = q;
1036*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "key_pwd") == 0) {
1037*62c56f98SSadaf Ebrahimi             opt.key_pwd = q;
1038*62c56f98SSadaf Ebrahimi         }
1039*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO) && defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
1040*62c56f98SSadaf Ebrahimi         else if (strcmp(p, "key_opaque") == 0) {
1041*62c56f98SSadaf Ebrahimi             opt.key_opaque = atoi(q);
1042*62c56f98SSadaf Ebrahimi         }
1043*62c56f98SSadaf Ebrahimi #endif
1044*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
1045*62c56f98SSadaf Ebrahimi         else if (strcmp(p, "cid") == 0) {
1046*62c56f98SSadaf Ebrahimi             opt.cid_enabled = atoi(q);
1047*62c56f98SSadaf Ebrahimi             if (opt.cid_enabled != 0 && opt.cid_enabled != 1) {
1048*62c56f98SSadaf Ebrahimi                 goto usage;
1049*62c56f98SSadaf Ebrahimi             }
1050*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "cid_renego") == 0) {
1051*62c56f98SSadaf Ebrahimi             opt.cid_enabled_renego = atoi(q);
1052*62c56f98SSadaf Ebrahimi             if (opt.cid_enabled_renego != 0 && opt.cid_enabled_renego != 1) {
1053*62c56f98SSadaf Ebrahimi                 goto usage;
1054*62c56f98SSadaf Ebrahimi             }
1055*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "cid_val") == 0) {
1056*62c56f98SSadaf Ebrahimi             opt.cid_val = q;
1057*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "cid_val_renego") == 0) {
1058*62c56f98SSadaf Ebrahimi             opt.cid_val_renego = q;
1059*62c56f98SSadaf Ebrahimi         }
1060*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1061*62c56f98SSadaf Ebrahimi         else if (strcmp(p, "psk") == 0) {
1062*62c56f98SSadaf Ebrahimi             opt.psk = q;
1063*62c56f98SSadaf Ebrahimi         }
1064*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
1065*62c56f98SSadaf Ebrahimi         else if (strcmp(p, "psk_opaque") == 0) {
1066*62c56f98SSadaf Ebrahimi             opt.psk_opaque = atoi(q);
1067*62c56f98SSadaf Ebrahimi         }
1068*62c56f98SSadaf Ebrahimi #endif
1069*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
1070*62c56f98SSadaf Ebrahimi         else if (strcmp(p, "ca_callback") == 0) {
1071*62c56f98SSadaf Ebrahimi             opt.ca_callback = atoi(q);
1072*62c56f98SSadaf Ebrahimi         }
1073*62c56f98SSadaf Ebrahimi #endif
1074*62c56f98SSadaf Ebrahimi         else if (strcmp(p, "psk_identity") == 0) {
1075*62c56f98SSadaf Ebrahimi             opt.psk_identity = q;
1076*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "ecjpake_pw") == 0) {
1077*62c56f98SSadaf Ebrahimi             opt.ecjpake_pw = q;
1078*62c56f98SSadaf Ebrahimi         }
1079*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
1080*62c56f98SSadaf Ebrahimi         else if (strcmp(p, "ecjpake_pw_opaque") == 0) {
1081*62c56f98SSadaf Ebrahimi             opt.ecjpake_pw_opaque = atoi(q);
1082*62c56f98SSadaf Ebrahimi         }
1083*62c56f98SSadaf Ebrahimi #endif
1084*62c56f98SSadaf Ebrahimi         else if (strcmp(p, "ec_max_ops") == 0) {
1085*62c56f98SSadaf Ebrahimi             opt.ec_max_ops = atoi(q);
1086*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "force_ciphersuite") == 0) {
1087*62c56f98SSadaf Ebrahimi             opt.force_ciphersuite[0] = mbedtls_ssl_get_ciphersuite_id(q);
1088*62c56f98SSadaf Ebrahimi 
1089*62c56f98SSadaf Ebrahimi             if (opt.force_ciphersuite[0] == 0) {
1090*62c56f98SSadaf Ebrahimi                 ret = 2;
1091*62c56f98SSadaf Ebrahimi                 goto usage;
1092*62c56f98SSadaf Ebrahimi             }
1093*62c56f98SSadaf Ebrahimi             opt.force_ciphersuite[1] = 0;
1094*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "renegotiation") == 0) {
1095*62c56f98SSadaf Ebrahimi             opt.renegotiation = (atoi(q)) ?
1096*62c56f98SSadaf Ebrahimi                                 MBEDTLS_SSL_RENEGOTIATION_ENABLED :
1097*62c56f98SSadaf Ebrahimi                                 MBEDTLS_SSL_RENEGOTIATION_DISABLED;
1098*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "allow_legacy") == 0) {
1099*62c56f98SSadaf Ebrahimi             switch (atoi(q)) {
1100*62c56f98SSadaf Ebrahimi                 case -1:
1101*62c56f98SSadaf Ebrahimi                     opt.allow_legacy = MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE;
1102*62c56f98SSadaf Ebrahimi                     break;
1103*62c56f98SSadaf Ebrahimi                 case 0:
1104*62c56f98SSadaf Ebrahimi                     opt.allow_legacy = MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION;
1105*62c56f98SSadaf Ebrahimi                     break;
1106*62c56f98SSadaf Ebrahimi                 case 1:
1107*62c56f98SSadaf Ebrahimi                     opt.allow_legacy = MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION;
1108*62c56f98SSadaf Ebrahimi                     break;
1109*62c56f98SSadaf Ebrahimi                 default: goto usage;
1110*62c56f98SSadaf Ebrahimi             }
1111*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "renegotiate") == 0) {
1112*62c56f98SSadaf Ebrahimi             opt.renegotiate = atoi(q);
1113*62c56f98SSadaf Ebrahimi             if (opt.renegotiate < 0 || opt.renegotiate > 1) {
1114*62c56f98SSadaf Ebrahimi                 goto usage;
1115*62c56f98SSadaf Ebrahimi             }
1116*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "exchanges") == 0) {
1117*62c56f98SSadaf Ebrahimi             opt.exchanges = atoi(q);
1118*62c56f98SSadaf Ebrahimi             if (opt.exchanges < 1) {
1119*62c56f98SSadaf Ebrahimi                 goto usage;
1120*62c56f98SSadaf Ebrahimi             }
1121*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "reconnect") == 0) {
1122*62c56f98SSadaf Ebrahimi             opt.reconnect = atoi(q);
1123*62c56f98SSadaf Ebrahimi             if (opt.reconnect < 0 || opt.reconnect > 2) {
1124*62c56f98SSadaf Ebrahimi                 goto usage;
1125*62c56f98SSadaf Ebrahimi             }
1126*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "reco_server_name") == 0) {
1127*62c56f98SSadaf Ebrahimi             opt.reco_server_name = q;
1128*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "reco_delay") == 0) {
1129*62c56f98SSadaf Ebrahimi             opt.reco_delay = atoi(q);
1130*62c56f98SSadaf Ebrahimi             if (opt.reco_delay < 0) {
1131*62c56f98SSadaf Ebrahimi                 goto usage;
1132*62c56f98SSadaf Ebrahimi             }
1133*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "reco_mode") == 0) {
1134*62c56f98SSadaf Ebrahimi             opt.reco_mode = atoi(q);
1135*62c56f98SSadaf Ebrahimi             if (opt.reco_mode < 0) {
1136*62c56f98SSadaf Ebrahimi                 goto usage;
1137*62c56f98SSadaf Ebrahimi             }
1138*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "reconnect_hard") == 0) {
1139*62c56f98SSadaf Ebrahimi             opt.reconnect_hard = atoi(q);
1140*62c56f98SSadaf Ebrahimi             if (opt.reconnect_hard < 0 || opt.reconnect_hard > 1) {
1141*62c56f98SSadaf Ebrahimi                 goto usage;
1142*62c56f98SSadaf Ebrahimi             }
1143*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "tickets") == 0) {
1144*62c56f98SSadaf Ebrahimi             opt.tickets = atoi(q);
1145*62c56f98SSadaf Ebrahimi             if (opt.tickets < 0) {
1146*62c56f98SSadaf Ebrahimi                 goto usage;
1147*62c56f98SSadaf Ebrahimi             }
1148*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "alpn") == 0) {
1149*62c56f98SSadaf Ebrahimi             opt.alpn_string = q;
1150*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "extended_ms") == 0) {
1151*62c56f98SSadaf Ebrahimi             switch (atoi(q)) {
1152*62c56f98SSadaf Ebrahimi                 case 0:
1153*62c56f98SSadaf Ebrahimi                     opt.extended_ms = MBEDTLS_SSL_EXTENDED_MS_DISABLED;
1154*62c56f98SSadaf Ebrahimi                     break;
1155*62c56f98SSadaf Ebrahimi                 case 1:
1156*62c56f98SSadaf Ebrahimi                     opt.extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
1157*62c56f98SSadaf Ebrahimi                     break;
1158*62c56f98SSadaf Ebrahimi                 default: goto usage;
1159*62c56f98SSadaf Ebrahimi             }
1160*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "groups") == 0) {
1161*62c56f98SSadaf Ebrahimi             opt.groups = q;
1162*62c56f98SSadaf Ebrahimi         }
1163*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
1164*62c56f98SSadaf Ebrahimi         else if (strcmp(p, "sig_algs") == 0) {
1165*62c56f98SSadaf Ebrahimi             opt.sig_algs = q;
1166*62c56f98SSadaf Ebrahimi         }
1167*62c56f98SSadaf Ebrahimi #endif
1168*62c56f98SSadaf Ebrahimi         else if (strcmp(p, "etm") == 0) {
1169*62c56f98SSadaf Ebrahimi             switch (atoi(q)) {
1170*62c56f98SSadaf Ebrahimi                 case 0: opt.etm = MBEDTLS_SSL_ETM_DISABLED; break;
1171*62c56f98SSadaf Ebrahimi                 case 1: opt.etm = MBEDTLS_SSL_ETM_ENABLED; break;
1172*62c56f98SSadaf Ebrahimi                 default: goto usage;
1173*62c56f98SSadaf Ebrahimi             }
1174*62c56f98SSadaf Ebrahimi         }
1175*62c56f98SSadaf Ebrahimi 
1176*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
1177*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_EARLY_DATA)
1178*62c56f98SSadaf Ebrahimi         else if (strcmp(p, "early_data") == 0) {
1179*62c56f98SSadaf Ebrahimi             switch (atoi(q)) {
1180*62c56f98SSadaf Ebrahimi                 case 0:
1181*62c56f98SSadaf Ebrahimi                     opt.early_data = MBEDTLS_SSL_EARLY_DATA_DISABLED;
1182*62c56f98SSadaf Ebrahimi                     break;
1183*62c56f98SSadaf Ebrahimi                 case 1:
1184*62c56f98SSadaf Ebrahimi                     opt.early_data = MBEDTLS_SSL_EARLY_DATA_ENABLED;
1185*62c56f98SSadaf Ebrahimi                     break;
1186*62c56f98SSadaf Ebrahimi                 default: goto usage;
1187*62c56f98SSadaf Ebrahimi             }
1188*62c56f98SSadaf Ebrahimi         }
1189*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_EARLY_DATA */
1190*62c56f98SSadaf Ebrahimi 
1191*62c56f98SSadaf Ebrahimi         else if (strcmp(p, "tls13_kex_modes") == 0) {
1192*62c56f98SSadaf Ebrahimi             if (strcmp(q, "psk") == 0) {
1193*62c56f98SSadaf Ebrahimi                 opt.tls13_kex_modes = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK;
1194*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "psk_ephemeral") == 0) {
1195*62c56f98SSadaf Ebrahimi                 opt.tls13_kex_modes = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL;
1196*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "ephemeral") == 0) {
1197*62c56f98SSadaf Ebrahimi                 opt.tls13_kex_modes = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL;
1198*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "ephemeral_all") == 0) {
1199*62c56f98SSadaf Ebrahimi                 opt.tls13_kex_modes = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ALL;
1200*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "psk_all") == 0) {
1201*62c56f98SSadaf Ebrahimi                 opt.tls13_kex_modes = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ALL;
1202*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "all") == 0) {
1203*62c56f98SSadaf Ebrahimi                 opt.tls13_kex_modes = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_ALL;
1204*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "psk_or_ephemeral") == 0) {
1205*62c56f98SSadaf Ebrahimi                 opt.tls13_kex_modes = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK |
1206*62c56f98SSadaf Ebrahimi                                       MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL;
1207*62c56f98SSadaf Ebrahimi             } else {
1208*62c56f98SSadaf Ebrahimi                 goto usage;
1209*62c56f98SSadaf Ebrahimi             }
1210*62c56f98SSadaf Ebrahimi         }
1211*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
1212*62c56f98SSadaf Ebrahimi         else if (strcmp(p, "min_version") == 0) {
1213*62c56f98SSadaf Ebrahimi             if (strcmp(q, "tls12") == 0 ||
1214*62c56f98SSadaf Ebrahimi                 strcmp(q, "dtls12") == 0) {
1215*62c56f98SSadaf Ebrahimi                 opt.min_version = MBEDTLS_SSL_VERSION_TLS1_2;
1216*62c56f98SSadaf Ebrahimi             }
1217*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
1218*62c56f98SSadaf Ebrahimi             else if (strcmp(q, "tls13") == 0) {
1219*62c56f98SSadaf Ebrahimi                 opt.min_version = MBEDTLS_SSL_VERSION_TLS1_3;
1220*62c56f98SSadaf Ebrahimi             }
1221*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
1222*62c56f98SSadaf Ebrahimi             else {
1223*62c56f98SSadaf Ebrahimi                 goto usage;
1224*62c56f98SSadaf Ebrahimi             }
1225*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "max_version") == 0) {
1226*62c56f98SSadaf Ebrahimi             if (strcmp(q, "tls12") == 0 ||
1227*62c56f98SSadaf Ebrahimi                 strcmp(q, "dtls12") == 0) {
1228*62c56f98SSadaf Ebrahimi                 opt.max_version = MBEDTLS_SSL_VERSION_TLS1_2;
1229*62c56f98SSadaf Ebrahimi             }
1230*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
1231*62c56f98SSadaf Ebrahimi             else if (strcmp(q, "tls13") == 0) {
1232*62c56f98SSadaf Ebrahimi                 opt.max_version = MBEDTLS_SSL_VERSION_TLS1_3;
1233*62c56f98SSadaf Ebrahimi             }
1234*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
1235*62c56f98SSadaf Ebrahimi             else {
1236*62c56f98SSadaf Ebrahimi                 goto usage;
1237*62c56f98SSadaf Ebrahimi             }
1238*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "allow_sha1") == 0) {
1239*62c56f98SSadaf Ebrahimi             switch (atoi(q)) {
1240*62c56f98SSadaf Ebrahimi                 case 0:     opt.allow_sha1 = 0;   break;
1241*62c56f98SSadaf Ebrahimi                 case 1:     opt.allow_sha1 = 1;    break;
1242*62c56f98SSadaf Ebrahimi                 default:    goto usage;
1243*62c56f98SSadaf Ebrahimi             }
1244*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "force_version") == 0) {
1245*62c56f98SSadaf Ebrahimi             if (strcmp(q, "tls12") == 0) {
1246*62c56f98SSadaf Ebrahimi                 opt.min_version = MBEDTLS_SSL_VERSION_TLS1_2;
1247*62c56f98SSadaf Ebrahimi                 opt.max_version = MBEDTLS_SSL_VERSION_TLS1_2;
1248*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "dtls12") == 0) {
1249*62c56f98SSadaf Ebrahimi                 opt.min_version = MBEDTLS_SSL_VERSION_TLS1_2;
1250*62c56f98SSadaf Ebrahimi                 opt.max_version = MBEDTLS_SSL_VERSION_TLS1_2;
1251*62c56f98SSadaf Ebrahimi                 opt.transport = MBEDTLS_SSL_TRANSPORT_DATAGRAM;
1252*62c56f98SSadaf Ebrahimi             }
1253*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
1254*62c56f98SSadaf Ebrahimi             else if (strcmp(q, "tls13") == 0) {
1255*62c56f98SSadaf Ebrahimi                 opt.min_version = MBEDTLS_SSL_VERSION_TLS1_3;
1256*62c56f98SSadaf Ebrahimi                 opt.max_version = MBEDTLS_SSL_VERSION_TLS1_3;
1257*62c56f98SSadaf Ebrahimi             }
1258*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
1259*62c56f98SSadaf Ebrahimi             else {
1260*62c56f98SSadaf Ebrahimi                 goto usage;
1261*62c56f98SSadaf Ebrahimi             }
1262*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "auth_mode") == 0) {
1263*62c56f98SSadaf Ebrahimi             if (strcmp(q, "none") == 0) {
1264*62c56f98SSadaf Ebrahimi                 opt.auth_mode = MBEDTLS_SSL_VERIFY_NONE;
1265*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "optional") == 0) {
1266*62c56f98SSadaf Ebrahimi                 opt.auth_mode = MBEDTLS_SSL_VERIFY_OPTIONAL;
1267*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "required") == 0) {
1268*62c56f98SSadaf Ebrahimi                 opt.auth_mode = MBEDTLS_SSL_VERIFY_REQUIRED;
1269*62c56f98SSadaf Ebrahimi             } else {
1270*62c56f98SSadaf Ebrahimi                 goto usage;
1271*62c56f98SSadaf Ebrahimi             }
1272*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "max_frag_len") == 0) {
1273*62c56f98SSadaf Ebrahimi             if (strcmp(q, "512") == 0) {
1274*62c56f98SSadaf Ebrahimi                 opt.mfl_code = MBEDTLS_SSL_MAX_FRAG_LEN_512;
1275*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "1024") == 0) {
1276*62c56f98SSadaf Ebrahimi                 opt.mfl_code = MBEDTLS_SSL_MAX_FRAG_LEN_1024;
1277*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "2048") == 0) {
1278*62c56f98SSadaf Ebrahimi                 opt.mfl_code = MBEDTLS_SSL_MAX_FRAG_LEN_2048;
1279*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "4096") == 0) {
1280*62c56f98SSadaf Ebrahimi                 opt.mfl_code = MBEDTLS_SSL_MAX_FRAG_LEN_4096;
1281*62c56f98SSadaf Ebrahimi             } else {
1282*62c56f98SSadaf Ebrahimi                 goto usage;
1283*62c56f98SSadaf Ebrahimi             }
1284*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "trunc_hmac") == 0) {
1285*62c56f98SSadaf Ebrahimi             switch (atoi(q)) {
1286*62c56f98SSadaf Ebrahimi                 case 0: opt.trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_DISABLED; break;
1287*62c56f98SSadaf Ebrahimi                 case 1: opt.trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED; break;
1288*62c56f98SSadaf Ebrahimi                 default: goto usage;
1289*62c56f98SSadaf Ebrahimi             }
1290*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "hs_timeout") == 0) {
1291*62c56f98SSadaf Ebrahimi             if ((p = strchr(q, '-')) == NULL) {
1292*62c56f98SSadaf Ebrahimi                 goto usage;
1293*62c56f98SSadaf Ebrahimi             }
1294*62c56f98SSadaf Ebrahimi             *p++ = '\0';
1295*62c56f98SSadaf Ebrahimi             opt.hs_to_min = atoi(q);
1296*62c56f98SSadaf Ebrahimi             opt.hs_to_max = atoi(p);
1297*62c56f98SSadaf Ebrahimi             if (opt.hs_to_min == 0 || opt.hs_to_max < opt.hs_to_min) {
1298*62c56f98SSadaf Ebrahimi                 goto usage;
1299*62c56f98SSadaf Ebrahimi             }
1300*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "mtu") == 0) {
1301*62c56f98SSadaf Ebrahimi             opt.dtls_mtu = atoi(q);
1302*62c56f98SSadaf Ebrahimi             if (opt.dtls_mtu < 0) {
1303*62c56f98SSadaf Ebrahimi                 goto usage;
1304*62c56f98SSadaf Ebrahimi             }
1305*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "dgram_packing") == 0) {
1306*62c56f98SSadaf Ebrahimi             opt.dgram_packing = atoi(q);
1307*62c56f98SSadaf Ebrahimi             if (opt.dgram_packing != 0 &&
1308*62c56f98SSadaf Ebrahimi                 opt.dgram_packing != 1) {
1309*62c56f98SSadaf Ebrahimi                 goto usage;
1310*62c56f98SSadaf Ebrahimi             }
1311*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "recsplit") == 0) {
1312*62c56f98SSadaf Ebrahimi             opt.recsplit = atoi(q);
1313*62c56f98SSadaf Ebrahimi             if (opt.recsplit < 0 || opt.recsplit > 1) {
1314*62c56f98SSadaf Ebrahimi                 goto usage;
1315*62c56f98SSadaf Ebrahimi             }
1316*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "dhmlen") == 0) {
1317*62c56f98SSadaf Ebrahimi             opt.dhmlen = atoi(q);
1318*62c56f98SSadaf Ebrahimi             if (opt.dhmlen < 0) {
1319*62c56f98SSadaf Ebrahimi                 goto usage;
1320*62c56f98SSadaf Ebrahimi             }
1321*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "query_config") == 0) {
1322*62c56f98SSadaf Ebrahimi             opt.query_config_mode = 1;
1323*62c56f98SSadaf Ebrahimi             query_config_ret = query_config(q);
1324*62c56f98SSadaf Ebrahimi             goto exit;
1325*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "serialize") == 0) {
1326*62c56f98SSadaf Ebrahimi             opt.serialize = atoi(q);
1327*62c56f98SSadaf Ebrahimi             if (opt.serialize < 0 || opt.serialize > 2) {
1328*62c56f98SSadaf Ebrahimi                 goto usage;
1329*62c56f98SSadaf Ebrahimi             }
1330*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "context_file") == 0) {
1331*62c56f98SSadaf Ebrahimi             opt.context_file = q;
1332*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "eap_tls") == 0) {
1333*62c56f98SSadaf Ebrahimi             opt.eap_tls = atoi(q);
1334*62c56f98SSadaf Ebrahimi             if (opt.eap_tls < 0 || opt.eap_tls > 1) {
1335*62c56f98SSadaf Ebrahimi                 goto usage;
1336*62c56f98SSadaf Ebrahimi             }
1337*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "reproducible") == 0) {
1338*62c56f98SSadaf Ebrahimi             opt.reproducible = 1;
1339*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "nss_keylog") == 0) {
1340*62c56f98SSadaf Ebrahimi             opt.nss_keylog = atoi(q);
1341*62c56f98SSadaf Ebrahimi             if (opt.nss_keylog < 0 || opt.nss_keylog > 1) {
1342*62c56f98SSadaf Ebrahimi                 goto usage;
1343*62c56f98SSadaf Ebrahimi             }
1344*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "nss_keylog_file") == 0) {
1345*62c56f98SSadaf Ebrahimi             opt.nss_keylog_file = q;
1346*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "skip_close_notify") == 0) {
1347*62c56f98SSadaf Ebrahimi             opt.skip_close_notify = atoi(q);
1348*62c56f98SSadaf Ebrahimi             if (opt.skip_close_notify < 0 || opt.skip_close_notify > 1) {
1349*62c56f98SSadaf Ebrahimi                 goto usage;
1350*62c56f98SSadaf Ebrahimi             }
1351*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "use_srtp") == 0) {
1352*62c56f98SSadaf Ebrahimi             opt.use_srtp = atoi(q);
1353*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "srtp_force_profile") == 0) {
1354*62c56f98SSadaf Ebrahimi             opt.force_srtp_profile = atoi(q);
1355*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "mki") == 0) {
1356*62c56f98SSadaf Ebrahimi             opt.mki = q;
1357*62c56f98SSadaf Ebrahimi         } else if (strcmp(p, "key_opaque_algs") == 0) {
1358*62c56f98SSadaf Ebrahimi             if (key_opaque_alg_parse(q, &opt.key_opaque_alg1,
1359*62c56f98SSadaf Ebrahimi                                      &opt.key_opaque_alg2) != 0) {
1360*62c56f98SSadaf Ebrahimi                 goto usage;
1361*62c56f98SSadaf Ebrahimi             }
1362*62c56f98SSadaf Ebrahimi         } else {
1363*62c56f98SSadaf Ebrahimi             goto usage;
1364*62c56f98SSadaf Ebrahimi         }
1365*62c56f98SSadaf Ebrahimi     }
1366*62c56f98SSadaf Ebrahimi 
1367*62c56f98SSadaf Ebrahimi     if (opt.nss_keylog != 0 && opt.eap_tls != 0) {
1368*62c56f98SSadaf Ebrahimi         mbedtls_printf("Error: eap_tls and nss_keylog options cannot be used together.\n");
1369*62c56f98SSadaf Ebrahimi         goto usage;
1370*62c56f98SSadaf Ebrahimi     }
1371*62c56f98SSadaf Ebrahimi 
1372*62c56f98SSadaf Ebrahimi     /* Event-driven IO is incompatible with the above custom
1373*62c56f98SSadaf Ebrahimi      * receive and send functions, as the polling builds on
1374*62c56f98SSadaf Ebrahimi      * refers to the underlying net_context. */
1375*62c56f98SSadaf Ebrahimi     if (opt.event == 1 && opt.nbio != 1) {
1376*62c56f98SSadaf Ebrahimi         mbedtls_printf("Warning: event-driven IO mandates nbio=1 - overwrite\n");
1377*62c56f98SSadaf Ebrahimi         opt.nbio = 1;
1378*62c56f98SSadaf Ebrahimi     }
1379*62c56f98SSadaf Ebrahimi 
1380*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_DEBUG_C)
1381*62c56f98SSadaf Ebrahimi     mbedtls_debug_set_threshold(opt.debug_level);
1382*62c56f98SSadaf Ebrahimi #endif
1383*62c56f98SSadaf Ebrahimi 
1384*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
1385*62c56f98SSadaf Ebrahimi     /*
1386*62c56f98SSadaf Ebrahimi      * Unhexify the pre-shared key if any is given
1387*62c56f98SSadaf Ebrahimi      */
1388*62c56f98SSadaf Ebrahimi     if (strlen(opt.psk)) {
1389*62c56f98SSadaf Ebrahimi         if (mbedtls_test_unhexify(psk, sizeof(psk),
1390*62c56f98SSadaf Ebrahimi                                   opt.psk, &psk_len) != 0) {
1391*62c56f98SSadaf Ebrahimi             mbedtls_printf("pre-shared key not valid\n");
1392*62c56f98SSadaf Ebrahimi             goto exit;
1393*62c56f98SSadaf Ebrahimi         }
1394*62c56f98SSadaf Ebrahimi     }
1395*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */
1396*62c56f98SSadaf Ebrahimi 
1397*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
1398*62c56f98SSadaf Ebrahimi     if (opt.psk_opaque != 0) {
1399*62c56f98SSadaf Ebrahimi         if (opt.psk == NULL) {
1400*62c56f98SSadaf Ebrahimi             mbedtls_printf("psk_opaque set but no psk to be imported specified.\n");
1401*62c56f98SSadaf Ebrahimi             ret = 2;
1402*62c56f98SSadaf Ebrahimi             goto usage;
1403*62c56f98SSadaf Ebrahimi         }
1404*62c56f98SSadaf Ebrahimi 
1405*62c56f98SSadaf Ebrahimi         if (opt.force_ciphersuite[0] <= 0) {
1406*62c56f98SSadaf Ebrahimi             mbedtls_printf(
1407*62c56f98SSadaf Ebrahimi                 "opaque PSKs are only supported in conjunction with forcing TLS 1.2 and a PSK-only ciphersuite through the 'force_ciphersuite' option.\n");
1408*62c56f98SSadaf Ebrahimi             ret = 2;
1409*62c56f98SSadaf Ebrahimi             goto usage;
1410*62c56f98SSadaf Ebrahimi         }
1411*62c56f98SSadaf Ebrahimi     }
1412*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
1413*62c56f98SSadaf Ebrahimi 
1414*62c56f98SSadaf Ebrahimi     if (opt.force_ciphersuite[0] > 0) {
1415*62c56f98SSadaf Ebrahimi         const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
1416*62c56f98SSadaf Ebrahimi         ciphersuite_info =
1417*62c56f98SSadaf Ebrahimi             mbedtls_ssl_ciphersuite_from_id(opt.force_ciphersuite[0]);
1418*62c56f98SSadaf Ebrahimi 
1419*62c56f98SSadaf Ebrahimi         if (opt.max_version != -1 &&
1420*62c56f98SSadaf Ebrahimi             ciphersuite_info->min_tls_version > opt.max_version) {
1421*62c56f98SSadaf Ebrahimi             mbedtls_printf("forced ciphersuite not allowed with this protocol version\n");
1422*62c56f98SSadaf Ebrahimi             ret = 2;
1423*62c56f98SSadaf Ebrahimi             goto usage;
1424*62c56f98SSadaf Ebrahimi         }
1425*62c56f98SSadaf Ebrahimi         if (opt.min_version != -1 &&
1426*62c56f98SSadaf Ebrahimi             ciphersuite_info->max_tls_version < opt.min_version) {
1427*62c56f98SSadaf Ebrahimi             mbedtls_printf("forced ciphersuite not allowed with this protocol version\n");
1428*62c56f98SSadaf Ebrahimi             ret = 2;
1429*62c56f98SSadaf Ebrahimi             goto usage;
1430*62c56f98SSadaf Ebrahimi         }
1431*62c56f98SSadaf Ebrahimi 
1432*62c56f98SSadaf Ebrahimi         /* If the server selects a version that's not supported by
1433*62c56f98SSadaf Ebrahimi          * this suite, then there will be no common ciphersuite... */
1434*62c56f98SSadaf Ebrahimi         if (opt.max_version == -1 ||
1435*62c56f98SSadaf Ebrahimi             opt.max_version > ciphersuite_info->max_tls_version) {
1436*62c56f98SSadaf Ebrahimi             opt.max_version = ciphersuite_info->max_tls_version;
1437*62c56f98SSadaf Ebrahimi         }
1438*62c56f98SSadaf Ebrahimi         if (opt.min_version < ciphersuite_info->min_tls_version) {
1439*62c56f98SSadaf Ebrahimi             opt.min_version = ciphersuite_info->min_tls_version;
1440*62c56f98SSadaf Ebrahimi             /* DTLS starts with TLS 1.2 */
1441*62c56f98SSadaf Ebrahimi             if (opt.transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
1442*62c56f98SSadaf Ebrahimi                 opt.min_version < MBEDTLS_SSL_VERSION_TLS1_2) {
1443*62c56f98SSadaf Ebrahimi                 opt.min_version = MBEDTLS_SSL_VERSION_TLS1_2;
1444*62c56f98SSadaf Ebrahimi             }
1445*62c56f98SSadaf Ebrahimi         }
1446*62c56f98SSadaf Ebrahimi 
1447*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
1448*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
1449*62c56f98SSadaf Ebrahimi         if (opt.psk_opaque != 0) {
1450*62c56f98SSadaf Ebrahimi             /* Determine KDF algorithm the opaque PSK will be used in. */
1451*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
1452*62c56f98SSadaf Ebrahimi             if (ciphersuite_info->mac == MBEDTLS_MD_SHA384) {
1453*62c56f98SSadaf Ebrahimi                 alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_384);
1454*62c56f98SSadaf Ebrahimi             } else
1455*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_CAN_SHA384 */
1456*62c56f98SSadaf Ebrahimi             alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_256);
1457*62c56f98SSadaf Ebrahimi         }
1458*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */
1459*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
1460*62c56f98SSadaf Ebrahimi     }
1461*62c56f98SSadaf Ebrahimi 
1462*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
1463*62c56f98SSadaf Ebrahimi     if (mbedtls_test_unhexify(cid, sizeof(cid),
1464*62c56f98SSadaf Ebrahimi                               opt.cid_val, &cid_len) != 0) {
1465*62c56f98SSadaf Ebrahimi         mbedtls_printf("CID not valid\n");
1466*62c56f98SSadaf Ebrahimi         goto exit;
1467*62c56f98SSadaf Ebrahimi     }
1468*62c56f98SSadaf Ebrahimi 
1469*62c56f98SSadaf Ebrahimi     /* Keep CID settings for renegotiation unless
1470*62c56f98SSadaf Ebrahimi      * specified otherwise. */
1471*62c56f98SSadaf Ebrahimi     if (opt.cid_enabled_renego == DFL_CID_ENABLED_RENEGO) {
1472*62c56f98SSadaf Ebrahimi         opt.cid_enabled_renego = opt.cid_enabled;
1473*62c56f98SSadaf Ebrahimi     }
1474*62c56f98SSadaf Ebrahimi     if (opt.cid_val_renego == DFL_CID_VALUE_RENEGO) {
1475*62c56f98SSadaf Ebrahimi         opt.cid_val_renego = opt.cid_val;
1476*62c56f98SSadaf Ebrahimi     }
1477*62c56f98SSadaf Ebrahimi 
1478*62c56f98SSadaf Ebrahimi     if (mbedtls_test_unhexify(cid_renego, sizeof(cid_renego),
1479*62c56f98SSadaf Ebrahimi                               opt.cid_val_renego, &cid_renego_len) != 0) {
1480*62c56f98SSadaf Ebrahimi         mbedtls_printf("CID not valid\n");
1481*62c56f98SSadaf Ebrahimi         goto exit;
1482*62c56f98SSadaf Ebrahimi     }
1483*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1484*62c56f98SSadaf Ebrahimi 
1485*62c56f98SSadaf Ebrahimi     if (opt.groups != NULL) {
1486*62c56f98SSadaf Ebrahimi         if (parse_groups(opt.groups, group_list, GROUP_LIST_SIZE) != 0) {
1487*62c56f98SSadaf Ebrahimi             goto exit;
1488*62c56f98SSadaf Ebrahimi         }
1489*62c56f98SSadaf Ebrahimi     }
1490*62c56f98SSadaf Ebrahimi 
1491*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
1492*62c56f98SSadaf Ebrahimi     if (opt.sig_algs != NULL) {
1493*62c56f98SSadaf Ebrahimi         p = (char *) opt.sig_algs;
1494*62c56f98SSadaf Ebrahimi         i = 0;
1495*62c56f98SSadaf Ebrahimi 
1496*62c56f98SSadaf Ebrahimi         /* Leave room for a final MBEDTLS_TLS1_3_SIG_NONE in signature algorithm list (sig_alg_list). */
1497*62c56f98SSadaf Ebrahimi         while (i < SIG_ALG_LIST_SIZE - 1 && *p != '\0') {
1498*62c56f98SSadaf Ebrahimi             q = p;
1499*62c56f98SSadaf Ebrahimi 
1500*62c56f98SSadaf Ebrahimi             /* Terminate the current string */
1501*62c56f98SSadaf Ebrahimi             while (*p != ',' && *p != '\0') {
1502*62c56f98SSadaf Ebrahimi                 p++;
1503*62c56f98SSadaf Ebrahimi             }
1504*62c56f98SSadaf Ebrahimi             if (*p == ',') {
1505*62c56f98SSadaf Ebrahimi                 *p++ = '\0';
1506*62c56f98SSadaf Ebrahimi             }
1507*62c56f98SSadaf Ebrahimi 
1508*62c56f98SSadaf Ebrahimi             if (strcmp(q, "rsa_pkcs1_sha256") == 0) {
1509*62c56f98SSadaf Ebrahimi                 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA256;
1510*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "rsa_pkcs1_sha384") == 0) {
1511*62c56f98SSadaf Ebrahimi                 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA384;
1512*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "rsa_pkcs1_sha512") == 0) {
1513*62c56f98SSadaf Ebrahimi                 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA512;
1514*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "ecdsa_secp256r1_sha256") == 0) {
1515*62c56f98SSadaf Ebrahimi                 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_ECDSA_SECP256R1_SHA256;
1516*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "ecdsa_secp384r1_sha384") == 0) {
1517*62c56f98SSadaf Ebrahimi                 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_ECDSA_SECP384R1_SHA384;
1518*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "ecdsa_secp521r1_sha512") == 0) {
1519*62c56f98SSadaf Ebrahimi                 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_ECDSA_SECP521R1_SHA512;
1520*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "rsa_pss_rsae_sha256") == 0) {
1521*62c56f98SSadaf Ebrahimi                 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA256;
1522*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "rsa_pss_rsae_sha384") == 0) {
1523*62c56f98SSadaf Ebrahimi                 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA384;
1524*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "rsa_pss_rsae_sha512") == 0) {
1525*62c56f98SSadaf Ebrahimi                 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA512;
1526*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "ed25519") == 0) {
1527*62c56f98SSadaf Ebrahimi                 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_ED25519;
1528*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "ed448") == 0) {
1529*62c56f98SSadaf Ebrahimi                 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_ED448;
1530*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "rsa_pss_pss_sha256") == 0) {
1531*62c56f98SSadaf Ebrahimi                 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_RSA_PSS_PSS_SHA256;
1532*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "rsa_pss_pss_sha384") == 0) {
1533*62c56f98SSadaf Ebrahimi                 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_RSA_PSS_PSS_SHA384;
1534*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "rsa_pss_pss_sha512") == 0) {
1535*62c56f98SSadaf Ebrahimi                 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_RSA_PSS_PSS_SHA512;
1536*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "rsa_pkcs1_sha1") == 0) {
1537*62c56f98SSadaf Ebrahimi                 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA1;
1538*62c56f98SSadaf Ebrahimi             } else if (strcmp(q, "ecdsa_sha1") == 0) {
1539*62c56f98SSadaf Ebrahimi                 sig_alg_list[i++] = MBEDTLS_TLS1_3_SIG_ECDSA_SHA1;
1540*62c56f98SSadaf Ebrahimi             } else {
1541*62c56f98SSadaf Ebrahimi                 ret = -1;
1542*62c56f98SSadaf Ebrahimi                 mbedtls_printf("unknown signature algorithm \"%s\"\n", q);
1543*62c56f98SSadaf Ebrahimi                 mbedtls_print_supported_sig_algs();
1544*62c56f98SSadaf Ebrahimi                 goto exit;
1545*62c56f98SSadaf Ebrahimi             }
1546*62c56f98SSadaf Ebrahimi         }
1547*62c56f98SSadaf Ebrahimi 
1548*62c56f98SSadaf Ebrahimi         if (i == (SIG_ALG_LIST_SIZE - 1) && *p != '\0') {
1549*62c56f98SSadaf Ebrahimi             mbedtls_printf("signature algorithm list too long, maximum %d",
1550*62c56f98SSadaf Ebrahimi                            SIG_ALG_LIST_SIZE - 1);
1551*62c56f98SSadaf Ebrahimi             goto exit;
1552*62c56f98SSadaf Ebrahimi         }
1553*62c56f98SSadaf Ebrahimi 
1554*62c56f98SSadaf Ebrahimi         sig_alg_list[i] = MBEDTLS_TLS1_3_SIG_NONE;
1555*62c56f98SSadaf Ebrahimi     }
1556*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
1557*62c56f98SSadaf Ebrahimi 
1558*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ALPN)
1559*62c56f98SSadaf Ebrahimi     if (opt.alpn_string != NULL) {
1560*62c56f98SSadaf Ebrahimi         p = (char *) opt.alpn_string;
1561*62c56f98SSadaf Ebrahimi         i = 0;
1562*62c56f98SSadaf Ebrahimi 
1563*62c56f98SSadaf Ebrahimi         /* Leave room for a final NULL in alpn_list */
1564*62c56f98SSadaf Ebrahimi         while (i < ALPN_LIST_SIZE - 1 && *p != '\0') {
1565*62c56f98SSadaf Ebrahimi             alpn_list[i++] = p;
1566*62c56f98SSadaf Ebrahimi 
1567*62c56f98SSadaf Ebrahimi             /* Terminate the current string and move on to next one */
1568*62c56f98SSadaf Ebrahimi             while (*p != ',' && *p != '\0') {
1569*62c56f98SSadaf Ebrahimi                 p++;
1570*62c56f98SSadaf Ebrahimi             }
1571*62c56f98SSadaf Ebrahimi             if (*p == ',') {
1572*62c56f98SSadaf Ebrahimi                 *p++ = '\0';
1573*62c56f98SSadaf Ebrahimi             }
1574*62c56f98SSadaf Ebrahimi         }
1575*62c56f98SSadaf Ebrahimi     }
1576*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_ALPN */
1577*62c56f98SSadaf Ebrahimi 
1578*62c56f98SSadaf Ebrahimi     mbedtls_printf("build version: %s (build %d)\n",
1579*62c56f98SSadaf Ebrahimi                    MBEDTLS_VERSION_STRING_FULL, MBEDTLS_VERSION_NUMBER);
1580*62c56f98SSadaf Ebrahimi 
1581*62c56f98SSadaf Ebrahimi     /*
1582*62c56f98SSadaf Ebrahimi      * 0. Initialize the RNG and the session data
1583*62c56f98SSadaf Ebrahimi      */
1584*62c56f98SSadaf Ebrahimi     mbedtls_printf("\n  . Seeding the random number generator...");
1585*62c56f98SSadaf Ebrahimi     fflush(stdout);
1586*62c56f98SSadaf Ebrahimi 
1587*62c56f98SSadaf Ebrahimi     ret = rng_seed(&rng, opt.reproducible, pers);
1588*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1589*62c56f98SSadaf Ebrahimi         goto exit;
1590*62c56f98SSadaf Ebrahimi     }
1591*62c56f98SSadaf Ebrahimi     mbedtls_printf(" ok\n");
1592*62c56f98SSadaf Ebrahimi 
1593*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
1594*62c56f98SSadaf Ebrahimi     /*
1595*62c56f98SSadaf Ebrahimi      * 1.1. Load the trusted CA
1596*62c56f98SSadaf Ebrahimi      */
1597*62c56f98SSadaf Ebrahimi     mbedtls_printf("  . Loading the CA root certificate ...");
1598*62c56f98SSadaf Ebrahimi     fflush(stdout);
1599*62c56f98SSadaf Ebrahimi 
1600*62c56f98SSadaf Ebrahimi     if (strcmp(opt.ca_path, "none") == 0 ||
1601*62c56f98SSadaf Ebrahimi         strcmp(opt.ca_file, "none") == 0) {
1602*62c56f98SSadaf Ebrahimi         ret = 0;
1603*62c56f98SSadaf Ebrahimi     } else
1604*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_FS_IO)
1605*62c56f98SSadaf Ebrahimi     if (strlen(opt.ca_path)) {
1606*62c56f98SSadaf Ebrahimi         ret = mbedtls_x509_crt_parse_path(&cacert, opt.ca_path);
1607*62c56f98SSadaf Ebrahimi     } else if (strlen(opt.ca_file)) {
1608*62c56f98SSadaf Ebrahimi         ret = mbedtls_x509_crt_parse_file(&cacert, opt.ca_file);
1609*62c56f98SSadaf Ebrahimi     } else
1610*62c56f98SSadaf Ebrahimi #endif
1611*62c56f98SSadaf Ebrahimi     {
1612*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PEM_PARSE_C)
1613*62c56f98SSadaf Ebrahimi         for (i = 0; mbedtls_test_cas[i] != NULL; i++) {
1614*62c56f98SSadaf Ebrahimi             ret = mbedtls_x509_crt_parse(&cacert,
1615*62c56f98SSadaf Ebrahimi                                          (const unsigned char *) mbedtls_test_cas[i],
1616*62c56f98SSadaf Ebrahimi                                          mbedtls_test_cas_len[i]);
1617*62c56f98SSadaf Ebrahimi             if (ret != 0) {
1618*62c56f98SSadaf Ebrahimi                 break;
1619*62c56f98SSadaf Ebrahimi             }
1620*62c56f98SSadaf Ebrahimi         }
1621*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PEM_PARSE_C */
1622*62c56f98SSadaf Ebrahimi         if (ret == 0) {
1623*62c56f98SSadaf Ebrahimi             for (i = 0; mbedtls_test_cas_der[i] != NULL; i++) {
1624*62c56f98SSadaf Ebrahimi                 ret = mbedtls_x509_crt_parse_der(&cacert,
1625*62c56f98SSadaf Ebrahimi                                                  (const unsigned char *) mbedtls_test_cas_der[i],
1626*62c56f98SSadaf Ebrahimi                                                  mbedtls_test_cas_der_len[i]);
1627*62c56f98SSadaf Ebrahimi                 if (ret != 0) {
1628*62c56f98SSadaf Ebrahimi                     break;
1629*62c56f98SSadaf Ebrahimi                 }
1630*62c56f98SSadaf Ebrahimi             }
1631*62c56f98SSadaf Ebrahimi         }
1632*62c56f98SSadaf Ebrahimi     }
1633*62c56f98SSadaf Ebrahimi     if (ret < 0) {
1634*62c56f98SSadaf Ebrahimi         mbedtls_printf(" failed\n  !  mbedtls_x509_crt_parse returned -0x%x\n\n",
1635*62c56f98SSadaf Ebrahimi                        (unsigned int) -ret);
1636*62c56f98SSadaf Ebrahimi         goto exit;
1637*62c56f98SSadaf Ebrahimi     }
1638*62c56f98SSadaf Ebrahimi 
1639*62c56f98SSadaf Ebrahimi     mbedtls_printf(" ok (%d skipped)\n", ret);
1640*62c56f98SSadaf Ebrahimi 
1641*62c56f98SSadaf Ebrahimi     /*
1642*62c56f98SSadaf Ebrahimi      * 1.2. Load own certificate and private key
1643*62c56f98SSadaf Ebrahimi      *
1644*62c56f98SSadaf Ebrahimi      * (can be skipped if client authentication is not required)
1645*62c56f98SSadaf Ebrahimi      */
1646*62c56f98SSadaf Ebrahimi     mbedtls_printf("  . Loading the client cert. and key...");
1647*62c56f98SSadaf Ebrahimi     fflush(stdout);
1648*62c56f98SSadaf Ebrahimi 
1649*62c56f98SSadaf Ebrahimi     if (strcmp(opt.crt_file, "none") == 0) {
1650*62c56f98SSadaf Ebrahimi         ret = 0;
1651*62c56f98SSadaf Ebrahimi     } else
1652*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_FS_IO)
1653*62c56f98SSadaf Ebrahimi     if (strlen(opt.crt_file)) {
1654*62c56f98SSadaf Ebrahimi         ret = mbedtls_x509_crt_parse_file(&clicert, opt.crt_file);
1655*62c56f98SSadaf Ebrahimi     } else
1656*62c56f98SSadaf Ebrahimi #endif
1657*62c56f98SSadaf Ebrahimi     { ret = mbedtls_x509_crt_parse(&clicert,
1658*62c56f98SSadaf Ebrahimi                                    (const unsigned char *) mbedtls_test_cli_crt,
1659*62c56f98SSadaf Ebrahimi                                    mbedtls_test_cli_crt_len); }
1660*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1661*62c56f98SSadaf Ebrahimi         mbedtls_printf(" failed\n  !  mbedtls_x509_crt_parse returned -0x%x\n\n",
1662*62c56f98SSadaf Ebrahimi                        (unsigned int) -ret);
1663*62c56f98SSadaf Ebrahimi         goto exit;
1664*62c56f98SSadaf Ebrahimi     }
1665*62c56f98SSadaf Ebrahimi 
1666*62c56f98SSadaf Ebrahimi     if (strcmp(opt.key_file, "none") == 0) {
1667*62c56f98SSadaf Ebrahimi         ret = 0;
1668*62c56f98SSadaf Ebrahimi     } else
1669*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_FS_IO)
1670*62c56f98SSadaf Ebrahimi     if (strlen(opt.key_file)) {
1671*62c56f98SSadaf Ebrahimi         ret = mbedtls_pk_parse_keyfile(&pkey, opt.key_file, opt.key_pwd, rng_get, &rng);
1672*62c56f98SSadaf Ebrahimi     } else
1673*62c56f98SSadaf Ebrahimi #endif
1674*62c56f98SSadaf Ebrahimi     { ret = mbedtls_pk_parse_key(&pkey,
1675*62c56f98SSadaf Ebrahimi                                  (const unsigned char *) mbedtls_test_cli_key,
1676*62c56f98SSadaf Ebrahimi                                  mbedtls_test_cli_key_len, NULL, 0, rng_get, &rng); }
1677*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1678*62c56f98SSadaf Ebrahimi         mbedtls_printf(" failed\n  !  mbedtls_pk_parse_key returned -0x%x\n\n",
1679*62c56f98SSadaf Ebrahimi                        (unsigned int) -ret);
1680*62c56f98SSadaf Ebrahimi         goto exit;
1681*62c56f98SSadaf Ebrahimi     }
1682*62c56f98SSadaf Ebrahimi 
1683*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
1684*62c56f98SSadaf Ebrahimi     if (opt.key_opaque != 0) {
1685*62c56f98SSadaf Ebrahimi         psa_algorithm_t psa_alg, psa_alg2 = PSA_ALG_NONE;
1686*62c56f98SSadaf Ebrahimi         psa_key_usage_t usage = 0;
1687*62c56f98SSadaf Ebrahimi 
1688*62c56f98SSadaf Ebrahimi         if (key_opaque_set_alg_usage(opt.key_opaque_alg1,
1689*62c56f98SSadaf Ebrahimi                                      opt.key_opaque_alg2,
1690*62c56f98SSadaf Ebrahimi                                      &psa_alg, &psa_alg2,
1691*62c56f98SSadaf Ebrahimi                                      &usage,
1692*62c56f98SSadaf Ebrahimi                                      mbedtls_pk_get_type(&pkey)) == 0) {
1693*62c56f98SSadaf Ebrahimi             ret = mbedtls_pk_wrap_as_opaque(&pkey, &key_slot, psa_alg,
1694*62c56f98SSadaf Ebrahimi                                             usage, psa_alg2);
1695*62c56f98SSadaf Ebrahimi             if (ret != 0) {
1696*62c56f98SSadaf Ebrahimi                 mbedtls_printf(" failed\n  !  "
1697*62c56f98SSadaf Ebrahimi                                "mbedtls_pk_wrap_as_opaque returned -0x%x\n\n",
1698*62c56f98SSadaf Ebrahimi                                (unsigned int)  -ret);
1699*62c56f98SSadaf Ebrahimi                 goto exit;
1700*62c56f98SSadaf Ebrahimi             }
1701*62c56f98SSadaf Ebrahimi         }
1702*62c56f98SSadaf Ebrahimi     }
1703*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
1704*62c56f98SSadaf Ebrahimi 
1705*62c56f98SSadaf Ebrahimi     mbedtls_printf(" ok (key type: %s)\n",
1706*62c56f98SSadaf Ebrahimi                    strlen(opt.key_file) || strlen(opt.key_opaque_alg1) ?
1707*62c56f98SSadaf Ebrahimi                    mbedtls_pk_get_name(&pkey) : "none");
1708*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
1709*62c56f98SSadaf Ebrahimi 
1710*62c56f98SSadaf Ebrahimi     /*
1711*62c56f98SSadaf Ebrahimi      * 2. Setup stuff
1712*62c56f98SSadaf Ebrahimi      */
1713*62c56f98SSadaf Ebrahimi     mbedtls_printf("  . Setting up the SSL/TLS structure...");
1714*62c56f98SSadaf Ebrahimi     fflush(stdout);
1715*62c56f98SSadaf Ebrahimi 
1716*62c56f98SSadaf Ebrahimi     if ((ret = mbedtls_ssl_config_defaults(&conf,
1717*62c56f98SSadaf Ebrahimi                                            MBEDTLS_SSL_IS_CLIENT,
1718*62c56f98SSadaf Ebrahimi                                            opt.transport,
1719*62c56f98SSadaf Ebrahimi                                            MBEDTLS_SSL_PRESET_DEFAULT)) != 0) {
1720*62c56f98SSadaf Ebrahimi         mbedtls_printf(" failed\n  ! mbedtls_ssl_config_defaults returned -0x%x\n\n",
1721*62c56f98SSadaf Ebrahimi                        (unsigned int) -ret);
1722*62c56f98SSadaf Ebrahimi         goto exit;
1723*62c56f98SSadaf Ebrahimi     }
1724*62c56f98SSadaf Ebrahimi 
1725*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
1726*62c56f98SSadaf Ebrahimi     /* The default algorithms profile disables SHA-1, but our tests still
1727*62c56f98SSadaf Ebrahimi        rely on it heavily. */
1728*62c56f98SSadaf Ebrahimi     if (opt.allow_sha1 > 0) {
1729*62c56f98SSadaf Ebrahimi         crt_profile_for_test.allowed_mds |= MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA1);
1730*62c56f98SSadaf Ebrahimi         mbedtls_ssl_conf_cert_profile(&conf, &crt_profile_for_test);
1731*62c56f98SSadaf Ebrahimi         mbedtls_ssl_conf_sig_algs(&conf, ssl_sig_algs_for_test);
1732*62c56f98SSadaf Ebrahimi     }
1733*62c56f98SSadaf Ebrahimi     if (opt.context_crt_cb == 0) {
1734*62c56f98SSadaf Ebrahimi         mbedtls_ssl_conf_verify(&conf, my_verify, NULL);
1735*62c56f98SSadaf Ebrahimi     }
1736*62c56f98SSadaf Ebrahimi 
1737*62c56f98SSadaf Ebrahimi     memset(peer_crt_info, 0, sizeof(peer_crt_info));
1738*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
1739*62c56f98SSadaf Ebrahimi 
1740*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
1741*62c56f98SSadaf Ebrahimi     if (opt.cid_enabled == 1 || opt.cid_enabled_renego == 1) {
1742*62c56f98SSadaf Ebrahimi         if (opt.cid_enabled == 1        &&
1743*62c56f98SSadaf Ebrahimi             opt.cid_enabled_renego == 1 &&
1744*62c56f98SSadaf Ebrahimi             cid_len != cid_renego_len) {
1745*62c56f98SSadaf Ebrahimi             mbedtls_printf("CID length must not change during renegotiation\n");
1746*62c56f98SSadaf Ebrahimi             goto usage;
1747*62c56f98SSadaf Ebrahimi         }
1748*62c56f98SSadaf Ebrahimi 
1749*62c56f98SSadaf Ebrahimi         if (opt.cid_enabled == 1) {
1750*62c56f98SSadaf Ebrahimi             ret = mbedtls_ssl_conf_cid(&conf, cid_len,
1751*62c56f98SSadaf Ebrahimi                                        MBEDTLS_SSL_UNEXPECTED_CID_IGNORE);
1752*62c56f98SSadaf Ebrahimi         } else {
1753*62c56f98SSadaf Ebrahimi             ret = mbedtls_ssl_conf_cid(&conf, cid_renego_len,
1754*62c56f98SSadaf Ebrahimi                                        MBEDTLS_SSL_UNEXPECTED_CID_IGNORE);
1755*62c56f98SSadaf Ebrahimi         }
1756*62c56f98SSadaf Ebrahimi 
1757*62c56f98SSadaf Ebrahimi         if (ret != 0) {
1758*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! mbedtls_ssl_conf_cid_len returned -%#04x\n\n",
1759*62c56f98SSadaf Ebrahimi                            (unsigned int) -ret);
1760*62c56f98SSadaf Ebrahimi             goto exit;
1761*62c56f98SSadaf Ebrahimi         }
1762*62c56f98SSadaf Ebrahimi     }
1763*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1764*62c56f98SSadaf Ebrahimi 
1765*62c56f98SSadaf Ebrahimi     if (opt.auth_mode != DFL_AUTH_MODE) {
1766*62c56f98SSadaf Ebrahimi         mbedtls_ssl_conf_authmode(&conf, opt.auth_mode);
1767*62c56f98SSadaf Ebrahimi     }
1768*62c56f98SSadaf Ebrahimi 
1769*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
1770*62c56f98SSadaf Ebrahimi     if (opt.hs_to_min != DFL_HS_TO_MIN || opt.hs_to_max != DFL_HS_TO_MAX) {
1771*62c56f98SSadaf Ebrahimi         mbedtls_ssl_conf_handshake_timeout(&conf, opt.hs_to_min,
1772*62c56f98SSadaf Ebrahimi                                            opt.hs_to_max);
1773*62c56f98SSadaf Ebrahimi     }
1774*62c56f98SSadaf Ebrahimi 
1775*62c56f98SSadaf Ebrahimi     if (opt.dgram_packing != DFL_DGRAM_PACKING) {
1776*62c56f98SSadaf Ebrahimi         mbedtls_ssl_set_datagram_packing(&ssl, opt.dgram_packing);
1777*62c56f98SSadaf Ebrahimi     }
1778*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_DTLS */
1779*62c56f98SSadaf Ebrahimi 
1780*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
1781*62c56f98SSadaf Ebrahimi     if ((ret = mbedtls_ssl_conf_max_frag_len(&conf, opt.mfl_code)) != 0) {
1782*62c56f98SSadaf Ebrahimi         mbedtls_printf(" failed\n  ! mbedtls_ssl_conf_max_frag_len returned %d\n\n",
1783*62c56f98SSadaf Ebrahimi                        ret);
1784*62c56f98SSadaf Ebrahimi         goto exit;
1785*62c56f98SSadaf Ebrahimi     }
1786*62c56f98SSadaf Ebrahimi #endif
1787*62c56f98SSadaf Ebrahimi 
1788*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_SRTP)
1789*62c56f98SSadaf Ebrahimi     const mbedtls_ssl_srtp_profile forced_profile[] =
1790*62c56f98SSadaf Ebrahimi     { opt.force_srtp_profile, MBEDTLS_TLS_SRTP_UNSET };
1791*62c56f98SSadaf Ebrahimi     if (opt.use_srtp == 1) {
1792*62c56f98SSadaf Ebrahimi         if (opt.force_srtp_profile != 0) {
1793*62c56f98SSadaf Ebrahimi             ret = mbedtls_ssl_conf_dtls_srtp_protection_profiles(&conf, forced_profile);
1794*62c56f98SSadaf Ebrahimi         } else {
1795*62c56f98SSadaf Ebrahimi             ret = mbedtls_ssl_conf_dtls_srtp_protection_profiles(&conf, default_profiles);
1796*62c56f98SSadaf Ebrahimi         }
1797*62c56f98SSadaf Ebrahimi 
1798*62c56f98SSadaf Ebrahimi         if (ret != 0) {
1799*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! "
1800*62c56f98SSadaf Ebrahimi                            "mbedtls_ssl_conf_dtls_srtp_protection_profiles returned %d\n\n",
1801*62c56f98SSadaf Ebrahimi                            ret);
1802*62c56f98SSadaf Ebrahimi             goto exit;
1803*62c56f98SSadaf Ebrahimi         }
1804*62c56f98SSadaf Ebrahimi 
1805*62c56f98SSadaf Ebrahimi     } else if (opt.force_srtp_profile != 0) {
1806*62c56f98SSadaf Ebrahimi         mbedtls_printf(" failed\n  ! must enable use_srtp to force srtp profile\n\n");
1807*62c56f98SSadaf Ebrahimi         goto exit;
1808*62c56f98SSadaf Ebrahimi     }
1809*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_DTLS_SRTP */
1810*62c56f98SSadaf Ebrahimi 
1811*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
1812*62c56f98SSadaf Ebrahimi     if (opt.extended_ms != DFL_EXTENDED_MS) {
1813*62c56f98SSadaf Ebrahimi         mbedtls_ssl_conf_extended_master_secret(&conf, opt.extended_ms);
1814*62c56f98SSadaf Ebrahimi     }
1815*62c56f98SSadaf Ebrahimi #endif
1816*62c56f98SSadaf Ebrahimi 
1817*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1818*62c56f98SSadaf Ebrahimi     if (opt.etm != DFL_ETM) {
1819*62c56f98SSadaf Ebrahimi         mbedtls_ssl_conf_encrypt_then_mac(&conf, opt.etm);
1820*62c56f98SSadaf Ebrahimi     }
1821*62c56f98SSadaf Ebrahimi #endif
1822*62c56f98SSadaf Ebrahimi 
1823*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_DHM_C)
1824*62c56f98SSadaf Ebrahimi     if (opt.dhmlen != DFL_DHMLEN) {
1825*62c56f98SSadaf Ebrahimi         mbedtls_ssl_conf_dhm_min_bitlen(&conf, opt.dhmlen);
1826*62c56f98SSadaf Ebrahimi     }
1827*62c56f98SSadaf Ebrahimi #endif
1828*62c56f98SSadaf Ebrahimi 
1829*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ALPN)
1830*62c56f98SSadaf Ebrahimi     if (opt.alpn_string != NULL) {
1831*62c56f98SSadaf Ebrahimi         if ((ret = mbedtls_ssl_conf_alpn_protocols(&conf, alpn_list)) != 0) {
1832*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! mbedtls_ssl_conf_alpn_protocols returned %d\n\n",
1833*62c56f98SSadaf Ebrahimi                            ret);
1834*62c56f98SSadaf Ebrahimi             goto exit;
1835*62c56f98SSadaf Ebrahimi         }
1836*62c56f98SSadaf Ebrahimi     }
1837*62c56f98SSadaf Ebrahimi #endif
1838*62c56f98SSadaf Ebrahimi 
1839*62c56f98SSadaf Ebrahimi     if (opt.reproducible) {
1840*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_HAVE_TIME)
1841*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PLATFORM_TIME_ALT)
1842*62c56f98SSadaf Ebrahimi         mbedtls_platform_set_time(dummy_constant_time);
1843*62c56f98SSadaf Ebrahimi #else
1844*62c56f98SSadaf Ebrahimi         fprintf(stderr, "Warning: reproducible option used without constant time\n");
1845*62c56f98SSadaf Ebrahimi #endif
1846*62c56f98SSadaf Ebrahimi #endif  /* MBEDTLS_HAVE_TIME */
1847*62c56f98SSadaf Ebrahimi     }
1848*62c56f98SSadaf Ebrahimi     mbedtls_ssl_conf_rng(&conf, rng_get, &rng);
1849*62c56f98SSadaf Ebrahimi     mbedtls_ssl_conf_dbg(&conf, my_debug, stdout);
1850*62c56f98SSadaf Ebrahimi 
1851*62c56f98SSadaf Ebrahimi     mbedtls_ssl_conf_read_timeout(&conf, opt.read_timeout);
1852*62c56f98SSadaf Ebrahimi 
1853*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SESSION_TICKETS)
1854*62c56f98SSadaf Ebrahimi     mbedtls_ssl_conf_session_tickets(&conf, opt.tickets);
1855*62c56f98SSadaf Ebrahimi #endif
1856*62c56f98SSadaf Ebrahimi 
1857*62c56f98SSadaf Ebrahimi     if (opt.force_ciphersuite[0] != DFL_FORCE_CIPHER) {
1858*62c56f98SSadaf Ebrahimi         mbedtls_ssl_conf_ciphersuites(&conf, opt.force_ciphersuite);
1859*62c56f98SSadaf Ebrahimi     }
1860*62c56f98SSadaf Ebrahimi 
1861*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
1862*62c56f98SSadaf Ebrahimi     mbedtls_ssl_conf_tls13_key_exchange_modes(&conf, opt.tls13_kex_modes);
1863*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
1864*62c56f98SSadaf Ebrahimi 
1865*62c56f98SSadaf Ebrahimi     if (opt.allow_legacy != DFL_ALLOW_LEGACY) {
1866*62c56f98SSadaf Ebrahimi         mbedtls_ssl_conf_legacy_renegotiation(&conf, opt.allow_legacy);
1867*62c56f98SSadaf Ebrahimi     }
1868*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_RENEGOTIATION)
1869*62c56f98SSadaf Ebrahimi     mbedtls_ssl_conf_renegotiation(&conf, opt.renegotiation);
1870*62c56f98SSadaf Ebrahimi #endif
1871*62c56f98SSadaf Ebrahimi 
1872*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
1873*62c56f98SSadaf Ebrahimi     if (strcmp(opt.ca_path, "none") != 0 &&
1874*62c56f98SSadaf Ebrahimi         strcmp(opt.ca_file, "none") != 0) {
1875*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
1876*62c56f98SSadaf Ebrahimi         if (opt.ca_callback != 0) {
1877*62c56f98SSadaf Ebrahimi             mbedtls_ssl_conf_ca_cb(&conf, ca_callback, &cacert);
1878*62c56f98SSadaf Ebrahimi         } else
1879*62c56f98SSadaf Ebrahimi #endif
1880*62c56f98SSadaf Ebrahimi         mbedtls_ssl_conf_ca_chain(&conf, &cacert, NULL);
1881*62c56f98SSadaf Ebrahimi     }
1882*62c56f98SSadaf Ebrahimi     if (strcmp(opt.crt_file, "none") != 0 &&
1883*62c56f98SSadaf Ebrahimi         strcmp(opt.key_file, "none") != 0) {
1884*62c56f98SSadaf Ebrahimi         if ((ret = mbedtls_ssl_conf_own_cert(&conf, &clicert, &pkey)) != 0) {
1885*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! mbedtls_ssl_conf_own_cert returned %d\n\n",
1886*62c56f98SSadaf Ebrahimi                            ret);
1887*62c56f98SSadaf Ebrahimi             goto exit;
1888*62c56f98SSadaf Ebrahimi         }
1889*62c56f98SSadaf Ebrahimi     }
1890*62c56f98SSadaf Ebrahimi #endif  /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
1891*62c56f98SSadaf Ebrahimi 
1892*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PK_HAVE_ECC_KEYS) || \
1893*62c56f98SSadaf Ebrahimi     (defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED) && \
1894*62c56f98SSadaf Ebrahimi     defined(PSA_WANT_ALG_FFDH))
1895*62c56f98SSadaf Ebrahimi     if (opt.groups != NULL &&
1896*62c56f98SSadaf Ebrahimi         strcmp(opt.groups, "default") != 0) {
1897*62c56f98SSadaf Ebrahimi         mbedtls_ssl_conf_groups(&conf, group_list);
1898*62c56f98SSadaf Ebrahimi     }
1899*62c56f98SSadaf Ebrahimi #endif
1900*62c56f98SSadaf Ebrahimi 
1901*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
1902*62c56f98SSadaf Ebrahimi     if (opt.sig_algs != NULL) {
1903*62c56f98SSadaf Ebrahimi         mbedtls_ssl_conf_sig_algs(&conf, sig_alg_list);
1904*62c56f98SSadaf Ebrahimi     }
1905*62c56f98SSadaf Ebrahimi #endif
1906*62c56f98SSadaf Ebrahimi 
1907*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
1908*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
1909*62c56f98SSadaf Ebrahimi     if (opt.psk_opaque != 0) {
1910*62c56f98SSadaf Ebrahimi         key_attributes = psa_key_attributes_init();
1911*62c56f98SSadaf Ebrahimi         psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
1912*62c56f98SSadaf Ebrahimi         psa_set_key_algorithm(&key_attributes, alg);
1913*62c56f98SSadaf Ebrahimi         psa_set_key_type(&key_attributes, PSA_KEY_TYPE_DERIVE);
1914*62c56f98SSadaf Ebrahimi 
1915*62c56f98SSadaf Ebrahimi         status = psa_import_key(&key_attributes, psk, psk_len, &slot);
1916*62c56f98SSadaf Ebrahimi         if (status != PSA_SUCCESS) {
1917*62c56f98SSadaf Ebrahimi             ret = MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
1918*62c56f98SSadaf Ebrahimi             goto exit;
1919*62c56f98SSadaf Ebrahimi         }
1920*62c56f98SSadaf Ebrahimi 
1921*62c56f98SSadaf Ebrahimi         if ((ret = mbedtls_ssl_conf_psk_opaque(&conf, slot,
1922*62c56f98SSadaf Ebrahimi                                                (const unsigned char *) opt.psk_identity,
1923*62c56f98SSadaf Ebrahimi                                                strlen(opt.psk_identity))) != 0) {
1924*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! mbedtls_ssl_conf_psk_opaque returned %d\n\n",
1925*62c56f98SSadaf Ebrahimi                            ret);
1926*62c56f98SSadaf Ebrahimi             goto exit;
1927*62c56f98SSadaf Ebrahimi         }
1928*62c56f98SSadaf Ebrahimi     } else
1929*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
1930*62c56f98SSadaf Ebrahimi     if (psk_len > 0) {
1931*62c56f98SSadaf Ebrahimi         ret = mbedtls_ssl_conf_psk(&conf, psk, psk_len,
1932*62c56f98SSadaf Ebrahimi                                    (const unsigned char *) opt.psk_identity,
1933*62c56f98SSadaf Ebrahimi                                    strlen(opt.psk_identity));
1934*62c56f98SSadaf Ebrahimi         if (ret != 0) {
1935*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! mbedtls_ssl_conf_psk returned %d\n\n", ret);
1936*62c56f98SSadaf Ebrahimi             goto exit;
1937*62c56f98SSadaf Ebrahimi         }
1938*62c56f98SSadaf Ebrahimi     }
1939*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */
1940*62c56f98SSadaf Ebrahimi 
1941*62c56f98SSadaf Ebrahimi     if (opt.min_version != DFL_MIN_VERSION) {
1942*62c56f98SSadaf Ebrahimi         mbedtls_ssl_conf_min_tls_version(&conf, opt.min_version);
1943*62c56f98SSadaf Ebrahimi     }
1944*62c56f98SSadaf Ebrahimi 
1945*62c56f98SSadaf Ebrahimi     if (opt.max_version != DFL_MAX_VERSION) {
1946*62c56f98SSadaf Ebrahimi         mbedtls_ssl_conf_max_tls_version(&conf, opt.max_version);
1947*62c56f98SSadaf Ebrahimi     }
1948*62c56f98SSadaf Ebrahimi 
1949*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_EARLY_DATA)
1950*62c56f98SSadaf Ebrahimi     mbedtls_ssl_tls13_conf_early_data(&conf, opt.early_data);
1951*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_EARLY_DATA */
1952*62c56f98SSadaf Ebrahimi 
1953*62c56f98SSadaf Ebrahimi     if ((ret = mbedtls_ssl_setup(&ssl, &conf)) != 0) {
1954*62c56f98SSadaf Ebrahimi         mbedtls_printf(" failed\n  ! mbedtls_ssl_setup returned -0x%x\n\n",
1955*62c56f98SSadaf Ebrahimi                        (unsigned int) -ret);
1956*62c56f98SSadaf Ebrahimi         goto exit;
1957*62c56f98SSadaf Ebrahimi     }
1958*62c56f98SSadaf Ebrahimi 
1959*62c56f98SSadaf Ebrahimi     if (opt.eap_tls != 0) {
1960*62c56f98SSadaf Ebrahimi         mbedtls_ssl_set_export_keys_cb(&ssl, eap_tls_key_derivation,
1961*62c56f98SSadaf Ebrahimi                                        &eap_tls_keying);
1962*62c56f98SSadaf Ebrahimi     } else if (opt.nss_keylog != 0) {
1963*62c56f98SSadaf Ebrahimi         mbedtls_ssl_set_export_keys_cb(&ssl,
1964*62c56f98SSadaf Ebrahimi                                        nss_keylog_export,
1965*62c56f98SSadaf Ebrahimi                                        NULL);
1966*62c56f98SSadaf Ebrahimi     }
1967*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_SRTP)
1968*62c56f98SSadaf Ebrahimi     else if (opt.use_srtp != 0) {
1969*62c56f98SSadaf Ebrahimi         mbedtls_ssl_set_export_keys_cb(&ssl, dtls_srtp_key_derivation,
1970*62c56f98SSadaf Ebrahimi                                        &dtls_srtp_keying);
1971*62c56f98SSadaf Ebrahimi     }
1972*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_DTLS_SRTP */
1973*62c56f98SSadaf Ebrahimi 
1974*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
1975*62c56f98SSadaf Ebrahimi     if ((ret = mbedtls_ssl_set_hostname(&ssl, opt.server_name)) != 0) {
1976*62c56f98SSadaf Ebrahimi         mbedtls_printf(" failed\n  ! mbedtls_ssl_set_hostname returned %d\n\n",
1977*62c56f98SSadaf Ebrahimi                        ret);
1978*62c56f98SSadaf Ebrahimi         goto exit;
1979*62c56f98SSadaf Ebrahimi     }
1980*62c56f98SSadaf Ebrahimi #endif
1981*62c56f98SSadaf Ebrahimi 
1982*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
1983*62c56f98SSadaf Ebrahimi     if (opt.ecjpake_pw != DFL_ECJPAKE_PW) {
1984*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
1985*62c56f98SSadaf Ebrahimi         if (opt.ecjpake_pw_opaque != DFL_ECJPAKE_PW_OPAQUE) {
1986*62c56f98SSadaf Ebrahimi             psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
1987*62c56f98SSadaf Ebrahimi 
1988*62c56f98SSadaf Ebrahimi             psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_DERIVE);
1989*62c56f98SSadaf Ebrahimi             psa_set_key_algorithm(&attributes, PSA_ALG_JPAKE);
1990*62c56f98SSadaf Ebrahimi             psa_set_key_type(&attributes, PSA_KEY_TYPE_PASSWORD);
1991*62c56f98SSadaf Ebrahimi 
1992*62c56f98SSadaf Ebrahimi             status = psa_import_key(&attributes,
1993*62c56f98SSadaf Ebrahimi                                     (const unsigned char *) opt.ecjpake_pw,
1994*62c56f98SSadaf Ebrahimi                                     strlen(opt.ecjpake_pw),
1995*62c56f98SSadaf Ebrahimi                                     &ecjpake_pw_slot);
1996*62c56f98SSadaf Ebrahimi             if (status != PSA_SUCCESS) {
1997*62c56f98SSadaf Ebrahimi                 mbedtls_printf(" failed\n  ! psa_import_key returned %d\n\n",
1998*62c56f98SSadaf Ebrahimi                                status);
1999*62c56f98SSadaf Ebrahimi                 goto exit;
2000*62c56f98SSadaf Ebrahimi             }
2001*62c56f98SSadaf Ebrahimi             if ((ret = mbedtls_ssl_set_hs_ecjpake_password_opaque(&ssl,
2002*62c56f98SSadaf Ebrahimi                                                                   ecjpake_pw_slot)) != 0) {
2003*62c56f98SSadaf Ebrahimi                 mbedtls_printf(
2004*62c56f98SSadaf Ebrahimi                     " failed\n  ! mbedtls_ssl_set_hs_ecjpake_password_opaque returned %d\n\n",
2005*62c56f98SSadaf Ebrahimi                     ret);
2006*62c56f98SSadaf Ebrahimi                 goto exit;
2007*62c56f98SSadaf Ebrahimi             }
2008*62c56f98SSadaf Ebrahimi             mbedtls_printf("using opaque password\n");
2009*62c56f98SSadaf Ebrahimi         } else
2010*62c56f98SSadaf Ebrahimi #endif  /* MBEDTLS_USE_PSA_CRYPTO */
2011*62c56f98SSadaf Ebrahimi         {
2012*62c56f98SSadaf Ebrahimi             if ((ret = mbedtls_ssl_set_hs_ecjpake_password(&ssl,
2013*62c56f98SSadaf Ebrahimi                                                            (const unsigned char *) opt.ecjpake_pw,
2014*62c56f98SSadaf Ebrahimi                                                            strlen(opt.ecjpake_pw))) != 0) {
2015*62c56f98SSadaf Ebrahimi                 mbedtls_printf(" failed\n  ! mbedtls_ssl_set_hs_ecjpake_password returned %d\n\n",
2016*62c56f98SSadaf Ebrahimi                                ret);
2017*62c56f98SSadaf Ebrahimi                 goto exit;
2018*62c56f98SSadaf Ebrahimi             }
2019*62c56f98SSadaf Ebrahimi         }
2020*62c56f98SSadaf Ebrahimi     }
2021*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2022*62c56f98SSadaf Ebrahimi 
2023*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
2024*62c56f98SSadaf Ebrahimi     if (opt.context_crt_cb == 1) {
2025*62c56f98SSadaf Ebrahimi         mbedtls_ssl_set_verify(&ssl, my_verify, NULL);
2026*62c56f98SSadaf Ebrahimi     }
2027*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
2028*62c56f98SSadaf Ebrahimi 
2029*62c56f98SSadaf Ebrahimi     io_ctx.ssl = &ssl;
2030*62c56f98SSadaf Ebrahimi     io_ctx.net = &server_fd;
2031*62c56f98SSadaf Ebrahimi     mbedtls_ssl_set_bio(&ssl, &io_ctx, send_cb, recv_cb,
2032*62c56f98SSadaf Ebrahimi                         opt.nbio == 0 ? recv_timeout_cb : NULL);
2033*62c56f98SSadaf Ebrahimi 
2034*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
2035*62c56f98SSadaf Ebrahimi     if (opt.transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
2036*62c56f98SSadaf Ebrahimi         if ((ret = mbedtls_ssl_set_cid(&ssl, opt.cid_enabled,
2037*62c56f98SSadaf Ebrahimi                                        cid, cid_len)) != 0) {
2038*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! mbedtls_ssl_set_cid returned %d\n\n",
2039*62c56f98SSadaf Ebrahimi                            ret);
2040*62c56f98SSadaf Ebrahimi             goto exit;
2041*62c56f98SSadaf Ebrahimi         }
2042*62c56f98SSadaf Ebrahimi     }
2043*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
2044*62c56f98SSadaf Ebrahimi 
2045*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
2046*62c56f98SSadaf Ebrahimi     if (opt.dtls_mtu != DFL_DTLS_MTU) {
2047*62c56f98SSadaf Ebrahimi         mbedtls_ssl_set_mtu(&ssl, opt.dtls_mtu);
2048*62c56f98SSadaf Ebrahimi     }
2049*62c56f98SSadaf Ebrahimi #endif
2050*62c56f98SSadaf Ebrahimi 
2051*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_TIMING_C)
2052*62c56f98SSadaf Ebrahimi     mbedtls_ssl_set_timer_cb(&ssl, &timer, mbedtls_timing_set_delay,
2053*62c56f98SSadaf Ebrahimi                              mbedtls_timing_get_delay);
2054*62c56f98SSadaf Ebrahimi #endif
2055*62c56f98SSadaf Ebrahimi 
2056*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_RESTARTABLE)
2057*62c56f98SSadaf Ebrahimi     if (opt.ec_max_ops != DFL_EC_MAX_OPS) {
2058*62c56f98SSadaf Ebrahimi         mbedtls_ecp_set_max_ops(opt.ec_max_ops);
2059*62c56f98SSadaf Ebrahimi     }
2060*62c56f98SSadaf Ebrahimi #endif
2061*62c56f98SSadaf Ebrahimi 
2062*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_SRTP)
2063*62c56f98SSadaf Ebrahimi     if (opt.use_srtp != 0 && strlen(opt.mki) != 0) {
2064*62c56f98SSadaf Ebrahimi         if (mbedtls_test_unhexify(mki, sizeof(mki),
2065*62c56f98SSadaf Ebrahimi                                   opt.mki, &mki_len) != 0) {
2066*62c56f98SSadaf Ebrahimi             mbedtls_printf("mki value not valid hex\n");
2067*62c56f98SSadaf Ebrahimi             goto exit;
2068*62c56f98SSadaf Ebrahimi         }
2069*62c56f98SSadaf Ebrahimi 
2070*62c56f98SSadaf Ebrahimi         mbedtls_ssl_conf_srtp_mki_value_supported(&conf, MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED);
2071*62c56f98SSadaf Ebrahimi         if ((ret = mbedtls_ssl_dtls_srtp_set_mki_value(&ssl, mki,
2072*62c56f98SSadaf Ebrahimi                                                        (uint16_t) strlen(opt.mki) / 2)) != 0) {
2073*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! mbedtls_ssl_dtls_srtp_set_mki_value returned %d\n\n", ret);
2074*62c56f98SSadaf Ebrahimi             goto exit;
2075*62c56f98SSadaf Ebrahimi         }
2076*62c56f98SSadaf Ebrahimi     }
2077*62c56f98SSadaf Ebrahimi #endif
2078*62c56f98SSadaf Ebrahimi 
2079*62c56f98SSadaf Ebrahimi     mbedtls_printf(" ok\n");
2080*62c56f98SSadaf Ebrahimi 
2081*62c56f98SSadaf Ebrahimi     /*
2082*62c56f98SSadaf Ebrahimi      * 3. Start the connection
2083*62c56f98SSadaf Ebrahimi      */
2084*62c56f98SSadaf Ebrahimi     if (opt.server_addr == NULL) {
2085*62c56f98SSadaf Ebrahimi         opt.server_addr = opt.server_name;
2086*62c56f98SSadaf Ebrahimi     }
2087*62c56f98SSadaf Ebrahimi 
2088*62c56f98SSadaf Ebrahimi     mbedtls_printf("  . Connecting to %s/%s/%s...",
2089*62c56f98SSadaf Ebrahimi                    opt.transport == MBEDTLS_SSL_TRANSPORT_STREAM ? "tcp" : "udp",
2090*62c56f98SSadaf Ebrahimi                    opt.server_addr, opt.server_port);
2091*62c56f98SSadaf Ebrahimi     fflush(stdout);
2092*62c56f98SSadaf Ebrahimi 
2093*62c56f98SSadaf Ebrahimi     if ((ret = mbedtls_net_connect(&server_fd,
2094*62c56f98SSadaf Ebrahimi                                    opt.server_addr, opt.server_port,
2095*62c56f98SSadaf Ebrahimi                                    opt.transport == MBEDTLS_SSL_TRANSPORT_STREAM ?
2096*62c56f98SSadaf Ebrahimi                                    MBEDTLS_NET_PROTO_TCP : MBEDTLS_NET_PROTO_UDP)) != 0) {
2097*62c56f98SSadaf Ebrahimi         mbedtls_printf(" failed\n  ! mbedtls_net_connect returned -0x%x\n\n",
2098*62c56f98SSadaf Ebrahimi                        (unsigned int) -ret);
2099*62c56f98SSadaf Ebrahimi         goto exit;
2100*62c56f98SSadaf Ebrahimi     }
2101*62c56f98SSadaf Ebrahimi 
2102*62c56f98SSadaf Ebrahimi     if (opt.nbio > 0) {
2103*62c56f98SSadaf Ebrahimi         ret = mbedtls_net_set_nonblock(&server_fd);
2104*62c56f98SSadaf Ebrahimi     } else {
2105*62c56f98SSadaf Ebrahimi         ret = mbedtls_net_set_block(&server_fd);
2106*62c56f98SSadaf Ebrahimi     }
2107*62c56f98SSadaf Ebrahimi     if (ret != 0) {
2108*62c56f98SSadaf Ebrahimi         mbedtls_printf(" failed\n  ! net_set_(non)block() returned -0x%x\n\n",
2109*62c56f98SSadaf Ebrahimi                        (unsigned int) -ret);
2110*62c56f98SSadaf Ebrahimi         goto exit;
2111*62c56f98SSadaf Ebrahimi     }
2112*62c56f98SSadaf Ebrahimi 
2113*62c56f98SSadaf Ebrahimi     mbedtls_printf(" ok\n");
2114*62c56f98SSadaf Ebrahimi 
2115*62c56f98SSadaf Ebrahimi     /*
2116*62c56f98SSadaf Ebrahimi      * 4. Handshake
2117*62c56f98SSadaf Ebrahimi      */
2118*62c56f98SSadaf Ebrahimi     mbedtls_printf("  . Performing the SSL/TLS handshake...");
2119*62c56f98SSadaf Ebrahimi     fflush(stdout);
2120*62c56f98SSadaf Ebrahimi 
2121*62c56f98SSadaf Ebrahimi     while ((ret = mbedtls_ssl_handshake(&ssl)) != 0) {
2122*62c56f98SSadaf Ebrahimi         if (ret != MBEDTLS_ERR_SSL_WANT_READ &&
2123*62c56f98SSadaf Ebrahimi             ret != MBEDTLS_ERR_SSL_WANT_WRITE &&
2124*62c56f98SSadaf Ebrahimi             ret != MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS) {
2125*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! mbedtls_ssl_handshake returned -0x%x\n",
2126*62c56f98SSadaf Ebrahimi                            (unsigned int) -ret);
2127*62c56f98SSadaf Ebrahimi             if (ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED) {
2128*62c56f98SSadaf Ebrahimi                 mbedtls_printf(
2129*62c56f98SSadaf Ebrahimi                     "    Unable to verify the server's certificate. "
2130*62c56f98SSadaf Ebrahimi                     "Either it is invalid,\n"
2131*62c56f98SSadaf Ebrahimi                     "    or you didn't set ca_file or ca_path "
2132*62c56f98SSadaf Ebrahimi                     "to an appropriate value.\n"
2133*62c56f98SSadaf Ebrahimi                     "    Alternatively, you may want to use "
2134*62c56f98SSadaf Ebrahimi                     "auth_mode=optional for testing purposes if "
2135*62c56f98SSadaf Ebrahimi                     "not using TLS 1.3.\n"
2136*62c56f98SSadaf Ebrahimi                     "    For TLS 1.3 server, try `ca_path=/etc/ssl/certs/`"
2137*62c56f98SSadaf Ebrahimi                     "or other folder that has root certificates\n");
2138*62c56f98SSadaf Ebrahimi             }
2139*62c56f98SSadaf Ebrahimi             mbedtls_printf("\n");
2140*62c56f98SSadaf Ebrahimi             goto exit;
2141*62c56f98SSadaf Ebrahimi         }
2142*62c56f98SSadaf Ebrahimi 
2143*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_RESTARTABLE)
2144*62c56f98SSadaf Ebrahimi         if (ret == MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS) {
2145*62c56f98SSadaf Ebrahimi             continue;
2146*62c56f98SSadaf Ebrahimi         }
2147*62c56f98SSadaf Ebrahimi #endif
2148*62c56f98SSadaf Ebrahimi 
2149*62c56f98SSadaf Ebrahimi         /* For event-driven IO, wait for socket to become available */
2150*62c56f98SSadaf Ebrahimi         if (opt.event == 1 /* level triggered IO */) {
2151*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_TIMING_C)
2152*62c56f98SSadaf Ebrahimi             ret = idle(&server_fd, &timer, ret);
2153*62c56f98SSadaf Ebrahimi #else
2154*62c56f98SSadaf Ebrahimi             ret = idle(&server_fd, ret);
2155*62c56f98SSadaf Ebrahimi #endif
2156*62c56f98SSadaf Ebrahimi             if (ret != 0) {
2157*62c56f98SSadaf Ebrahimi                 goto exit;
2158*62c56f98SSadaf Ebrahimi             }
2159*62c56f98SSadaf Ebrahimi         }
2160*62c56f98SSadaf Ebrahimi     }
2161*62c56f98SSadaf Ebrahimi 
2162*62c56f98SSadaf Ebrahimi     {
2163*62c56f98SSadaf Ebrahimi         int suite_id = mbedtls_ssl_get_ciphersuite_id_from_ssl(&ssl);
2164*62c56f98SSadaf Ebrahimi         const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
2165*62c56f98SSadaf Ebrahimi         ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(suite_id);
2166*62c56f98SSadaf Ebrahimi 
2167*62c56f98SSadaf Ebrahimi         mbedtls_printf(" ok\n    [ Protocol is %s ]\n"
2168*62c56f98SSadaf Ebrahimi                        "    [ Ciphersuite is %s ]\n"
2169*62c56f98SSadaf Ebrahimi                        "    [ Key size is %u ]\n",
2170*62c56f98SSadaf Ebrahimi                        mbedtls_ssl_get_version(&ssl),
2171*62c56f98SSadaf Ebrahimi                        mbedtls_ssl_ciphersuite_get_name(ciphersuite_info),
2172*62c56f98SSadaf Ebrahimi                        (unsigned int)
2173*62c56f98SSadaf Ebrahimi                        mbedtls_ssl_ciphersuite_get_cipher_key_bitlen(ciphersuite_info));
2174*62c56f98SSadaf Ebrahimi     }
2175*62c56f98SSadaf Ebrahimi 
2176*62c56f98SSadaf Ebrahimi     if ((ret = mbedtls_ssl_get_record_expansion(&ssl)) >= 0) {
2177*62c56f98SSadaf Ebrahimi         mbedtls_printf("    [ Record expansion is %d ]\n", ret);
2178*62c56f98SSadaf Ebrahimi     } else {
2179*62c56f98SSadaf Ebrahimi         mbedtls_printf("    [ Record expansion is unknown ]\n");
2180*62c56f98SSadaf Ebrahimi     }
2181*62c56f98SSadaf Ebrahimi 
2182*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
2183*62c56f98SSadaf Ebrahimi     mbedtls_printf("    [ Maximum incoming record payload length is %u ]\n",
2184*62c56f98SSadaf Ebrahimi                    (unsigned int) mbedtls_ssl_get_max_in_record_payload(&ssl));
2185*62c56f98SSadaf Ebrahimi     mbedtls_printf("    [ Maximum outgoing record payload length is %u ]\n",
2186*62c56f98SSadaf Ebrahimi                    (unsigned int) mbedtls_ssl_get_max_out_record_payload(&ssl));
2187*62c56f98SSadaf Ebrahimi #endif
2188*62c56f98SSadaf Ebrahimi 
2189*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ALPN)
2190*62c56f98SSadaf Ebrahimi     if (opt.alpn_string != NULL) {
2191*62c56f98SSadaf Ebrahimi         const char *alp = mbedtls_ssl_get_alpn_protocol(&ssl);
2192*62c56f98SSadaf Ebrahimi         mbedtls_printf("    [ Application Layer Protocol is %s ]\n",
2193*62c56f98SSadaf Ebrahimi                        alp ? alp : "(none)");
2194*62c56f98SSadaf Ebrahimi     }
2195*62c56f98SSadaf Ebrahimi #endif
2196*62c56f98SSadaf Ebrahimi 
2197*62c56f98SSadaf Ebrahimi     if (opt.eap_tls != 0) {
2198*62c56f98SSadaf Ebrahimi         size_t j = 0;
2199*62c56f98SSadaf Ebrahimi 
2200*62c56f98SSadaf Ebrahimi         if ((ret = mbedtls_ssl_tls_prf(eap_tls_keying.tls_prf_type,
2201*62c56f98SSadaf Ebrahimi                                        eap_tls_keying.master_secret,
2202*62c56f98SSadaf Ebrahimi                                        sizeof(eap_tls_keying.master_secret),
2203*62c56f98SSadaf Ebrahimi                                        eap_tls_label,
2204*62c56f98SSadaf Ebrahimi                                        eap_tls_keying.randbytes,
2205*62c56f98SSadaf Ebrahimi                                        sizeof(eap_tls_keying.randbytes),
2206*62c56f98SSadaf Ebrahimi                                        eap_tls_keymaterial,
2207*62c56f98SSadaf Ebrahimi                                        sizeof(eap_tls_keymaterial)))
2208*62c56f98SSadaf Ebrahimi             != 0) {
2209*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! mbedtls_ssl_tls_prf returned -0x%x\n\n",
2210*62c56f98SSadaf Ebrahimi                            (unsigned int) -ret);
2211*62c56f98SSadaf Ebrahimi             goto exit;
2212*62c56f98SSadaf Ebrahimi         }
2213*62c56f98SSadaf Ebrahimi 
2214*62c56f98SSadaf Ebrahimi         mbedtls_printf("    EAP-TLS key material is:");
2215*62c56f98SSadaf Ebrahimi         for (j = 0; j < sizeof(eap_tls_keymaterial); j++) {
2216*62c56f98SSadaf Ebrahimi             if (j % 8 == 0) {
2217*62c56f98SSadaf Ebrahimi                 mbedtls_printf("\n    ");
2218*62c56f98SSadaf Ebrahimi             }
2219*62c56f98SSadaf Ebrahimi             mbedtls_printf("%02x ", eap_tls_keymaterial[j]);
2220*62c56f98SSadaf Ebrahimi         }
2221*62c56f98SSadaf Ebrahimi         mbedtls_printf("\n");
2222*62c56f98SSadaf Ebrahimi 
2223*62c56f98SSadaf Ebrahimi         if ((ret = mbedtls_ssl_tls_prf(eap_tls_keying.tls_prf_type, NULL, 0,
2224*62c56f98SSadaf Ebrahimi                                        eap_tls_label,
2225*62c56f98SSadaf Ebrahimi                                        eap_tls_keying.randbytes,
2226*62c56f98SSadaf Ebrahimi                                        sizeof(eap_tls_keying.randbytes),
2227*62c56f98SSadaf Ebrahimi                                        eap_tls_iv,
2228*62c56f98SSadaf Ebrahimi                                        sizeof(eap_tls_iv))) != 0) {
2229*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! mbedtls_ssl_tls_prf returned -0x%x\n\n",
2230*62c56f98SSadaf Ebrahimi                            (unsigned int) -ret);
2231*62c56f98SSadaf Ebrahimi             goto exit;
2232*62c56f98SSadaf Ebrahimi         }
2233*62c56f98SSadaf Ebrahimi 
2234*62c56f98SSadaf Ebrahimi         mbedtls_printf("    EAP-TLS IV is:");
2235*62c56f98SSadaf Ebrahimi         for (j = 0; j < sizeof(eap_tls_iv); j++) {
2236*62c56f98SSadaf Ebrahimi             if (j % 8 == 0) {
2237*62c56f98SSadaf Ebrahimi                 mbedtls_printf("\n    ");
2238*62c56f98SSadaf Ebrahimi             }
2239*62c56f98SSadaf Ebrahimi             mbedtls_printf("%02x ", eap_tls_iv[j]);
2240*62c56f98SSadaf Ebrahimi         }
2241*62c56f98SSadaf Ebrahimi         mbedtls_printf("\n");
2242*62c56f98SSadaf Ebrahimi     }
2243*62c56f98SSadaf Ebrahimi 
2244*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_SRTP)
2245*62c56f98SSadaf Ebrahimi     else if (opt.use_srtp != 0) {
2246*62c56f98SSadaf Ebrahimi         size_t j = 0;
2247*62c56f98SSadaf Ebrahimi         mbedtls_dtls_srtp_info dtls_srtp_negotiation_result;
2248*62c56f98SSadaf Ebrahimi         mbedtls_ssl_get_dtls_srtp_negotiation_result(&ssl, &dtls_srtp_negotiation_result);
2249*62c56f98SSadaf Ebrahimi 
2250*62c56f98SSadaf Ebrahimi         if (dtls_srtp_negotiation_result.chosen_dtls_srtp_profile
2251*62c56f98SSadaf Ebrahimi             == MBEDTLS_TLS_SRTP_UNSET) {
2252*62c56f98SSadaf Ebrahimi             mbedtls_printf("    Unable to negotiate "
2253*62c56f98SSadaf Ebrahimi                            "the use of DTLS-SRTP\n");
2254*62c56f98SSadaf Ebrahimi         } else {
2255*62c56f98SSadaf Ebrahimi             if ((ret = mbedtls_ssl_tls_prf(dtls_srtp_keying.tls_prf_type,
2256*62c56f98SSadaf Ebrahimi                                            dtls_srtp_keying.master_secret,
2257*62c56f98SSadaf Ebrahimi                                            sizeof(dtls_srtp_keying.master_secret),
2258*62c56f98SSadaf Ebrahimi                                            dtls_srtp_label,
2259*62c56f98SSadaf Ebrahimi                                            dtls_srtp_keying.randbytes,
2260*62c56f98SSadaf Ebrahimi                                            sizeof(dtls_srtp_keying.randbytes),
2261*62c56f98SSadaf Ebrahimi                                            dtls_srtp_key_material,
2262*62c56f98SSadaf Ebrahimi                                            sizeof(dtls_srtp_key_material)))
2263*62c56f98SSadaf Ebrahimi                 != 0) {
2264*62c56f98SSadaf Ebrahimi                 mbedtls_printf(" failed\n  ! mbedtls_ssl_tls_prf returned -0x%x\n\n",
2265*62c56f98SSadaf Ebrahimi                                (unsigned int) -ret);
2266*62c56f98SSadaf Ebrahimi                 goto exit;
2267*62c56f98SSadaf Ebrahimi             }
2268*62c56f98SSadaf Ebrahimi 
2269*62c56f98SSadaf Ebrahimi             mbedtls_printf("    DTLS-SRTP key material is:");
2270*62c56f98SSadaf Ebrahimi             for (j = 0; j < sizeof(dtls_srtp_key_material); j++) {
2271*62c56f98SSadaf Ebrahimi                 if (j % 8 == 0) {
2272*62c56f98SSadaf Ebrahimi                     mbedtls_printf("\n    ");
2273*62c56f98SSadaf Ebrahimi                 }
2274*62c56f98SSadaf Ebrahimi                 mbedtls_printf("%02x ", dtls_srtp_key_material[j]);
2275*62c56f98SSadaf Ebrahimi             }
2276*62c56f98SSadaf Ebrahimi             mbedtls_printf("\n");
2277*62c56f98SSadaf Ebrahimi 
2278*62c56f98SSadaf Ebrahimi             /* produce a less readable output used to perform automatic checks
2279*62c56f98SSadaf Ebrahimi              * - compare client and server output
2280*62c56f98SSadaf Ebrahimi              * - interop test with openssl which client produces this kind of output
2281*62c56f98SSadaf Ebrahimi              */
2282*62c56f98SSadaf Ebrahimi             mbedtls_printf("    Keying material: ");
2283*62c56f98SSadaf Ebrahimi             for (j = 0; j < sizeof(dtls_srtp_key_material); j++) {
2284*62c56f98SSadaf Ebrahimi                 mbedtls_printf("%02X", dtls_srtp_key_material[j]);
2285*62c56f98SSadaf Ebrahimi             }
2286*62c56f98SSadaf Ebrahimi             mbedtls_printf("\n");
2287*62c56f98SSadaf Ebrahimi 
2288*62c56f98SSadaf Ebrahimi             if (dtls_srtp_negotiation_result.mki_len > 0) {
2289*62c56f98SSadaf Ebrahimi                 mbedtls_printf("    DTLS-SRTP mki value: ");
2290*62c56f98SSadaf Ebrahimi                 for (j = 0; j < dtls_srtp_negotiation_result.mki_len; j++) {
2291*62c56f98SSadaf Ebrahimi                     mbedtls_printf("%02X", dtls_srtp_negotiation_result.mki_value[j]);
2292*62c56f98SSadaf Ebrahimi                 }
2293*62c56f98SSadaf Ebrahimi             } else {
2294*62c56f98SSadaf Ebrahimi                 mbedtls_printf("    DTLS-SRTP no mki value negotiated");
2295*62c56f98SSadaf Ebrahimi             }
2296*62c56f98SSadaf Ebrahimi             mbedtls_printf("\n");
2297*62c56f98SSadaf Ebrahimi         }
2298*62c56f98SSadaf Ebrahimi     }
2299*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_DTLS_SRTP */
2300*62c56f98SSadaf Ebrahimi     if (opt.reconnect != 0 && ssl.tls_version != MBEDTLS_SSL_VERSION_TLS1_3) {
2301*62c56f98SSadaf Ebrahimi         mbedtls_printf("  . Saving session for reuse...");
2302*62c56f98SSadaf Ebrahimi         fflush(stdout);
2303*62c56f98SSadaf Ebrahimi 
2304*62c56f98SSadaf Ebrahimi         if (opt.reco_mode == 1) {
2305*62c56f98SSadaf Ebrahimi             if ((ret = ssl_save_session_serialize(&ssl,
2306*62c56f98SSadaf Ebrahimi                                                   &session_data, &session_data_len)) != 0) {
2307*62c56f98SSadaf Ebrahimi                 mbedtls_printf(" failed\n  ! ssl_save_session_serialize returned -0x%04x\n\n",
2308*62c56f98SSadaf Ebrahimi                                (unsigned int) -ret);
2309*62c56f98SSadaf Ebrahimi                 goto exit;
2310*62c56f98SSadaf Ebrahimi             }
2311*62c56f98SSadaf Ebrahimi 
2312*62c56f98SSadaf Ebrahimi         } else {
2313*62c56f98SSadaf Ebrahimi             if ((ret = mbedtls_ssl_get_session(&ssl, &saved_session)) != 0) {
2314*62c56f98SSadaf Ebrahimi                 mbedtls_printf(" failed\n  ! mbedtls_ssl_get_session returned -0x%x\n\n",
2315*62c56f98SSadaf Ebrahimi                                (unsigned int) -ret);
2316*62c56f98SSadaf Ebrahimi                 goto exit;
2317*62c56f98SSadaf Ebrahimi             }
2318*62c56f98SSadaf Ebrahimi         }
2319*62c56f98SSadaf Ebrahimi 
2320*62c56f98SSadaf Ebrahimi         mbedtls_printf(" ok\n");
2321*62c56f98SSadaf Ebrahimi 
2322*62c56f98SSadaf Ebrahimi         if (opt.reco_mode == 1) {
2323*62c56f98SSadaf Ebrahimi             mbedtls_printf("    [ Saved %u bytes of session data]\n",
2324*62c56f98SSadaf Ebrahimi                            (unsigned) session_data_len);
2325*62c56f98SSadaf Ebrahimi         }
2326*62c56f98SSadaf Ebrahimi     }
2327*62c56f98SSadaf Ebrahimi 
2328*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
2329*62c56f98SSadaf Ebrahimi     /*
2330*62c56f98SSadaf Ebrahimi      * 5. Verify the server certificate
2331*62c56f98SSadaf Ebrahimi      */
2332*62c56f98SSadaf Ebrahimi     mbedtls_printf("  . Verifying peer X.509 certificate...");
2333*62c56f98SSadaf Ebrahimi 
2334*62c56f98SSadaf Ebrahimi     if ((flags = mbedtls_ssl_get_verify_result(&ssl)) != 0) {
2335*62c56f98SSadaf Ebrahimi         char vrfy_buf[512];
2336*62c56f98SSadaf Ebrahimi         mbedtls_printf(" failed\n");
2337*62c56f98SSadaf Ebrahimi 
2338*62c56f98SSadaf Ebrahimi         x509_crt_verify_info(vrfy_buf, sizeof(vrfy_buf),
2339*62c56f98SSadaf Ebrahimi                              "  ! ", flags);
2340*62c56f98SSadaf Ebrahimi 
2341*62c56f98SSadaf Ebrahimi         mbedtls_printf("%s\n", vrfy_buf);
2342*62c56f98SSadaf Ebrahimi     } else {
2343*62c56f98SSadaf Ebrahimi         mbedtls_printf(" ok\n");
2344*62c56f98SSadaf Ebrahimi     }
2345*62c56f98SSadaf Ebrahimi 
2346*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_X509_REMOVE_INFO)
2347*62c56f98SSadaf Ebrahimi     mbedtls_printf("  . Peer certificate information    ...\n");
2348*62c56f98SSadaf Ebrahimi     mbedtls_printf("%s\n", peer_crt_info);
2349*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_X509_REMOVE_INFO */
2350*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
2351*62c56f98SSadaf Ebrahimi 
2352*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
2353*62c56f98SSadaf Ebrahimi     ret = report_cid_usage(&ssl, "initial handshake");
2354*62c56f98SSadaf Ebrahimi     if (ret != 0) {
2355*62c56f98SSadaf Ebrahimi         goto exit;
2356*62c56f98SSadaf Ebrahimi     }
2357*62c56f98SSadaf Ebrahimi 
2358*62c56f98SSadaf Ebrahimi     if (opt.transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
2359*62c56f98SSadaf Ebrahimi         if ((ret = mbedtls_ssl_set_cid(&ssl, opt.cid_enabled_renego,
2360*62c56f98SSadaf Ebrahimi                                        cid_renego,
2361*62c56f98SSadaf Ebrahimi                                        cid_renego_len)) != 0) {
2362*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! mbedtls_ssl_set_cid returned %d\n\n",
2363*62c56f98SSadaf Ebrahimi                            ret);
2364*62c56f98SSadaf Ebrahimi             goto exit;
2365*62c56f98SSadaf Ebrahimi         }
2366*62c56f98SSadaf Ebrahimi     }
2367*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
2368*62c56f98SSadaf Ebrahimi 
2369*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_RENEGOTIATION)
2370*62c56f98SSadaf Ebrahimi     if (opt.renegotiate) {
2371*62c56f98SSadaf Ebrahimi         /*
2372*62c56f98SSadaf Ebrahimi          * Perform renegotiation (this must be done when the server is waiting
2373*62c56f98SSadaf Ebrahimi          * for input from our side).
2374*62c56f98SSadaf Ebrahimi          */
2375*62c56f98SSadaf Ebrahimi         mbedtls_printf("  . Performing renegotiation...");
2376*62c56f98SSadaf Ebrahimi         fflush(stdout);
2377*62c56f98SSadaf Ebrahimi         while ((ret = mbedtls_ssl_renegotiate(&ssl)) != 0) {
2378*62c56f98SSadaf Ebrahimi             if (ret != MBEDTLS_ERR_SSL_WANT_READ &&
2379*62c56f98SSadaf Ebrahimi                 ret != MBEDTLS_ERR_SSL_WANT_WRITE &&
2380*62c56f98SSadaf Ebrahimi                 ret != MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS) {
2381*62c56f98SSadaf Ebrahimi                 mbedtls_printf(" failed\n  ! mbedtls_ssl_renegotiate returned %d\n\n",
2382*62c56f98SSadaf Ebrahimi                                ret);
2383*62c56f98SSadaf Ebrahimi                 goto exit;
2384*62c56f98SSadaf Ebrahimi             }
2385*62c56f98SSadaf Ebrahimi 
2386*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_RESTARTABLE)
2387*62c56f98SSadaf Ebrahimi             if (ret == MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS) {
2388*62c56f98SSadaf Ebrahimi                 continue;
2389*62c56f98SSadaf Ebrahimi             }
2390*62c56f98SSadaf Ebrahimi #endif
2391*62c56f98SSadaf Ebrahimi 
2392*62c56f98SSadaf Ebrahimi             /* For event-driven IO, wait for socket to become available */
2393*62c56f98SSadaf Ebrahimi             if (opt.event == 1 /* level triggered IO */) {
2394*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_TIMING_C)
2395*62c56f98SSadaf Ebrahimi                 idle(&server_fd, &timer, ret);
2396*62c56f98SSadaf Ebrahimi #else
2397*62c56f98SSadaf Ebrahimi                 idle(&server_fd, ret);
2398*62c56f98SSadaf Ebrahimi #endif
2399*62c56f98SSadaf Ebrahimi             }
2400*62c56f98SSadaf Ebrahimi 
2401*62c56f98SSadaf Ebrahimi         }
2402*62c56f98SSadaf Ebrahimi         mbedtls_printf(" ok\n");
2403*62c56f98SSadaf Ebrahimi     }
2404*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_RENEGOTIATION */
2405*62c56f98SSadaf Ebrahimi 
2406*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
2407*62c56f98SSadaf Ebrahimi     ret = report_cid_usage(&ssl, "after renegotiation");
2408*62c56f98SSadaf Ebrahimi     if (ret != 0) {
2409*62c56f98SSadaf Ebrahimi         goto exit;
2410*62c56f98SSadaf Ebrahimi     }
2411*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
2412*62c56f98SSadaf Ebrahimi 
2413*62c56f98SSadaf Ebrahimi     /*
2414*62c56f98SSadaf Ebrahimi      * 6. Write the GET request
2415*62c56f98SSadaf Ebrahimi      */
2416*62c56f98SSadaf Ebrahimi     retry_left = opt.max_resend;
2417*62c56f98SSadaf Ebrahimi send_request:
2418*62c56f98SSadaf Ebrahimi     mbedtls_printf("  > Write to server:");
2419*62c56f98SSadaf Ebrahimi     fflush(stdout);
2420*62c56f98SSadaf Ebrahimi 
2421*62c56f98SSadaf Ebrahimi     len = mbedtls_snprintf((char *) buf, sizeof(buf) - 1, GET_REQUEST,
2422*62c56f98SSadaf Ebrahimi                            opt.request_page);
2423*62c56f98SSadaf Ebrahimi     tail_len = (int) strlen(GET_REQUEST_END);
2424*62c56f98SSadaf Ebrahimi 
2425*62c56f98SSadaf Ebrahimi     /* Add padding to GET request to reach opt.request_size in length */
2426*62c56f98SSadaf Ebrahimi     if (opt.request_size != DFL_REQUEST_SIZE &&
2427*62c56f98SSadaf Ebrahimi         len + tail_len < opt.request_size) {
2428*62c56f98SSadaf Ebrahimi         memset(buf + len, 'A', opt.request_size - len - tail_len);
2429*62c56f98SSadaf Ebrahimi         len += opt.request_size - len - tail_len;
2430*62c56f98SSadaf Ebrahimi     }
2431*62c56f98SSadaf Ebrahimi 
2432*62c56f98SSadaf Ebrahimi     strncpy((char *) buf + len, GET_REQUEST_END, sizeof(buf) - len - 1);
2433*62c56f98SSadaf Ebrahimi     len += tail_len;
2434*62c56f98SSadaf Ebrahimi 
2435*62c56f98SSadaf Ebrahimi     /* Truncate if request size is smaller than the "natural" size */
2436*62c56f98SSadaf Ebrahimi     if (opt.request_size != DFL_REQUEST_SIZE &&
2437*62c56f98SSadaf Ebrahimi         len > opt.request_size) {
2438*62c56f98SSadaf Ebrahimi         len = opt.request_size;
2439*62c56f98SSadaf Ebrahimi 
2440*62c56f98SSadaf Ebrahimi         /* Still end with \r\n unless that's really not possible */
2441*62c56f98SSadaf Ebrahimi         if (len >= 2) {
2442*62c56f98SSadaf Ebrahimi             buf[len - 2] = '\r';
2443*62c56f98SSadaf Ebrahimi         }
2444*62c56f98SSadaf Ebrahimi         if (len >= 1) {
2445*62c56f98SSadaf Ebrahimi             buf[len - 1] = '\n';
2446*62c56f98SSadaf Ebrahimi         }
2447*62c56f98SSadaf Ebrahimi     }
2448*62c56f98SSadaf Ebrahimi 
2449*62c56f98SSadaf Ebrahimi     if (opt.transport == MBEDTLS_SSL_TRANSPORT_STREAM) {
2450*62c56f98SSadaf Ebrahimi         written = 0;
2451*62c56f98SSadaf Ebrahimi         frags = 0;
2452*62c56f98SSadaf Ebrahimi 
2453*62c56f98SSadaf Ebrahimi         do {
2454*62c56f98SSadaf Ebrahimi             while ((ret = mbedtls_ssl_write(&ssl, buf + written,
2455*62c56f98SSadaf Ebrahimi                                             len - written)) < 0) {
2456*62c56f98SSadaf Ebrahimi                 if (ret != MBEDTLS_ERR_SSL_WANT_READ &&
2457*62c56f98SSadaf Ebrahimi                     ret != MBEDTLS_ERR_SSL_WANT_WRITE &&
2458*62c56f98SSadaf Ebrahimi                     ret != MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS) {
2459*62c56f98SSadaf Ebrahimi                     mbedtls_printf(" failed\n  ! mbedtls_ssl_write returned -0x%x\n\n",
2460*62c56f98SSadaf Ebrahimi                                    (unsigned int) -ret);
2461*62c56f98SSadaf Ebrahimi                     goto exit;
2462*62c56f98SSadaf Ebrahimi                 }
2463*62c56f98SSadaf Ebrahimi 
2464*62c56f98SSadaf Ebrahimi                 /* For event-driven IO, wait for socket to become available */
2465*62c56f98SSadaf Ebrahimi                 if (opt.event == 1 /* level triggered IO */) {
2466*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_TIMING_C)
2467*62c56f98SSadaf Ebrahimi                     idle(&server_fd, &timer, ret);
2468*62c56f98SSadaf Ebrahimi #else
2469*62c56f98SSadaf Ebrahimi                     idle(&server_fd, ret);
2470*62c56f98SSadaf Ebrahimi #endif
2471*62c56f98SSadaf Ebrahimi                 }
2472*62c56f98SSadaf Ebrahimi             }
2473*62c56f98SSadaf Ebrahimi 
2474*62c56f98SSadaf Ebrahimi             frags++;
2475*62c56f98SSadaf Ebrahimi             written += ret;
2476*62c56f98SSadaf Ebrahimi         } while (written < len);
2477*62c56f98SSadaf Ebrahimi     } else { /* Not stream, so datagram */
2478*62c56f98SSadaf Ebrahimi         while (1) {
2479*62c56f98SSadaf Ebrahimi             ret = mbedtls_ssl_write(&ssl, buf, len);
2480*62c56f98SSadaf Ebrahimi 
2481*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_RESTARTABLE)
2482*62c56f98SSadaf Ebrahimi             if (ret == MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS) {
2483*62c56f98SSadaf Ebrahimi                 continue;
2484*62c56f98SSadaf Ebrahimi             }
2485*62c56f98SSadaf Ebrahimi #endif
2486*62c56f98SSadaf Ebrahimi 
2487*62c56f98SSadaf Ebrahimi             if (ret != MBEDTLS_ERR_SSL_WANT_READ &&
2488*62c56f98SSadaf Ebrahimi                 ret != MBEDTLS_ERR_SSL_WANT_WRITE) {
2489*62c56f98SSadaf Ebrahimi                 break;
2490*62c56f98SSadaf Ebrahimi             }
2491*62c56f98SSadaf Ebrahimi 
2492*62c56f98SSadaf Ebrahimi             /* For event-driven IO, wait for socket to become available */
2493*62c56f98SSadaf Ebrahimi             if (opt.event == 1 /* level triggered IO */) {
2494*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_TIMING_C)
2495*62c56f98SSadaf Ebrahimi                 idle(&server_fd, &timer, ret);
2496*62c56f98SSadaf Ebrahimi #else
2497*62c56f98SSadaf Ebrahimi                 idle(&server_fd, ret);
2498*62c56f98SSadaf Ebrahimi #endif
2499*62c56f98SSadaf Ebrahimi             }
2500*62c56f98SSadaf Ebrahimi         }
2501*62c56f98SSadaf Ebrahimi 
2502*62c56f98SSadaf Ebrahimi         if (ret < 0) {
2503*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! mbedtls_ssl_write returned %d\n\n",
2504*62c56f98SSadaf Ebrahimi                            ret);
2505*62c56f98SSadaf Ebrahimi             goto exit;
2506*62c56f98SSadaf Ebrahimi         }
2507*62c56f98SSadaf Ebrahimi 
2508*62c56f98SSadaf Ebrahimi         frags = 1;
2509*62c56f98SSadaf Ebrahimi         written = ret;
2510*62c56f98SSadaf Ebrahimi 
2511*62c56f98SSadaf Ebrahimi         if (written < len) {
2512*62c56f98SSadaf Ebrahimi             mbedtls_printf(" warning\n  ! request didn't fit into single datagram and "
2513*62c56f98SSadaf Ebrahimi                            "was truncated to size %u", (unsigned) written);
2514*62c56f98SSadaf Ebrahimi         }
2515*62c56f98SSadaf Ebrahimi     }
2516*62c56f98SSadaf Ebrahimi 
2517*62c56f98SSadaf Ebrahimi     buf[written] = '\0';
2518*62c56f98SSadaf Ebrahimi     mbedtls_printf(" %d bytes written in %d fragments\n\n%s\n",
2519*62c56f98SSadaf Ebrahimi                    written, frags, (char *) buf);
2520*62c56f98SSadaf Ebrahimi 
2521*62c56f98SSadaf Ebrahimi     /* Send a non-empty request if request_size == 0 */
2522*62c56f98SSadaf Ebrahimi     if (len == 0) {
2523*62c56f98SSadaf Ebrahimi         opt.request_size = DFL_REQUEST_SIZE;
2524*62c56f98SSadaf Ebrahimi         goto send_request;
2525*62c56f98SSadaf Ebrahimi     }
2526*62c56f98SSadaf Ebrahimi 
2527*62c56f98SSadaf Ebrahimi     /*
2528*62c56f98SSadaf Ebrahimi      * 7. Read the HTTP response
2529*62c56f98SSadaf Ebrahimi      */
2530*62c56f98SSadaf Ebrahimi 
2531*62c56f98SSadaf Ebrahimi     /*
2532*62c56f98SSadaf Ebrahimi      * TLS and DTLS need different reading styles (stream vs datagram)
2533*62c56f98SSadaf Ebrahimi      */
2534*62c56f98SSadaf Ebrahimi     if (opt.transport == MBEDTLS_SSL_TRANSPORT_STREAM) {
2535*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3) && defined(MBEDTLS_SSL_SESSION_TICKETS)
2536*62c56f98SSadaf Ebrahimi         int ticket_id = 0;
2537*62c56f98SSadaf Ebrahimi #endif
2538*62c56f98SSadaf Ebrahimi         do {
2539*62c56f98SSadaf Ebrahimi             len = sizeof(buf) - 1;
2540*62c56f98SSadaf Ebrahimi             memset(buf, 0, sizeof(buf));
2541*62c56f98SSadaf Ebrahimi             ret = mbedtls_ssl_read(&ssl, buf, len);
2542*62c56f98SSadaf Ebrahimi 
2543*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_RESTARTABLE)
2544*62c56f98SSadaf Ebrahimi             if (ret == MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS) {
2545*62c56f98SSadaf Ebrahimi                 continue;
2546*62c56f98SSadaf Ebrahimi             }
2547*62c56f98SSadaf Ebrahimi #endif
2548*62c56f98SSadaf Ebrahimi 
2549*62c56f98SSadaf Ebrahimi             if (ret == MBEDTLS_ERR_SSL_WANT_READ ||
2550*62c56f98SSadaf Ebrahimi                 ret == MBEDTLS_ERR_SSL_WANT_WRITE) {
2551*62c56f98SSadaf Ebrahimi                 /* For event-driven IO, wait for socket to become available */
2552*62c56f98SSadaf Ebrahimi                 if (opt.event == 1 /* level triggered IO */) {
2553*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_TIMING_C)
2554*62c56f98SSadaf Ebrahimi                     idle(&server_fd, &timer, ret);
2555*62c56f98SSadaf Ebrahimi #else
2556*62c56f98SSadaf Ebrahimi                     idle(&server_fd, ret);
2557*62c56f98SSadaf Ebrahimi #endif
2558*62c56f98SSadaf Ebrahimi                 }
2559*62c56f98SSadaf Ebrahimi                 continue;
2560*62c56f98SSadaf Ebrahimi             }
2561*62c56f98SSadaf Ebrahimi 
2562*62c56f98SSadaf Ebrahimi             if (ret <= 0) {
2563*62c56f98SSadaf Ebrahimi                 switch (ret) {
2564*62c56f98SSadaf Ebrahimi                     case MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY:
2565*62c56f98SSadaf Ebrahimi                         mbedtls_printf(" connection was closed gracefully\n");
2566*62c56f98SSadaf Ebrahimi                         ret = 0;
2567*62c56f98SSadaf Ebrahimi                         goto close_notify;
2568*62c56f98SSadaf Ebrahimi 
2569*62c56f98SSadaf Ebrahimi                     case 0:
2570*62c56f98SSadaf Ebrahimi                     case MBEDTLS_ERR_NET_CONN_RESET:
2571*62c56f98SSadaf Ebrahimi                         mbedtls_printf(" connection was reset by peer\n");
2572*62c56f98SSadaf Ebrahimi                         ret = 0;
2573*62c56f98SSadaf Ebrahimi                         goto reconnect;
2574*62c56f98SSadaf Ebrahimi 
2575*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2576*62c56f98SSadaf Ebrahimi 
2577*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SESSION_TICKETS)
2578*62c56f98SSadaf Ebrahimi                     case MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET:
2579*62c56f98SSadaf Ebrahimi                         /* We were waiting for application data but got
2580*62c56f98SSadaf Ebrahimi                          * a NewSessionTicket instead. */
2581*62c56f98SSadaf Ebrahimi                         mbedtls_printf(" got new session ticket ( %d ).\n",
2582*62c56f98SSadaf Ebrahimi                                        ticket_id++);
2583*62c56f98SSadaf Ebrahimi                         if (opt.reconnect != 0) {
2584*62c56f98SSadaf Ebrahimi                             mbedtls_printf("  . Saving session for reuse...");
2585*62c56f98SSadaf Ebrahimi                             fflush(stdout);
2586*62c56f98SSadaf Ebrahimi 
2587*62c56f98SSadaf Ebrahimi                             if (opt.reco_mode == 1) {
2588*62c56f98SSadaf Ebrahimi                                 if ((ret = ssl_save_session_serialize(&ssl,
2589*62c56f98SSadaf Ebrahimi                                                                       &session_data,
2590*62c56f98SSadaf Ebrahimi                                                                       &session_data_len)) != 0) {
2591*62c56f98SSadaf Ebrahimi                                     mbedtls_printf(
2592*62c56f98SSadaf Ebrahimi                                         " failed\n  ! ssl_save_session_serialize returned -0x%04x\n\n",
2593*62c56f98SSadaf Ebrahimi                                         (unsigned int) -ret);
2594*62c56f98SSadaf Ebrahimi                                     goto exit;
2595*62c56f98SSadaf Ebrahimi                                 }
2596*62c56f98SSadaf Ebrahimi                             } else {
2597*62c56f98SSadaf Ebrahimi                                 if ((ret = mbedtls_ssl_get_session(&ssl, &saved_session)) != 0) {
2598*62c56f98SSadaf Ebrahimi                                     mbedtls_printf(
2599*62c56f98SSadaf Ebrahimi                                         " failed\n  ! mbedtls_ssl_get_session returned -0x%x\n\n",
2600*62c56f98SSadaf Ebrahimi                                         (unsigned int) -ret);
2601*62c56f98SSadaf Ebrahimi                                     goto exit;
2602*62c56f98SSadaf Ebrahimi                                 }
2603*62c56f98SSadaf Ebrahimi                             }
2604*62c56f98SSadaf Ebrahimi 
2605*62c56f98SSadaf Ebrahimi                             mbedtls_printf(" ok\n");
2606*62c56f98SSadaf Ebrahimi 
2607*62c56f98SSadaf Ebrahimi                             if (opt.reco_mode == 1) {
2608*62c56f98SSadaf Ebrahimi                                 mbedtls_printf("    [ Saved %u bytes of session data]\n",
2609*62c56f98SSadaf Ebrahimi                                                (unsigned) session_data_len);
2610*62c56f98SSadaf Ebrahimi                             }
2611*62c56f98SSadaf Ebrahimi                         }
2612*62c56f98SSadaf Ebrahimi                         continue;
2613*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SESSION_TICKETS */
2614*62c56f98SSadaf Ebrahimi 
2615*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
2616*62c56f98SSadaf Ebrahimi 
2617*62c56f98SSadaf Ebrahimi                     default:
2618*62c56f98SSadaf Ebrahimi                         mbedtls_printf(" mbedtls_ssl_read returned -0x%x\n",
2619*62c56f98SSadaf Ebrahimi                                        (unsigned int) -ret);
2620*62c56f98SSadaf Ebrahimi                         goto exit;
2621*62c56f98SSadaf Ebrahimi                 }
2622*62c56f98SSadaf Ebrahimi             }
2623*62c56f98SSadaf Ebrahimi 
2624*62c56f98SSadaf Ebrahimi             len = ret;
2625*62c56f98SSadaf Ebrahimi             buf[len] = '\0';
2626*62c56f98SSadaf Ebrahimi             mbedtls_printf("  < Read from server: %d bytes read\n\n%s", len, (char *) buf);
2627*62c56f98SSadaf Ebrahimi             fflush(stdout);
2628*62c56f98SSadaf Ebrahimi             /* End of message should be detected according to the syntax of the
2629*62c56f98SSadaf Ebrahimi              * application protocol (eg HTTP), just use a dummy test here. */
2630*62c56f98SSadaf Ebrahimi             if (ret > 0 && buf[len-1] == '\n') {
2631*62c56f98SSadaf Ebrahimi                 ret = 0;
2632*62c56f98SSadaf Ebrahimi                 break;
2633*62c56f98SSadaf Ebrahimi             }
2634*62c56f98SSadaf Ebrahimi         } while (1);
2635*62c56f98SSadaf Ebrahimi     } else { /* Not stream, so datagram */
2636*62c56f98SSadaf Ebrahimi         len = sizeof(buf) - 1;
2637*62c56f98SSadaf Ebrahimi         memset(buf, 0, sizeof(buf));
2638*62c56f98SSadaf Ebrahimi 
2639*62c56f98SSadaf Ebrahimi         while (1) {
2640*62c56f98SSadaf Ebrahimi             ret = mbedtls_ssl_read(&ssl, buf, len);
2641*62c56f98SSadaf Ebrahimi 
2642*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_RESTARTABLE)
2643*62c56f98SSadaf Ebrahimi             if (ret == MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS) {
2644*62c56f98SSadaf Ebrahimi                 continue;
2645*62c56f98SSadaf Ebrahimi             }
2646*62c56f98SSadaf Ebrahimi #endif
2647*62c56f98SSadaf Ebrahimi 
2648*62c56f98SSadaf Ebrahimi             if (ret != MBEDTLS_ERR_SSL_WANT_READ &&
2649*62c56f98SSadaf Ebrahimi                 ret != MBEDTLS_ERR_SSL_WANT_WRITE) {
2650*62c56f98SSadaf Ebrahimi                 break;
2651*62c56f98SSadaf Ebrahimi             }
2652*62c56f98SSadaf Ebrahimi 
2653*62c56f98SSadaf Ebrahimi             /* For event-driven IO, wait for socket to become available */
2654*62c56f98SSadaf Ebrahimi             if (opt.event == 1 /* level triggered IO */) {
2655*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_TIMING_C)
2656*62c56f98SSadaf Ebrahimi                 idle(&server_fd, &timer, ret);
2657*62c56f98SSadaf Ebrahimi #else
2658*62c56f98SSadaf Ebrahimi                 idle(&server_fd, ret);
2659*62c56f98SSadaf Ebrahimi #endif
2660*62c56f98SSadaf Ebrahimi             }
2661*62c56f98SSadaf Ebrahimi         }
2662*62c56f98SSadaf Ebrahimi 
2663*62c56f98SSadaf Ebrahimi         if (ret <= 0) {
2664*62c56f98SSadaf Ebrahimi             switch (ret) {
2665*62c56f98SSadaf Ebrahimi                 case MBEDTLS_ERR_SSL_TIMEOUT:
2666*62c56f98SSadaf Ebrahimi                     mbedtls_printf(" timeout\n");
2667*62c56f98SSadaf Ebrahimi                     if (retry_left-- > 0) {
2668*62c56f98SSadaf Ebrahimi                         goto send_request;
2669*62c56f98SSadaf Ebrahimi                     }
2670*62c56f98SSadaf Ebrahimi                     goto exit;
2671*62c56f98SSadaf Ebrahimi 
2672*62c56f98SSadaf Ebrahimi                 case MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY:
2673*62c56f98SSadaf Ebrahimi                     mbedtls_printf(" connection was closed gracefully\n");
2674*62c56f98SSadaf Ebrahimi                     ret = 0;
2675*62c56f98SSadaf Ebrahimi                     goto close_notify;
2676*62c56f98SSadaf Ebrahimi 
2677*62c56f98SSadaf Ebrahimi                 default:
2678*62c56f98SSadaf Ebrahimi                     mbedtls_printf(" mbedtls_ssl_read returned -0x%x\n", (unsigned int) -ret);
2679*62c56f98SSadaf Ebrahimi                     goto exit;
2680*62c56f98SSadaf Ebrahimi             }
2681*62c56f98SSadaf Ebrahimi         }
2682*62c56f98SSadaf Ebrahimi 
2683*62c56f98SSadaf Ebrahimi         len = ret;
2684*62c56f98SSadaf Ebrahimi         buf[len] = '\0';
2685*62c56f98SSadaf Ebrahimi         mbedtls_printf("  < Read from server: %d bytes read\n\n%s", len, (char *) buf);
2686*62c56f98SSadaf Ebrahimi         ret = 0;
2687*62c56f98SSadaf Ebrahimi     }
2688*62c56f98SSadaf Ebrahimi 
2689*62c56f98SSadaf Ebrahimi     /*
2690*62c56f98SSadaf Ebrahimi      * 7b. Simulate hard reset and reconnect from same port?
2691*62c56f98SSadaf Ebrahimi      */
2692*62c56f98SSadaf Ebrahimi     if (opt.reconnect_hard != 0) {
2693*62c56f98SSadaf Ebrahimi         opt.reconnect_hard = 0;
2694*62c56f98SSadaf Ebrahimi 
2695*62c56f98SSadaf Ebrahimi         mbedtls_printf("  . Restarting connection from same port...");
2696*62c56f98SSadaf Ebrahimi         fflush(stdout);
2697*62c56f98SSadaf Ebrahimi 
2698*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
2699*62c56f98SSadaf Ebrahimi         memset(peer_crt_info, 0, sizeof(peer_crt_info));
2700*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
2701*62c56f98SSadaf Ebrahimi 
2702*62c56f98SSadaf Ebrahimi         if ((ret = mbedtls_ssl_session_reset(&ssl)) != 0) {
2703*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! mbedtls_ssl_session_reset returned -0x%x\n\n",
2704*62c56f98SSadaf Ebrahimi                            (unsigned int) -ret);
2705*62c56f98SSadaf Ebrahimi             goto exit;
2706*62c56f98SSadaf Ebrahimi         }
2707*62c56f98SSadaf Ebrahimi 
2708*62c56f98SSadaf Ebrahimi         while ((ret = mbedtls_ssl_handshake(&ssl)) != 0) {
2709*62c56f98SSadaf Ebrahimi             if (ret != MBEDTLS_ERR_SSL_WANT_READ &&
2710*62c56f98SSadaf Ebrahimi                 ret != MBEDTLS_ERR_SSL_WANT_WRITE &&
2711*62c56f98SSadaf Ebrahimi                 ret != MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS) {
2712*62c56f98SSadaf Ebrahimi                 mbedtls_printf(" failed\n  ! mbedtls_ssl_handshake returned -0x%x\n\n",
2713*62c56f98SSadaf Ebrahimi                                (unsigned int) -ret);
2714*62c56f98SSadaf Ebrahimi                 goto exit;
2715*62c56f98SSadaf Ebrahimi             }
2716*62c56f98SSadaf Ebrahimi 
2717*62c56f98SSadaf Ebrahimi             /* For event-driven IO, wait for socket to become available */
2718*62c56f98SSadaf Ebrahimi             if (opt.event == 1 /* level triggered IO */) {
2719*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_TIMING_C)
2720*62c56f98SSadaf Ebrahimi                 idle(&server_fd, &timer, ret);
2721*62c56f98SSadaf Ebrahimi #else
2722*62c56f98SSadaf Ebrahimi                 idle(&server_fd, ret);
2723*62c56f98SSadaf Ebrahimi #endif
2724*62c56f98SSadaf Ebrahimi             }
2725*62c56f98SSadaf Ebrahimi         }
2726*62c56f98SSadaf Ebrahimi 
2727*62c56f98SSadaf Ebrahimi         mbedtls_printf(" ok\n");
2728*62c56f98SSadaf Ebrahimi 
2729*62c56f98SSadaf Ebrahimi         goto send_request;
2730*62c56f98SSadaf Ebrahimi     }
2731*62c56f98SSadaf Ebrahimi 
2732*62c56f98SSadaf Ebrahimi     /*
2733*62c56f98SSadaf Ebrahimi      * 7c. Simulate serialize/deserialize and go back to data exchange
2734*62c56f98SSadaf Ebrahimi      */
2735*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
2736*62c56f98SSadaf Ebrahimi     if (opt.serialize != 0) {
2737*62c56f98SSadaf Ebrahimi         size_t buf_len;
2738*62c56f98SSadaf Ebrahimi 
2739*62c56f98SSadaf Ebrahimi         mbedtls_printf("  . Serializing live connection...");
2740*62c56f98SSadaf Ebrahimi 
2741*62c56f98SSadaf Ebrahimi         ret = mbedtls_ssl_context_save(&ssl, NULL, 0, &buf_len);
2742*62c56f98SSadaf Ebrahimi         if (ret != MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL) {
2743*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! mbedtls_ssl_context_save returned "
2744*62c56f98SSadaf Ebrahimi                            "-0x%x\n\n", (unsigned int) -ret);
2745*62c56f98SSadaf Ebrahimi 
2746*62c56f98SSadaf Ebrahimi             goto exit;
2747*62c56f98SSadaf Ebrahimi         }
2748*62c56f98SSadaf Ebrahimi 
2749*62c56f98SSadaf Ebrahimi         if ((context_buf = mbedtls_calloc(1, buf_len)) == NULL) {
2750*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! Couldn't allocate buffer for "
2751*62c56f98SSadaf Ebrahimi                            "serialized context");
2752*62c56f98SSadaf Ebrahimi 
2753*62c56f98SSadaf Ebrahimi             goto exit;
2754*62c56f98SSadaf Ebrahimi         }
2755*62c56f98SSadaf Ebrahimi         context_buf_len = buf_len;
2756*62c56f98SSadaf Ebrahimi 
2757*62c56f98SSadaf Ebrahimi         if ((ret = mbedtls_ssl_context_save(&ssl, context_buf,
2758*62c56f98SSadaf Ebrahimi                                             buf_len, &buf_len)) != 0) {
2759*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! mbedtls_ssl_context_save returned "
2760*62c56f98SSadaf Ebrahimi                            "-0x%x\n\n", (unsigned int) -ret);
2761*62c56f98SSadaf Ebrahimi 
2762*62c56f98SSadaf Ebrahimi             goto exit;
2763*62c56f98SSadaf Ebrahimi         }
2764*62c56f98SSadaf Ebrahimi 
2765*62c56f98SSadaf Ebrahimi         mbedtls_printf(" ok\n");
2766*62c56f98SSadaf Ebrahimi 
2767*62c56f98SSadaf Ebrahimi         /* Save serialized context to the 'opt.context_file' as a base64 code */
2768*62c56f98SSadaf Ebrahimi         if (0 < strlen(opt.context_file)) {
2769*62c56f98SSadaf Ebrahimi             FILE *b64_file;
2770*62c56f98SSadaf Ebrahimi             uint8_t *b64_buf;
2771*62c56f98SSadaf Ebrahimi             size_t b64_len;
2772*62c56f98SSadaf Ebrahimi 
2773*62c56f98SSadaf Ebrahimi             mbedtls_printf("  . Save serialized context to a file... ");
2774*62c56f98SSadaf Ebrahimi 
2775*62c56f98SSadaf Ebrahimi             mbedtls_base64_encode(NULL, 0, &b64_len, context_buf, buf_len);
2776*62c56f98SSadaf Ebrahimi 
2777*62c56f98SSadaf Ebrahimi             if ((b64_buf = mbedtls_calloc(1, b64_len)) == NULL) {
2778*62c56f98SSadaf Ebrahimi                 mbedtls_printf("failed\n  ! Couldn't allocate buffer for "
2779*62c56f98SSadaf Ebrahimi                                "the base64 code\n");
2780*62c56f98SSadaf Ebrahimi                 goto exit;
2781*62c56f98SSadaf Ebrahimi             }
2782*62c56f98SSadaf Ebrahimi 
2783*62c56f98SSadaf Ebrahimi             if ((ret = mbedtls_base64_encode(b64_buf, b64_len, &b64_len,
2784*62c56f98SSadaf Ebrahimi                                              context_buf, buf_len)) != 0) {
2785*62c56f98SSadaf Ebrahimi                 mbedtls_printf("failed\n  ! mbedtls_base64_encode returned "
2786*62c56f98SSadaf Ebrahimi                                "-0x%x\n", (unsigned int) -ret);
2787*62c56f98SSadaf Ebrahimi                 mbedtls_free(b64_buf);
2788*62c56f98SSadaf Ebrahimi                 goto exit;
2789*62c56f98SSadaf Ebrahimi             }
2790*62c56f98SSadaf Ebrahimi 
2791*62c56f98SSadaf Ebrahimi             if ((b64_file = fopen(opt.context_file, "w")) == NULL) {
2792*62c56f98SSadaf Ebrahimi                 mbedtls_printf("failed\n  ! Cannot open '%s' for writing.\n",
2793*62c56f98SSadaf Ebrahimi                                opt.context_file);
2794*62c56f98SSadaf Ebrahimi                 mbedtls_free(b64_buf);
2795*62c56f98SSadaf Ebrahimi                 goto exit;
2796*62c56f98SSadaf Ebrahimi             }
2797*62c56f98SSadaf Ebrahimi 
2798*62c56f98SSadaf Ebrahimi             if (b64_len != fwrite(b64_buf, 1, b64_len, b64_file)) {
2799*62c56f98SSadaf Ebrahimi                 mbedtls_printf("failed\n  ! fwrite(%ld bytes) failed\n",
2800*62c56f98SSadaf Ebrahimi                                (long) b64_len);
2801*62c56f98SSadaf Ebrahimi                 mbedtls_free(b64_buf);
2802*62c56f98SSadaf Ebrahimi                 fclose(b64_file);
2803*62c56f98SSadaf Ebrahimi                 goto exit;
2804*62c56f98SSadaf Ebrahimi             }
2805*62c56f98SSadaf Ebrahimi 
2806*62c56f98SSadaf Ebrahimi             mbedtls_free(b64_buf);
2807*62c56f98SSadaf Ebrahimi             fclose(b64_file);
2808*62c56f98SSadaf Ebrahimi 
2809*62c56f98SSadaf Ebrahimi             mbedtls_printf("ok\n");
2810*62c56f98SSadaf Ebrahimi         }
2811*62c56f98SSadaf Ebrahimi 
2812*62c56f98SSadaf Ebrahimi         if (opt.serialize == 1) {
2813*62c56f98SSadaf Ebrahimi             /* nothing to do here, done by context_save() already */
2814*62c56f98SSadaf Ebrahimi             mbedtls_printf("  . Context has been reset... ok\n");
2815*62c56f98SSadaf Ebrahimi         }
2816*62c56f98SSadaf Ebrahimi 
2817*62c56f98SSadaf Ebrahimi         if (opt.serialize == 2) {
2818*62c56f98SSadaf Ebrahimi             mbedtls_printf("  . Freeing and reinitializing context...");
2819*62c56f98SSadaf Ebrahimi 
2820*62c56f98SSadaf Ebrahimi             mbedtls_ssl_free(&ssl);
2821*62c56f98SSadaf Ebrahimi 
2822*62c56f98SSadaf Ebrahimi             mbedtls_ssl_init(&ssl);
2823*62c56f98SSadaf Ebrahimi 
2824*62c56f98SSadaf Ebrahimi             if ((ret = mbedtls_ssl_setup(&ssl, &conf)) != 0) {
2825*62c56f98SSadaf Ebrahimi                 mbedtls_printf(" failed\n  ! mbedtls_ssl_setup returned "
2826*62c56f98SSadaf Ebrahimi                                "-0x%x\n\n", (unsigned int) -ret);
2827*62c56f98SSadaf Ebrahimi                 goto exit;
2828*62c56f98SSadaf Ebrahimi             }
2829*62c56f98SSadaf Ebrahimi 
2830*62c56f98SSadaf Ebrahimi             if (opt.nbio == 2) {
2831*62c56f98SSadaf Ebrahimi                 mbedtls_ssl_set_bio(&ssl, &server_fd, delayed_send,
2832*62c56f98SSadaf Ebrahimi                                     delayed_recv, NULL);
2833*62c56f98SSadaf Ebrahimi             } else {
2834*62c56f98SSadaf Ebrahimi                 mbedtls_ssl_set_bio(&ssl, &server_fd, mbedtls_net_send,
2835*62c56f98SSadaf Ebrahimi                                     mbedtls_net_recv,
2836*62c56f98SSadaf Ebrahimi                                     opt.nbio == 0 ? mbedtls_net_recv_timeout : NULL);
2837*62c56f98SSadaf Ebrahimi             }
2838*62c56f98SSadaf Ebrahimi 
2839*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_TIMING_C)
2840*62c56f98SSadaf Ebrahimi             mbedtls_ssl_set_timer_cb(&ssl, &timer,
2841*62c56f98SSadaf Ebrahimi                                      mbedtls_timing_set_delay,
2842*62c56f98SSadaf Ebrahimi                                      mbedtls_timing_get_delay);
2843*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_TIMING_C */
2844*62c56f98SSadaf Ebrahimi 
2845*62c56f98SSadaf Ebrahimi             mbedtls_printf(" ok\n");
2846*62c56f98SSadaf Ebrahimi         }
2847*62c56f98SSadaf Ebrahimi 
2848*62c56f98SSadaf Ebrahimi         mbedtls_printf("  . Deserializing connection...");
2849*62c56f98SSadaf Ebrahimi 
2850*62c56f98SSadaf Ebrahimi         if ((ret = mbedtls_ssl_context_load(&ssl, context_buf,
2851*62c56f98SSadaf Ebrahimi                                             buf_len)) != 0) {
2852*62c56f98SSadaf Ebrahimi             mbedtls_printf("failed\n  ! mbedtls_ssl_context_load returned "
2853*62c56f98SSadaf Ebrahimi                            "-0x%x\n\n", (unsigned int) -ret);
2854*62c56f98SSadaf Ebrahimi 
2855*62c56f98SSadaf Ebrahimi             goto exit;
2856*62c56f98SSadaf Ebrahimi         }
2857*62c56f98SSadaf Ebrahimi 
2858*62c56f98SSadaf Ebrahimi         mbedtls_free(context_buf);
2859*62c56f98SSadaf Ebrahimi         context_buf = NULL;
2860*62c56f98SSadaf Ebrahimi         context_buf_len = 0;
2861*62c56f98SSadaf Ebrahimi 
2862*62c56f98SSadaf Ebrahimi         mbedtls_printf(" ok\n");
2863*62c56f98SSadaf Ebrahimi     }
2864*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */
2865*62c56f98SSadaf Ebrahimi 
2866*62c56f98SSadaf Ebrahimi     /*
2867*62c56f98SSadaf Ebrahimi      * 7d. Continue doing data exchanges?
2868*62c56f98SSadaf Ebrahimi      */
2869*62c56f98SSadaf Ebrahimi     if (--opt.exchanges > 0) {
2870*62c56f98SSadaf Ebrahimi         goto send_request;
2871*62c56f98SSadaf Ebrahimi     }
2872*62c56f98SSadaf Ebrahimi 
2873*62c56f98SSadaf Ebrahimi     /*
2874*62c56f98SSadaf Ebrahimi      * 8. Done, cleanly close the connection
2875*62c56f98SSadaf Ebrahimi      */
2876*62c56f98SSadaf Ebrahimi close_notify:
2877*62c56f98SSadaf Ebrahimi     mbedtls_printf("  . Closing the connection...");
2878*62c56f98SSadaf Ebrahimi     fflush(stdout);
2879*62c56f98SSadaf Ebrahimi 
2880*62c56f98SSadaf Ebrahimi     /*
2881*62c56f98SSadaf Ebrahimi      * Most of the time sending a close_notify before closing is the right
2882*62c56f98SSadaf Ebrahimi      * thing to do. However, when the server already knows how many messages
2883*62c56f98SSadaf Ebrahimi      * are expected and closes the connection by itself, this alert becomes
2884*62c56f98SSadaf Ebrahimi      * redundant. Sometimes with DTLS this redundancy becomes a problem by
2885*62c56f98SSadaf Ebrahimi      * leading to a race condition where the server might close the connection
2886*62c56f98SSadaf Ebrahimi      * before seeing the alert, and since UDP is connection-less when the
2887*62c56f98SSadaf Ebrahimi      * alert arrives it will be seen as a new connection, which will fail as
2888*62c56f98SSadaf Ebrahimi      * the alert is clearly not a valid ClientHello. This may cause spurious
2889*62c56f98SSadaf Ebrahimi      * failures in tests that use DTLS and resumption with ssl_server2 in
2890*62c56f98SSadaf Ebrahimi      * ssl-opt.sh, avoided by enabling skip_close_notify client-side.
2891*62c56f98SSadaf Ebrahimi      */
2892*62c56f98SSadaf Ebrahimi     if (opt.skip_close_notify == 0) {
2893*62c56f98SSadaf Ebrahimi         /* No error checking, the connection might be closed already */
2894*62c56f98SSadaf Ebrahimi         do {
2895*62c56f98SSadaf Ebrahimi             ret = mbedtls_ssl_close_notify(&ssl);
2896*62c56f98SSadaf Ebrahimi         } while (ret == MBEDTLS_ERR_SSL_WANT_WRITE);
2897*62c56f98SSadaf Ebrahimi         ret = 0;
2898*62c56f98SSadaf Ebrahimi     }
2899*62c56f98SSadaf Ebrahimi 
2900*62c56f98SSadaf Ebrahimi     mbedtls_printf(" done\n");
2901*62c56f98SSadaf Ebrahimi 
2902*62c56f98SSadaf Ebrahimi     /*
2903*62c56f98SSadaf Ebrahimi      * 9. Reconnect?
2904*62c56f98SSadaf Ebrahimi      */
2905*62c56f98SSadaf Ebrahimi reconnect:
2906*62c56f98SSadaf Ebrahimi     if (opt.reconnect != 0) {
2907*62c56f98SSadaf Ebrahimi         --opt.reconnect;
2908*62c56f98SSadaf Ebrahimi 
2909*62c56f98SSadaf Ebrahimi         mbedtls_net_free(&server_fd);
2910*62c56f98SSadaf Ebrahimi 
2911*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_TIMING_C)
2912*62c56f98SSadaf Ebrahimi         if (opt.reco_delay > 0) {
2913*62c56f98SSadaf Ebrahimi             mbedtls_net_usleep(1000 * opt.reco_delay);
2914*62c56f98SSadaf Ebrahimi         }
2915*62c56f98SSadaf Ebrahimi #endif
2916*62c56f98SSadaf Ebrahimi 
2917*62c56f98SSadaf Ebrahimi         mbedtls_printf("  . Reconnecting with saved session...");
2918*62c56f98SSadaf Ebrahimi 
2919*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
2920*62c56f98SSadaf Ebrahimi         memset(peer_crt_info, 0, sizeof(peer_crt_info));
2921*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
2922*62c56f98SSadaf Ebrahimi 
2923*62c56f98SSadaf Ebrahimi         if ((ret = mbedtls_ssl_session_reset(&ssl)) != 0) {
2924*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! mbedtls_ssl_session_reset returned -0x%x\n\n",
2925*62c56f98SSadaf Ebrahimi                            (unsigned int) -ret);
2926*62c56f98SSadaf Ebrahimi             goto exit;
2927*62c56f98SSadaf Ebrahimi         }
2928*62c56f98SSadaf Ebrahimi 
2929*62c56f98SSadaf Ebrahimi         if (opt.reco_mode == 1) {
2930*62c56f98SSadaf Ebrahimi             if ((ret = mbedtls_ssl_session_load(&saved_session,
2931*62c56f98SSadaf Ebrahimi                                                 session_data,
2932*62c56f98SSadaf Ebrahimi                                                 session_data_len)) != 0) {
2933*62c56f98SSadaf Ebrahimi                 mbedtls_printf(" failed\n  ! mbedtls_ssl_session_load returned -0x%x\n\n",
2934*62c56f98SSadaf Ebrahimi                                (unsigned int) -ret);
2935*62c56f98SSadaf Ebrahimi                 goto exit;
2936*62c56f98SSadaf Ebrahimi             }
2937*62c56f98SSadaf Ebrahimi         }
2938*62c56f98SSadaf Ebrahimi 
2939*62c56f98SSadaf Ebrahimi         if ((ret = mbedtls_ssl_set_session(&ssl, &saved_session)) != 0) {
2940*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! mbedtls_ssl_set_session returned -0x%x\n\n",
2941*62c56f98SSadaf Ebrahimi                            (unsigned int) -ret);
2942*62c56f98SSadaf Ebrahimi             goto exit;
2943*62c56f98SSadaf Ebrahimi         }
2944*62c56f98SSadaf Ebrahimi 
2945*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C)
2946*62c56f98SSadaf Ebrahimi         if (opt.reco_server_name != NULL &&
2947*62c56f98SSadaf Ebrahimi             (ret = mbedtls_ssl_set_hostname(&ssl,
2948*62c56f98SSadaf Ebrahimi                                             opt.reco_server_name)) != 0) {
2949*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! mbedtls_ssl_set_hostname returned %d\n\n",
2950*62c56f98SSadaf Ebrahimi                            ret);
2951*62c56f98SSadaf Ebrahimi             goto exit;
2952*62c56f98SSadaf Ebrahimi         }
2953*62c56f98SSadaf Ebrahimi #endif
2954*62c56f98SSadaf Ebrahimi 
2955*62c56f98SSadaf Ebrahimi         if ((ret = mbedtls_net_connect(&server_fd,
2956*62c56f98SSadaf Ebrahimi                                        opt.server_addr, opt.server_port,
2957*62c56f98SSadaf Ebrahimi                                        opt.transport == MBEDTLS_SSL_TRANSPORT_STREAM ?
2958*62c56f98SSadaf Ebrahimi                                        MBEDTLS_NET_PROTO_TCP : MBEDTLS_NET_PROTO_UDP)) != 0) {
2959*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! mbedtls_net_connect returned -0x%x\n\n",
2960*62c56f98SSadaf Ebrahimi                            (unsigned int) -ret);
2961*62c56f98SSadaf Ebrahimi             goto exit;
2962*62c56f98SSadaf Ebrahimi         }
2963*62c56f98SSadaf Ebrahimi 
2964*62c56f98SSadaf Ebrahimi         if (opt.nbio > 0) {
2965*62c56f98SSadaf Ebrahimi             ret = mbedtls_net_set_nonblock(&server_fd);
2966*62c56f98SSadaf Ebrahimi         } else {
2967*62c56f98SSadaf Ebrahimi             ret = mbedtls_net_set_block(&server_fd);
2968*62c56f98SSadaf Ebrahimi         }
2969*62c56f98SSadaf Ebrahimi         if (ret != 0) {
2970*62c56f98SSadaf Ebrahimi             mbedtls_printf(" failed\n  ! net_set_(non)block() returned -0x%x\n\n",
2971*62c56f98SSadaf Ebrahimi                            (unsigned int) -ret);
2972*62c56f98SSadaf Ebrahimi             goto exit;
2973*62c56f98SSadaf Ebrahimi         }
2974*62c56f98SSadaf Ebrahimi 
2975*62c56f98SSadaf Ebrahimi         while ((ret = mbedtls_ssl_handshake(&ssl)) != 0) {
2976*62c56f98SSadaf Ebrahimi             if (ret != MBEDTLS_ERR_SSL_WANT_READ &&
2977*62c56f98SSadaf Ebrahimi                 ret != MBEDTLS_ERR_SSL_WANT_WRITE &&
2978*62c56f98SSadaf Ebrahimi                 ret != MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS) {
2979*62c56f98SSadaf Ebrahimi                 mbedtls_printf(" failed\n  ! mbedtls_ssl_handshake returned -0x%x\n\n",
2980*62c56f98SSadaf Ebrahimi                                (unsigned int) -ret);
2981*62c56f98SSadaf Ebrahimi                 goto exit;
2982*62c56f98SSadaf Ebrahimi             }
2983*62c56f98SSadaf Ebrahimi         }
2984*62c56f98SSadaf Ebrahimi 
2985*62c56f98SSadaf Ebrahimi         mbedtls_printf(" ok\n");
2986*62c56f98SSadaf Ebrahimi 
2987*62c56f98SSadaf Ebrahimi         goto send_request;
2988*62c56f98SSadaf Ebrahimi     }
2989*62c56f98SSadaf Ebrahimi 
2990*62c56f98SSadaf Ebrahimi     /*
2991*62c56f98SSadaf Ebrahimi      * Cleanup and exit
2992*62c56f98SSadaf Ebrahimi      */
2993*62c56f98SSadaf Ebrahimi exit:
2994*62c56f98SSadaf Ebrahimi #ifdef MBEDTLS_ERROR_C
2995*62c56f98SSadaf Ebrahimi     if (ret != 0) {
2996*62c56f98SSadaf Ebrahimi         char error_buf[100];
2997*62c56f98SSadaf Ebrahimi         mbedtls_strerror(ret, error_buf, 100);
2998*62c56f98SSadaf Ebrahimi         mbedtls_printf("Last error was: -0x%X - %s\n\n", (unsigned int) -ret, error_buf);
2999*62c56f98SSadaf Ebrahimi     }
3000*62c56f98SSadaf Ebrahimi #endif
3001*62c56f98SSadaf Ebrahimi 
3002*62c56f98SSadaf Ebrahimi     mbedtls_net_free(&server_fd);
3003*62c56f98SSadaf Ebrahimi 
3004*62c56f98SSadaf Ebrahimi     mbedtls_ssl_free(&ssl);
3005*62c56f98SSadaf Ebrahimi     mbedtls_ssl_config_free(&conf);
3006*62c56f98SSadaf Ebrahimi     mbedtls_ssl_session_free(&saved_session);
3007*62c56f98SSadaf Ebrahimi 
3008*62c56f98SSadaf Ebrahimi     if (session_data != NULL) {
3009*62c56f98SSadaf Ebrahimi         mbedtls_platform_zeroize(session_data, session_data_len);
3010*62c56f98SSadaf Ebrahimi     }
3011*62c56f98SSadaf Ebrahimi     mbedtls_free(session_data);
3012*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
3013*62c56f98SSadaf Ebrahimi     if (context_buf != NULL) {
3014*62c56f98SSadaf Ebrahimi         mbedtls_platform_zeroize(context_buf, context_buf_len);
3015*62c56f98SSadaf Ebrahimi     }
3016*62c56f98SSadaf Ebrahimi     mbedtls_free(context_buf);
3017*62c56f98SSadaf Ebrahimi #endif
3018*62c56f98SSadaf Ebrahimi 
3019*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
3020*62c56f98SSadaf Ebrahimi     mbedtls_x509_crt_free(&clicert);
3021*62c56f98SSadaf Ebrahimi     mbedtls_x509_crt_free(&cacert);
3022*62c56f98SSadaf Ebrahimi     mbedtls_pk_free(&pkey);
3023*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
3024*62c56f98SSadaf Ebrahimi     psa_destroy_key(key_slot);
3025*62c56f98SSadaf Ebrahimi #endif
3026*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
3027*62c56f98SSadaf Ebrahimi 
3028*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED) && \
3029*62c56f98SSadaf Ebrahimi     defined(MBEDTLS_USE_PSA_CRYPTO)
3030*62c56f98SSadaf Ebrahimi     if (opt.psk_opaque != 0) {
3031*62c56f98SSadaf Ebrahimi         /* This is ok even if the slot hasn't been
3032*62c56f98SSadaf Ebrahimi          * initialized (we might have jumed here
3033*62c56f98SSadaf Ebrahimi          * immediately because of bad cmd line params,
3034*62c56f98SSadaf Ebrahimi          * for example). */
3035*62c56f98SSadaf Ebrahimi         status = psa_destroy_key(slot);
3036*62c56f98SSadaf Ebrahimi         if ((status != PSA_SUCCESS) &&
3037*62c56f98SSadaf Ebrahimi             (opt.query_config_mode == DFL_QUERY_CONFIG_MODE)) {
3038*62c56f98SSadaf Ebrahimi             mbedtls_printf("Failed to destroy key slot %u - error was %d",
3039*62c56f98SSadaf Ebrahimi                            (unsigned) MBEDTLS_SVC_KEY_ID_GET_KEY_ID(slot),
3040*62c56f98SSadaf Ebrahimi                            (int) status);
3041*62c56f98SSadaf Ebrahimi             if (ret == 0) {
3042*62c56f98SSadaf Ebrahimi                 ret = MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
3043*62c56f98SSadaf Ebrahimi             }
3044*62c56f98SSadaf Ebrahimi         }
3045*62c56f98SSadaf Ebrahimi     }
3046*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED &&
3047*62c56f98SSadaf Ebrahimi           MBEDTLS_USE_PSA_CRYPTO */
3048*62c56f98SSadaf Ebrahimi 
3049*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) && \
3050*62c56f98SSadaf Ebrahimi     defined(MBEDTLS_USE_PSA_CRYPTO)
3051*62c56f98SSadaf Ebrahimi     /*
3052*62c56f98SSadaf Ebrahimi      * In case opaque keys it's the user responsibility to keep the key valid
3053*62c56f98SSadaf Ebrahimi      * for the duration of the handshake and destroy it at the end
3054*62c56f98SSadaf Ebrahimi      */
3055*62c56f98SSadaf Ebrahimi     if ((opt.ecjpake_pw_opaque != DFL_ECJPAKE_PW_OPAQUE)) {
3056*62c56f98SSadaf Ebrahimi         psa_key_attributes_t check_attributes = PSA_KEY_ATTRIBUTES_INIT;
3057*62c56f98SSadaf Ebrahimi 
3058*62c56f98SSadaf Ebrahimi         /* Verify that the key is still valid before destroying it */
3059*62c56f98SSadaf Ebrahimi         if (psa_get_key_attributes(ecjpake_pw_slot, &check_attributes) !=
3060*62c56f98SSadaf Ebrahimi             PSA_SUCCESS) {
3061*62c56f98SSadaf Ebrahimi             if (ret == 0) {
3062*62c56f98SSadaf Ebrahimi                 ret = 1;
3063*62c56f98SSadaf Ebrahimi             }
3064*62c56f98SSadaf Ebrahimi             mbedtls_printf("The EC J-PAKE password key has unexpectedly been already destroyed\n");
3065*62c56f98SSadaf Ebrahimi         } else {
3066*62c56f98SSadaf Ebrahimi             psa_destroy_key(ecjpake_pw_slot);
3067*62c56f98SSadaf Ebrahimi         }
3068*62c56f98SSadaf Ebrahimi     }
3069*62c56f98SSadaf Ebrahimi #endif  /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED && MBEDTLS_USE_PSA_CRYPTO */
3070*62c56f98SSadaf Ebrahimi 
3071*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO) || defined(MBEDTLS_SSL_PROTO_TLS1_3)
3072*62c56f98SSadaf Ebrahimi     const char *message = mbedtls_test_helper_is_psa_leaking();
3073*62c56f98SSadaf Ebrahimi     if (message) {
3074*62c56f98SSadaf Ebrahimi         if (ret == 0) {
3075*62c56f98SSadaf Ebrahimi             ret = 1;
3076*62c56f98SSadaf Ebrahimi         }
3077*62c56f98SSadaf Ebrahimi         mbedtls_printf("PSA memory leak detected: %s\n",  message);
3078*62c56f98SSadaf Ebrahimi     }
3079*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO || MBEDTLS_SSL_PROTO_TLS1_3 */
3080*62c56f98SSadaf Ebrahimi 
3081*62c56f98SSadaf Ebrahimi     /* For builds with MBEDTLS_TEST_USE_PSA_CRYPTO_RNG psa crypto
3082*62c56f98SSadaf Ebrahimi      * resources are freed by rng_free(). */
3083*62c56f98SSadaf Ebrahimi #if (defined(MBEDTLS_USE_PSA_CRYPTO) || defined(MBEDTLS_SSL_PROTO_TLS1_3)) && \
3084*62c56f98SSadaf Ebrahimi     !defined(MBEDTLS_TEST_USE_PSA_CRYPTO_RNG)
3085*62c56f98SSadaf Ebrahimi     mbedtls_psa_crypto_free();
3086*62c56f98SSadaf Ebrahimi #endif
3087*62c56f98SSadaf Ebrahimi 
3088*62c56f98SSadaf Ebrahimi     rng_free(&rng);
3089*62c56f98SSadaf Ebrahimi 
3090*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_TEST_HOOKS)
3091*62c56f98SSadaf Ebrahimi     if (test_hooks_failure_detected()) {
3092*62c56f98SSadaf Ebrahimi         if (ret == 0) {
3093*62c56f98SSadaf Ebrahimi             ret = 1;
3094*62c56f98SSadaf Ebrahimi         }
3095*62c56f98SSadaf Ebrahimi         mbedtls_printf("Test hooks detected errors.\n");
3096*62c56f98SSadaf Ebrahimi     }
3097*62c56f98SSadaf Ebrahimi     test_hooks_free();
3098*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_TEST_HOOKS */
3099*62c56f98SSadaf Ebrahimi 
3100*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
3101*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MEMORY_DEBUG)
3102*62c56f98SSadaf Ebrahimi     mbedtls_memory_buffer_alloc_status();
3103*62c56f98SSadaf Ebrahimi #endif
3104*62c56f98SSadaf Ebrahimi     mbedtls_memory_buffer_alloc_free();
3105*62c56f98SSadaf Ebrahimi #endif  /* MBEDTLS_MEMORY_BUFFER_ALLOC_C */
3106*62c56f98SSadaf Ebrahimi 
3107*62c56f98SSadaf Ebrahimi     // Shell can not handle large exit numbers -> 1 for errors
3108*62c56f98SSadaf Ebrahimi     if (ret < 0) {
3109*62c56f98SSadaf Ebrahimi         ret = 1;
3110*62c56f98SSadaf Ebrahimi     }
3111*62c56f98SSadaf Ebrahimi 
3112*62c56f98SSadaf Ebrahimi     if (opt.query_config_mode == DFL_QUERY_CONFIG_MODE) {
3113*62c56f98SSadaf Ebrahimi         mbedtls_exit(ret);
3114*62c56f98SSadaf Ebrahimi     } else {
3115*62c56f98SSadaf Ebrahimi         mbedtls_exit(query_config_ret);
3116*62c56f98SSadaf Ebrahimi     }
3117*62c56f98SSadaf Ebrahimi }
3118*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_SSL_TEST_IMPOSSIBLE && MBEDTLS_SSL_CLI_C */
3119