From c3a87316a08d782d8b336d2d9663b47a4ec37d21 Mon Sep 17 00:00:00 2001 From: Sunil Jogi Date: Mon, 16 Jan 2012 09:13:58 -0800 Subject: Added support for tearing recovery for MIFARE Classic Readonly When readonly is interrupted in between next readonly call make remaining sectors readonly and return true. If all sectors are readonly then call to readonly returns error. Change-Id: Id47a77198b41d69b743f24259849e943954c7a58 --- src/phFriNfc_MifareStdMap.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) (limited to 'src/phFriNfc_MifareStdMap.c') diff --git a/src/phFriNfc_MifareStdMap.c b/src/phFriNfc_MifareStdMap.c index 3e8b6db..efe86d6 100644 --- a/src/phFriNfc_MifareStdMap.c +++ b/src/phFriNfc_MifareStdMap.c @@ -1192,9 +1192,18 @@ void phFriNfc_MifareStdMap_Process( void *Context, CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)? PH_FRINFC_MIFARESTD_FLAG1: PH_FRINFC_MIFARESTD_FLAG0); - break; + if ((CRFlag == PH_FRINFC_MIFARESTD_FLAG1) && + (NdefMap->StdMifareContainer.WriteAcsBitFlag == PH_FRINFC_MIFARESTD_FLAG0)) + { + Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, + NFCSTATUS_INVALID_DEVICE_REQUEST); + } + break; case PH_FRINFC_NDEFMAP_STATE_WRITE_SEC: + /* Set flag for writing of Acs bit */ + NdefMap->StdMifareContainer.WriteAcsBitFlag = PH_FRINFC_MIFARESTD_FLAG1; + /* The first NDEF sector is already made read only, set card state to read only and proceed*/ if(NdefMap->CardState != PH_NDEFMAP_CARD_STATE_READ_ONLY) @@ -6064,11 +6073,6 @@ phFriNfc_MifareStdMap_ConvertToReadOnly ( { result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_STATE); } - else if (PH_NDEFMAP_CARD_STATE_INITIALIZED == NdefMap->CardState || - PH_NDEFMAP_CARD_STATE_READ_ONLY == NdefMap->CardState ) - { - result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_NOT_ALLOWED); - } else { /* card state is PH_NDEFMAP_CARD_STATE_READ_WRITE now */ @@ -6107,6 +6111,7 @@ phFriNfc_MifareStdMap_ConvertToReadOnly ( NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0; NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0; NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0; + NdefMap->StdMifareContainer.WriteAcsBitFlag = PH_FRINFC_MIFARESTD_FLAG0; /* Sector 0 is MAD sector .Start from Sector 1 */ for(NdefMap->StdMifareContainer.ReadOnlySectorIndex = PH_FRINFC_MIFARESTD_FLAG1; @@ -6191,10 +6196,11 @@ static NFCSTATUS phFriNfc_MifStd_H_ProSectorTrailorAcsBits(phFriNfc_NdefMap_t *N Result = phFriNfc_MifStd_H_ChkAcsBit(NdefMap); if(Result == NFCSTATUS_SUCCESS) { + if(NdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_ONLY) { - /* No permission to read */ - Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP, NFCSTATUS_NOT_ALLOWED); + /* Go to next sector */ + Result = phFriNfc_MifStd_H_ProWrSectorTrailor(NdefMap); } else { -- cgit v1.1