Чип EMV - Получение AFL для каждой смарт-карты - PullRequest
0 голосов
/ 03 мая 2018

Продолжить с: Чтение кода EMV PAN

Я работаю в C, поэтому у меня нет инструментов Java и всех функций, которые автоматически анализируют ответ команды APDU. Я хочу читать все виды смарт-карт. Я должен проанализировать ответ GET OPCESSING OPTIONS и получить AFL (Access File Locator) каждой карты.

У меня три карты с тремя разными ситуациями:

  • A) HelloBank: 77 12 82 2 38 0 94 c 10 2 4 1 18 1 1 0 20 1 1 0 90
  • B) PayPal: 77 12 82 2 39 0 94 c 18 1 1 0 20 1 1 0 28 1 3 1 90
  • C) PostePay: 80 a 1c 0 8 1 1 0 18 1 2 0 90

Дело A)

У меня есть три разных AFL: 10 2 4 1, 18 1 1 0, 20 1 1 0 Поэтому я отправляю 00 B2 SFI P2 00, где SFI был 10 >> 3 (10 был первым байтом первого AFL), а P2 был SFI << 3 | 4, и таким образом я получил правильный PAN-код моей карты. </p>

Дело B)

У меня есть три разных AFL: 18 1 1 0, 20 1 1 0, 28 1 3 1. Поэтому я посылаю 00 B2 SFI P2 00, построенный так же, как и в случае А, но я получил ответ 6A 83 для каждого AFL.

Дело C) У меня есть два разных AFL: 8 1 1 0, 18 1 2 0, но я не могу разобрать их автоматически, потому что там нет того же тега предыдущего ответа. Если я использую эти AFL, это сработало, и я смогу получить PAN-код карты.

Как я могу сделать универсальный способ чтения правильного AFL и как я могу сделать правильную команду с этими AFL?

1 Ответ

0 голосов
/ 04 мая 2018

Вот расшифровка AFL:

Как правило, AFL будет кратен 4 байтам. Разделите ваш полный AFL на 4 байта. Давайте возьмем пример 1 чанка: AABBCCDD

AA -> SFI (декодирование описано ниже)

BB -> Первая запись под этим SFI

CC -> Последняя запись под этим SFI

DD -> Запись задействована для аутентификации данных в автономном режиме (на данный момент не для использования)

Принимая ваш пример 10 02 04 01 18 01 01 00 20 01 10 00

Куски 10 02 04 01, 18 01 01 00, 20 01 10 00

10 02 04 01 -> Получение 1-го байта 10: 00010000 Брать начальные 5 битов из MSB -> 00010 означает 2: Средство SFI 2

Взятие 2-го байта 02: первая запись в SFI 2 - 02

Взятие 3-го байта 04: последняя запись в SFI 2 - 04

Исключая 4-байтовое объяснение, так как не используется

Сводка: SFI 2 содержит записи от 2 до 4

Будет сформирована команда чтения записи:

Структура APDU: CLA INS P1 P2 LE

CLA 00

INS B2

P1 (Рек. №) 02 (в этой исходной записи SFI 2 - 02)

P2 (SFI) SFI 02: представить SFI в 5-значном бинарном разряде 00010, а затем добавить 100 в конце: 00010100: в шестнадцатеричном формате 14 Таким образом, P2 составляет 14

LE 00

APDU для чтения SFI 2 Rec 2: 00 B2 02 14 00

APDU для чтения SFI 2 Rec 3: 00 B2 03 14 00

APDU для чтения SFI 2 Rec 4: 00 B2 04 14 00

Теперь, если вы попытаетесь прочитать Rec 5, так как эта Rec отсутствует, вы получите SW 6A83 в этом случае.

Используйте одну и ту же процедуру для всех чанков, чтобы идентифицировать доступные Записи и SFI. По этому механизму вы можете написать функцию для разбора AFL

...