104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/*
204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * nfc_pw_token - Tool for building NFC password tokens for WPS
304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Copyright (c) 2012, Jouni Malinen <j@w1.fi>
404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * This software may be distributed under the terms of the BSD license.
604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * See README for more details.
704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "includes.h"
1004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
1104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "utils/common.h"
1204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "crypto/random.h"
1304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "wpa_supplicant_i.h"
1404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "config.h"
1504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "wps_supplicant.h"
1604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
1704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
1804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic void print_bin(const char *title, const struct wpabuf *buf)
1904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
2004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	size_t i, len;
2104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	const u8 *pos;
2204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
2304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (buf == NULL)
2404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return;
2504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
2604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	printf("%s=", title);
2704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
2804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	pos = wpabuf_head(buf);
2904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	len = wpabuf_len(buf);
3004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	for (i = 0; i < len; i++)
3104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		printf("%02X", *pos++);
3204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
3304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	printf("\n");
3404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
3504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
3604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
3704949598a23f501be6eec21697465fd46a28840aDmitry Shmidtint main(int argc, char *argv[])
3804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
3904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpa_supplicant wpa_s;
4004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	int ret = -1;
4104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct wpabuf *buf = NULL, *ndef = NULL;
4204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char txt[1000];
4304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
4404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (os_program_init())
4504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
4604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	random_init(NULL);
4704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
4804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	os_memset(&wpa_s, 0, sizeof(wpa_s));
4904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_s.conf = os_zalloc(sizeof(*wpa_s.conf));
5004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_s.conf == NULL)
5104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		goto fail;
5204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
5304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	buf = wpas_wps_nfc_token(&wpa_s, 0);
5404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (buf == NULL)
5504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		goto fail;
5604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
5704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	ndef = ndef_build_wifi(buf);
5804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (ndef == NULL)
5904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		goto fail;
6004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
6104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_snprintf_hex_uppercase(txt, sizeof(txt), wpabuf_head(buf),
6204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				   wpabuf_len(buf));
6304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	printf("#WPS=%s\n", txt);
6404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
6504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_snprintf_hex_uppercase(txt, sizeof(txt), wpabuf_head(ndef),
6604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				   wpabuf_len(ndef));
6704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	printf("#NDEF=%s\n", txt);
6804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
6904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	printf("wps_nfc_dev_pw_id=%d\n", wpa_s.conf->wps_nfc_dev_pw_id);
7004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	print_bin("wps_nfc_dh_pubkey", wpa_s.conf->wps_nfc_dh_pubkey);
7104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	print_bin("wps_nfc_dh_privkey", wpa_s.conf->wps_nfc_dh_privkey);
7204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	print_bin("wps_nfc_dev_pw", wpa_s.conf->wps_nfc_dev_pw);
7304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
7404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	ret = 0;
7504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtfail:
7604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpabuf_free(ndef);
7704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpabuf_free(buf);
7804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_config_free(wpa_s.conf);
7904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	random_deinit();
8004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	os_program_deinit();
8104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
8204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return ret;
8304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
84