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 Remote Devices.
19  *
20  */
21 
22 #include <phFriNfc_MifStdFormat.h>
23 #include <phNfcCompId.h>
24 #include <phNxpExtns_MifareStd.h>
25 #include <phFriNfc_MifareStdMap.h>
26 
27 /**************** local methods used in this file only ************************/
28 static NFCSTATUS phFriNfc_MifStd_H_RdABlock (phFriNfc_NdefMap_t *NdefMap);
29 static NFCSTATUS phFriNfc_MifStd_H_WrABlock (phFriNfc_NdefMap_t *NdefMap);
30 static NFCSTATUS phFriNfc_MifStd_H_AuthSector (phFriNfc_NdefMap_t *NdefMap);
31 static NFCSTATUS phFriNfc_MifStd4k_H_CheckNdef (phFriNfc_NdefMap_t *NdefMap);
32 static void phFriNfc_MifStd_H_fillAIDarray (phFriNfc_NdefMap_t *NdefMap);
33 static uint8_t phFriNfc_MifStd_H_GetSect (uint8_t BlockNumber);
34 static NFCSTATUS phFriNfc_MifStd_H_BlkChk (phFriNfc_NdefMap_t *NdefMap);
35 static NFCSTATUS phFriNfc_MifStd_H_RdAcsBit (phFriNfc_NdefMap_t *NdefMap);
36 static NFCSTATUS phFriNfc_MifStd_H_ChkAcsBit (phFriNfc_NdefMap_t *NdefMap);
37 static NFCSTATUS phFriNfc_MifStd_H_ChkRdWr (phFriNfc_NdefMap_t *NdefMap);
38 static void phFriNfc_MifStd_H_ChkNdefCmpltSects (phFriNfc_NdefMap_t *NdefMap);
39 static NFCSTATUS phFriNfc_MifStd_H_RemainTLV (phFriNfc_NdefMap_t *NdefMap,
40                                          uint8_t            *Flag,
41                                          uint8_t            *Temp16Bytes);
42 static NFCSTATUS phFriNfc_MifStd_H_ChkIntLen (phFriNfc_NdefMap_t *NdefMap);
43 static NFCSTATUS phFriNfc_MifStd_H_IntLenWioutNdef (phFriNfc_NdefMap_t *NdefMap,
44                                             uint8_t             *Flag,
45                                             uint8_t             *TempintBytes);
46 static uint8_t phFriNfc_MifStd_H_UpdateTLV (phFriNfc_NdefMap_t *NdefMap);
47 static NFCSTATUS phFriNfc_MifStd_H_WriteNdefLen (phFriNfc_NdefMap_t *NdefMap);
48 static void phFriNfc_MifStd_H_SetNdefBlkAuth (phFriNfc_NdefMap_t *NdefMap);
49 static void phFriNfc_MifStd_H_RdWrReset (phFriNfc_NdefMap_t *NdefMap);
50 static NFCSTATUS phFriNfc_MifStd_H_RdtoWrNdefLen (phFriNfc_NdefMap_t *NdefMap);
51 static NFCSTATUS phFriNfc_MifStd_H_GetActCardLen (phFriNfc_NdefMap_t *NdefMap);
52 static NFCSTATUS phFriNfc_MifStd_H_ChkTLVs (phFriNfc_NdefMap_t *NdefMap,
53                                            uint8_t            *CRFlag);
54 static NFCSTATUS phFriNfc_MifStd_H_GetNxtTLV (phFriNfc_NdefMap_t *NdefMap,
55                                        uint16_t             *TempLength,
56                                        uint8_t              *TL4bytesFlag);
57 static NFCSTATUS phFriNfc_MifStd_H_Chk16Bytes (phFriNfc_NdefMap_t *NdefMap,
58                                        uint16_t             TempLength);
59 static NFCSTATUS phFriNfc_MifStd_H_ChkRemainTLVs (phFriNfc_NdefMap_t *NdefMap,
60                                           uint8_t            *CRFlag,
61                                           uint8_t            *NDEFFlag);
62 static void phFriNfc_MifStd_H_Complete (phFriNfc_NdefMap_t *NdefMap,
63                                  NFCSTATUS            Result);
64 static void phFriNfc_MifStd_H_Get1kStTrail (phFriNfc_NdefMap_t *NdefMap);
65 static void phFriNfc_MifStd_H_Get4kStTrail (phFriNfc_NdefMap_t *NdefMap);
66 static NFCSTATUS phFriNfc_MifStd_H_ProChkNdef (phFriNfc_NdefMap_t *NdefMap);
67 static NFCSTATUS phFriNfc_MifStd_H_ProAuth (phFriNfc_NdefMap_t *NdefMap);
68 static NFCSTATUS phFriNfc_MifStd_H_Rd16Bytes (phFriNfc_NdefMap_t *NdefMap,
69                                               uint8_t               BlockNo);
70 static NFCSTATUS phFriNfc_MifStd_H_ProAcsBits (phFriNfc_NdefMap_t *NdefMap);
71 static NFCSTATUS phFriNfc_MifStd_H_GPBChk (phFriNfc_NdefMap_t *NdefMap);
72 static NFCSTATUS phFriNfc_MifStd_H_ProStatNotValid (phFriNfc_NdefMap_t *NdefMap,
73                                                    NFCSTATUS             status);
74 static NFCSTATUS phFriNfc_MifStd_H_RdBeforeWr (phFriNfc_NdefMap_t *NdefMap);
75 static NFCSTATUS phFriNfc_MifStd_H_ProBytesToWr (phFriNfc_NdefMap_t *NdefMap);
76 static NFCSTATUS phFriNfc_MifStd_H_fillSendBuf (phFriNfc_NdefMap_t *NdefMap,
77                                                uint8_t                   Length);
78 static NFCSTATUS phFriNfc_MifStd_H_WrTLV (phFriNfc_NdefMap_t *NdefMap);
79 static NFCSTATUS phFriNfc_MifStd_H_ProWrTLV (phFriNfc_NdefMap_t *NdefMap);
80 static uint8_t phFriNfc_MifStd_H_UpdRemTLV (phFriNfc_NdefMap_t *NdefMap);
81 static void phFriNfc_MifStd_H_fillTLV1 (phFriNfc_NdefMap_t *NdefMap);
82 static void phFriNfc_MifStd_H_fillTLV2 (phFriNfc_NdefMap_t *NdefMap);
83 static NFCSTATUS phFriNfc_MifStd_H_CallWrNdefLen (phFriNfc_NdefMap_t *NdefMap);
84 static NFCSTATUS phFriNfc_MifStd_H_BlkChk_1 (phFriNfc_NdefMap_t *NdefMap);
85 static void phFriNfc_MifStd_H_fillTLV1_1 (phFriNfc_NdefMap_t *NdefMap);
86 static void phFriNfc_MifStd_H_fillTLV2_1 (phFriNfc_NdefMap_t *NdefMap);
87 static NFCSTATUS phFriNfc_MifStd_H_RdTLV (phFriNfc_NdefMap_t *NdefMap);
88 static NFCSTATUS phFriNfc_MifStd_H_ProRdTLV (phFriNfc_NdefMap_t *NdefMap);
89 static NFCSTATUS phFriNfc_MifStd_H_WrTermTLV (phFriNfc_NdefMap_t *NdefMap);
90 static NFCSTATUS phFriNfc_MifStd_H_ProWrABlock (phFriNfc_NdefMap_t *NdefMap);
91 static NFCSTATUS phFriNfc_MifStd_H_CallConnect (phFriNfc_NdefMap_t *NdefMap);
92 static NFCSTATUS phFriNfc_MifStd_H_CallDisCon (phFriNfc_NdefMap_t *NdefMap);
93 static void phFriNfc_MifStd1k_H_BlkChk (phFriNfc_NdefMap_t *NdefMap,
94                                     uint8_t              SectorID,
95                                     uint8_t              *callbreak);
96 static uint8_t phFriNfc_MifStd_H_GetSectorTrailerBlkNo (uint8_t SectorID);
97 static NFCSTATUS phFriNfc_MifStd_H_ProSectorTrailorAcsBits (phFriNfc_NdefMap_t *NdefMap);
98 static NFCSTATUS phFriNfc_MifStd_H_WrSectorTrailorBlock (phFriNfc_NdefMap_t *NdefMap);
99 static NFCSTATUS phFriNfc_MifStd_H_ProWrSectorTrailor (phFriNfc_NdefMap_t *NdefMap);
100 static NFCSTATUS   phFriNfc_MapTool_ChkSpcVer (const phFriNfc_NdefMap_t *NdefMap,
101                                         uint8_t             VersionIndex) __attribute__((unused));
102 
103 /* Mifare Standard Mapping - Constants */
104 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT1        0xA0 /* internal Authenticate Command for MAD Sector */
105 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT2        0xA1 /* internal Authenticate Command for MAD Sector */
106 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT3        0xA2 /* internal Authenticate Command for MAD Sector */
107 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT4        0xA3 /* internal Authenticate Command for MAD Sector */
108 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT5        0xA4 /* internal Authenticate Command for MAD Sector */
109 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT6        0xA5 /* internal Authenticate Command for MAD Sector */
110 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1       0xD3 /* internal Authenticate Command for NDEF Sectors 1 */
111 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2       0xF7 /* internal Authenticate Command for NDEF Sectors 2 */
112 #define PH_FRINFC_NDEFMAP_MIFARESTD_NDEF_COMPVAL2        0x03 /* internal Ndef Compliant command 1 */
113 #define PH_FRINFC_NDEFMAP_MIFARESTD_NDEF_COMPVAL1        0xE1 /* internal Ndef Compliant command 2 */
114 
115 /* Enable access bits check for the MAD sector
116 #define ENABLE_ACS_BIT_CHK_FOR_MAD */
117 
118 #define PH_FRINFC_NDEFMAP_MFUL_VAL0 0
119 
120 /******************************************************************************
121  * Function         phFriNfc_MapTool_SetCardState
122  *
123  * Description      This function sets the appropriate card state.
124  *
125  * Returns          This function return NFCSTATUS_SUCCESS in case of success
126  *                  In case of failure returns other failure value.
127  *
128  ******************************************************************************/
phFriNfc_MapTool_SetCardState(phFriNfc_NdefMap_t * NdefMap,uint32_t Length)129 NFCSTATUS phFriNfc_MapTool_SetCardState (phFriNfc_NdefMap_t *NdefMap,
130                                          uint32_t           Length)
131 {
132     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
133 
134     if (Length == PH_FRINFC_NDEFMAP_MFUL_VAL0)
135     {
136         /* As the NDEF LEN / TLV Len is Zero, irrespective of any state the card
137            shall be set to INITIALIZED STATE*/
138         NdefMap->CardState =(uint8_t) (((NdefMap->CardState ==
139                                 PH_NDEFMAP_CARD_STATE_READ_ONLY) ||
140                                 (NdefMap->CardState ==
141                                 PH_NDEFMAP_CARD_STATE_INVALID))?
142                                 PH_NDEFMAP_CARD_STATE_INVALID:
143                                 PH_NDEFMAP_CARD_STATE_INITIALIZED);
144     }
145     else
146     {
147         switch (NdefMap->CardState)
148         {
149             case PH_NDEFMAP_CARD_STATE_INITIALIZED:
150                 NdefMap->CardState =(uint8_t) ((NdefMap->CardState ==
151                     PH_NDEFMAP_CARD_STATE_INVALID)?
152                     NdefMap->CardState:
153                     PH_NDEFMAP_CARD_STATE_READ_WRITE);
154             break;
155 
156             case PH_NDEFMAP_CARD_STATE_READ_ONLY:
157                 NdefMap->CardState = (uint8_t) ((NdefMap->CardState ==
158                     PH_NDEFMAP_CARD_STATE_INVALID)?
159                     NdefMap->CardState:
160                     PH_NDEFMAP_CARD_STATE_READ_ONLY);
161             break;
162 
163             case PH_NDEFMAP_CARD_STATE_READ_WRITE:
164                 NdefMap->CardState = (uint8_t) ((NdefMap->CardState ==
165                     PH_NDEFMAP_CARD_STATE_INVALID)?
166                     NdefMap->CardState:
167                     PH_NDEFMAP_CARD_STATE_READ_WRITE);
168                     if (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD ||
169                         NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD ||
170                         NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD)
171                     {
172                         if(NdefMap->StdMifareContainer.ReadOnlySectorIndex &&
173                            NdefMap->StdMifareContainer.SectorTrailerBlockNo == NdefMap->StdMifareContainer.currentBlock )
174                         {
175                             NdefMap->CardState = (uint8_t) ((NdefMap->CardState ==
176                                                             PH_NDEFMAP_CARD_STATE_INVALID)?
177                                                             NdefMap->CardState:
178                                                             PH_NDEFMAP_CARD_STATE_READ_ONLY);
179                         }
180                     }
181             break;
182 
183             default:
184                 NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
185                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
186                             NFCSTATUS_NO_NDEF_SUPPORT);
187             break;
188         }
189     }
190     Result = ((NdefMap->CardState ==
191                 PH_NDEFMAP_CARD_STATE_INVALID)?
192                 PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
193                 NFCSTATUS_NO_NDEF_SUPPORT):
194                 Result);
195 
196     return Result;
197 }
198 
199 /******************************************************************************
200  * Function         phFriNfc_MifareStdMap_H_Reset
201  *
202  * Description      This function resets the component instance to the initial
203  *                  state and lets the component forget about the list of
204  *                  registered items. Moreover, the lower device is set.
205  *
206  * Returns          This function return NFCSTATUS_SUCCESS in case of success
207  *                  In case of failure returns other failure value.
208  *
209  ******************************************************************************/
phFriNfc_MifareStdMap_H_Reset(phFriNfc_NdefMap_t * NdefMap)210 NFCSTATUS phFriNfc_MifareStdMap_H_Reset (phFriNfc_NdefMap_t *NdefMap)
211 {
212     NFCSTATUS   status = NFCSTATUS_SUCCESS;
213     uint8_t     index = PH_FRINFC_MIFARESTD_VAL0;
214 
215     if (NdefMap == NULL)
216     {
217         status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
218     }
219     else
220     {
221         /* Current Block stores the present block accessed in the card */
222         NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_VAL0;
223 
224         for (index = PH_FRINFC_MIFARESTD_VAL0; index < PH_FRINFC_NDEFMAP_MIFARESTD_ST15_BYTES; index++)
225         {
226             /* internal buffer to store the odd bytes of length < 15 */
227             NdefMap->StdMifareContainer.internalBuf[index] = PH_FRINFC_MIFARESTD_VAL0;
228         }
229 
230         for (index = 0; index < PH_FRINFC_NDEFMAP_MIFARESTD_TOTALNO_BLK; index++)
231         {
232             /* aid buffer reset to non ndef compliant */
233             NdefMap->StdMifareContainer.aid[index] = PH_FRINFC_MIFARESTD_NON_NDEF_COMP;
234         }
235 
236         /* odd bytes length stored in the internal buffer */
237         NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
238 
239         NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INITIALIZED;
240 
241         /* Flag to get that last few bytes are taken from the user buffer */
242         NdefMap->StdMifareContainer.RemainingBufFlag = PH_FRINFC_MIFARESTD_FLAG0;
243 
244         /* Flag to find that the read/write operation has reached the end of the card.
245             Further reading/writing is not possible */
246         NdefMap->StdMifareContainer.ReadWriteCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
247 
248         /* Flag to get that last few bytes are taken from the internal buffer */
249         NdefMap->StdMifareContainer.internalBufFlag = PH_FRINFC_MIFARESTD_FLAG0;
250 
251         /* Authentication Flag for every sector */
252         NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
253 
254         /* Used in Check Ndef for storing the sector ID */
255         NdefMap->StdMifareContainer.SectorIndex = PH_FRINFC_MIFARESTD_VAL0;
256 
257         NdefMap->StdMifareContainer.NdefBlocks = PH_FRINFC_MIFARESTD_VAL0;
258 
259         NdefMap->StdMifareContainer.NoOfNdefCompBlocks = PH_FRINFC_MIFARESTD_VAL0;
260 
261         NdefMap->StdMifareContainer.ReadAcsBitFlag = PH_FRINFC_MIFARESTD_FLAG0;
262 
263         NdefMap->StdMifareContainer.remSizeUpdFlag = PH_FRINFC_MIFARESTD_FLAG0;
264 
265         NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_MIFARESTD_VAL0;
266 
267         NdefMap->TLVStruct.prevLenByteValue = PH_FRINFC_MIFARESTD_VAL0;
268 
269         NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_VAL0;
270 
271         NdefMap->TLVStruct.NdefTLVBlock = PH_FRINFC_MIFARESTD_VAL0;
272 
273         NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL0;
274 
275         NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
276 
277         NdefMap->StdMifareContainer.remainingSize = PH_FRINFC_MIFARESTD_VAL0;
278 
279         NdefMap->StdMifareContainer.ReadNdefFlag = PH_FRINFC_MIFARESTD_FLAG0;
280 
281         NdefMap->StdMifareContainer.WrNdefFlag = PH_FRINFC_MIFARESTD_FLAG0;
282 
283         NdefMap->StdMifareContainer.ChkNdefFlag = PH_FRINFC_MIFARESTD_FLAG0;
284 
285         NdefMap->StdMifareContainer.aidCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
286 
287         NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0;
288 
289         NdefMap->StdMifareContainer.ProprforumSectFlag = PH_FRINFC_MIFARESTD_PROP_1ST_CONFIG;
290 
291         NdefMap->StdMifareContainer.ReadCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
292 
293         NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG0;
294 
295         NdefMap->StdMifareContainer.WrLength = PH_FRINFC_MIFARESTD_VAL1;
296 
297         NdefMap->StdMifareContainer.ChkNdefCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
298 
299         NdefMap->StdMifareContainer.ReadOnlySectorIndex = PH_FRINFC_MIFARESTD_FLAG0;
300 
301         NdefMap->StdMifareContainer.TotalNoSectors = PH_FRINFC_MIFARESTD_FLAG0;
302 
303         NdefMap->StdMifareContainer.SectorTrailerBlockNo = PH_FRINFC_MIFARESTD_FLAG0;
304     }
305 
306     return status;
307 }
308 
309 /******************************************************************************
310  * Function         phFriNfc_MifareStdMap_ChkNdef
311  *
312  * Description      The function checks whether the peer device is NDEF compliant.
313  *
314  * Returns          This function return NFCSTATUS_PENDING in case of success
315  *                  In case of failure returns other failure value.
316  *
317  ******************************************************************************/
phFriNfc_MifareStdMap_ChkNdef(phFriNfc_NdefMap_t * NdefMap)318 NFCSTATUS phFriNfc_MifareStdMap_ChkNdef ( phFriNfc_NdefMap_t *NdefMap)
319 {
320     NFCSTATUS status = NFCSTATUS_PENDING;
321     uint8_t atq, sak;
322 
323     if (NdefMap == NULL)
324     {
325         status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
326     }
327     else
328     {
329         NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_CHECK_OPE;
330         NdefMap->StdMifareContainer.CRIndex = PH_FRINFC_NDEFMAP_CR_CHK_NDEF;
331 
332         /* Get the Select Response and Sense Response to get
333             the exact Card Type either Mifare 1k or 4k */
334         sak = NdefMap->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.Sak;
335         atq = NdefMap->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.AtqA[0];
336 
337         if (0x08 == (sak & 0x18))
338         {
339             /* Total Number of Blocks in Mifare 1k Card */
340             NdefMap->StdMifareContainer.NoOfNdefCompBlocks =
341                                         PH_FRINFC_NDEFMAP_MIFARESTD_1KNDEF_COMPBLOCK;
342             NdefMap->StdMifareContainer.remainingSize =
343                                                 ((NdefMap->CardType == PH_FRINFC_MIFARESTD_VAL0) ?
344                                                 (PH_FRINFC_NDEFMAP_MIFARESTD_1KNDEF_COMPBLOCK *
345                                                 PH_FRINFC_MIFARESTD_BLOCK_BYTES) :
346                                                 NdefMap->StdMifareContainer.remainingSize);
347             NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD;
348         }
349         else if (0x19 == (sak & 0x19))
350         {
351             /* Total Number of Blocks in Mifare 2k Card */
352             NdefMap->StdMifareContainer.NoOfNdefCompBlocks =
353                                         PH_FRINFC_NDEFMAP_MIFARESTD_2KNDEF_COMPBLOCK;
354             NdefMap->StdMifareContainer.remainingSize =
355                                             ((NdefMap->CardType == PH_FRINFC_MIFARESTD_VAL0) ?
356                                             (PH_FRINFC_NDEFMAP_MIFARESTD_2KNDEF_COMPBLOCK *
357                                             PH_FRINFC_MIFARESTD_BLOCK_BYTES) :
358                                             NdefMap->StdMifareContainer.remainingSize);
359             NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD;
360         }
361         else
362         {
363              /* Total Number of Blocks in Mifare 4k Card */
364             NdefMap->StdMifareContainer.NoOfNdefCompBlocks =
365                                         PH_FRINFC_NDEFMAP_MIFARESTD_4KNDEF_COMPBLOCK;
366             NdefMap->StdMifareContainer.remainingSize =
367                                             ((NdefMap->CardType == PH_FRINFC_MIFARESTD_VAL0) ?
368                                             (PH_FRINFC_NDEFMAP_MIFARESTD_4KNDEF_COMPBLOCK *
369                                             PH_FRINFC_MIFARESTD_BLOCK_BYTES) :
370                                             NdefMap->StdMifareContainer.remainingSize);
371             NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD;
372         }
373 
374 
375         /*  phFriNfc_MifareStdMap_ChkNdef should be called only
376             when currentBlock is 0 OR 64,65 and 66 (for Mifare 4k).
377             Otherwise return error */
378         /* and also Check the Authentication Flag */
379         if ((NdefMap->StdMifareContainer.currentBlock != 0) &&
380             (NdefMap->StdMifareContainer.currentBlock != 1) &&
381             (NdefMap->StdMifareContainer.currentBlock != 2) &&
382             (NdefMap->StdMifareContainer.currentBlock != 64) &&
383             (NdefMap->StdMifareContainer.currentBlock != 65) &&
384             (NdefMap->StdMifareContainer.currentBlock != 66))
385         {
386             status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
387         }
388         else if ( NdefMap->StdMifareContainer.AuthDone == 0)
389         {
390             /*  Block 0 contains Manufacturer information and
391                 also other informaton. So go for block 1 which
392                 contains AIDs. Authenticating any of the block
393                 in a sector, Authenticates the whole sector */
394             if (NdefMap->StdMifareContainer.currentBlock == 0)
395             {
396                 NdefMap->StdMifareContainer.currentBlock = 1;
397             }
398             status = phFriNfc_MifStd_H_AuthSector (NdefMap);
399         }
400         else
401         {
402             /**
403              * Mifare 1k, sak = 0x08 atq = 0x04
404              * Mifare 2k, sak = 0x19 atq = 0x02
405              * Mifare 4k, sak = 0x18 atq = 0x02
406              */
407             if ((NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD) ||
408                 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD) ||
409                 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD))
410             {
411                 /* Change the state to Check Ndef Compliant */
412                 NdefMap->State = PH_FRINFC_NDEFMAP_STATE_CHK_NDEF_COMP;
413                 NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_CHECK_OPE;
414                 NdefMap->StdMifareContainer.ChkNdefFlag = PH_FRINFC_MIFARESTD_FLAG1;
415 
416                 NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
417                 NdefMap->MapCompletionInfo.Context = NdefMap;
418 
419                 NdefMap->Cmd.MfCmd = phHal_eMifareRead;
420                 *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
421                 NdefMap->SendRecvBuf [0] = NdefMap->StdMifareContainer.currentBlock;
422                 NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_READ;
423 
424                 /* Call the Overlapped HAL Transceive function */
425                 status = phFriNfc_ExtnsTransceive (NdefMap->pTransceiveInfo,
426                                       NdefMap->Cmd,
427                                       NdefMap->SendRecvBuf,
428                                       NdefMap->SendLength,
429                                       NdefMap->SendRecvLength);
430             }
431             else
432             {
433                 /* Since we have decided temporarily not to go
434                     for any new error codes we are using
435                     NFCSTATUS_INVALID_PARAMETER even though it is not
436                     the relevant error code here TBD */
437                 status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
438             }
439         }
440     }
441 
442     return status;
443 }
444 
445 /******************************************************************************
446  * Function         phFriNfc_MifareStdMap_RdNdef
447  *
448  * Description      The function initiates the reading of NDEF information from
449  *                  a Remote Device. It performs a reset of the state and starts
450  *                  the action (state machine). A periodic call of the
451  *                  phFriNfcNdefMap_Process has to be done once the action
452  *                  has been triggered.
453  *
454  * Returns          This function return NFCSTATUS_PENDING in case of success
455  *                  In case of failure returns other failure value.
456  *
457  ******************************************************************************/
phFriNfc_MifareStdMap_RdNdef(phFriNfc_NdefMap_t * NdefMap,uint8_t * PacketData,uint32_t * PacketDataLength,uint8_t Offset)458 NFCSTATUS phFriNfc_MifareStdMap_RdNdef (phFriNfc_NdefMap_t *NdefMap,
459                                         uint8_t            *PacketData,
460                                         uint32_t           *PacketDataLength,
461                                         uint8_t            Offset)
462 {
463     NFCSTATUS status = NFCSTATUS_PENDING;
464 
465     NdefMap->ApduBufferSize = *PacketDataLength;
466     NdefMap->NumOfBytesRead = PacketDataLength;
467     *NdefMap->NumOfBytesRead = 0;
468     NdefMap->ApduBuffIndex = 0;
469     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_READ_OPE;
470     NdefMap->StdMifareContainer.CRIndex = PH_FRINFC_NDEFMAP_CR_RD_NDEF;
471 
472     if ((NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID)
473         || (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INITIALIZED))
474     {
475         /* Card state  is not correct */
476         status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
477                             NFCSTATUS_INVALID_PARAMETER);
478     }
479     else
480     {
481         if ((Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN) || ( NdefMap->PrevOperation ==
482             PH_FRINFC_NDEFMAP_WRITE_OPE))
483         {
484             phFriNfc_MifStd_H_RdWrReset (NdefMap);
485             NdefMap->StdMifareContainer.ReadNdefFlag = PH_FRINFC_MIFARESTD_FLAG1;
486             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
487         }
488         /* Offset = Current, but the read has reached the End of Card */
489         if ((Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) &&
490             (NdefMap->StdMifareContainer.ReadWriteCompleteFlag ==
491             PH_FRINFC_MIFARESTD_FLAG1))
492         {
493             status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP, NFCSTATUS_EOF_NDEF_CONTAINER_REACHED);
494         }
495         else
496         {
497             NdefMap->Offset = (((Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN) &&
498                                 (NdefMap->PrevOperation ==
499                                 PH_FRINFC_NDEFMAP_WRITE_OPE)) ?
500                                 PH_FRINFC_NDEFMAP_SEEK_BEGIN :
501                                 Offset);
502             status = phFriNfc_MifStd_H_BlkChk (NdefMap);
503             if (status == NFCSTATUS_SUCCESS)
504             {
505                 NdefMap->ApduBuffer = PacketData;
506 
507                 /* Read Operation in Progress */
508                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
509 
510                 /* Check Authentication Flag */
511                 status =
512                     ((NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1) ?
513                     phFriNfc_MifStd_H_RdABlock(NdefMap) :
514                     phFriNfc_MifStd_H_AuthSector(NdefMap));
515             }
516         }
517     }
518 
519     return status;
520 }
521 
522 /******************************************************************************
523  * Function         phFriNfc_MifareStdMap_WrNdef
524  *
525  * Description      The function initiates the writing of NDEF information to
526  *                  a Remote Device. It performs a reset of the state and starts
527  *                  the action (state machine). A periodic call of the
528  *                  phFriNfcNdefMap_Process has to be done once the action
529  *                  has been triggered.
530  *
531  * Returns          This function return NFCSTATUS_PENDING in case of success
532  *                  In case of failure returns other failure value.
533  *
534  ******************************************************************************/
phFriNfc_MifareStdMap_WrNdef(phFriNfc_NdefMap_t * NdefMap,uint8_t * PacketData,uint32_t * PacketDataLength,uint8_t Offset)535 NFCSTATUS phFriNfc_MifareStdMap_WrNdef (phFriNfc_NdefMap_t    *NdefMap,
536                                         uint8_t               *PacketData,
537                                         uint32_t              *PacketDataLength,
538                                         uint8_t               Offset)
539 {
540     NFCSTATUS status = NFCSTATUS_PENDING;
541 
542     NdefMap->ApduBuffer = PacketData;
543     NdefMap->ApduBufferSize = *PacketDataLength;
544     NdefMap->ApduBuffIndex = PH_FRINFC_MIFARESTD_VAL0;
545     NdefMap->WrNdefPacketLength = PacketDataLength;
546     *NdefMap->WrNdefPacketLength = PH_FRINFC_MIFARESTD_VAL0;
547     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
548     NdefMap->StdMifareContainer.CRIndex = PH_FRINFC_NDEFMAP_CR_WR_NDEF;
549 
550     if ((NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID)
551         || (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_ONLY))
552     {
553         /* Card state  is not correct */
554         status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
555                             NFCSTATUS_INVALID_PARAMETER);
556     }
557     else
558     {
559         if ((Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN) ||
560             (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_READ_OPE))
561         {
562             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
563             NdefMap->StdMifareContainer.RdBeforeWrFlag = PH_FRINFC_MIFARESTD_FLAG1;
564             NdefMap->StdMifareContainer.WrNdefFlag = PH_FRINFC_MIFARESTD_FLAG1;
565             NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
566             NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
567             NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
568             NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
569             NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL0;
570             NdefMap->TLVStruct.NdefTLVAuthFlag = PH_FRINFC_MIFARESTD_FLAG0;
571             NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG0;
572             NdefMap->StdMifareContainer.remainingSize =
573                         (NdefMap->StdMifareContainer.NoOfNdefCompBlocks *
574                         PH_FRINFC_MIFARESTD_BLOCK_BYTES);
575             NdefMap->StdMifareContainer.currentBlock =
576                                             PH_FRINFC_MIFARESTD_BLK4;
577             NdefMap->StdMifareContainer.NdefBlocks = PH_FRINFC_MIFARESTD_VAL1;
578             NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0;
579             /* This macro is added, to be compliant with the previous HAL 2.0
580                 For HAL 2.0, polling is done before writing data to the mifare
581                 std (if the offset is BEGIN), because if an error is reported
582                 during read or write and again write is called, the PN531 state is
583                 unchanged (so write will fail), to bring the PN531 to the correct
584                 state, polling is done.
585                 Changed on 13th Jan 2009
586             */
587             NdefMap->StdMifareContainer.PollFlag = PH_FRINFC_MIFARESTD_FLAG0;
588             NdefMap->StdMifareContainer.WrLength = PH_FRINFC_MIFARESTD_VAL0;
589             NdefMap->StdMifareContainer.FirstWriteFlag = PH_FRINFC_MIFARESTD_FLAG1;
590         }
591 
592         if (((Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) &&
593             (NdefMap->StdMifareContainer.ReadWriteCompleteFlag ==
594             PH_FRINFC_MIFARESTD_FLAG1)) || ((NdefMap->StdMifareContainer.PollFlag ==
595             PH_FRINFC_MIFARESTD_FLAG1) && (Offset == PH_FRINFC_NDEFMAP_SEEK_CUR)))
596         {
597             /* Offset = Current, but the read has reached the End of Card */
598             status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
599                                 NFCSTATUS_EOF_NDEF_CONTAINER_REACHED);
600         }
601         else
602         {
603             NdefMap->Offset = (((Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN) &&
604                             (NdefMap->PrevOperation ==
605                             PH_FRINFC_NDEFMAP_READ_OPE)) ?
606                             PH_FRINFC_NDEFMAP_SEEK_BEGIN :
607                             Offset);
608             NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
609             status = phFriNfc_MifStd_H_BlkChk (NdefMap);
610             NdefMap->StdMifareContainer.ReadWriteCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
611             if (status == NFCSTATUS_SUCCESS)
612             {
613                 if (NdefMap->StdMifareContainer.PollFlag ==
614                     PH_FRINFC_MIFARESTD_FLAG1)
615                 {
616                     /* if poll flag is set then call disconnect because the authentication
617                         has failed so reactivation of card is required */
618                     status = phFriNfc_MifStd_H_CallDisCon (NdefMap);
619                 }
620                 /* Check Authentication Flag */
621                 else if (NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)
622                 {
623                     status =  ((NdefMap->Offset ==
624                                 PH_FRINFC_NDEFMAP_SEEK_BEGIN) ?
625                                 phFriNfc_MifStd_H_RdBeforeWr (NdefMap) :
626                                 phFriNfc_MifStd_H_WrABlock (NdefMap));
627                 }
628                 else
629                 {
630                     status = phFriNfc_MifStd_H_AuthSector (NdefMap);
631                 }
632             }
633         }
634     }
635 
636     return status;
637 }
638 
639 
640 /******************************************************************************
641  * Function         phFriNfc_MifareStdMap_Process
642  *
643  * Description      This function is a Completion Routine, Processing function,
644  *                  needed to avoid long blocking.
645  *                  This function as a Completion Routine in order to be able
646  *                  to notify the component that an I/O has finished and data
647  *                  are ready to be processed.
648 
649  * Returns          void
650  *
651  ******************************************************************************/
phFriNfc_MifareStdMap_Process(void * Context,NFCSTATUS Status)652 void phFriNfc_MifareStdMap_Process (void       *Context,
653                                     NFCSTATUS   Status)
654 {
655     phFriNfc_NdefMap_t      *NdefMap;
656     uint8_t                 NDEFFlag = 0,
657                             CRFlag = 0,
658                             Temp16Bytes = 0,
659                             i = 0;
660 
661     NdefMap = (phFriNfc_NdefMap_t *)Context;
662 
663     if ((Status & PHNFCSTBLOWER) == (NFCSTATUS_SUCCESS & PHNFCSTBLOWER))
664     {
665         switch (NdefMap->State)
666         {
667             case PH_FRINFC_NDEFMAP_STATE_CHK_NDEF_COMP:
668                 Status = phFriNfc_MifStd_H_ProChkNdef (NdefMap);
669                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING) ?
670                             PH_FRINFC_MIFARESTD_FLAG1 :
671                             PH_FRINFC_MIFARESTD_FLAG0);
672                 break;
673 
674             case PH_FRINFC_NDEFMAP_STATE_READ:
675                 /* Receive Length for read shall always be equal to 16 */
676                 if ((*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ) &&
677                     (NdefMap->ApduBuffIndex < (uint16_t) NdefMap->ApduBufferSize))
678                 {
679                     Temp16Bytes = PH_FRINFC_MIFARESTD_VAL0;
680                     NDEFFlag = (uint8_t) PH_FRINFC_MIFARESTD_FLAG1;
681                     if (NdefMap->TLVStruct.BytesRemainLinTLV != 0)
682                     {
683                         NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
684                         CRFlag = PH_FRINFC_MIFARESTD_FLAG0;
685                         /* To read the remaining length (L) in TLV */
686                         Status = phFriNfc_MifStd_H_RemainTLV (NdefMap, &NDEFFlag, &Temp16Bytes);
687                         CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
688                                              PH_FRINFC_MIFARESTD_FLAG1 :
689                                              PH_FRINFC_MIFARESTD_FLAG0);
690                     }
691 
692                     /* check the NDEFFlag is set. if this is not set, then
693                         in the above RemainTLV function all the 16 bytes has been
694                         read */
695                 }
696                 else
697                 {
698                     Status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_RECEIVE_LENGTH);
699                     CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
700                 }
701                 break;
702 
703             case PH_FRINFC_NDEFMAP_STATE_WRITE:
704                 Status = phFriNfc_MifStd_H_ProWrABlock (NdefMap);
705                 CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
706                                      PH_FRINFC_MIFARESTD_FLAG1 :
707                                      PH_FRINFC_MIFARESTD_FLAG0);
708 
709                 /* Call Completion Routine if CR Flag is Set to 1 */
710                 if (CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
711                 {
712                     *NdefMap->WrNdefPacketLength = NdefMap->ApduBuffIndex;
713                 }
714                 break;
715 
716             case PH_FRINFC_NDEFMAP_STATE_AUTH:
717                 NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG0;
718                 Status = phFriNfc_MifStd_H_ProAuth (NdefMap);
719                 CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
720                                      PH_FRINFC_MIFARESTD_FLAG1 :
721                                      PH_FRINFC_MIFARESTD_FLAG0);
722                 break;
723 
724             case PH_FRINFC_NDEFMAP_STATE_RD_ACS_BIT:
725                 Status = phFriNfc_MifStd_H_ProAcsBits (NdefMap);
726                 CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
727                                      PH_FRINFC_MIFARESTD_FLAG1 :
728                                      PH_FRINFC_MIFARESTD_FLAG0);
729                 break;
730 
731             case PH_FRINFC_NDEFMAP_STATE_WR_NDEF_LEN:
732                 if (NdefMap->StdMifareContainer.RdAfterWrFlag ==
733                     PH_FRINFC_MIFARESTD_FLAG1)
734                 {
735                     Status = phFriNfc_MifStd_H_CallWrNdefLen (NdefMap);
736                     CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
737                                 PH_FRINFC_MIFARESTD_FLAG1 :
738                                 PH_FRINFC_MIFARESTD_FLAG0);
739                 }
740                 else
741                 {
742                     /* Check this */
743                     if (NdefMap->StdMifareContainer.TempBlockNo ==
744                         NdefMap->StdMifareContainer.currentBlock)
745                     {
746                         memcpy (NdefMap->StdMifareContainer.internalBuf,
747                                 NdefMap->StdMifareContainer.Buffer,
748                                 NdefMap->StdMifareContainer.internalLength);
749 
750                     }
751                     *NdefMap->WrNdefPacketLength = NdefMap->ApduBuffIndex;
752                     NdefMap->StdMifareContainer.currentBlock =
753                                     NdefMap->StdMifareContainer.TempBlockNo;
754                     NdefMap->CardState = (uint8_t) ((NdefMap->CardState ==
755                                         PH_NDEFMAP_CARD_STATE_INITIALIZED) ?
756                                         PH_NDEFMAP_CARD_STATE_READ_WRITE :
757                                         NdefMap->CardState);
758                     CRFlag = (uint8_t) PH_FRINFC_MIFARESTD_FLAG1;
759                 }
760                 break;
761 
762             case PH_FRINFC_NDEFMAP_STATE_RD_TO_WR_NDEF_LEN:
763                 CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
764                 Status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
765                                     NFCSTATUS_INVALID_DEVICE_REQUEST);
766                 if (*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ)
767                 {
768                     /* Size of NdefMap->SendRecvBuf is set by phLibNfc_Gen_NdefMapReset to PH_LIBNFC_GEN_MAX_BUFFER */
769                     /* We don't have to check memory here */
770                     for (i = PH_FRINFC_MIFARESTD_BYTES_READ; i > 0; i--)
771                     {
772                         NdefMap->SendRecvBuf [i] = NdefMap->SendRecvBuf [i-1];
773                     }
774                     NdefMap->SendRecvBuf [PH_FRINFC_MIFARESTD_VAL0] =
775                                 NdefMap->StdMifareContainer.currentBlock;
776                     Status = phFriNfc_MifStd_H_WriteNdefLen (NdefMap);
777                     CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
778                                 PH_FRINFC_MIFARESTD_FLAG1 :
779                                 PH_FRINFC_MIFARESTD_FLAG0);
780                 }
781                 break;
782 
783             case PH_FRINFC_NDEFMAP_STATE_GET_ACT_CARDSIZE:
784                 NDEFFlag = PH_FRINFC_MIFARESTD_FLAG1;
785                 if (NdefMap->TLVStruct.NoLbytesinTLV > PH_FRINFC_MIFARESTD_VAL0)
786                 {
787                     NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
788                     Status = phFriNfc_MifStd_H_ChkRemainTLVs (NdefMap, &CRFlag, &NDEFFlag);
789                     NdefMap->TLVStruct.NoLbytesinTLV =
790                                     PH_FRINFC_MIFARESTD_VAL0;
791                 }
792                 if ((NDEFFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
793                     (CRFlag != PH_FRINFC_MIFARESTD_FLAG1))
794                 {
795                     Status = phFriNfc_MifStd_H_ChkTLVs (NdefMap, &CRFlag);
796                 }
797                 if (((NdefMap->StdMifareContainer.ReadNdefFlag ==
798                     PH_FRINFC_MIFARESTD_FLAG1) ||
799                     (NdefMap->StdMifareContainer.WrNdefFlag ==
800                     PH_FRINFC_MIFARESTD_FLAG1)) &&
801                     (Status != NFCSTATUS_PENDING))
802                 {
803                     NdefMap->StdMifareContainer.NFCforumSectFlag =
804                                             PH_FRINFC_MIFARESTD_FLAG1;
805                     CRFlag = PH_FRINFC_MIFARESTD_FLAG0;
806                     /* if the card state has changed to initialised and
807                      read ndef is called then error is returned */
808                     if (((NdefMap->StdMifareContainer.WrNdefFlag ==
809                         PH_FRINFC_MIFARESTD_FLAG1) &&
810                         (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_ONLY)) ||
811                         ((NdefMap->StdMifareContainer.ReadNdefFlag ==
812                             PH_FRINFC_MIFARESTD_FLAG1) &&
813                         (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INITIALIZED)))
814                     {
815                         Status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
816                                             NFCSTATUS_NO_NDEF_SUPPORT);
817                     }
818                     if (NdefMap->StdMifareContainer.AuthDone ==
819                         PH_FRINFC_MIFARESTD_FLAG0)
820                     {
821                         Status = phFriNfc_MifStd_H_AuthSector (NdefMap);
822                     }
823                     else
824                     {
825                         Status = ((NdefMap->StdMifareContainer.ReadNdefFlag ==
826                                     PH_FRINFC_MIFARESTD_FLAG1) ?
827                                     phFriNfc_MifStd_H_RdTLV (NdefMap) :
828                                     phFriNfc_MifStd_H_RdBeforeWr (NdefMap));
829                     }
830                     NdefMap->StdMifareContainer.ReadNdefFlag =
831                                             PH_FRINFC_MIFARESTD_FLAG0;
832                     NdefMap->StdMifareContainer.WrNdefFlag =
833                                             PH_FRINFC_MIFARESTD_FLAG0;
834                 }
835 
836                 if (NdefMap->StdMifareContainer.ChkNdefFlag ==
837                     PH_FRINFC_MIFARESTD_FLAG1)
838                 {
839                     CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
840                             PH_FRINFC_MIFARESTD_FLAG1 :
841                             PH_FRINFC_MIFARESTD_FLAG0);
842                 }
843                 break;
844 
845             case PH_FRINFC_NDEFMAP_STATE_RD_BEF_WR:
846                 /* Read flag says that already part of TLV has been written */
847                 Status = phFriNfc_MifStd_H_ProBytesToWr (NdefMap);
848                  CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
849                                     PH_FRINFC_MIFARESTD_FLAG1 :
850                                     PH_FRINFC_MIFARESTD_FLAG0);
851                 break;
852 
853             case PH_FRINFC_NDEFMAP_STATE_WR_TLV:
854                 Status = phFriNfc_MifStd_H_ProWrTLV (NdefMap);
855                 CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
856                                     PH_FRINFC_MIFARESTD_FLAG1 :
857                                     PH_FRINFC_MIFARESTD_FLAG0);
858                 break;
859 
860             case PH_FRINFC_NDEFMAP_STATE_RD_TLV:
861                 Status = phFriNfc_MifStd_H_ProRdTLV (NdefMap);
862                 CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
863                                     PH_FRINFC_MIFARESTD_FLAG1 :
864                                     PH_FRINFC_MIFARESTD_FLAG0);
865                 break;
866 
867             case PH_FRINFC_NDEFMAP_STATE_TERM_TLV:
868                 phFriNfc_MifStd_H_SetNdefBlkAuth(NdefMap);
869                 NdefMap->StdMifareContainer.currentBlock =
870                                 NdefMap->TLVStruct.NdefTLVBlock;
871                 Status = phFriNfc_MifStd_H_RdtoWrNdefLen (NdefMap);
872                 CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
873                                     PH_FRINFC_MIFARESTD_FLAG1 :
874                                     PH_FRINFC_MIFARESTD_FLAG0);
875                 break;
876 
877             case PH_FRINFC_NDEFMAP_STATE_DISCONNECT:
878                 NdefMap->StdMifareContainer.PollFlag = PH_FRINFC_MIFARESTD_FLAG0;
879 
880                 Status = phFriNfc_MifStd_H_CallConnect (NdefMap);
881                 CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
882                                     PH_FRINFC_MIFARESTD_FLAG1 :
883                                     PH_FRINFC_MIFARESTD_FLAG0);
884                 break;
885 
886             case PH_FRINFC_NDEFMAP_STATE_CONNECT:
887                 if (NdefMap->StdMifareContainer.FirstReadFlag == PH_FRINFC_MIFARESTD_FLAG1)
888                 {
889                     NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG0;
890                     Status = phFriNfc_MifStd_H_AuthSector (NdefMap);
891                 }
892                 else if ((NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD ||
893                           NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD ||
894                           NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD) &&
895                          (NdefMap->StdMifareContainer.ReadOnlySectorIndex &&
896                           NdefMap->StdMifareContainer.SectorTrailerBlockNo ==  NdefMap->StdMifareContainer.currentBlock))
897                 {
898                     NdefMap->StdMifareContainer.ReadOnlySectorIndex =
899                         PH_FRINFC_MIFARESTD_FLAG0;
900                     NdefMap->StdMifareContainer.SectorTrailerBlockNo =
901                         PH_FRINFC_MIFARESTD_FLAG0;
902                     NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_FLAG0;
903                     Status = NFCSTATUS_FAILED;
904                 }
905                 else
906                 {
907                     Status = ((((NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) &&
908                         (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_WRITE_OPE)) ||
909                         (NdefMap->StdMifareContainer.WrLength >
910                         PH_FRINFC_MIFARESTD_VAL0)) ?
911                         phFriNfc_MifStd_H_ProStatNotValid (NdefMap, Status) :
912                         phFriNfc_MifStd_H_AuthSector (NdefMap));
913                 }
914                 CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
915                                     PH_FRINFC_MIFARESTD_FLAG1 :
916                                     PH_FRINFC_MIFARESTD_FLAG0);
917                 break;
918 
919             case PH_FRINFC_NDEFMAP_STATE_RD_SEC_ACS_BIT:
920                 Status = phFriNfc_MifStd_H_ProSectorTrailorAcsBits (NdefMap);
921                 CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING)?
922                                     PH_FRINFC_MIFARESTD_FLAG1 :
923                                     PH_FRINFC_MIFARESTD_FLAG0);
924                 if ((CRFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
925                     (NdefMap->StdMifareContainer.WriteAcsBitFlag == PH_FRINFC_MIFARESTD_FLAG0))
926                 {
927                     Status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
928                                     NFCSTATUS_INVALID_DEVICE_REQUEST);
929                 }
930                 break;
931 
932             case PH_FRINFC_NDEFMAP_STATE_WRITE_SEC:
933                 /* Set flag for writing of Acs bit */
934                 NdefMap->StdMifareContainer.WriteAcsBitFlag = PH_FRINFC_MIFARESTD_FLAG1;
935 
936                 /* The first NDEF sector is already made read only,
937                    set card state to read only and proceed*/
938                 if (NdefMap->CardState != PH_NDEFMAP_CARD_STATE_READ_ONLY)
939                 {
940                     Status = phFriNfc_MapTool_SetCardState (NdefMap, NdefMap->TLVStruct.BytesRemainLinTLV);
941                     if (Status != NFCSTATUS_SUCCESS)
942                     {
943                         CRFlag = (uint8_t) PH_FRINFC_MIFARESTD_FLAG1;
944                     }
945                 }
946 
947                 if (CRFlag != PH_FRINFC_MIFARESTD_FLAG1)
948                 {
949                     Status = phFriNfc_MifStd_H_ProWrSectorTrailor (NdefMap);
950                     CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
951                                        PH_FRINFC_MIFARESTD_FLAG1 :
952                                        PH_FRINFC_MIFARESTD_FLAG0);
953                 }
954                 break;
955 
956             default:
957                 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
958                                     NFCSTATUS_INVALID_DEVICE_REQUEST);
959                 CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
960                 break;
961         }
962     }
963     else if (NdefMap->State == PH_FRINFC_NDEFMAP_STATE_AUTH)
964     {
965         NdefMap->StdMifareContainer.PollFlag = PH_FRINFC_MIFARESTD_FLAG1;
966         if(NdefMap->StdMifareContainer.FirstWriteFlag ==
967             PH_FRINFC_MIFARESTD_FLAG1)
968         {
969             NdefMap->StdMifareContainer.FirstWriteFlag =
970                                             PH_FRINFC_MIFARESTD_FLAG0;
971             NdefMap->StdMifareContainer.WrLength =
972                 ((NdefMap->StdMifareContainer.NFCforumSectFlag ==
973                 PH_FRINFC_MIFARESTD_FLAG0) ?
974                 PH_FRINFC_MIFARESTD_VAL1 :
975                 NdefMap->StdMifareContainer.WrLength);
976         }
977         if (NdefMap->StdMifareContainer.WrLength == PH_FRINFC_MIFARESTD_VAL0)
978         {
979             Status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
980                                 NFCSTATUS_EOF_NDEF_CONTAINER_REACHED);
981             CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
982         }
983         else
984         {
985             /* Authentication has failed */
986             CRFlag = PH_FRINFC_MIFARESTD_FLAG1; /* Call Completion Routine */
987             Status = NFCSTATUS_FAILED;/* Update Status Flag */
988         }
989     }
990     else
991     {
992         Status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
993                             NFCSTATUS_INVALID_DEVICE_REQUEST);
994         CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
995     }
996      /* Call Completion Routine if CR Flag is Set to 1 */
997     if (CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
998     {
999         phFriNfc_MifStd_H_Complete (NdefMap, Status);
1000     }
1001 
1002     return;
1003 }
1004 
1005 /******************************************************************************
1006  * Function         phFriNfc_MifStd_H_RdABlock
1007  *
1008  * Description      This function is a Helper function for Mifare Std. It Reads
1009  *                  a block from the card.
1010  *
1011  * Returns          This function return NFCSTATUS_PENDING in case of success
1012  *                  In case of failure returns other failure value.
1013  *
1014  ******************************************************************************/
phFriNfc_MifStd_H_RdABlock(phFriNfc_NdefMap_t * NdefMap)1015 static NFCSTATUS phFriNfc_MifStd_H_RdABlock (phFriNfc_NdefMap_t *NdefMap)
1016 {
1017     NFCSTATUS status = NFCSTATUS_PENDING;
1018 
1019     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_READ;
1020     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_READ_OPE;
1021     NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
1022     NdefMap->MapCompletionInfo.Context = NdefMap;
1023 
1024     if (NdefMap->ApduBuffIndex < (uint16_t) NdefMap->ApduBufferSize)
1025     {
1026 
1027         if (NdefMap->StdMifareContainer.internalLength > PH_FRINFC_MIFARESTD_VAL0)
1028         {
1029             status = phFriNfc_MifStd_H_ChkIntLen (NdefMap);
1030         } /* internal Length Check */
1031         else
1032         {
1033             NdefMap->SendRecvBuf [PH_FRINFC_MIFARESTD_VAL0] =
1034                         NdefMap->StdMifareContainer.currentBlock;
1035             NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_READ;
1036             *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
1037 
1038             NdefMap->Cmd.MfCmd = phHal_eMifareRead;
1039 
1040             /* Call the Overlapped HAL Transceive function */
1041             status = phFriNfc_ExtnsTransceive (NdefMap->pTransceiveInfo,
1042                                           NdefMap->Cmd,
1043                                           NdefMap->SendRecvBuf,
1044                                           NdefMap->SendLength,
1045                                           NdefMap->SendRecvLength);
1046         }
1047     }
1048     else
1049     {
1050         /* Check for the Card Size */
1051         if((((NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
1052             NdefMap->StdMifareContainer.NdefBlocks) *
1053             PH_FRINFC_MIFARESTD_BYTES_READ) == 0) ||
1054             (NdefMap->ApduBufferSize == NdefMap->ApduBuffIndex))
1055         {
1056             NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
1057                 (uint8_t) ((((NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
1058                 NdefMap->StdMifareContainer.NdefBlocks) *
1059                 PH_FRINFC_MIFARESTD_BYTES_READ) == 0) ?
1060                 PH_FRINFC_MIFARESTD_FLAG1 :
1061                 PH_FRINFC_MIFARESTD_FLAG0);
1062             *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
1063             status = PHNFCSTVAL (CID_NFC_NONE, NFCSTATUS_SUCCESS);
1064         }
1065         else
1066         {
1067             /* Error: The control should not ideally come here. Return Error. */
1068             status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP, NFCSTATUS_FAILED);
1069         }
1070     }
1071 
1072     return status;
1073 }
1074 
1075 /******************************************************************************
1076  * Function         phFriNfc_MifStd_H_WrABlock
1077  *
1078  * Description      This function writes into a block of the card.
1079  *
1080  * Returns          This function return NFCSTATUS_PENDING in case of success
1081  *                  In case of failure returns other failure value.
1082  *
1083  ******************************************************************************/
phFriNfc_MifStd_H_WrABlock(phFriNfc_NdefMap_t * NdefMap)1084 static NFCSTATUS phFriNfc_MifStd_H_WrABlock (phFriNfc_NdefMap_t *NdefMap)
1085 {
1086     NFCSTATUS                   status =  NFCSTATUS_PENDING;
1087 
1088     uint16_t                    RemainingBytes = 0,
1089                                 BytesRemained = 0,
1090                                 index = 0;
1091     uint8_t                     Temp16Bytes = 0;
1092 
1093     NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
1094     NdefMap->MapCompletionInfo.Context = NdefMap;
1095     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
1096 
1097     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_WRITE;
1098 
1099     /* User Buffer Check */
1100     if( NdefMap->ApduBuffIndex < (uint16_t) NdefMap->ApduBufferSize)
1101     {
1102         RemainingBytes = (((uint16_t) (NdefMap->ApduBufferSize -
1103                          NdefMap->ApduBuffIndex) <
1104                         NdefMap->StdMifareContainer.remainingSize) ?
1105                         (uint16_t)(NdefMap->ApduBufferSize -
1106                         NdefMap->ApduBuffIndex) :
1107                         NdefMap->StdMifareContainer.remainingSize);
1108 
1109         NdefMap->SendRecvBuf[0] = NdefMap->StdMifareContainer.currentBlock;
1110         Temp16Bytes += PH_FRINFC_MIFARESTD_INC_1;
1111 
1112         /* Check for internal bytes */
1113         if (NdefMap->StdMifareContainer.internalLength > 0)
1114         {
1115             /* copy the bytes previously written in the internal Buffer */
1116             memcpy (&(NdefMap->SendRecvBuf [Temp16Bytes]),
1117                     NdefMap->StdMifareContainer.internalBuf,
1118                     NdefMap->StdMifareContainer.internalLength);
1119 
1120             Temp16Bytes += (uint8_t) (NdefMap->StdMifareContainer.internalLength);
1121             if (RemainingBytes >= (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes))
1122             {
1123                 /* Copy the Remaining bytes from the user buffer to make the send
1124                     data and length = 16 */
1125                 memcpy (&(NdefMap->SendRecvBuf [Temp16Bytes]),
1126                         NdefMap->ApduBuffer,
1127                         (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes));
1128 
1129                 NdefMap->NumOfBytesWritten =
1130                     (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
1131                 Temp16Bytes += (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
1132                 *NdefMap->DataCount = (Temp16Bytes - PH_FRINFC_MIFARESTD_VAL1);
1133             }
1134             else
1135             {
1136                 memcpy (&(NdefMap->SendRecvBuf [Temp16Bytes]),
1137                         NdefMap->ApduBuffer,
1138                         RemainingBytes);
1139 
1140                 NdefMap->StdMifareContainer.internalBufFlag = PH_FRINFC_MIFARESTD_FLAG1;
1141                 NdefMap->NumOfBytesWritten = RemainingBytes;
1142                 Temp16Bytes += (uint8_t) (RemainingBytes);
1143                 *NdefMap->DataCount = (Temp16Bytes - PH_FRINFC_MIFARESTD_VAL1);
1144 
1145                 BytesRemained = (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
1146                 /* Pad empty bytes with Zeroes to complete 16 bytes*/
1147                 for (index = 0; index < BytesRemained; index++)
1148                 {
1149                     NdefMap->SendRecvBuf [(Temp16Bytes + index)] =
1150                                 (uint8_t) ((index == PH_FRINFC_MIFARESTD_VAL0) ?
1151                                     PH_FRINFC_MIFARESTD_TERMTLV_T :
1152                                     PH_FRINFC_MIFARESTD_NULLTLV_T);
1153                     NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
1154                 }
1155                 Temp16Bytes += (uint8_t) (BytesRemained);
1156             }
1157         }
1158         else
1159         {
1160             if (RemainingBytes >= (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes))
1161             {
1162                 /* Bytes left to write < 16, copy remaining bytes */
1163                 memcpy (&(NdefMap->SendRecvBuf [
1164                         Temp16Bytes]),
1165                         &(NdefMap->ApduBuffer [
1166                         NdefMap->ApduBuffIndex]),
1167                         (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes));
1168 
1169                 NdefMap->NumOfBytesWritten = (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
1170                 Temp16Bytes += (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
1171                 *NdefMap->DataCount = (Temp16Bytes - PH_FRINFC_MIFARESTD_VAL1);
1172             }
1173             else
1174             {
1175                 /* Bytes left to write < 16, copy remaining bytes */
1176                 memcpy (&(NdefMap->SendRecvBuf [
1177                         Temp16Bytes]),
1178                         &(NdefMap->ApduBuffer [
1179                         NdefMap->ApduBuffIndex]),
1180                         RemainingBytes);
1181 
1182                 NdefMap->StdMifareContainer.RemainingBufFlag = PH_FRINFC_MIFARESTD_FLAG1;
1183                 NdefMap->NumOfBytesWritten = RemainingBytes;
1184                 Temp16Bytes += (uint8_t) (RemainingBytes);
1185                 *NdefMap->DataCount = (Temp16Bytes - PH_FRINFC_MIFARESTD_VAL1);
1186 
1187 
1188                 /* Pad empty bytes with Zeroes to complete 16 bytes */
1189                 for (index = Temp16Bytes; index < MIFARE_MAX_SEND_BUF_TO_WRITE; index++)
1190                 {
1191                     NdefMap->SendRecvBuf [index] = (uint8_t) ((index ==
1192                                     Temp16Bytes) ?
1193                                     PH_FRINFC_MIFARESTD_TERMTLV_T :
1194                                     PH_FRINFC_MIFARESTD_NULLTLV_T);
1195 
1196                     NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
1197                 }
1198             }
1199         }
1200         /* Buffer to store 16 bytes which is writing to the present block */
1201         memcpy (NdefMap->StdMifareContainer.Buffer,
1202                 &(NdefMap->SendRecvBuf [PH_FRINFC_MIFARESTD_INC_1]),
1203                 PH_FRINFC_MIFARESTD_BLOCK_BYTES);
1204 
1205         /* Write from here */
1206         NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_WRITE;
1207         NdefMap->Cmd.MfCmd = phHal_eMifareWrite16;
1208         *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
1209         /* Call the Overlapped HAL Transceive function */
1210         status = phFriNfc_ExtnsTransceive (NdefMap->pTransceiveInfo,
1211                                       NdefMap->Cmd,
1212                                       NdefMap->SendRecvBuf,
1213                                       NdefMap->SendLength,
1214                                       NdefMap->SendRecvLength);
1215     }
1216     else /* Check User Buffer */
1217     {
1218         if (NdefMap->StdMifareContainer.NdefBlocks >
1219              NdefMap->StdMifareContainer.NoOfNdefCompBlocks)
1220         {
1221             NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
1222                 PH_FRINFC_MIFARESTD_FLAG1;
1223             status = PHNFCSTVAL (CID_NFC_NONE,
1224                                 NFCSTATUS_SUCCESS);
1225         }
1226         else if (NdefMap->ApduBuffIndex == (uint16_t) NdefMap->ApduBufferSize)
1227         {
1228             status = PHNFCSTVAL (CID_NFC_NONE, NFCSTATUS_SUCCESS);
1229         }
1230         else
1231         {
1232             /* Error: The control should not ideally come here. Return Error. */
1233             status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP, NFCSTATUS_FAILED);
1234         }
1235     }
1236 
1237     return status;
1238 }
1239 
1240 /******************************************************************************
1241  * Function         phFriNfc_MifStd_H_AuthSector
1242  *
1243  * Description      This function authenticates one sector at a time.
1244  *
1245  * Returns          This function return NFCSTATUS_PENDING in case of success
1246  *                  In case of failure returns other failure value.
1247  *
1248  ******************************************************************************/
phFriNfc_MifStd_H_AuthSector(phFriNfc_NdefMap_t * NdefMap)1249 static NFCSTATUS phFriNfc_MifStd_H_AuthSector (phFriNfc_NdefMap_t *NdefMap)
1250 {
1251     NFCSTATUS status = NFCSTATUS_PENDING;
1252 
1253     NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
1254     NdefMap->MapCompletionInfo.Context = NdefMap;
1255 
1256     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
1257     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_AUTH;
1258 
1259     /* Authenticate */
1260     NdefMap->Cmd.MfCmd = phHal_eMifareAuthentA;
1261 
1262     NdefMap->SendRecvBuf [PH_FRINFC_MIFARESTD_VAL0] =
1263                             ((NdefMap->TLVStruct.NdefTLVAuthFlag ==
1264                                 PH_FRINFC_MIFARESTD_FLAG1) ?
1265                                 NdefMap->TLVStruct.NdefTLVBlock :
1266                                 NdefMap->StdMifareContainer.currentBlock);
1267 
1268     /* if MAD blocks then authentication key is
1269         0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 else
1270         0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7 */
1271     if (((NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK0) &&
1272         (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK1) &&
1273         (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK2) &&
1274         (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK64) &&
1275         (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK65) &&
1276         (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK66)) ||
1277         (NdefMap->TLVStruct.NdefTLVAuthFlag ==
1278                                 (uint8_t) PH_FRINFC_MIFARESTD_FLAG1))
1279     {
1280         NdefMap->SendRecvBuf [1] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
1281         NdefMap->SendRecvBuf [2] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
1282         NdefMap->SendRecvBuf [3] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
1283         NdefMap->SendRecvBuf [4] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
1284         NdefMap->SendRecvBuf [5] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
1285         NdefMap->SendRecvBuf [6] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
1286     }
1287     else
1288     {
1289         NdefMap->SendRecvBuf [1] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT1; /* 0xA0 */
1290         NdefMap->SendRecvBuf [2] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT2; /* 0xA1 */
1291         NdefMap->SendRecvBuf [3] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT3; /* 0xA2 */
1292         NdefMap->SendRecvBuf [4] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT4; /* 0xA3 */
1293         NdefMap->SendRecvBuf [5] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT5; /* 0xA4 */
1294         NdefMap->SendRecvBuf [6] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT6; /* 0xA5 */
1295     }
1296 
1297     if (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD ||
1298         NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD ||
1299         NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD)
1300     {
1301         if (NdefMap->StdMifareContainer.ReadOnlySectorIndex &&
1302             NdefMap->StdMifareContainer.SectorTrailerBlockNo == NdefMap->StdMifareContainer.currentBlock)
1303         {
1304             memcpy (&NdefMap->SendRecvBuf [1], &NdefMap->StdMifareContainer.UserScrtKeyB [0], PH_FRINFC_MIFARESTD_KEY_LEN);
1305 
1306             /* Authenticate with KeyB */
1307             NdefMap->Cmd.MfCmd = phHal_eMifareAuthentB;
1308         }
1309     }
1310 
1311     NdefMap->SendLength = MIFARE_AUTHENTICATE_CMD_LENGTH;
1312     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
1313     /* Call the Overlapped HAL Transceive function */
1314     status = phFriNfc_ExtnsTransceive (NdefMap->pTransceiveInfo,
1315                                       NdefMap->Cmd,
1316                                       NdefMap->SendRecvBuf,
1317                                       NdefMap->SendLength,
1318                                       NdefMap->SendRecvLength);
1319 
1320     return status;
1321 }
1322 
1323 /******************************************************************************
1324  * Function         phFriNfc_MifStd_H_Complete
1325  *
1326  * Description      It is used to call the Completion Routine
1327  *
1328  * Returns          void
1329  *
1330  ******************************************************************************/
phFriNfc_MifStd_H_Complete(phFriNfc_NdefMap_t * NdefMap,NFCSTATUS Result)1331 static void phFriNfc_MifStd_H_Complete (phFriNfc_NdefMap_t *NdefMap,
1332                                         NFCSTATUS          Result)
1333 {
1334     /* set the state back to the Reset_Init state */
1335     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RESET_INIT;
1336 
1337     /* set the completion routine */
1338     NdefMap->CompletionRoutine [NdefMap->StdMifareContainer.CRIndex].
1339             CompletionRoutine (NdefMap->CompletionRoutine->Context, Result);
1340 
1341     return;
1342 }
1343 
1344 /******************************************************************************
1345  * Function         phFriNfc_MifStd4k_H_CheckNdef
1346  *
1347  * Description      This function is used for Mifare 4k Check Ndef to
1348  *                  get the next AID blocks.
1349  *
1350  * Returns          This function return NFCSTATUS_SUCCESS in case of success
1351  *                  In case of failure returns other failure value.
1352  *
1353  ******************************************************************************/
phFriNfc_MifStd4k_H_CheckNdef(phFriNfc_NdefMap_t * NdefMap)1354 static NFCSTATUS phFriNfc_MifStd4k_H_CheckNdef (phFriNfc_NdefMap_t *NdefMap)
1355 {
1356     NFCSTATUS Result = NFCSTATUS_SUCCESS;
1357 
1358     /* Get the AID Block */
1359     if (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK2)
1360     {
1361         NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_MAD_BLK64;
1362         NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
1363     }
1364     else if (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK64)
1365     {
1366         NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_MAD_BLK65;
1367     }
1368     else
1369     {
1370         NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_MAD_BLK66;
1371     }
1372 
1373     Result = phFriNfc_MifareStdMap_ChkNdef (NdefMap);
1374 
1375     return Result;
1376 }
1377 
1378 /******************************************************************************
1379  * Function         phFriNfc_MifStd_H_fillAIDarray
1380  *
1381  * Description      This function storew the AIDs for check ndef.
1382  *
1383  * Returns          void
1384  *
1385  ******************************************************************************/
phFriNfc_MifStd_H_fillAIDarray(phFriNfc_NdefMap_t * NdefMap)1386 static void phFriNfc_MifStd_H_fillAIDarray (phFriNfc_NdefMap_t *NdefMap)
1387 {
1388     uint8_t byteindex = 0;
1389 
1390     if ((NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK1) ||
1391         (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK64))
1392     {
1393         /* The First Two Bytes in Receive Buffer
1394             are CRC bytes so it is not copied
1395             instead, 0 is copied in AID[0] & AID[1] */
1396         NdefMap->StdMifareContainer.aid [NdefMap->StdMifareContainer.SectorIndex] =
1397                                     PH_FRINFC_MIFARESTD_NON_NDEF_COMP;
1398         NdefMap->StdMifareContainer.SectorIndex++;
1399         byteindex = 2;
1400     }
1401 
1402     while (byteindex < PH_FRINFC_MIFARESTD_BYTES_READ)
1403     {
1404         if ((NdefMap->SendRecvBuf [byteindex] == PH_FRINFC_NDEFMAP_MIFARESTD_NDEF_COMPVAL2) &&
1405             (NdefMap->SendRecvBuf [(byteindex + 1)] == PH_FRINFC_NDEFMAP_MIFARESTD_NDEF_COMPVAL1))
1406         {
1407             /* This flag is set when a NFC forum sector is found in a
1408                 MAD block for the first time */
1409             NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG1;
1410             NdefMap->StdMifareContainer.aid[NdefMap->StdMifareContainer.SectorIndex] =
1411                                         PH_FRINFC_MIFARESTD_NDEF_COMP;
1412             NdefMap->StdMifareContainer.SectorIndex++;
1413         }
1414         else
1415         {
1416             NdefMap->StdMifareContainer.aid [NdefMap->StdMifareContainer.SectorIndex] =
1417                                     PH_FRINFC_MIFARESTD_NON_NDEF_COMP;
1418             NdefMap->StdMifareContainer.SectorIndex++;
1419             /* AID complete flag is set when a non NFC forum sector is found in a
1420                MAD block after the NFC forum sector. After setting this, all other
1421                values are ignored and are NOT NDEF compliant */
1422             NdefMap->StdMifareContainer.aidCompleteFlag =
1423                 ((NdefMap->StdMifareContainer.NFCforumSectFlag ==
1424                     PH_FRINFC_MIFARESTD_FLAG1) ?
1425                     PH_FRINFC_MIFARESTD_FLAG1 :
1426                     PH_FRINFC_MIFARESTD_FLAG0);
1427 
1428             NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0;
1429             if (NdefMap->StdMifareContainer.aidCompleteFlag == PH_FRINFC_MIFARESTD_FLAG1)
1430             {
1431                 break;
1432             }
1433         }
1434         byteindex += 2;
1435     }
1436 
1437     /* If "aidCompleteFlag" is set then the remaining sectors are made NOT
1438        NDEF compliant */
1439     if ((NdefMap->StdMifareContainer.aidCompleteFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
1440         (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD))
1441     {
1442         /* for Mifare 1k there are 16 sectors, till this number all sectors
1443            are made NOT NDEF compliant */
1444         for (byteindex = NdefMap->StdMifareContainer.SectorIndex;
1445              byteindex < PH_FRINFC_MIFARESTD1K_TOTAL_SECTOR;
1446              byteindex++)
1447         {
1448              NdefMap->StdMifareContainer.aid [byteindex] =
1449                                     PH_FRINFC_MIFARESTD_NON_NDEF_COMP;
1450         }
1451     }
1452     else if ((NdefMap->StdMifareContainer.aidCompleteFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
1453              (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD))
1454     {
1455         /* for Mifare 2k there are 32 sectors, till this number all sectors
1456            are made NOT NDEF compliant */
1457         for (byteindex = NdefMap->StdMifareContainer.SectorIndex;
1458              byteindex < PH_FRINFC_MIFARESTD2K_TOTAL_SECTOR;
1459              byteindex++)
1460         {
1461             NdefMap->StdMifareContainer.aid[byteindex] =
1462                                    PH_FRINFC_MIFARESTD_NON_NDEF_COMP;
1463         }
1464     }
1465     else
1466     {
1467         /* for Mifare 4k there are 40 sectors, till this number all sectors
1468            are made NOT NDEF compliant */
1469         if ((NdefMap->StdMifareContainer.aidCompleteFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
1470             (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD))
1471         {
1472             for(byteindex = NdefMap->StdMifareContainer.SectorIndex;
1473                 byteindex < PH_FRINFC_MIFARESTD4K_TOTAL_SECTOR;
1474                 byteindex++)
1475             {
1476                 NdefMap->StdMifareContainer.aid [byteindex] =
1477                                         PH_FRINFC_MIFARESTD_NON_NDEF_COMP;
1478             }
1479         }
1480     }
1481 
1482     return;
1483 }
1484 
1485 /******************************************************************************
1486  * Function         phFriNfc_MifStd_H_BlkChk
1487  *
1488  * Description      This function is to check the Ndef compliance of the
1489  *                  current block, if the block is not Ndef Compliant,
1490  *                  increment the block till the next Ndef compliant block
1491  *                  using the Get Sector Helper function
1492  *
1493  * Returns          This function return NFCSTATUS_SUCCESS in case of success
1494  *                  In case of failure returns other failure value.
1495  *
1496  ******************************************************************************/
phFriNfc_MifStd_H_BlkChk(phFriNfc_NdefMap_t * NdefMap)1497 static NFCSTATUS phFriNfc_MifStd_H_BlkChk (phFriNfc_NdefMap_t *NdefMap)
1498 {
1499     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
1500     uint8_t     SectorID = 0, callbreak = 0;
1501 
1502     for (;;)
1503     {
1504         /* Get a Sector ID for the Current Block */
1505         SectorID = phFriNfc_MifStd_H_GetSect (NdefMap->StdMifareContainer.currentBlock);
1506         /* Check the card Type 1k or 4k */
1507         /* enter if Mifare 1k card. For Mifare 4k go to else */
1508         if (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD)
1509         {
1510             /* if Sector Id > 15 No Sectors to write */
1511             if (SectorID > 15)
1512             {
1513                 SectorID = phFriNfc_MifStd_H_GetSect (NdefMap->StdMifareContainer.currentBlock);
1514                 /*Error: No Ndef Compliant Sectors present */
1515                 Result = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
1516                                     NFCSTATUS_INVALID_PARAMETER);
1517                 callbreak = 1;
1518             }
1519             else
1520             {
1521                 phFriNfc_MifStd1k_H_BlkChk (NdefMap, SectorID, &callbreak);
1522             }
1523         } /* End of if */ /* End of Mifare 1k check */
1524         else if (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD) /* Mifare 2k check starts here */
1525         {
1526              /* Sector > 39 no ndef compliant sectors found*/
1527             if (SectorID > PH_FRINFC_MIFARESTD_SECTOR_NO31)
1528             {
1529                  /*Error: No Ndef Compliant Sectors present */
1530                 Result = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
1531                                     NFCSTATUS_INVALID_PARAMETER);
1532                 callbreak = 1;
1533             }
1534             else if (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK64)
1535             {
1536                 NdefMap->StdMifareContainer.currentBlock += PH_FRINFC_MIFARESTD_BLK4;
1537             }
1538             else if (SectorID < PH_FRINFC_MIFARESTD_SECTOR_NO32) /* sector < 32 contains 4 blocks in each sector */
1539             {
1540                  /* If the block checked is 63, the 3 blocks after this
1541                      are AID(MAD) blocks so its need to be skipped */
1542                 if (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK63)
1543                 {
1544                     NdefMap->StdMifareContainer.currentBlock += PH_FRINFC_MIFARESTD_BLK4;
1545                 }
1546                 else
1547                 {
1548                     phFriNfc_MifStd1k_H_BlkChk (NdefMap, SectorID, &callbreak);
1549                 }
1550             }
1551             else
1552             {
1553                 phFriNfc_MifStd1k_H_BlkChk (NdefMap, SectorID, &callbreak);
1554             }
1555         }/* End of if*/ /* End of Mifare 2k check*/
1556         else /* Mifare 4k check starts here */
1557         {
1558             /* Sector > 39 no ndef compliant sectors found*/
1559             if (SectorID > PH_FRINFC_MIFARESTD_SECTOR_NO39)
1560             {
1561                 /*Error: No Ndef Compliant Sectors present */
1562                 Result = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
1563                 callbreak = 1;
1564             }
1565             else if (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK64)
1566             {
1567                 NdefMap->StdMifareContainer.currentBlock += PH_FRINFC_MIFARESTD_BLK4;
1568             }
1569             else if (SectorID < PH_FRINFC_MIFARESTD_SECTOR_NO32) /* sector < 32 contains 4 blocks in each sector */
1570             {
1571                 /* If the block checked is 63, the 3 blocks after this
1572                    are AID(MAD) blocks so its need to be skipped */
1573                 if (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK63)
1574                 {
1575                     NdefMap->StdMifareContainer.currentBlock += PH_FRINFC_MIFARESTD_BLK4;
1576                 }
1577                 else
1578                 {
1579                     phFriNfc_MifStd1k_H_BlkChk (NdefMap, SectorID, &callbreak);
1580                 }
1581             }
1582             else
1583             {
1584                 /* every last block of a sector needs to be skipped */
1585                 if (((NdefMap->StdMifareContainer.currentBlock + 1) %
1586                     PH_FRINFC_MIFARESTD_BLOCK_BYTES) == 0)
1587                 {
1588                     NdefMap->StdMifareContainer.currentBlock++;
1589                 }
1590                 else
1591                 {
1592                     if (NdefMap->StdMifareContainer.aid [SectorID] ==
1593                             PH_FRINFC_MIFARESTD_NDEF_COMP)
1594                     {
1595                         /* Check whether the block is first block of a (next)new sector and
1596                             also check if it is first block then internal length is zero
1597                             or not. Because once Authentication is done for the sector again
1598                             we should not authenticate it again */
1599                         /* In this case 32 sectors contains 4 blocks and next remaining 8 sectors
1600                             contains 16 blocks that is why (32 * 4) + (sectorID - 32) *16*/
1601                         if ((NdefMap->StdMifareContainer.currentBlock ==
1602                             ((PH_FRINFC_MIFARESTD_SECTOR_NO32 * PH_FRINFC_MIFARESTD_BLK4) +
1603                             ((SectorID - PH_FRINFC_MIFARESTD_SECTOR_NO32) * PH_FRINFC_MIFARESTD_BLOCK_BYTES))) &&
1604                             (NdefMap->StdMifareContainer.internalLength == 0))
1605                         {
1606                             NdefMap->StdMifareContainer.AuthDone = 0;
1607                         }
1608                         callbreak = 1;
1609                     }
1610                     else
1611                     {
1612                         NdefMap->StdMifareContainer.currentBlock += 16;
1613                     }
1614                 }
1615             }
1616         }
1617         if (callbreak == 1)
1618         {
1619             break;
1620         }
1621     }
1622 
1623     return Result;
1624 }
1625 
1626 /******************************************************************************
1627  * Function         phFriNfc_MifStd_H_GetSect
1628  *
1629  * Description      This function  to get the Sector from the current block
1630  *
1631  * Returns          uint8_t SectorID
1632  *
1633  ******************************************************************************/
phFriNfc_MifStd_H_GetSect(uint8_t BlockNumber)1634 static uint8_t phFriNfc_MifStd_H_GetSect (uint8_t BlockNumber)
1635 {
1636     uint8_t SectorID = 0;
1637 
1638     if (BlockNumber >= PH_FRINFC_MIFARESTD4K_BLK128)
1639     {
1640         SectorID = (uint8_t) (PH_FRINFC_MIFARESTD_SECTOR_NO32 +
1641                     ((BlockNumber - PH_FRINFC_MIFARESTD4K_BLK128)/
1642                     PH_FRINFC_MIFARESTD_BLOCK_BYTES));
1643     }
1644     else
1645     {
1646         SectorID = (BlockNumber/PH_FRINFC_MIFARESTD_BLK4);
1647     }
1648 
1649     return SectorID;
1650 }
1651 
1652 /******************************************************************************
1653  * Function         phFriNfc_MifStd_H_RdAcsBit
1654  *
1655  * Description      It read the access bits of each sector.
1656  *                  NCI messages.
1657  *
1658  * Returns          This function return NFCSTATUS_SUCCESS in case of success
1659  *                  In case of failure returns other failure value.
1660  *
1661  ******************************************************************************/
phFriNfc_MifStd_H_RdAcsBit(phFriNfc_NdefMap_t * NdefMap)1662 static NFCSTATUS phFriNfc_MifStd_H_RdAcsBit (phFriNfc_NdefMap_t *NdefMap)
1663 {
1664     NFCSTATUS Result = NFCSTATUS_SUCCESS;
1665 
1666     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RD_ACS_BIT;
1667 
1668     if (NdefMap->StdMifareContainer.ReadOnlySectorIndex &&
1669         NdefMap->StdMifareContainer.currentBlock == NdefMap->StdMifareContainer.SectorTrailerBlockNo)
1670     {
1671         NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RD_SEC_ACS_BIT;
1672     }
1673 
1674     if (NdefMap->StdMifareContainer.ReadAcsBitFlag == PH_FRINFC_MIFARESTD_FLAG1)
1675     {
1676         /* Get the sector trailer */
1677         ((NdefMap->StdMifareContainer.currentBlock > 127) ?
1678             phFriNfc_MifStd_H_Get4kStTrail(NdefMap) :
1679             phFriNfc_MifStd_H_Get1kStTrail(NdefMap));
1680     }
1681     else
1682     {
1683         /* Give the current block to read */
1684         NdefMap->SendRecvBuf [PH_FRINFC_MIFARESTD_VAL0] =
1685                         NdefMap->StdMifareContainer.currentBlock;
1686     }
1687 
1688     Result = phFriNfc_MifStd_H_Rd16Bytes(NdefMap,
1689                         NdefMap->SendRecvBuf [PH_FRINFC_MIFARESTD_VAL0]);
1690 
1691     return Result;
1692 }
1693 
1694 /******************************************************************************
1695  * Function         phFriNfc_MifStd_H_ChkAcsBit
1696  *
1697  * Description      This function check the access bits of each sector.
1698  *
1699  * Returns          This function return NFCSTATUS_SUCCESS in case of success
1700  *                  In case of failure returns other failure value.
1701  *
1702  ******************************************************************************/
phFriNfc_MifStd_H_ChkAcsBit(phFriNfc_NdefMap_t * NdefMap)1703 static NFCSTATUS phFriNfc_MifStd_H_ChkAcsBit (phFriNfc_NdefMap_t *NdefMap)
1704 {
1705     NFCSTATUS Result = NFCSTATUS_SUCCESS;
1706 
1707     /* Blocks from 0 to 3 and from 64 to 67(MAD blocks) */
1708     if ((NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK0) ||
1709         (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK1) ||
1710         (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK2) ||
1711         (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK3) ||
1712         (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK64) ||
1713         (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK65) ||
1714         (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK66) )
1715     {
1716         /* Access bits check removed for the MAD blocks */
1717 #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD
1718 
1719         if (((NdefMap->SendRecvBuf [
1720             PH_FRINFC_MIFARESTD_VAL6] &
1721             PH_FRINFC_MIFARESTD_MASK_FF) ==
1722             PH_FRINFC_MIFARESTD_MADSECT_ACS_BYTE6) &&
1723             ((NdefMap->SendRecvBuf [
1724             PH_FRINFC_MIFARESTD_VAL7] &
1725             PH_FRINFC_MIFARESTD_MASK_FF) ==
1726             PH_FRINFC_MIFARESTD_MADSECT_ACS_BYTE7) &&
1727             ((NdefMap->SendRecvBuf [
1728             PH_FRINFC_MIFARESTD_VAL8] &
1729             PH_FRINFC_MIFARESTD_MASK_FF) ==
1730             PH_FRINFC_MIFARESTD_ACS_BYTE8))
1731         {
1732             NdefMap->StdMifareContainer.WriteFlag =
1733                 PH_FRINFC_MIFARESTD_FLAG0;
1734             NdefMap->StdMifareContainer.ReadFlag =
1735                 PH_FRINFC_MIFARESTD_FLAG1;
1736         }
1737         else
1738         {
1739             NdefMap->StdMifareContainer.WriteFlag =
1740                 PH_FRINFC_MIFARESTD_FLAG0;
1741             NdefMap->StdMifareContainer.ReadFlag =
1742                 PH_FRINFC_MIFARESTD_FLAG0;
1743         }
1744 
1745 #else /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
1746 
1747         NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INITIALIZED;
1748 
1749 #endif /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
1750     }
1751     else
1752     {
1753         /* Check for Access bytes 6, 7 and 8 value =
1754             0x7F, 0x07, 0x88 NFC forum sectors*/
1755         if (((NdefMap->SendRecvBuf [
1756             PH_FRINFC_MIFARESTD_VAL6] &
1757             PH_FRINFC_MIFARESTD_MASK_FF) ==
1758             PH_FRINFC_MIFARESTD_NFCSECT_ACS_BYTE6) &&
1759             ((NdefMap->SendRecvBuf [
1760             PH_FRINFC_MIFARESTD_VAL7] &
1761             PH_FRINFC_MIFARESTD_MASK_FF) ==
1762             PH_FRINFC_MIFARESTD_NFCSECT_ACS_BYTE7) &&
1763             ((NdefMap->SendRecvBuf [
1764             PH_FRINFC_MIFARESTD_VAL8] &
1765             PH_FRINFC_MIFARESTD_MASK_FF) ==
1766             PH_FRINFC_MIFARESTD_ACS_BYTE8))
1767         {
1768             NdefMap->StdMifareContainer.WriteFlag =
1769                 PH_FRINFC_MIFARESTD_FLAG1;
1770             NdefMap->StdMifareContainer.ReadFlag =
1771                 PH_FRINFC_MIFARESTD_FLAG1;
1772         }
1773         else if (((NdefMap->SendRecvBuf [
1774             PH_FRINFC_MIFARESTD_VAL6] &
1775             PH_FRINFC_MIFARESTD_MASK_FF) ==
1776             PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE6) &&
1777             ((NdefMap->SendRecvBuf [
1778             PH_FRINFC_MIFARESTD_VAL7] &
1779             PH_FRINFC_MIFARESTD_MASK_FF) ==
1780             PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE7) &&
1781             ((NdefMap->SendRecvBuf [
1782             PH_FRINFC_MIFARESTD_VAL8] &
1783             PH_FRINFC_MIFARESTD_MASK_FF) ==
1784             PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE8))
1785         {
1786             /* Read Only state */
1787             /* Check for Access bytes 6, 7 and 8 value =
1788                 0x55, 0xAD, 0x2A NFC forum Sectors */
1789             NdefMap->StdMifareContainer.WriteFlag =
1790                 PH_FRINFC_MIFARESTD_FLAG0;
1791             NdefMap->StdMifareContainer.ReadFlag =
1792                 PH_FRINFC_MIFARESTD_FLAG1;
1793         }
1794         else
1795         {
1796             NdefMap->StdMifareContainer.WriteFlag =
1797                 PH_FRINFC_MIFARESTD_FLAG0;
1798             NdefMap->StdMifareContainer.ReadFlag =
1799                 PH_FRINFC_MIFARESTD_FLAG0;
1800         }
1801 
1802 #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD
1803         /* Do nothing */
1804 #else /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
1805         Result = phFriNfc_MifStd_H_GPBChk (NdefMap);
1806 #endif /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
1807     }
1808 
1809 #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD
1810     Result = phFriNfc_MifStd_H_GPBChk (NdefMap);
1811 #endif /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
1812 
1813     return Result;
1814 }
1815 
1816 /******************************************************************************
1817  * Function         phFriNfc_MifStd_H_ChkRdWr
1818  *
1819  * Description      This function is for read access bits, depending
1820  *                  on the read/write/check ndef function called.
1821  *
1822  * Returns          This function return NFCSTATUS_SUCCESS in case of success
1823  *                  In case of failure returns other failure value.
1824  *
1825  ******************************************************************************/
phFriNfc_MifStd_H_ChkRdWr(phFriNfc_NdefMap_t * NdefMap)1826 static NFCSTATUS phFriNfc_MifStd_H_ChkRdWr (phFriNfc_NdefMap_t *NdefMap)
1827 {
1828     NFCSTATUS Result = NFCSTATUS_SUCCESS;
1829 
1830     switch (NdefMap->PrevOperation)
1831     {
1832         case PH_FRINFC_NDEFMAP_CHECK_OPE:
1833             if (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID)
1834             {
1835                 /* No permission to read */
1836                 Result = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
1837                                     NFCSTATUS_READ_FAILED);
1838             }
1839             else if ((NdefMap->StdMifareContainer.currentBlock > 3) &&
1840                 (NdefMap->StdMifareContainer.ChkNdefCompleteFlag ==
1841                                     PH_FRINFC_MIFARESTD_FLAG1) &&
1842                 (NdefMap->StdMifareContainer.currentBlock !=
1843                             PH_FRINFC_MIFARESTD_MAD_BLK65) &&
1844                 (NdefMap->StdMifareContainer.currentBlock !=
1845                             PH_FRINFC_MIFARESTD_MAD_BLK66))
1846             {
1847                 Result = ((NdefMap->StdMifareContainer.ReadAcsBitFlag ==
1848                                 PH_FRINFC_MIFARESTD_FLAG0) ?
1849                                 phFriNfc_MifStd_H_RdAcsBit(NdefMap) :
1850                                 phFriNfc_MifStd_H_AuthSector(NdefMap));
1851             }
1852             else
1853             {
1854                 Result = phFriNfc_MifareStdMap_ChkNdef (NdefMap);
1855             }
1856             break;
1857 
1858         case PH_FRINFC_NDEFMAP_READ_OPE:
1859             if (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID)
1860             {
1861                 /* No permission to Read */
1862                 Result = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP, NFCSTATUS_READ_FAILED);
1863             }
1864             else if (NdefMap->StdMifareContainer.ReadNdefFlag == PH_FRINFC_MIFARESTD_FLAG1)
1865             {
1866                 Result = phFriNfc_MifStd_H_GetActCardLen (NdefMap);
1867             }
1868             else
1869             {
1870                 Result = phFriNfc_MifStd_H_RdABlock (NdefMap);
1871             }
1872             break;
1873 
1874         case PH_FRINFC_NDEFMAP_WRITE_OPE:
1875             if ((NdefMap->CardState ==
1876                 PH_NDEFMAP_CARD_STATE_INVALID) ||
1877                 (NdefMap->CardState ==
1878                 PH_NDEFMAP_CARD_STATE_READ_ONLY))
1879             {
1880                 /* No permission to Read */
1881                 Result = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
1882                                     NFCSTATUS_WRITE_FAILED);
1883             }
1884             else if (NdefMap->StdMifareContainer.WrNdefFlag ==
1885                     PH_FRINFC_MIFARESTD_FLAG1)
1886             {
1887                 Result = phFriNfc_MifStd_H_GetActCardLen (NdefMap);
1888             }
1889             else if (NdefMap->StdMifareContainer.RdBeforeWrFlag ==
1890                     PH_FRINFC_MIFARESTD_FLAG1)
1891             {
1892                 /*NdefMap->StdMifareContainer.ReadFlag =
1893                                 PH_FRINFC_MIFARESTD_FLAG0;*/
1894                 Result = phFriNfc_MifStd_H_RdBeforeWr (NdefMap);
1895             }
1896             else if (NdefMap->StdMifareContainer.RdAfterWrFlag ==
1897                     PH_FRINFC_MIFARESTD_FLAG1)
1898             {
1899                 Result = phFriNfc_MifStd_H_RdtoWrNdefLen (NdefMap);
1900             }
1901             else
1902             {
1903                 Result = (((NdefMap->TLVStruct.NdefTLVBlock ==
1904                             NdefMap->StdMifareContainer.currentBlock) &&
1905                             (NdefMap->Offset ==
1906                             PH_FRINFC_NDEFMAP_SEEK_BEGIN)) ?
1907                             phFriNfc_MifStd_H_RdBeforeWr (NdefMap) :
1908                             phFriNfc_MifStd_H_WrABlock (NdefMap));
1909             }
1910             break;
1911 
1912         case PH_FRINFC_NDEFMAP_GET_ACTSIZE_OPE:
1913             Result = ((NdefMap->StdMifareContainer.ReadFlag ==
1914                         PH_FRINFC_MIFARESTD_FLAG0) ?
1915                         (PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
1916                         NFCSTATUS_READ_FAILED)) :
1917                         phFriNfc_MifStd_H_GetActCardLen (NdefMap));
1918             break;
1919 
1920         default:
1921             /* Operation is not correct */
1922             Result = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
1923                                 NFCSTATUS_INVALID_PARAMETER);
1924 
1925             break;
1926     }
1927 
1928     return Result;
1929 }
1930 
1931 /******************************************************************************
1932  * Function         phFriNfc_MifStd_H_ChkNdefCmpltSects
1933  *
1934  * Description      This function is used to check ndef to check the
1935  *                  ndef compliant sectors.
1936  *
1937  * Returns          void
1938  *
1939  ******************************************************************************/
phFriNfc_MifStd_H_ChkNdefCmpltSects(phFriNfc_NdefMap_t * NdefMap)1940 static void phFriNfc_MifStd_H_ChkNdefCmpltSects (phFriNfc_NdefMap_t *NdefMap)
1941 {
1942     uint8_t index = 0;
1943     uint8_t index_max_4k_2k= 0;
1944     if (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD)
1945     {
1946         index_max_4k_2k = PH_FRINFC_MIFARESTD4K_TOTAL_SECTOR;
1947     }
1948     else
1949     {
1950         index_max_4k_2k = PH_FRINFC_MIFARESTD2K_TOTAL_SECTOR;
1951     }
1952 
1953     if (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD || NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD)
1954     {
1955         for (index = PH_FRINFC_MIFARESTD_SECTOR_NO1; index < index_max_4k_2k; index++)/*Block 0 is MAD block, so it should start with 1*/
1956         {
1957             /* For Mifare 4k, Block 0 to 31 contains 4 blocks */
1958             /* sector 0 and 15 are aid blocks */
1959             if (index != PH_FRINFC_MIFARESTD_SECTOR_NO16)
1960             {
1961                 if (((index < 32) && (index != PH_FRINFC_MIFARESTD_SECTOR_NO0))
1962                     && (NdefMap->StdMifareContainer.aid [index] ==
1963                             PH_FRINFC_MIFARESTD_NON_NDEF_COMP))
1964                 {
1965                     /* Only 3 blocks can be read/written till sector 31 */
1966                     NdefMap->StdMifareContainer.NoOfNdefCompBlocks -=
1967                                                 PH_FRINFC_MIFARESTD_MAD_BLK3;
1968 
1969                 }
1970                 else
1971                 {
1972                     /* For Mifare 4k, Block 32 to 39 contains 16 blocks */
1973                     if(NdefMap->StdMifareContainer.aid [index] ==
1974                         PH_FRINFC_MIFARESTD_NON_NDEF_COMP)
1975                     {
1976                         /* Only 15 blocks can be read/written from sector 31 */
1977                         NdefMap->StdMifareContainer.NoOfNdefCompBlocks -=
1978                                                 PH_FRINFC_MIFARESTD_BLK15;
1979                     }
1980                 }
1981             }
1982         } /* For index > 40 */
1983     }
1984     else
1985     {
1986         for (index = PH_FRINFC_MIFARESTD_SECTOR_NO1;
1987             index < PH_FRINFC_MIFARESTD_SECTOR_NO16; index++)
1988         {
1989             if (NdefMap->StdMifareContainer.aid [index] ==
1990                 PH_FRINFC_MIFARESTD_NON_NDEF_COMP)
1991             {
1992                 /*  Only three blocks can be read/written in
1993                     a sector. So if a sector is non-ndef
1994                     compliant, decrement 3 */
1995                 NdefMap->StdMifareContainer.NoOfNdefCompBlocks -=
1996                                         PH_FRINFC_MIFARESTD_MAD_BLK3;
1997             }
1998         }
1999     }
2000 
2001     return;
2002 }
2003 
2004 /******************************************************************************
2005  * Function         phFriNfc_MifStd_H_RemainTLV
2006  *
2007  * Description      This function is used for read ndef to process the
2008  *                  remaining bytes of length (L) in the TLV.
2009  *
2010  * Returns          This function return NFCSTATUS_PENDING in case of success
2011  *                  In case of failure returns other failure value.
2012  *
2013  ******************************************************************************/
phFriNfc_MifStd_H_RemainTLV(phFriNfc_NdefMap_t * NdefMap,uint8_t * Flag,uint8_t * Temp16Bytes)2014 static NFCSTATUS phFriNfc_MifStd_H_RemainTLV (phFriNfc_NdefMap_t *NdefMap,
2015                                               uint8_t            *Flag,
2016                                               uint8_t            *Temp16Bytes)
2017 {
2018     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
2019     uint8_t     CRFlag = 0;
2020     uint16_t    RemainingBytes = 0;
2021 
2022     RemainingBytes = ((uint16_t) NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex);
2023 
2024     if (NdefMap->StdMifareContainer.remainingSize < RemainingBytes)
2025     {
2026         /* If the user Buffer is greater than the Card Size
2027            set LastBlockFlag = 1. This Flag is used to read bytes
2028            till the end of the card only */
2029         RemainingBytes = NdefMap->StdMifareContainer.remainingSize;
2030     }
2031 
2032     /* Remaining Bytes of length (L) in TLV <=  16 */
2033     if ((NdefMap->TLVStruct.BytesRemainLinTLV <=
2034         (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))) &&
2035         (RemainingBytes <= NdefMap->TLVStruct.BytesRemainLinTLV))
2036     {
2037         /* Copy data to user buffer */
2038         memcpy (&(NdefMap->ApduBuffer [NdefMap->ApduBuffIndex]),
2039                 &(NdefMap->SendRecvBuf [(*Temp16Bytes)]),
2040                 RemainingBytes);
2041 
2042         NdefMap->ApduBuffIndex += RemainingBytes;
2043         NdefMap->StdMifareContainer.remainingSize -= RemainingBytes;
2044 
2045         /* copy the bytes to internal buffer, that are read,
2046            but not used for the user buffer */
2047         if (RemainingBytes != NdefMap->TLVStruct.BytesRemainLinTLV)
2048         {
2049             memcpy (NdefMap->StdMifareContainer.internalBuf,
2050                     &(NdefMap->SendRecvBuf [((*Temp16Bytes) + RemainingBytes)]),
2051                     ((PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes)) - RemainingBytes));
2052 
2053             /* internal buffer length */
2054             NdefMap->StdMifareContainer.internalLength =
2055                     ((PH_FRINFC_MIFARESTD_BYTES_READ -
2056                     (*Temp16Bytes)) - RemainingBytes);
2057         }
2058         *Temp16Bytes += ((uint8_t)RemainingBytes);
2059         /* Remaining Bytes of length value in TLV */
2060         NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
2061 
2062         if (NdefMap->StdMifareContainer.internalLength == PH_FRINFC_MIFARESTD_VAL0)
2063         {
2064             NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
2065             (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
2066             (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0)) ?
2067             PH_FRINFC_MIFARESTD_FLAG1 :
2068             PH_FRINFC_MIFARESTD_FLAG0);
2069 
2070             /* internal length bytes completed */
2071             NdefMap->StdMifareContainer.currentBlock++;
2072             NdefMap->StdMifareContainer.NdefBlocks++;
2073         }
2074 
2075         if (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0)
2076         {
2077             /* Remaining Bytes of length (L) in TLV is Zero means that the next
2078                coming bytes are containing type (T), length (L) in TLV */
2079             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
2080             NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2081             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2082         }
2083         /* call completion routine */
2084         CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2085         *Flag = PH_FRINFC_MIFARESTD_FLAG0;
2086     }
2087     else if ((NdefMap->TLVStruct.BytesRemainLinTLV <=
2088             (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))) &&
2089             (RemainingBytes > NdefMap->TLVStruct.BytesRemainLinTLV))
2090     {
2091         /* Copy data to user buffer */
2092         memcpy (&(NdefMap->ApduBuffer [NdefMap->ApduBuffIndex]),
2093                 &(NdefMap->SendRecvBuf [(*Temp16Bytes)]),
2094                 NdefMap->TLVStruct.BytesRemainLinTLV);
2095 
2096         NdefMap->ApduBuffIndex += NdefMap->TLVStruct.BytesRemainLinTLV;
2097         NdefMap->StdMifareContainer.remainingSize -= NdefMap->TLVStruct.BytesRemainLinTLV;
2098         NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
2099         *Temp16Bytes += ((uint8_t) NdefMap->TLVStruct.BytesRemainLinTLV);
2100         NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_VAL0;
2101 
2102         *Flag = PH_FRINFC_MIFARESTD_FLAG1;
2103 
2104         NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2105         NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2106         /* 16 bytes completed */
2107         if (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_BYTES_READ)
2108         {
2109             *Flag = PH_FRINFC_MIFARESTD_FLAG0;
2110             NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0;
2111             NdefMap->StdMifareContainer.currentBlock++;
2112             NdefMap->StdMifareContainer.NdefBlocks++;
2113             Result = phFriNfc_MifStd_H_BlkChk (NdefMap);
2114             if (Result == NFCSTATUS_SUCCESS)
2115             {
2116                 if (NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)
2117                 {
2118                     Result = phFriNfc_MifStd_H_RdABlock (NdefMap);
2119                 }
2120                 else
2121                 {
2122                     Result = phFriNfc_MifStd_H_AuthSector (NdefMap);
2123                 }
2124             }
2125         }
2126         else
2127         {
2128             NdefMap->TLVStruct.BytesRemainLinTLV =
2129                             PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0;
2130             /* The read operation has finished. so, completion routine
2131                can be called. set the Completion routine(CR) flag */
2132             CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2133         }
2134     }
2135     else if ((NdefMap->TLVStruct.BytesRemainLinTLV >
2136             (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))) &&
2137             (RemainingBytes <= (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))))
2138     {
2139         /* Copy data to user buffer */
2140         memcpy (&(NdefMap->ApduBuffer [NdefMap->ApduBuffIndex]),
2141                 &(NdefMap->SendRecvBuf [(*Temp16Bytes)]),
2142                 RemainingBytes);
2143         NdefMap->ApduBuffIndex += RemainingBytes;
2144         NdefMap->StdMifareContainer.remainingSize -= RemainingBytes;
2145 
2146         /* Remaining Bytes of length (L) in TLV */
2147         NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
2148         /* copy the bytes to internal buffer, that are read,
2149                         but not used for the user buffer */
2150         memcpy (NdefMap->StdMifareContainer.internalBuf,
2151                 &(NdefMap->SendRecvBuf[(RemainingBytes + (*Temp16Bytes))]),
2152                 ((PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))
2153                 - RemainingBytes));
2154 
2155         /* internal buffer length */
2156         NdefMap->StdMifareContainer.internalLength =
2157                 ((PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes)) - RemainingBytes);
2158 
2159         if (RemainingBytes == (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes)))
2160         {
2161             NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
2162                 (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
2163                 (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0)) ?
2164                 PH_FRINFC_MIFARESTD_FLAG1 :
2165                 PH_FRINFC_MIFARESTD_FLAG0);
2166 
2167             /* internal length bytes completed */
2168             NdefMap->StdMifareContainer.currentBlock++;
2169             NdefMap->StdMifareContainer.NdefBlocks++;
2170         }
2171         *Temp16Bytes += ((uint8_t) RemainingBytes);
2172         NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
2173         CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2174         *Flag = PH_FRINFC_MIFARESTD_FLAG0;
2175     }
2176     else
2177     {
2178         if ((NdefMap->TLVStruct.BytesRemainLinTLV >
2179             (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))) &&
2180             (RemainingBytes > (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))))
2181         {
2182             *Flag = PH_FRINFC_MIFARESTD_FLAG0;
2183             /* Copy data to user buffer */
2184             memcpy (&(NdefMap->ApduBuffer [NdefMap->ApduBuffIndex]),
2185                     &(NdefMap->SendRecvBuf [(*Temp16Bytes)]),
2186                     (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes)));
2187             NdefMap->ApduBuffIndex += (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes));
2188             NdefMap->StdMifareContainer.remainingSize -=
2189                                     (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes));
2190             NdefMap->TLVStruct.BytesRemainLinTLV -= (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes));
2191             *Temp16Bytes += (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes));
2192             if (NdefMap->TLVStruct.BytesRemainLinTLV != PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0)
2193             {
2194                 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
2195             }
2196             /* 16 bytes completed */
2197             NdefMap->StdMifareContainer.currentBlock++;
2198             NdefMap->StdMifareContainer.NdefBlocks++;
2199             Result = phFriNfc_MifStd_H_BlkChk (NdefMap);
2200             if (Result == NFCSTATUS_SUCCESS)
2201             {
2202                 Result = ((NdefMap->StdMifareContainer.AuthDone ==
2203                         PH_FRINFC_MIFARESTD_FLAG1) ?
2204                         phFriNfc_MifStd_H_RdABlock(NdefMap) :
2205                         phFriNfc_MifStd_H_AuthSector(NdefMap));
2206             }
2207         }
2208     }
2209 
2210     if (CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
2211     {
2212         *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
2213         NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
2214             (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
2215             (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0)) ?
2216             PH_FRINFC_MIFARESTD_FLAG1 :
2217             PH_FRINFC_MIFARESTD_FLAG0);
2218     }
2219 
2220     return Result;
2221 }
2222 
2223 /******************************************************************************
2224  * Function         phFriNfc_MifStd_H_ChkIntLen
2225  *
2226  * Description      This function reads ndef to process the internal bytes.
2227  *
2228  * Returns          This function return NFCSTATUS_SUCCESS in case of success,
2229  *                  In case of failure returns other failure value.
2230  *
2231  ******************************************************************************/
phFriNfc_MifStd_H_ChkIntLen(phFriNfc_NdefMap_t * NdefMap)2232 static NFCSTATUS phFriNfc_MifStd_H_ChkIntLen(phFriNfc_NdefMap_t *NdefMap)
2233 {
2234     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
2235     uint8_t     NDEFFlag = PH_FRINFC_MIFARESTD_FLAG1;
2236     uint8_t     TempintBytes = 0;
2237 
2238     if(NdefMap->TLVStruct.BytesRemainLinTLV != 0)
2239     {
2240         NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
2241         /* To read the remaining length (L) in TLV */
2242         Result = phFriNfc_MifStd_H_IntLenWioutNdef(NdefMap, &NDEFFlag, &TempintBytes);
2243     }
2244     NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
2245     /* check the NDEFFlag is set. if this is not set, then
2246        in the above RemainTLV function all the 16 bytes has been
2247        read */
2248 
2249     return Result;
2250 }
2251 
2252 /******************************************************************************
2253  * Function         phFriNfc_MifStd_H_IntLenWioutNdef
2254  *
2255  * Description      This function reads ndef to check the internal bytes
2256  *                  without ndef tlv flag.
2257  *
2258  * Returns          This function return NFCSTATUS_SUCCESS in case of success,
2259  *                  In case of failure returns other failure value.
2260  *
2261  ******************************************************************************/
phFriNfc_MifStd_H_IntLenWioutNdef(phFriNfc_NdefMap_t * NdefMap,uint8_t * Flag,uint8_t * TempintBytes)2262 static NFCSTATUS phFriNfc_MifStd_H_IntLenWioutNdef (phFriNfc_NdefMap_t *NdefMap,
2263                                                     uint8_t            *Flag,
2264                                                     uint8_t            *TempintBytes)
2265 {
2266     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
2267     uint8_t     CRFlag = 0;
2268     uint16_t    RemainingBytes = 0;
2269 
2270     RemainingBytes = ((uint16_t)NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex);
2271 
2272     if (NdefMap->StdMifareContainer.remainingSize < RemainingBytes)
2273     {
2274         /* If the user Buffer is greater than the Card Size
2275            set LastBlockFlag = 1. This Flag is used to read bytes
2276            till the end of the card only */
2277         RemainingBytes = NdefMap->StdMifareContainer.remainingSize;
2278     }
2279 
2280     /* Remaining Bytes of length (L) in TLV <=  internal length */
2281     if ((NdefMap->TLVStruct.BytesRemainLinTLV <=
2282         NdefMap->StdMifareContainer.internalLength) &&
2283         (RemainingBytes <= NdefMap->TLVStruct.BytesRemainLinTLV))
2284     {
2285         memcpy (&(NdefMap->ApduBuffer [NdefMap->ApduBuffIndex]),
2286                 &(NdefMap->StdMifareContainer.internalBuf [(*TempintBytes)]),
2287                 RemainingBytes);
2288         NdefMap->ApduBuffIndex += RemainingBytes;
2289         NdefMap->StdMifareContainer.remainingSize -= RemainingBytes;
2290         *TempintBytes += ((uint8_t) RemainingBytes);
2291 
2292         /* copy the bytes to internal buffer, that are read,
2293            but not used for the user buffer */
2294         memcpy (NdefMap->StdMifareContainer.internalBuf,
2295                 &(NdefMap->StdMifareContainer.internalBuf [RemainingBytes]),
2296                 (NdefMap->StdMifareContainer.internalLength - RemainingBytes));
2297 
2298         /* internal buffer length */
2299         NdefMap->StdMifareContainer.internalLength -= RemainingBytes;
2300 
2301         NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
2302         if (NdefMap->StdMifareContainer.internalLength == PH_FRINFC_MIFARESTD_VAL0)
2303         {
2304            NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
2305             (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
2306             (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0)) ?
2307             PH_FRINFC_MIFARESTD_FLAG1 :
2308             PH_FRINFC_MIFARESTD_FLAG0);
2309 
2310             /* internal length bytes completed */
2311             NdefMap->StdMifareContainer.currentBlock++;
2312             NdefMap->StdMifareContainer.NdefBlocks++;
2313         }
2314 
2315         /* Remaining Bytes of length value in TLV */
2316         if (NdefMap->TLVStruct.BytesRemainLinTLV == 0)
2317         {
2318             /* Remaining Bytes of length (L) in TLV is Zero means that the next
2319              coming bytes are containing type (T), length (L) in TLV */
2320             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
2321             NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2322             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2323         }
2324         /* call completion routine */
2325         CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2326         *Flag = PH_FRINFC_MIFARESTD_FLAG0;
2327     }
2328     else if ((NdefMap->TLVStruct.BytesRemainLinTLV <=
2329             NdefMap->StdMifareContainer.internalLength) &&
2330             (RemainingBytes > NdefMap->TLVStruct.BytesRemainLinTLV))
2331     {
2332         memcpy (&(NdefMap->ApduBuffer [NdefMap->ApduBuffIndex]),
2333                 &(NdefMap->StdMifareContainer.internalBuf [(*TempintBytes)]),
2334                 NdefMap->TLVStruct.BytesRemainLinTLV);
2335 
2336         NdefMap->ApduBuffIndex += NdefMap->TLVStruct.BytesRemainLinTLV;
2337         NdefMap->StdMifareContainer.remainingSize -= NdefMap->TLVStruct.BytesRemainLinTLV;
2338         NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
2339 
2340         *TempintBytes += ((uint8_t) NdefMap->TLVStruct.BytesRemainLinTLV);
2341         *Flag = PH_FRINFC_MIFARESTD_FLAG1;
2342 
2343         NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2344         NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2345 
2346         NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_VAL0;
2347         NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
2348         (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
2349             (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0)) ?
2350             PH_FRINFC_MIFARESTD_FLAG1 :
2351             PH_FRINFC_MIFARESTD_FLAG0);
2352 
2353         if (PH_FRINFC_MIFARESTD_FLAG1 == NdefMap->StdMifareContainer.ReadWriteCompleteFlag)
2354         {
2355             CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2356         }
2357 
2358         if (NdefMap->TLVStruct.BytesRemainLinTLV == NdefMap->StdMifareContainer.internalLength)
2359         {
2360             /* Remaining Bytes in Length (L) field of TLV is 0 */
2361             NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0;
2362             NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
2363             *Flag = PH_FRINFC_MIFARESTD_FLAG0;
2364             /* internal length bytes completed */
2365             NdefMap->StdMifareContainer.currentBlock++;
2366             NdefMap->StdMifareContainer.NdefBlocks++;
2367             Result = phFriNfc_MifStd_H_BlkChk (NdefMap);
2368             if (Result == NFCSTATUS_SUCCESS)
2369             {
2370                 Result =
2371                 ((NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1) ?
2372                 phFriNfc_MifStd_H_RdABlock (NdefMap) :
2373                 phFriNfc_MifStd_H_AuthSector (NdefMap));
2374             }
2375         }
2376         else
2377         {
2378             /* Remaining Bytes in Length (L) field of TLV is 0 */
2379             NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0;
2380             *Flag = PH_FRINFC_MIFARESTD_FLAG1;
2381         }
2382     }
2383     else if ((NdefMap->TLVStruct.BytesRemainLinTLV >
2384             NdefMap->StdMifareContainer.internalLength) &&
2385             (RemainingBytes <= NdefMap->StdMifareContainer.internalLength))
2386     {
2387         memcpy(&(NdefMap->ApduBuffer [NdefMap->ApduBuffIndex]),
2388                 &(NdefMap->StdMifareContainer.internalBuf [(*TempintBytes)]),
2389                 RemainingBytes);
2390 
2391         NdefMap->ApduBuffIndex += RemainingBytes;
2392         NdefMap->StdMifareContainer.remainingSize -= RemainingBytes;
2393         *TempintBytes += ((uint8_t) RemainingBytes);
2394         /* Remaining Bytes of length (L) in TLV */
2395         NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
2396 
2397         /* copy the bytes to internal buffer, that are read,
2398                         but not used for the user buffer */
2399         memcpy (NdefMap->StdMifareContainer.internalBuf,
2400                 &(NdefMap->StdMifareContainer.internalBuf [RemainingBytes]),
2401                 (NdefMap->StdMifareContainer.internalLength - RemainingBytes));
2402 
2403         /* internal buffer length */
2404         NdefMap->StdMifareContainer.internalLength -= RemainingBytes;
2405         if (NdefMap->StdMifareContainer.internalLength == PH_FRINFC_MIFARESTD_VAL0)
2406         {
2407             NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
2408             (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
2409             (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0)) ?
2410             PH_FRINFC_MIFARESTD_FLAG1 :
2411             PH_FRINFC_MIFARESTD_FLAG0);
2412 
2413             /* internal length bytes completed */
2414             NdefMap->StdMifareContainer.currentBlock++;
2415             NdefMap->StdMifareContainer.NdefBlocks++;
2416         }
2417 
2418         NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
2419         CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2420         *Flag = PH_FRINFC_MIFARESTD_FLAG0;
2421     }
2422     else
2423     {
2424         if ((NdefMap->TLVStruct.BytesRemainLinTLV >
2425             NdefMap->StdMifareContainer.internalLength) &&
2426             (RemainingBytes > NdefMap->StdMifareContainer.internalLength))
2427         {
2428             memcpy (&(NdefMap->ApduBuffer [NdefMap->ApduBuffIndex]),
2429                     &(NdefMap->StdMifareContainer.internalBuf [(*TempintBytes)]),
2430                     NdefMap->StdMifareContainer.internalLength);
2431             *Flag = PH_FRINFC_MIFARESTD_FLAG0;
2432             NdefMap->ApduBuffIndex += NdefMap->StdMifareContainer.internalLength;
2433             NdefMap->StdMifareContainer.remainingSize -=
2434                                 NdefMap->StdMifareContainer.internalLength;
2435             NdefMap->TLVStruct.BytesRemainLinTLV -= NdefMap->StdMifareContainer.internalLength;
2436 
2437             if(NdefMap->TLVStruct.BytesRemainLinTLV != PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0)
2438             {
2439                 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
2440             }
2441 
2442             NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
2443             /* internal length bytes completed */
2444             NdefMap->StdMifareContainer.currentBlock++;
2445             NdefMap->StdMifareContainer.NdefBlocks++;
2446             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
2447             if(Result == NFCSTATUS_SUCCESS)
2448             {
2449                 Result = ((NdefMap->StdMifareContainer.AuthDone ==
2450                             PH_FRINFC_MIFARESTD_FLAG1)?
2451                             phFriNfc_MifStd_H_RdABlock(NdefMap):
2452                             phFriNfc_MifStd_H_AuthSector(NdefMap));
2453             }
2454         }
2455     }
2456 
2457     if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
2458     {
2459         NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
2460         (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
2461             (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
2462             PH_FRINFC_MIFARESTD_FLAG1:
2463             PH_FRINFC_MIFARESTD_FLAG0);
2464         *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
2465     }
2466 
2467     return Result;
2468 }
2469 
2470 /******************************************************************************
2471  * Function         phFriNfc_MifStd_H_WriteNdefLen
2472  *
2473  * Description      This function is Helper function for write ndef
2474  *                  to write the Length TLV.
2475  *
2476  * Returns          This function return NFCSTATUS_PENDING in case of success
2477  *                  In case of failure returns other failure value.
2478  *
2479  ******************************************************************************/
phFriNfc_MifStd_H_WriteNdefLen(phFriNfc_NdefMap_t * NdefMap)2480 static NFCSTATUS phFriNfc_MifStd_H_WriteNdefLen(phFriNfc_NdefMap_t *NdefMap)
2481 {
2482     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
2483     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_WR_NDEF_LEN;
2484 
2485     /* If Current block = Ndef TLV block then the starting point
2486        is writing from type of TLV
2487        Else */
2488 
2489     if(NdefMap->StdMifareContainer.currentBlock ==
2490                                 NdefMap->TLVStruct.NdefTLVBlock)
2491     {
2492 
2493         if(NdefMap->TLVStruct.NULLTLVCount >=
2494             PH_FRINFC_MIFARESTD_VAL2)
2495         {
2496             phFriNfc_MifStd_H_fillTLV1(NdefMap);
2497         }
2498         else
2499         {
2500             phFriNfc_MifStd_H_fillTLV2(NdefMap);
2501         }
2502     }
2503     else
2504     {
2505         if(NdefMap->TLVStruct.NULLTLVCount >=
2506             PH_FRINFC_MIFARESTD_VAL2)
2507         {
2508             phFriNfc_MifStd_H_fillTLV1_1(NdefMap);
2509         }
2510         else
2511         {
2512             phFriNfc_MifStd_H_fillTLV2_1(NdefMap);
2513         }
2514     }
2515 
2516     memcpy( NdefMap->StdMifareContainer.Buffer,
2517             &(NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL1]),
2518             PH_FRINFC_MIFARESTD_BYTES_READ);
2519 
2520 
2521     /* Write from here */
2522     NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_WRITE;
2523 
2524     NdefMap->Cmd.MfCmd = phHal_eMifareWrite16;
2525 
2526     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
2527     /* Call the Overlapped HAL Transceive function */
2528     Result = phFriNfc_ExtnsTransceive(NdefMap->pTransceiveInfo,
2529                                    NdefMap->Cmd,
2530                                    NdefMap->SendRecvBuf,
2531                                    NdefMap->SendLength,
2532                                    NdefMap->SendRecvLength);
2533 
2534     return Result;
2535 }
2536 
2537 /******************************************************************************
2538  * Function         phFriNfc_MifStd_H_RdWrReset
2539  *
2540  * Description      It resets ndef TLV values. This is used when the offset
2541  *                  is BEGIN.
2542  *
2543  * Returns          void
2544  *
2545  ******************************************************************************/
phFriNfc_MifStd_H_RdWrReset(phFriNfc_NdefMap_t * NdefMap)2546 static void phFriNfc_MifStd_H_RdWrReset(phFriNfc_NdefMap_t   *NdefMap)
2547 {
2548     NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_BLK4;
2549     NdefMap->StdMifareContainer.NdefBlocks = PH_FRINFC_MIFARESTD_VAL1;
2550     NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_VAL0;
2551     NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2552     NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2553     NdefMap->TLVStruct.NdefTLVAuthFlag = PH_FRINFC_MIFARESTD_FLAG0;
2554     NdefMap->TLVStruct.NdefTLVBlock = PH_FRINFC_MIFARESTD_MAD_BLK0;
2555     NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL0;
2556     NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_MIFARESTD_VAL0;
2557     NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
2558     NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
2559     NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
2560     NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0;
2561     NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG1;
2562     NdefMap->StdMifareContainer.ReadWriteCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
2563     NdefMap->StdMifareContainer.remainingSize = (uint16_t)
2564                         (NdefMap->StdMifareContainer.NoOfNdefCompBlocks *
2565                             PH_FRINFC_MIFARESTD_BLOCK_BYTES);
2566     NdefMap->StdMifareContainer.WrLength = PH_FRINFC_MIFARESTD_VAL1;
2567 
2568     return;
2569 }
2570 
2571 /******************************************************************************
2572  * Function         phFriNfc_MifStd_H_RdtoWrNdefLen
2573  *
2574  * Description      This function is used to read the first ndef compliant
2575  *                  block to change the length.
2576  *
2577  * Returns          This function return NFCSTATUS_PENDING in case of success
2578  *                  In case of failure returns other failure value.
2579  *
2580  ******************************************************************************/
phFriNfc_MifStd_H_RdtoWrNdefLen(phFriNfc_NdefMap_t * NdefMap)2581 static NFCSTATUS phFriNfc_MifStd_H_RdtoWrNdefLen(phFriNfc_NdefMap_t *NdefMap)
2582 {
2583     NFCSTATUS Result = NFCSTATUS_SUCCESS;
2584 
2585     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RD_TO_WR_NDEF_LEN;
2586 
2587     if(NdefMap->TLVStruct.NdefTLVAuthFlag == PH_FRINFC_MIFARESTD_FLAG1)
2588     {
2589         NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
2590         Result = phFriNfc_MifStd_H_AuthSector(NdefMap);
2591     }
2592     else
2593     {
2594         NdefMap->SendRecvBuf[0] = NdefMap->StdMifareContainer.currentBlock;
2595         NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_READ;
2596         *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
2597 
2598         NdefMap->Cmd.MfCmd = phHal_eMifareRead;
2599 
2600         /* Call the Overlapped HAL Transceive function */
2601         Result = phFriNfc_ExtnsTransceive(NdefMap->pTransceiveInfo,
2602                                       NdefMap->Cmd,
2603                                       NdefMap->SendRecvBuf,
2604                                       NdefMap->SendLength,
2605                                       NdefMap->SendRecvLength);
2606     }
2607 
2608     return Result;
2609 }
2610 
2611 /******************************************************************************
2612  * Function         phFriNfc_MifStd_H_SetNdefBlkAuth
2613  *
2614  * Description      This function is used to set the authentication flag
2615  *                  for the ndef TLV block.
2616  *
2617  * Returns          void
2618  *
2619  ******************************************************************************/
phFriNfc_MifStd_H_SetNdefBlkAuth(phFriNfc_NdefMap_t * NdefMap)2620 static void phFriNfc_MifStd_H_SetNdefBlkAuth(phFriNfc_NdefMap_t   *NdefMap)
2621 {
2622     NdefMap->TLVStruct.NdefTLVAuthFlag =
2623             ((phFriNfc_MifStd_H_GetSect(NdefMap->TLVStruct.NdefTLVBlock)
2624             == phFriNfc_MifStd_H_GetSect(NdefMap->StdMifareContainer.currentBlock))?
2625             PH_FRINFC_MIFARESTD_FLAG0:
2626             PH_FRINFC_MIFARESTD_FLAG1);
2627 
2628     return;
2629 }
2630 
2631 /******************************************************************************
2632  * Function         phFriNfc_MifStd_H_GetActCardLen
2633  *
2634  * Description      Helper function to get the actual length of card.
2635  *
2636  * Returns          This function return NFCSTATUS_SUCCESS in case of success
2637  *                  In case of failure returns other failure value.
2638  *
2639  ******************************************************************************/
phFriNfc_MifStd_H_GetActCardLen(phFriNfc_NdefMap_t * NdefMap)2640 static NFCSTATUS phFriNfc_MifStd_H_GetActCardLen(phFriNfc_NdefMap_t *NdefMap)
2641 {
2642     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
2643 
2644     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_GET_ACT_CARDSIZE;
2645     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_GET_ACTSIZE_OPE;
2646 
2647     Result = ((NdefMap->StdMifareContainer.AuthDone ==
2648             PH_FRINFC_MIFARESTD_FLAG0)?
2649             phFriNfc_MifStd_H_AuthSector(NdefMap):
2650             phFriNfc_MifStd_H_Rd16Bytes(NdefMap,
2651                 NdefMap->StdMifareContainer.currentBlock));
2652 
2653     return Result;
2654 }
2655 
2656 /******************************************************************************
2657  * Function         phFriNfc_MifStd_H_ChkTLVs
2658  *
2659  * Description      Helper function to check all the TLVs.
2660  *
2661  * Returns          This function return NFCSTATUS_SUCCESS in case of success
2662  *                  In case of failure returns other failure value.
2663  *
2664  ******************************************************************************/
phFriNfc_MifStd_H_ChkTLVs(phFriNfc_NdefMap_t * NdefMap,uint8_t * CRFlag)2665 static NFCSTATUS phFriNfc_MifStd_H_ChkTLVs(phFriNfc_NdefMap_t *NdefMap,
2666                                            uint8_t            *CRFlag)
2667 {
2668     NFCSTATUS       Result = NFCSTATUS_SUCCESS;
2669     uint16_t        TempLength = PH_FRINFC_MIFARESTD_VAL0,
2670                     ShiftLength = PH_FRINFC_MIFARESTD_VAL0;
2671     uint8_t         TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
2672 
2673     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_GET_ACTSIZE_OPE;
2674     TempLength = NdefMap->TLVStruct.NdefTLVByte;
2675 
2676     for(;;)
2677     {
2678         if((NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_TERMTLV_T) &&
2679             (NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_NULLTLV_T) &&
2680             (NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_NDEFTLV_T) &&
2681             (FALSE == NdefMap->TLVStruct.NdefTLVFoundFlag))
2682         {
2683             Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
2684                                 NFCSTATUS_NO_NDEF_SUPPORT);
2685             NdefMap->TLVStruct.BytesRemainLinTLV = 0;
2686             NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
2687             *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2688             break;
2689 
2690         }
2691         else
2692         if((NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_TERMTLV_T) &&
2693             (NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_NULLTLV_T))
2694         {
2695             if(NdefMap->SendRecvBuf[TempLength] == PH_FRINFC_MIFARESTD_NDEFTLV_T)
2696             {
2697                 NdefMap->TLVStruct.NdefTLVBlock =
2698                             NdefMap->StdMifareContainer.currentBlock;
2699                 NdefMap->TLVStruct.NdefTLVByte = (uint8_t)TempLength;
2700                 NdefMap->TLVStruct.NdefTLVFoundFlag =
2701                             ((NdefMap->SendRecvBuf[TempLength] ==
2702                                 PH_FRINFC_MIFARESTD_NDEFTLV_T)?
2703                                 PH_FRINFC_MIFARESTD_FLAG1:
2704                                 PH_FRINFC_MIFARESTD_FLAG0);
2705 
2706                 NdefMap->TLVStruct.NULLTLVCount = ((NdefMap->TLVStruct.NULLTLVCount
2707                                             == PH_FRINFC_MIFARESTD_VAL1)?
2708                                             PH_FRINFC_MIFARESTD_VAL0:
2709                                             NdefMap->TLVStruct.NULLTLVCount);
2710             }
2711             else
2712             {
2713                 NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
2714             }
2715 
2716             TempLength++;
2717             if(TempLength == PH_FRINFC_MIFARESTD_BYTES_READ)
2718             {
2719                 NdefMap->TLVStruct.TcheckedinTLVFlag =
2720                                         PH_FRINFC_MIFARESTD_FLAG1;
2721                 NdefMap->TLVStruct.NoLbytesinTLV =
2722                                     PH_FRINFC_MIFARESTD_VAL3;
2723             }
2724             Result = phFriNfc_MifStd_H_Chk16Bytes(  NdefMap,
2725                                                     TempLength);
2726             if(Result != NFCSTATUS_SUCCESS)
2727             {
2728                 *CRFlag = (uint8_t)((Result == NFCSTATUS_PENDING)?
2729                             PH_FRINFC_MIFARESTD_FLAG0:
2730                             PH_FRINFC_MIFARESTD_FLAG1);
2731                 break;
2732             }
2733 
2734             if(((((  NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
2735                         NdefMap->StdMifareContainer.NdefBlocks) *
2736                         PH_FRINFC_MIFARESTD_BLOCK_BYTES) +
2737                         (PH_FRINFC_MIFARESTD_BLOCK_BYTES -
2738                         TempLength)) <
2739                         NdefMap->SendRecvBuf[TempLength]) &&
2740                         ((NdefMap->SendRecvBuf[TempLength] <
2741                         PH_FRINFC_MIFARESTD_NDEFTLV_L) &&
2742                         (NdefMap->TLVStruct.NdefTLVFoundFlag !=
2743                         PH_FRINFC_MIFARESTD_VAL1)))
2744             {
2745                 /* Result = Error */
2746                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
2747                                 NFCSTATUS_INVALID_PARAMETER);
2748                 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2749                 break;
2750             }
2751 
2752             if(((((  NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
2753                         NdefMap->StdMifareContainer.NdefBlocks) *
2754                         PH_FRINFC_MIFARESTD_BLOCK_BYTES) +
2755                         (PH_FRINFC_MIFARESTD_BLOCK_BYTES -
2756                         TempLength)) <
2757                         NdefMap->SendRecvBuf[TempLength]) &&
2758                         ((NdefMap->SendRecvBuf[TempLength] ==
2759                         PH_FRINFC_MIFARESTD_VAL0) &&
2760                         (NdefMap->TLVStruct.NdefTLVFoundFlag ==
2761                         PH_FRINFC_MIFARESTD_VAL1)))
2762             {
2763                 /* Result = Error */
2764                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
2765                                 NFCSTATUS_INVALID_PARAMETER);
2766                 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2767                 break;
2768             }
2769 
2770             if((NdefMap->TLVStruct.NdefTLVFoundFlag ==
2771                 PH_FRINFC_MIFARESTD_FLAG1) &&
2772                 (NdefMap->SendRecvBuf[TempLength] <
2773                  PH_FRINFC_MIFARESTD_NDEFTLV_L))
2774             {
2775                 Result = phFriNfc_MapTool_SetCardState(NdefMap,
2776                                     NdefMap->SendRecvBuf[TempLength]);
2777                 NdefMap->TLVStruct.BytesRemainLinTLV =
2778                                     NdefMap->SendRecvBuf[TempLength];
2779                 NdefMap->StdMifareContainer.remainingSize -=
2780                                             PH_FRINFC_MIFARESTD_VAL2;
2781                 /* This flag is set */
2782                 NdefMap->StdMifareContainer.remSizeUpdFlag =
2783                     (uint8_t)((NdefMap->TLVStruct.NULLTLVCount >=
2784                     PH_FRINFC_MIFARESTD_VAL2)?
2785                     PH_FRINFC_MIFARESTD_FLAG0:
2786                     PH_FRINFC_MIFARESTD_FLAG1);
2787 
2788                 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2789                 break;
2790             }
2791 
2792             NdefMap->StdMifareContainer.remainingSize -=
2793                     ((  NdefMap->SendRecvBuf[TempLength] <
2794                             PH_FRINFC_MIFARESTD_NDEFTLV_L)?
2795                             (NdefMap->SendRecvBuf[TempLength]
2796                             + PH_FRINFC_MIFARESTD_VAL2):
2797                             PH_FRINFC_MIFARESTD_VAL0);
2798 
2799             if(NdefMap->SendRecvBuf[TempLength] ==
2800                         PH_FRINFC_MIFARESTD_VAL0)
2801             {
2802                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
2803                             NFCSTATUS_INVALID_PARAMETER);
2804                 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2805                 break;
2806             }
2807 
2808             TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
2809             /* get the next TLV after the proprietary TLV */
2810             Result =
2811                 ((NdefMap->SendRecvBuf[TempLength] <
2812                     PH_FRINFC_MIFARESTD_NDEFTLV_L)?
2813                     phFriNfc_MifStd_H_GetNxtTLV(NdefMap, &TempLength, &TL4bytesFlag):
2814                     NFCSTATUS_PENDING);
2815 
2816             if((TempLength >= PH_FRINFC_MIFARESTD_BYTES_READ) &&
2817                 (Result == NFCSTATUS_SUCCESS))
2818             {
2819                 NdefMap->TLVStruct.TcheckedinTLVFlag =
2820                                         PH_FRINFC_MIFARESTD_FLAG0;
2821                 NdefMap->TLVStruct.NoLbytesinTLV =
2822                                     PH_FRINFC_MIFARESTD_VAL0;
2823 
2824                 Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
2825                 *CRFlag = (uint8_t)((Result != NFCSTATUS_PENDING)?
2826                             PH_FRINFC_MIFARESTD_FLAG1:
2827                             PH_FRINFC_MIFARESTD_FLAG0);
2828                 break;
2829             }
2830             else
2831             {
2832                 if(Result == NFCSTATUS_PENDING)
2833                 {
2834                     TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG1;
2835                     Result = ((NdefMap->SendRecvBuf[TempLength] ==
2836                             PH_FRINFC_MIFARESTD_NDEFTLV_L) ?
2837                             NFCSTATUS_SUCCESS:
2838                             (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
2839                                 NFCSTATUS_INVALID_PARAMETER)));
2840 
2841                     if(Result != NFCSTATUS_SUCCESS)
2842                     {
2843                         *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2844                         break;
2845                     }
2846                     NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
2847                     TempLength++;
2848                     /* Check 0xFF */
2849                     if(TempLength == PH_FRINFC_MIFARESTD_BYTES_READ)
2850                     {
2851                         NdefMap->TLVStruct.TcheckedinTLVFlag =
2852                                                 PH_FRINFC_MIFARESTD_FLAG1;
2853                         NdefMap->TLVStruct.NoLbytesinTLV =
2854                                             PH_FRINFC_MIFARESTD_VAL2;
2855                     }
2856                     Result = phFriNfc_MifStd_H_Chk16Bytes(  NdefMap,
2857                                                             TempLength);
2858                     if(Result != NFCSTATUS_SUCCESS)
2859                     {
2860                         break;
2861                     }
2862 
2863                     ShiftLength = NdefMap->SendRecvBuf[TempLength];
2864                     TempLength++;
2865                     if(TempLength == PH_FRINFC_MIFARESTD_BYTES_READ)
2866                     {
2867                         NdefMap->TLVStruct.TcheckedinTLVFlag =
2868                                                 PH_FRINFC_MIFARESTD_FLAG1;
2869                         NdefMap->TLVStruct.NoLbytesinTLV =
2870                                             PH_FRINFC_MIFARESTD_VAL1;
2871                         NdefMap->TLVStruct.prevLenByteValue =
2872                                     NdefMap->SendRecvBuf[(TempLength -
2873                                                 PH_FRINFC_MIFARESTD_VAL1)];
2874                     }
2875                     Result = phFriNfc_MifStd_H_Chk16Bytes(  NdefMap,
2876                                                             TempLength);
2877                     if(Result != NFCSTATUS_SUCCESS)
2878                     {
2879                         break;
2880                     }
2881 
2882 
2883                     if((((  NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
2884                         NdefMap->StdMifareContainer.NdefBlocks) *
2885                         PH_FRINFC_MIFARESTD_BLOCK_BYTES) +
2886                         (PH_FRINFC_MIFARESTD_BLOCK_BYTES -
2887                         TempLength)) <
2888                         (( ShiftLength
2889                         << 8) + NdefMap->SendRecvBuf[TempLength]))
2890                     {
2891                         Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
2892                                 NFCSTATUS_INVALID_REMOTE_DEVICE);
2893 
2894                         break;
2895                     }
2896 
2897                     if(NdefMap->TLVStruct.NdefTLVFoundFlag ==
2898                         PH_FRINFC_MIFARESTD_FLAG1)
2899                     {
2900                         ShiftLength = (( ShiftLength<< 8) +
2901                                     NdefMap->SendRecvBuf[TempLength]);
2902                         NdefMap->TLVStruct.BytesRemainLinTLV = ShiftLength;
2903                         Result = phFriNfc_MapTool_SetCardState(NdefMap,
2904                                                                 ShiftLength);
2905                         NdefMap->StdMifareContainer.remainingSize -=
2906                                             PH_FRINFC_MIFARESTD_VAL4;
2907                         *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2908                         break;
2909                     }
2910 
2911                     NdefMap->StdMifareContainer.remainingSize -=
2912                                 ((ShiftLength<< 8) +
2913                                 NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)]);
2914                     TempLength++;
2915 
2916                     /* get the next TLV after the proprietary TLV */
2917                     Result = phFriNfc_MifStd_H_GetNxtTLV(NdefMap, &TempLength, &TL4bytesFlag);
2918 
2919                     if((TempLength >= PH_FRINFC_MIFARESTD_BYTES_READ) &&
2920                         (Result == NFCSTATUS_SUCCESS))
2921                     {
2922                         NdefMap->TLVStruct.TcheckedinTLVFlag =
2923                                                 PH_FRINFC_MIFARESTD_FLAG0;
2924                         NdefMap->TLVStruct.NoLbytesinTLV =
2925                                             PH_FRINFC_MIFARESTD_VAL0;
2926                         Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
2927 
2928                         break;
2929                     }
2930                     break;
2931                 }
2932             }
2933         }
2934         else if((NdefMap->SendRecvBuf[TempLength] == PH_FRINFC_MIFARESTD_TERMTLV_T) &&
2935                 (NdefMap->TLVStruct.NdefTLVFoundFlag == PH_FRINFC_MIFARESTD_FLAG0))
2936         {
2937             Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
2938                                 NFCSTATUS_INVALID_PARAMETER);
2939             NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
2940                                         PH_FRINFC_MIFARESTD_FLAG1;
2941             break;
2942 
2943         }
2944         else if(NdefMap->SendRecvBuf[TempLength] == PH_FRINFC_MIFARESTD_NULLTLV_T)
2945         {
2946             TempLength++;
2947             NdefMap->TLVStruct.NULLTLVCount += PH_FRINFC_MIFARESTD_VAL1;
2948             ShiftLength = NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL1)];
2949             NdefMap->StdMifareContainer.remainingSize -= PH_FRINFC_MIFARESTD_VAL1;
2950             if(NdefMap->StdMifareContainer.remainingSize <
2951                     (( ShiftLength << 8) + NdefMap->SendRecvBuf[TempLength]))
2952             {
2953                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
2954                                 NFCSTATUS_INVALID_REMOTE_DEVICE);
2955                 break;
2956             }
2957             Result = phFriNfc_MifStd_H_Chk16Bytes(  NdefMap,
2958                                                     TempLength);
2959             if(Result != NFCSTATUS_SUCCESS)
2960             {
2961                 NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL0;
2962                 break;
2963             }
2964         }
2965         else
2966         {
2967             if((NdefMap->SendRecvBuf[TempLength] == PH_FRINFC_MIFARESTD_TERMTLV_T) &&
2968                 (NdefMap->TLVStruct.NdefTLVFoundFlag == PH_FRINFC_MIFARESTD_FLAG1))
2969             {
2970                 TempLength++;
2971                 Result = NFCSTATUS_SUCCESS;
2972                 NdefMap->StdMifareContainer.remainingSize -=
2973                                                 PH_FRINFC_MIFARESTD_VAL1;
2974             }
2975         }
2976     }
2977 
2978     if(NdefMap->TLVStruct.BytesRemainLinTLV >
2979         NdefMap->StdMifareContainer.remainingSize)
2980     {
2981         Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
2982                                 NFCSTATUS_INVALID_FORMAT);
2983     }
2984     else
2985     {
2986         if(NdefMap->StdMifareContainer.remainingSize ==
2987                 PH_FRINFC_MIFARESTD_VAL0)
2988         {
2989             Result = ((NdefMap->TLVStruct.NdefTLVFoundFlag ==
2990                         PH_FRINFC_MIFARESTD_FLAG1)?
2991                         NFCSTATUS_SUCCESS:
2992                         (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
2993                                     NFCSTATUS_INVALID_PARAMETER)));
2994         }
2995     }
2996 
2997     return Result;
2998 }
2999 
3000 /******************************************************************************
3001  * Function         phFriNfc_MifStd_H_GetNxtTLV
3002  *
3003  * Description      This is a Helper function to get the next TLV.
3004  *
3005  * Returns          This function return NFCSTATUS_SUCCESS in case of success
3006  *                  In case of failure returns other failure value.
3007  *
3008  ******************************************************************************/
phFriNfc_MifStd_H_GetNxtTLV(phFriNfc_NdefMap_t * NdefMap,uint16_t * TempLength,uint8_t * TL4bytesFlag)3009 static NFCSTATUS phFriNfc_MifStd_H_GetNxtTLV(phFriNfc_NdefMap_t    *NdefMap,
3010                                       uint16_t              *TempLength,
3011                                        uint8_t              *TL4bytesFlag)
3012 {
3013     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
3014     uint16_t    LengthRemaining = PH_FRINFC_MIFARESTD_VAL0,
3015                 TempLen = PH_FRINFC_MIFARESTD_VAL0,
3016                 ShiftLength = PH_FRINFC_MIFARESTD_VAL0;
3017 
3018     TempLen = (*TempLength);
3019     LengthRemaining = (PH_FRINFC_MIFARESTD_BYTES_READ -
3020                         (TempLen + PH_FRINFC_MIFARESTD_VAL1));
3021 
3022     if(*TL4bytesFlag == PH_FRINFC_MIFARESTD_FLAG0)
3023     {
3024         (*TempLength) += (NdefMap->SendRecvBuf[TempLen] +
3025                             PH_FRINFC_MIFARESTD_VAL1);
3026 
3027         if(NdefMap->TLVStruct.NdefTLVFoundFlag == PH_FRINFC_MIFARESTD_FLAG0)
3028         {
3029             LengthRemaining =
3030                 (((*TempLength) < PH_FRINFC_MIFARESTD_BYTES_READ)?
3031                 PH_FRINFC_MIFARESTD_VAL0:
3032                 (NdefMap->SendRecvBuf[TempLen] -
3033                 LengthRemaining));
3034         }
3035         else
3036         {
3037             LengthRemaining =
3038                 (((*TempLength) < PH_FRINFC_MIFARESTD_BYTES_READ)?
3039                 PH_FRINFC_MIFARESTD_VAL0:
3040                 (NdefMap->SendRecvBuf[TempLen] -
3041                 LengthRemaining));
3042         }
3043     }
3044     else
3045     {
3046         *TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
3047         if(NdefMap->TLVStruct.NoLbytesinTLV ==
3048             PH_FRINFC_MIFARESTD_VAL1)
3049         {
3050             ShiftLength = NdefMap->TLVStruct.prevLenByteValue;
3051             (*TempLength) += ((ShiftLength
3052                                 << 8) + NdefMap->SendRecvBuf[TempLen] +
3053                             PH_FRINFC_MIFARESTD_VAL1);
3054 
3055             LengthRemaining =
3056                 (((ShiftLength
3057                 << 8) + NdefMap->SendRecvBuf[TempLen]) -
3058                 LengthRemaining);
3059         }
3060         else
3061         {
3062             ShiftLength = NdefMap->SendRecvBuf[(TempLen - PH_FRINFC_MIFARESTD_VAL1)];
3063             (*TempLength) += ((ShiftLength
3064                                 << 8) + NdefMap->SendRecvBuf[TempLen] +
3065                             PH_FRINFC_MIFARESTD_VAL1);
3066 
3067             LengthRemaining =
3068                 (((ShiftLength
3069                     << 8) + NdefMap->SendRecvBuf[TempLen]) -
3070                     LengthRemaining);
3071         }
3072     }
3073 
3074     NdefMap->TLVStruct.NdefTLVByte =
3075         (uint8_t)(((*TempLength) < PH_FRINFC_MIFARESTD_BYTES_READ)?
3076         (*TempLength):
3077         (LengthRemaining % PH_FRINFC_MIFARESTD_BYTES_READ));
3078 
3079     while(LengthRemaining != PH_FRINFC_MIFARESTD_VAL0)
3080     {
3081         NdefMap->StdMifareContainer.currentBlock++;
3082         NdefMap->StdMifareContainer.NdefBlocks++;
3083         Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3084         LengthRemaining -=
3085             ((LengthRemaining <= PH_FRINFC_MIFARESTD_BYTES_READ)?
3086             LengthRemaining:
3087             PH_FRINFC_MIFARESTD_BYTES_READ);
3088     }
3089 
3090     if(NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL0)
3091     {
3092         NdefMap->StdMifareContainer.currentBlock++;
3093         NdefMap->StdMifareContainer.NdefBlocks++;
3094         Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3095     }
3096 
3097     return Result;
3098 }
3099 
3100 /******************************************************************************
3101  * Function         phFriNfc_MifStd_H_Chk16Bytes
3102  *
3103  * Description      This Helper function is used to know whether the read
3104  *                  16 bytes are parsed completely.
3105  *
3106  * Returns          This function return NFCSTATUS_SUCCESS in case of success
3107  *                  In case of failure returns other failure value.
3108  *
3109  ******************************************************************************/
phFriNfc_MifStd_H_Chk16Bytes(phFriNfc_NdefMap_t * NdefMap,uint16_t TempLength)3110 static NFCSTATUS phFriNfc_MifStd_H_Chk16Bytes(phFriNfc_NdefMap_t   *NdefMap,
3111                                        uint16_t             TempLength)
3112 {
3113     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
3114 
3115     if(TempLength == PH_FRINFC_MIFARESTD_BYTES_READ)
3116     {
3117         NdefMap->StdMifareContainer.currentBlock++;
3118         NdefMap->StdMifareContainer.NdefBlocks++;
3119         Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3120 
3121         Result =
3122             ((NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)?
3123             phFriNfc_MifStd_H_GetActCardLen(NdefMap):
3124             phFriNfc_MifStd_H_AuthSector(NdefMap));
3125     }
3126 
3127     return Result;
3128 }
3129 
3130 /******************************************************************************
3131  * Function         phFriNfc_MifStd_H_ChkRemainTLVs
3132  *
3133  * Description      This function is used to know whether the read
3134  *                  16 bytes are parsed completely.
3135  *
3136  * Returns          This function return NFCSTATUS_SUCCESS in case of success
3137  *                  In case of failure returns other failure value.
3138  *
3139  ******************************************************************************/
phFriNfc_MifStd_H_ChkRemainTLVs(phFriNfc_NdefMap_t * NdefMap,uint8_t * CRFlag,uint8_t * NDEFFlag)3140 static NFCSTATUS phFriNfc_MifStd_H_ChkRemainTLVs(phFriNfc_NdefMap_t *NdefMap,
3141                                           uint8_t            *CRFlag,
3142                                           uint8_t            *NDEFFlag)
3143 {
3144     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
3145     uint16_t    TempLength = PH_FRINFC_MIFARESTD_VAL0,
3146                 ShiftLength = PH_FRINFC_MIFARESTD_VAL0;
3147     uint8_t     TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
3148 
3149     switch(NdefMap->TLVStruct.NoLbytesinTLV)
3150     {
3151         case PH_FRINFC_MIFARESTD_VAL3:
3152             /* if TLV is found then set card state */
3153             Result = ((NdefMap->TLVStruct.NdefTLVFoundFlag ==
3154                         PH_FRINFC_MIFARESTD_FLAG1)?
3155                         phFriNfc_MapTool_SetCardState(NdefMap,
3156                         NdefMap->SendRecvBuf[TempLength]):
3157                         Result);
3158 
3159             Result = ((NdefMap->TLVStruct.NdefTLVFoundFlag ==
3160                         PH_FRINFC_MIFARESTD_FLAG1)? 1 : Result);
3161 
3162 
3163             /* Check the length field is less than or
3164                equal to 0xFF if yes enter below statement
3165                else enter else if*/
3166             if((NdefMap->SendRecvBuf[TempLength] <
3167                 PH_FRINFC_MIFARESTD_NDEFTLV_L) &&
3168                 (Result == NFCSTATUS_SUCCESS))
3169             {
3170                 NdefMap->StdMifareContainer.remainingSize -=
3171                                 PH_FRINFC_MIFARESTD_VAL2;
3172 
3173                 Result = ((NdefMap->SendRecvBuf[TempLength] >
3174                             NdefMap->StdMifareContainer.remainingSize)?
3175                             (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
3176                             NFCSTATUS_INVALID_FORMAT)):
3177                             Result);
3178                 TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
3179                 if((NdefMap->TLVStruct.NdefTLVFoundFlag ==
3180                     PH_FRINFC_MIFARESTD_FLAG1) &&
3181                     (Result == NFCSTATUS_SUCCESS))
3182                 {
3183                     NdefMap->TLVStruct.BytesRemainLinTLV =
3184                     NdefMap->SendRecvBuf[TempLength];
3185                     *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3186 
3187                 }
3188                 else if(Result == NFCSTATUS_SUCCESS)
3189                 {
3190                     TempLength++;
3191                     Result = phFriNfc_MifStd_H_GetNxtTLV(NdefMap,
3192                                     &TempLength, &TL4bytesFlag);
3193 
3194                     NdefMap->StdMifareContainer.remainingSize -=
3195                                     NdefMap->SendRecvBuf[TempLength];
3196                     if((TempLength >= PH_FRINFC_MIFARESTD_BYTES_READ) &&
3197                         (*CRFlag == PH_FRINFC_MIFARESTD_FLAG0))
3198                     {
3199                         *NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
3200                         Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
3201                     }
3202                 }
3203 
3204                 else
3205                 {
3206                     /* do nothing */
3207                 }
3208             }
3209             else if((NdefMap->SendRecvBuf[TempLength] ==
3210                     PH_FRINFC_MIFARESTD_NDEFTLV_L) &&
3211                     (Result == NFCSTATUS_SUCCESS))
3212             {
3213                 TempLength++;
3214                 NdefMap->StdMifareContainer.remainingSize -=
3215                                 PH_FRINFC_MIFARESTD_VAL4;
3216                 TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
3217                 Result = (((((uint16_t)NdefMap->SendRecvBuf[TempLength] << 8) +
3218                                 NdefMap->SendRecvBuf[(TempLength +
3219                                 PH_FRINFC_MIFARESTD_VAL1)]) >
3220                                 NdefMap->StdMifareContainer.remainingSize)?
3221                                 (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
3222                                 NFCSTATUS_INVALID_FORMAT)):
3223                                 Result);
3224                 if((NdefMap->TLVStruct.NdefTLVFoundFlag ==
3225                     PH_FRINFC_MIFARESTD_FLAG1) &&
3226                     (Result == NFCSTATUS_SUCCESS))
3227                 {
3228                     NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
3229                     NdefMap->TLVStruct.BytesRemainLinTLV =
3230                                 (((uint16_t)NdefMap->SendRecvBuf[TempLength] << 8) +
3231                                 NdefMap->SendRecvBuf[(TempLength +
3232                                 PH_FRINFC_MIFARESTD_VAL1)]);
3233                     *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3234                 }
3235                 else if(Result == NFCSTATUS_SUCCESS)
3236                 {
3237                     TempLength++;
3238 
3239                     Result = phFriNfc_MifStd_H_GetNxtTLV(NdefMap,
3240                                 &TempLength, &TL4bytesFlag);
3241                     NdefMap->StdMifareContainer.remainingSize -=
3242                                 (((uint16_t)NdefMap->SendRecvBuf[TempLength] << 8) +
3243                                 NdefMap->SendRecvBuf[(TempLength +
3244                                 PH_FRINFC_MIFARESTD_VAL1)]);
3245 
3246                     *NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
3247                     Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
3248                 }
3249                 else
3250                 {
3251                     /* do nothing */
3252                     *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3253                 }
3254             }
3255             else
3256             {
3257                 /* Result = Error */
3258                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
3259                                 NFCSTATUS_INVALID_FORMAT);
3260                 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3261             }
3262             break;
3263 
3264         case PH_FRINFC_MIFARESTD_VAL2:
3265         case PH_FRINFC_MIFARESTD_VAL1:
3266             ShiftLength = ((NdefMap->TLVStruct.NoLbytesinTLV ==
3267                             PH_FRINFC_MIFARESTD_VAL1)?
3268                             ((NdefMap->TLVStruct.prevLenByteValue << 8) +
3269                             NdefMap->SendRecvBuf[TempLength]):
3270                             (((uint16_t)NdefMap->SendRecvBuf[TempLength] << 8) +
3271                             NdefMap->SendRecvBuf[(TempLength +
3272                             PH_FRINFC_MIFARESTD_VAL1)]));
3273             if((((  NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
3274                     NdefMap->StdMifareContainer.NdefBlocks) *
3275                     PH_FRINFC_MIFARESTD_BLOCK_BYTES) +
3276                     (PH_FRINFC_MIFARESTD_BLOCK_BYTES -
3277                     TempLength)) <
3278                     ShiftLength)
3279             {
3280                 /* Result = Error */
3281                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
3282                                 NFCSTATUS_INVALID_PARAMETER);
3283                 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3284             }
3285             else
3286             {
3287                 NdefMap->StdMifareContainer.remainingSize -=
3288                                     PH_FRINFC_MIFARESTD_VAL2;
3289                 if(NdefMap->TLVStruct.NdefTLVFoundFlag ==
3290                         PH_FRINFC_MIFARESTD_FLAG1)
3291                 {
3292                     NdefMap->TLVStruct.BytesRemainLinTLV = ShiftLength;
3293                     if(NdefMap->TLVStruct.BytesRemainLinTLV >
3294                         NdefMap->StdMifareContainer.remainingSize)
3295                     {
3296                         Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
3297                                                 NFCSTATUS_INVALID_FORMAT);
3298                     }
3299                     *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3300                     *NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
3301                 }
3302                 else
3303                 {
3304                     NdefMap->StdMifareContainer.remainingSize -=
3305                                         ShiftLength;
3306                     *CRFlag = PH_FRINFC_MIFARESTD_FLAG0;
3307                     TempLength += PH_FRINFC_MIFARESTD_VAL2;
3308                     TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG1;
3309                     Result = ((NdefMap->TLVStruct.NdefTLVFoundFlag == PH_FRINFC_MIFARESTD_FLAG1)?
3310                                 NFCSTATUS_SUCCESS:
3311                                 phFriNfc_MifStd_H_GetNxtTLV(NdefMap, &TempLength, &TL4bytesFlag));
3312 
3313                     *NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
3314                     Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
3315                 }
3316             }
3317             break;
3318 
3319         default:
3320             break;
3321     }
3322 
3323     return Result;
3324 }
3325 
3326 /******************************************************************************
3327  * Function         phFriNfc_MifStd_H_Get1kStTrail
3328  *
3329  * Description      This function is used to get the Mifare 1k Sector Trailer.
3330  *
3331  * Returns          void
3332  *
3333  ******************************************************************************/
phFriNfc_MifStd_H_Get1kStTrail(phFriNfc_NdefMap_t * NdefMap)3334 static void phFriNfc_MifStd_H_Get1kStTrail(phFriNfc_NdefMap_t  *NdefMap)
3335 {
3336     switch((NdefMap->StdMifareContainer.currentBlock % 4))
3337     {
3338         case PH_FRINFC_MIFARESTD_VAL0:
3339             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
3340                             (NdefMap->StdMifareContainer.currentBlock +
3341                                         PH_FRINFC_MIFARESTD_MAD_BLK3);
3342             break;
3343 
3344         case PH_FRINFC_MIFARESTD_VAL1:
3345             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
3346                         (NdefMap->StdMifareContainer.currentBlock +
3347                                         PH_FRINFC_MIFARESTD_MAD_BLK2);
3348             break;
3349 
3350         case PH_FRINFC_MIFARESTD_VAL2:
3351             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
3352                         (NdefMap->StdMifareContainer.currentBlock +
3353                                         PH_FRINFC_MIFARESTD_MAD_BLK1);
3354             break;
3355 
3356         default:
3357             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
3358                         NdefMap->StdMifareContainer.currentBlock;
3359             break;
3360     }
3361 
3362     return;
3363 }
3364 
3365 /******************************************************************************
3366  * Function         phFriNfc_MifStd_H_Get4kStTrail
3367  *
3368  * Description      This function gets the Mifare 4k Sector Trailer.
3369  *
3370  * Returns          void
3371  *
3372  ******************************************************************************/
phFriNfc_MifStd_H_Get4kStTrail(phFriNfc_NdefMap_t * NdefMap)3373 static void phFriNfc_MifStd_H_Get4kStTrail(phFriNfc_NdefMap_t  *NdefMap)
3374 {
3375     switch((NdefMap->StdMifareContainer.currentBlock % 16))
3376     {
3377         case PH_FRINFC_MIFARESTD_MAD_BLK0:
3378             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
3379                             (NdefMap->StdMifareContainer.currentBlock +
3380                                         PH_FRINFC_MIFARESTD_BLK15);
3381             break;
3382 
3383         case PH_FRINFC_MIFARESTD_MAD_BLK1:
3384             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
3385                         (NdefMap->StdMifareContainer.currentBlock +
3386                                         PH_FRINFC_MIFARESTD_BLK14);
3387             break;
3388 
3389         case PH_FRINFC_MIFARESTD_MAD_BLK2:
3390             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
3391                         (NdefMap->StdMifareContainer.currentBlock +
3392                                         PH_FRINFC_MIFARESTD_BLK13);
3393             break;
3394 
3395         case PH_FRINFC_MIFARESTD_MAD_BLK3:
3396             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
3397                         (NdefMap->StdMifareContainer.currentBlock +
3398                                         PH_FRINFC_MIFARESTD_BLK12);
3399             break;
3400 
3401         case PH_FRINFC_MIFARESTD_BLK4:
3402             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
3403                         (NdefMap->StdMifareContainer.currentBlock +
3404                                         PH_FRINFC_MIFARESTD_BLK11);
3405             break;
3406 
3407         case PH_FRINFC_MIFARESTD_BLK5:
3408             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
3409                         (NdefMap->StdMifareContainer.currentBlock +
3410                                         PH_FRINFC_MIFARESTD_BLK10);
3411             break;
3412 
3413         case PH_FRINFC_MIFARESTD_BLK6:
3414             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
3415                         (NdefMap->StdMifareContainer.currentBlock +
3416                                         PH_FRINFC_MIFARESTD_BLK9);
3417             break;
3418 
3419         case PH_FRINFC_MIFARESTD_BLK7:
3420             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
3421                         (NdefMap->StdMifareContainer.currentBlock +
3422                                         PH_FRINFC_MIFARESTD_BLK8);
3423             break;
3424 
3425         case PH_FRINFC_MIFARESTD_BLK8:
3426             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
3427                         (NdefMap->StdMifareContainer.currentBlock +
3428                                         PH_FRINFC_MIFARESTD_BLK7);
3429             break;
3430 
3431         case PH_FRINFC_MIFARESTD_BLK9:
3432             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
3433                         (NdefMap->StdMifareContainer.currentBlock +
3434                                         PH_FRINFC_MIFARESTD_BLK6);
3435             break;
3436 
3437         case PH_FRINFC_MIFARESTD_BLK10:
3438             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
3439                         (NdefMap->StdMifareContainer.currentBlock +
3440                                         PH_FRINFC_MIFARESTD_BLK5);
3441             break;
3442 
3443         case PH_FRINFC_MIFARESTD_BLK11:
3444             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
3445                         (NdefMap->StdMifareContainer.currentBlock +
3446                                         PH_FRINFC_MIFARESTD_BLK4);
3447             break;
3448 
3449         case PH_FRINFC_MIFARESTD_BLK12:
3450             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
3451                         (NdefMap->StdMifareContainer.currentBlock +
3452                                         PH_FRINFC_MIFARESTD_MAD_BLK3);
3453             break;
3454 
3455         case PH_FRINFC_MIFARESTD_BLK13:
3456             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
3457                         (NdefMap->StdMifareContainer.currentBlock +
3458                                         PH_FRINFC_MIFARESTD_MAD_BLK2);
3459             break;
3460 
3461         case PH_FRINFC_MIFARESTD_BLK14:
3462             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
3463                         (NdefMap->StdMifareContainer.currentBlock +
3464                                         PH_FRINFC_MIFARESTD_MAD_BLK1);
3465             break;
3466 
3467         default:
3468             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
3469                         NdefMap->StdMifareContainer.currentBlock;
3470             break;
3471     }
3472 
3473     return;
3474 }
3475 
3476 /******************************************************************************
3477  * Function         phFriNfc_MifStd_H_ProChkNdef
3478  *
3479  * Description      This function processes the check ndef call.
3480  *
3481  * Returns          This function return NFCSTATUS_PENDING in case of success
3482  *                  In case of failure returns other failure value.
3483  *
3484  ******************************************************************************/
phFriNfc_MifStd_H_ProChkNdef(phFriNfc_NdefMap_t * NdefMap)3485 static NFCSTATUS phFriNfc_MifStd_H_ProChkNdef(phFriNfc_NdefMap_t        *NdefMap)
3486 {
3487     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
3488 
3489     /* Copy remaining bytes into the AID array
3490        from Receive Buffer till array number 7 in aid */
3491     if(NdefMap->StdMifareContainer.currentBlock ==
3492         PH_FRINFC_MIFARESTD_VAL1)
3493     {
3494         /* Helper Function to Store AID Information */
3495         phFriNfc_MifStd_H_fillAIDarray(NdefMap);
3496 
3497         NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_VAL2;
3498         /* read remaining AIDs from block number 2 */
3499         Result = ((NdefMap->StdMifareContainer.aidCompleteFlag ==
3500                 PH_FRINFC_MIFARESTD_FLAG1)?
3501                 Result:
3502                 phFriNfc_MifareStdMap_ChkNdef( NdefMap));
3503     }
3504     else if(((NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD) &&
3505             (NdefMap->StdMifareContainer.currentBlock ==
3506             PH_FRINFC_MIFARESTD_MAD_BLK2)) || (
3507             (NdefMap->StdMifareContainer.currentBlock ==
3508             PH_FRINFC_MIFARESTD_MAD_BLK66) &&
3509             (NdefMap->CardType ==
3510             PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD ||
3511             NdefMap->CardType ==
3512             PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD)))
3513     {
3514         /* Helper Function to Store AID Information */
3515         phFriNfc_MifStd_H_fillAIDarray(NdefMap);
3516 
3517         NdefMap->StdMifareContainer.aidCompleteFlag =
3518                         PH_FRINFC_MIFARESTD_FLAG1;
3519     } /* Mifare 1k and Mifare 4k end Check */
3520     else if((NdefMap->StdMifareContainer.currentBlock >
3521             PH_FRINFC_MIFARESTD_VAL1) &&
3522             (NdefMap->CardType ==
3523             PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD ||
3524             NdefMap->CardType ==
3525             PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD))
3526     {
3527         phFriNfc_MifStd_H_fillAIDarray(NdefMap);
3528         /* read remaining AIDs from block number 2 */
3529         /* Mifare 4k Helper Function */
3530         Result = ((NdefMap->StdMifareContainer.aidCompleteFlag ==
3531                     PH_FRINFC_MIFARESTD_FLAG1)?
3532                     Result:
3533                     phFriNfc_MifStd4k_H_CheckNdef(NdefMap));
3534     } /* Card Type 4k Check */
3535     else
3536     {
3537         /* Since we have decided temporarily not to go
3538            for any new error codes we are using
3539            NFCSTATUS_INVALID_PARAMETER even though it is not
3540            the relevant error code here TBD */
3541         Result = PHNFCSTVAL(    CID_FRI_NFC_NDEF_MAP,
3542                                 NFCSTATUS_INVALID_PARAMETER);
3543     }
3544 
3545     if(NdefMap->StdMifareContainer.aidCompleteFlag ==
3546                         PH_FRINFC_MIFARESTD_FLAG1)
3547     {
3548         NdefMap->StdMifareContainer.ChkNdefCompleteFlag =
3549                         PH_FRINFC_MIFARESTD_FLAG1;
3550         /*  The check for NDEF compliant information is now over for
3551             the Mifare 1K card.
3552             Update(decrement) the NoOfNdefCompBlocks as much required,
3553             depending on the NDEF compliant information found */
3554         /* Check the Sectors are Ndef Compliant */
3555         phFriNfc_MifStd_H_ChkNdefCmpltSects(NdefMap);
3556         if((NdefMap->StdMifareContainer.NoOfNdefCompBlocks == 0) ||
3557             (NdefMap->StdMifareContainer.NoOfNdefCompBlocks > 255))
3558         {
3559             Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
3560                                 NFCSTATUS_NO_NDEF_SUPPORT);
3561         }
3562         else
3563         {
3564             NdefMap->StdMifareContainer.aidCompleteFlag =
3565                             PH_FRINFC_MIFARESTD_FLAG0;
3566             NdefMap->StdMifareContainer.NFCforumSectFlag =
3567                                     PH_FRINFC_MIFARESTD_FLAG0;
3568             NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_BLK4;
3569             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3570             Result = ((Result != NFCSTATUS_SUCCESS)?
3571                         Result:phFriNfc_MifStd_H_AuthSector(NdefMap));
3572         }
3573 
3574     }
3575 
3576     return Result;
3577 }
3578 
3579 /******************************************************************************
3580  * Function         phFriNfc_MifStd_H_ProAuth
3581  *
3582  * Description      This function process the authentication of a sector.
3583  *
3584  * Returns          This function return NFCSTATUS_SUCCESS in case of success
3585  *                  In case of failure returns other failure value.
3586  *
3587  ******************************************************************************/
phFriNfc_MifStd_H_ProAuth(phFriNfc_NdefMap_t * NdefMap)3588 static NFCSTATUS phFriNfc_MifStd_H_ProAuth(phFriNfc_NdefMap_t       *NdefMap)
3589 {
3590     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
3591 
3592     if(NdefMap->TLVStruct.NdefTLVAuthFlag ==
3593        PH_FRINFC_MIFARESTD_FLAG1)
3594     {
3595         NdefMap->TLVStruct.NdefTLVAuthFlag =
3596                                     PH_FRINFC_MIFARESTD_FLAG0;
3597         NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG1;
3598         Result = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
3599     }
3600     else
3601     {
3602         NdefMap->StdMifareContainer.AuthDone = 1;
3603         NdefMap->StdMifareContainer.ReadAcsBitFlag = 1;
3604         Result = phFriNfc_MifStd_H_RdAcsBit(NdefMap);
3605     }
3606 
3607     return Result;
3608 }
3609 
3610 /******************************************************************************
3611  * Function         phFriNfc_MifStd_H_Rd16Bytes
3612  *
3613  * Description      This function reads 16 bytes from a specifed block no.
3614  *
3615  * Returns          This function return NFCSTATUS_PENDING in case of success
3616  *                  In case of failure returns other failure value.
3617  *
3618  ******************************************************************************/
phFriNfc_MifStd_H_Rd16Bytes(phFriNfc_NdefMap_t * NdefMap,uint8_t BlockNo)3619 static NFCSTATUS phFriNfc_MifStd_H_Rd16Bytes(phFriNfc_NdefMap_t     *NdefMap,
3620                                               uint8_t               BlockNo)
3621 {
3622     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
3623 
3624     NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = BlockNo;
3625     NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_READ;
3626     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
3627     NdefMap->Cmd.MfCmd = phHal_eMifareRead;
3628     NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
3629     NdefMap->MapCompletionInfo.Context = NdefMap;
3630 
3631     /* Call the Overlapped HAL Transceive function */
3632     Result = phFriNfc_ExtnsTransceive(NdefMap->pTransceiveInfo,
3633                                       NdefMap->Cmd,
3634                                       NdefMap->SendRecvBuf,
3635                                       NdefMap->SendLength,
3636                                       NdefMap->SendRecvLength);
3637 
3638     return Result;
3639 }
3640 
3641 /******************************************************************************
3642  * Function         phFriNfc_MifStd_H_ProAcsBits
3643  *
3644  * Description      It processes access bits of the sector trailer.
3645  *
3646  * Returns          This function return NFCSTATUS_SUCCESS in case of success
3647  *                  In case of failure returns other failure value.
3648  *
3649  ******************************************************************************/
phFriNfc_MifStd_H_ProAcsBits(phFriNfc_NdefMap_t * NdefMap)3650 static NFCSTATUS phFriNfc_MifStd_H_ProAcsBits(phFriNfc_NdefMap_t        *NdefMap)
3651 {
3652     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
3653     uint8_t     CRFlag = PH_FRINFC_MIFARESTD_FLAG0;
3654 
3655     if(*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ)
3656     {
3657         if(NdefMap->StdMifareContainer.ReadAcsBitFlag ==
3658             PH_FRINFC_MIFARESTD_FLAG1)
3659         {
3660             /* check for the correct access bits */
3661             Result = phFriNfc_MifStd_H_ChkAcsBit(NdefMap);
3662 
3663             if((NdefMap->StdMifareContainer.ChkNdefFlag ==
3664                 PH_FRINFC_MIFARESTD_FLAG1) &&
3665                 (Result == NFCSTATUS_SUCCESS))
3666             {
3667                 if(NdefMap->CardState ==
3668                     PH_NDEFMAP_CARD_STATE_INVALID)
3669                 {
3670                     NdefMap->StdMifareContainer.NoOfNdefCompBlocks =
3671                     ((NdefMap->StdMifareContainer.currentBlock >=
3672                     PH_FRINFC_MIFARESTD4K_BLK128)?
3673                     (NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
3674                                     PH_FRINFC_MIFARESTD_BLK15):
3675                     (NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
3676                                     PH_FRINFC_MIFARESTD_MAD_BLK3));
3677 
3678                     NdefMap->StdMifareContainer.ProprforumSectFlag =
3679                         ((NdefMap->StdMifareContainer.NFCforumSectFlag ==
3680                         PH_FRINFC_MIFARESTD_FLAG1)?
3681                         PH_FRINFC_MIFARESTD_PROP_2ND_CONFIG:
3682                         PH_FRINFC_MIFARESTD_PROP_3RD_CONFIG);
3683 
3684                     Result = phFriNfc_MifStd_H_ProStatNotValid(NdefMap, Result);
3685                 }
3686                 else
3687                 {
3688                     NdefMap->StdMifareContainer.NFCforumSectFlag =
3689                         (((NdefMap->StdMifareContainer.currentBlock == 64) &&
3690                         ((NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD) ||
3691                         (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD))) ?
3692                         NdefMap->StdMifareContainer.NFCforumSectFlag:
3693                                             PH_FRINFC_MIFARESTD_FLAG1);
3694                 }
3695 
3696                 if(NdefMap->StdMifareContainer.ProprforumSectFlag !=
3697                     PH_FRINFC_MIFARESTD_PROP_2ND_CONFIG)
3698                 {
3699                     NdefMap->StdMifareContainer.ReadAcsBitFlag = PH_FRINFC_MIFARESTD_FLAG0;
3700                                 /* ((NdefMap->StdMifareContainer.ReadCompleteFlag ==
3701                                         PH_FRINFC_MIFARESTD_FLAG1)?
3702                                         PH_FRINFC_MIFARESTD_FLAG0:
3703                                         PH_FRINFC_MIFARESTD_FLAG1);*/
3704 
3705                     NdefMap->StdMifareContainer.ReadCompleteFlag =
3706                     (uint8_t)((((((NdefMap->StdMifareContainer.currentBlock +
3707                         PH_FRINFC_MIFARESTD_VAL4) >=
3708                         PH_FRINFC_MIFARESTD1K_MAX_BLK) &&
3709                         (NdefMap->CardType ==
3710                         PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD)) &&
3711                         (NdefMap->StdMifareContainer.ReadCompleteFlag ==
3712                         PH_FRINFC_MIFARESTD_FLAG0)) ||
3713                         (NdefMap->StdMifareContainer.ReadCompleteFlag ==
3714                         PH_FRINFC_MIFARESTD_FLAG1))?
3715                         PH_FRINFC_MIFARESTD_FLAG1:
3716                         PH_FRINFC_MIFARESTD_FLAG0);
3717 
3718                     NdefMap->StdMifareContainer.ReadCompleteFlag =
3719                     (uint8_t)((((((uint16_t)(NdefMap->StdMifareContainer.currentBlock +
3720                         PH_FRINFC_MIFARESTD_VAL4) >=
3721                         PH_FRINFC_MIFARESTD4K_MAX_BLK) &&
3722                         (NdefMap->CardType ==
3723                         PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD)) &&
3724                         (NdefMap->StdMifareContainer.ReadCompleteFlag ==
3725                         PH_FRINFC_MIFARESTD_FLAG0)) ||
3726                         (NdefMap->StdMifareContainer.ReadCompleteFlag ==
3727                         PH_FRINFC_MIFARESTD_FLAG1))?
3728                         PH_FRINFC_MIFARESTD_FLAG1:
3729                         PH_FRINFC_MIFARESTD_FLAG0);
3730 
3731                     NdefMap->StdMifareContainer.ReadCompleteFlag =
3732                     (uint8_t)((((((uint16_t)(NdefMap->StdMifareContainer.currentBlock +
3733                         PH_FRINFC_MIFARESTD_VAL4) >=
3734                         PH_FRINFC_MIFARESTD4K_MAX_BLK) &&
3735                         (NdefMap->CardType ==
3736                         PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD)) &&
3737                         (NdefMap->StdMifareContainer.ReadCompleteFlag ==
3738                         PH_FRINFC_MIFARESTD_FLAG0)) ||
3739                         (NdefMap->StdMifareContainer.ReadCompleteFlag ==
3740                         PH_FRINFC_MIFARESTD_FLAG1))?
3741                         PH_FRINFC_MIFARESTD_FLAG1:
3742                         PH_FRINFC_MIFARESTD_FLAG0);
3743 
3744                     NdefMap->StdMifareContainer.currentBlock =
3745                         ((NdefMap->StdMifareContainer.ReadCompleteFlag ==
3746                             PH_FRINFC_MIFARESTD_FLAG1)?
3747                             PH_FRINFC_MIFARESTD_BLK4:
3748                             NdefMap->StdMifareContainer.currentBlock);
3749 
3750                     Result =
3751                     ((NdefMap->StdMifareContainer.ReadCompleteFlag ==
3752                             PH_FRINFC_MIFARESTD_FLAG1)?
3753                             phFriNfc_MifStd_H_BlkChk(NdefMap):
3754                             Result);
3755                 }
3756             }
3757 
3758             Result = ((Result != NFCSTATUS_SUCCESS)?
3759                         Result:
3760                         phFriNfc_MifStd_H_ChkRdWr(NdefMap));
3761         }
3762         else
3763         {
3764             NdefMap->StdMifareContainer.ChkNdefFlag =
3765                 PH_FRINFC_MIFARESTD_FLAG0;
3766             /* Here its required to read the entire card to know the */
3767             /* Get exact ndef size of the card */
3768             Result = phFriNfc_MifStd_H_ChkTLVs(NdefMap, &CRFlag);
3769         }
3770     }
3771     else
3772     {
3773         /* Since we have decided temporarily not to go
3774            for any new error codes we are using
3775            NFCSTATUS_INVALID_PARAMETER even though it is not
3776            the relevant error code here TBD */
3777         Result = PHNFCSTVAL(    CID_FRI_NFC_NDEF_MAP,
3778                                 NFCSTATUS_INVALID_PARAMETER);
3779     }
3780 
3781     return Result;
3782 }
3783 
3784 /******************************************************************************
3785  * Function         phFriNfc_MifStd_H_GPBChk
3786  *
3787  * Description      This function is checks the GPB bytes.
3788  *
3789  * Returns          This function return NFCSTATUS_SUCCESS in case of success
3790  *                  In case of failure returns other failure value.
3791  *
3792  ******************************************************************************/
phFriNfc_MifStd_H_GPBChk(phFriNfc_NdefMap_t * NdefMap)3793 static NFCSTATUS phFriNfc_MifStd_H_GPBChk(phFriNfc_NdefMap_t        *NdefMap)
3794 {
3795     NFCSTATUS Result = NFCSTATUS_SUCCESS;
3796 
3797     /* Spec version needs to be checked every time (Version check is not enabled) */
3798     /* Result = phFriNfc_MapTool_ChkSpcVer(NdefMap, PH_FRINFC_MIFARESTD_VAL9); */
3799 
3800     /* Check rhe read and write access field
3801         in GPB is 00b
3802         bit 0 and 1 for write access check
3803         bit 2 and 3 for read access check */
3804     if(Result == NFCSTATUS_SUCCESS)
3805     {
3806         if(((NdefMap->SendRecvBuf[
3807             PH_FRINFC_MIFARESTD_VAL9] &
3808             PH_FRINFC_MIFARESTD_MASK_GPB_WR) ==
3809             PH_FRINFC_MIFARESTD_GPB_RD_WR_VAL) &&
3810             ((NdefMap->SendRecvBuf[
3811             PH_FRINFC_MIFARESTD_VAL9] &
3812             PH_FRINFC_MIFARESTD_MASK_GPB_RD) ==
3813             PH_FRINFC_MIFARESTD_GPB_RD_WR_VAL))
3814         {
3815             NdefMap->CardState = (((NdefMap->StdMifareContainer.ChkNdefFlag ==
3816                                     PH_FRINFC_MIFARESTD_FLAG1) ||
3817                                     (NdefMap->StdMifareContainer.ReadNdefFlag ==
3818                                     PH_FRINFC_MIFARESTD_FLAG1) ||
3819                                     (NdefMap->StdMifareContainer.WrNdefFlag ==
3820                                     PH_FRINFC_MIFARESTD_FLAG1))?
3821                                     PH_NDEFMAP_CARD_STATE_INITIALIZED:
3822                                     PH_NDEFMAP_CARD_STATE_READ_WRITE);
3823         }
3824         else if(((NdefMap->SendRecvBuf[
3825             PH_FRINFC_MIFARESTD_VAL9] &
3826             PH_FRINFC_MIFARESTD_MASK_GPB_WR) !=
3827             PH_FRINFC_MIFARESTD_GPB_RD_WR_VAL) &&
3828             ((NdefMap->SendRecvBuf[
3829             PH_FRINFC_MIFARESTD_VAL9] &
3830             PH_FRINFC_MIFARESTD_MASK_GPB_RD) ==
3831             PH_FRINFC_MIFARESTD_GPB_RD_WR_VAL))
3832         {
3833             /* write access not given
3834             only read access check */
3835             NdefMap->CardState = PH_NDEFMAP_CARD_STATE_READ_ONLY;
3836         }
3837         else
3838         {
3839             NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
3840         }
3841     }
3842 
3843     return Result;
3844 }
3845 
3846 /******************************************************************************
3847  * Function         phFriNfc_MifStd_H_ProStatNotValid
3848  *
3849  * Description      This function checks for the different status value in the
3850  *                  process because of proprietary forum sector.
3851  *
3852  * Returns          This function return NFCSTATUS_SUCCESS in case of success
3853  *                  In case of failure returns other failure value.
3854  *
3855  ******************************************************************************/
phFriNfc_MifStd_H_ProStatNotValid(phFriNfc_NdefMap_t * NdefMap,NFCSTATUS status)3856 static NFCSTATUS phFriNfc_MifStd_H_ProStatNotValid(phFriNfc_NdefMap_t        *NdefMap,
3857                                                    NFCSTATUS                 status)
3858 {
3859     NFCSTATUS Result = status;
3860 
3861     /* if NFC forum sector is not found before the proprietary one then
3862        authenticate the next sector
3863        Else it is a error*/
3864     if(NdefMap->StdMifareContainer.NFCforumSectFlag ==
3865         PH_FRINFC_MIFARESTD_FLAG0)
3866     {
3867         NdefMap->StdMifareContainer.ProprforumSectFlag =
3868                         PH_FRINFC_MIFARESTD_PROP_3RD_CONFIG;
3869         if(NdefMap->StdMifareContainer.currentBlock <
3870             PH_FRINFC_MIFARESTD4K_BLK128)
3871         {
3872              /* Fix for the disovery problem,
3873                 if 1st sector is invalid then ignore the remaining sectors and
3874                 send an error if the card is mifare 1k,
3875                 if the card is mifare 4k, then update the block number to 67 and
3876                 continue.
3877                 Even if the authentication of that block fails then send error */
3878             if(((NdefMap->StdMifareContainer.currentBlock <
3879                 PH_FRINFC_MIFARESTD_BLK4) &&
3880                 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD)) ||
3881                 ((NdefMap->StdMifareContainer.currentBlock <=
3882                 PH_FRINFC_MIFARESTD_MAD_BLK67) &&
3883                 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD ||
3884                  NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD)))
3885             {
3886                 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
3887                                     NFCSTATUS_NO_NDEF_SUPPORT);
3888             }
3889             else if((NdefMap->StdMifareContainer.currentBlock <
3890                 PH_FRINFC_MIFARESTD_BLK4) &&
3891                 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD ||
3892                  NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD))
3893             {
3894                 Result = NFCSTATUS_SUCCESS;
3895                 NdefMap->StdMifareContainer.currentBlock =
3896                             PH_FRINFC_MIFARESTD_MAD_BLK67;
3897             }
3898             else if(((NdefMap->StdMifareContainer.currentBlock +
3899                 PH_FRINFC_MIFARESTD_BLK4) >
3900                 PH_FRINFC_MIFARESTD1K_MAX_BLK) &&
3901                 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD))
3902             {
3903                 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
3904                             NFCSTATUS_NO_NDEF_SUPPORT);
3905             }
3906             else
3907             {
3908                 NdefMap->StdMifareContainer.remainingSize -=
3909                         (PH_FRINFC_MIFARESTD_MAD_BLK3 * PH_FRINFC_MIFARESTD_BLOCK_BYTES);
3910                 NdefMap->StdMifareContainer.currentBlock +=
3911                                 PH_FRINFC_MIFARESTD_BLK4;
3912                 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3913             }
3914         }
3915         else if((NdefMap->StdMifareContainer.currentBlock +
3916                 PH_FRINFC_MIFARESTD_BLK15) >
3917                 PH_FRINFC_MIFARESTD4K_MAX_BLK)
3918         {
3919             Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
3920                         NFCSTATUS_NO_NDEF_SUPPORT);
3921         }
3922         else
3923         {
3924             NdefMap->StdMifareContainer.remainingSize -=
3925                         (PH_FRINFC_MIFARESTD_BLK15 * PH_FRINFC_MIFARESTD_BLOCK_BYTES);
3926             NdefMap->StdMifareContainer.currentBlock +=
3927                                     PH_FRINFC_MIFARESTD_BLOCK_BYTES;
3928             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3929         }
3930         Result = ((Result != NFCSTATUS_SUCCESS)?
3931                 (PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
3932                         NFCSTATUS_NO_NDEF_SUPPORT)):
3933                 phFriNfc_MifStd_H_AuthSector(NdefMap));
3934     }
3935     else if((NdefMap->StdMifareContainer.ProprforumSectFlag ==
3936             PH_FRINFC_MIFARESTD_PROP_3RD_CONFIG) &&
3937             (NdefMap->StdMifareContainer.NFCforumSectFlag ==
3938             PH_FRINFC_MIFARESTD_FLAG1))
3939     {
3940         /*  if the proprietary forum sector are found before
3941             NFC forum sector then again a proprietary
3942             forum sector are found after the NFC forum
3943             sector */
3944         Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
3945                             NFCSTATUS_NO_NDEF_SUPPORT);
3946     }
3947     else
3948     {
3949         NdefMap->StdMifareContainer.ProprforumSectFlag =
3950                         PH_FRINFC_MIFARESTD_PROP_2ND_CONFIG;
3951         switch(NdefMap->PrevOperation)
3952         {
3953         case PH_FRINFC_NDEFMAP_CHECK_OPE:
3954         case PH_FRINFC_NDEFMAP_GET_ACTSIZE_OPE:
3955             Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
3956                         NFCSTATUS_NO_NDEF_SUPPORT);
3957             break;
3958 
3959         case PH_FRINFC_NDEFMAP_READ_OPE:
3960             if((NdefMap->TLVStruct.NdefTLVFoundFlag ==
3961                 PH_FRINFC_MIFARESTD_FLAG1) &&
3962                 (NdefMap->TLVStruct.NoLbytesinTLV ==
3963                 PH_FRINFC_MIFARESTD_VAL0))
3964             {
3965                 *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
3966                 Result = NFCSTATUS_SUCCESS;
3967             }
3968             else
3969             {
3970                 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
3971                         NFCSTATUS_NO_NDEF_SUPPORT);
3972             }
3973             break;
3974 
3975         case PH_FRINFC_NDEFMAP_WRITE_OPE:
3976         default:
3977             /* This means the further write is not possible,
3978                EOF_NDEF_CONTAINER_REACHED */
3979             NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
3980                                 PH_FRINFC_MIFARESTD_FLAG1;
3981             /* Write the length to the L field in the TLV */
3982             NdefMap->StdMifareContainer.TempBlockNo =
3983                         NdefMap->StdMifareContainer.currentBlock;
3984             phFriNfc_MifStd_H_SetNdefBlkAuth(NdefMap);
3985             NdefMap->StdMifareContainer.currentBlock =
3986                             NdefMap->TLVStruct.NdefTLVBlock;
3987             Result = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
3988             break;
3989         }
3990     }
3991 
3992     return Result;
3993 }
3994 
3995 /******************************************************************************
3996  * Function         phFriNfc_MifStd_H_RdBeforeWr
3997  *
3998  * Description      This function is used to read the NDEF TLV block.
3999  *
4000  * Returns          This function return NFCSTATUS_SUCCESS in case of success
4001  *                  In case of failure returns other failure value.
4002  *
4003  ******************************************************************************/
phFriNfc_MifStd_H_RdBeforeWr(phFriNfc_NdefMap_t * NdefMap)4004 static NFCSTATUS phFriNfc_MifStd_H_RdBeforeWr(phFriNfc_NdefMap_t        *NdefMap)
4005 {
4006     NFCSTATUS Result = NFCSTATUS_SUCCESS;
4007 
4008     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RD_BEF_WR;
4009     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
4010 
4011     Result = phFriNfc_MifStd_H_Rd16Bytes(NdefMap,
4012                     NdefMap->StdMifareContainer.currentBlock);
4013 
4014     return Result;
4015 }
4016 
4017 /******************************************************************************
4018  * Function         phFriNfc_MifStd_H_ProBytesToWr
4019  *
4020  * Description      This function processes the NDEF TLV block read bytes to
4021  *                  start write from the NDEF TLV.
4022  *
4023  * Returns          This function return NFCSTATUS_SUCCESS in case of success
4024  *                  In case of failure returns other failure value.
4025  *
4026  ******************************************************************************/
phFriNfc_MifStd_H_ProBytesToWr(phFriNfc_NdefMap_t * NdefMap)4027 static NFCSTATUS phFriNfc_MifStd_H_ProBytesToWr(phFriNfc_NdefMap_t        *NdefMap)
4028 {
4029     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
4030     uint8_t     TempLength = PH_FRINFC_MIFARESTD_VAL0;
4031 
4032     if(*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ)
4033     {
4034         memcpy(&NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL1],
4035                     NdefMap->SendRecvBuf,
4036                     PH_FRINFC_MIFARESTD_BLOCK_BYTES);
4037 
4038         /* Write to Ndef TLV Block */
4039         NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4040                             NdefMap->StdMifareContainer.currentBlock;
4041 
4042         TempLength = ((NdefMap->StdMifareContainer.currentBlock ==
4043                         NdefMap->TLVStruct.NdefTLVBlock)?
4044                         phFriNfc_MifStd_H_UpdateTLV(NdefMap):
4045                         phFriNfc_MifStd_H_UpdRemTLV(NdefMap));
4046 
4047         NdefMap->StdMifareContainer.remainingSize -=
4048             ((NdefMap->StdMifareContainer.remSizeUpdFlag ==
4049             PH_FRINFC_MIFARESTD_FLAG1)?
4050             PH_FRINFC_MIFARESTD_VAL2:
4051             PH_FRINFC_MIFARESTD_VAL0);
4052 
4053         NdefMap->StdMifareContainer.remSizeUpdFlag = PH_FRINFC_MIFARESTD_FLAG0;
4054         NdefMap->State = PH_FRINFC_NDEFMAP_STATE_WR_TLV;
4055         Result = ((TempLength == PH_FRINFC_MIFARESTD_BLOCK_BYTES)?
4056                     phFriNfc_MifStd_H_WrTLV(NdefMap):
4057                     phFriNfc_MifStd_H_fillSendBuf(NdefMap, TempLength));
4058     }
4059     else
4060     {
4061         Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
4062                                 NFCSTATUS_READ_FAILED);
4063     }
4064 
4065     return Result;
4066 }
4067 
4068 /******************************************************************************
4069  * Function         phFriNfc_MifStd_H_UpdateTLV
4070  *
4071  * Description      This function writes ndef to add the TLV structure.
4072  *
4073  * Returns          uint8_t     TempLength
4074  *
4075  ******************************************************************************/
phFriNfc_MifStd_H_UpdateTLV(phFriNfc_NdefMap_t * NdefMap)4076 static uint8_t phFriNfc_MifStd_H_UpdateTLV(phFriNfc_NdefMap_t *NdefMap)
4077 {
4078     uint8_t     TempLength = PH_FRINFC_MIFARESTD_VAL0;
4079 
4080     TempLength = (uint8_t)(NdefMap->TLVStruct.NdefTLVByte + PH_FRINFC_MIFARESTD_VAL1);
4081     /* Creating TLV */
4082     if(NdefMap->TLVStruct.NULLTLVCount >= 2)
4083     {
4084         if((PH_FRINFC_MIFARESTD_BYTES_READ - TempLength) ==
4085             PH_FRINFC_MIFARESTD_VAL0)
4086         {
4087             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
4088         }
4089         else
4090         {
4091             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
4092             TempLength++;
4093             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
4094         }
4095     }
4096     else
4097     {
4098         switch((PH_FRINFC_MIFARESTD_BYTES_READ -
4099                 TempLength))
4100         {
4101         case PH_FRINFC_MIFARESTD_VAL0:
4102             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4103         break;
4104 
4105         case PH_FRINFC_MIFARESTD_VAL1:
4106             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4107             TempLength++;
4108             NdefMap->TLVStruct.prevLenByteValue =
4109                                     (uint16_t)((NdefMap->SendRecvBuf[TempLength] >=
4110                                     PH_FRINFC_MIFARESTD_NDEFTLV_L)?
4111                                     PH_FRINFC_MIFARESTD_VAL0:
4112                                     NdefMap->SendRecvBuf[TempLength]);
4113             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4114         break;
4115 
4116         case PH_FRINFC_MIFARESTD_VAL2:
4117             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4118             TempLength++;
4119             NdefMap->TLVStruct.prevLenByteValue =
4120                                     (uint16_t)((NdefMap->SendRecvBuf[TempLength] >=
4121                                     PH_FRINFC_MIFARESTD_NDEFTLV_L)?
4122                                     NdefMap->SendRecvBuf[(TempLength +
4123                                                 PH_FRINFC_MIFARESTD_VAL1)]:
4124                                     NdefMap->SendRecvBuf[TempLength]);
4125             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4126             TempLength++;
4127             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
4128         break;
4129 
4130         default:
4131             NdefMap->TLVStruct.prevLenByteValue =
4132                             NdefMap->SendRecvBuf[TempLength];
4133             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4134             TempLength++;
4135             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4136             TempLength++;
4137             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
4138             TempLength++;
4139             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
4140         break;
4141         }
4142     }
4143 
4144     return TempLength;
4145 }
4146 
4147 /******************************************************************************
4148  * Function         phFriNfc_MifStd_H_fillSendBuf
4149  *
4150  * Description      It fill the send buffer to write.
4151  *
4152  * Returns          This function return NFCSTATUS_SUCCESS in case of success
4153  *                  In case of failure returns other failure value.
4154  *
4155  ******************************************************************************/
phFriNfc_MifStd_H_fillSendBuf(phFriNfc_NdefMap_t * NdefMap,uint8_t Length)4156 static NFCSTATUS phFriNfc_MifStd_H_fillSendBuf(phFriNfc_NdefMap_t        *NdefMap,
4157                                                uint8_t                   Length)
4158 {
4159     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
4160     uint16_t    RemainingBytes = PH_FRINFC_MIFARESTD_VAL0,
4161                 BytesToWrite = PH_FRINFC_MIFARESTD_VAL0;
4162     uint8_t     index = PH_FRINFC_MIFARESTD_VAL0;
4163 
4164     Length = (Length + PH_FRINFC_MIFARESTD_VAL1);
4165 
4166     RemainingBytes = (uint16_t)((NdefMap->StdMifareContainer.remainingSize
4167                         < (uint16_t)(NdefMap->ApduBufferSize -
4168                         NdefMap->ApduBuffIndex))?
4169                         NdefMap->StdMifareContainer.remainingSize:
4170                         (NdefMap->ApduBufferSize -
4171                         NdefMap->ApduBuffIndex));
4172 
4173     NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4174                             NdefMap->StdMifareContainer.currentBlock;
4175     /* Get the number of bytes that can be written after copying
4176        the internal buffer */
4177     BytesToWrite = ((RemainingBytes <
4178                     ((PH_FRINFC_MIFARESTD_WR_A_BLK - Length) -
4179                     NdefMap->StdMifareContainer.internalLength))?
4180                     RemainingBytes:
4181                     ((PH_FRINFC_MIFARESTD_WR_A_BLK - Length) -
4182                     NdefMap->StdMifareContainer.internalLength));
4183 
4184     if(NdefMap->StdMifareContainer.internalLength >
4185         PH_FRINFC_MIFARESTD_VAL0)
4186     {
4187         /* copy the internal buffer to the send buffer */
4188         memcpy(&(NdefMap->SendRecvBuf[
4189                     Length]),
4190                     NdefMap->StdMifareContainer.internalBuf,
4191                     NdefMap->StdMifareContainer.internalLength);
4192     }
4193 
4194     /* Copy Bytes to write in the send buffer */
4195     memcpy(&(NdefMap->SendRecvBuf[
4196                 (Length +
4197                 NdefMap->StdMifareContainer.internalLength)]),
4198                 &(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex]),
4199                 BytesToWrite);
4200 
4201     /* update number of bytes written from the user buffer */
4202     NdefMap->NumOfBytesWritten = BytesToWrite;
4203 
4204     /* check the exact number of bytes written to a block including the
4205         internal length */
4206     *NdefMap->DataCount =
4207             ((BytesToWrite + NdefMap->StdMifareContainer.internalLength
4208             + Length) - PH_FRINFC_MIFARESTD_VAL1);
4209 
4210     /* if total bytes to write in the card is less than 4 bytes then
4211     pad zeroes till 4 bytes */
4212     if((BytesToWrite + NdefMap->StdMifareContainer.internalLength +
4213         Length) < PH_FRINFC_MIFARESTD_WR_A_BLK)
4214     {
4215         for(index = (uint8_t)(BytesToWrite +
4216                     NdefMap->StdMifareContainer.internalLength +
4217                     Length);
4218             index < PH_FRINFC_MIFARESTD_WR_A_BLK;
4219             index++)
4220             {
4221                 NdefMap->SendRecvBuf[index] = (uint8_t)((index ==
4222                                     (BytesToWrite + Length +
4223                                     NdefMap->StdMifareContainer.internalLength))?
4224                                     PH_FRINFC_MIFARESTD_TERMTLV_T:
4225                                     PH_FRINFC_MIFARESTD_NULLTLV_T);
4226 
4227                 NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
4228             }
4229     }
4230 
4231     NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
4232 
4233     /* A temporary buffer to hold four bytes of data that is
4234        written to the card */
4235     memcpy(NdefMap->StdMifareContainer.Buffer,
4236                 &(NdefMap->SendRecvBuf[
4237                 PH_FRINFC_MIFARESTD_VAL1]),
4238                 PH_FRINFC_MIFARESTD_BLOCK_BYTES);
4239 
4240     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_WR_TLV;
4241     Result = phFriNfc_MifStd_H_WrTLV(NdefMap);
4242 
4243     return Result;
4244 }
4245 
4246 /******************************************************************************
4247  * Function         phFriNfc_MifStd_H_WrTLV
4248  *
4249  * Description      This function writes 16 bytes in a block.
4250  *
4251  * Returns          This function return NFCSTATUS_SUCCESS in case of success
4252  *                  In case of failure returns other failure value.
4253  *
4254  ******************************************************************************/
phFriNfc_MifStd_H_WrTLV(phFriNfc_NdefMap_t * NdefMap)4255 static NFCSTATUS phFriNfc_MifStd_H_WrTLV(phFriNfc_NdefMap_t        *NdefMap)
4256 {
4257     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
4258 
4259     NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
4260     NdefMap->MapCompletionInfo.Context = NdefMap;
4261     /* Write from here */
4262     NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_WRITE;
4263 
4264     NdefMap->Cmd.MfCmd = phHal_eMifareWrite16;
4265 
4266     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
4267 
4268     /* Call the Overlapped HAL Transceive function */
4269     Result = phFriNfc_ExtnsTransceive(NdefMap->pTransceiveInfo,
4270                                       NdefMap->Cmd,
4271                                       NdefMap->SendRecvBuf,
4272                                       NdefMap->SendLength,
4273                                       NdefMap->SendRecvLength);
4274 
4275 
4276     return Result;
4277 }
4278 
4279 /******************************************************************************
4280  * Function         phFriNfc_MifStd_H_ProWrTLV
4281  *
4282  * Description      This function processes the write TLV bytes in a block.
4283  *
4284  * Returns          This function return NFCSTATUS_SUCESS in case of success
4285  *                  In case of failure returns other failure value.
4286  *
4287  ******************************************************************************/
phFriNfc_MifStd_H_ProWrTLV(phFriNfc_NdefMap_t * NdefMap)4288 static NFCSTATUS phFriNfc_MifStd_H_ProWrTLV(phFriNfc_NdefMap_t        *NdefMap)
4289 {
4290     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
4291 
4292     /* Check that if complete TLV has been written in the
4293        card if yes enter the below check or go to else*/
4294     if(((((PH_FRINFC_MIFARESTD_BLOCK_BYTES -
4295             NdefMap->TLVStruct.NdefTLVByte) ==
4296             PH_FRINFC_MIFARESTD_VAL1) &&
4297             (NdefMap->TLVStruct.NULLTLVCount >=
4298             PH_FRINFC_MIFARESTD_VAL2)) ||
4299             (((PH_FRINFC_MIFARESTD_BLOCK_BYTES -
4300             NdefMap->TLVStruct.NdefTLVByte) <=
4301             PH_FRINFC_MIFARESTD_VAL3) &&
4302             (NdefMap->TLVStruct.NULLTLVCount ==
4303             PH_FRINFC_MIFARESTD_VAL0))) &&
4304             (NdefMap->StdMifareContainer.currentBlock ==
4305             NdefMap->TLVStruct.NdefTLVBlock))
4306     {
4307         /* increment the block and chekc the block is in the same sector
4308            using the block check function */
4309         NdefMap->StdMifareContainer.RdBeforeWrFlag = PH_FRINFC_MIFARESTD_FLAG1;
4310         NdefMap->StdMifareContainer.currentBlock++;
4311         NdefMap->StdMifareContainer.NdefBlocks++;
4312         Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
4313         if(Result == NFCSTATUS_SUCCESS)
4314         {
4315             Result = ((NdefMap->StdMifareContainer.AuthDone ==
4316                         PH_FRINFC_MIFARESTD_FLAG0)?
4317                         phFriNfc_MifStd_H_AuthSector(NdefMap):
4318                         phFriNfc_MifStd_H_RdBeforeWr(NdefMap));
4319         }
4320     }
4321     else
4322     {
4323         NdefMap->StdMifareContainer.RdBeforeWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
4324         if(NdefMap->ApduBuffIndex <
4325                     (uint16_t)NdefMap->ApduBufferSize)
4326         {
4327             if(*NdefMap->DataCount < PH_FRINFC_MIFARESTD_BLOCK_BYTES)
4328             {
4329                 /* Write complete, so next byte shall be */
4330                 NdefMap->StdMifareContainer.internalLength =
4331                     *NdefMap->DataCount;
4332 
4333                 /* Copy bytes less than 16 to internal buffer
4334                    for the next write this can be used */
4335                 memcpy( NdefMap->StdMifareContainer.internalBuf,
4336                         NdefMap->StdMifareContainer.Buffer,
4337                         NdefMap->StdMifareContainer.internalLength);
4338             }
4339 
4340             /* Increment the Send Buffer index */
4341              NdefMap->ApduBuffIndex += NdefMap->NumOfBytesWritten;
4342 
4343              NdefMap->StdMifareContainer.remainingSize -=
4344                                         NdefMap->NumOfBytesWritten;
4345 
4346              /* Check for the End of Card */
4347             if((NdefMap->StdMifareContainer.remainingSize  ==
4348                 PH_FRINFC_MIFARESTD_VAL0) ||
4349                 (NdefMap->ApduBuffIndex == NdefMap->ApduBufferSize))
4350             {
4351                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
4352                 (uint8_t)((NdefMap->StdMifareContainer.remainingSize  == 0)?
4353                     PH_FRINFC_MIFARESTD_FLAG1:PH_FRINFC_MIFARESTD_FLAG0);
4354 
4355                 if(NdefMap->StdMifareContainer.internalLength ==
4356                     PH_FRINFC_MIFARESTD_VAL0)
4357                 {
4358                     NdefMap->StdMifareContainer.currentBlock++;
4359                     /* Mifare 4k Card, After 128th Block
4360                     each sector = 16 blocks in Mifare 4k */
4361                     Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
4362                     NdefMap->StdMifareContainer.NdefBlocks++;
4363                 }
4364 
4365                 NdefMap->TLVStruct.SetTermTLVFlag =
4366                     (uint8_t)(((NdefMap->StdMifareContainer.remainingSize ==
4367                             PH_FRINFC_MIFARESTD_VAL0) ||
4368                             (NdefMap->TLVStruct.SetTermTLVFlag ==
4369                             PH_FRINFC_MIFARESTD_FLAG1))?
4370                             PH_FRINFC_MIFARESTD_FLAG1:
4371                             PH_FRINFC_MIFARESTD_FLAG0);
4372 
4373             }
4374             else
4375             {
4376                 NdefMap->StdMifareContainer.currentBlock++;
4377                 /* Mifare 4k Card, After 128th Block
4378                 each sector = 16 blocks in Mifare 4k */
4379                 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
4380                 if(Result == NFCSTATUS_SUCCESS)
4381                 {
4382                     NdefMap->StdMifareContainer.NdefBlocks++;
4383                     Result = ((NdefMap->StdMifareContainer.AuthDone ==
4384                                 PH_FRINFC_MIFARESTD_FLAG1)?
4385                                 phFriNfc_MifStd_H_WrABlock(NdefMap):
4386                                 phFriNfc_MifStd_H_AuthSector(NdefMap));
4387                 }
4388             }
4389         }
4390     }
4391 
4392     if((Result == NFCSTATUS_SUCCESS) &&
4393         (NdefMap->TLVStruct.SetTermTLVFlag !=
4394         PH_FRINFC_MIFARESTD_FLAG1) &&
4395         (NdefMap->StdMifareContainer.remainingSize >
4396         PH_FRINFC_MIFARESTD_VAL0))
4397     {
4398         Result = phFriNfc_MifStd_H_WrTermTLV(NdefMap);
4399     }
4400     else
4401     {
4402         if((Result == NFCSTATUS_SUCCESS) &&
4403             (NdefMap->TLVStruct.SetTermTLVFlag ==
4404             PH_FRINFC_MIFARESTD_FLAG1))
4405         {
4406             /* Write the length to the L field in the TLV */
4407             NdefMap->StdMifareContainer.TempBlockNo =
4408                         NdefMap->StdMifareContainer.currentBlock;
4409             phFriNfc_MifStd_H_SetNdefBlkAuth(NdefMap);
4410             NdefMap->StdMifareContainer.currentBlock =
4411                             NdefMap->TLVStruct.NdefTLVBlock;
4412             Result = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
4413         }
4414     }
4415 
4416     return Result;
4417 }
4418 
4419 /******************************************************************************
4420  * Function         phFriNfc_MifStd_H_UpdRemTLV
4421  *
4422  * Description      This function updates the remaining TLV.
4423  *
4424  * Returns          uint8_t     TempLength : length value
4425  *
4426  ******************************************************************************/
phFriNfc_MifStd_H_UpdRemTLV(phFriNfc_NdefMap_t * NdefMap)4427 static uint8_t phFriNfc_MifStd_H_UpdRemTLV(phFriNfc_NdefMap_t        *NdefMap)
4428 {
4429     uint8_t     TempLength = PH_FRINFC_MIFARESTD_VAL1;
4430 
4431     if(NdefMap->TLVStruct.NULLTLVCount >=
4432         PH_FRINFC_MIFARESTD_VAL2)
4433     {
4434         NdefMap->TLVStruct.prevLenByteValue = NdefMap->SendRecvBuf[TempLength];
4435         NdefMap->SendRecvBuf[TempLength] =
4436                         PH_FRINFC_MIFARESTD_NDEFTLV_L0;
4437     }
4438     else
4439     {
4440         switch((PH_FRINFC_MIFARESTD_BLOCK_BYTES -
4441             NdefMap->TLVStruct.NdefTLVByte))
4442         {
4443         case PH_FRINFC_MIFARESTD_VAL1:
4444             NdefMap->TLVStruct.prevLenByteValue =
4445                     (((NdefMap->SendRecvBuf[TempLength] ==
4446                     PH_FRINFC_MIFARESTD_NDEFTLV_L))?
4447                     (((uint16_t)NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)]
4448                     << PH_FRINFC_MIFARESTD_LEFTSHIFT8) +
4449                     NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL2)]):
4450                     NdefMap->SendRecvBuf[TempLength]);
4451             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4452             TempLength++;
4453             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
4454             TempLength++;
4455             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
4456             break;
4457 
4458         case PH_FRINFC_MIFARESTD_VAL2:
4459             NdefMap->TLVStruct.prevLenByteValue =
4460                     (((NdefMap->SendRecvBuf[TempLength] ==
4461                         PH_FRINFC_MIFARESTD_NDEFTLV_L))?
4462                     (((uint16_t)NdefMap->SendRecvBuf[TempLength] <<
4463                     PH_FRINFC_MIFARESTD_LEFTSHIFT8) +
4464                     NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)]):
4465                     NdefMap->SendRecvBuf[TempLength]);
4466             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
4467             TempLength++;
4468             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
4469             break;
4470 
4471         case PH_FRINFC_MIFARESTD_VAL3:
4472         default:
4473             NdefMap->TLVStruct.prevLenByteValue =
4474                                             ((NdefMap->TLVStruct.prevLenByteValue <<
4475                                             PH_FRINFC_MIFARESTD_LEFTSHIFT8)
4476                                             + NdefMap->SendRecvBuf[TempLength]);
4477             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
4478             break;
4479         }
4480     }
4481 
4482     return TempLength;
4483 }
4484 
4485 /******************************************************************************
4486  * Function         phFriNfc_MifStd_H_fillTLV1
4487  *
4488  * Description      This function updates the length field if more than one
4489  *                  NULL TLVs exists before of the NDEF TLV.
4490  *
4491  * Returns          void
4492  *
4493  ******************************************************************************/
phFriNfc_MifStd_H_fillTLV1(phFriNfc_NdefMap_t * NdefMap)4494 static void phFriNfc_MifStd_H_fillTLV1(phFriNfc_NdefMap_t        *NdefMap)
4495 {
4496     uint8_t     TempLength = (uint8_t)(NdefMap->TLVStruct.NdefTLVByte +
4497                             PH_FRINFC_MIFARESTD_VAL1);
4498 
4499     NdefMap->TLVStruct.prevLenByteValue =
4500                     ((NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_CUR)?
4501                     (NdefMap->TLVStruct.prevLenByteValue +
4502                     NdefMap->ApduBuffIndex):
4503                     NdefMap->ApduBuffIndex);
4504 
4505     NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG1;
4506     switch(NdefMap->TLVStruct.NdefTLVByte)
4507     {
4508     case PH_FRINFC_MIFARESTD_VAL0:
4509         if(NdefMap->TLVStruct.prevLenByteValue >=
4510             PH_FRINFC_MIFARESTD_NDEFTLV_L)
4511         {
4512             NdefMap->SendRecvBuf[TempLength] =
4513                             (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
4514                             PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
4515             NdefMap->SendRecvBuf[(TempLength +
4516                                 PH_FRINFC_MIFARESTD_VAL1)] =
4517                             (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
4518         }
4519         else
4520         {
4521             NdefMap->SendRecvBuf[TempLength] =
4522                             PH_FRINFC_MIFARESTD_NDEFTLV_T;
4523             NdefMap->SendRecvBuf[(TempLength +
4524                                 PH_FRINFC_MIFARESTD_VAL1)] =
4525                             (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
4526 
4527             NdefMap->StdMifareContainer.RdAfterWrFlag =
4528                                 PH_FRINFC_MIFARESTD_FLAG0;
4529         }
4530         break;
4531 
4532     case PH_FRINFC_MIFARESTD_VAL1:
4533         if(NdefMap->TLVStruct.prevLenByteValue >=
4534             PH_FRINFC_MIFARESTD_NDEFTLV_L)
4535         {
4536             NdefMap->SendRecvBuf[TempLength - PH_FRINFC_MIFARESTD_VAL1] =
4537                             PH_FRINFC_MIFARESTD_NDEFTLV_L;
4538             NdefMap->SendRecvBuf[TempLength] =
4539                             (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
4540                             PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
4541             NdefMap->SendRecvBuf[(TempLength +
4542                                 PH_FRINFC_MIFARESTD_VAL1)] =
4543                             (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
4544         }
4545         else
4546         {
4547             NdefMap->SendRecvBuf[TempLength] =
4548                             PH_FRINFC_MIFARESTD_NDEFTLV_T;
4549             NdefMap->SendRecvBuf[(TempLength +
4550                                 PH_FRINFC_MIFARESTD_VAL1)] =
4551                             (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
4552             NdefMap->StdMifareContainer.RdAfterWrFlag =
4553                                 PH_FRINFC_MIFARESTD_FLAG0;
4554         }
4555         break;
4556 
4557     case PH_FRINFC_MIFARESTD_VAL15:
4558         /* if "Type" of TLV present at byte 15 */
4559         if(NdefMap->TLVStruct.prevLenByteValue >=
4560             PH_FRINFC_MIFARESTD_NDEFTLV_L)
4561         {
4562             /* Update the null TLV, ndef TLV block and ndef TLV byte */
4563             NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
4564             NdefMap->TLVStruct.NdefTLVBlock =
4565                                 NdefMap->StdMifareContainer.currentBlock;
4566             NdefMap->TLVStruct.NdefTLVByte =
4567                                 (TempLength - PH_FRINFC_MIFARESTD_VAL3);
4568 
4569             NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL2)] =
4570                             PH_FRINFC_MIFARESTD_NDEFTLV_T;
4571             NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL1)] =
4572                             PH_FRINFC_MIFARESTD_NDEFTLV_L;
4573             NdefMap->SendRecvBuf[TempLength] =
4574                             (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
4575                             PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
4576         }
4577         else
4578         {
4579             NdefMap->SendRecvBuf[TempLength] =
4580                             PH_FRINFC_MIFARESTD_NDEFTLV_T;
4581         }
4582         break;
4583 
4584     default:
4585         /* Already the TLV is present so just append the length field */
4586         if(NdefMap->TLVStruct.prevLenByteValue >=
4587             PH_FRINFC_MIFARESTD_NDEFTLV_L)
4588         {
4589             /* Update the null TLV, ndef TLV block and ndef TLV byte */
4590             NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
4591             NdefMap->TLVStruct.NdefTLVBlock =
4592                                 NdefMap->StdMifareContainer.currentBlock;
4593             NdefMap->TLVStruct.NdefTLVByte =
4594                                 (TempLength - PH_FRINFC_MIFARESTD_VAL3);
4595 
4596             NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL2)] =
4597                                 (uint8_t)PH_FRINFC_MIFARESTD_NDEFTLV_T;
4598             NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL1)] =
4599                                 (uint8_t)PH_FRINFC_MIFARESTD_NDEFTLV_L;
4600             NdefMap->SendRecvBuf[TempLength] =
4601                                 (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
4602                                 PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
4603             NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)] =
4604                                 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
4605         }
4606         else
4607         {
4608             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
4609             NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)] =
4610                                 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
4611         }
4612         NdefMap->StdMifareContainer.RdAfterWrFlag =
4613                                 PH_FRINFC_MIFARESTD_FLAG0;
4614         break;
4615     }
4616 
4617     return;
4618 }
4619 
4620 /******************************************************************************
4621  * Function         phFriNfc_MifStd_H_fillTLV2
4622  *
4623  * Description      This function is updates the length field if more than one
4624  *                  NULL TLVs does not exists before the TLV.
4625  *
4626  * Returns          void
4627  *
4628  ******************************************************************************/
phFriNfc_MifStd_H_fillTLV2(phFriNfc_NdefMap_t * NdefMap)4629 static void phFriNfc_MifStd_H_fillTLV2(phFriNfc_NdefMap_t        *NdefMap)
4630 {
4631     uint8_t     TempLength = (uint8_t)(NdefMap->TLVStruct.NdefTLVByte +
4632                                 PH_FRINFC_MIFARESTD_VAL1);
4633 
4634     NdefMap->TLVStruct.prevLenByteValue = ((NdefMap->Offset ==
4635                                     PH_FRINFC_NDEFMAP_SEEK_CUR)?
4636                                     (NdefMap->TLVStruct.prevLenByteValue +
4637                                     NdefMap->ApduBuffIndex):
4638                                     NdefMap->ApduBuffIndex);
4639     NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG1;
4640     switch(NdefMap->TLVStruct.NdefTLVByte)
4641     {
4642     case PH_FRINFC_MIFARESTD_VAL13:
4643         if(NdefMap->TLVStruct.prevLenByteValue >=
4644             PH_FRINFC_MIFARESTD_NDEFTLV_L)
4645         {
4646             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
4647             TempLength++;
4648             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L;
4649             TempLength++;
4650             NdefMap->SendRecvBuf[TempLength] = (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
4651                                                 PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
4652         }
4653         else
4654         {
4655             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4656             TempLength++;
4657             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4658             TempLength++;
4659 
4660             /* Update the null TLV, ndef TLV block and ndef TLV byte */
4661             NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL2;
4662             NdefMap->TLVStruct.NdefTLVBlock =
4663                                 NdefMap->StdMifareContainer.currentBlock;
4664             NdefMap->TLVStruct.NdefTLVByte =
4665                                 (TempLength - PH_FRINFC_MIFARESTD_VAL1);
4666 
4667             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
4668         }
4669         break;
4670 
4671     case PH_FRINFC_MIFARESTD_VAL14:
4672         if(NdefMap->TLVStruct.prevLenByteValue >=
4673             PH_FRINFC_MIFARESTD_NDEFTLV_L)
4674         {
4675             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
4676             TempLength++;
4677             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L;
4678         }
4679         else
4680         {
4681             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4682             TempLength++;
4683             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4684         }
4685         break;
4686 
4687     case PH_FRINFC_MIFARESTD_VAL15:
4688         if(NdefMap->TLVStruct.prevLenByteValue >=
4689             PH_FRINFC_MIFARESTD_NDEFTLV_L)
4690         {
4691             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
4692         }
4693         else
4694         {
4695             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4696         }
4697         break;
4698 
4699     default:
4700         if(NdefMap->TLVStruct.prevLenByteValue >=
4701             PH_FRINFC_MIFARESTD_NDEFTLV_L)
4702         {
4703             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
4704             TempLength++;
4705             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L;
4706             TempLength++;
4707             NdefMap->SendRecvBuf[TempLength] = (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
4708                                                 PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
4709             TempLength++;
4710             NdefMap->SendRecvBuf[TempLength] =
4711                                 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
4712         }
4713         else
4714         {
4715             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4716             TempLength++;
4717             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4718             TempLength++;
4719 
4720             /* Update the null TLV, ndef TLV block and ndef TLV byte */
4721             NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL2;
4722             NdefMap->TLVStruct.NdefTLVBlock =
4723                                 NdefMap->StdMifareContainer.currentBlock;
4724             NdefMap->TLVStruct.NdefTLVByte =
4725                                 (TempLength - PH_FRINFC_MIFARESTD_VAL1);
4726 
4727             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
4728             TempLength++;
4729             NdefMap->SendRecvBuf[TempLength] =
4730                                 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
4731         }
4732         NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
4733         break;
4734     }
4735 
4736     return;
4737 }
4738 
4739 /******************************************************************************
4740  * Function         phFriNfc_MifStd_H_CallWrNdefLen
4741  *
4742  * Description      This function is used to increment/decrement the ndef tlv block
4743  *                  and read the block.
4744  *
4745  * Returns          This function return NFCSTATUS_SUCCESS in case of success
4746  *                  In case of failure returns other failure value.
4747  *
4748  ******************************************************************************/
phFriNfc_MifStd_H_CallWrNdefLen(phFriNfc_NdefMap_t * NdefMap)4749 static NFCSTATUS phFriNfc_MifStd_H_CallWrNdefLen(phFriNfc_NdefMap_t        *NdefMap)
4750 {
4751     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
4752 
4753     if(NdefMap->TLVStruct.NULLTLVCount >= PH_FRINFC_MIFARESTD_VAL2)
4754     {
4755         if((NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL0) ||
4756             (NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL1) )
4757         {
4758             /* In this case, current block is decremented because the
4759                NULL TLVs are in the previous block */
4760             NdefMap->StdMifareContainer.currentBlock--;
4761             Result = phFriNfc_MifStd_H_BlkChk_1(NdefMap);
4762         }
4763         else
4764         {
4765             /* case NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL15:
4766                Current block is incremented to update the remaining TLV
4767                structure */
4768             NdefMap->StdMifareContainer.currentBlock++;
4769             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
4770         }
4771     }
4772     else
4773     {
4774         if((NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL13) ||
4775             (NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL14) ||
4776             (NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL15))
4777         {
4778             /* Current block is incremented to update the remaining TLV
4779                 structure */
4780             NdefMap->StdMifareContainer.currentBlock++;
4781             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
4782         }
4783     }
4784 
4785     Result = ((Result == NFCSTATUS_SUCCESS)?
4786             phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap):
4787             Result);
4788 
4789     return Result;
4790 }
4791 
4792 /******************************************************************************
4793  * Function         phFriNfc_MifStd_H_BlkChk_1
4794  *
4795  * Description      This function check the current block is valid or not
4796  *                  if not valid decrement the current block till the valid block.
4797  *
4798  * Returns          This function return NFCSTATUS_SUCCESS in case of success
4799  *                  In case of failure returns other failure value.
4800  *
4801  ******************************************************************************/
phFriNfc_MifStd_H_BlkChk_1(phFriNfc_NdefMap_t * NdefMap)4802 static NFCSTATUS phFriNfc_MifStd_H_BlkChk_1(phFriNfc_NdefMap_t        *NdefMap)
4803 {
4804     NFCSTATUS   Result  = NFCSTATUS_SUCCESS;
4805     uint8_t     SectorID = PH_FRINFC_MIFARESTD_VAL0;
4806 
4807     /* Get a Sector ID for the Current Block */
4808     SectorID = phFriNfc_MifStd_H_GetSect(NdefMap->StdMifareContainer.currentBlock);
4809 
4810     /* Check the sector id is valid or not and if valid then check the
4811         current block is greater than 128 */
4812     if((NdefMap->StdMifareContainer.aid[SectorID] ==
4813         PH_FRINFC_MIFARESTD_NDEF_COMP) &&
4814         (((SectorID <= PH_FRINFC_MIFARESTD_VAL15) &&
4815         (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD)) ||
4816         ((SectorID <= PH_FRINFC_MIFARESTD_SECTOR_NO31) &&
4817         (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD)) ||
4818         ((SectorID <= PH_FRINFC_MIFARESTD_SECTOR_NO39) &&
4819         (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD))))
4820     {
4821         if(NdefMap->StdMifareContainer.currentBlock > 128)
4822         {
4823             NdefMap->TLVStruct.NdefTLVAuthFlag =
4824             ((((NdefMap->StdMifareContainer.currentBlock +
4825                 PH_FRINFC_MIFARESTD_VAL1) %
4826                 PH_FRINFC_MIFARESTD_MAD_BLK16) ==
4827                 PH_FRINFC_MIFARESTD_VAL0)?
4828                 PH_FRINFC_MIFARESTD_FLAG1:
4829                 PH_FRINFC_MIFARESTD_FLAG0);
4830 
4831                 NdefMap->StdMifareContainer.currentBlock -=
4832             ((((NdefMap->StdMifareContainer.currentBlock +
4833                 PH_FRINFC_MIFARESTD_VAL1) %
4834                 PH_FRINFC_MIFARESTD_MAD_BLK16) ==
4835                 PH_FRINFC_MIFARESTD_VAL0)?
4836                 PH_FRINFC_MIFARESTD_VAL1:
4837                 PH_FRINFC_MIFARESTD_VAL0);
4838 
4839         }
4840         else
4841         {
4842             NdefMap->TLVStruct.NdefTLVAuthFlag =
4843             ((((NdefMap->StdMifareContainer.currentBlock +
4844                 PH_FRINFC_MIFARESTD_VAL1) %
4845                 PH_FRINFC_MIFARESTD_BLK4) ==
4846                 PH_FRINFC_MIFARESTD_VAL0)?
4847                 PH_FRINFC_MIFARESTD_FLAG1:
4848                 PH_FRINFC_MIFARESTD_FLAG0);
4849 
4850             NdefMap->StdMifareContainer.currentBlock -=
4851             ((((NdefMap->StdMifareContainer.currentBlock +
4852                 PH_FRINFC_MIFARESTD_VAL1) %
4853                 PH_FRINFC_MIFARESTD_BLK4) ==
4854                 PH_FRINFC_MIFARESTD_VAL1)?
4855                 PH_FRINFC_MIFARESTD_VAL1:
4856                 PH_FRINFC_MIFARESTD_VAL0);
4857 
4858         }
4859     }
4860     else
4861     {
4862         /*Error: No Ndef Compliant Sectors present.*/
4863         Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
4864                             NFCSTATUS_INVALID_PARAMETER);
4865     }
4866 
4867     return Result;
4868 }
4869 
4870 /******************************************************************************
4871  * Function         phFriNfc_MifStd_H_fillTLV1_1
4872  *
4873  * Description      This function updates the length of the TLV if NULL TLVs
4874  *                  greater than or equal to 2.
4875  *
4876  * Returns          void
4877  *
4878  ******************************************************************************/
phFriNfc_MifStd_H_fillTLV1_1(phFriNfc_NdefMap_t * NdefMap)4879 static void phFriNfc_MifStd_H_fillTLV1_1(phFriNfc_NdefMap_t        *NdefMap)
4880 {
4881     switch(NdefMap->TLVStruct.NdefTLVByte)
4882     {
4883     case PH_FRINFC_MIFARESTD_VAL0:
4884         /* In the first write ndef length procedure, the
4885            length is updated, in this case T and L = 0xFF of TLV are
4886            updated */
4887         NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
4888         NdefMap->TLVStruct.NdefTLVBlock =
4889                             NdefMap->StdMifareContainer.currentBlock;
4890         NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL14;
4891 
4892         NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL15] =
4893                                 PH_FRINFC_MIFARESTD_NDEFTLV_T;
4894         NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL16] =
4895                                 PH_FRINFC_MIFARESTD_NDEFTLV_L;
4896         break;
4897 
4898     case PH_FRINFC_MIFARESTD_VAL1:
4899         /* In the first write ndef length procedure, the
4900            length is updated, in this case T of TLV is
4901            updated */
4902         NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
4903         NdefMap->TLVStruct.NdefTLVBlock =
4904                             NdefMap->StdMifareContainer.currentBlock;
4905         NdefMap->TLVStruct.NdefTLVByte =
4906                             PH_FRINFC_MIFARESTD_VAL15;
4907         NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL16] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
4908         break;
4909 
4910     case PH_FRINFC_MIFARESTD_VAL15:
4911     default:
4912         /* In the first ndef write length, part of the L field or only T
4913            (if update length is less than 255) is updated */
4914         NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL1] =
4915                                     (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
4916         break;
4917     }
4918     NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
4919 
4920     return;
4921 }
4922 
4923 /******************************************************************************
4924  * Function         phFriNfc_MifStd_H_fillTLV2_1
4925  *
4926  * Description      This function updates the length of the TLV if NULL TLVs
4927  *                  less than 2.
4928  *
4929  * Returns          void
4930  *
4931  ******************************************************************************/
phFriNfc_MifStd_H_fillTLV2_1(phFriNfc_NdefMap_t * NdefMap)4932 static void phFriNfc_MifStd_H_fillTLV2_1(phFriNfc_NdefMap_t        *NdefMap)
4933 {
4934     uint8_t     TempLength = PH_FRINFC_MIFARESTD_VAL1;
4935     switch(NdefMap->TLVStruct.NdefTLVByte)
4936     {
4937     case PH_FRINFC_MIFARESTD_VAL13:
4938         /* In last write ndef length, part of length (L) field of TLV
4939            is updated now */
4940         NdefMap->SendRecvBuf[TempLength] =
4941                     (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
4942         break;
4943 
4944     case PH_FRINFC_MIFARESTD_VAL14:
4945         /* In last write ndef length, part of length (L) field of TLV
4946            is updated now */
4947         if(NdefMap->TLVStruct.prevLenByteValue >=
4948                     PH_FRINFC_MIFARESTD_NDEFTLV_L)
4949         {
4950             NdefMap->SendRecvBuf[TempLength] =
4951                             (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
4952                             PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
4953             TempLength++;
4954             NdefMap->SendRecvBuf[TempLength] =
4955                             (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
4956         }
4957         else
4958         {
4959             NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL2;
4960             NdefMap->TLVStruct.NdefTLVBlock =
4961                                 NdefMap->StdMifareContainer.currentBlock;
4962             NdefMap->TLVStruct.NdefTLVByte =
4963                                 (TempLength - PH_FRINFC_MIFARESTD_VAL1);
4964             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
4965             TempLength++;
4966             NdefMap->SendRecvBuf[TempLength] =
4967                                         (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
4968         }
4969         break;
4970 
4971     case PH_FRINFC_MIFARESTD_VAL15:
4972     default:
4973         if(NdefMap->TLVStruct.prevLenByteValue >=
4974             PH_FRINFC_MIFARESTD_NDEFTLV_L)
4975         {
4976             /* In last write ndef length, only T of TLV is updated and
4977                length (L) field of TLV is updated now */
4978             NdefMap->SendRecvBuf[TempLength] =
4979                             PH_FRINFC_MIFARESTD_NDEFTLV_L;
4980             TempLength++;
4981             NdefMap->SendRecvBuf[TempLength] =
4982                             (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
4983                             PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
4984             TempLength++;
4985             NdefMap->SendRecvBuf[TempLength] =
4986                             (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
4987         }
4988         else
4989         {
4990             NdefMap->SendRecvBuf[TempLength] =
4991                             PH_FRINFC_MIFARESTD_NULLTLV_T;
4992             TempLength++;
4993             NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL2;
4994             NdefMap->TLVStruct.NdefTLVBlock =
4995                                 NdefMap->StdMifareContainer.currentBlock;
4996             NdefMap->TLVStruct.NdefTLVByte =
4997                                 (TempLength - PH_FRINFC_MIFARESTD_VAL1);
4998             NdefMap->SendRecvBuf[TempLength] =
4999                             PH_FRINFC_MIFARESTD_NDEFTLV_T;
5000             TempLength++;
5001             NdefMap->SendRecvBuf[TempLength] =
5002                         (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5003         }
5004         break;
5005     }
5006     NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
5007 
5008     return;
5009 }
5010 
5011 /******************************************************************************
5012  * Function         phFriNfc_MifStd_H_RdTLV
5013  *
5014  * Description      This function reads the TLV block.
5015  *
5016  * Returns          This function return NFCSTATUS_SUCCESS in case of success
5017  *                  In case of failure returns other failure value.
5018  *
5019  ******************************************************************************/
phFriNfc_MifStd_H_RdTLV(phFriNfc_NdefMap_t * NdefMap)5020 static NFCSTATUS phFriNfc_MifStd_H_RdTLV(phFriNfc_NdefMap_t        *NdefMap)
5021 {
5022     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
5023 
5024     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RD_TLV;
5025     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_READ_OPE;
5026 
5027     Result = phFriNfc_MifStd_H_Rd16Bytes(NdefMap,
5028                 NdefMap->StdMifareContainer.currentBlock);
5029 
5030     return Result;
5031 }
5032 
5033 /******************************************************************************
5034  * Function         phFriNfc_MifStd_H_ProRdTLV
5035  *
5036  * Description      This function processes the read TLV block.
5037  *
5038  * Returns          This function return NFCSTATUS_SUCCESS in case of success
5039  *                  In case of failure returns other failure value.
5040  *
5041  ******************************************************************************/
phFriNfc_MifStd_H_ProRdTLV(phFriNfc_NdefMap_t * NdefMap)5042 static NFCSTATUS phFriNfc_MifStd_H_ProRdTLV(phFriNfc_NdefMap_t        *NdefMap)
5043 {
5044     NFCSTATUS   Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
5045                                     NFCSTATUS_INVALID_DEVICE_REQUEST);
5046     uint8_t     TempLength = PH_FRINFC_MIFARESTD_VAL0,
5047                 NDEFFlag = PH_FRINFC_MIFARESTD_FLAG1;
5048 
5049     /*TempLength = (uint8_t)(((NdefMap->TLVStruct.NULLTLVCount >=
5050                 PH_FRINFC_MIFARESTD_VAL2) &&
5051                 (NdefMap->TLVStruct.BytesRemainLinTLV > 0xFE))?
5052                 ((NdefMap->TLVStruct.NdefTLVByte +
5053                 PH_FRINFC_MIFARESTD_VAL2)%
5054                 PH_FRINFC_MIFARESTD_VAL16):
5055                 ((NdefMap->TLVStruct.NdefTLVByte +
5056                 PH_FRINFC_MIFARESTD_VAL4)%
5057                 PH_FRINFC_MIFARESTD_VAL16));*/
5058 
5059     TempLength = (uint8_t)((NdefMap->TLVStruct.BytesRemainLinTLV <= 0xFE)?
5060                         ((NdefMap->TLVStruct.NdefTLVByte +
5061                         PH_FRINFC_MIFARESTD_VAL2)%
5062                         PH_FRINFC_MIFARESTD_VAL16):
5063                         ((NdefMap->TLVStruct.NdefTLVByte +
5064                         PH_FRINFC_MIFARESTD_VAL4)%
5065                         PH_FRINFC_MIFARESTD_VAL16));
5066 
5067     if((*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ) &&
5068         (NdefMap->ApduBuffIndex < NdefMap->ApduBufferSize))
5069     {
5070         if(NdefMap->TLVStruct.BytesRemainLinTLV != 0)
5071         {
5072             NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
5073             /* To read the remaining length (L) in TLV */
5074             Result = phFriNfc_MifStd_H_RemainTLV(NdefMap, &NDEFFlag, &TempLength);
5075         }
5076     }
5077 
5078     return Result;
5079 }
5080 
5081 /******************************************************************************
5082  * Function         phFriNfc_MifStd_H_WrTermTLV
5083  *
5084  * Description      This function is used to write the terminator TLV.
5085  *
5086  * Returns          This function return NFCSTATUS_SUCCESS in case of success
5087  *                  In case of failure returns other failure value.
5088  *
5089  ******************************************************************************/
phFriNfc_MifStd_H_WrTermTLV(phFriNfc_NdefMap_t * NdefMap)5090 static NFCSTATUS phFriNfc_MifStd_H_WrTermTLV(phFriNfc_NdefMap_t   *NdefMap)
5091 {
5092     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
5093     uint8_t     index = PH_FRINFC_MIFARESTD_VAL0;
5094 
5095     /* Change the state to check ndef compliancy */
5096     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_TERM_TLV;
5097 
5098     NdefMap->SendRecvBuf[index] =
5099                         NdefMap->StdMifareContainer.currentBlock;
5100     index++;
5101     NdefMap->SendRecvBuf[index] = PH_FRINFC_MIFARESTD_TERMTLV_T;
5102     index++;
5103 
5104     while(index < PH_FRINFC_MIFARESTD_WR_A_BLK)
5105     {
5106         NdefMap->SendRecvBuf[index] = PH_FRINFC_MIFARESTD_NULLTLV_T;
5107         index++;
5108     }
5109 
5110     NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
5111 
5112     Result = phFriNfc_MifStd_H_WrTLV(NdefMap);
5113 
5114     return Result;
5115 }
5116 
5117 
5118 /******************************************************************************
5119  * Function         phFriNfc_MifStd_H_ProWrABlock
5120  *
5121  * Description      This function processes the write a block.
5122  *
5123  * Returns          This function return NFCSTATUS_SUCCESS in case of success
5124  *                  In case of failure returns other failure value.
5125  *
5126  ******************************************************************************/
phFriNfc_MifStd_H_ProWrABlock(phFriNfc_NdefMap_t * NdefMap)5127 static NFCSTATUS phFriNfc_MifStd_H_ProWrABlock(phFriNfc_NdefMap_t   *NdefMap)
5128 {
5129     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
5130 
5131     NdefMap->StdMifareContainer.WrLength = PH_FRINFC_MIFARESTD_VAL0;
5132     if(NdefMap->ApduBuffIndex <
5133         (uint16_t)NdefMap->ApduBufferSize)
5134     {
5135         /* Remaining bytes to write < 16 */
5136         if(NdefMap->StdMifareContainer.RemainingBufFlag ==
5137             PH_FRINFC_MIFARESTD_FLAG1)
5138         {
5139             /* Write complete, so next byte shall be */
5140             NdefMap->StdMifareContainer.internalLength =
5141                 *NdefMap->DataCount;
5142 
5143             /* Copy bytes less than 16 to internal buffer
5144                for the next write this can be used */
5145             memcpy( NdefMap->StdMifareContainer.internalBuf,
5146                     NdefMap->StdMifareContainer.Buffer,
5147                     NdefMap->StdMifareContainer.internalLength);
5148 
5149             /* Increment the Send Buffer index */
5150             NdefMap->ApduBuffIndex += NdefMap->NumOfBytesWritten;
5151 
5152             NdefMap->StdMifareContainer.remainingSize -=
5153                     NdefMap->NumOfBytesWritten;
5154 
5155             NdefMap->StdMifareContainer.RemainingBufFlag = PH_FRINFC_MIFARESTD_VAL0;
5156             /* Check for the End of Card */
5157                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
5158                     (uint8_t)((NdefMap->StdMifareContainer.remainingSize ==
5159                     PH_FRINFC_MIFARESTD_VAL0)?
5160                     PH_FRINFC_MIFARESTD_FLAG1:
5161                     PH_FRINFC_MIFARESTD_FLAG0);
5162 
5163             NdefMap->TLVStruct.SetTermTLVFlag =
5164                     (uint8_t)(((NdefMap->StdMifareContainer.remainingSize ==
5165                             PH_FRINFC_MIFARESTD_VAL0) ||
5166                             (NdefMap->TLVStruct.SetTermTLVFlag ==
5167                             PH_FRINFC_MIFARESTD_FLAG1))?
5168                             PH_FRINFC_MIFARESTD_FLAG1:
5169                             PH_FRINFC_MIFARESTD_FLAG0);
5170 
5171         } /* internal Buffer > Send Buffer */
5172         else if(NdefMap->StdMifareContainer.internalBufFlag ==
5173                 PH_FRINFC_MIFARESTD_FLAG1)
5174         {
5175             memcpy(NdefMap->StdMifareContainer.internalBuf,
5176                     NdefMap->StdMifareContainer.Buffer,
5177                     *NdefMap->DataCount);
5178 
5179             NdefMap->StdMifareContainer.internalLength =
5180                                     *NdefMap->DataCount;
5181 
5182             /* Increment the Send Buffer index */
5183             NdefMap->ApduBuffIndex +=
5184                     NdefMap->NumOfBytesWritten;
5185 
5186             NdefMap->StdMifareContainer.remainingSize -=
5187                     NdefMap->NumOfBytesWritten;
5188 
5189             NdefMap->StdMifareContainer.internalBufFlag =
5190                                 PH_FRINFC_MIFARESTD_FLAG0;
5191             /* Check for the End of Card */
5192             NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
5193                 (uint8_t)(((NdefMap->StdMifareContainer.remainingSize ==
5194                     PH_FRINFC_MIFARESTD_VAL0) &&
5195                     (NdefMap->StdMifareContainer.internalLength ==
5196                     PH_FRINFC_MIFARESTD_VAL0))?
5197                     PH_FRINFC_MIFARESTD_FLAG1:
5198                     PH_FRINFC_MIFARESTD_FLAG0);
5199 
5200             NdefMap->TLVStruct.SetTermTLVFlag =
5201                     (uint8_t)(((NdefMap->StdMifareContainer.remainingSize ==
5202                             PH_FRINFC_MIFARESTD_VAL0) ||
5203                             (NdefMap->TLVStruct.SetTermTLVFlag ==
5204                             PH_FRINFC_MIFARESTD_FLAG1))?
5205                             PH_FRINFC_MIFARESTD_FLAG1:
5206                             PH_FRINFC_MIFARESTD_FLAG0);
5207         }
5208         else
5209         {
5210             NdefMap->StdMifareContainer.internalLength = 0;
5211             /* Increment the Send Buffer index */
5212             NdefMap->ApduBuffIndex +=
5213                     NdefMap->NumOfBytesWritten;
5214             NdefMap->StdMifareContainer.remainingSize -=
5215                     NdefMap->NumOfBytesWritten;
5216 
5217             /* Check for the End of Card */
5218             if((NdefMap->StdMifareContainer.remainingSize ==
5219                     PH_FRINFC_MIFARESTD_VAL0) ||
5220                     (NdefMap->ApduBuffIndex == NdefMap->ApduBufferSize))
5221             {
5222                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
5223                 (uint8_t)((NdefMap->StdMifareContainer.remainingSize == 0)?
5224                     PH_FRINFC_MIFARESTD_FLAG1:PH_FRINFC_MIFARESTD_FLAG0);
5225 
5226                 if(NdefMap->StdMifareContainer.internalLength ==
5227                     PH_FRINFC_MIFARESTD_VAL0)
5228                 {
5229                     NdefMap->StdMifareContainer.currentBlock++;
5230                     /* Mifare 4k Card, After 128th Block
5231                     each sector = 16 blocks in Mifare 4k */
5232                     Result = ((NdefMap->StdMifareContainer.remainingSize == 0)?
5233                                 Result:
5234                                 phFriNfc_MifStd_H_BlkChk(NdefMap));
5235                     NdefMap->StdMifareContainer.NdefBlocks++;
5236                 }
5237                 NdefMap->TLVStruct.SetTermTLVFlag =
5238                     (uint8_t)(((NdefMap->StdMifareContainer.remainingSize ==
5239                             PH_FRINFC_MIFARESTD_VAL0) ||
5240                             (NdefMap->TLVStruct.SetTermTLVFlag ==
5241                             PH_FRINFC_MIFARESTD_FLAG1))?
5242                             PH_FRINFC_MIFARESTD_FLAG1:
5243                             PH_FRINFC_MIFARESTD_FLAG0);
5244             }
5245             else
5246             {
5247                 NdefMap->StdMifareContainer.currentBlock++;
5248                 NdefMap->StdMifareContainer.WrLength =
5249                     (uint16_t)(NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex);
5250                 /* Mifare 4k Card, After 128th Block
5251                 each sector = 16 blocks in Mifare 4k */
5252                 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
5253                 if(Result == NFCSTATUS_SUCCESS)
5254                 {
5255                     NdefMap->StdMifareContainer.NdefBlocks++;
5256                     Result = ((NdefMap->StdMifareContainer.AuthDone ==
5257                                 PH_FRINFC_MIFARESTD_FLAG1)?
5258                                 phFriNfc_MifStd_H_WrABlock(NdefMap):
5259                                 phFriNfc_MifStd_H_AuthSector(NdefMap));
5260                 }
5261             }
5262         }
5263     }
5264     else
5265     {
5266         Result = PHNFCSTVAL(    CID_FRI_NFC_NDEF_MAP,
5267                                 NFCSTATUS_INVALID_DEVICE_REQUEST);
5268     }
5269 
5270     if((Result == NFCSTATUS_SUCCESS) &&
5271         (NdefMap->TLVStruct.SetTermTLVFlag !=
5272         PH_FRINFC_MIFARESTD_FLAG1) &&
5273         (NdefMap->StdMifareContainer.remainingSize >
5274         PH_FRINFC_MIFARESTD_VAL0))
5275     {
5276         Result = phFriNfc_MifStd_H_WrTermTLV(NdefMap);
5277     }
5278     else
5279     {
5280         if((Result == NFCSTATUS_SUCCESS) &&
5281             (NdefMap->TLVStruct.SetTermTLVFlag ==
5282             PH_FRINFC_MIFARESTD_FLAG1))
5283         {
5284             /* Write the length to the L field in the TLV */
5285             NdefMap->StdMifareContainer.TempBlockNo =
5286                         NdefMap->StdMifareContainer.currentBlock;
5287             phFriNfc_MifStd_H_SetNdefBlkAuth(NdefMap);
5288             NdefMap->StdMifareContainer.currentBlock =
5289                             NdefMap->TLVStruct.NdefTLVBlock;
5290             Result = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
5291         }
5292     }
5293 
5294     return Result;
5295 }
5296 
5297 /******************************************************************************
5298  * Function         phFriNfc_MifStd_H_CallDisCon
5299  *
5300  * Description      This function trigger disconnect after the authentication
5301  *                  has failed.
5302  *
5303  * Returns          This function return NFCSTATUS_PENDING in case of success
5304  *                  In case of failure returns other failure value.
5305  *
5306  ******************************************************************************/
phFriNfc_MifStd_H_CallDisCon(phFriNfc_NdefMap_t * NdefMap)5307 static NFCSTATUS phFriNfc_MifStd_H_CallDisCon(phFriNfc_NdefMap_t   *NdefMap)
5308 {
5309     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
5310 
5311     /* Set Ndef State */
5312     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_DISCONNECT;
5313     NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
5314     NdefMap->MapCompletionInfo.Context = NdefMap;
5315 
5316     Result = phNxNciExtns_MifareStd_Reconnect();
5317 
5318     return Result;
5319 }
5320 
5321 /******************************************************************************
5322  * Function         phFriNfc_MifStd_H_CallConnect
5323  *
5324  * Description      This function sets card state to connect after the
5325  *                  authentication has failed.
5326  *
5327  * Returns          NFCSTATUS_SUCCESS
5328  *
5329  ******************************************************************************/
phFriNfc_MifStd_H_CallConnect(phFriNfc_NdefMap_t * NdefMap)5330 static NFCSTATUS phFriNfc_MifStd_H_CallConnect(phFriNfc_NdefMap_t   *NdefMap)
5331 {
5332     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
5333 
5334     /* Set Ndef State */
5335     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_CONNECT;
5336 
5337     return Result;
5338 }
5339 
5340 /******************************************************************************
5341  * Function         phFriNfc_MifStd1k_H_BlkChk
5342  *
5343  * Description      This function used to update the current block.
5344  *
5345  * Returns          void
5346  *
5347  ******************************************************************************/
phFriNfc_MifStd1k_H_BlkChk(phFriNfc_NdefMap_t * NdefMap,uint8_t SectorID,uint8_t * callbreak)5348 static void phFriNfc_MifStd1k_H_BlkChk(phFriNfc_NdefMap_t   *NdefMap,
5349                                     uint8_t              SectorID,
5350                                     uint8_t              *callbreak)
5351 {
5352     /* every last block of a sector needs to be skipped */
5353     if(((NdefMap->StdMifareContainer.currentBlock + PH_FRINFC_MIFARESTD_INC_1) %
5354         PH_FRINFC_MIFARESTD_BLK4) == 0)
5355     {
5356         NdefMap->StdMifareContainer.currentBlock++;
5357     }
5358     else
5359     {
5360         if(NdefMap->StdMifareContainer.aid[SectorID] ==
5361             PH_FRINFC_MIFARESTD_NDEF_COMP)
5362         {
5363             /* Check whether the block is first block of a (next)new sector and
5364             also check if it is first block then internal length is zero
5365             or not. Because once Authentication is done for the sector again
5366             we should not authenticate it again */
5367             if((NdefMap->StdMifareContainer.currentBlock ==
5368                 (SectorID * PH_FRINFC_MIFARESTD_BLK4)) &&
5369                 (NdefMap->StdMifareContainer.internalLength == 0))
5370             {
5371                 NdefMap->StdMifareContainer.AuthDone = 0;
5372             }
5373             *callbreak = 1;
5374         }
5375         else
5376         {
5377             NdefMap->StdMifareContainer.currentBlock += PH_FRINFC_MIFARESTD_BLK4;
5378         }
5379     }
5380 
5381     return;
5382 }
5383 
5384 /******************************************************************************
5385  * Function         phFrinfc_MifareClassic_GetContainerSize
5386  *
5387  * Description      This function calculate the card size.
5388  *
5389  * Returns          This function return NFCSTATUS_SUCCESS in case of success
5390  *                  In case of failure returns other failure value.
5391  *
5392  ******************************************************************************/
phFrinfc_MifareClassic_GetContainerSize(const phFriNfc_NdefMap_t * NdefMap,uint32_t * maxSize,uint32_t * actualSize)5393 NFCSTATUS phFrinfc_MifareClassic_GetContainerSize(const phFriNfc_NdefMap_t *NdefMap,
5394                                    uint32_t *maxSize, uint32_t *actualSize)
5395 {
5396     NFCSTATUS   result = NFCSTATUS_SUCCESS;
5397     uint16_t    valid_no_of_bytes = 0;
5398     uint8_t     sect_aid_index = 0;
5399     /*  Mifare std card */
5400 
5401     /*  Max size is the number of NDEF compliant blocks in the card
5402         multiplied by 16 bytes */
5403 
5404     /* Skip all the non ndef sectors */
5405     while ((sect_aid_index < PH_FRINFC_NDEFMAP_MIFARESTD_TOTALNO_BLK) &&
5406           (PH_FRINFC_MIFARESTD_NON_NDEF_COMP == NdefMap->StdMifareContainer.aid[sect_aid_index]))
5407     {
5408         sect_aid_index++;
5409     }
5410 
5411     /* Parse only the contiguous NDEF sectors for the max size calculation */
5412      while ((sect_aid_index <PH_FRINFC_NDEFMAP_MIFARESTD_TOTALNO_BLK)&&
5413            (PH_FRINFC_MIFARESTD_NDEF_COMP ==NdefMap->StdMifareContainer.aid[sect_aid_index]))
5414     {
5415         if (((PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD == NdefMap->CardType)||
5416              (PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD == NdefMap->CardType)) && (sect_aid_index >= 32))
5417         {
5418             /* Mifare classic card of 4k size, sector >= 32 has
5419                16 blocks per sector and in that 15 blocks are valid data blocks
5420                16 is the block number in a sector
5421                15 is the number of valid data blocks in a sector
5422              */
5423             valid_no_of_bytes += (uint16_t)(16 * 15);
5424         }
5425         else
5426         {
5427             valid_no_of_bytes += (uint16_t)(16 * 3);
5428         }
5429 
5430         sect_aid_index++;
5431         if (16 == sect_aid_index)
5432         {
5433             /* Because sector index is 16, that is "MAD 2" block
5434                For calculating size MAD block shall be ignored
5435              */
5436             sect_aid_index++;
5437         }
5438     }
5439     /* The below check is for the 3 byte length format of the NDEF TLV
5440        If the length field > 255, Max size will less by 4
5441        else Max size will less by 2 (Type and Length of the NDEF TLV
5442        has to be skipped to provide the maximum size in the card */
5443     *maxSize = (valid_no_of_bytes > 0xFF) ? (valid_no_of_bytes - 4) : (valid_no_of_bytes - 2);
5444 
5445     *actualSize = NdefMap->TLVStruct.BytesRemainLinTLV;
5446 
5447     return result;
5448 }
5449 
5450 /******************************************************************************
5451  * Function         phFriNfc_MifareStdMap_ConvertToReadOnly
5452  *
5453  * Description      This function converts the Mifare card to read-only.
5454  *                  It check preconditions before converting to read only.
5455  *
5456  * Returns          This function return NFCSTATUS_PENDING in case of success
5457  *                  In case of failure returns other failure value.
5458  *
5459  ******************************************************************************/
5460 NFCSTATUS
phFriNfc_MifareStdMap_ConvertToReadOnly(phFriNfc_NdefMap_t * NdefMap,const uint8_t * ScrtKeyB)5461 phFriNfc_MifareStdMap_ConvertToReadOnly (
5462                phFriNfc_NdefMap_t *NdefMap,
5463                const uint8_t *ScrtKeyB)
5464 {
5465     NFCSTATUS result = NFCSTATUS_SUCCESS;
5466     uint8_t totalNoSectors = 0 , sectorTrailerBlockNo = 0;
5467 
5468     if ( NdefMap == NULL)
5469     {
5470         result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
5471     }
5472     else if ( PH_NDEFMAP_CARD_STATE_INVALID == NdefMap->CardState )
5473     {
5474         result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_STATE);
5475     }
5476     else
5477     {
5478         /* card state is PH_NDEFMAP_CARD_STATE_READ_WRITE now */
5479         /* get AID  array and parse */
5480         if( PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD == NdefMap->CardType )
5481         {
5482             totalNoSectors  = PH_FRINFC_MIFARESTD1K_TOTAL_SECTOR;
5483         }
5484         else if ( PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD == NdefMap->CardType )
5485         {
5486             totalNoSectors  = PH_FRINFC_MIFARESTD2K_TOTAL_SECTOR;
5487         }
5488         else if ( PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD == NdefMap->CardType )
5489         {
5490              totalNoSectors  = PH_FRINFC_MIFARESTD4K_TOTAL_SECTOR;
5491         }
5492 
5493         /* Store Key B in the context */
5494         if(ScrtKeyB ==NULL)
5495         {
5496             memset (NdefMap->StdMifareContainer.UserScrtKeyB, PH_FRINFC_MIFARESTD_DEFAULT_KEY,
5497                     PH_FRINFC_MIFARESTD_KEY_LEN);
5498         }
5499         else
5500         {
5501             memcpy (NdefMap->StdMifareContainer.UserScrtKeyB, ScrtKeyB, PH_FRINFC_MIFARESTD_KEY_LEN);
5502         }
5503 
5504         NdefMap->StdMifareContainer.TotalNoSectors = totalNoSectors;
5505         if(totalNoSectors == 0)
5506         {
5507             result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
5508         }
5509         else
5510         {
5511             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
5512             NdefMap->StdMifareContainer.RdBeforeWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
5513             NdefMap->StdMifareContainer.WrNdefFlag = PH_FRINFC_MIFARESTD_FLAG0;
5514             NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
5515             NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
5516             NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
5517             NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0;
5518             NdefMap->StdMifareContainer.WriteAcsBitFlag = PH_FRINFC_MIFARESTD_FLAG0;
5519 
5520             /* Sector 0 is MAD sector .Start from Sector 1 */
5521             for(NdefMap->StdMifareContainer.ReadOnlySectorIndex = PH_FRINFC_MIFARESTD_FLAG1;
5522                 NdefMap->StdMifareContainer.ReadOnlySectorIndex < totalNoSectors;
5523                 NdefMap->StdMifareContainer.ReadOnlySectorIndex++)
5524             {
5525                 /* skip MAD sectors */
5526                 if( PH_FRINFC_MIFARESTD_SECTOR_NO16 == NdefMap->StdMifareContainer.ReadOnlySectorIndex  )
5527                 {
5528                     continue;
5529                 }
5530 
5531                 /* if not NDEF compliant skip  */
5532                 if( PH_FRINFC_MIFARESTD_NON_NDEF_COMP ==
5533                     NdefMap->StdMifareContainer.aid[NdefMap->StdMifareContainer.ReadOnlySectorIndex])
5534                 {
5535                     continue;
5536                 }
5537 
5538                 if (PH_FRINFC_MIFARESTD_NDEF_COMP ==
5539                      NdefMap->StdMifareContainer.aid[NdefMap->StdMifareContainer.ReadOnlySectorIndex])
5540                 {
5541                     /*get the sector trailer block number */
5542                     sectorTrailerBlockNo =
5543                         phFriNfc_MifStd_H_GetSectorTrailerBlkNo(NdefMap->StdMifareContainer.ReadOnlySectorIndex);
5544                     NdefMap->StdMifareContainer.currentBlock = sectorTrailerBlockNo;
5545                     NdefMap->StdMifareContainer.SectorTrailerBlockNo = sectorTrailerBlockNo;
5546 
5547                     /* Proceed to authenticate the sector with Key B
5548                        and  modify the sector trailor bits to make it read only*/
5549                     result = phFriNfc_MifStd_H_AuthSector(NdefMap);
5550 
5551                     if (result == NFCSTATUS_PENDING )
5552                     {
5553                         break;
5554                     }
5555                 }
5556             } /* end for */
5557 
5558             /* There are no NDEF sectors in this card , return */
5559             if(NdefMap->StdMifareContainer.ReadOnlySectorIndex == totalNoSectors &&
5560                NFCSTATUS_PENDING!= result )
5561             {
5562                 result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_NO_NDEF_SUPPORT);
5563             }
5564         } /* end else */
5565     }
5566 
5567     return result;
5568 }
5569 
5570 /******************************************************************************
5571  * Function         phFriNfc_MifStd_H_GetSectorTrailerBlkNo
5572  *
5573  * Description      This function returns the block number of the sector
5574  *                  trailor for the given sector trailer Id.
5575  *
5576  * Returns          uint8_t sectorTrailerblockNumber : sector trailor
5577  *
5578  ******************************************************************************/
phFriNfc_MifStd_H_GetSectorTrailerBlkNo(uint8_t SectorID)5579 static uint8_t phFriNfc_MifStd_H_GetSectorTrailerBlkNo (uint8_t SectorID)
5580 {
5581     uint8_t sectorTrailerblockNumber = 0;
5582 
5583     /* every last block of a sector needs to be skipped */
5584     if (SectorID < PH_FRINFC_MIFARESTD_SECTOR_NO32)
5585     {
5586         sectorTrailerblockNumber = (SectorID * PH_FRINFC_MIFARESTD_BLK4 ) + 3;
5587     }
5588     else
5589     {
5590         sectorTrailerblockNumber = ((PH_FRINFC_MIFARESTD_SECTOR_NO32 * PH_FRINFC_MIFARESTD_BLK4) +
5591             ((SectorID - PH_FRINFC_MIFARESTD_SECTOR_NO32) * PH_FRINFC_MIFARESTD_SECTOR_BLOCKS)) + 15;
5592     }
5593 
5594     return sectorTrailerblockNumber;
5595 }
5596 
5597 /******************************************************************************
5598  * Function         phFriNfc_MifStd_H_ProSectorTrailorAcsBits
5599  *
5600  * Description      This function is called during ConvertToReadonly process to
5601  *                  Authenticate NDEF compliant Sector.
5602  *
5603  * Returns          This function return NFCSTATUS_SUCCESS in case of success
5604  *                  In case of failure returns other failure value.
5605  *
5606  ******************************************************************************/
phFriNfc_MifStd_H_ProSectorTrailorAcsBits(phFriNfc_NdefMap_t * NdefMap)5607 static NFCSTATUS phFriNfc_MifStd_H_ProSectorTrailorAcsBits(phFriNfc_NdefMap_t *NdefMap)
5608 {
5609     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
5610 
5611     if(*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ)
5612     {
5613         if(NdefMap->StdMifareContainer.ReadAcsBitFlag ==
5614             PH_FRINFC_MIFARESTD_FLAG1)
5615         {
5616             /* check for the correct access bits */
5617             Result = phFriNfc_MifStd_H_ChkAcsBit(NdefMap);
5618             if(Result  == NFCSTATUS_SUCCESS)
5619             {
5620 
5621                 if(NdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_ONLY)
5622                 {
5623                     /* Go to next sector */
5624                     Result = phFriNfc_MifStd_H_ProWrSectorTrailor(NdefMap);
5625                 }
5626                 else
5627                 {
5628                     /* tranceive to write the data into SendRecvBuff */
5629                     Result = phFriNfc_MifStd_H_WrSectorTrailorBlock(NdefMap);
5630                 }
5631             }
5632         }
5633     }
5634     else
5635     {
5636         Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
5637                      NFCSTATUS_INVALID_PARAMETER);
5638     }
5639 
5640     return Result;
5641 }
5642 
5643 /******************************************************************************
5644  * Function         phFriNfc_MifStd_H_WrSectorTrailorBlock
5645  *
5646  * Description      This function makes current NDEF compliant Sector ReadOnly
5647  *                  modify the sector trailor bits and write it to the card.
5648  *
5649  * Returns          This function return NFCSTATUS_PENDING in case of success
5650  *                  In case of failure returns other failure value.
5651  *
5652  ******************************************************************************/
phFriNfc_MifStd_H_WrSectorTrailorBlock(phFriNfc_NdefMap_t * NdefMap)5653 static NFCSTATUS phFriNfc_MifStd_H_WrSectorTrailorBlock(phFriNfc_NdefMap_t *NdefMap)
5654 {
5655     NFCSTATUS status = NFCSTATUS_PENDING;
5656 
5657     NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
5658     NdefMap->MapCompletionInfo.Context = NdefMap;
5659     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
5660 
5661     /* next state (update sector index) */
5662     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_WRITE_SEC;
5663 
5664     /* Buffer Check */
5665     if(NdefMap->SendRecvBuf != NULL)
5666     {
5667         NdefMap->SendRecvBuf[10] = 0x00;
5668         NdefMap->SendRecvBuf[10] = NdefMap->SendRecvBuf[9] | PH_FRINFC_MIFARESTD_MASK_GPB_WR; /* WR bits 11*/
5669 
5670         /*The NdefMap->SendRecvBuf already has the sector trailor.
5671         modify the bits to make Read Only */
5672         NdefMap->SendRecvBuf[1] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
5673         NdefMap->SendRecvBuf[2] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
5674         NdefMap->SendRecvBuf[3] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
5675         NdefMap->SendRecvBuf[4] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
5676         NdefMap->SendRecvBuf[5] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
5677         NdefMap->SendRecvBuf[6] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
5678 
5679         NdefMap->SendRecvBuf[7] = PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE6;/* 0x0F */
5680         NdefMap->SendRecvBuf[8] = PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE7;/* 0x07 */
5681         NdefMap->SendRecvBuf[9] = PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE8;/* 0x8F */
5682 
5683         NdefMap->SendRecvBuf[11] = NdefMap->StdMifareContainer.UserScrtKeyB[0];
5684         NdefMap->SendRecvBuf[12] = NdefMap->StdMifareContainer.UserScrtKeyB[1];
5685         NdefMap->SendRecvBuf[13] = NdefMap->StdMifareContainer.UserScrtKeyB[2];
5686         NdefMap->SendRecvBuf[14] = NdefMap->StdMifareContainer.UserScrtKeyB[3];
5687         NdefMap->SendRecvBuf[15] = NdefMap->StdMifareContainer.UserScrtKeyB[4];
5688         NdefMap->SendRecvBuf[16] = NdefMap->StdMifareContainer.UserScrtKeyB[5];
5689 
5690         /* Write to Ndef Sector Block */
5691         NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = NdefMap->StdMifareContainer.currentBlock;
5692 
5693         /* Copy Ndef Sector Block into buffer */
5694         memcpy(NdefMap->StdMifareContainer.Buffer,
5695                     &(NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL1]),
5696                     PH_FRINFC_MIFARESTD_BLOCK_BYTES);
5697 
5698         /* Write from here */
5699         NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_WRITE;
5700         NdefMap->Cmd.MfCmd = phHal_eMifareWrite16;
5701         *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
5702 
5703         /* Call the Overlapped HAL Transceive function */
5704         status = phFriNfc_ExtnsTransceive(NdefMap->pTransceiveInfo,
5705                                       NdefMap->Cmd,
5706                                       NdefMap->SendRecvBuf,
5707                                       NdefMap->SendLength,
5708                                       NdefMap->SendRecvLength);
5709     }
5710     else
5711     {
5712         /* Error: The control should not ideally come here.
5713            Return Error.*/
5714         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_FAILED);
5715     }
5716 
5717     return status;
5718 }
5719 
5720 /******************************************************************************
5721  * Function         phFriNfc_MifStd_H_ProWrSectorTrailor
5722  *
5723  * Description      This function makes next NDEF compliant Sector ReadOnly.
5724  *
5725  * Returns          This function return NFCSTATUS_SUCCESS in case of success
5726  *                  In case of failure returns other failure value.
5727  *
5728  ******************************************************************************/
phFriNfc_MifStd_H_ProWrSectorTrailor(phFriNfc_NdefMap_t * NdefMap)5729 static NFCSTATUS phFriNfc_MifStd_H_ProWrSectorTrailor(phFriNfc_NdefMap_t *NdefMap)
5730 {
5731     NFCSTATUS status =  NFCSTATUS_FAILED;
5732     uint8_t sectorTrailerBlockNo = 0;
5733 
5734     /*Increment Sector Index */
5735     NdefMap->StdMifareContainer.ReadOnlySectorIndex++;
5736 
5737     /* skip if MAD2 */
5738     if(PH_FRINFC_MIFARESTD_SECTOR_NO16 == NdefMap->StdMifareContainer.ReadOnlySectorIndex )
5739     {
5740         NdefMap->StdMifareContainer.ReadOnlySectorIndex++;
5741     }
5742 
5743     /* if current sector index exceeds total sector index then
5744        all ndef sectors are made readonly then return success
5745        If a NON def sector is encountered return success*/
5746     if (NdefMap->StdMifareContainer.ReadOnlySectorIndex >= NdefMap->StdMifareContainer.TotalNoSectors ||
5747         PH_FRINFC_MIFARESTD_NON_NDEF_COMP  ==
5748         NdefMap->StdMifareContainer.aid[NdefMap->StdMifareContainer.ReadOnlySectorIndex])
5749     {
5750         status = NFCSTATUS_SUCCESS;
5751     }
5752     else if(PH_FRINFC_MIFARESTD_NDEF_COMP  == NdefMap->StdMifareContainer.aid[NdefMap->StdMifareContainer.ReadOnlySectorIndex])
5753     {
5754         /* Convert next NDEF sector to read only */
5755         sectorTrailerBlockNo = phFriNfc_MifStd_H_GetSectorTrailerBlkNo(NdefMap->StdMifareContainer.ReadOnlySectorIndex);
5756         NdefMap->StdMifareContainer.currentBlock = sectorTrailerBlockNo;
5757         NdefMap->StdMifareContainer.SectorTrailerBlockNo = sectorTrailerBlockNo;
5758 
5759         status = phFriNfc_MifStd_H_AuthSector(NdefMap);
5760     }
5761 
5762     return status;
5763 }
5764 
5765 /******************************************************************************
5766  * Function         phFriNfc_MifStd_H_ProWrSectorTrailor
5767  *
5768  * Description      This function checks mapping spec version.
5769  *
5770  * Returns          This function return NFCSTATUS_SUCCESS in case of success
5771  *                  In case of failure returns other failure value.
5772  *
5773  ******************************************************************************/
phFriNfc_MapTool_ChkSpcVer(const phFriNfc_NdefMap_t * NdefMap,uint8_t VersionIndex)5774 static NFCSTATUS   phFriNfc_MapTool_ChkSpcVer( const phFriNfc_NdefMap_t  *NdefMap,
5775         uint8_t             VersionIndex)
5776 {
5777     NFCSTATUS status = NFCSTATUS_SUCCESS;
5778 
5779     uint8_t TagVerNo = NdefMap->SendRecvBuf[VersionIndex];
5780 
5781     if ( TagVerNo == 0 )
5782     {
5783         /* Return Status Error invalid format */
5784         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,NFCSTATUS_INVALID_FORMAT);
5785     }
5786     else
5787     {
5788         switch (NdefMap->CardType)
5789         {
5790             case PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD:
5791             case PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD:
5792             case PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD:
5793                 {
5794                     /* calculate the major and minor version number of Mifare std version number */
5795                     status = (( (( PH_NFCFRI_MFSTDMAP_NFCDEV_MAJOR_VER_NUM ==
5796                                         PH_NFCFRI_MFSTDMAP_GET_MAJOR_TAG_VERNO(TagVerNo ) )&&
5797                                     ( PH_NFCFRI_MFSTDMAP_NFCDEV_MINOR_VER_NUM ==
5798                                       PH_NFCFRI_MFSTDMAP_GET_MINOR_TAG_VERNO(TagVerNo))) ||
5799                                 (( PH_NFCFRI_MFSTDMAP_NFCDEV_MAJOR_VER_NUM ==
5800                                    PH_NFCFRI_MFSTDMAP_GET_MAJOR_TAG_VERNO(TagVerNo ) )&&
5801                                  ( PH_NFCFRI_MFSTDMAP_NFCDEV_MINOR_VER_NUM <
5802                                    PH_NFCFRI_MFSTDMAP_GET_MINOR_TAG_VERNO(TagVerNo) )))?
5803                             NFCSTATUS_SUCCESS:
5804                             PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
5805                                 NFCSTATUS_INVALID_FORMAT));
5806                     break;
5807                 }
5808 
5809             default:
5810                 {
5811                     /* calculate the major and minor version number of T3VerNo */
5812                     if( (( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM ==
5813                                     PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo ) )&&
5814                                 ( PH_NFCFRI_NDEFMAP_NFCDEV_MINOR_VER_NUM ==
5815                                   PH_NFCFRI_NDEFMAP_GET_MINOR_TAG_VERNO(TagVerNo))) ||
5816                             (( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM ==
5817                                PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo ) )&&
5818                              ( PH_NFCFRI_NDEFMAP_NFCDEV_MINOR_VER_NUM <
5819                                PH_NFCFRI_NDEFMAP_GET_MINOR_TAG_VERNO(TagVerNo) )))
5820                     {
5821                         status = PHNFCSTVAL(CID_NFC_NONE,NFCSTATUS_SUCCESS);
5822                     }
5823                     else
5824                     {
5825                         if ((PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM <
5826                              PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo)) ||
5827                              (PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM >
5828                              PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo)))
5829                         {
5830                             status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_FORMAT);
5831                         }
5832                     }
5833                     break;
5834                 }
5835         }
5836     }
5837 
5838     return (status);
5839 }
5840 
5841