Чип EMV - Получение AFL для каждой смарт-карты
Продолжить с: 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
- Б) 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
Дело А)
У меня есть три разных 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-код моей карты.
Дело Б)
У меня есть три разных AFL: 18 1 1 0
, 20 1 1 0
, 28 1 3 1
, Итак, я отправляю 00 B2 SFI P2 00
построен так же, как и в случае A, но я получил ответ 6A 83 для каждого AFL.
Случай C) У меня есть два разных AFL: 8 1 1 0
, 18 1 2 0
но я не могу разобрать их автоматически, потому что там нет того же тега предыдущего ответа. Если я использую эти AFL, это сработало, и я смогу получить PAN-код карты.
Как я могу сделать универсальный способ прочитать правильный AFL и как я могу сделать правильную команду с этими AFL?
1 ответ
Вот расшифровка 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: в Hex 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.