Search code examples
nfcstandardsisosmartcard-readercontactless-smartcard

ISO 14443-3 anti-collision protocol is not correct


I've been recently rewriting ISO 14443-3 anti-collision loop and found out that it is actually not correctly defined in the standard.

Example: two cards in the field will enter anti-collision loop:

  1. card uid = AB CD EF GH IJ KL xx xx xx (10 bytes/tripple size UID)

  2. card uid = AB CD EF 88 GH IJ KL (7 bytes/double size UID)

They will both get into anti-collision cascade level 2 where:

  1. will transmit: UID CL2 = 88 GH IJ KL - as 88 is the cascade tag indicating that its UID is longer

  2. will transmit: UID CL2 = 88 GH IJ KL - as its actual UID

    => no colision.

PCB will send SELECT and both cards will respond with the SAK where there will be a collision in bit2.

The ISO/IEC 14443-3 standard does not says anything about forbiding uid[3] to be 0x88, only uid[0] is forbidden to be 0x88.

Am I right or did I miss something? I know it is very low probability (1 : 2^56) that two such cards appear in the field at the same time. But nevertheless it is not correct (and the general director of the company I am working for will definitely come to look at what we are doing with two such cards in his wallet).


Solution

  • You obviously do not refer to the latest version of the ISO/IEC 14443-3 standard. This problem existed in the 2001 version of the standard and was corrected in Amendment 1 (in 2005) by adding the clause:

    The value '88' of the cascade tag CT shall not be used for uid3 in double size UID.

    I would expect (though I did not check) that this is also the case for the 2011 version of the standard.