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