From 76579d21abb2ae22a7e19be1dd71af9cad10da4f Mon Sep 17 00:00:00 2001 From: Johann Fischer Date: Tue, 17 Jun 2025 10:20:46 +0200 Subject: [PATCH] usb: device_next: allow to limit number or digits in serial number Add Kconfig option to limit the length requested from HWINFO to a meaningful number of digits. Also, check the length returned by the HWINFO driver and rename the variables to a more suitable name. Signed-off-by: Johann Fischer --- subsys/usb/device_next/Kconfig | 10 ++++++++++ subsys/usb/device_next/usbd_ch9.c | 25 +++++++++++++------------ 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/subsys/usb/device_next/Kconfig b/subsys/usb/device_next/Kconfig index b72de53f0b3..18b6860b0e6 100644 --- a/subsys/usb/device_next/Kconfig +++ b/subsys/usb/device_next/Kconfig @@ -96,6 +96,16 @@ config USBD_MSG_WORK_DELAY Message work may need to be delayed because the device stack is not yet ready to publish the message. The delay unit is milliseconds. +config USBD_HWINFO_DEVID_LENGTH + int "The length of the device ID requested from HWINFO in bytes" + depends on HWINFO + range 8 128 + default 16 + help + Each byte represents two digits in the serial number string + descriptor. This option can be used to limit the length requested + from HWINFO to a meaningful number of digits. + rsource "class/Kconfig" rsource "app/Kconfig.cdc_acm_serial" diff --git a/subsys/usb/device_next/usbd_ch9.c b/subsys/usb/device_next/usbd_ch9.c index 3adb3574f0c..599eb161178 100644 --- a/subsys/usb/device_next/usbd_ch9.c +++ b/subsys/usb/device_next/usbd_ch9.c @@ -533,13 +533,13 @@ static int sreq_get_desc_cfg(struct usbd_context *const uds_ctx, return 0; } -#define USBD_HWID_SN_MAX 32U +#define USBD_SN_ASCII7_LENGTH (CONFIG_USBD_HWINFO_DEVID_LENGTH * 2) /* Generate valid USB device serial number from hwid */ -static ssize_t get_sn_from_hwid(uint8_t sn[static USBD_HWID_SN_MAX]) +static ssize_t get_sn_from_hwid(uint8_t sn[static USBD_SN_ASCII7_LENGTH]) { static const char hex[] = "0123456789ABCDEF"; - uint8_t hwid[USBD_HWID_SN_MAX / 2U]; + uint8_t hwid[USBD_SN_ASCII7_LENGTH / 2U]; ssize_t hwid_len = -ENOSYS; if (IS_ENABLED(CONFIG_HWINFO)) { @@ -554,36 +554,37 @@ static ssize_t get_sn_from_hwid(uint8_t sn[static USBD_HWID_SN_MAX]) return hwid_len; } - for (ssize_t i = 0; i < hwid_len; i++) { + for (ssize_t i = 0; i < MIN(hwid_len, sizeof(hwid)); i++) { sn[i * 2] = hex[hwid[i] >> 4]; sn[i * 2 + 1] = hex[hwid[i] & 0xF]; } - return hwid_len * 2; + return MIN(hwid_len, sizeof(hwid)) * 2; } /* Copy and convert ASCII-7 string descriptor to UTF16-LE */ static void string_ascii7_to_utf16le(struct usbd_desc_node *const dn, struct net_buf *const buf, const uint16_t wLength) { - uint8_t hwid_sn[USBD_HWID_SN_MAX]; + uint8_t sn_ascii7_str[USBD_SN_ASCII7_LENGTH]; struct usb_desc_header head = { .bDescriptorType = dn->bDescriptorType, }; - uint8_t *ascii7_str; + const uint8_t *ascii7_str; size_t len; size_t i; - if (dn->str.utype == USBD_DUT_STRING_SERIAL_NUMBER && dn->str.use_hwinfo) { - ssize_t hwid_len = get_sn_from_hwid(hwid_sn); + if (IS_ENABLED(CONFIG_HWINFO) && + dn->str.utype == USBD_DUT_STRING_SERIAL_NUMBER && dn->str.use_hwinfo) { + ssize_t sn_ascii7_str_len = get_sn_from_hwid(sn_ascii7_str); - if (hwid_len < 0) { + if (sn_ascii7_str_len < 0) { errno = -ENOTSUP; return; } - head.bLength = sizeof(head) + hwid_len * 2; - ascii7_str = hwid_sn; + head.bLength = sizeof(head) + sn_ascii7_str_len * 2; + ascii7_str = sn_ascii7_str; } else { head.bLength = dn->bLength; ascii7_str = (uint8_t *)dn->ptr;