linux/drivers/nvme/common
Chris Leech bd7b7ce96d nvme-auth: Hash DH shared secret to create session key
The NVMe Base Specification 8.3.5.5.9 states that the session key Ks
shall be computed from the ephemeral DH key by applying the hash
function selected by the HashID parameter.

The current implementation stores the raw DH shared secret as the
session key without hashing it. This causes redundant hash operations:

1. Augmented challenge computation (section 8.3.5.5.4) requires
   Ca = HMAC(H(g^xy mod p), C). The code compensates by hashing the
   unhashed session key in nvme_auth_augmented_challenge() to produce
   the correct result.

2. PSK generation (section 8.3.5.5.9) requires PSK = HMAC(Ks, C1 || C2)
   where Ks should already be H(g^xy mod p). As the DH shared secret
   is always larger than the HMAC block size, HMAC internally hashes
   it before use, accidentally producing the correct result.

When using secure channel concatenation with bidirectional
authentication, this results in hashing the DH value three times: twice
for augmented challenge calculations and once during PSK generation.

Fix this by:
- Modifying nvme_auth_gen_shared_secret() to hash the DH shared secret
  once after computation: Ks = H(g^xy mod p)
- Removing the hash operation from nvme_auth_augmented_challenge()
  as the session key is now already hashed
- Updating session key buffer size from DH key size to hash output size
- Adding specification references in comments

This avoid storing the raw DH shared secret and reduces the number of
hash operations from three to one when using secure channel
concatenation.

Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Eric Biggers <ebiggers@kernel.org>
Signed-off-by: Chris Leech <cleech@redhat.com>
Signed-off-by: Keith Busch <kbusch@kernel.org>
2026-04-22 13:02:16 -07:00
..
tests nvme-auth: common: add KUnit tests for TLS key derivation 2026-03-27 07:35:00 -07:00
.kunitconfig nvme-auth: common: add KUnit tests for TLS key derivation 2026-03-27 07:35:00 -07:00
auth.c nvme-auth: Hash DH shared secret to create session key 2026-04-22 13:02:16 -07:00
Kconfig nvme-auth: common: remove selections of no-longer used crypto modules 2026-03-27 07:35:03 -07:00
keyring.c nvme-keyring: add nvme_tls_psk_refresh() 2025-03-20 16:53:54 -07:00
Makefile nvme-auth: common: add KUnit tests for TLS key derivation 2026-03-27 07:35:00 -07:00