18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * NFC PN531 routines for Wi-Fi Protected Setup
304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Copyright (c) 2009-2012, Masashi Honma <masashi.honma@gmail.com>
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * This software may be distributed under the terms of the BSD license.
604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * See README for more details.
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h"
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h"
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wps/wps.h"
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wps_i.h"
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "WpsNfcType.h"
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "WpsNfc.h"
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int init_nfc_pn531(char *path)
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u32 ret;
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = WpsNfcInit();
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret != WPS_NFCLIB_ERR_SUCCESS) {
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "WPS (PN531): Failed to initialize "
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "NFC Library: 0x%08x", ret);
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = WpsNfcOpenDevice((int8 *) path);
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret != WPS_NFCLIB_ERR_SUCCESS) {
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "WPS (PN531): Failed to open "
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "NFC Device(%s): 0x%08x", path, ret);
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto fail;
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = WpsNfcTokenDiscovery();
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret != WPS_NFCLIB_ERR_SUCCESS) {
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "WPS (PN531): Failed to discover "
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "token: 0x%08x", ret);
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		WpsNfcCloseDevice();
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		goto fail;
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtfail:
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	WpsNfcDeinit();
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void * read_nfc_pn531(size_t *size)
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	uint32 len;
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u32 ret;
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int8 *data;
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = WpsNfcRawReadToken(&data, &len);
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret != WPS_NFCLIB_ERR_SUCCESS) {
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "WPS (PN531): Failed to read: 0x%08x",
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   ret);
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	*size = len;
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return data;
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int write_nfc_pn531(void *data, size_t len)
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u32 ret;
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = WpsNfcRawWriteToken(data, len);
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret != WPS_NFCLIB_ERR_SUCCESS) {
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "WPS (PN531): Failed to write: 0x%08x",
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   ret);
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void deinit_nfc_pn531(void)
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u32 ret;
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = WpsNfcCloseDevice();
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret != WPS_NFCLIB_ERR_SUCCESS)
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "WPS (PN531): Failed to close "
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "NFC Device: 0x%08x", ret);
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = WpsNfcDeinit();
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret != WPS_NFCLIB_ERR_SUCCESS)
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_printf(MSG_ERROR, "WPS (PN531): Failed to deinitialize "
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			   "NFC Library: 0x%08x", ret);
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct oob_nfc_device_data oob_nfc_pn531_device_data = {
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	.init_func	= init_nfc_pn531,
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	.read_func	= read_nfc_pn531,
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	.write_func	= write_nfc_pn531,
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	.deinit_func	= deinit_nfc_pn531,
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
108