1252190Srpaulo/*
2252190Srpaulo * nfc_pw_token - Tool for building NFC password tokens for WPS
3252190Srpaulo * Copyright (c) 2012, Jouni Malinen <j@w1.fi>
4252190Srpaulo *
5252190Srpaulo * This software may be distributed under the terms of the BSD license.
6252190Srpaulo * See README for more details.
7252190Srpaulo */
8252190Srpaulo
9252190Srpaulo#include "includes.h"
10252190Srpaulo
11252190Srpaulo#include "utils/common.h"
12252190Srpaulo#include "crypto/random.h"
13252190Srpaulo#include "wpa_supplicant_i.h"
14252190Srpaulo#include "config.h"
15252190Srpaulo#include "wps_supplicant.h"
16252190Srpaulo
17252190Srpaulo
18252190Srpaulostatic void print_bin(const char *title, const struct wpabuf *buf)
19252190Srpaulo{
20252190Srpaulo	size_t i, len;
21252190Srpaulo	const u8 *pos;
22252190Srpaulo
23252190Srpaulo	if (buf == NULL)
24252190Srpaulo		return;
25252190Srpaulo
26252190Srpaulo	printf("%s=", title);
27252190Srpaulo
28252190Srpaulo	pos = wpabuf_head(buf);
29252190Srpaulo	len = wpabuf_len(buf);
30252190Srpaulo	for (i = 0; i < len; i++)
31252190Srpaulo		printf("%02X", *pos++);
32252190Srpaulo
33252190Srpaulo	printf("\n");
34252190Srpaulo}
35252190Srpaulo
36252190Srpaulo
37252190Srpauloint main(int argc, char *argv[])
38252190Srpaulo{
39252190Srpaulo	struct wpa_supplicant wpa_s;
40252190Srpaulo	int ret = -1;
41252190Srpaulo	struct wpabuf *buf = NULL, *ndef = NULL;
42252190Srpaulo	char txt[1000];
43252190Srpaulo
44252190Srpaulo	if (os_program_init())
45252190Srpaulo		return -1;
46252190Srpaulo	random_init(NULL);
47252190Srpaulo
48252190Srpaulo	os_memset(&wpa_s, 0, sizeof(wpa_s));
49252190Srpaulo	wpa_s.conf = os_zalloc(sizeof(*wpa_s.conf));
50252190Srpaulo	if (wpa_s.conf == NULL)
51252190Srpaulo		goto fail;
52252190Srpaulo
53252190Srpaulo	buf = wpas_wps_nfc_token(&wpa_s, 0);
54252190Srpaulo	if (buf == NULL)
55252190Srpaulo		goto fail;
56252190Srpaulo
57252190Srpaulo	ndef = ndef_build_wifi(buf);
58252190Srpaulo	if (ndef == NULL)
59252190Srpaulo		goto fail;
60252190Srpaulo
61252190Srpaulo	wpa_snprintf_hex_uppercase(txt, sizeof(txt), wpabuf_head(buf),
62252190Srpaulo				   wpabuf_len(buf));
63252190Srpaulo	printf("#WPS=%s\n", txt);
64252190Srpaulo
65252190Srpaulo	wpa_snprintf_hex_uppercase(txt, sizeof(txt), wpabuf_head(ndef),
66252190Srpaulo				   wpabuf_len(ndef));
67252190Srpaulo	printf("#NDEF=%s\n", txt);
68252190Srpaulo
69252190Srpaulo	printf("wps_nfc_dev_pw_id=%d\n", wpa_s.conf->wps_nfc_dev_pw_id);
70252190Srpaulo	print_bin("wps_nfc_dh_pubkey", wpa_s.conf->wps_nfc_dh_pubkey);
71252190Srpaulo	print_bin("wps_nfc_dh_privkey", wpa_s.conf->wps_nfc_dh_privkey);
72252190Srpaulo	print_bin("wps_nfc_dev_pw", wpa_s.conf->wps_nfc_dev_pw);
73252190Srpaulo
74252190Srpaulo	ret = 0;
75252190Srpaulofail:
76252190Srpaulo	wpabuf_free(ndef);
77252190Srpaulo	wpabuf_free(buf);
78252190Srpaulo	wpa_config_free(wpa_s.conf);
79252190Srpaulo	random_deinit();
80252190Srpaulo	os_program_deinit();
81252190Srpaulo
82252190Srpaulo	return ret;
83252190Srpaulo}
84