Смарт-карта получает ответ возвращает статус 6D00

Я занимаюсь разработкой приложения на C ++ (в Windows 7), которое взаимодействует с кард-ридерами PC / SC для выполнения некоторых операций аутентификации. Это приложение является дочерним процессом другого приложения (я не знаю, уместно ли это, но это может быть так).

У меня также есть простое автономное тестовое приложение, которое выполняет все необходимые мне взаимодействия со смарт-картой и делает это успешно. Однако я столкнулся с некоторым странным поведением при интеграции кода из этой утилиты в мое основное приложение.

В частности, первая команда, которую я посылаю на карту, — это команда SELECT FILE:

0x00 0xa4 0x04 0x00 ...

Ответ на эту команду такой же, как и с моей автономной утилитой тестирования:

0x61 0x13

Поскольку это означает, что доступно больше байтов ответа, я отправляю команду GET RESPONSE:

0x00 0xc0 0x00 0x00 0x13

Эта команда завершается с ошибкой, указывающей, что инструкция недействительна:

0x6d 0x00

Однако моя тестовая утилита (работающая с тем же устройством для чтения карт и той же картой) получает успешный ответ (например, заканчивающийся на ... 0x90 0x00). Однако тестовое приложение требует, чтобы смарт-карта находилась в считывающем устройстве при запуске (это простое приложение, которое запускается, делает то, что ему нужно, а затем существует). Ошибка, которую я описал для моего реального приложения, не возникает, если при запуске карта находится в считывающем устройстве (так же, как и в моем тестовом считывателе).

Есть ли у кого-нибудь идеи, что может быть источником этой проблемы. Карта поддерживает данный код инструкции, о чем свидетельствует тот факт, что в некоторых ситуациях она будет отвечать на него успешно. Карта исправна (она отвечает на исходную команду SELECT FILE, как и ожидалось). Я не думаю, что это проблема с разрешениями (опять же, это работает при запуске). Мое основное приложение многопоточное, но все взаимодействия с картами происходят в одном потоке. Я в растерянности. Любые предложения будут ценны.

Еще одна вещь, которую я заметил, заключается в том, что в успешном сценарии (например, с картой в считывателе при запуске приложения) GET RESPONSE занимает ~ 0,05 секунды, а в неудачном сценарии (например, карта вставляется через некоторое время после запуска приложения ) это занимает ~ 2 секунды.

1

Решение

То, что вы испытываете, может быть связано с Windows 7 Plug-and-Play для смарт-карт. Эта функция plug-and-play автоматически отправляет целую кучу команд на карту сразу после ее вставки в считыватель. Если ваше приложение также начинает отправлять команды в это время, это может привести к тому, что ваши команды будут чередоваться с командами plug-and-play.

Поэтому вам может потребоваться либо подождать несколько секунд после того, как карта была вставлена ​​в считыватель, прежде чем вы начнете отправлять команды, либо открыть считыватель карт для монопольного доступа.

Для эксклюзивного доступа используйте значение SCARD_SHARE_EXCLUSIVE для параметра dwShareMode из SCardConnect,

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector