[PATCH 69/92] NAN: Add a function for deriving ND-PMK from KDK

Andrei Otcheretianski andrei.otcheretianski at intel.com
Wed Apr 22 05:24:00 PDT 2026


From: Avraham Stern <avraham.stern at intel.com>

Add a function for deriving the ND-PMK from the KDK.

Signed-off-by: Avraham Stern <avraham.stern at intel.com>
---
 src/nan/nan_crypto.c | 30 ++++++++++++++++++++++++++++++
 src/nan/nan_i.h      |  4 ++++
 2 files changed, 34 insertions(+)

diff --git a/src/nan/nan_crypto.c b/src/nan/nan_crypto.c
index c0aea20c90..7f4f50971c 100644
--- a/src/nan/nan_crypto.c
+++ b/src/nan/nan_crypto.c
@@ -526,6 +526,36 @@ int nan_crypto_derive_kek(const u8 *kdk, size_t kdk_len,
 }
 
 
+/*
+ * nan_crypto_derive_nd_pmk_from_kdk - Derive ND-PMK from NM-KDK
+ *
+ * @kdk: NM-KDK (NAN Master Key Derivation Key)
+ * @kdk_len: Length of KDK in bytes
+ * @cipher: Cipher suite identifier (NAN_CS_PK_PASN_128 or NAN_CS_PK_PASN_256)
+ * @initiator_nmi: Pairing Initiator NMI address (6 bytes)
+ * @responder_nmi: Pairing Responder NMI address (6 bytes)
+ * @nd_pmk: Buffer for the derived ND-PMK (must be 32 bytes)
+ * Returns: 0 on success, -1 on failure
+ *
+ * ND-PMK = KDF-HASH-256(NM-KDK, "NDP PMK Derivation",
+ *                       Pairing Initiator NMI || Pairing Responder NMI)
+ */
+int nan_crypto_derive_nd_pmk_from_kdk(const u8 *kdk, size_t kdk_len,
+				      enum nan_cipher_suite_id cipher,
+				      const u8 *initiator_nmi,
+				      const u8 *responder_nmi, u8 *nd_pmk)
+{
+	const char *label = "NDP PMK Derivation";
+
+	wpa_printf(MSG_DEBUG, "NAN: Deriving ND-PMK from NM-KDK");
+
+	/* ND-PMK always uses SHA-256, resulting in 32 bytes */
+	return nan_crypto_derive_from_kdk(kdk, kdk_len, cipher, label,
+					  initiator_nmi, responder_nmi, nd_pmk,
+					  PMK_LEN);
+}
+
+
 /*
  * nan_crypto_encrypt_key - Encrypt key data using AES Key Wrap (RFC 3394)
  *
diff --git a/src/nan/nan_i.h b/src/nan/nan_i.h
index 82f3cb0763..598b552e81 100644
--- a/src/nan/nan_i.h
+++ b/src/nan/nan_i.h
@@ -747,6 +747,10 @@ int nan_crypto_derive_kek(const u8 *kdk, size_t kdk_len,
 			  enum nan_cipher_suite_id cipher,
 			  const u8 *initiator_nmi, const u8 *responder_nmi,
 			  struct wpa_ptk *ptk);
+int nan_crypto_derive_nd_pmk_from_kdk(const u8 *kdk, size_t kdk_len,
+				      enum nan_cipher_suite_id cipher,
+				      const u8 *initiator_nmi,
+				      const u8 *responder_nmi, u8 *nd_pmk);
 struct wpabuf *nan_crypto_encrypt_key_data(const struct wpabuf *key_data,
 					   const u8 *kek, size_t kek_len);
 struct wpabuf *nan_crypto_decrypt_key_data(const u8 *kek, size_t kek_len,
-- 
2.53.0




More information about the Hostap mailing list