From 96e6369b23b737292afe28c22e1807f51b376e29 Mon Sep 17 00:00:00 2001 From: Yves Marx Date: Sun, 5 Jul 2026 10:56:07 +0200 Subject: [PATCH] Fix: in the WebSocket Client add-on, fix the base64 encoding --- addons/websocket/nx_websocket_client.c | 8 +++++++- addons/websocket/nx_websocket_client.h | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/addons/websocket/nx_websocket_client.c b/addons/websocket/nx_websocket_client.c index 5b4de83fd..b644c66c1 100644 --- a/addons/websocket/nx_websocket_client.c +++ b/addons/websocket/nx_websocket_client.c @@ -512,6 +512,9 @@ NX_PACKET *packet_ptr; client_ptr -> nx_websocket_client_guid[i] = (UCHAR)(NX_RAND()); } + /* Set the last extra byte of the buffer to be zero, since the function _nx_utility_base64_encode will use this extra-byte for calculation */ + client_ptr -> nx_websocket_client_guid[NX_WEBSOCKET_CLIENT_GUID_SIZE] = 0; + /* Encode the GUID as key. */ _nx_utility_base64_encode(client_ptr -> nx_websocket_client_guid, NX_WEBSOCKET_CLIENT_GUID_SIZE, client_ptr -> nx_websocket_client_key, NX_WEBSOCKET_CLIENT_KEY_SIZE, @@ -963,7 +966,7 @@ UCHAR *field_name; UINT field_name_length; UCHAR *field_value; UINT field_value_length; -UCHAR digest[NX_WEBSOCKET_ACCEPT_DIGEST_SIZE]; +UCHAR digest[NX_WEBSOCKET_ACCEPT_DIGEST_SIZE + 1]; UCHAR key[NX_WEBSOCKET_ACCEPT_KEY_SIZE + 1]; UINT key_size = 0; UCHAR upgrade_flag = NX_FALSE; @@ -1104,6 +1107,9 @@ UCHAR accept_cnt = 0; _nx_sha1_update(&(client_ptr -> nx_websocket_client_sha1), (UCHAR*)NX_WEBSOCKET_ACCEPT_PREDEFINED_GUID, NX_WEBSOCKET_ACCEPT_PREDEFINED_GUID_SIZE); _nx_sha1_digest_calculate(&(client_ptr -> nx_websocket_client_sha1), digest); + /* Set the last extra byte of the digest to be zero, since the function _nx_utility_base64_encode will use this byte for calculation */ + digest[NX_WEBSOCKET_ACCEPT_DIGEST_SIZE] = 0; + /* Encode the hash and compare it with the field value from the server. */ _nx_utility_base64_encode(digest, NX_WEBSOCKET_ACCEPT_DIGEST_SIZE, key, (NX_WEBSOCKET_ACCEPT_KEY_SIZE + 1), &key_size); if ((field_value_length != NX_WEBSOCKET_ACCEPT_KEY_SIZE) || (memcmp((void *)field_value, (void *)key, NX_WEBSOCKET_ACCEPT_KEY_SIZE))) /* Use case of memcpy is verified. */ diff --git a/addons/websocket/nx_websocket_client.h b/addons/websocket/nx_websocket_client.h index b06f9463b..90190ed66 100644 --- a/addons/websocket/nx_websocket_client.h +++ b/addons/websocket/nx_websocket_client.h @@ -173,7 +173,7 @@ typedef struct NX_WEBSOCKET_CLIENT_STRUCT NX_PACKET *nx_websocket_client_processing_packet; /* Globally Unique Identifier. */ - UCHAR nx_websocket_client_guid[NX_WEBSOCKET_CLIENT_GUID_SIZE]; + UCHAR nx_websocket_client_guid[NX_WEBSOCKET_CLIENT_GUID_SIZE + 1]; /* Protocol Name and length */ UCHAR *nx_websocket_client_subprotocol;