mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-28 21:33:32 +00:00
wifi: Add PMK caching feature for station WPA2-enterprise
1) Added PMK caching module from wpa_supplicant. 2) Modified wpa_sm to a) Add entry to PMK cache when first time associated to an AP. b) Maintain entry across the associations. c) Clear current PMKSA when deauth happens. d) Search for an entry when re-associating to the same AP and set it as current PMKSA e) Wait for msg 1/4 from AP instead of starting EAP authentication. f) Check PMKID in msg 1 with current PMKSA/cache. g) Use the cached PMK to complete 4-way handshake. 3) Remove config_bss callback as it was redundant and used to cause problems for PMK caching flow. Closes IDF-969
This commit is contained in:
@@ -2,14 +2,8 @@
|
||||
* wpa_supplicant/hostapd / common helper functions, etc.
|
||||
* Copyright (c) 2002-2007, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* Alternatively, this software may be distributed under the terms of BSD
|
||||
* license.
|
||||
*
|
||||
* See README and COPYING for more details.
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#include "utils/includes.h"
|
||||
@@ -99,68 +93,263 @@ void wpa_get_ntp_timestamp(u8 *buf)
|
||||
usec = now.usec;
|
||||
usec = 4295 * usec - (usec >> 5) - (usec >> 9);
|
||||
tmp = host_to_be32(sec);
|
||||
memcpy(buf, (u8 *) &tmp, 4);
|
||||
os_memcpy(buf, (u8 *) &tmp, 4);
|
||||
tmp = host_to_be32(usec);
|
||||
memcpy(buf + 4, (u8 *) &tmp, 4);
|
||||
os_memcpy(buf + 4, (u8 *) &tmp, 4);
|
||||
}
|
||||
void printf_encode(char *txt, size_t maxlen, const u8 *data, size_t len)
|
||||
{
|
||||
char *end = txt + maxlen;
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
if (txt + 4 >= end)
|
||||
break;
|
||||
|
||||
switch (data[i]) {
|
||||
case '\"':
|
||||
*txt++ = '\\';
|
||||
*txt++ = '\"';
|
||||
break;
|
||||
case '\\':
|
||||
*txt++ = '\\';
|
||||
*txt++ = '\\';
|
||||
break;
|
||||
case '\033':
|
||||
*txt++ = '\\';
|
||||
*txt++ = 'e';
|
||||
break;
|
||||
case '\n':
|
||||
*txt++ = '\\';
|
||||
*txt++ = 'n';
|
||||
break;
|
||||
case '\r':
|
||||
*txt++ = '\\';
|
||||
*txt++ = 'r';
|
||||
break;
|
||||
case '\t':
|
||||
*txt++ = '\\';
|
||||
*txt++ = 't';
|
||||
break;
|
||||
default:
|
||||
if (data[i] >= 32 && data[i] <= 127) {
|
||||
*txt++ = data[i];
|
||||
} else {
|
||||
txt += os_snprintf(txt, end - txt, "\\x%02x",
|
||||
data[i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
*txt = '\0';
|
||||
}
|
||||
|
||||
|
||||
size_t printf_decode(u8 *buf, size_t maxlen, const char *str)
|
||||
{
|
||||
const char *pos = str;
|
||||
size_t len = 0;
|
||||
int val;
|
||||
|
||||
while (*pos) {
|
||||
if (len + 1 >= maxlen)
|
||||
break;
|
||||
switch (*pos) {
|
||||
case '\\':
|
||||
pos++;
|
||||
switch (*pos) {
|
||||
case '\\':
|
||||
buf[len++] = '\\';
|
||||
pos++;
|
||||
break;
|
||||
case '"':
|
||||
buf[len++] = '"';
|
||||
pos++;
|
||||
break;
|
||||
case 'n':
|
||||
buf[len++] = '\n';
|
||||
pos++;
|
||||
break;
|
||||
case 'r':
|
||||
buf[len++] = '\r';
|
||||
pos++;
|
||||
break;
|
||||
case 't':
|
||||
buf[len++] = '\t';
|
||||
pos++;
|
||||
break;
|
||||
case 'e':
|
||||
buf[len++] = '\033';
|
||||
pos++;
|
||||
break;
|
||||
case 'x':
|
||||
pos++;
|
||||
val = hex2byte(pos);
|
||||
if (val < 0) {
|
||||
val = hex2num(*pos);
|
||||
if (val < 0)
|
||||
break;
|
||||
buf[len++] = val;
|
||||
pos++;
|
||||
} else {
|
||||
buf[len++] = val;
|
||||
pos += 2;
|
||||
}
|
||||
break;
|
||||
case '0':
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
val = *pos++ - '0';
|
||||
if (*pos >= '0' && *pos <= '7')
|
||||
val = val * 8 + (*pos++ - '0');
|
||||
if (*pos >= '0' && *pos <= '7')
|
||||
val = val * 8 + (*pos++ - '0');
|
||||
buf[len++] = val;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
buf[len++] = *pos++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (maxlen > len)
|
||||
buf[len] = '\0';
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
|
||||
|
||||
char * wpa_config_parse_string(const char *value, size_t *len)
|
||||
{
|
||||
if (*value == '"' && (strlen(value) == 7 || strlen(value) == 15)) {
|
||||
if (*value == '"') {
|
||||
const char *pos;
|
||||
char *str;
|
||||
value++;
|
||||
pos = (char *)strrchr(value, '"');
|
||||
if (pos == NULL)
|
||||
pos = os_strrchr(value, '"');
|
||||
if (pos == NULL || pos[1] != '\0')
|
||||
return NULL;
|
||||
*len = pos - value;
|
||||
str = (char *)os_malloc(*len + 1);
|
||||
str = dup_binstr(value, *len);
|
||||
if (str == NULL)
|
||||
return NULL;
|
||||
memcpy(str, value, *len);
|
||||
str[*len] = '\0';
|
||||
return str;
|
||||
} else if (*value == 'P' && value[1] == '"') {
|
||||
const char *pos;
|
||||
char *tstr, *str;
|
||||
size_t tlen;
|
||||
value += 2;
|
||||
pos = os_strrchr(value, '"');
|
||||
if (pos == NULL || pos[1] != '\0')
|
||||
return NULL;
|
||||
tlen = pos - value;
|
||||
tstr = dup_binstr(value, tlen);
|
||||
if (tstr == NULL)
|
||||
return NULL;
|
||||
|
||||
str = os_malloc(tlen + 1);
|
||||
if (str == NULL) {
|
||||
os_free(tstr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
*len = printf_decode((u8 *) str, tlen + 1, tstr);
|
||||
os_free(tstr);
|
||||
|
||||
return str;
|
||||
} else {
|
||||
u8 *str;
|
||||
size_t tlen, hlen = strlen(value);
|
||||
if (hlen == 5 || hlen == 13) {
|
||||
*len = hlen;
|
||||
str = (u8 *)os_malloc(*len + 1);
|
||||
if (str == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
memcpy(str, value, *len);
|
||||
str[*len] = '\0';
|
||||
} else if (hlen == 10 || hlen == 26) {
|
||||
tlen = hlen / 2;
|
||||
str = (u8 *)os_malloc(tlen + 1);
|
||||
if (str == NULL)
|
||||
return NULL;
|
||||
if (hexstr2bin(value, str, tlen)) {
|
||||
os_free(str);
|
||||
return NULL;
|
||||
}
|
||||
str[tlen] = '\0';
|
||||
*len = tlen;
|
||||
} else {
|
||||
size_t tlen, hlen = os_strlen(value);
|
||||
if (hlen & 1)
|
||||
return NULL;
|
||||
tlen = hlen / 2;
|
||||
str = os_malloc(tlen + 1);
|
||||
if (str == NULL)
|
||||
return NULL;
|
||||
if (hexstr2bin(value, str, tlen)) {
|
||||
os_free(str);
|
||||
return NULL;
|
||||
}
|
||||
str[tlen] = '\0';
|
||||
*len = tlen;
|
||||
return (char *) str;
|
||||
}
|
||||
}
|
||||
|
||||
char * dup_binstr(const void *src, size_t len)
|
||||
|
||||
int is_hex(const u8 *data, size_t len)
|
||||
{
|
||||
char *res;
|
||||
size_t i;
|
||||
|
||||
if (src == NULL)
|
||||
return NULL;
|
||||
res = os_malloc(len + 1);
|
||||
if (res == NULL)
|
||||
return NULL;
|
||||
memcpy(res, src, len);
|
||||
res[len] = '\0';
|
||||
|
||||
return res;
|
||||
for (i = 0; i < len; i++) {
|
||||
if (data[i] < 32 || data[i] >= 127)
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
size_t merge_byte_arrays(u8 *res, size_t res_len,
|
||||
const u8 *src1, size_t src1_len,
|
||||
const u8 *src2, size_t src2_len)
|
||||
{
|
||||
size_t len = 0;
|
||||
|
||||
os_memset(res, 0, res_len);
|
||||
|
||||
if (src1) {
|
||||
if (src1_len >= res_len) {
|
||||
os_memcpy(res, src1, res_len);
|
||||
return res_len;
|
||||
}
|
||||
|
||||
os_memcpy(res, src1, src1_len);
|
||||
len += src1_len;
|
||||
}
|
||||
|
||||
if (src2) {
|
||||
if (len + src2_len >= res_len) {
|
||||
os_memcpy(res + len, src2, res_len - len);
|
||||
return res_len;
|
||||
}
|
||||
|
||||
os_memcpy(res + len, src2, src2_len);
|
||||
len += src2_len;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
|
||||
char * dup_binstr(const void *src, size_t len)
|
||||
{
|
||||
char *res;
|
||||
|
||||
if (src == NULL)
|
||||
return NULL;
|
||||
res = os_malloc(len + 1);
|
||||
if (res == NULL)
|
||||
return NULL;
|
||||
os_memcpy(res, src, len);
|
||||
res[len] = '\0';
|
||||
|
||||
return res;
|
||||
}
|
||||
void bin_clear_free(void *bin, size_t len)
|
||||
{
|
||||
if (bin) {
|
||||
os_memset(bin, 0, len);
|
||||
os_free(bin);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user