Предполагается, что разработчик знаком с основными принципами и
возможностями Mifare.
Внимание: данная страница по большей части является вольным
переводом даташита на филипсовскую карту, поэтому знающим языки рекомендуется
ознакомиться с докой от Philips в оригинале.
Комплект разработчика (SDK)
Для скачивания доступен SDK, состоящий из DLL для работы с ридером нашей
компании, заголовочного файла (с описанием ф-ций), а также небольшого
примера для Delphi (своеобразный тест драйвера).
Скачать SDK.
ПРИМЕЧАНИЕ: представленный SDK изначально предполагался только для
внутреннего использования, поэтому в нем возможны некоторые неточности или
неполное описание функций.
По всем замечаниям/предложениям к работе SDK пожалуйста пишите
LeadProg@menja.net.
Если после изучения примеров Вы почувствуете что вам это пока "не по зубам", но у Вас
есть потенциально готовый заказчик на данную технологию, не расстраивайтесь, пишите
Майклу,
мы обязательно что-нибудь придумаем, т.е. поможем вам заинтегрировать ридер в вашу систему.
Теперь по порядку по работе с DLL:
Инициализация
Начать работу следует с установления интерфейса с ридером, чтобы
убедиться, что он вообще подключен ;-) /см ф-цию mfrc500InterfaceOpen/
Далее необходимо с помощью ф-ции Mf500PcdConfig сбросить ридер в начальное
состояние (ибо неизвестно в каком он находится).
Теперь можем приступать к работе с картами непосредственно.
Принципы связи
Работа всегда инициируется ридером. Работа начинается с запроса карт в
поле (команда request).
Цикл антиколлизии (anticollision loop)
В цикле антиколлизии читается серийный номер карты. Если в радиополе
несколько карт, то они могут быть идентифицированы по их уникальным
номерам. Одна карта с нужным номером выбирается с помощью команды Select
для дальнейшей работы. Остальные карты возвращаются в режим ожидания (до
следующего запроса).
Выбор карты (Select)
В ответ на SELECT карта возвращет свой тип. Для 4Кб карт - 0х18, для 1Кб
карт - 0х08.
Авторизация доступа к карте
Все операции с памятью зашифрованы и защищены ключем, поэтому перед
началом работы с сектором следует авторизоваться с помощью ф-ции
Mf500PiccAuthKey.
Карта памяти радиометки
Четыре килобайта EEPROM разбиты на 32 сектора по 4 блока и на 8 секоторов
по 16 блоков. Один блок состоит из 16 байт.

Данные производителя
Нулевой блок хранит данные производителя. Уникальный(гарантировано Philips) ID,
или серийный номер карты - байт 0..3. Четвертый байт - контрольная сумма номера.
Блок данных производителя доступен только для чтения.
Блоки данных
Сектора 0..31 содержат по 3 блока данных, а сектора 32..39 - по 15 блоков
данных. Блоки данных могут быть сконфигурированы с помощью битов доступа
(access bits) для чтения-записи или для хранения значения (value).
Блоки значения (value)
Блоки значения позволяют выполнять команды read (чтение), write(запись),
increment (увеличение), decrement (уменьшение), restore (восстановление) и
transfer (сохранение). Блок значения имеет фиксированый формат,
позволяющий обнаружение и исправление ошибок. Блок значения может быть
сгенерирован только командой записи.
| Номер байта | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| Описание | значение (value) | НЕ
значение (not value) | значение
(value) | Адр. | НЕ адр. | Адр. | НЕ адр. |
Значение (value) - 4 байтовое знаковое целое число.
(not value) - 4 байтовое инверсное к value знаковое целое число.
Адресс (адр) - 1-байтовый адрес, который м.б. использован для реализации
ф-йии бэкапа. Изменяется только командой записи.
Прицеп сектора (Sector Trailer)
Каждый сектор имеет "прицеп", расположеный в блоке №3 каждого сектора для
первых 2х Килобайт и в блоке №15 каждого сектора - для старших 2х
Килобайт. Каждый прицеп хранит секретные ключи А и Б, условия доступа для
всех блоков в секторе (байты 6..9).
| Номер байта | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| Описание | Ключ А (key A) | Биты
доступа | Ключ Б (key B) |
Работа с памятью
Перед работой с памятью, необходимо выбрать карту (select) и пройти
авторизацию, как было описано выше. Допустимые операции над блоком зависят
от используемого ключа и битов доступа в соответствующем "прицепе" (sector
trailer).

Условия доступа (access conditions)
Условия досутпа к областям данных и к прицепу задаются тремя битами,
которые хранятся в прицепе.
Биты доступа задают, какие ключи необходимы для операций над областью.

Примечание: для младших 2Килобайт, область данных равна 1 блоку (16байт).
Для старших 2Килобайт область данных = 5блокам. Т.е. в старших 2Кб, доступ
задается не к каждому блоку индивидуально, а к областям по 5 блоков.
ВНИМАНИЕ: если биты доступа записаны неверно, то сектор становится
недоступен - то есть необратимо блокируется и использовать его в дальнейшем НЕ
сможет никто !!!
Условия доступа для прицепа
В зависимости от значения битов доступа, прицеп сектора м.б. сконфигурирован для
чтения/записи, как "никогда", "ключ А", "ключ Б" или "ключ А или Б". Для
новых карт, ключ А задается производителем (для Филипса: 00 00 00 00 00
00).
ВНИМАНИЕ: так как биты доступа могут блокировать доступ к самим себе, следует
быть внимательным при разметке новой карты !
| биты доступа |
условия доступа для... |
примечания |
|
ключ А |
биты доступа |
ключ Б |
|
| C1 | C2 | C3 |
чтение | запись | чтение | запись | чтение | запись |
|
| 0 | 0 | 0 |
никогда | ключ А | ключ А |
никогда | ключ А | ключ А |
ключ Б может быть прочитан |
| 0 | 1 | 0 |
никогда | никогда | ключ А |
никогда | ключ А | никогда |
ключ Б может быть прочитан |
| 1 | 0 | 0 |
никогда | ключ Б | ключ А или Б |
никогда | никогда | ключ Б |
|
| 1 | 1 | 0 |
никогда | никогда | ключ А или Б |
никогда | никогда | никогда |
|
| 0 | 0 | 1 |
никогда | ключ А | ключ А |
ключ А | ключ А | ключ А |
ключ Б может быть прочитан (новая карта) |
| 0 | 1 | 1 |
никогда | ключ Б | ключ А или Б |
ключ Б | никогда | ключ Б |
|
| 1 | 0 | 1 |
никогда | никогда | ключ А или Б |
ключ Б | никогда | никогда |
|
| 1 | 1 | 1 |
никогда | никогда | ключ А или Б |
никогда | никогда | никогда |
|
Условия доступа для областей данных
В зависимости от значений битов доступа, данные могут быть доступны для
чтения/записи: "никогда", по ключу А, по ключу Б или по ключу А или Б.
Установка битов доступа определяет допустимые команды и применение карты.
блок чтения-записи: доступен и на чтение и на запись
блок значения (value): дополнительно позволяет операции increment, decrement, transfer и restore. В случае единицы (001) только чтение и декремент допустимы (для "не пополняемой" карты).
В случае 110, "пополнение" возможно с помощью ключа Б.
блок данных производителя всегда доступен на чтение, вне зависимости от битов доступа
| биты доступа |
условия доступа для... |
применение |
| C1 |
C2 |
C3 |
чтение |
запись |
инкремент |
декремнт, transfer, restore |
|
| 0 | 0 | 0 |
ключ А или Б* |
ключ А или Б* |
ключ А или Б* |
ключ А или Б* |
новая карта** |
| 0 | 1 | 0 |
ключ А или Б* |
никогда |
никогда |
никогда |
блок для чтения-записи** |
| 1 | 0 | 0 |
ключ А или Б* |
ключ Б* |
никогда |
никогда |
блок для чтения-записи |
| 1 | 1 | 0 |
ключ А или Б* |
ключ Б* |
ключ Б* |
ключ А или Б* |
блок значения |
| 0 | 0 | 1 |
ключ А или Б* |
никогда |
никогда |
ключ А или Б* |
блок значения** |
| 0 | 1 | 1 |
ключ Б* |
ключ Б* |
никогда |
никогда |
блок для чтения-записи |
| 1 | 0 | 1 |
ключ Б* |
никогда |
никогда |
никогда |
блок для чтения-записи |
| 1 | 1 | 1 |
никогда |
никогда |
никогда |
никогда |
блок для чтения-записи |
* если ключ Б может быть прочитан (из соотв-го прицепа), он не может
служить для авторизации.
** Consequences: If the RDW tries to authenticate any block
of a sector with key B, the
card will refuse any subsequent access after authentication.
|