HID: logitech-dj/hidpp: Add info/warn/err messages about 27 MHz keyboard encryption
authorHans de Goede <hdegoede@redhat.com>
Sun, 4 Apr 2021 18:56:09 +0000 (20:56 +0200)
committerJiri Kosina <jkosina@suse.cz>
Wed, 5 May 2021 12:28:12 +0000 (14:28 +0200)
By default 27 MHz Logitech keyboards send the keypresses to the receiver
in plain text. Logitech's Windows "Keyboard and Mouse settings" tool allows
configuring encryption for the keyboard wireless link.

Now there also is a Linux tool for setting this up:
https://gitlab.freedesktop.org/jwrdegoede/logitech-27mhz-keyboard-encryption-setup

Once a keyboard is paired in encrypted mode, it will no longer work with
any receiver other then the receiver it was paired with.
If a user accidentally tries to pair another keyboard with the receiver
with which a keyboard has been paired in encrypted mode, then the receiver
looses the encryption key and the originally paired keyboard will no longer
work with either that receiver, or another receiver until the keyboard's
encryption key is rewritten by another encrypted mode pairing using the
tool. Or until it is reset by following a special reset procedure.

This commit adds 3 new log messages related to 27 MHz keyboard link
encryption to the Logitech dj / hidpp drivers:

1. An info level message when keyboard encryption is being used
2. A warning message when keyboard encryption is not used
3. An error message when the encryption key has been lost and the
   keyboard will not work because of this

Messages 2. and 3. contain a link to the userspace tool to setup the
encryption. The linked page also contains instructions to clear the key
(without needing the tool) to help a user recover from the keyboard not
working in case 3.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/hid-logitech-dj.c
drivers/hid/hid-logitech-hidpp.c

index fa835d5..18d37b3 100644 (file)
 #define HIDPP_DEVICE_TYPE_MASK                 GENMASK(3, 0)
 #define HIDPP_LINK_STATUS_MASK                 BIT(6)
 #define HIDPP_MANUFACTURER_MASK                        BIT(7)
+#define HIDPP_27MHZ_SECURE_MASK                        BIT(7)
 
 #define HIDPP_DEVICE_TYPE_KEYBOARD             1
 #define HIDPP_DEVICE_TYPE_MOUSE                        2
@@ -984,6 +985,13 @@ static void logi_hidpp_dev_conn_notif_27mhz(struct hid_device *hdev,
                workitem->reports_supported |= STD_MOUSE | HIDPP;
                break;
        case 3: /* Index 3 is always the keyboard */
+               if (hidpp_report->params[HIDPP_PARAM_DEVICE_INFO] & HIDPP_27MHZ_SECURE_MASK) {
+                       hid_info(hdev, "Keyboard connection is encrypted\n");
+               } else {
+                       hid_warn(hdev, "Keyboard events are send over the air in plain-text / unencrypted\n");
+                       hid_warn(hdev, "See: https://gitlab.freedesktop.org/jwrdegoede/logitech-27mhz-keyboard-encryption-setup/\n");
+               }
+               fallthrough;
        case 4: /* Index 4 is used for an optional separate numpad */
                workitem->device_type = HIDPP_DEVICE_TYPE_KEYBOARD;
                workitem->reports_supported |= STD_KEYBOARD | MULTIMEDIA |
index d598094..69670ca 100644 (file)
@@ -56,6 +56,8 @@ MODULE_PARM_DESC(disable_tap_to_click,
 #define HIDPP_SUB_ID_CONSUMER_VENDOR_KEYS      0x03
 #define HIDPP_SUB_ID_ROLLER                    0x05
 #define HIDPP_SUB_ID_MOUSE_EXTRA_BTNS          0x06
+#define HIDPP_SUB_ID_USER_IFACE_EVENT          0x08
+#define HIDPP_USER_IFACE_EVENT_ENCRYPTION_KEY_LOST     BIT(5)
 
 #define HIDPP_QUIRK_CLASS_WTP                  BIT(0)
 #define HIDPP_QUIRK_CLASS_M560                 BIT(1)
@@ -3528,6 +3530,16 @@ static int hidpp_raw_hidpp_event(struct hidpp_device *hidpp, u8 *data,
                return 1;
        }
 
+       if (hidpp->hid_dev->group == HID_GROUP_LOGITECH_27MHZ_DEVICE &&
+           data[0] == REPORT_ID_HIDPP_SHORT &&
+           data[2] == HIDPP_SUB_ID_USER_IFACE_EVENT &&
+           (data[3] & HIDPP_USER_IFACE_EVENT_ENCRYPTION_KEY_LOST)) {
+               dev_err_ratelimited(&hidpp->hid_dev->dev,
+                       "Error the keyboard's wireless encryption key has been lost, your keyboard will not work unless you re-configure encryption.\n");
+               dev_err_ratelimited(&hidpp->hid_dev->dev,
+                       "See: https://gitlab.freedesktop.org/jwrdegoede/logitech-27mhz-keyboard-encryption-setup/\n");
+       }
+
        if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP20_BATTERY) {
                ret = hidpp20_battery_event_1000(hidpp, data, size);
                if (ret != 0)