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