[PATCH] wolfssl: Implement EAP-FAST
Juliusz Sosinowicz
juliusz at wolfssl.com
Wed May 28 05:15:50 PDT 2025
Would it be possible to apply this patch and the
"run_ap_wpa2_eap_tls_intermediate_ca_ocsp[_revoked]: fix cert config for
wolfSSL" patch please?
Sincerely
Juliusz Sosinowicz
On 04/03/2025 14:11, Juliusz Sosinowicz wrote:
> Add tls_session_ticket_ext_cb and use the new wolfSSL_set_session_ticket_ext_cb API.
>
> Signed-off-by: Juliusz Sosinowicz <juliusz at wolfssl.com>
> ---
> src/crypto/tls_wolfssl.c | 75 ++++++++++++++++++++++++++++++----------
> 1 file changed, 57 insertions(+), 18 deletions(-)
>
> diff --git a/src/crypto/tls_wolfssl.c b/src/crypto/tls_wolfssl.c
> index 3bf52d64eb..c6a801a2e5 100644
> --- a/src/crypto/tls_wolfssl.c
> +++ b/src/crypto/tls_wolfssl.c
> @@ -94,7 +94,8 @@ struct tls_connection {
> #if defined(EAP_FAST) || defined(EAP_FAST_DYNAMIC) || defined(EAP_SERVER_FAST)
> tls_session_ticket_cb session_ticket_cb;
> void *session_ticket_cb_ctx;
> - byte session_ticket[SESSION_TICKET_LEN];
> + u8 *session_ticket;
> + size_t session_ticket_len;
> #endif
> unsigned int ca_cert_verify:1;
> unsigned int cert_probe:1;
> @@ -545,6 +546,7 @@ void tls_connection_deinit(void *tls_ctx, struct tls_connection *conn)
> os_free(conn->domain_match);
> os_free(conn->peer_subject);
> os_free(conn->check_cert_subject);
> + os_free(conn->session_ticket);
>
> /* self */
> os_free(conn);
> @@ -2534,7 +2536,8 @@ int tls_connection_get_eap_fast_key(void *tls_ctx, struct tls_connection *conn,
> }
>
>
> -#if defined(EAP_FAST) || defined(EAP_FAST_DYNAMIC) || defined(EAP_SERVER_FAST)
> +#if LIBWOLFSSL_VERSION_HEX >= 0x05007002 && \
> + (defined(EAP_FAST) || defined(EAP_FAST_DYNAMIC) || defined(EAP_SERVER_FAST))
>
> int tls_connection_client_hello_ext(void *ssl_ctx, struct tls_connection *conn,
> int ext_type, const u8 *data,
> @@ -2559,33 +2562,60 @@ static int tls_sess_sec_cb(WOLFSSL *s, void *secret, int *secret_len, void *arg)
> int ret;
> unsigned char client_random[RAN_LEN];
> unsigned char server_random[RAN_LEN];
> - word32 ticket_len = sizeof(conn->session_ticket);
>
> if (!conn || !conn->session_ticket_cb)
> - return 1;
> + return -1;
> +
> + wpa_printf(MSG_DEBUG, "wolfSSL: %s", __func__);
>
> if (wolfSSL_get_client_random(s, client_random,
> sizeof(client_random)) == 0 ||
> wolfSSL_get_server_random(s, server_random,
> - sizeof(server_random)) == 0 ||
> - wolfSSL_get_SessionTicket(s, conn->session_ticket,
> - &ticket_len) != 1)
> - return 1;
> -
> - if (ticket_len == 0)
> - return 0;
> + sizeof(server_random)) == 0)
> + return -1;
>
> ret = conn->session_ticket_cb(conn->session_ticket_cb_ctx,
> - conn->session_ticket, ticket_len,
> + conn->session_ticket, conn->session_ticket_len,
> client_random, server_random, secret);
> +
> + wpa_printf(MSG_DEBUG, "wolfSSL: %s conn->session_ticket_cb: %d", __func__, ret);
> +
> + os_free(conn->session_ticket);
> + conn->session_ticket = NULL;
> +
> if (ret <= 0)
> - return 1;
> + return -1;
>
> *secret_len = SECRET_LEN;
> return 0;
> }
>
> -#endif /* EAP_FAST || EAP_FAST_DYNAMIC || EAP_SERVER_FAST */
> +static int tls_session_ticket_ext_cb(SSL *s, const unsigned char *data,
> + int len, void *arg)
> +{
> + struct tls_connection *conn = arg;
> +
> + if (conn == NULL || conn->session_ticket_cb == NULL)
> + return 0;
> +
> + wpa_printf(MSG_DEBUG, "wolfSSL: %s: length=%d", __func__, len);
> +
> + os_free(conn->session_ticket);
> + conn->session_ticket = NULL;
> +
> + wpa_hexdump(MSG_DEBUG, "wolfSSL: ClientHello SessionTicket "
> + "extension", data, len);
> +
> + conn->session_ticket = os_memdup(data, len);
> + if (conn->session_ticket == NULL)
> + return 0;
> +
> + conn->session_ticket_len = len;
> +
> + return 1;
> +}
> +#endif /* LIBWOLFSSL_VERSION_HEX >= 0x05007002 &&
> + * (EAP_FAST || EAP_FAST_DYNAMIC || EAP_SERVER_FAST) */
>
>
> int tls_connection_set_session_ticket_cb(void *tls_ctx,
> @@ -2593,23 +2623,32 @@ int tls_connection_set_session_ticket_cb(void *tls_ctx,
> tls_session_ticket_cb cb,
> void *ctx)
> {
> -#if defined(EAP_FAST) || defined(EAP_FAST_DYNAMIC) || defined(EAP_SERVER_FAST)
> + /* wolfSSL_set_session_ticket_ext_cb added in wolfSSL 5.7.2 */
> +#if LIBWOLFSSL_VERSION_HEX >= 0x05007002 && \
> + (defined(EAP_FAST) || defined(EAP_FAST_DYNAMIC) || defined(EAP_SERVER_FAST))
> conn->session_ticket_cb = cb;
> conn->session_ticket_cb_ctx = ctx;
>
> if (cb) {
> if (wolfSSL_set_session_secret_cb(conn->ssl, tls_sess_sec_cb,
> - conn) != 1)
> + conn) != 1)
> + return -1;
> + if (wolfSSL_set_session_ticket_ext_cb(conn->ssl,
> + tls_session_ticket_ext_cb, conn) != 1)
> return -1;
> } else {
> if (wolfSSL_set_session_secret_cb(conn->ssl, NULL, NULL) != 1)
> return -1;
> + if (wolfSSL_set_session_ticket_ext_cb(conn->ssl, NULL, NULL) != 1)
> + return -1;
> }
>
> return 0;
> -#else /* EAP_FAST || EAP_FAST_DYNAMIC || EAP_SERVER_FAST */
> +#else /* LIBWOLFSSL_VERSION_HEX >= 0x05007002 &&
> + * (EAP_FAST || EAP_FAST_DYNAMIC || EAP_SERVER_FAST) */
> return -1;
> -#endif /* EAP_FAST || EAP_FAST_DYNAMIC || EAP_SERVER_FAST */
> +#endif /* LIBWOLFSSL_VERSION_HEX >= 0x05007002 &&
> + * (EAP_FAST || EAP_FAST_DYNAMIC || EAP_SERVER_FAST) */
> }
>
>
More information about the Hostap
mailing list