iOS: чтение данных бесконтактной смарт-карты VISA с помощью Grabba - PullRequest
0 голосов
/ 03 июля 2018

У меня есть считыватель смарт-карт Grabba. Я пытаюсь получить информацию о карте с помощью команд APDU. Я много читал о стандартах EMV и связанных с ними стандартах ISO 7816-4, но я не могу успешно выполнить команду простого выбора. Вот некоторые детали:

Я успешно включил свою карту VISA и получил ее атрибуты:

NSError *error = nil;
GRGrabbaSmartcardSession *session = [GRGrabba.sharedGrabba.smartcard startSession:&error];
NSLog(@"EMV : smartCardInsertedEvent : Attribute : %@", [session getATR]);

Результат: 3b690000 8072a445 6400ff00 10

Когда я анализирую этот атрибут на здесь , я получаю эту информацию для своей карты:

Attribute parser result

Моя бесконтактная карта - это кредитная карта от Akbank из Турции, но она указана как карта Denizbank из Турции в этом списке .

Теперь я пытаюсь выполнить команду выбора на карте следующим образом:

NSError *error = nil;
GRGrabbaSmartcardSession *session = [GRGrabba.sharedGrabba.smartcard startSession:&error];
NSLog(@"EMV : smartCardInsertedEvent : Attribute : %@", [session getATR]);
session.protocol = 1;
uint8_t aid[] = {'2', 'P', 'A', 'Y', '.', 'S', 'Y', 'S', '.', 'D', 'D', 'F', '0', '1'};
NSData *data = [NSData dataWithBytes:aid length:sizeof(aid)];
NSError *err = nil;
GRGrabbaCommandAPDU *apduCMD =
        [[GRGrabbaCommandAPDU alloc]
                initWithCLA:0x00
                        INS:0xA4
                         P1:0x04
                         P2:0x00
                       Data:data
                         Le:0x00
                      Error:&err];

GRGrabbaResponseAPDU *response = [[GRGrabbaResponseAPDU alloc] initWithData:nil SW1:0 SW2:0];
BOOL success = [session exchangeAPDUCommand:apduCMD withResponse:response error:&error];

if (!success) {
    NSLog(@"EMV : smartCardInsertedEvent : ERROR: Could not read ADF");
    return;
}

Но он не может прочитать ошибку ADF. Может кто-нибудь показать мне, что я делаю не так?

UPDATE:

Я пробовал следующие комбинации, но все еще не смог выполнить команду выбора с успехом:

PROTOCOL DATA           CLA     LE   STATUS
0        1PAY.SYS.DDF01 0x00    -    unrecognised SW in response: SW1 = 61, SW2 = 52
0        1PAY.SYS.DDF01 0x00    0x00 Smartcard protocol error.
0        2PAY.SYS.DDF01 0x00    -    unrecognised SW in response: SW1 = 61, SW2 = 66
0        2PAY.SYS.DDF01 0x00    0x00 Smartcard protocol error.
0        1PAY.SYS.DDF01 0x80    -    card returned Incorrect application CLA - SW1 = 6E, SW2 = 00
0        1PAY.SYS.DDF01 0x80    0x00 card returned Incorrect application CLA - SW1 = 6E, SW2 = 00
0        2PAY.SYS.DDF01 0x80    -    card returned Incorrect application CLA - SW1 = 6E, SW2 = 00
0        2PAY.SYS.DDF01 0x80    0x00 card returned Incorrect application CLA - SW1 = 6E, SW2 = 00
1        1PAY.SYS.DDF01 0x00    -    unrecognised SW in response: SW1 = 00, SW2 = 00
1        1PAY.SYS.DDF01 0x00    0x00 unrecognised SW in response: SW1 = 00, SW2 = 00
1        2PAY.SYS.DDF01 0x00    -    unrecognised SW in response: SW1 = 00, SW2 = 00
1        2PAY.SYS.DDF01 0x00    0x00 unrecognised SW in response: SW1 = 00, SW2 = 00
1        1PAY.SYS.DDF01 0x80    -    unrecognised SW in response: SW1 = 00, SW2 = 00 
1        1PAY.SYS.DDF01 0x80    0x00 unrecognised SW in response: SW1 = 00, SW2 = 00
1        2PAY.SYS.DDF01 0x80    -    unrecognised SW in response: SW1 = 00, SW2 = 00
1        2PAY.SYS.DDF01 0x80    0x00 unrecognised SW in response: SW1 = 00, SW2 = 00

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Следующие два результата выглядят отлично:

PROTOCOL DATA           CLA     LE   STATUS
0        1PAY.SYS.DDF01 0x00    -    unrecognised SW in response: SW1 = 61, SW2 = 52
0        2PAY.SYS.DDF01 0x00    -    unrecognised SW in response: SW1 = 61, SW2 = 66

Слово состояния 61хх указывает, что есть xx байтов ожидающих данных ответа и что вам необходимо выполнить команду GET RESPONSE для получения фактических данных ответа.

Следовательно, вам нужно установить протокол на 0,

session.protocol = 0;

введите команду SELECT (для 2PAY.SYS.DDF01)

uint8_t aid[] = {'2', 'P', 'A', 'Y', '.', 'S', 'Y', 'S', '.', 'D', 'D', 'F', '0', '1'};
NSData *data = [NSData dataWithBytes:aid length:sizeof(aid)];
NSError *err = nil;
GRGrabbaCommandAPDU *apduCMD =
        [[GRGrabbaCommandAPDU alloc]
                initWithCLA:0x00
                        INS:0xA4
                         P1:0x04
                         P2:0x00
                       Data:data
                      Error:&err];
GRGrabbaResponseAPDU *response = [[GRGrabbaResponseAPDU alloc] initWithData:nil SW1:0 SW2:0];
BOOL success = [session exchangeAPDUCommand:apduCMD withResponse:response error:&error];

и оцените SW1. Если SW1 равен 0x90, вы настроены и уже имеете данные ответа. Если он равен 0x61, то вам нужно будет выполнить команду GET RESPONSE с Le, установленной на длину, указанную SW2:

if (response.sw1 == 0x61) {
    GRGrabbaCommandAPDU *apduGETRESPCMD =
            [[GRGrabbaCommandAPDU alloc]
                    initWithCLA:0x00
                            INS:0xC0
                             P1:0x00
                             P2:0x00
                             Le:response.sw2
                      Error:&err];
    BOOL success = [session exchangeAPDUCommand:apduGETRESPCMD withResponse:response error:&error];
}

Примечание: Я не слишком уверен в синтаксисе и именах полей в приведенном выше коде ... не стесняйтесь исправлять это, как только вы заставите его работать.

0 голосов
/ 03 июля 2018

Я не использовал Grabba, и я не уверен, используете ли вы его в контакте или бесконтактно, но, поскольку вы имеете дело с картой T = 0, вы можете попробовать ввести команду без Le.

...