Skip to content

Commit 5bc46b4

Browse files
Hannes Reineckekeithbusch
authored andcommitted
nvme-tcp: check for invalidated or revoked key
key_lookup() will always return a key, even if that key is revoked or invalidated. So check for invalid keys before continuing. Signed-off-by: Hannes Reinecke <[email protected]> Reviewed-by: Sagi Grimberg <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]> Signed-off-by: Keith Busch <[email protected]>
1 parent 3638957 commit 5bc46b4

File tree

5 files changed

+30
-3
lines changed

5 files changed

+30
-3
lines changed

drivers/nvme/common/keyring.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,28 @@ key_serial_t nvme_keyring_id(void)
2020
}
2121
EXPORT_SYMBOL_GPL(nvme_keyring_id);
2222

23+
static bool nvme_tls_psk_revoked(struct key *psk)
24+
{
25+
return test_bit(KEY_FLAG_REVOKED, &psk->flags) ||
26+
test_bit(KEY_FLAG_INVALIDATED, &psk->flags);
27+
}
28+
29+
struct key *nvme_tls_key_lookup(key_serial_t key_id)
30+
{
31+
struct key *key = key_lookup(key_id);
32+
33+
if (IS_ERR(key)) {
34+
pr_err("key id %08x not found\n", key_id);
35+
return key;
36+
}
37+
if (nvme_tls_psk_revoked(key)) {
38+
pr_err("key id %08x revoked\n", key_id);
39+
return ERR_PTR(-EKEYREVOKED);
40+
}
41+
return key;
42+
}
43+
EXPORT_SYMBOL_GPL(nvme_tls_key_lookup);
44+
2345
static void nvme_tls_psk_describe(const struct key *key, struct seq_file *m)
2446
{
2547
seq_puts(m, key->description);

drivers/nvme/host/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ config NVME_HOST_AUTH
109109
bool "NVMe over Fabrics In-Band Authentication in host side"
110110
depends on NVME_CORE
111111
select NVME_AUTH
112+
select NVME_KEYRING if NVME_TCP_TLS
112113
help
113114
This provides support for NVMe over Fabrics In-Band Authentication in
114115
host side.

drivers/nvme/host/fabrics.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -665,7 +665,7 @@ static struct key *nvmf_parse_key(int key_id)
665665
return ERR_PTR(-EINVAL);
666666
}
667667

668-
key = key_lookup(key_id);
668+
key = nvme_tls_key_lookup(key_id);
669669
if (IS_ERR(key))
670670
pr_err("key id %08x not found\n", key_id);
671671
else

drivers/nvme/host/tcp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1596,7 +1596,7 @@ static void nvme_tcp_tls_done(void *data, int status, key_serial_t pskid)
15961596
goto out_complete;
15971597
}
15981598

1599-
tls_key = key_lookup(pskid);
1599+
tls_key = nvme_tls_key_lookup(pskid);
16001600
if (IS_ERR(tls_key)) {
16011601
dev_warn(ctrl->ctrl.device, "queue %d: Invalid key %x\n",
16021602
qid, pskid);

include/linux/nvme-keyring.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ key_serial_t nvme_tls_psk_default(struct key *keyring,
1212
const char *hostnqn, const char *subnqn);
1313

1414
key_serial_t nvme_keyring_id(void);
15-
15+
struct key *nvme_tls_key_lookup(key_serial_t key_id);
1616
#else
1717

1818
static inline key_serial_t nvme_tls_psk_default(struct key *keyring,
@@ -24,5 +24,9 @@ static inline key_serial_t nvme_keyring_id(void)
2424
{
2525
return 0;
2626
}
27+
static inline struct key *nvme_tls_key_lookup(key_serial_t key_id)
28+
{
29+
return ERR_PTR(-ENOTSUPP);
30+
}
2731
#endif /* !CONFIG_NVME_KEYRING */
2832
#endif /* _NVME_KEYRING_H */

0 commit comments

Comments
 (0)