@@ -207,6 +207,10 @@ __net_socket struct tls_context {
207207
208208 bool dtls_handshake_on_connect ;
209209#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 */
210214 } options ;
211215
212216#if defined(CONFIG_NET_SOCKETS_ENABLE_DTLS )
@@ -1425,6 +1429,14 @@ static int tls_mbedtls_init(struct tls_context *context, bool is_server)
14251429 mbedtls_ssl_conf_early_data (& context -> config , MBEDTLS_SSL_EARLY_DATA_ENABLED );
14261430#endif
14271431
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+
14281440 ret = mbedtls_ssl_setup (& context -> ssl ,
14291441 & context -> config );
14301442 if (ret != 0 ) {
@@ -2044,6 +2056,42 @@ static int tls_opt_dtls_role_set(struct tls_context *context,
20442056 return 0 ;
20452057}
20462058
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 ) {
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+
20472095static int protocol_check (int family , int type , int * proto )
20482096{
20492097 if (family != AF_INET && family != AF_INET6 ) {
@@ -3631,6 +3679,10 @@ int ztls_setsockopt_ctx(struct tls_context *ctx, int level, int optname,
36313679 err = tls_opt_session_cache_purge_set (ctx , optval , optlen );
36323680 break ;
36333681
3682+ case TLS_CERT_VERIFY_CALLBACK :
3683+ err = tls_opt_cert_verify_callback_set (ctx , optval , optlen );
3684+ break ;
3685+
36343686#if defined(CONFIG_NET_SOCKETS_ENABLE_DTLS )
36353687 case TLS_DTLS_HANDSHAKE_TIMEOUT_MIN :
36363688 err = tls_opt_dtls_handshake_timeout_set (ctx , optval ,
0 commit comments