Привет Гиктаймс!
После общей информации, описанной в первой части, сегодня поговорим об APDU в формате, описанном в стандарте ISO7816-4.
APDU (application protocol data unit) — это формат общения карты и терминала. Терминал посылает Command APDU (C-APDU), а карта отвечает с Response APDU (R-APDU).
C-APDU
Формат C-APDU таков:
Header | Body |
---|---|
CLA INS P1 P2 | [Lc field] [Data field] [Le field] |
Каждый элемент заголовка (header) сохранен на одном байте и является обязательным. К заголовку вернемся чуть позже, сейчас поговорим о body команды.
Элементы body следующие:
- Lc: длина элемента Data в байтах.
- Data: данные команды.
- Le: ожидаемая длина данных ответа в байтах, исключая длину Status Word.
Lc и Le, если присутствуют, могут занимать 1 (Short Length) или 3 байта (Extended Length) каждый. При Short Length кодируются значения от 1 до 256. Длина данных на 256 байтов записывается как «00». При Extended Length кодируются значения от 1 до 65536. Первый байт всегда «00» и остальные 2 байта — номер в формате Big Endian. Когда Lc или Le — «00 00 00», то длина данных — 65536 байтов.
В зависимости от присутствия или отсутствия элементы body команды можно разделить на 4 категории:
- Case 1: Body полностью отсутсвует, то есть команда не содержит в себе никаких данных и не ожидается получение каких либо данных от карты при ответе.
- Case 2: В body присутствует только Le, то есть команда не содержит в себе никаких данных, но при этом ожидается получение данных от карты.
- Case 3: В body присутствуют Lc и Data, то есть команда содержит в себе данные, но при этом не ожидается получение данных от карты.
- Case 4: В body присутствуют все элементы, а значит команда содержит в себе данные и ожидается получение данных от карты.