Search code examples
delphinfcmifareapdu

APDU Write block commands on mifare 1K with ACR122U reader


Please,

I am trying to write a simple Binary Block to mifare 1k tag with a ACR122U reader.

I am trying write to block 01, 5 bytes, text:'teste' and read it back.

But I always get an error 6300 when update this block.

Any thoughts?

I am using windows 8.1/delphi xe8.

My log is:

SCardEstablishContext succeeded.
Card State changed in ACS ACR122U PICC Interface 0 to available
New reader found: ACS ACR122U PICC Interface 0
Card inserted in ACS ACR122U PICC Interface 0
ATR = 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 01 00 00 00 00 6A
SCardConnect (shared) succeeded.
Active Protocol: T=1
ISO 14443 A, Part3 Card Type: Mifare Standard 1K is detected
Sending APDU to card: FF 82 00 01 06 FF FF FF FF FF FF
SCardTransmit succeeded.
Card response status word: 9000 (OK)
Sending APDU to card: FF 86 00 00 05 01 00 01 60 01
SCardTransmit succeeded.
Card response status word: 9000 (OK)
Sending APDU to card: FF 86 00 00 05 01 00 01 60 01
SCardTransmit succeeded.
Card response status word: 9000 (OK)
Sending APDU to card: FF D6 00 01 05 74 65 73 74 65
SCardTransmit succeeded.
Card response status word: 6300 (State of non-volatile memory changed.)

Solution

  • This is easily resolved by reading the documentation.

    enter image description here

    You're writing to a block and you have to provide a complete block of information. The only option for Lc is x04 or x10 - four bytes or sixteen bytes. For the Mifare 1K, it's prettly clear that you need to supply 16 bytes. You have only 5 bytes of data, so pad the rest with zeros.

    |  CMD   | block1 | 16 bytes | data ... 
     FF D6 00    01       10       74 65 73 74 65 00 00 00 00 00 00 00 00 00 00 00