| From e545f0d8a54a9594fe604d67d80ca6fddf72ca59 Mon Sep 17 00:00:00 2001 |
| From: "Bernat, Yehezkel" <yehezkel.bernat@intel.com> |
| Date: Tue, 15 Aug 2017 08:19:20 +0300 |
| Subject: thunderbolt: Allow clearing the key |
| |
| From: Bernat, Yehezkel <yehezkel.bernat@intel.com> |
| |
| commit e545f0d8a54a9594fe604d67d80ca6fddf72ca59 upstream. |
| |
| If secure authentication of a devices fails, either because the device |
| already has another key uploaded, or there is some other error sending |
| challenge to the device, and the user only wants to approve the device |
| just once (without a new key being uploaded to the device) the current |
| implementation does not allow this because the key cannot be cleared |
| once set even if we allow it to be changed. |
| |
| Make this scenario possible and allow clearing the key by writing |
| empty string to the key sysfs file. |
| |
| Signed-off-by: Yehezkel Bernat <yehezkel.bernat@intel.com> |
| Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| Documentation/ABI/testing/sysfs-bus-thunderbolt | 2 ++ |
| drivers/thunderbolt/switch.c | 15 +++++++++++---- |
| 2 files changed, 13 insertions(+), 4 deletions(-) |
| |
| --- a/Documentation/ABI/testing/sysfs-bus-thunderbolt |
| +++ b/Documentation/ABI/testing/sysfs-bus-thunderbolt |
| @@ -45,6 +45,8 @@ Contact: thunderbolt-software@lists.01.o |
| Description: When a devices supports Thunderbolt secure connect it will |
| have this attribute. Writing 32 byte hex string changes |
| authorization to use the secure connection method instead. |
| + Writing an empty string clears the key and regular connection |
| + method can be used again. |
| |
| What: /sys/bus/thunderbolt/devices/.../device |
| Date: Sep 2017 |
| --- a/drivers/thunderbolt/switch.c |
| +++ b/drivers/thunderbolt/switch.c |
| @@ -807,8 +807,11 @@ static ssize_t key_store(struct device * |
| struct tb_switch *sw = tb_to_switch(dev); |
| u8 key[TB_SWITCH_KEY_SIZE]; |
| ssize_t ret = count; |
| + bool clear = false; |
| |
| - if (hex2bin(key, buf, sizeof(key))) |
| + if (!strcmp(buf, "\n")) |
| + clear = true; |
| + else if (hex2bin(key, buf, sizeof(key))) |
| return -EINVAL; |
| |
| if (mutex_lock_interruptible(&switch_lock)) |
| @@ -818,9 +821,13 @@ static ssize_t key_store(struct device * |
| ret = -EBUSY; |
| } else { |
| kfree(sw->key); |
| - sw->key = kmemdup(key, sizeof(key), GFP_KERNEL); |
| - if (!sw->key) |
| - ret = -ENOMEM; |
| + if (clear) { |
| + sw->key = NULL; |
| + } else { |
| + sw->key = kmemdup(key, sizeof(key), GFP_KERNEL); |
| + if (!sw->key) |
| + ret = -ENOMEM; |
| + } |
| } |
| |
| mutex_unlock(&switch_lock); |