1 /*-
2  * Free/Libre Near Field Communication (NFC) library
3  *
4  * Libnfc historical contributors:
5  * Copyright (C) 2009      Roel Verdult
6  * Copyright (C) 2009-2013 Romuald Conty
7  * Copyright (C) 2010-2012 Romain Tartière
8  * Copyright (C) 2010-2013 Philippe Teuwen
9  * Copyright (C) 2012-2013 Ludovic Rousseau
10  * See AUTHORS file for a more comprehensive list of contributors.
11  * Additional contributors of this file:
12  *
13  * This program is free software: you can redistribute it and/or modify it
14  * under the terms of the GNU Lesser General Public License as published by the
15  * Free Software Foundation, either version 3 of the License, or (at your
16  * option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful, but WITHOUT
19  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
21  * more details.
22  *
23  * You should have received a copy of the GNU Lesser General Public License
24  * along with this program.  If not, see <http://www.gnu.org/licenses/>
25  */
26 
27 /**
28  * @file nfc-internal.h
29  * @brief Internal defines and macros
30  */
31 
32 #ifndef __NFC_INTERNAL_H__
33 #define __NFC_INTERNAL_H__
34 
35 #include <stdbool.h>
36 #include <err.h>
37 #  include <sys/time.h>
38 
39 #include "nfc/nfc.h"
40 
41 #include "log.h"
42 
43 /**
44  * @macro HAL
45  * @brief Execute corresponding driver function if exists.
46  */
47 #define HAL( FUNCTION, ... ) pnd->last_error = 0; \
48   if (pnd->driver->FUNCTION) { \
49     return pnd->driver->FUNCTION( __VA_ARGS__ ); \
50   } else { \
51     pnd->last_error = NFC_EDEVNOTSUPP; \
52     return false; \
53   }
54 
55 #ifndef MIN
56 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
57 #endif
58 #ifndef MAX
59 #define MAX(a,b) (((a) > (b)) ? (a) : (b))
60 #endif
61 
62 /*
63  * Buffer management macros.
64  *
65  * The following macros ease setting-up and using buffers:
66  * BUFFER_INIT (data, 5);      // data -> [ xx, xx, xx, xx, xx ]
67  * BUFFER_SIZE (data);         // size -> 0
68  * BUFFER_APPEND (data, 0x12); // data -> [ 12, xx, xx, xx, xx ]
69  * BUFFER_SIZE (data);         // size -> 1
70  * uint16_t x = 0x3456;        // We suppose we are little endian
71  * BUFFER_APPEND_BYTES (data, x, 2);
72  *                             // data -> [ 12, 56, 34, xx, xx ]
73  * BUFFER_SIZE (data);         // size -> 3
74  * BUFFER_APPEND_LE (data, x, 2, sizeof (x));
75  *                             // data -> [ 12, 56, 34, 34, 56 ]
76  * BUFFER_SIZE (data);         // size -> 5
77  */
78 
79 /*
80  * Initialise a buffer named buffer_name of size bytes.
81  */
82 #define BUFFER_INIT(buffer_name, size) \
83   uint8_t buffer_name[size]; \
84   size_t __##buffer_name##_n = 0
85 
86 /*
87  * Create a wrapper for an existing buffer.
88  * BEWARE!  It eats children!
89  */
90 #define BUFFER_ALIAS(buffer_name, origin) \
91   uint8_t *buffer_name = (void *)origin; \
92   size_t __##buffer_name##_n = 0;
93 
94 #define BUFFER_SIZE(buffer_name) (__##buffer_name##_n)
95 
96 #define BUFFER_CLEAR(buffer_name) (__##buffer_name##_n = 0)
97 /*
98  * Append one byte of data to the buffer buffer_name.
99  */
100 #define BUFFER_APPEND(buffer_name, data) \
101   do { \
102     buffer_name[__##buffer_name##_n++] = data; \
103   } while (0)
104 
105 /*
106  * Append size bytes of data to the buffer buffer_name.
107  */
108 #define BUFFER_APPEND_BYTES(buffer_name, data, size) \
109   do { \
110     size_t __n = 0; \
111     while (__n < size) { \
112       buffer_name[__##buffer_name##_n++] = ((uint8_t *)data)[__n++]; \
113     } \
114   } while (0)
115 
116 typedef enum {
117   NOT_INTRUSIVE,
118   INTRUSIVE,
119   NOT_AVAILABLE,
120 } scan_type_enum;
121 
122 struct nfc_driver {
123   const char *name;
124   const scan_type_enum scan_type;
125   size_t (*scan)(const nfc_context *context, nfc_connstring connstrings[], const size_t connstrings_len);
126   struct nfc_device *(*open)(const nfc_context *context, const nfc_connstring connstring);
127   void (*close)(struct nfc_device *pnd);
128   const char *(*strerror)(const struct nfc_device *pnd);
129 
130   int (*initiator_init)(struct nfc_device *pnd);
131   int (*initiator_init_secure_element)(struct nfc_device *pnd);
132   int (*initiator_select_passive_target)(struct nfc_device *pnd,  const nfc_modulation nm, const uint8_t *pbtInitData, const size_t szInitData, nfc_target *pnt);
133   int (*initiator_poll_target)(struct nfc_device *pnd, const nfc_modulation *pnmModulations, const size_t szModulations, const uint8_t uiPollNr, const uint8_t btPeriod, nfc_target *pnt);
134   int (*initiator_select_dep_target)(struct nfc_device *pnd, const nfc_dep_mode ndm, const nfc_baud_rate nbr, const nfc_dep_info *pndiInitiator, nfc_target *pnt, const int timeout);
135   int (*initiator_deselect_target)(struct nfc_device *pnd);
136   int (*initiator_transceive_bytes)(struct nfc_device *pnd, const uint8_t *pbtTx, const size_t szTx, uint8_t *pbtRx, const size_t szRx, int timeout);
137   int (*initiator_transceive_bits)(struct nfc_device *pnd, const uint8_t *pbtTx, const size_t szTxBits, const uint8_t *pbtTxPar, uint8_t *pbtRx, uint8_t *pbtRxPar);
138   int (*initiator_transceive_bytes_timed)(struct nfc_device *pnd, const uint8_t *pbtTx, const size_t szTx, uint8_t *pbtRx, const size_t szRx, uint32_t *cycles);
139   int (*initiator_transceive_bits_timed)(struct nfc_device *pnd, const uint8_t *pbtTx, const size_t szTxBits, const uint8_t *pbtTxPar, uint8_t *pbtRx, uint8_t *pbtRxPar, uint32_t *cycles);
140   int (*initiator_target_is_present)(struct nfc_device *pnd, const nfc_target *pnt);
141 
142   int (*target_init)(struct nfc_device *pnd, nfc_target *pnt, uint8_t *pbtRx, const size_t szRx, int timeout);
143   int (*target_send_bytes)(struct nfc_device *pnd, const uint8_t *pbtTx, const size_t szTx, int timeout);
144   int (*target_receive_bytes)(struct nfc_device *pnd, uint8_t *pbtRx, const size_t szRxLen, int timeout);
145   int (*target_send_bits)(struct nfc_device *pnd, const uint8_t *pbtTx, const size_t szTxBits, const uint8_t *pbtTxPar);
146   int (*target_receive_bits)(struct nfc_device *pnd, uint8_t *pbtRx, const size_t szRxLen, uint8_t *pbtRxPar);
147 
148   int (*device_set_property_bool)(struct nfc_device *pnd, const nfc_property property, const bool bEnable);
149   int (*device_set_property_int)(struct nfc_device *pnd, const nfc_property property, const int value);
150   int (*get_supported_modulation)(struct nfc_device *pnd, const nfc_mode mode, const nfc_modulation_type **const supported_mt);
151   int (*get_supported_baud_rate)(struct nfc_device *pnd, const nfc_modulation_type nmt, const nfc_baud_rate **const supported_br);
152   int (*device_get_information_about)(struct nfc_device *pnd, char **buf);
153 
154   int (*abort_command)(struct nfc_device *pnd);
155   int (*idle)(struct nfc_device *pnd);
156   int (*powerdown)(struct nfc_device *pnd);
157 };
158 
159 #  define DEVICE_NAME_LENGTH  256
160 #  define DEVICE_PORT_LENGTH  64
161 
162 #define MAX_USER_DEFINED_DEVICES 4
163 
164 struct nfc_user_defined_device {
165   char name[DEVICE_NAME_LENGTH];
166   nfc_connstring connstring;
167   bool optional;
168 };
169 
170 /**
171  * @struct nfc_context
172  * @brief NFC library context
173  * Struct which contains internal options, references, pointers, etc. used by library
174  */
175 struct nfc_context {
176   bool allow_autoscan;
177   bool allow_intrusive_scan;
178   uint32_t  log_level;
179   struct nfc_user_defined_device user_defined_devices[MAX_USER_DEFINED_DEVICES];
180   unsigned int user_defined_device_count;
181 };
182 
183 nfc_context *nfc_context_new(void);
184 void nfc_context_free(nfc_context *context);
185 
186 /**
187  * @struct nfc_device
188  * @brief NFC device information
189  */
190 struct nfc_device {
191   const nfc_context *context;
192   const struct nfc_driver *driver;
193   void *driver_data;
194   void *chip_data;
195 
196   /** Device name string, including device wrapper firmware */
197   char    name[DEVICE_NAME_LENGTH];
198   /** Device connection string */
199   nfc_connstring connstring;
200   /** Is the CRC automaticly added, checked and removed from the frames */
201   bool    bCrc;
202   /** Does the chip handle parity bits, all parities are handled as data */
203   bool    bPar;
204   /** Should the chip handle frames encapsulation and chaining */
205   bool    bEasyFraming;
206   /** Should the chip try forever on select? */
207   bool    bInfiniteSelect;
208   /** Should the chip switch automatically activate ISO14443-4 when
209       selecting tags supporting it? */
210   bool    bAutoIso14443_4;
211   /** Supported modulation encoded in a byte */
212   uint8_t  btSupportByte;
213   /** Last reported error */
214   int     last_error;
215 };
216 
217 nfc_device *nfc_device_new(const nfc_context *context, const nfc_connstring connstring);
218 void        nfc_device_free(nfc_device *dev);
219 
220 void string_as_boolean(const char *s, bool *value);
221 
222 void iso14443_cascade_uid(const uint8_t abtUID[], const size_t szUID, uint8_t *pbtCascadedUID, size_t *pszCascadedUID);
223 
224 void prepare_initiator_data(const nfc_modulation nm, uint8_t **ppbtInitiatorData, size_t *pszInitiatorData);
225 
226 int connstring_decode(const nfc_connstring connstring, const char *driver_name, const char *bus_name, char **pparam1, char **pparam2);
227 
228 #endif // __NFC_INTERNAL_H__
229