hostap/wpa_supplicant/nfc_pw_token.c
Jouni Malinen 40a5e3bfde WPS: Add a standalone tool for building NFC password tokens
nfc_pw_token can be used to build random NFC password token for WPS.
This tool prints out the wpa_supplicant.conf (or hostapd.conf)
parameters and the hexdump of the WPS password token (with and without
NDEF encapsulation) so that it can be written to a NFC tag with an
external program.

Signed-hostap: Jouni Malinen <j@w1.fi>
2012-06-28 21:01:37 +03:00

83 lines
1.7 KiB
C

/*
* nfc_pw_token - Tool for building NFC password tokens for WPS
* Copyright (c) 2012, Jouni Malinen <j@w1.fi>
*
* This software may be distributed under the terms of the BSD license.
* See README for more details.
*/
#include "includes.h"
#include "utils/common.h"
#include "crypto/random.h"
#include "wpa_supplicant_i.h"
#include "config.h"
#include "wps_supplicant.h"
static void print_bin(const char *title, const struct wpabuf *buf)
{
size_t i, len;
const u8 *pos;
if (buf == NULL)
return;
printf("%s=", title);
pos = wpabuf_head(buf);
len = wpabuf_len(buf);
for (i = 0; i < len; i++)
printf("%02X", *pos++);
printf("\n");
}
int main(int argc, char *argv[])
{
struct wpa_supplicant wpa_s;
int ret = -1;
struct wpabuf *buf = NULL, *ndef = NULL;
char txt[1000];
if (os_program_init())
return -1;
random_init(NULL);
os_memset(&wpa_s, 0, sizeof(wpa_s));
wpa_s.conf = os_zalloc(sizeof(*wpa_s.conf));
if (wpa_s.conf == NULL)
goto fail;
buf = wpas_wps_nfc_token(&wpa_s, 0);
if (buf == NULL)
goto fail;
ndef = ndef_build_wifi(buf);
if (ndef == NULL)
goto fail;
wpa_snprintf_hex_uppercase(txt, sizeof(txt), wpabuf_head(buf),
wpabuf_len(buf));
printf("#WPS=%s\n", txt);
wpa_snprintf_hex_uppercase(txt, sizeof(txt), wpabuf_head(ndef),
wpabuf_len(ndef));
printf("#NDEF=%s\n", txt);
printf("wps_nfc_dev_pw_id=%d\n", wpa_s.conf->wps_nfc_dev_pw_id);
print_bin("wps_nfc_dh_pubkey", wpa_s.conf->wps_nfc_dh_pubkey);
print_bin("wps_nfc_dh_privkey", wpa_s.conf->wps_nfc_dh_privkey);
print_bin("wps_nfc_dev_pw", wpa_s.conf->wps_nfc_dev_pw);
ret = 0;
fail:
wpabuf_free(ndef);
wpabuf_free(buf);
wpa_config_free(wpa_s.conf);
random_deinit();
os_program_deinit();
return ret;
}