5252#include <wolfssl/ssl.h>
5353#include <wolfssl/wolfio.h>
5454#include <wolfssl/wolfcrypt/error-crypt.h>
55+ #include <wolfssl/certs_test.h>
5556#include "examples/async/async_tls.h"
5657
5758/* ------------------------------------------------------------------ */
@@ -154,7 +155,8 @@ static int posix_net_connect(const char* host, int port)
154155/* ------------------------------------------------------------------ */
155156static void usage (const char * prog )
156157{
157- printf ("usage: %s [--ecc|--x25519] [host] [port]\n" , prog );
158+ printf ("usage: %s [--ecc|--x25519] [--mutual] [--tls12] [host] [port]\n" ,
159+ prog );
158160}
159161
160162static const char * group_name (word16 group )
@@ -170,7 +172,7 @@ static const char* group_name(word16 group)
170172}
171173
172174static int parse_client_args (int argc , char * * argv ,
173- const char * * host , int * port , word16 * group )
175+ const char * * host , int * port , word16 * group , int * mutual , int * tls12 )
174176{
175177 int i ;
176178 int host_set = 0 ;
@@ -179,6 +181,8 @@ static int parse_client_args(int argc, char** argv,
179181 * host = DEFAULT_TLS_HOST ;
180182 * port = DEFAULT_TLS_PORT ;
181183 * group = WOLFSSL_ECC_SECP256R1 ;
184+ * mutual = 0 ;
185+ * tls12 = 0 ;
182186
183187 for (i = 1 ; i < argc ; i ++ ) {
184188 if (XSTRCMP (argv [i ], "--ecc" ) == 0 ) {
@@ -187,6 +191,12 @@ static int parse_client_args(int argc, char** argv,
187191 else if (XSTRCMP (argv [i ], "--x25519" ) == 0 ) {
188192 * group = WOLFSSL_ECC_X25519 ;
189193 }
194+ else if (XSTRCMP (argv [i ], "--mutual" ) == 0 ) {
195+ * mutual = 1 ;
196+ }
197+ else if (XSTRCMP (argv [i ], "--tls12" ) == 0 ) {
198+ * tls12 = 1 ;
199+ }
190200 else if (XSTRCMP (argv [i ], "--help" ) == 0 ) {
191201 return -1 ;
192202 }
@@ -227,13 +237,17 @@ int client_async_test(int argc, char** argv)
227237 int port = 0 ;
228238 word16 group = WOLFSSL_ECC_SECP256R1 ;
229239 const char * mode = NULL ;
240+ int mutual = 0 ;
241+ int tls12 = 0 ;
230242
231- if (parse_client_args (argc , argv , & host , & port , & group ) != 0 ) {
243+ if (parse_client_args (argc , argv , & host , & port , & group , & mutual ,
244+ & tls12 ) != 0 ) {
232245 usage (argv [0 ]);
233246 return 0 ;
234247 }
235248 mode = group_name (group );
236- printf ("Async client mode: %s (keyshare 0x%04x)\n" , mode , group );
249+ printf ("Async client mode: %s, TLS %s%s\n" , mode ,
250+ tls12 ? "1.2" : "1.3" , mutual ? ", mutual auth" : "" );
237251
238252 {
239253 const char * ready = getenv (WOLFSSL_ASYNC_READYFILE_ENV );
@@ -259,16 +273,71 @@ int client_async_test(int argc, char** argv)
259273 }
260274#endif
261275
262- ctx = wolfSSL_CTX_new (wolfSSLv23_client_method ());
276+ #ifndef WOLFSSL_NO_TLS12
277+ if (tls12 )
278+ ctx = wolfSSL_CTX_new (wolfTLSv1_2_client_method ());
279+ else
280+ #endif
281+ ctx = wolfSSL_CTX_new (wolfSSLv23_client_method ());
263282 if (ctx == NULL ) {
264283 goto out ;
265284 }
266285#ifdef WOLFSSL_ASYNC_CRYPT
267286 wolfSSL_CTX_SetDevId (ctx , devId );
268287#endif
269288
270- /* Bare-metal style: disable verification unless you load CA/peer certs. */
271- wolfSSL_CTX_set_verify (ctx , WOLFSSL_VERIFY_NONE , NULL );
289+ if (mutual ) {
290+ if (group == WOLFSSL_ECC_X25519 ) {
291+ #ifdef HAVE_ED25519
292+ ret = wolfSSL_CTX_load_verify_buffer (ctx , ca_ed25519_cert ,
293+ sizeof_ca_ed25519_cert , WOLFSSL_FILETYPE_ASN1 );
294+ if (ret != WOLFSSL_SUCCESS ) {
295+ fprintf (stderr , "ERROR: failed to load ED25519 CA cert.\n" );
296+ goto out ;
297+ }
298+ ret = wolfSSL_CTX_use_certificate_buffer (ctx , client_ed25519_cert ,
299+ sizeof_client_ed25519_cert , WOLFSSL_FILETYPE_ASN1 );
300+ if (ret != WOLFSSL_SUCCESS ) {
301+ fprintf (stderr , "ERROR: failed to load ED25519 client cert.\n" );
302+ goto out ;
303+ }
304+ ret = wolfSSL_CTX_use_PrivateKey_buffer (ctx , client_ed25519_key ,
305+ sizeof_client_ed25519_key , WOLFSSL_FILETYPE_ASN1 );
306+ if (ret != WOLFSSL_SUCCESS ) {
307+ fprintf (stderr , "ERROR: failed to load ED25519 client key.\n" );
308+ goto out ;
309+ }
310+ #else
311+ fprintf (stderr ,
312+ "ERROR: --x25519 --mutual requires HAVE_ED25519\n" );
313+ goto out ;
314+ #endif
315+ }
316+ else {
317+ ret = wolfSSL_CTX_load_verify_buffer (ctx , ca_ecc_cert_der_256 ,
318+ sizeof_ca_ecc_cert_der_256 , WOLFSSL_FILETYPE_ASN1 );
319+ if (ret != WOLFSSL_SUCCESS ) {
320+ fprintf (stderr , "ERROR: failed to load ECC CA cert.\n" );
321+ goto out ;
322+ }
323+ ret = wolfSSL_CTX_use_certificate_buffer (ctx , cliecc_cert_der_256 ,
324+ sizeof_cliecc_cert_der_256 , WOLFSSL_FILETYPE_ASN1 );
325+ if (ret != WOLFSSL_SUCCESS ) {
326+ fprintf (stderr , "ERROR: failed to load ECC client cert.\n" );
327+ goto out ;
328+ }
329+ ret = wolfSSL_CTX_use_PrivateKey_buffer (ctx , ecc_clikey_der_256 ,
330+ sizeof_ecc_clikey_der_256 , WOLFSSL_FILETYPE_ASN1 );
331+ if (ret != WOLFSSL_SUCCESS ) {
332+ fprintf (stderr , "ERROR: failed to load ECC client key.\n" );
333+ goto out ;
334+ }
335+ }
336+ wolfSSL_CTX_set_verify (ctx , WOLFSSL_VERIFY_PEER , NULL );
337+ }
338+ else {
339+ wolfSSL_CTX_set_verify (ctx , WOLFSSL_VERIFY_NONE , NULL );
340+ }
272341
273342 wolfSSL_SetIORecv (ctx , NET_IO_RECV_CB );
274343 wolfSSL_SetIOSend (ctx , NET_IO_SEND_CB );
@@ -286,23 +355,26 @@ int client_async_test(int argc, char** argv)
286355 (void )wolfSSL_UseSNI (ssl , WOLFSSL_SNI_HOST_NAME , host ,
287356 (word16 )XSTRLEN (host ));
288357
289- for (;;) {
290- ret = wolfSSL_UseKeyShare (ssl , group );
291- if (ret == WOLFSSL_SUCCESS ) {
292- break ;
293- }
294- if (ret == WC_NO_ERR_TRACE (WC_PENDING_E )) {
358+ /* UseKeyShare is TLS 1.3 only */
359+ if (!tls12 ) {
360+ for (;;) {
361+ ret = wolfSSL_UseKeyShare (ssl , group );
362+ if (ret == WOLFSSL_SUCCESS ) {
363+ break ;
364+ }
365+ if (ret == WC_NO_ERR_TRACE (WC_PENDING_E )) {
295366#ifdef WOLFSSL_DEBUG_NONBLOCK
296- pending_count ++ ;
367+ pending_count ++ ;
297368#endif
298369#ifdef WOLFSSL_ASYNC_CRYPT
299- if (wolfSSL_AsyncPoll (ssl , WOLF_POLL_FLAG_CHECK_HW ) < 0 ) {
300- goto out ;
301- }
370+ if (wolfSSL_AsyncPoll (ssl , WOLF_POLL_FLAG_CHECK_HW ) < 0 ) {
371+ goto out ;
372+ }
302373#endif
303- continue ;
374+ continue ;
375+ }
376+ goto out ;
304377 }
305- goto out ;
306378 }
307379
308380 /* Non-blocking style loop. */
@@ -332,6 +404,8 @@ int client_async_test(int argc, char** argv)
332404 }
333405 continue ;
334406 }
407+ fprintf (stderr , "ERROR: wolfSSL_connect failed: %d (%s)\n" ,
408+ err , wolfSSL_ERR_reason_error_string (err ));
335409 goto out ;
336410 }
337411
0 commit comments