SCardTransmit () всегда возвращает ошибку - PullRequest
2 голосов
/ 03 февраля 2012

Я работаю на бесконтактном считывателе RFID-карт SCM, используя Microsoft SmartCard API .

Обычный процесс взаимодействия со смарт-картой, как я понял, таков:
1. Установите контекст, используя SCardEstablishContext ()
2. Перечислите все читатели, подключенные к системе, используя SCardListReaders ()
3. Выберите считыватель и подождите, пока в него будет вставлена ​​карта.
4. После обнаружения карты функция SCardGetStatusChange () возвращает.
5. Подключитесь к карте через выбранный ридер с помощью SCardConnect ()
6. Поговорите с картой, используя SCardTransmit ()

Все шаги до 5 работают нормально, что означает, что я получил правильную ручку карты. Далее можно проверить карту, выполнив функцию SCardStatus (), которая возвращает согласованный протокол и ATR карты, что также правильно. Но когда я пытаюсь отправить любую команду APDU с помощью SCardTransmit (), она возвращает ошибку (код ошибки 14, который, как мне кажется, SCARD_E_CANT_DISPOSE).

Понятия не имею, что идет не так или чего не хватает. Я пробовал разные APDU, например, базовый APDU для чтения UID карты путем выдачи {0xFF, 0xCA, 0x00, 0x00, 0x00}. Я проверил этот APDU, используя инструмент отладки SCM TestResMan, и он возвращает мне правильный UID карты. Я использую карту MiFARE 1k и бесконтактный считыватель SCM011 SCM.

Ниже приведен фрагмент кода SCardTransmit () (все предыдущие функции вернулись успешно).

SCARD_IO_REQUEST sioreq;
sioreq.dwProtocol = 2; // SCARD_PROTOCOL_T1
sioreq.cbPciLength = 8;

SCARD_IO_REQUEST rioreq;
rioreq.dwProtocol = 2; // SCARD_PROTOCOL_T1
rioreq.cbPciLength = 8;

byte sendbuffer[256], receivebuffer[256];
ULONG sendbufferLen, receivebufferLen, sizeofUID;

sendbuffer[0] = 0xFF; // CLA - Instruction Class
sendbuffer[1] = 0xCA; // Instruction code
sendbuffer[2] = 0x00; // P1 - 1st parameter
sendbuffer[3] = 0x00; // P2 - 2nd parameter
sendbuffer[4] = 0x00;
sendbufferLen = 0x05;

retval = objScWrapper->SCardTransmit(hCardHandle, &sioreq, sendbuffer,
                                     sendbufferLen, NULL, receivebuffer, 
                                     &receivebufferLen);

Пожалуйста, дайте мне знать, если у кого-нибудь есть подсказки или указатели ...
ТИА !!

Ответы [ 2 ]

4 голосов
/ 16 марта 2012

Ваш размер приемного буфера составляет 256 байтов, но вы запрашиваете 256 байтов (Le = 00h), и приемный буфер также ожидает слова состояния (состоящие из двух байтов, SW1 и SW2).

Так что я думаю, что ваш код ошибки 14 является общим OUT_OF_MEMORY для буфера приема.

Ваш буфер команд также слишком мал, чтобы вместить заголовок 5 байтов + максимальные данные команды 255 байтов.Конечно, оба слишком малы для обработки ADPU расширенной длины.

В настоящее время Windows довольно требовательна к размеру буфера считывателя смарт-карт для PCSC-совместимых считывателей.Используйте как минимум 5 + 255 = 260 байтов для буфера команд и 256 + 2 байта для буфера приема.Используйте буферы повторно или безопасно их утилизируйте, иначе у вас будет утечка памяти.

0 голосов
/ 07 марта 2012

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

1) Когда вы подключаетесь к SCardConnect, вы подключаетесь?с эксклюзивным, общим или прямым доступом?2) Вы уверены, что при подключении к карте используется протокол T1?3) Какова цель rioreq SCARD_IO_REQUEST;Строка в образце этот объект, кажется, не используется?4) Я вижу, что вы проходите через оболочку для вызова API.Можете ли вы поделиться внутренней реализацией SCardTrasmit в оболочке?

Я отредактирую этот ответ на основе обновленного сделанного вам вопроса.

...