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