Чип EMV - получение AFL для каждой смарт-карты

Продолжить: EMV, чтение PAN-кода

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

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

  • А) 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
  • В) 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 Код моей карты.

Случай B)

У меня есть три разных 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, но я не могу проанализировать их автоматически, потому что нет такой же TAG из предыдущего ответа. Если я использую эти AFL, это сработает, и я могу получить PAN-код карты.

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


person Valerio Colonnese    schedule 03.05.2018    source источник
comment
Sw1 Sw2 = '6A 83' | Запись не найдена, убедитесь, что ваша команда верна в отношении SFI и номера записи,   -  person Arjun    schedule 04.05.2018


Ответы (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 (Rec No) 02 (SInce в этой исходной записи SFI 2 - 02)

P2 (SFI) SFI 02: Представьте SFI в виде пятизначной цифры 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.

person Gaurav Shukla    schedule 04.05.2018
comment
Спасибо за ответ, но я ищу не тот ответ. Вы использовали единственный пример, который у меня сработал. Таким образом, для случая A моя команда APDU была 00 B2 02 14 00, где 02 был первым байтом 10 ›› 3, а 14 был 02 ‹---------------- 3 | 4. Где с ›› 3 и ‹< 3 - это 3-битный сдвиг вправо / влево. Так что это сработало, и я получил правильный ответ. Итак, мои вопросы: 1) Мой метод не подходит для других случаев, почему? 2) Как я могу понять, где начинаются чанки? Я имею в виду, что в случаях A и B у меня есть структура типа 77 - 82 2 - 94, но в случае C исходная структура совершенно другая. Почему? - person Valerio Colonnese; 04.05.2018
comment
не могли бы вы написать свои команды APDU для чтения записей для 2-го AFL (для Paypal) - person Gaurav Shukla; 04.05.2018
comment
Для первого фрагмента: 18 1 1 0 - ›00 B2 03 1C 00 -› 6A 83 Для второго фрагмента: 20 1 1 0 - ›00 B2 04 24 00 -› 6A 83 Для третьего фрагмента: 28 1 3 1 - ›00 B2 05 2C 00 -› 6A 83 - person Valerio Colonnese; 04.05.2018
comment
Правильные APDU: для первого фрагмента 18 01 01 00 - ›SFI 3 Начальная запись - 1, последняя запись - также 1, поэтому единственный APDU - 00 B2 01 1C 00 Для второго фрагмента 20 01 01 00 -› SFI 4 Запуск Rec - 1, последний Rec - также 1, поэтому единственный APDU - 00 B2 01 24 00. Для последнего фрагмента 28 01 03 01 - ›SFI 5 Начальная запись - 01, последняя запись - 03 означает, что в этом SFI доступны 3 записи. APDU: 00 B2 01 2C 00 00 B2 02 2C 00 00 B2 03 2C 00 Посмотрите еще раз мой ответ, чтобы понять формирование APDU для чтения записи. - person Gaurav Shukla; 04.05.2018
comment
Что касается вашего 2-го вопроса: ответ GPO может появиться в шаблоне 2 ответа. Формат 1 (начиная с тега 80) или Формат 2 (начиная с тега 77). выбор шаблона зависит от реализации. Для тега 77 ответ приходит в форме TLV (как вы можете видеть в своем Hello Bank & Paypal. Он будет содержать тег 94, который будет указывать AFL). Когда GPO поставляется с тегом 80, он не будет в форме TLV. Первый байт будет тегом 80, второй будет длиной данных, 3-й и 4-й будут AIP, а с 5-го байта до конца (до слова состояния 9000) в этом случае будет AFL. - person Gaurav Shukla; 04.05.2018
comment
00 B2 01 0C 00, 00 B2 01 1C 00, 00 B2 02 1C 00, Это APDU для примера Postepay - person Gaurav Shukla; 04.05.2018
comment
Как получить 10, чтобы быть 2, и 18, чтобы быть 1C, и 28, чтобы быть 2C? - person Steffan; 06.03.2019
comment
Хорошо, наконец, я понял :) - ›18 = HEX -› преобразовать в двоичный - ›удалить цифры после первых 5 и добавить 100 в конце -› преобразовать обратно в HEX, и тогда вы получите 1С - person Steffan; 06.03.2019