xref: /freebsd/contrib/wpa/wpa_supplicant/nfc_pw_token.c (revision 0bfd163f522701b486e066fa2e56624c02f5081a)
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