Ответ 1
APDU для записи на карту в вашем примере должен быть:
FF D6 00 50 01 01
Для чтения/записи на карты памяти SLE4442 в моем приложении в настоящее время используется USB-кардридер Omnikey Cardman 3021, API смарт-карт Sumbsembly (внешняя dll), способный обертывать вызовы CT-API (направленные в dll omnikey), поэтому что я могу читать/записывать карту памяти в свое приложение С#. Единственная проблема здесь в том, что Omnikey предоставляет только 32-битную DLL своего CT-API. Я спросил, будут ли они создавать 64-битную версию, но они не могут быть обеспокоены.
Чтобы сделать мое приложение 64-разрядным, я должен переписать его с помощью Windows WinSCard API. Проблема здесь в том, что в Интернете нет конкретных примеров, как это сделать. Также получить контроль над рабочими командами APDU почти невозможно, но мне удалось получить две несколько разные версии, которые работают. Я столкнулся со сто раз в течение многих месяцев и с тем, что мне удалось сожрать, я наконец могу прочитать карту памяти SLE4442. Но для жизни я не могу писать на работу.
Я не буду публиковать весь код в этом первом сообщении (если нужно, я могу сделать это позже или предоставить ссылку на исходный код). Но я опишу основные этапы.
1) SCardEstablishContext
2) Получить имя читателя через SCardListReaders
3) SCardConnect
4) Прочитайте всю память с помощью SCardTransmit и APDU new byte [] {0xFF, 0xB0, 0, 0, 0};
5) Подтвердите вывод с новым байтом SCardTransmit и APDU [] {0xFF, 0x20, 0, 0, 3, 0xFF, 0xFF, 0xFF}; (Обратите внимание, что это возвращает 0x90; 0x00 в качестве ответа, что означает, что проверка должна была быть успешной)
6) Попробуйте написать с помощью ScardTransmit и APDU new byte [] {0xFF, 0xD6, 0, 0, 50, 1}; (попробуйте записать значение 1 в ячейку памяти 50). Я также попытался использовать APDU с первым параметром 0x00 и/или вторым байтом 0xD0. Ответ никогда не был 0x90, 0x00, поэтому я предполагаю, что во время записи есть ошибка, но я не смог найти никакого смысла для возвращаемых кодов ошибок.
Поскольку я могу читать карту памяти с помощью WinSCard API, тогда ее можно также записать в одну (боковая записка - карта памяти, в которую я пытаюсь писать, находится в рабочем состоянии, у меня нет заблокировали их, не проверив PIN-код 3 раза).
1) Возможно, запись команды APDU неверна. Может быть, байт инструкции (второй байт) неверен, или в ячейке памяти используется какая-то расширенная схема кодирования.
2) Возможно, команда проверки фактически не проверила. Как и в самой команде, все хорошо, поэтому 0x90 был возвращен, но я должен сначала вызвать или настроить.
3) Просто догадайтесь, но я думаю, что это настоящий преступник. В то время как googling я нашел некоторые неопределенные ссылки на необходимость вызова метода SCardControl с параметром IOCTL_SMARTCARD_SET_CARD_TYPE и установки типа карты на SLE4442. Но снова никаких рабочих примеров нигде и мое пробное тестирование не привело к сбоям. Я получил: "Один или несколько из представленных параметров не могут быть правильно интерпретированы". и некоторые другие сообщения об ошибках, не могут вспомнить, кем они были. Предполагая, что код, который я скопировал в код google, имеет правильные описания кодов ошибок.
Мне нужно, чтобы кто-то опубликовал или направил меня на сайт с полным + рабочим кодом в С# для чтения/записи SLE4442 с использованием WinSCard API, и он должен работать как в 32-битной, так и в 64-разрядной среде. Код не должен быть надежным - например. обрабатывая все возможные ошибки. Я должен сам это сделать. Но если это так (включая описания результатов команды APDU - например, 0x90; 0x00 - успех, но 0x6B; 0x4D - это... и т.д.), То все лучше.
APDU для записи на карту в вашем примере должен быть:
FF D6 00 50 01 01
Наш терминал Omniey (3121) прекрасно пишет данные на SLE4442/SLE4442, попробуйте этот APDU: FF D6 00 04 10 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E AA смотрите также: http://acs.com.hk/drivers/eng/API_ACR122U.pdf, глава 5.4
FF, D2,00,01,03,01,02,03 (новый контакт = 1,2,3) не работает (также после проверки существующего PIN-кода: 6D, 00, FF, 20,00,00 03, FF, FF, FF) - Он возвращает код ошибки 6D00.
Для нас (пока) не огромная проблема, так как мы кодируем наши карты сейчас с терминалом Xiring XiMax (программируемый терминал с собственным SDK, терминал может хранить данные во флэш-памяти). Однако нам нужно найти решение в ближайшее время. Меня интересуют ваши (будущие) выводы. У вас есть SDK Omnikey? Мы можем отправить вам рабочие примеры на С++, которые могут изменять PSC (pin) и данные на картах SLE4442/5542.
На этой неделе (так что не завтра, как уже говорилось ранее, у нас много чего происходит и постоянно), мы проверим рабочий код с Omnikey 1021). Надеюсь помочь вам.
У нас всегда есть 50+ читателей Omnikey 3121 на складе, и мы можем предложить вам эти (1+) цены на дачу. Дайте знать, если вас это заинтересовало. Меня также интересует, где вы находитесь и какие приложения вы разрабатываете.