From d056b382dd7c63768d17fb1ddf4635f9f52f0089 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20PORTAY?= Date: Sat, 19 Mar 2022 18:01:42 +0100 Subject: [PATCH] genesys: usbhub: Add has-public-key private flag The Genesys Logic USB Hub does have support for public-key. This adds the private flag has-public-key, and sets that flag for the HP USB Hubs only. Also, this authenticates during setup only if that flag is set. --- plugins/genesys/fu-genesys-usbhub-device.c | 55 +++++++++++++++------- plugins/genesys/genesys.quirk | 6 +-- 2 files changed, 40 insertions(+), 21 deletions(-) diff --git a/plugins/genesys/fu-genesys-usbhub-device.c b/plugins/genesys/fu-genesys-usbhub-device.c index 3dc3d8fd8..b17fc7f86 100644 --- a/plugins/genesys/fu-genesys-usbhub-device.c +++ b/plugins/genesys/fu-genesys-usbhub-device.c @@ -23,6 +23,14 @@ * Device has a MStar scaler attached via I2C. */ #define FU_GENESYS_USBHUB_FLAG_HAS_MSTAR_SCALER (1 << 0) +/** + * FU_GENESYS_USBHUB_FLAG_HAS_PUBLIC_KEY: + * + * Device has a public-key appended to firmware. + * + * Since 1.7.7 + */ +#define FU_GENESYS_USBHUB_FLAG_HAS_PUBLIC_KEY (1 << 1) #define GENESYS_USBHUB_STATIC_TOOL_DESC_IDX_USB_3_0 0x84 #define GENESYS_USBHUB_DYNAMIC_TOOL_DESC_IDX_USB_3_0 0x85 @@ -616,8 +624,10 @@ static gboolean fu_genesys_usbhub_device_detach(FuDevice *device, FuProgress *progress, GError **error) { FuGenesysUsbhubDevice *self = FU_GENESYS_USBHUB_DEVICE(device); - if (!fu_genesys_usbhub_device_authenticate(self, error)) - return FALSE; + if (fu_device_has_private_flag(device, FU_GENESYS_USBHUB_FLAG_HAS_PUBLIC_KEY)) { + if (!fu_genesys_usbhub_device_authenticate(self, error)) + return FALSE; + } if (!fu_genesys_usbhub_device_set_isp_mode(self, ISP_ENTER, error)) return FALSE; @@ -695,7 +705,6 @@ fu_genesys_usbhub_device_setup(FuDevice *device, GError **error) g_autoptr(GError) error_local = NULL; g_autoptr(GBytes) blob = NULL; g_autofree guint8 *buf = NULL; - g_autofree gchar *guid = NULL; /* FuUsbDevice->setup */ if (!FU_DEVICE_CLASS(fu_genesys_usbhub_device_parent_class)->setup(device, error)) { @@ -815,8 +824,10 @@ fu_genesys_usbhub_device_setup(FuDevice *device, GError **error) } } - if (!fu_genesys_usbhub_device_authenticate(self, error)) - return FALSE; + if (fu_device_has_private_flag(device, FU_GENESYS_USBHUB_FLAG_HAS_PUBLIC_KEY)) { + if (!fu_genesys_usbhub_device_authenticate(self, error)) + return FALSE; + } if (!fu_genesys_usbhub_device_set_isp_mode(self, ISP_ENTER, error)) return FALSE; self->cfi_device = fu_genesys_usbhub_device_cfi_setup(self, error); @@ -927,19 +938,24 @@ fu_genesys_usbhub_device_setup(FuDevice *device, GError **error) self->write_recovery_bank = address == self->fw_bank_addr[1]; } - /* get public key */ - if (!fu_memcpy_safe(self->public_key, - sizeof(self->public_key), - 0, /* dst */ - g_bytes_get_data(blob, NULL), - g_bytes_get_size(blob), - self->fw_data_total_count, /* src */ - sizeof(self->public_key), - error)) - return FALSE; - guid = - fwupd_guid_hash_data(self->public_key, sizeof(self->public_key), FWUPD_GUID_FLAG_NONE); - fu_device_add_instance_strup(device, "PUBKEY", guid); + /* has public key */ + if (fu_device_has_private_flag(device, FU_GENESYS_USBHUB_FLAG_HAS_PUBLIC_KEY)) { + g_autofree gchar *guid = NULL; + if (!fu_memcpy_safe(self->public_key, + sizeof(self->public_key), + 0, /* dst */ + g_bytes_get_data(blob, NULL), + g_bytes_get_size(blob), + self->fw_data_total_count, /* src */ + sizeof(self->public_key), + error)) + return FALSE; + guid = fwupd_guid_hash_data(self->public_key, + sizeof(self->public_key), + FWUPD_GUID_FLAG_NONE); + fu_device_add_instance_strup(device, "PUBKEY", guid); + } + fu_device_build_instance_id(device, NULL, "USB", "VID", "PID", "PUBKEY", NULL); /* have MStar scaler */ @@ -1379,6 +1395,9 @@ fu_genesys_usbhub_device_init(FuGenesysUsbhubDevice *self) fu_device_register_private_flag(FU_DEVICE(self), FU_GENESYS_USBHUB_FLAG_HAS_MSTAR_SCALER, "has-mstar-scaler"); + fu_device_register_private_flag(FU_DEVICE(self), + FU_GENESYS_USBHUB_FLAG_HAS_PUBLIC_KEY, + "has-public-key"); self->vcs.req_switch = GENESYS_USBHUB_GL_HUB_SWITCH; self->vcs.req_read = GENESYS_USBHUB_GL_HUB_READ; self->vcs.req_write = GENESYS_USBHUB_GL_HUB_WRITE; diff --git a/plugins/genesys/genesys.quirk b/plugins/genesys/genesys.quirk index 6d8e50dde..69146482f 100644 --- a/plugins/genesys/genesys.quirk +++ b/plugins/genesys/genesys.quirk @@ -4,7 +4,7 @@ [USB\VID_03F0&PID_0610] Plugin = genesys Name = HP USB-C Controller -Flags = dual-image +Flags = dual-image,has-public-key GenesysUsbhubSwitchRequest = 0xA1 GenesysUsbhubReadRequest = 0xA2 GenesysUsbhubWriteRequest = 0xA3 @@ -12,7 +12,7 @@ GenesysUsbhubWriteRequest = 0xA3 [USB\VID_03F0&PID_0610&PUBKEY_AB859399-95B8-5817-B521-9AD8CC7F5BD6] Plugin = genesys Name = HP M24fd USB-C Controller -Flags = dual-image,has-mstar-scaler +Flags = dual-image,has-public-key,has-mstar-scaler GenesysUsbhubSwitchRequest = 0xA1 GenesysUsbhubReadRequest = 0xA2 GenesysUsbhubWriteRequest = 0xA3 @@ -20,7 +20,7 @@ GenesysUsbhubWriteRequest = 0xA3 [USB\VID_03F0&PID_0610&PUBKEY_6BE97D77-C2BA-5AA2-B7DF-B9B318BEC2B5] Plugin = genesys Name = HP M27fd USB-C Controller -Flags = dual-image,has-mstar-scaler +Flags = dual-image,has-public-key,has-mstar-scaler GenesysUsbhubSwitchRequest = 0xA1 GenesysUsbhubReadRequest = 0xA2 GenesysUsbhubWriteRequest = 0xA3