P2P: Reduce redundant PSK generation for GO

The PSK generation done by pbkdf2_sha1() is one of the longest CPU time
users according to our profiling from boot to GO started.

So I have reduced some steps.

I could boot a GO by this command sequence.
-------------
add_net
set_network 0 ssid '"DIRECT-XX"'
set_network 0 psk
'"123456789012345678901234567890123456789012345678901234567890123"'
set_network 0 proto RSN
set_network 0 key_mgmt WPA-PSK
set_network 0 pairwise CCMP
set_network 0 auth_alg OPEN
set_network 0 mode 3
set_network 0 disabled 2
p2p_group_add persistent=0 freq=2412
-------------

By this sequence, pbkdf2_sha1() was called three times and the function
calculates the same value each time. Reduce number of calls to
pbkdf2_sha1() from 3 to 1 by caching the previous result.

Signed-hostap: Masashi Honma <masashi.honma at gmail.com>
This commit is contained in:
Masashi Honma 2012-11-11 11:39:24 +02:00 committed by Jouni Malinen
parent 45ac5793fc
commit 30c371e8a5
3 changed files with 21 additions and 4 deletions

View file

@ -87,6 +87,16 @@ struct p2p_go_neg_results {
*/ */
size_t ssid_len; size_t ssid_len;
/**
* psk - WPA pre-shared key (256 bits) (GO only)
*/
u8 psk[32];
/**
* psk_set - Whether PSK field is configured (GO only)
*/
int psk_set;
/** /**
* passphrase - WPA2-Personal passphrase for the group (GO only) * passphrase - WPA2-Personal passphrase for the group (GO only)
*/ */

View file

@ -174,15 +174,15 @@ static int wpa_supplicant_conf_ap(struct wpa_supplicant *wpa_s,
bss->wpa = ssid->proto; bss->wpa = ssid->proto;
bss->wpa_key_mgmt = ssid->key_mgmt; bss->wpa_key_mgmt = ssid->key_mgmt;
bss->wpa_pairwise = ssid->pairwise_cipher; bss->wpa_pairwise = ssid->pairwise_cipher;
if (ssid->passphrase) { if (ssid->psk_set) {
bss->ssid.wpa_passphrase = os_strdup(ssid->passphrase);
} else if (ssid->psk_set) {
os_free(bss->ssid.wpa_psk); os_free(bss->ssid.wpa_psk);
bss->ssid.wpa_psk = os_zalloc(sizeof(struct hostapd_wpa_psk)); bss->ssid.wpa_psk = os_zalloc(sizeof(struct hostapd_wpa_psk));
if (bss->ssid.wpa_psk == NULL) if (bss->ssid.wpa_psk == NULL)
return -1; return -1;
os_memcpy(bss->ssid.wpa_psk->psk, ssid->psk, PMK_LEN); os_memcpy(bss->ssid.wpa_psk->psk, ssid->psk, PMK_LEN);
bss->ssid.wpa_psk->group = 1; bss->ssid.wpa_psk->group = 1;
} else if (ssid->passphrase) {
bss->ssid.wpa_passphrase = os_strdup(ssid->passphrase);
} else if (ssid->wep_key_len[0] || ssid->wep_key_len[1] || } else if (ssid->wep_key_len[0] || ssid->wep_key_len[1] ||
ssid->wep_key_len[2] || ssid->wep_key_len[3]) { ssid->wep_key_len[2] || ssid->wep_key_len[3]) {
struct hostapd_wep_keys *wep = &bss->ssid.wep; struct hostapd_wep_keys *wep = &bss->ssid.wep;

View file

@ -888,6 +888,10 @@ static void wpas_start_wps_go(struct wpa_supplicant *wpa_s,
wpa_config_remove_network(wpa_s->conf, ssid->id); wpa_config_remove_network(wpa_s->conf, ssid->id);
return; return;
} }
ssid->psk_set = params->psk_set;
if (ssid->psk_set)
os_memcpy(ssid->psk, params->psk, sizeof(ssid->psk));
else
wpa_config_update_psk(ssid); wpa_config_update_psk(ssid);
ssid->ap_max_inactivity = wpa_s->parent->conf->p2p_go_max_inactivity; ssid->ap_max_inactivity = wpa_s->parent->conf->p2p_go_max_inactivity;
@ -4117,6 +4121,9 @@ int wpas_p2p_group_add_persistent(struct wpa_supplicant *wpa_s,
return -1; return -1;
params.role_go = 1; params.role_go = 1;
params.psk_set = ssid->psk_set;
if (params.psk_set)
os_memcpy(params.psk, ssid->psk, sizeof(params.psk));
if (ssid->passphrase == NULL || if (ssid->passphrase == NULL ||
os_strlen(ssid->passphrase) >= sizeof(params.passphrase)) { os_strlen(ssid->passphrase) >= sizeof(params.passphrase)) {
wpa_printf(MSG_DEBUG, "P2P: Invalid passphrase in persistent " wpa_printf(MSG_DEBUG, "P2P: Invalid passphrase in persistent "