Синтаксический анализ PDOL для команды GET PROCESSING OPTIONS в транзакции EMV
Я пытаюсь создать правильно отформатированную команду GET PROCESSING OPTIONS для отправки на бесконтактную карту EMV. Этот пост был очень полезен, но мне просто нужно знать немного больше деталей.
При анализе PDOL безопасно ли предположить, что каждый тег имеет длину 2 байта, а затем размер ожидаемых данных в ответ?
Например, PDOL 9F66049F02069F37049F1A02
разбит на9F66 04
, 9F02 06
и т. д. каждый с 2-байтовыми тегами и 1 байтом для ожидаемой длины значения данных.
Безопасно ли предполагать, что каждый тег имеет длину 2 байта при разборе?
1 ответ
Нет, вы не можете ожидать, что каждый тег состоит из двух байтов (хотя большинство тегов делают). Структуры Tag-Length-Value (TLV) в EMV следуют правилам кодирования ASN.1 (основные правила кодирования, BER). См. Следующие документы для получения дополнительной информации:
- МСЭ-T X.690: Правила кодирования ASN.1: спецификация основных правил кодирования (BER), канонических правил кодирования (CER) и выделенных правил кодирования (DER)
- Руководство для неспециалистов по подмножеству ASN.1, BER и DER (Бертон С. Калиски-младший)
Последнее действительно хорошее введение, которое помогло мне начать.
Структура TLV (объект данных) состоит из значения тега, значения длины и полезной нагрузки данных (значения):
+ ----------- + ----------- + ----------- + | Тег | Длина | Значение | | (N байт) | (М байт) | (L байт) | +-----------+-----------+-----------+
PDOL (и любой другой список объектов данных, DOL) содержит тег и часть длины одного или нескольких таких объектов данных. Аналогично, данные, относящиеся к PDOL, содержат части значений DO, на которые есть ссылки в PDOL. И тэг, и часть длины могут состоять из одного или нескольких байтов.
Для части тега правила примерно такие (подробности см. В приведенных выше ссылках):
- Если младшие 5 битов первого байта тега являются единицами (
tag[0] & 0x01F == 0x01F
), то тег состоит как минимум из двух байтов. - Если старший бит следующего байта тега равен единице (
tag[i] & 0x080 == 0x080
), то тег состоит из еще одного байта. Это повторяется для каждого последующего байта.
Для части длины правила примерно такие (для более подробной информации смотрите ссылки выше):
- Если старший бит первого байта длины равен нулю (
length[0] & 0x080 == 0
), то оставшиеся семь битов кодируют значение длины (length[0] & 0x07F
). - Если старший бит первого байта длины равен единице (
length[0] & 0x080 == 0x080
), то оставшиеся семь битов кодируют количество оставшихся байтов части длины (length[0] & 0x07F
). Остальные байты представляют значение длины как целое число без знака с MSB первым.