feat(ath9k): WPA2-PSK crypto core + connect path (auth/assoc/4-way)
wpa2_crypto.{c,h} (new): self-contained, verified crypto base for the
ath9k STA connect path. No heap, no SSE, DKM-freestanding.
- SHA1 (RFC 3174), HMAC-SHA1 (RFC 2202), PBKDF2-HMAC-SHA1 (RFC 2898)
- PRF-512 (802.11i H.4) for PMK -> PTK
- AES-128 encrypt/decrypt (FIPS-197)
- RFC 3394 AES key unwrap (KEK -> GTK)
- CCMP (RFC 3610 + 802.11i): MIC verify + CTR decrypt, and encrypt for TX
- wpa2_kat(): 7 in-driver known-answer/reference cases (SHA1/HMAC/PBKDF2/
AES x2/CCMP round-trip+tamper/unwrap). Panics ATH-E02 if any case fails.
ath9k.c: connect path built on the crypto base.
- TX descriptor ring + ath9k_tx_frame (AR9002 minimal field set; bit
layout to be reconciled with HAL initvals during hardware bring-up)
- management frames: auth (open) / assoc request with WPA2-PSK RSN IE
- EAPOL-Key builder with HMAC-SHA1-128 MIC; M2 and M4 senders
- 4-way state machine driven from RX: M1 (ANonce) -> derive PTK ->
M2 -> M3 (MIC verify, GTK unwrap) -> M4 -> CONNECTED
- ath9k_tx_impl for data frames (CCMP encrypt); data TX before key
install panics ATH-E04 (zero-degradation rule)
- netdev now registers tx/connect/disconnect callbacks
build.ps1: Build-DkmDriverMulti to compile+ld -r ath9k.c with wpa2_crypto.c.
Verified on host: all wpa2_kat cases pass (AES-128 = FIPS-197 C.1
69c4e0d8..., RFC 3394 C.1 unwrap = 0011..eeff, CCMP round-trip + tamper).
Hardware bring-up (AR9285 initvals, TX/RX descriptor bit layout, key
install into the MAC) still requires real-hardware iteration.
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
/* wpa2_crypto.h — WPA2-PSK 握手所需加密底座(DKM ath9k 专用)
|
||||
*
|
||||
* 范围(802.11i RSNA,AKM 00-0F-AC:2 PSK):
|
||||
* SHA1 — RFC 3174
|
||||
* HMAC-SHA1 — RFC 2204(EAPOL-Key MIC ver2 = HMAC-SHA1-128)
|
||||
* PBKDF2-HMAC-SHA1 — RFC 2898(passphrase → PSK,4096 iter)
|
||||
* PRF-X — 802.11i H.4(PMK → 512bit PTK)
|
||||
* AES-128 — FIPS-197(仅加密方向;CCMP 的 CTR 与 CBC-MAC 都用 AES-ENC)
|
||||
* AES Key Unwrap — RFC 3394(KEK 解密 M3 key data 中的 GTK KDE)
|
||||
* CCMP — RFC 3610(data 帧 MIC 验证 + 计数器解密;加密留 TX 数据路径)
|
||||
*
|
||||
* 自检:wpa2_kat() 内置 RFC 2202/6070/FIPS-197 已知答案向量,
|
||||
* driver_init 时调用,任一失败 panic(ATH-E02)。
|
||||
* 约束:无堆(静态/栈缓冲)、无除法热路径、-mno-sse 可编译。
|
||||
*/
|
||||
#ifndef ATH9K_WPA2_CRYPTO_H
|
||||
#define ATH9K_WPA2_CRYPTO_H
|
||||
|
||||
#include "../dkm_shared.h"
|
||||
|
||||
#define WPA2_PMK_LEN 32
|
||||
#define WPA2_PTK_LEN 48 /* KCK(16)+KEK(16)+TK(16)(802.11i CCMP 不取 TKIP MIC 子钥) */
|
||||
#define WPA2_KCK_LEN 16
|
||||
#define WPA2_KEK_LEN 16
|
||||
#define WPA2_TK_LEN 16
|
||||
|
||||
/* SHA1:out[20] */
|
||||
void wpa2_sha1(const u8 *data, u32 len, u8 out[20]);
|
||||
/* 增量 SHA1(EAPOL MIC 需要对任意长帧做 HMAC,直接给一次性接口) */
|
||||
void wpa2_hmac_sha1(const u8 *key, u32 key_len,
|
||||
const u8 *data, u32 data_len, u8 out[20]);
|
||||
/* PBKDF2-HMAC-SHA1:passphrase → psk[32](iter 固定 4096,salt=SSID) */
|
||||
void wpa2_pbkdf2_sha1(const char *passphrase, const u8 *ssid, u32 ssid_len,
|
||||
u8 psk[WPA2_PMK_LEN]);
|
||||
/* PRF-512(802.11i H.4):PMK+label+addr/nonce 串接 → out[64] */
|
||||
void wpa2_prf512(const u8 *pmk, const u8 *seed, u32 seed_len, u8 out[64]);
|
||||
|
||||
/* AES-128 单块加密(in/out 16 字节,可同址) */
|
||||
void wpa2_aes128_enc_block(const u8 key[16], const u8 in[16], u8 out[16]);
|
||||
/* AES-128 单块解密(RFC 3394 unwrap 用;CCMP 路径不使用) */
|
||||
void wpa2_aes128_dec_block(const u8 key[16], const u8 in[16], u8 out[16]);
|
||||
|
||||
/* RFC 3394 key unwrap:in 为 n*8 字节密文(n>=2),out 得 (n-1)*8 明文;
|
||||
* 返回 0 成功,-1 integrity check 失败(AIV != 0xA6A6A6A6A6A6A6A6)。 */
|
||||
int wpa2_key_unwrap(const u8 kek[16], const u8 *in, u32 in_len, u8 *out);
|
||||
|
||||
/* CCMP 解密(STA 收 AP 数据帧,非 QoS,3 地址):
|
||||
* frame 指向 802.11 MAC 头起始,len 为整帧长度(含 CCMP 8B 头 + 8B MIC)。
|
||||
* 成功时把解密后的数据载荷(去掉 CCMP 头/MIC/FCS 前的明文 MSDU)
|
||||
* 写入 out 并返回明文长度;MIC 错误返回 -1,参数错返回 -2。 */
|
||||
int wpa2_ccmp_decrypt(const u8 *frame, u32 len, const u8 tk[16], u8 *out, u32 out_cap);
|
||||
|
||||
/* CCMP 加密(STA 发 AP 数据帧):在 buf 内就地构造
|
||||
* [MAC 头(24B,调用方先填好)][CCMP 头(8B)][密文][MIC(8B)]。
|
||||
* buf : 调用方提供的缓冲,前 24 字节须已填 MAC 头
|
||||
* msdu : 明文 MSDU
|
||||
* msdu_len: 明文长度(>0)
|
||||
* pn : 发包序号(调用方递增维护)
|
||||
* 返回写入 buf 的总帧长(24+8+msdu_len+8);缓冲不足返回 -1。 */
|
||||
int wpa2_ccmp_encrypt(u8 *buf, u32 buf_cap, const u8 *msdu, u32 msdu_len,
|
||||
const u8 tk[16], u64 pn);
|
||||
|
||||
/* KAT(已知答案自检):返回 0 = 全部通过;非 0 = 第几个用例失败(1 基)。
|
||||
* driver_init 必须调用,失败方 panic(ATH-E02)。 */
|
||||
int wpa2_kat(void);
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user