1*f05cddf9SRui Paulo /*
2*f05cddf9SRui Paulo * nfc_pw_token - Tool for building NFC password tokens for WPS
3*f05cddf9SRui Paulo * Copyright (c) 2012, Jouni Malinen <j@w1.fi>
4*f05cddf9SRui Paulo *
5*f05cddf9SRui Paulo * This software may be distributed under the terms of the BSD license.
6*f05cddf9SRui Paulo * See README for more details.
7*f05cddf9SRui Paulo */
8*f05cddf9SRui Paulo
9*f05cddf9SRui Paulo #include "includes.h"
10*f05cddf9SRui Paulo
11*f05cddf9SRui Paulo #include "utils/common.h"
12*f05cddf9SRui Paulo #include "crypto/random.h"
13*f05cddf9SRui Paulo #include "wpa_supplicant_i.h"
14*f05cddf9SRui Paulo #include "config.h"
15*f05cddf9SRui Paulo #include "wps_supplicant.h"
16*f05cddf9SRui Paulo
17*f05cddf9SRui Paulo
print_bin(const char * title,const struct wpabuf * buf)18*f05cddf9SRui Paulo static void print_bin(const char *title, const struct wpabuf *buf)
19*f05cddf9SRui Paulo {
20*f05cddf9SRui Paulo size_t i, len;
21*f05cddf9SRui Paulo const u8 *pos;
22*f05cddf9SRui Paulo
23*f05cddf9SRui Paulo if (buf == NULL)
24*f05cddf9SRui Paulo return;
25*f05cddf9SRui Paulo
26*f05cddf9SRui Paulo printf("%s=", title);
27*f05cddf9SRui Paulo
28*f05cddf9SRui Paulo pos = wpabuf_head(buf);
29*f05cddf9SRui Paulo len = wpabuf_len(buf);
30*f05cddf9SRui Paulo for (i = 0; i < len; i++)
31*f05cddf9SRui Paulo printf("%02X", *pos++);
32*f05cddf9SRui Paulo
33*f05cddf9SRui Paulo printf("\n");
34*f05cddf9SRui Paulo }
35*f05cddf9SRui Paulo
36*f05cddf9SRui Paulo
main(int argc,char * argv[])37*f05cddf9SRui Paulo int main(int argc, char *argv[])
38*f05cddf9SRui Paulo {
39*f05cddf9SRui Paulo struct wpa_supplicant wpa_s;
40*f05cddf9SRui Paulo int ret = -1;
41*f05cddf9SRui Paulo struct wpabuf *buf = NULL, *ndef = NULL;
42*f05cddf9SRui Paulo char txt[1000];
43*f05cddf9SRui Paulo
44*f05cddf9SRui Paulo if (os_program_init())
45*f05cddf9SRui Paulo return -1;
46*f05cddf9SRui Paulo random_init(NULL);
47*f05cddf9SRui Paulo
48*f05cddf9SRui Paulo os_memset(&wpa_s, 0, sizeof(wpa_s));
49*f05cddf9SRui Paulo wpa_s.conf = os_zalloc(sizeof(*wpa_s.conf));
50*f05cddf9SRui Paulo if (wpa_s.conf == NULL)
51*f05cddf9SRui Paulo goto fail;
52*f05cddf9SRui Paulo
53*f05cddf9SRui Paulo buf = wpas_wps_nfc_token(&wpa_s, 0);
54*f05cddf9SRui Paulo if (buf == NULL)
55*f05cddf9SRui Paulo goto fail;
56*f05cddf9SRui Paulo
57*f05cddf9SRui Paulo ndef = ndef_build_wifi(buf);
58*f05cddf9SRui Paulo if (ndef == NULL)
59*f05cddf9SRui Paulo goto fail;
60*f05cddf9SRui Paulo
61*f05cddf9SRui Paulo wpa_snprintf_hex_uppercase(txt, sizeof(txt), wpabuf_head(buf),
62*f05cddf9SRui Paulo wpabuf_len(buf));
63*f05cddf9SRui Paulo printf("#WPS=%s\n", txt);
64*f05cddf9SRui Paulo
65*f05cddf9SRui Paulo wpa_snprintf_hex_uppercase(txt, sizeof(txt), wpabuf_head(ndef),
66*f05cddf9SRui Paulo wpabuf_len(ndef));
67*f05cddf9SRui Paulo printf("#NDEF=%s\n", txt);
68*f05cddf9SRui Paulo
69*f05cddf9SRui Paulo printf("wps_nfc_dev_pw_id=%d\n", wpa_s.conf->wps_nfc_dev_pw_id);
70*f05cddf9SRui Paulo print_bin("wps_nfc_dh_pubkey", wpa_s.conf->wps_nfc_dh_pubkey);
71*f05cddf9SRui Paulo print_bin("wps_nfc_dh_privkey", wpa_s.conf->wps_nfc_dh_privkey);
72*f05cddf9SRui Paulo print_bin("wps_nfc_dev_pw", wpa_s.conf->wps_nfc_dev_pw);
73*f05cddf9SRui Paulo
74*f05cddf9SRui Paulo ret = 0;
75*f05cddf9SRui Paulo fail:
76*f05cddf9SRui Paulo wpabuf_free(ndef);
77*f05cddf9SRui Paulo wpabuf_free(buf);
78*f05cddf9SRui Paulo wpa_config_free(wpa_s.conf);
79*f05cddf9SRui Paulo random_deinit();
80*f05cddf9SRui Paulo os_program_deinit();
81*f05cddf9SRui Paulo
82*f05cddf9SRui Paulo return ret;
83*f05cddf9SRui Paulo }
84