Takashi Iwai 4694e7
From 89b89e52153fda2733562776c7c9d9d3ebf8dd6d Mon Sep 17 00:00:00 2001
Takashi Iwai 4694e7
From: Hector Martin <marcan@marcan.st>
Takashi Iwai 4694e7
Date: Tue, 14 Feb 2023 18:24:19 +0900
Takashi Iwai 4694e7
Subject: [PATCH] wifi: brcmfmac: cfg80211: Pass the PMK in binary instead of hex
Takashi Iwai 4694e7
Git-commit: 89b89e52153fda2733562776c7c9d9d3ebf8dd6d
Takashi Iwai 4694e7
Patch-mainline: v6.4-rc1
Takashi Iwai 4694e7
References: git-fixes
Takashi Iwai 4694e7
Takashi Iwai 4694e7
Apparently the hex passphrase mechanism does not work on newer
Takashi Iwai 4694e7
chips/firmware (e.g. BCM4387). It seems there was a simple way of
Takashi Iwai 4694e7
passing it in binary all along, so use that and avoid the hexification.
Takashi Iwai 4694e7
Takashi Iwai 4694e7
OpenBSD has been doing it like this from the beginning, so this should
Takashi Iwai 4694e7
work on all chips.
Takashi Iwai 4694e7
Takashi Iwai 4694e7
Also clear the structure before setting the PMK. This was leaking
Takashi Iwai 4694e7
uninitialized stack contents to the device.
Takashi Iwai 4694e7
Takashi Iwai 4694e7
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Takashi Iwai 4694e7
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
Takashi Iwai 4694e7
Signed-off-by: Hector Martin <marcan@marcan.st>
Takashi Iwai 4694e7
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Takashi Iwai 4694e7
Link: https://lore.kernel.org/r/20230214092423.15175-6-marcan@marcan.st
Takashi Iwai 4694e7
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 4694e7
Takashi Iwai 4694e7
---
Takashi Iwai 4694e7
 .../wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 13 +++++++------
Takashi Iwai 4694e7
 1 file changed, 7 insertions(+), 6 deletions(-)
Takashi Iwai 4694e7
Takashi Iwai 4694e7
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
Takashi Iwai 4694e7
index b561ca6b467e..e0a70a671550 100644
Takashi Iwai 4694e7
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
Takashi Iwai 4694e7
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
Takashi Iwai 4694e7
@@ -1686,13 +1686,14 @@ static int brcmf_set_pmk(struct brcmf_if *ifp, const u8 *pmk_data, u16 pmk_len)
Takashi Iwai 4694e7
 {
Takashi Iwai 4694e7
 	struct brcmf_pub *drvr = ifp->drvr;
Takashi Iwai 4694e7
 	struct brcmf_wsec_pmk_le pmk;
Takashi Iwai 4694e7
-	int i, err;
Takashi Iwai 4694e7
+	int err;
Takashi Iwai 4694e7
 
Takashi Iwai 4694e7
-	/* convert to firmware key format */
Takashi Iwai 4694e7
-	pmk.key_len = cpu_to_le16(pmk_len << 1);
Takashi Iwai 4694e7
-	pmk.flags = cpu_to_le16(BRCMF_WSEC_PASSPHRASE);
Takashi Iwai 4694e7
-	for (i = 0; i < pmk_len; i++)
Takashi Iwai 4694e7
-		snprintf(&pmk.key[2 * i], 3, "%02x", pmk_data[i]);
Takashi Iwai 4694e7
+	memset(&pmk, 0, sizeof(pmk));
Takashi Iwai 4694e7
+
Takashi Iwai 4694e7
+	/* pass pmk directly */
Takashi Iwai 4694e7
+	pmk.key_len = cpu_to_le16(pmk_len);
Takashi Iwai 4694e7
+	pmk.flags = cpu_to_le16(0);
Takashi Iwai 4694e7
+	memcpy(pmk.key, pmk_data, pmk_len);
Takashi Iwai 4694e7
 
Takashi Iwai 4694e7
 	/* store psk in firmware */
Takashi Iwai 4694e7
 	err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_WSEC_PMK,
Takashi Iwai 4694e7
-- 
Takashi Iwai 4694e7
2.35.3
Takashi Iwai 4694e7