From 9b6608d29c39f373d4634039f840631187bd2076 Mon Sep 17 00:00:00 2001 From: Tarjei Knapstad Date: Mon, 20 Apr 2026 13:06:40 +0200 Subject: [PATCH 1/3] When using PSK for TLS authentication, look up and use the PSK ID requested by the client in ClientKeyExchange as defined in RFC 4729 --- .../src/nx_secure_generate_premaster_secret.c | 21 ++++++++++++++++--- .../nx_secure_process_client_key_exchange.c | 8 +++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/nx_secure/src/nx_secure_generate_premaster_secret.c b/nx_secure/src/nx_secure_generate_premaster_secret.c index dea984282..f2f41fc97 100644 --- a/nx_secure/src/nx_secure_generate_premaster_secret.c +++ b/nx_secure/src/nx_secure_generate_premaster_secret.c @@ -280,9 +280,24 @@ UINT pre_master_secret_size; /* Now, using the identity as a key, find the PSK in our PSK store. */ if (session_type == NX_SECURE_TLS_SESSION_TYPE_SERVER) { - /* Server just uses its PSK. */ - psk_data = tls_credentials -> nx_secure_tls_psk_store[0].nx_secure_tls_psk_data; - psk_length = tls_credentials -> nx_secure_tls_psk_store[0].nx_secure_tls_psk_data_size; + /* Attempt to find the PSK ID requested by the client in the ClientKeyExchange message. */ + psk_length = 0; + const UINT client_psk_id_size = tls_credentials -> nx_secure_tls_remote_psk_id_size; + const UCHAR* client_psk_id = tls_credentials -> nx_secure_tls_remote_psk_id; + for (i = 0; i < NX_SECURE_TLS_MAX_PSK_KEYS; i++) + { + if ((client_psk_id_size == tls_credentials -> nx_secure_tls_psk_store[i].nx_secure_tls_psk_id_size) && + (NX_SECURE_MEMCMP(client_psk_id, tls_credentials -> nx_secure_tls_psk_store[i].nx_secure_tls_psk_id, client_psk_id_size) == 0)) + { + psk_data = tls_credentials -> nx_secure_tls_psk_store[i].nx_secure_tls_psk_data; + psk_length = tls_credentials -> nx_secure_tls_psk_store[i].nx_secure_tls_psk_data_size; + break; + } + } + if (psk_length == 0) + { + return(NX_OPTION_ERROR); + } } else { diff --git a/nx_secure/src/nx_secure_process_client_key_exchange.c b/nx_secure/src/nx_secure_process_client_key_exchange.c index 97fd37d67..bbbc73a3b 100644 --- a/nx_secure/src/nx_secure_process_client_key_exchange.c +++ b/nx_secure/src/nx_secure_process_client_key_exchange.c @@ -178,6 +178,14 @@ UINT private_key_length; /* Check for PSK ciphersuites and generate the pre-master-secret. */ if (ciphersuite -> nx_secure_tls_public_auth -> nx_crypto_algorithm == NX_CRYPTO_KEY_EXCHANGE_PSK) { + /* Store the requested PSK ID in the TLS credentials. */ + if (message_length < 2) + { + return NX_INVALID_PACKET; + } + tls_credentials -> nx_secure_tls_remote_psk_id_size = ((packet_buffer[0] << 8) | packet_buffer[1]); + NX_SECURE_MEMCPY(tls_credentials -> nx_secure_tls_remote_psk_id, &packet_buffer[2], tls_credentials -> nx_secure_tls_remote_psk_id_size); + status = _nx_secure_generate_premaster_secret(ciphersuite, protocol_version, tls_key_material, tls_credentials, NX_SECURE_TLS_SESSION_TYPE_SERVER, received_remote_credentials, public_cipher_metadata, public_cipher_metadata_size, tls_ecc_curves); From b283e1d509987341bb3d685ce6a6d419c83249e4 Mon Sep 17 00:00:00 2001 From: Tarjei Knapstad Date: Tue, 5 May 2026 09:24:38 +0200 Subject: [PATCH 2/3] Ensure that the size of the PSK ID requested by the client does not exceed NX_SECURE_TLS_MAX_PSK_ID_SIZE --- nx_secure/src/nx_secure_process_client_key_exchange.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nx_secure/src/nx_secure_process_client_key_exchange.c b/nx_secure/src/nx_secure_process_client_key_exchange.c index bbbc73a3b..0e1413531 100644 --- a/nx_secure/src/nx_secure_process_client_key_exchange.c +++ b/nx_secure/src/nx_secure_process_client_key_exchange.c @@ -184,6 +184,10 @@ UINT private_key_length; return NX_INVALID_PACKET; } tls_credentials -> nx_secure_tls_remote_psk_id_size = ((packet_buffer[0] << 8) | packet_buffer[1]); + if (tls_credentials -> nx_secure_tls_remote_psk_id_size > NX_SECURE_TLS_MAX_PSK_ID_SIZE) + { + return NX_SIZE_ERROR; + } NX_SECURE_MEMCPY(tls_credentials -> nx_secure_tls_remote_psk_id, &packet_buffer[2], tls_credentials -> nx_secure_tls_remote_psk_id_size); status = _nx_secure_generate_premaster_secret(ciphersuite, protocol_version, tls_key_material, tls_credentials, From 2cc5eeabbddb2e0b6eb037517ad093cd2ddde183 Mon Sep 17 00:00:00 2001 From: Tarjei Knapstad Date: Fri, 15 May 2026 08:40:02 +0200 Subject: [PATCH 3/3] Return NX_SECURE_TLS_INCORRECT_MESSAGE_LENGTH from _nx_secure_process_client_key_exchange if the message is too short to contain the indicated psk_id_size. Return NX_SECURE_TLS_NO_MATCHING_PSK instead of NX_OPTION_ERROR if the PSK ID requested by the client is not found in the PSK key store in _nx_secure_generate_premaster_secret. --- nx_secure/src/nx_secure_generate_premaster_secret.c | 4 ++-- nx_secure/src/nx_secure_process_client_key_exchange.c | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/nx_secure/src/nx_secure_generate_premaster_secret.c b/nx_secure/src/nx_secure_generate_premaster_secret.c index f2f41fc97..a21ba9404 100644 --- a/nx_secure/src/nx_secure_generate_premaster_secret.c +++ b/nx_secure/src/nx_secure_generate_premaster_secret.c @@ -114,7 +114,7 @@ UINT pre_master_secret_size; #if defined(NX_SECURE_ENABLE_ECC_CIPHERSUITE) && !defined(NX_SECURE_DISABLE_X509) if (ciphersuite -> nx_secure_tls_public_cipher -> nx_crypto_algorithm == NX_CRYPTO_KEY_EXCHANGE_ECDHE) { - #ifdef NX_SECURE_ENABLE_PSK_CIPHERSUITES + #ifdef NX_SECURE_ENABLE_PSK_CIPHERSUITES if(ciphersuite->nx_secure_tls_public_auth->nx_crypto_algorithm == NX_CRYPTO_KEY_EXCHANGE_PSK) { /* From RFC 5489: @@ -296,7 +296,7 @@ UINT pre_master_secret_size; } if (psk_length == 0) { - return(NX_OPTION_ERROR); + return(NX_SECURE_TLS_NO_MATCHING_PSK); } } else diff --git a/nx_secure/src/nx_secure_process_client_key_exchange.c b/nx_secure/src/nx_secure_process_client_key_exchange.c index 0e1413531..8dab66180 100644 --- a/nx_secure/src/nx_secure_process_client_key_exchange.c +++ b/nx_secure/src/nx_secure_process_client_key_exchange.c @@ -188,6 +188,10 @@ UINT private_key_length; { return NX_SIZE_ERROR; } + if (message_length < 2 + tls_credentials -> nx_secure_tls_remote_psk_id_size) + { + return NX_SECURE_TLS_INCORRECT_MESSAGE_LENGTH; + } NX_SECURE_MEMCPY(tls_credentials -> nx_secure_tls_remote_psk_id, &packet_buffer[2], tls_credentials -> nx_secure_tls_remote_psk_id_size); status = _nx_secure_generate_premaster_secret(ciphersuite, protocol_version, tls_key_material, tls_credentials,