我发现了让wpa_supplicant输出PMK的两种方法:
简单方法:使用-K选项以及一些调试选项(例如-dd )调用wpa_supplicant 。 这将在调试输出中包括键(密码等)。
困难的方法:更改wpa_supplicant的代码以输出密钥。 鉴于存在-K选项,这种方式不必要地困难,但这是我尝试的第一件事(不要问)。 我在下面总结了如何进行此操作,这对于希望更改wpa_supplicant代码的人来说可能很有趣。
2)困难的方法:更改wpa_supplicant代码
我可以通过更改wpa_supplicant的代码来找到答案,使其在身份验证期间输出PMK。 在我的情况下,客户端设备是运行Raspbian GNU / Linux 7(wheezy)的Raspberry Pi模型B +,V1 2,它使用的是wpa_supplicant的旧版本,即v1.0,2012-05-10 。
对于任何想知道的人,我都更改了源文件src/rsn_supp/wpa.c ,函数wpa_supplicant_key_neg_complete() ,以输出PMK,如下所示:
static void wpa_supplicant_key_neg_complete(struct wpa_sm *sm,
const u8 *addr, int secure)
{
// pass the pmk (pairwise master key) to a hex string.
int i;
// hex str to hold pmk. 1024 bit
// should be enough (the pmk is supposed to be 256 bit, thus 32 byte, thus
// 64 hex chars)
char pmk_str[1024] = {'\0'};
char * pmk_ptr = pmk_str;
// use os_snprintf() (as used by other methods in wpa.c)
for (i = 0; i < sm->pmk_len; i++) {
// wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
// "WPA: pmk[%d]: %02X", i, sm->pmk[i]);
pmk_ptr += sprintf(pmk_ptr, "%02X", sm->pmk[i]);
}
*(pmk_ptr + 1) = '\0';
wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
"WPA: Key negotiation completed with "MACSTR": \
\n\tPMK=%s \
\n\t[PTK=%s GTK=%s]",
MAC2STR(addr),
pmk_str,
wpa_cipher_txt(sm->pairwise_cipher),
wpa_cipher_txt(sm->group_cipher));
(...)
}