2015-09-29 1 views
2

Я написал программу для общения со смарт-картой (апплет MPCOS компании Gemalto). Я мог бы успешно подключиться к картам и передать команды и получить данные.Выбор DF (выделенный файл) на смарт-карте, возврат ошибки 6981

Однако у меня есть проблема: Когда я 00 A4 01 00 02 02 00 команды для выбора DF (Dedicated File), Он возвратил ошибку 69 81 (индикатор файла неправилен).

Это настолько странно, что после этой команды я использовал другую команду для извлечения подфайла этого DF, и он вернул успех 61 12.

command1(Select MPCOS Applet): 00 A4 04 00 10 A0 00 00 00 18 30 03 01 00 00 00 00 00 00 00 00 
-> response: [97,18] (in decimal) or 6112 (in hex) 

command2: 00 C0 00 00 12 
-> response: [105,133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] (in decimal) or 
      69 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (in hex) 

command3(Select Root): 00 A4 00 00 02 3f 00 
-> response: [97,18] (in decimal) or 6112 (in hex) 

command4: 00 C0 00 00 12 
-> response: [105,133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] (in decimal) or 
      69 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (in hex) 

command5(Select DF): 00 A4 01 00 02 02 00 
-> response: [105,129] (in decimal) or 6981 (in hex) 

command6(Select EF): 00 A4 02 00 02 02 01 
-> response: [97,18] (in decimal) or 6112 (in hex) 

command7: 00 C0 00 00 12 
-> response: [105,133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] (in decimal) or 
      69 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (in hex) 
+1

ли с помощью '00A4010002020000' (с _Le_ поля) или' 00A4010C020200' (с ISO7816-4 нет данных ответа) что-нибудь изменить? – vlp

+0

Просто идея, работает ли доступ к подфайлу _without_ this SELECT? Могут применяться правила выбора файлов ... – vlp

+0

С помощью команды «00A40100020200» мы получаем ошибку 6980, однако мы можем получить доступ к подфайлу (ES). Действительно, мы обнаружили, что если мы опустим эту команду, мы не смогли бы получить доступ к подфайлу. Я имею в виду, что, хотя мы получаем ошибку, но эта команда работает правильно. Как мы могли избежать этой ошибки? –

ответ

1

Я нашел проблему:.

Проблема была из-за вызова функции SCardTransmit два раза Действительно, один раз, чтобы получить длину ответа и . второй раз для выполнения команды и получения ответа

Этот двойной Invoke привести к ошибке 6981:

function SCardTransmitFunc(aCallbackName, myCommand){ 
    var _SCARD_IO_REQUEST = new CONST.SCARD_IO_REQUEST; 
    _SCARD_IO_REQUEST.dwProtocol = AProtocol; 
    _SCARD_IO_REQUEST.cbPciLength = CONST.SCARD_IO_REQUEST.size; 
    var myArrayCommand = hex2Dec(myCommand);   
    var command = TYPES.LPBYTE.targetType.array(myArrayCommand.length)(myArrayCommand); 
    var commandLength = command.length;   
    var responseLength = TYPES.DWORD(); 
    var rez_SCT = SCardTransmit(cardHandle, _SCARD_IO_REQUEST.address(), command, commandLength, null, null, responseLength.address()); 
    var response = TYPES.LPBYTE.targetType.array(parseInt(responseLength.value))(); 
    var rez_SCT = SCardTransmit(cardHandle, _SCARD_IO_REQUEST.address(), command, commandLength, null, response, responseLength.address()); 
    var myResponse = "";//new Array(); 
    for(i = response.length - 2; i < response.length ; i++) 
    { 
     myResponse += dec2Hex(response[i]); 
    } 
} 

и исправленный код т его:

function SCardTransmitFunc(aCallbackName, myCommand){ 
    var _SCARD_IO_REQUEST = new CONST.SCARD_IO_REQUEST; 
    _SCARD_IO_REQUEST.dwProtocol = AProtocol; 
    _SCARD_IO_REQUEST.cbPciLength = CONST.SCARD_IO_REQUEST.size; 
    var myArrayCommand = hex2Dec(myCommand); 
    var command = TYPES.LPBYTE.targetType.array(myArrayCommand.length)(myArrayCommand); 
    var commandLength = command.length; 
    var responseLength = TYPES.DWORD(1024); 
    var response = TYPES.BYTE.array(parseInt(1024))(); 
    var rez_SCT = SCardTransmit(cardHandle, _SCARD_IO_REQUEST.address(), command, commandLength, null, response, responseLength.address()); 
    var myResponse = "";//new Array(); 
    var myLength = parseInt(responseLength.value); 
    for(i = myLength - 2; i < myLength ; i++) 
    { 
     myResponse += dec2Hex(response[i]); 
    } 
} 

Я действительно спасибо @guidot за его хорошую подсказку и дорогой @vlp для его помогает

2

Вы можете использовать команду APDU 00A4010002020000 (т.е. так же, как и раньше, но с Le поле), если вам нужно обработать SELECT ответ (вы можете получить его с помощью команды GET RESPONSE, как вы, наверное, уже знаю).

Или вы можете использовать команду APDU 00A4010C020200 (то есть такой же, как и раньше, но с P2=0x0C указать никаких данных ответа не хотел), если вам не нужно обрабатывать SELECT ответ.

Основываясь на ваших комментариях, этот подход должен работать.

EDIT>

Это странно, я просто воспроизвести ситуацию на родном MPCOS карты (не имеют доступа к апплета MPCOS прямо сейчас):

00A40000023F00 -> 851080013F0038000000C100C100000000679000 
00A40100020200 -> 6F15840E315041592E5359532E4444463031A5038801019000 
00A40200020201 -> 85104302020105000040C000C0000000006B9000 

Примечание: Эта трасса не показать обмены APDU GET RESPONSE.

Так, вероятно, я не могу вам помочь :(

+0

К сожалению, не работает, я пробовал эти две команды и возвратил ошибку 6981 в обеих ситуациях –

+0

Какова ваша команда для выбора апплета (как моя первая команда)? –

+0

Поскольку я использую родную карту MPCOS, я не выбираю апплет. – vlp

Смежные вопросы