11/* memory-bio-dtls.c
22 *
3- * Copyright (C) 2006-2020 wolfSSL Inc.
3+ * Copyright (C) 2006-2025 wolfSSL Inc.
44 *
55 * This file is part of wolfSSL. (formerly known as CyaSSL)
66 *
2222
2323/* in memory TLS connection with I/O callbacks, no sockets
2424 *
25- gcc -Wall memory-tls.c -l wolfssl -lpthread
25+ ./configure --enable-opensslall --enable-dtls --enable-dtls13 --enable-debug
26+ make
27+ sudo make install
2628
29+ gcc -o memory-bio-dtls -Wall memory-bio-dtls.c -lwolfssl -lpthread
2730*/
2831
32+
33+ #ifndef WOLFSSL_USER_SETTINGS
2934#include <wolfssl/options.h>
35+ #endif
36+
3037#include <wolfssl/ssl.h>
3138
3239#include <stdio.h>
@@ -43,10 +50,16 @@ static void err_sys(const char* msg)
4350 exit (1 );
4451}
4552
53+ #ifndef NO_RSA
54+ #define CERT_FILE "../certs/server-cert.pem"
55+ #define KEY_FILE "../certs/server-key.pem"
56+ #define CA_FILE "../certs/ca-cert.pem"
57+ #else
58+ #define CERT_FILE "../certs/server-ecc.pem"
59+ #define KEY_FILE "../certs/ecc-key.pem"
60+ #define CA_FILE "../certs/ca-ecc-cert.pem"
61+ #endif
4662
47- #define key "../certs/server-key.pem"
48- #define cert "../certs/server-cert.pem"
49- #define cacert "../certs/ca-cert.pem"
5063
5164typedef struct IO_HANDLES {
5265 WOLFSSL_BIO * rbio ;
@@ -64,16 +77,16 @@ static void* client_thread(void* args)
6477 /* set up client */
6578 cli_ctx = wolfSSL_CTX_new (
6679#ifdef WOLFSSL_DTLS13
67- wolfDTLSv1_3_client_method ()
80+ wolfDTLSv1_3_client_method ()
6881#else
69- wolfDTLSv1_2_client_method ()
82+ wolfDTLSv1_2_client_method ()
7083#endif
7184 );
7285 if (cli_ctx == NULL ) {
7386 err_sys ("bad client ctx new" );
7487 }
7588
76- ret = wolfSSL_CTX_load_verify_locations (cli_ctx , cacert , NULL );
89+ ret = wolfSSL_CTX_load_verify_locations (cli_ctx , CA_FILE , NULL );
7790 if (ret != WOLFSSL_SUCCESS ) {
7891 err_sys ("bad ca load" );
7992 }
@@ -84,23 +97,26 @@ static void* client_thread(void* args)
8497 }
8598
8699 wolfSSL_set_bio (cli_ssl , io -> wbio , io -> rbio );
100+
101+ #if 1
87102 err = 0 ;
88103 do {
89104 sem_wait (& io -> bioSem );
90105 ret = wolfSSL_connect (cli_ssl );
91106 sem_post (& io -> bioSem );
92- err = wolfSSL_get_error (cli_ssl , ret );
93- } while (ret != WOLFSSL_SUCCESS &&
107+ err = wolfSSL_get_error (cli_ssl , ret );
108+ } while (ret != WOLFSSL_SUCCESS &&
94109 ((err == WOLFSSL_ERROR_WANT_READ ) || (err == WOLFSSL_ERROR_WANT_WRITE )));
95110 if (ret != WOLFSSL_SUCCESS ) err_sys ("bad client tls connect" );
96111 printf ("wolfSSL client success!\n" );
112+ #endif
97113
98114 do {
99115 sem_wait (& io -> bioSem );
100116 ret = wolfSSL_write (cli_ssl , "hello memory wolfSSL!" , 21 );
101117 sem_post (& io -> bioSem );
102- err = wolfSSL_get_error (cli_ssl , ret );
103- } while (ret <= 0 &&
118+ err = wolfSSL_get_error (cli_ssl , ret );
119+ } while (ret <= 0 &&
104120 ((err == WOLFSSL_ERROR_WANT_READ ) || (err == WOLFSSL_ERROR_WANT_WRITE )));
105121
106122 /* clean up, wolfSSL_free would also free the WOLFSSL_BIO's so set as NULL
@@ -120,8 +136,15 @@ int main()
120136 int ret , err ;
121137 WOLFSSL_CTX * srv_ctx = NULL ;
122138 WOLFSSL * srv_ssl = NULL ;
139+ WOLFSSL_CIPHER * cipher ;
140+ const char * name ;
123141 pthread_t tid ;
124142
143+ #if 0
144+ wolfSSL_Debugging_ON ();
145+ #endif
146+ wolfSSL_Init ();
147+
125148 io .rbio = wolfSSL_BIO_new (wolfSSL_BIO_s_mem ());
126149 io .wbio = wolfSSL_BIO_new (wolfSSL_BIO_s_mem ());
127150 sem_init (& io .bioSem , 0 , 1 );
@@ -136,12 +159,12 @@ int main()
136159 );
137160 if (srv_ctx == NULL ) err_sys ("bad server ctx new" );
138161
139- ret = wolfSSL_CTX_use_PrivateKey_file (srv_ctx , key , WOLFSSL_FILETYPE_PEM );
162+ ret = wolfSSL_CTX_use_PrivateKey_file (srv_ctx , KEY_FILE , WOLFSSL_FILETYPE_PEM );
140163 if (ret != WOLFSSL_SUCCESS ) {
141164 err_sys ("bad server key file load" );
142165 }
143166
144- ret = wolfSSL_CTX_use_certificate_file (srv_ctx , cert , WOLFSSL_FILETYPE_PEM );
167+ ret = wolfSSL_CTX_use_certificate_file (srv_ctx , CERT_FILE , WOLFSSL_FILETYPE_PEM );
145168 if (ret != WOLFSSL_SUCCESS ) {
146169 err_sys ("bad server cert file load" );
147170 }
@@ -157,26 +180,34 @@ int main()
157180 /* start client thread */
158181 pthread_create (& tid , 0 , client_thread , (void * )& io );
159182
183+ #if 1
160184 /* accept tls connection without tcp sockets */
161185 err = 0 ;
162186 do {
163187 sem_wait (& io .bioSem );
164188 ret = wolfSSL_accept (srv_ssl );
165189 sem_post (& io .bioSem );
166- err = wolfSSL_get_error (srv_ssl , ret );
167- } while (ret != WOLFSSL_SUCCESS &&
190+ err = wolfSSL_get_error (srv_ssl , ret );
191+ } while (ret != WOLFSSL_SUCCESS &&
168192 ((err == WOLFSSL_ERROR_WANT_READ ) || (err == WOLFSSL_ERROR_WANT_WRITE )));
169193 if (ret != WOLFSSL_SUCCESS ) err_sys ("bad server tls accept" );
170194 printf ("wolfSSL accept success!\n" );
171195
196+ printf ("Version: %s\n" , wolfSSL_get_version (srv_ssl ));
197+ cipher = wolfSSL_get_current_cipher (srv_ssl );
198+ printf ("Cipher Suite: %s\n" , wolfSSL_CIPHER_get_name (cipher ));
199+ if ((name = wolfSSL_get_curve_name (srv_ssl )) != NULL )
200+ printf ("Curve: %s\n" , name );
201+ #endif
202+
172203 /* read msg post handshake from client */
173204 memset (buf , 0 , sizeof (buf ));
174205 do {
175206 sem_wait (& io .bioSem );
176207 ret = wolfSSL_read (srv_ssl , buf , sizeof (buf )- 1 );
177208 sem_post (& io .bioSem );
178- err = wolfSSL_get_error (srv_ssl , ret );
179- } while (ret != 0 &&
209+ err = wolfSSL_get_error (srv_ssl , ret );
210+ } while (ret != 0 &&
180211 ((err == WOLFSSL_ERROR_WANT_READ ) || (err == WOLFSSL_ERROR_WANT_WRITE )));
181212 if (ret >= 0 ) {
182213 printf ("client msg = %s\n" , buf );
@@ -189,6 +220,7 @@ int main()
189220 wolfSSL_free (srv_ssl ); /* This also does free on rbio and wbio */
190221 wolfSSL_CTX_free (srv_ctx );
191222
223+ wolfSSL_Cleanup ();
224+
192225 return 0 ;
193226}
194-
0 commit comments