Home | History | Annotate | Download | only in wps
      1 /*
      2  * NFC routines for Wi-Fi Protected Setup
      3  * Copyright (c) 2009-2012, Masashi Honma <masashi.honma (at) gmail.com>
      4  *
      5  * This software may be distributed under the terms of the BSD license.
      6  * See README for more details.
      7  */
      8 
      9 #include "includes.h"
     10 #include "common.h"
     11 
     12 #include "wps/wps.h"
     13 #include "wps_i.h"
     14 
     15 
     16 struct wps_nfc_data {
     17 	struct oob_nfc_device_data *oob_nfc_dev;
     18 };
     19 
     20 
     21 static void * init_nfc(struct wps_context *wps,
     22 		       struct oob_device_data *oob_dev, int registrar)
     23 {
     24 	struct oob_nfc_device_data *oob_nfc_dev;
     25 	struct wps_nfc_data *data;
     26 
     27 	oob_nfc_dev = wps_get_oob_nfc_device(oob_dev->device_name);
     28 	if (oob_nfc_dev == NULL) {
     29 		wpa_printf(MSG_ERROR, "WPS (NFC): Unknown NFC device (%s)",
     30 			   oob_dev->device_name);
     31 		return NULL;
     32 	}
     33 
     34 	if (oob_nfc_dev->init_func(oob_dev->device_path) < 0)
     35 		return NULL;
     36 
     37 	data = os_zalloc(sizeof(*data));
     38 	if (data == NULL) {
     39 		wpa_printf(MSG_ERROR, "WPS (NFC): Failed to allocate "
     40 			   "nfc data area");
     41 		return NULL;
     42 	}
     43 	data->oob_nfc_dev = oob_nfc_dev;
     44 	return data;
     45 }
     46 
     47 
     48 static struct wpabuf * read_nfc(void *priv)
     49 {
     50 	struct wps_nfc_data *data = priv;
     51 	struct wpabuf *wifi, *buf;
     52 	char *raw_data;
     53 	size_t len;
     54 
     55 	raw_data = data->oob_nfc_dev->read_func(&len);
     56 	if (raw_data == NULL)
     57 		return NULL;
     58 
     59 	wifi = wpabuf_alloc_copy(raw_data, len);
     60 	os_free(raw_data);
     61 	if (wifi == NULL) {
     62 		wpa_printf(MSG_ERROR, "WPS (NFC): Failed to allocate "
     63 			   "nfc read area");
     64 		return NULL;
     65 	}
     66 
     67 	buf = ndef_parse_wifi(wifi);
     68 	wpabuf_free(wifi);
     69 	if (buf == NULL)
     70 		wpa_printf(MSG_ERROR, "WPS (NFC): Failed to unwrap");
     71 	return buf;
     72 }
     73 
     74 
     75 static int write_nfc(void *priv, struct wpabuf *buf)
     76 {
     77 	struct wps_nfc_data *data = priv;
     78 	struct wpabuf *wifi;
     79 	int ret;
     80 
     81 	wifi = ndef_build_wifi(buf);
     82 	if (wifi == NULL) {
     83 		wpa_printf(MSG_ERROR, "WPS (NFC): Failed to wrap");
     84 		return -1;
     85 	}
     86 
     87 	ret = data->oob_nfc_dev->write_func(wpabuf_mhead(wifi),
     88 					    wpabuf_len(wifi));
     89 	wpabuf_free(wifi);
     90 	return ret;
     91 }
     92 
     93 
     94 static void deinit_nfc(void *priv)
     95 {
     96 	struct wps_nfc_data *data = priv;
     97 
     98 	data->oob_nfc_dev->deinit_func();
     99 
    100 	os_free(data);
    101 }
    102 
    103 
    104 struct oob_device_data oob_nfc_device_data = {
    105 	.device_name	= NULL,
    106 	.device_path	= NULL,
    107 	.init_func	= init_nfc,
    108 	.read_func	= read_nfc,
    109 	.write_func	= write_nfc,
    110 	.deinit_func	= deinit_nfc,
    111 };
    112