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