summaryrefslogtreecommitdiffstats
path: root/src/phFriNfc_MifareStdMap.c
diff options
context:
space:
mode:
authorSunil Jogi <sunil.jogi@nxp.com>2012-01-16 09:13:58 -0800
committerMartijn Coenen <maco@google.com>2012-04-02 10:35:35 -0700
commitc3a87316a08d782d8b336d2d9663b47a4ec37d21 (patch)
treeb732cb0a09683225bf058bc4ef430b9c157f3e56 /src/phFriNfc_MifareStdMap.c
parent40734e7599249717860f7aeabda494e1bcd86ffe (diff)
downloadexternal_libnfc-nxp-c3a87316a08d782d8b336d2d9663b47a4ec37d21.zip
external_libnfc-nxp-c3a87316a08d782d8b336d2d9663b47a4ec37d21.tar.gz
external_libnfc-nxp-c3a87316a08d782d8b336d2d9663b47a4ec37d21.tar.bz2
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
Diffstat (limited to 'src/phFriNfc_MifareStdMap.c')
-rw-r--r--src/phFriNfc_MifareStdMap.c22
1 files changed, 14 insertions, 8 deletions
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
{