Недавно я переписывал цикл предотвращения столкновений ISO 14443-3 и обнаружил, что на самом деле он неправильно определен в стандарте.
Пример: две карты в поле войдут в цикл предотвращения столкновений:
uid карты =
AB CD EF GH IJ KL xx xx xx
(10 байт / UID тройного размера)uid карты =
AB CD EF 88 GH IJ KL
(7 байт/UID двойного размера)
Они оба попадут на уровень каскада предотвращения столкновений 2, где:
будет передавать: UID CL2 =
88 GH IJ KL
- поскольку88
является тегом каскада, указывающим, что его UID длиннеебудет передавать: UID CL2 =
88 GH IJ KL
- как его фактический UID=› нет коллизии.
PCB отправит SELECT, и обе карты ответят SAK, где будет коллизия во втором бите.
Стандарт ISO/IEC 14443-3 ничего не говорит о запрете uid[3] быть 0x88
, только uid[0] запрещено иметь 0x88
.
Я прав или я что-то пропустил? Я знаю, что очень мала вероятность (1 : 2^56) того, что две такие карты появятся на поле одновременно. Но все же это неправильно (и гендиректор компании, в которой я работаю, обязательно придет посмотреть, что мы делаем с двумя такими карточками в кошельке).