diff options
author | Jouni Malinen <j@w1.fi> | 2012-06-28 20:54:53 +0300 |
---|---|---|
committer | Jouni Malinen <j@w1.fi> | 2012-06-28 21:01:37 +0300 |
commit | bfc62fe1331da4eca6dec70133c5d4cd1d6bc958 (patch) | |
tree | 344482b9c1d6dd0937647eff8ef09b7535bf869f /src/wps | |
parent | 40a5e3bfde0170f5fcbb38375c15c5f15f33bc7c (diff) | |
download | external_wpa_supplicant_8_ti-bfc62fe1331da4eca6dec70133c5d4cd1d6bc958.zip external_wpa_supplicant_8_ti-bfc62fe1331da4eca6dec70133c5d4cd1d6bc958.tar.gz external_wpa_supplicant_8_ti-bfc62fe1331da4eca6dec70133c5d4cd1d6bc958.tar.bz2 |
WPS: Share a single function for generating NFS password tokens
There is no need for both hostapd and wpa_supplicant to have their
own functions for this.
Signed-hostap: Jouni Malinen <j@w1.fi>
Diffstat (limited to 'src/wps')
-rw-r--r-- | src/wps/wps.h | 3 | ||||
-rw-r--r-- | src/wps/wps_common.c | 52 |
2 files changed, 54 insertions, 1 deletions
diff --git a/src/wps/wps.h b/src/wps/wps.h index a94a90a..177c822 100644 --- a/src/wps/wps.h +++ b/src/wps/wps.h @@ -850,6 +850,9 @@ u16 wps_config_methods_str2bin(const char *str); struct wpabuf * wps_build_nfc_pw_token(u16 dev_pw_id, const struct wpabuf *pubkey, const struct wpabuf *dev_pw); +struct wpabuf * wps_nfc_token_gen(int ndef, int *id, struct wpabuf **pubkey, + struct wpabuf **privkey, + struct wpabuf **dev_pw); /* ndef.c */ struct wpabuf * ndef_parse_wifi(const struct wpabuf *buf); diff --git a/src/wps/wps_common.c b/src/wps/wps_common.c index 16412ca..9e06087 100644 --- a/src/wps/wps_common.c +++ b/src/wps/wps_common.c @@ -1,6 +1,6 @@ /* * Wi-Fi Protected Setup - common functionality - * Copyright (c) 2008-2009, Jouni Malinen <j@w1.fi> + * Copyright (c) 2008-2012, Jouni Malinen <j@w1.fi> * * This software may be distributed under the terms of the BSD license. * See README for more details. @@ -727,3 +727,53 @@ struct wpabuf * wps_build_wsc_nack(struct wps_data *wps) return msg; } + + +#ifdef CONFIG_WPS_NFC +struct wpabuf * wps_nfc_token_gen(int ndef, int *id, struct wpabuf **pubkey, + struct wpabuf **privkey, + struct wpabuf **dev_pw) +{ + struct wpabuf *priv = NULL, *pub = NULL, *pw, *ret; + void *dh_ctx; + u16 val; + + pw = wpabuf_alloc(WPS_OOB_DEVICE_PASSWORD_LEN); + if (pw == NULL) + return NULL; + + if (random_get_bytes(wpabuf_put(pw, WPS_OOB_DEVICE_PASSWORD_LEN), + WPS_OOB_DEVICE_PASSWORD_LEN) || + random_get_bytes((u8 *) &val, sizeof(val))) { + wpabuf_free(pw); + return NULL; + } + + dh_ctx = dh5_init(&priv, &pub); + if (dh_ctx == NULL) { + wpabuf_free(pw); + return NULL; + } + dh5_free(dh_ctx); + + *id = 0x10 + val % 0xfff0; + wpabuf_free(*pubkey); + *pubkey = pub; + wpabuf_free(*privkey); + *privkey = priv; + wpabuf_free(*dev_pw); + *dev_pw = pw; + + ret = wps_build_nfc_pw_token(*id, *pubkey, *dev_pw); + if (ndef && ret) { + struct wpabuf *tmp; + tmp = ndef_build_wifi(ret); + wpabuf_free(ret); + if (tmp == NULL) + return NULL; + ret = tmp; + } + + return ret; +} +#endif /* CONFIG_WPS_NFC */ |