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