@@ -191,85 +191,65 @@ static void server_thread_fn(void *arg0, void *arg1, void *arg2)
191191 zassert_not_equal (r , -1 , "close() failed on the server fd (%d)" , errno );
192192}
193193
194- static void test_common ( int peer_verify )
194+ static int test_configure_server ( k_tid_t * server_thread_id , int peer_verify )
195195{
196- const int yes = true;
196+ static const sec_tag_t server_tag_list_verify_none [] = {
197+ SERVER_CERTIFICATE_TAG ,
198+ };
199+
200+ static const sec_tag_t server_tag_list_verify [] = {
201+ CA_CERTIFICATE_TAG ,
202+ SERVER_CERTIFICATE_TAG ,
203+ };
197204
198- int r ;
199- int server_fd ;
200- int client_fd ;
201- int proto = IPPROTO_TCP ;
202- char * addrstrp ;
203- k_tid_t server_thread_id ;
204- struct sockaddr_in sa ;
205205 char addrstr [INET_ADDRSTRLEN ];
206+ const sec_tag_t * sec_tag_list ;
207+ size_t sec_tag_list_size ;
208+ struct sockaddr_in sa ;
209+ const int yes = true;
210+ char * addrstrp ;
211+ int server_fd ;
212+ int r ;
206213
207214 k_sem_init (& server_sem , 0 , 1 );
208215
209- /* set the common protocol for both client and server */
210- if (IS_ENABLED (CONFIG_NET_SOCKETS_SOCKOPT_TLS )) {
211- proto = IPPROTO_TLS_1_2 ;
212- }
213- /*
214- * Server socket setup
215- */
216-
217216 NET_DBG ("Creating server socket" );
218- r = socket (AF_INET , SOCK_STREAM , proto );
217+ r = socket (AF_INET , SOCK_STREAM , IPPROTO_TLS_1_2 );
219218 zassert_not_equal (r , -1 , "failed to create server socket (%d)" , errno );
220219 server_fd = r ;
221220
222221 r = setsockopt (server_fd , SOL_SOCKET , SO_REUSEADDR , & yes , sizeof (yes ));
223222 zassert_not_equal (r , -1 , "failed to set SO_REUSEADDR (%d)" , errno );
224223
225- if (IS_ENABLED (CONFIG_TLS_CREDENTIALS )
226- && IS_ENABLED (CONFIG_NET_SOCKETS_SOCKOPT_TLS )) {
227-
228- static const sec_tag_t server_tag_list_verify_none [] = {
229- SERVER_CERTIFICATE_TAG ,
230- };
231-
232- static const sec_tag_t server_tag_list_verify [] = {
233- CA_CERTIFICATE_TAG ,
234- SERVER_CERTIFICATE_TAG ,
235- };
236-
237- const sec_tag_t * sec_tag_list ;
238- size_t sec_tag_list_size ;
239-
240- switch (peer_verify ) {
241- case TLS_PEER_VERIFY_NONE :
242- sec_tag_list = server_tag_list_verify_none ;
243- sec_tag_list_size = sizeof (server_tag_list_verify_none );
244- break ;
245- case TLS_PEER_VERIFY_OPTIONAL :
246- case TLS_PEER_VERIFY_REQUIRED :
247- sec_tag_list = server_tag_list_verify ;
248- sec_tag_list_size = sizeof (server_tag_list_verify );
249-
250- r = setsockopt (server_fd , SOL_TLS , TLS_PEER_VERIFY ,
251- & peer_verify , sizeof (peer_verify ));
252- zassert_not_equal (r , -1 ,
253- "failed to set TLS_PEER_VERIFY (%d)" , errno );
254- break ;
255- default :
256- zassert_true (false,
257- "unrecognized TLS peer verify type %d" ,
258- peer_verify );
259- return ;
260- }
261-
262- r = setsockopt (server_fd , SOL_TLS , TLS_SEC_TAG_LIST ,
263- sec_tag_list , sec_tag_list_size );
264- zassert_not_equal (r , -1 , "failed to set TLS_SEC_TAG_LIST (%d)" ,
265- errno );
266-
267- r = setsockopt (server_fd , SOL_TLS , TLS_HOSTNAME , "localhost" ,
268- sizeof ("localhost" ));
269- zassert_not_equal (r , -1 , "failed to set TLS_HOSTNAME (%d)" ,
224+ switch (peer_verify ) {
225+ case TLS_PEER_VERIFY_NONE :
226+ sec_tag_list = server_tag_list_verify_none ;
227+ sec_tag_list_size = sizeof (server_tag_list_verify_none );
228+ break ;
229+ case TLS_PEER_VERIFY_OPTIONAL :
230+ case TLS_PEER_VERIFY_REQUIRED :
231+ sec_tag_list = server_tag_list_verify ;
232+ sec_tag_list_size = sizeof (server_tag_list_verify );
233+
234+ r = setsockopt (server_fd , SOL_TLS , TLS_PEER_VERIFY ,
235+ & peer_verify , sizeof (peer_verify ));
236+ zassert_not_equal (r , -1 , "failed to set TLS_PEER_VERIFY (%d)" ,
270237 errno );
238+ break ;
239+ default :
240+ zassert_true (false, "unrecognized TLS peer verify type %d" ,
241+ peer_verify );
242+ return -1 ;
271243 }
272244
245+ r = setsockopt (server_fd , SOL_TLS , TLS_SEC_TAG_LIST ,
246+ sec_tag_list , sec_tag_list_size );
247+ zassert_not_equal (r , -1 , "failed to set TLS_SEC_TAG_LIST (%d)" , errno );
248+
249+ r = setsockopt (server_fd , SOL_TLS , TLS_HOSTNAME , "localhost" ,
250+ sizeof ("localhost" ));
251+ zassert_not_equal (r , -1 , "failed to set TLS_HOSTNAME (%d)" , errno );
252+
273253 memset (& sa , 0 , sizeof (sa ));
274254 /* The server listens on all network interfaces */
275255 sa .sin_addr .s_addr = INADDR_ANY ;
@@ -291,116 +271,136 @@ static void test_common(int peer_verify)
291271 addrstr , ntohs (sa .sin_port ), server_fd );
292272
293273 NET_DBG ("Creating server thread" );
294- server_thread_id = k_thread_create (& server_thread , server_stack ,
295- STACK_SIZE , server_thread_fn ,
296- INT_TO_POINTER (server_fd ), NULL , NULL ,
297- K_PRIO_PREEMPT (8 ), 0 , K_NO_WAIT );
274+ * server_thread_id = k_thread_create (& server_thread , server_stack ,
275+ STACK_SIZE , server_thread_fn ,
276+ INT_TO_POINTER (server_fd ), NULL , NULL ,
277+ K_PRIO_PREEMPT (8 ), 0 , K_NO_WAIT );
298278
299279 r = k_sem_take (& server_sem , K_MSEC (TIMEOUT ));
300280 zassert_equal (0 , r , "failed to synchronize with server thread (%d)" , r );
301281
302- /*
303- * Client socket setup
304- */
282+ return server_fd ;
283+ }
284+
285+ static int test_configure_client (struct sockaddr_in * sa , bool own_cert )
286+ {
287+ static const sec_tag_t client_tag_list_verify_none [] = {
288+ CA_CERTIFICATE_TAG ,
289+ };
290+
291+ static const sec_tag_t client_tag_list_verify [] = {
292+ CA_CERTIFICATE_TAG ,
293+ CLIENT_CERTIFICATE_TAG ,
294+ };
295+
296+ char addrstr [INET_ADDRSTRLEN ];
297+ const sec_tag_t * sec_tag_list ;
298+ size_t sec_tag_list_size ;
299+ char * addrstrp ;
300+ int client_fd ;
301+ int r ;
305302
306303 k_thread_name_set (k_current_get (), "client" );
307304
308305 NET_DBG ("Creating client socket" );
309- r = socket (AF_INET , SOCK_STREAM , proto );
306+ r = socket (AF_INET , SOCK_STREAM , IPPROTO_TLS_1_2 );
310307 zassert_not_equal (r , -1 , "failed to create client socket (%d)" , errno );
311308 client_fd = r ;
312309
313- if (IS_ENABLED (CONFIG_TLS_CREDENTIALS )
314- && IS_ENABLED (CONFIG_NET_SOCKETS_SOCKOPT_TLS )) {
315-
316- static const sec_tag_t client_tag_list_verify_none [] = {
317- CA_CERTIFICATE_TAG ,
318- };
319-
320- static const sec_tag_t client_tag_list_verify [] = {
321- CA_CERTIFICATE_TAG ,
322- CLIENT_CERTIFICATE_TAG ,
323- };
324-
325- const sec_tag_t * sec_tag_list ;
326- size_t sec_tag_list_size ;
327-
328- switch (peer_verify ) {
329- case TLS_PEER_VERIFY_NONE :
330- sec_tag_list = client_tag_list_verify_none ;
331- sec_tag_list_size = sizeof (client_tag_list_verify_none );
332- break ;
333- case TLS_PEER_VERIFY_OPTIONAL :
334- case TLS_PEER_VERIFY_REQUIRED :
335- sec_tag_list = client_tag_list_verify ;
336- sec_tag_list_size = sizeof (client_tag_list_verify );
337- break ;
338- default :
339- zassert_true (false, "unrecognized TLS peer verify type %d" ,
340- peer_verify );
341- return ;
342- }
343-
344- r = setsockopt (client_fd , SOL_TLS , TLS_SEC_TAG_LIST ,
345- sec_tag_list , sec_tag_list_size );
346- zassert_not_equal (r , -1 , "failed to set TLS_SEC_TAG_LIST (%d)" ,
347- errno );
310+ if (own_cert ) {
311+ sec_tag_list = client_tag_list_verify ;
312+ sec_tag_list_size = sizeof (client_tag_list_verify );
313+ } else {
314+ sec_tag_list = client_tag_list_verify_none ;
315+ sec_tag_list_size = sizeof (client_tag_list_verify_none );
316+ }
317+
318+ r = setsockopt (client_fd , SOL_TLS , TLS_SEC_TAG_LIST ,
319+ sec_tag_list , sec_tag_list_size );
320+ zassert_not_equal (r , -1 , "failed to set TLS_SEC_TAG_LIST (%d)" , errno );
348321
349- r = setsockopt (client_fd , SOL_TLS , TLS_HOSTNAME , "localhost" ,
322+ r = setsockopt (client_fd , SOL_TLS , TLS_HOSTNAME , "localhost" ,
350323 sizeof ("localhost" ));
351- zassert_not_equal (r , -1 , "failed to set TLS_HOSTNAME (%d)" , errno );
352- }
324+ zassert_not_equal (r , -1 , "failed to set TLS_HOSTNAME (%d)" , errno );
353325
354- r = inet_pton (AF_INET , MY_IPV4_ADDR , & sa .sin_addr .s_addr );
326+ sa -> sin_family = AF_INET ;
327+ sa -> sin_port = htons (PORT );
328+ r = inet_pton (AF_INET , MY_IPV4_ADDR , & sa -> sin_addr .s_addr );
355329 zassert_not_equal (-1 , r , "inet_pton() failed (%d)" , errno );
356330 zassert_not_equal (0 , r , "%s is not a valid IPv4 address" , MY_IPV4_ADDR );
357331 zassert_equal (1 , r , "inet_pton() failed to convert %s" , MY_IPV4_ADDR );
358332
359333 memset (addrstr , '\0' , sizeof (addrstr ));
360- addrstrp = (char * )inet_ntop (AF_INET , & sa . sin_addr ,
334+ addrstrp = (char * )inet_ntop (AF_INET , & sa -> sin_addr ,
361335 addrstr , sizeof (addrstr ));
362336 zassert_not_equal (addrstrp , NULL , "inet_ntop() failed (%d)" , errno );
363337
364338 NET_DBG ("connecting to [%s]:%d with fd %d" ,
365- addrstr , ntohs (sa . sin_port ), client_fd );
339+ addrstr , ntohs (sa -> sin_port ), client_fd );
366340
367- r = connect (client_fd , (struct sockaddr * )& sa , sizeof (sa ));
368- zassert_not_equal (r , -1 , "failed to connect (%d)" , errno );
341+ return client_fd ;
342+ }
343+ static void test_shutdown (int client_fd , int server_fd , k_tid_t server_thread_id )
344+ {
345+ int r ;
346+
347+ NET_DBG ("closing client fd" );
348+ r = close (client_fd );
349+ zassert_not_equal (-1 , r , "close() failed on the client fd (%d)" , errno );
350+
351+ NET_DBG ("closing server fd" );
352+ r = close (server_fd );
353+ zassert_not_equal (-1 , r , "close() failed on the server fd (%d)" , errno );
354+
355+ r = k_thread_join (& server_thread , K_FOREVER );
356+ zassert_equal (0 , r , "k_thread_join() failed (%d)" , r );
357+
358+ k_yield ();
359+ }
360+
361+ static void test_common (int peer_verify )
362+ {
363+ k_tid_t server_thread_id ;
364+ struct sockaddr_in sa ;
365+ uint8_t rx_buf [16 ];
366+ int server_fd ;
367+ int client_fd ;
368+ int r ;
369+
370+ /*
371+ * Server socket setup
372+ */
373+ server_fd = test_configure_server (& server_thread_id , peer_verify );
374+
375+ /*
376+ * Client socket setup
377+ */
378+ client_fd = test_configure_client (& sa , peer_verify != TLS_PEER_VERIFY_NONE );
369379
370380 /*
371381 * The main part of the test
372382 */
373383
384+ r = connect (client_fd , (struct sockaddr * )& sa , sizeof (sa ));
385+ zassert_not_equal (r , -1 , "failed to connect (%d)" , errno );
386+
374387 NET_DBG ("Calling send()" );
375388 r = send (client_fd , SECRET , SECRET_SIZE , 0 );
376389 zassert_not_equal (r , -1 , "send() failed (%d)" , errno );
377390 zassert_equal (SECRET_SIZE , r , "expected: %zu actual: %d" , SECRET_SIZE , r );
378391
379392 NET_DBG ("Calling recv()" );
380- memset (addrstr , 0 , sizeof (addrstr ));
381- r = recv (client_fd , addrstr , sizeof (addrstr ), 0 );
393+ memset (rx_buf , 0 , sizeof (rx_buf ));
394+ r = recv (client_fd , rx_buf , sizeof (rx_buf ), 0 );
382395 zassert_not_equal (r , -1 , "recv() failed (%d)" , errno );
383396 zassert_equal (SECRET_SIZE , r , "expected: %zu actual: %d" , SECRET_SIZE , r );
384-
385- zassert_mem_equal (SECRET , addrstr , SECRET_SIZE ,
386- "expected: %s actual: %s" , SECRET , addrstr );
397+ zassert_mem_equal (SECRET , rx_buf , SECRET_SIZE ,
398+ "expected: %s actual: %s" , SECRET , rx_buf );
387399
388400 /*
389401 * Cleanup resources
390402 */
391-
392- NET_DBG ("closing client fd" );
393- r = close (client_fd );
394- zassert_not_equal (-1 , r , "close() failed on the client fd (%d)" , errno );
395-
396- NET_DBG ("closing server fd" );
397- r = close (server_fd );
398- zassert_not_equal (-1 , r , "close() failed on the server fd (%d)" , errno );
399-
400- r = k_thread_join (& server_thread , K_FOREVER );
401- zassert_equal (0 , r , "k_thread_join() failed (%d)" , r );
402-
403- k_yield ();
403+ test_shutdown (client_fd , server_fd , server_thread_id );
404404}
405405
406406ZTEST (net_socket_tls_api_extension , test_tls_peer_verify_none )
0 commit comments