git: db4d6f76407c - main - net80211: add key get/set methods

Adrian Chadd <[email protected]>
Newsgroups gmane.os.freebsd.devel.cvs.src
Message-ID <6a850fde.1e36b.6e6546b7__27537.1062265307$1787105274$gmane$org@gitrepo.freebsd.org>
The branch main has been updated by adrian:

URL: https://cgit.FreeBSD.org/src/commit/?id=db4d6f76407c098a2fe72eb359e93180b508753a

commit db4d6f76407c098a2fe72eb359e93180b508753a
Author:     Adrian Chadd <[email protected]>
AuthorDate: 2026-08-19 02:01:59 +0000
Commit:     Adrian Chadd <[email protected]>
CommitDate: 2026-08-19 02:01:59 +0000

    net80211: add key get/set methods
    
    Introduce net80211 key get and set methods with appropriate
    bounds checking and buffer zero'ing.
    
    Differential Revision:  https://reviews.freebsd.org/D58705
---
 sys/net80211/ieee80211_crypto.h | 147 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 147 insertions(+)

diff --git a/sys/net80211/ieee80211_crypto.h b/sys/net80211/ieee80211_crypto.h
index 9ae91bcaeb5d..9b719f683735 100644
--- a/sys/net80211/ieee80211_crypto.h
+++ b/sys/net80211/ieee80211_crypto.h
@@ -42,6 +42,8 @@
  * IEEE80211_KEYBUF_SIZE as the key size will eventually grow.
  */
 #define	IEEE80211_KEYBUF_128_SIZE	16
+#define	IEEE80211_TX_MICBUF_128_SIZE	8
+#define	IEEE80211_RX_MICBUF_128_SIZE	8
 #define	IEEE80211_MICBUF_128_SIZE	(8+8)	/* space for both tx+rx keys */
 
 /*
@@ -309,6 +311,151 @@ void	ieee80211_notify_michael_failure(struct ieee80211vap *,
 uint16_t	ieee80211_crypto_init_aad(const struct ieee80211_frame *,
 		uint8_t *, int);
 
+/**
+ * @brief Set the key data.
+ *
+ * This will only set the key data and length, not the TX/RX MIC.
+ *
+ * Note: there's no locking; this needs to be called in
+ * a situation where the ieee80211_key won't disappear.
+ *
+ * @param key		key to set
+ * @param data		key contents to use
+ * @param len		key length
+ * @returns true	if the key data was copied and it fit,
+ * 			false otherwise.
+ */
+static inline bool
+ieee80211_crypto_set_key_data(struct ieee80211_key *k, const uint8_t *data,
+    uint32_t len)
+{
+	if (len > IEEE80211_KEYBUF_SIZE)
+		return (false);
+	memset(k->wk_key, '\0', IEEE80211_KEYBUF_SIZE);
+	memcpy(k->wk_key, data, len);
+	k->wk_keylen = len;
+	return (true);
+}
+
+/**
+ * @brief Set the TX MIC data.
+ *
+ * This will only set the TX MIC data, not the key.
+ *
+ * Note: there's no locking; this needs to be called in
+ * a situation where the ieee80211_key won't disappear.
+ *
+ * @param key		key to set
+ * @param data		TX MIC contents
+ * @param len		TX MIC length
+ * @returns true	if the MIC data was copied and it fit,
+ * 			false otherwise.
+ */
+static inline bool
+ieee80211_crypto_set_key_txmic_data(struct ieee80211_key *k,
+    uint8_t *data, uint32_t len)
+{
+	if (len > IEEE80211_TX_MICBUF_128_SIZE)
+		return (false);
+	memset(k->wk_key, '\0', IEEE80211_TX_MICBUF_128_SIZE);
+	memcpy(k->wk_txmic, data, len);
+	return (true);
+}
+
+/**
+ * @brief Set the RX MIC data.
+ *
+ * This will only set the RX MIC data, not the key.
+ *
+ * Note: there's no locking; this needs to be called in
+ * a situation where the ieee80211_key won't disappear.
+ *
+ * @param key		key to set
+ * @param data		RX MIC contents
+ * @param len		RX MIC length
+ * @returns true	if the MIC data was copied and it fit,
+ * 			false otherwise.
+ */
+static inline bool
+ieee80211_crypto_set_key_rxmic_data(struct ieee80211_key *k,
+    const uint8_t *data, uint32_t len)
+{
+	if (len > IEEE80211_RX_MICBUF_128_SIZE)
+		return (false);
+	memset(k->wk_key, '\0', IEEE80211_RX_MICBUF_128_SIZE);
+	memcpy(k->wk_rxmic, data, len);
+	return (true);
+}
+
+/**
+ * @brief Get the key data.
+ *
+ * This copies out the key data from the given ieee80211_key
+ * into the given buffer/length.
+ *
+ * @param key	ieee80211_key to copy from
+ * @param data	destination buffer for key
+ * @param len	destination buffer length
+ * @returns	true if copied, false if not
+ */
+static inline bool
+ieee80211_crypto_copy_key_data(const struct ieee80211_key *k,
+    uint8_t *data, uint32_t len)
+{
+	if (len < k->wk_keylen)
+		return (false);
+
+	memset(data, '\0', len);
+	memcpy(data, k->wk_key, k->wk_keylen);
+	return (true);
+}
+
+/**
+ * @brief Get the TX MIC.
+ *
+ * This copies out the TX MIC from the given ieee80211_key
+ * into the given buffer/length.
+ *
+ * @param key	ieee80211_key to copy from
+ * @param data	destination buffer for TX MIC
+ * @param len	destination buffer length
+ * @returns	true if copied, false if not
+ */
+static inline uint32_t
+ieee80211_crypto_copy_txmic_data(const struct ieee80211_key *k,
+    uint8_t *data, uint32_t len)
+{
+	if (len < k->wk_cipher->ic_miclen)
+		return (false);
+
+	memset(data, '\0', len);
+	memcpy(data, k->wk_txmic, k->wk_cipher->ic_miclen);
+	return (true);
+}
+
+/**
+ * @brief Get the RX MIC.
+ *
+ * This copies out the RX MIC from the given ieee80211_key
+ * into the given buffer/length.
+ *
+ * @param key	ieee80211_key to copy from
+ * @param data	destination buffer for RX MIC
+ * @param len	destination buffer length
+ * @returns	true if copied, false if not
+ */
+static inline uint32_t
+ieee80211_crypto_copy_rxmic_data(const struct ieee80211_key *k,
+    uint8_t *data, uint32_t len)
+{
+	if (len < k->wk_cipher->ic_miclen)
+		return (false);
+
+	memset(data, '\0', len);
+	memcpy(data, k->wk_rxmic, k->wk_cipher->ic_miclen);
+	return (true);
+}
+
 /**
  * @brief Return the key data.
  *
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.