1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /*
18  * NFC Ndef Mapping For Different Smart Cards.
19  *
20  */
21 
22 #ifndef PHFRINFC_NDEFMAP_H
23 #define PHFRINFC_NDEFMAP_H
24 
25 /*include files*/
26 #include <phFriNfc.h>
27 #include <phNfcStatus.h>
28 #include <phNfcTypes.h>
29 #include <phNfcTypes_Mapping.h>
30 
31 /*  NDEF Mapping Component
32  *
33  *  This component implements the read/write/check NDEF functions for remote
34  * devices. NDEF data, as defined by the NFC Forum NDEF specification are
35  * written to or read from a remote device that can be a smart- or memory card.
36  *  Please notice that the NDEF mapping command sequence must
37  *  be contiguous (after correct initialization)
38  *
39  */
40 
41 /*
42  * NDEF Mapping - specifies the different card types
43  * These are the only recognized card types in this version.
44  *
45  */
46 
47 #define PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD 7  /* Mifare Standard */
48 #define PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD 8  /* Mifare Standard */
49 #define PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD 11 /*internal Mifare Standard */
50 #define PH_FRINFC_NDEFMAP_EMPTY_NDEF_MSG \
51   { 0xD0, 0x00, 0x00 }                      /* Empty ndef message */
52 #define PH_FRINFC_NDEFMAP_MFUL_4BYTES_BUF 4 /* To store 4 bytes after write */
53 
54 /* Enum represents the different card state*/
55 typedef enum {
56   PH_NDEFMAP_CARD_STATE_INITIALIZED,
57   PH_NDEFMAP_CARD_STATE_READ_ONLY,
58   PH_NDEFMAP_CARD_STATE_READ_WRITE,
59   PH_NDEFMAP_CARD_STATE_INVALID
60 } phNDEF_CARD_STATE;
61 
62 /*
63  * NDEF Mapping - specifies the Compliant Blocks in the Mifare 1k and 4k card
64  * types
65  *
66  */
67 #define PH_FRINFC_NDEFMAP_MIFARESTD_1KNDEF_COMPBLOCK \
68   45 /* Total Ndef Compliant blocks Mifare 1k */
69 #define PH_FRINFC_NDEFMAP_MIFARESTD_2KNDEF_COMPBLOCK \
70   90 /* Total Ndef Compliant blocks Mifare 2k */
71 #define PH_FRINFC_NDEFMAP_MIFARESTD_4KNDEF_COMPBLOCK \
72   210 /* Total Ndef Compliant blocks Mifare 4k */
73 #define PH_FRINFC_NDEFMAP_MIFARESTD_RDWR_SIZE \
74   16 /* Bytes read/write for one read/write operation*/
75 #define PH_FRINFC_NDEFMAP_MIFARESTD_TOTALNO_BLK \
76   40 /* Total number of sectors in Mifare 4k */
77 #define PH_FRINFC_NDEFMAP_MIFARESTD_ST15_BYTES \
78   15 /* To store 15 bytes after reading a block */
79 
80 /*
81  * Completion Routine Indices
82  *
83  * These are the indices of the completion routine pointers within the component
84  * context. Completion routines belong to upper components.
85  *
86  */
87 #define PH_FRINFC_NDEFMAP_CR_CHK_NDEF 0    /* */
88 #define PH_FRINFC_NDEFMAP_CR_RD_NDEF 1     /* */
89 #define PH_FRINFC_NDEFMAP_CR_WR_NDEF 2     /* */
90 #define PH_FRINFC_NDEFMAP_CR_ERASE_NDEF 3  /* */
91 #define PH_FRINFC_NDEFMAP_CR_INVALID_OPE 4 /* */
92 #define PH_FRINFC_NDEFMAP_CR 5             /* */
93 
94 /*
95  * File Offset Attributes
96  *
97  * Following values are used to determine the offset value for Read/Write. This
98  * specifies whether the Read/Write operation needs to be restarted/continued
99  * from the last offset set.
100  *
101  */
102 /* Read/Write operation shall start from the last offset set */
103 #define PH_FRINFC_NDEFMAP_SEEK_CUR 0 /* */
104 /* Read/Write operation shall start from the beginning of the file/card */
105 #define PH_FRINFC_NDEFMAP_SEEK_BEGIN 1 /* */
106 
107 /* Read operation invalid */
108 #define PH_FRINFC_NDEFMAP_SEEK_INVALID 0xFF /* */
109 
110 /*
111  * Buffer Size Definitions
112  *
113  */
114 /* Minimum size of the TRX buffer required */
115 #define PH_FRINFC_NDEFMAP_MAX_SEND_RECV_BUF_SIZE 252 /* */
116 /* The size of s MIFARE block */
117 #define PH_FRINFC_NDEFMAP_MF_READ_BLOCK_SIZE 16 /* */
118 
119 typedef struct phFriNfc_MifareStdCont {
120   /* to store bytes that will be used in the next write/read operation, if any
121    */
122   uint8_t internalBuf[PH_FRINFC_NDEFMAP_MIFARESTD_ST15_BYTES];
123   /* to Store the length of the internalBuf */
124   uint16_t internalLength;
125   /* holds the block number which is presently been used */
126   uint8_t currentBlock;
127   /* the number of Ndef compliant blocks written/read */
128   uint8_t NdefBlocks;
129   /* Total Number of Ndef compliant Blocks */
130   uint16_t NoOfNdefCompBlocks;
131   /* used in write ndef, to know that internal byte are accessed */
132   uint8_t internalBufFlag;
133   /* used in write ndef, to know that last 16 bytes are used to write*/
134   uint8_t RemainingBufFlag;
135   /* indicates that Read has reached the end of the card */
136   uint8_t ReadWriteCompleteFlag;
137   /* indicates that Read has reached the end of the card */
138   uint8_t ReadCompleteFlag;
139   /* indicates that Write is possible or not */
140   uint8_t WriteFlag;
141   /* indicates that Write is possible or not */
142   uint8_t ReadFlag;
143   /* indicates that Write is possible or not */
144   uint8_t RdBeforeWrFlag;
145   /* Authentication Flag indicating that a particular sector is authenticated or
146    * not */
147   uint8_t AuthDone;
148   /* to store the last Sector ID in Check Ndef */
149   uint8_t SectorIndex;
150   /* to read the access bits of each sector */
151   uint8_t ReadAcsBitFlag;
152   /* Flag to check if Acs bit was written in this call */
153   uint8_t WriteAcsBitFlag;
154   /* Buffer to store 16 bytes */
155   uint8_t Buffer[PH_FRINFC_NDEFMAP_MIFARESTD_RDWR_SIZE];
156   /* to store the AIDs of Mifare 1k or 4k */
157   uint8_t aid[PH_FRINFC_NDEFMAP_MIFARESTD_TOTALNO_BLK];
158   /* flag to write with offset begin */
159   uint8_t WrNdefFlag;
160   /* flag to read with offset begin */
161   uint8_t ReadNdefFlag;
162   /* flag to check with offset begin */
163   uint8_t ChkNdefFlag;
164   /* To store the remaining size of the Mifare 1k or 4k card */
165   uint16_t remainingSize;
166   /* To update the remaining size when writing to the Mifare 1k or 4k card */
167   uint8_t remSizeUpdFlag;
168   /* The flag is to know that there is a different AID apart from NFC forum
169    * sector AID */
170   uint16_t aidCompleteFlag;
171   /* The flag is to know that there is a a NFC forum sector exists in the card
172    */
173   uint16_t NFCforumSectFlag;
174   /* The flag is to know that the particular sector is a proprietary NFC forum
175    * sector */
176   uint16_t ProprforumSectFlag;
177   /* The flag is set after reading the MAD sectors */
178   uint16_t ChkNdefCompleteFlag;
179   /* Flag to store the current block */
180   uint8_t TempBlockNo;
181   /* Completion routine index */
182   uint8_t CRIndex;
183   /* Bytes remaining to write for one write procedure */
184   uint16_t WrLength;
185   /* Flag to read after write */
186   uint8_t RdAfterWrFlag;
187   /* Flag to say that poll is required before write ndef (authentication) */
188   uint8_t PollFlag;
189   /* Flag is to know that this is first time the read has been called. This
190   is required when read is called after write (especially for the card formatted
191   with the 2nd configuration) */
192   uint8_t FirstReadFlag;
193   /* Flag is to know that this is first time the write has been called. This
194   is required when the card formatted with the 3rd configuration */
195   uint8_t FirstWriteFlag;
196   /* Indicates the sector trailor id  for which the convert
197       to read only is currently in progress*/
198   uint8_t ReadOnlySectorIndex;
199   /* Indicates the total number of sectors on the card  */
200   uint8_t TotalNoSectors;
201   /* Indicates the block number of the sector trailor on the card  */
202   uint8_t SectorTrailerBlockNo;
203   /* Secret key B to given by the application */
204   uint8_t UserScrtKeyB[6];
205 } phFriNfc_MifareStdCont_t;
206 
207 /*
208  *  NDEF TLV structure which details the different variables used for TLV.
209  *
210  */
211 typedef struct phFriNfc_NDEFTLVCont {
212   /* Flag is to know that the TLV Type Found */
213   uint8_t NdefTLVFoundFlag;
214   /* Sector number of the next/present available TLV */
215   uint8_t NdefTLVSector;
216   /* Following two variables are used to store the
217       T byte and the Block number in which the T is
218       found in Tag */
219   /* Byte number of the next/present available TLV */
220   uint16_t NdefTLVByte;
221   /* Block number of the next/present available TLV */
222   uint8_t NdefTLVBlock;
223   /* Authentication flag for NDEF TLV Block */
224   uint8_t NdefTLVAuthFlag;
225   /* if the 16th byte of the last read is type (T) of TLV
226       and next read contains length (L) bytes of TLV. This flag
227       is set when the type (T) of TLV is found in the last read */
228   uint8_t TcheckedinTLVFlag;
229   /* if the 16th byte of the last read is Length (L) of TLV
230       and next read contains length (L) bytes of TLV. This flag
231       is set when the Length (L) of TLV is found in the last read */
232   uint8_t LcheckedinTLVFlag;
233   /* This flag is set, if Terminator TLV is already written
234       and next read contains value (V) bytes of TLV. This flag
235       is set when the value (V) of TLV is found in the last read */
236   uint8_t SetTermTLVFlag;
237   /* To know the number of Length (L) field is present in the
238       next block */
239   uint8_t NoLbytesinTLV;
240   /* The value of 3 bytes length(L) field in TLV. In 3 bytes
241       length field, 2 bytes are in one block and other 1 byte
242       is in the next block. To store the former block length
243       field value, this variable is used */
244   uint16_t prevLenByteValue;
245   /* The value of length(L) field in TLV. */
246   uint16_t BytesRemainLinTLV;
247   /* Actual size to read and write. This will be always equal to the
248       length (L) of TLV as there is only one NDEF TLV . */
249   uint16_t ActualSize;
250   /* Flag is to write the length (L) field of the TLV */
251   uint8_t WrLenFlag;
252   /* Flag is to write the length (L) field of the TLV */
253   uint16_t NULLTLVCount;
254   /* Buffer to store 4 bytes of data which is written to a block */
255   uint8_t NdefTLVBuffer[PH_FRINFC_NDEFMAP_MFUL_4BYTES_BUF];
256   /* Buffer to store 4 bytes of data which is written to a next block */
257   uint8_t NdefTLVBuffer1[PH_FRINFC_NDEFMAP_MFUL_4BYTES_BUF];
258 } phFriNfc_NDEFTLVCont_t;
259 
260 /*
261  *  Lock Control TLV structure which stores the Position, Size and PageCntrl
262  * details.
263  */
264 
265 typedef struct phFriNfc_LockCntrlTLVCont {
266   /* Specifies the Byte Position of the lock cntrl tlv
267       in the card memory*/
268   uint16_t ByteAddr;
269 
270   /* Specifies the Size of the lock area in terms of
271       bits/bytes*/
272   uint16_t Size;
273 
274   /* Specifies the Bytes per Page*/
275   uint8_t BytesPerPage;
276 
277   /* Specifies the BytesLockedPerLockBit */
278   uint8_t BytesLockedPerLockBit;
279 
280   /* Specifies the index of Lock cntrl TLV*/
281   uint8_t LockTlvBuffIdx;
282 
283   /* Store the content of Lock cntrl TLV*/
284   uint8_t LockTlvBuff[8];
285 
286   /* Specifies the Block number Lock cntrl TLV*/
287   uint16_t BlkNum;
288 
289   /* Specifies the Byte Number position of Lock cntrl TLV*/
290   uint16_t ByteNum;
291 
292 } phFriNfc_LockCntrlTLVCont_t;
293 
294 /*
295  *  Memory Control TLV structure which stores the Position, Size and PageCntrl
296  * details of the reserved byte area.
297  */
298 
299 typedef struct phFriNfc_ResMemCntrlTLVCont {
300   /* Specifies the Byte Position of the lock cntrl tlv
301       in the card memory */
302   uint16_t ByteAddr;
303 
304   /* Specifies the Size of the lock area in terms of
305       bits/bytes*/
306   uint16_t Size;
307 
308   /* Store the content of Memory cntrl TLV*/
309   uint8_t MemCntrlTlvBuff[8];
310 
311   /* Specifies the Bytes per Page*/
312   uint8_t BytesPerPage;
313 
314   /* Specifies the index of Mem cntrl TLV*/
315   uint8_t MemTlvBuffIdx;
316 
317   /* Specifies the Block number Lock cntrl TLV*/
318   uint16_t BlkNum;
319 
320   /* Specifies the Byte Number position of Lock cntrl TLV*/
321   uint16_t ByteNum;
322 
323 } phFriNfc_ResMemCntrlTLVCont_t;
324 
325 /*
326  *  NFC NDEF Mapping Component Context Structure
327  *
328  *  This structure is used to store the current context information of the
329  * instance.
330  *
331  */
332 typedef struct phFriNfc_NdefMap {
333   /* The state of the operation. */
334   uint8_t State;
335 
336   /* Completion Routine Context. */
337   phFriNfc_CplRt_t CompletionRoutine[PH_FRINFC_NDEFMAP_CR];
338 
339   phNfc_sTransceiveInfo_t* pTransceiveInfo;
340 
341   /*Holds the completion routine informations of the Map Layer*/
342   phFriNfc_CplRt_t MapCompletionInfo;
343 
344   /* Pointer to the Remote Device Information */
345   phLibNfc_sRemoteDevInformation_t* psRemoteDevInfo;
346 
347   /*Holds the Command Type(read/write)*/
348   phNfc_uCmdList_t Cmd;
349 
350   /* Pointer to a temporary buffer. Could be
351         used for read/write purposes */
352   uint8_t* ApduBuffer;
353 
354   /* Size allocated to the ApduBuffer. */
355   uint32_t ApduBufferSize;
356 
357   /* Index to the APDU Buffer. Used for internal calculations */
358   uint16_t ApduBuffIndex;
359 
360   /* Pointer to the user-provided Data Size to be written trough WrNdef
361    * function. */
362   uint32_t* WrNdefPacketLength;
363 
364   /* Holds the length of the received data. */
365   uint16_t* SendRecvLength;
366 
367   /*Holds the ack of some initial commands*/
368   uint8_t* SendRecvBuf;
369 
370   /* Holds the length of the data to be sent. */
371   uint16_t SendLength;
372 
373   /* Data Byte Count, which gives the offset to the integration.*/
374   uint16_t* DataCount;
375 
376   /* Holds the previous operation on the card*/
377   uint8_t PrevOperation;
378 
379   /* Holds the previous read mode*/
380   uint8_t bPrevReadMode;
381 
382   /* Holds the current read mode*/
383   uint8_t bCurrReadMode;
384 
385   /* Holds the previous state on the card*/
386   uint8_t PrevState;
387 
388   /* Stores the type of the smart card. */
389   uint8_t CardType;
390 
391   /* Stores the card state. */
392   uint8_t CardState;
393 
394   /* Stores the memory size of the card */
395   uint16_t CardMemSize;
396 
397   /*to Store the page offset on the mifare ul card*/
398   uint8_t Offset;
399 
400   /* specifies the desired operation to be performed*/
401   uint8_t DespOpFlag;
402 
403   /*  Used to remember how many bytes were written, to update
404                  the dataCount and the BufferIndex */
405   uint16_t NumOfBytesWritten;
406 
407   /*used to remember number of L byte Remaining to be written */
408   uint16_t NumOfLReminWrite;
409 
410   /*  Pointer Used to remember and return how many bytes were read,
411                  to update the PacketDataLength in case of Read operation */
412   /*  Fix for 0000238: [gk] MAP: Number of bytes actually read out is
413       not returned. */
414   uint32_t* NumOfBytesRead;
415 
416   /*  Flag used to tell the process function that WRITE has
417                  requested for an internal READ.*/
418   uint8_t ReadingForWriteOperation;
419 
420   /*  Buffer of 5 bytes used for the write operation for the
421                  Mifare UL card.*/
422   uint8_t BufferForWriteOp[5];
423 
424   /* Temporary Receive Length to update the Receive Length
425                 when every time the Overlapped HAL is called. */
426   uint16_t TempReceiveLength;
427 
428   uint8_t NoOfDevices;
429 
430   /* stores operating mode type of the felica smart tag */
431   /* phHal_eOpModes_t                OpModeType[2]; */
432 
433   /* stores the type of the TLV found */
434   uint8_t TLVFoundFlag;
435 
436   /* stores the TLV structure related informations  */
437   phFriNfc_NDEFTLVCont_t TLVStruct;
438 
439   /* stores the Lock Contrl Tlv related informations  */
440   phFriNfc_LockCntrlTLVCont_t LockTlv;
441 
442   /* stores the Mem Contrl Tlv related informations  */
443   phFriNfc_ResMemCntrlTLVCont_t MemTlv;
444 
445   /* Pointer to the Mifare Standard capability Container Structure. */
446   phFriNfc_MifareStdCont_t StdMifareContainer;
447 
448 } phFriNfc_NdefMap_t;
449 
450 /*
451  * States of the FSM.
452  */
453 #define PH_FRINFC_NDEFMAP_STATE_RESET_INIT 0    /* Initial state */
454 #define PH_FRINFC_NDEFMAP_STATE_CR_REGISTERED 1 /* CR has been registered */
455 #define PH_FRINFC_NDEFMAP_STATE_EOF_CARD 2      /* EOF card reached */
456 
457 /* Following values specify the previous operation on the card. This value is
458    assigned to the context structure variable: PrevOperation. */
459 
460 /* Previous operation is check */
461 #define PH_FRINFC_NDEFMAP_CHECK_OPE 1
462 /* Previous operation is read */
463 #define PH_FRINFC_NDEFMAP_READ_OPE 2
464 /* Previous operation is write */
465 #define PH_FRINFC_NDEFMAP_WRITE_OPE 3
466 /* Previous operation is Actual size */
467 #define PH_FRINFC_NDEFMAP_GET_ACTSIZE_OPE 4
468 
469 /* This flag is set when there is a need of write operation on the odd positions
470    ex: 35,5 etc. This is used with MfUlOp Flag */
471 #define PH_FRINFC_MFUL_INTERNAL_READ 3 /* Read/Write control*/
472 
473 #endif /* PHFRINFC_NDEFMAP_H */
474