SCardTransmit() возвращает пустой буфер ответа

Использование платформы, описанной здесь, пытаюсь читать со смарт-карты. Я создал команду apdu. Структура команды кажется правильной, потому что она работает в java. Когда я вызываю функцию SCardTransmit(), команда выполняется, но возвращает пустой буфер ответа длиной Le+2 байта. Первые два байта, содержащие SW1 и SW2, равны 6118. Я полагаю, это означает, что в буфер нужно прочитать больше байтов. Однако, когда я изменяю размер буфера, размер буфера ответа изменяется, но я все равно получаю код ошибки 6118. Это команда выбора, за которой следует команда получения данных, возвращающая статус 6100, что, я думаю, означает, что имеется более 0xFF байтов. читать еще. Итак, как мне заполнить буфер ответа?


person nwnoga    schedule 20.06.2013    source источник


Ответы (1)


Описанное поведение соответствует карте протокола T=0. В этом протоколе вы никогда не получаете ответ на команду напрямую, но должны отправить команду GET RESPONSE с длиной, указанной в коде возврата предыдущей команды, здесь 0x18.

person guidot    schedule 21.06.2013
comment
Это именно то, что я здесь делаю, но 18 не имеет никакого отношения к длине выбранных данных. Ответ GET RESPONSE имеет независимую длину - person nwnoga; 21.06.2013
comment
@nwnoga Код ответа 61 nn означает, что отправьте GET RESPONSE с P3/LE=nn. Я не понимаю, где вы видите независимую длину, а также не рекомендовал бы заменять nn чем-то другим, потому что некоторые карты могут его не принять. - person guidot; 21.06.2013
comment
В программе java SELECT возвращает 26 байтов, а GET RESPONSE возвращает 1100 байтов. Я так понимаю, что 6118 означает, что ваш буфер ответа был короче на 18 байт, и у меня все еще есть больше данных для предоставления. - person nwnoga; 21.06.2013
comment
26 соответствует 0x18 плюс 2 байта SW1/SW2, поэтому ответ на Select выглядит нормально. Я все еще озадачен, говорите ли вы о ПОЛУЧЕНИИ ДАННЫХ, как указано в вашем вопросе, или о ПОЛУЧЕНИИ ОТВЕТА, как в моем ответе. GET RESPONSE в случае T=0 необходим, так как без него вы не получите ответа на ЛЮБУЮ команду. Обратите внимание, что может потребоваться более одного запроса GET RESPONSE, в этом случае все, кроме последнего, должны иметь SW1/SW2, равный 6100. Поведение, при котором часть ответа возвращается напрямую, а оставшаяся часть с помощью GET RESPONSE отличается от T=0. Также ваш SCardTransmit() не помогает идентифицировать отправленную инструкцию. - person guidot; 21.06.2013
comment
INS, который используется во второй команде, — 0xCB. Тем не менее проблема в том, что даже SELECT не отвечает в буфер. Я думаю, что это главная проблема. 24 байта данных там нет. - person nwnoga; 21.06.2013
comment
Моя гипотеза все еще верна; у вас есть карта T = 0, и вы не получаете ответа, потому что вы не отправляете GET RESPONSE (CLA = 0, INS = C0, P1 = P2 = 0), а просто переходите к следующей команде (GET DATA). У вас нет выбора, кроме как познакомиться с T=0. - person guidot; 22.06.2013
comment
Я только что понял это. Спасибо. - person nwnoga; 24.06.2013
comment
Порядок команд следующий: Выбрать, ПОЛУЧИТЬ ОТВЕТ, ПОЛУЧИТЬ ДАННЫЕ, ПОЛУЧИТЬ ОТВЕТ - person nwnoga; 01.07.2013