From 3a1cb7268171b896db61f151c48eb66b5e3e9306 Mon Sep 17 00:00:00 2001 From: Romuald Conty Date: Thu, 30 Jun 2011 14:59:47 +0000 Subject: [PATCH] examples/nfc-emulate-forum-tag2: add new example to emulate a NFC Forum Tag Type 2 --- examples/Makefile.am | 5 + examples/nfc-emulate-forum-tag2.c | 208 ++++++++++++++++++++++++++++++ 2 files changed, 213 insertions(+) create mode 100644 examples/nfc-emulate-forum-tag2.c diff --git a/examples/Makefile.am b/examples/Makefile.am index d0ae948..c6d93ed 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -4,6 +4,7 @@ bin_PROGRAMS = \ nfc-anticol \ nfc-dep-initiator \ nfc-dep-target \ + nfc-emulate-forum-tag2 \ nfc-emulate-forum-tag4 \ nfc-emulate-tag \ nfc-emulate-uid \ @@ -58,6 +59,10 @@ nfc_relay_picc_SOURCES = nfc-relay-picc.c nfc_relay_picc_LDADD = $(top_builddir)/libnfc/libnfc.la \ libnfcutils.la +nfc_emulate_forum_tag2_SOURCES = nfc-emulate-forum-tag2.c +nfc_emulate_forum_tag2_LDADD = $(top_builddir)/libnfc/libnfc.la \ + libnfcutils.la + nfc_emulate_forum_tag4_SOURCES = nfc-emulate-forum-tag4.c nfc_emulate_forum_tag4_LDADD = $(top_builddir)/libnfc/libnfc.la \ libnfcutils.la diff --git a/examples/nfc-emulate-forum-tag2.c b/examples/nfc-emulate-forum-tag2.c new file mode 100644 index 0000000..0159bae --- /dev/null +++ b/examples/nfc-emulate-forum-tag2.c @@ -0,0 +1,208 @@ +/*- + * Public platform independent Near Field Communication (NFC) library examples + * + * Copyright (C) 2011, Romuald Conty + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1) Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2 )Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * Note that this license only applies on the examples, NFC library itself is under LGPL + * + */ + +/** + * @file nfc-emulate-forum-tag2.c + * @brief Emulates a NFC Forum Tag Type 2 with a NDEF message + * This example allow to emulate an NFC Forum Tag Type 2 that contains a read-only NDEF message. + * + * It have been developed using PN533 USB hardware as target and Google Nexus S phone as initiator. + * + * This is know to NOT work with Nokia 6212 Classic and could not work with + * several NFC Forum compiliant devices due to these reasons: + * - The emulated target only have a 4 bytes UID where 7 bytes UID (as a real + * Mifare Ultralight tag) are usually attempted; + * - The chip is emulating a ISO/IEC 14443-3 tag, without any hardware helper. + * If the initiator have too short timeouts for software-based emulation + * (which is usually the case), this example will failed, this is not a bug + * and we can't do anything using this kind of hardware (PN531/PN533). + */ + +/* + * This implementation was written based on information provided by the + * following documents: + * + * NFC Forum Type 2 Tag Operation + * Technical Specification + * NFCForum-TS-Type-2-Tag_1.0 - 2007-07-09 + * + * ISO/IEC 14443-3 + * First edition - 2001-02-01 + * Identification cards — Contactless integrated circuit(s) cards — Proximity cards + * Part 3: Initialization and anticollision + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif // HAVE_CONFIG_H + +#include +#include +#include + +#include +#include + +#include "nfc-utils.h" + +static nfc_device_t *pnd; + +void +stop_emulation (int sig) +{ + (void)sig; + if (pnd) { + nfc_abort_command(pnd); + } else { + exit (EXIT_FAILURE); + } +} + +static uint8_t __nfcforum_tag2_memory_area[] = { + 0x00, 0x00, 0x00, 0x00, // Block 0 + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, // Block 2 (Static lock bytes: CC area and data area are read-only locked) + 0xE1, 0x10, 0x06, 0x0F, // Block 3 (CC - NFC-Forum Tag Type 2 version 1.0, Data area (from block 4 to the end) is 48 bytes, Read-only mode) + + 0x03, 33, 0xd1, 0x02, // Block 4 (NDEF) + 0x1c, 0x53, 0x70, 0x91, + 0x01, 0x09, 0x54, 0x02, + 0x65, 0x6e, 0x4c, 0x69, + + 0x62, 0x6e, 0x66, 0x63, + 0x51, 0x01, 0x0b, 0x55, + 0x03, 0x6c, 0x69, 0x62, + 0x6e, 0x66, 0x63, 0x2e, + + 0x6f, 0x72, 0x67, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, +}; + +#define READ 0x30 +#define WRITE 0xA2 +#define SECTOR_SELECT 0xC2 + +#define HALT 0x50 +int +nfcforum_tag2_io (struct nfc_emulator *emulator, const byte_t *data_in, const size_t data_in_len, byte_t *data_out, const size_t data_out_len) +{ + int res = 0; + + uint8_t *nfcforum_tag2_memory_area = (uint8_t *)(emulator->user_data); + + printf (" In: "); + print_hex (data_in, data_in_len); + + switch (data_in[0]) { + case READ: + if (data_out_len >= 16) { + memcpy(data_out, nfcforum_tag2_memory_area + (data_in[1] * 4), 16); + res = 16; + } else { + res = -ENOSPC; + } + break; + case HALT: + printf ("HALT sent\n"); + res = -ECONNABORTED; + break; + default: + printf ("Unknown command: 0x%02x\n", data_in[0]); + res = -ENOTSUP; + } + + if (res < 0) { + ERR ("%s (%d)", strerror (-res), -res); + } else { + printf (" Out: "); + print_hex (data_out, res); + } + + return res; +} + +int +main(int argc, char *argv[]) +{ + (void)argc; + (void)argv; + + nfc_target_t nt = { + .nm = { + .nmt = NMT_ISO14443A, + .nbr = NBR_UNDEFINED, // Will be updated by nfc_target_init() + }, + .nti = { + .nai = { + .abtAtqa = { 0x00, 0x04 }, + .abtUid = { 0x08, 0x00, 0xb0, 0x0b }, + .szUidLen = 4, + .btSak = 0x00, + .szAtsLen = 0, + }, + } + }; + + struct nfc_emulation_state_machine state_machine = { + .io = nfcforum_tag2_io + }; + + struct nfc_emulator emulator = { + .target= &nt, + .state_machine = &state_machine, + .user_data = __nfcforum_tag2_memory_area, + }; + + signal (SIGINT, stop_emulation); + pnd = nfc_connect (NULL); + + if (pnd == NULL) { + ERR("Unable to connect to NFC device"); + exit (EXIT_FAILURE); + } + + printf ("Connected to NFC device: %s\n", pnd->acName); + printf ("Emulating NDEF tag now, please touch it with a second NFC device\n"); + + if (nfc_emulate_target (pnd, &emulator) < 0) { + goto error; + } + + nfc_disconnect(pnd); + + exit (EXIT_SUCCESS); + +error: + if (pnd) { + nfc_perror (pnd, argv[0]); + nfc_disconnect (pnd); + } +}