@@ -207,6 +207,10 @@ __net_socket struct tls_context {
207
207
208
208
bool dtls_handshake_on_connect ;
209
209
#endif /* CONFIG_NET_SOCKETS_ENABLE_DTLS */
210
+
211
+ #if defined(CONFIG_NET_SOCKETS_TLS_CERT_VERIFY_CALLBACK )
212
+ struct tls_cert_verify_cb cert_verify ;
213
+ #endif /* CONFIG_NET_SOCKETS_TLS_CERT_VERIFY_CALLBACK */
210
214
} options ;
211
215
212
216
#if defined(CONFIG_NET_SOCKETS_ENABLE_DTLS )
@@ -1425,6 +1429,14 @@ static int tls_mbedtls_init(struct tls_context *context, bool is_server)
1425
1429
mbedtls_ssl_conf_early_data (& context -> config , MBEDTLS_SSL_EARLY_DATA_ENABLED );
1426
1430
#endif
1427
1431
1432
+ #if defined(CONFIG_NET_SOCKETS_TLS_CERT_VERIFY_CALLBACK )
1433
+ if (context -> options .cert_verify .cb != NULL ) {
1434
+ mbedtls_ssl_conf_verify (& context -> config ,
1435
+ context -> options .cert_verify .cb ,
1436
+ context -> options .cert_verify .ctx );
1437
+ }
1438
+ #endif /* CONFIG_NET_SOCKETS_TLS_CERT_VERIFY_CALLBACK */
1439
+
1428
1440
ret = mbedtls_ssl_setup (& context -> ssl ,
1429
1441
& context -> config );
1430
1442
if (ret != 0 ) {
@@ -2044,6 +2056,42 @@ static int tls_opt_dtls_role_set(struct tls_context *context,
2044
2056
return 0 ;
2045
2057
}
2046
2058
2059
+ #if defined(CONFIG_NET_SOCKETS_TLS_CERT_VERIFY_CALLBACK )
2060
+ static int tls_opt_cert_verify_callback_set (struct tls_context * context ,
2061
+ const void * optval ,
2062
+ socklen_t optlen )
2063
+ {
2064
+ struct tls_cert_verify_cb * cert_verify ;
2065
+
2066
+ if (!optval ) {
2067
+ return - EINVAL ;
2068
+ }
2069
+
2070
+ if (optlen != sizeof (struct tls_cert_verify_cb )) {
2071
+ return - EINVAL ;
2072
+ }
2073
+
2074
+ cert_verify = (struct tls_cert_verify_cb * )optval ;
2075
+ if (cert_verify -> cb == NULL && cert_verify -> ctx != NULL ) {
2076
+ return - EINVAL ;
2077
+ }
2078
+
2079
+ context -> options .cert_verify = * cert_verify ;
2080
+
2081
+ return 0 ;
2082
+ }
2083
+ #else /* CONFIG_NET_SOCKETS_TLS_CERT_VERIFY_CALLBACK */
2084
+ static int tls_opt_cert_verify_callback_set (struct tls_context * context ,
2085
+ const void * optval ,
2086
+ socklen_t optlen )
2087
+ {
2088
+ NET_ERR ("TLS_CERT_VERIFY_CALLBACK option requires "
2089
+ "CONFIG_NET_SOCKETS_TLS_CERT_VERIFY_CALLBACK enabled" );
2090
+
2091
+ return - ENOPROTOOPT ;
2092
+ }
2093
+ #endif /* CONFIG_NET_SOCKETS_TLS_CERT_VERIFY_CALLBACK */
2094
+
2047
2095
static int protocol_check (int family , int type , int * proto )
2048
2096
{
2049
2097
if (family != AF_INET && family != AF_INET6 ) {
@@ -3631,6 +3679,10 @@ int ztls_setsockopt_ctx(struct tls_context *ctx, int level, int optname,
3631
3679
err = tls_opt_session_cache_purge_set (ctx , optval , optlen );
3632
3680
break ;
3633
3681
3682
+ case TLS_CERT_VERIFY_CALLBACK :
3683
+ err = tls_opt_cert_verify_callback_set (ctx , optval , optlen );
3684
+ break ;
3685
+
3634
3686
#if defined(CONFIG_NET_SOCKETS_ENABLE_DTLS )
3635
3687
case TLS_DTLS_HANDSHAKE_TIMEOUT_MIN :
3636
3688
err = tls_opt_dtls_handshake_timeout_set (ctx , optval ,
0 commit comments