I am using NFCA.transceive
to write to NTAG213 and can successfully write to location 28h that holds the dynamic locks without any problems when the tag is empty. But when I try to write it back to its default state I get a TAG_LOST exception. All other fields reset fine such as the password, AUTH0, etc.
In the specification is says NTAG213 features "tearing" protected write operations to specific memory content and mentions 28h. Is that something to do with it? I did not understand the term "tearing".
I should mention that before I update I used the authentication and this must be working OK as everything apart from this page/location changes back. I have played around with order of writes to no effect.
Relevant code:
public String resetBDtag(Tag tag) {
NfcA nfca = NfcA.get(tag);
String resultString = "";
byte[] result;
try {
nfca.connect();
try {
result = nfca.transceive(new byte[]{
(byte)0x1B, // Command: password Auth
(byte)0x93, (byte)0xD0, (byte)0x55, (byte)0xB7
});} catch (IOException e) {
Log.e(TAG, "IOException while authenticating :" + resultString, e );
resultString = "Error authenticating"+ e.toString();
}
try {
result = nfca.transceive(new byte[]{
(byte) 0xA2, // Command: WRITE
(byte) 0x29, // Address: page 0x29 (2)
(byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0xFF // CF
});
} catch (IOException e) {
Log.e(TAG, "IOException while resting Auth0 requirement :" + resultString, e );
resultString = "Error removing Authentication requirement"+ e.toString();;
}
try {
result = nfca.transceive(new byte[]{
(byte) 0xA2, // Command: WRITE
(byte) 0x2B, // Address: page 0x2B (2)
(byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF // Password
});
} catch (IOException e) {
Log.e(TAG, "IOException while clearing password :" + resultString, e );
resultString = "Error clearing password"+ e.toString();;
}
try {
result = nfca.transceive(new byte[]{
(byte) 0xA2, // Command: WRITE
(byte) 0x10, // Address: page 0x10 (2)
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00 // Status / Count
});
} catch (IOException e) {
Log.e(TAG, "IOException while clearing the status data :" + resultString, e );
resultString = "Error clearing status data"+ e.toString();;
}
try {
// This does not work!
result = nfca.transceive(new byte[]{
(byte) 0xA2, // Command: WRITE
(byte) 0x28, // CFG1
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xBD // reset CFG1
});
} catch (IOException e) {
Log.e(TAG, "IOException while removing locked pages 18-19 :" + resultString, e );
resultString = "Error removing locks"+ e.toString();;
}
} catch (IOException e) {
Log.e(TAG, "IOException while writing MifareUltralight :" + resultString, e );
resultString = "Can not speak to the tag!";
} finally {
if (nfca != null) {
try {
nfca.close();
Log.d("finally","isoDep closed");
}
catch (IOException e) {
Log.e(TAG, "Error closing tag...", e);
resultString = "Can not close the connection to the tag!";
}
}
}
return resultString;
}