| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java Card > Проблема с дуплексным режимом |
| Автор: romul 31.3.2008, 13:49 |
| Доброе время суток. Есть проблема с обновременным получением/передачей данных за один вызов функции SCardTransmit. Есть апплет написаный мною для карточки. Есть Java клиент (опять же мой), который вполне нормально работает с карточкой в любом режиме. Принимает и получает данные. Но когда я воспользовался функцией SCardTransmit из winscard.dll, то она мне вернула "error 87". Если я вызываю функцию апплета которая только читает данные но не возвращает в буфер, все ок - 90 00. Если функцию апплета которая только возвращает данные (в буфер ничего не ложу), тоже 90 00. Как только функция апплета использует буфер и для приема и для передачи - 87 error. В апплете используются самые примитивные функции получения /отдачи данных? и к тому же они отлизаны с помощью Java клиента. На них не приходится "грешить". Единственный момент в котором может быть трабла, SCardTransmit вызывается из дельфового компонента. Но на первый взгляд реализация вызова внушает доверие. Пока даже не знаю куда копать. Может быть кто-то сталкивался с такой проблемой? Я понимаю, что вопрос на совсем по Java, но точно по Java Card-ам :) (Прошу прощенья за дубль темы. Глючил браузер) |
| Автор: firstone 1.4.2008, 13:14 |
| Это не ошибка класса SCARD_ERROR. Первое, что нужно проверить, является ли эта ошибка производной 6A87 (если конечно 87 в шестнадцатиричной системе). T.e. incorrect parameters (см. таблицу кодов ISO/IEC 7816 например здесь: http://forum.vingrad.ru/articles/topic-192153/unread-1/kw-смарт-карта-smart-card-iso.html) Второе, используете ли Вы какие-либо крипто функции в самом апплете при обработке APDU? Вы можете опубликовать здесь trace log посланных APDU? Если это возможно, скопируйте сюда код который работает с буфером. |
| Автор: firstone 1.4.2008, 13:49 | ||
Вот пример того, как происходит считывание из буфера и запись в него. Может будет helpful:
|
| Автор: romul 1.4.2008, 15:25 | ||||||||
| В отдельных функциях я использую криптофункции. Но в случае моего теста я упростил все до минимума. Вот кусочек апплета
Вот trace log из клиента Java: Видно что команды нормально отрабатывают:
А вот trace log из клиента Delphi:
Казалось бы виноват Делфи компонент который рулит SCardTransmit из dll. Но ведь он и отправляет и получает данные командами 1A и 1B. Когда идет обмед данными в одну сторону. Но в случае когда обмен данными идет в обе стороны напрочь отказывается работать. Возможно я не учитываю какую-то особенность работы с карточкой или с мелкософтовской библиотечкой winscard.dll для работы PS/CS... Попытки чего-то изменить методом нацчного тыка в компоненте не привели ни к чему хорошему Вот кстати вызов функции в компоненте, несколько мной упрощенный для форума:
|
| Автор: romul 2.4.2008, 14:48 |
| Я слишком много вывалил? |
| Автор: romul 2.4.2008, 15:41 |
| Народ, хелп плиз! Скажите хотябы где спросить можно. Форум, контакт. Или где почитать. У меня проект стал :( |
| Автор: romul 2.4.2008, 18:18 | ||
Спасибо, так и сделаю. |
| Автор: firstone 6.4.2008, 15:23 |
| Извиняюсь за поздний ответ. Только чтo запустил Ваш апплет на карте. И все работает. Клиент я написал сам. Использовал windows PC/SC. Видимо Ваш клиент работает неправильно. К сожалению сказать где именно ошибка в клиенте невозможно за неимением егo кода. Предлагаю залогить вызовы PC/SC функций (с параметрами) и опубликовать лог здесь. Если нужен работающий PC/SC framework на .NET, я могу Вам послать. С уважением, firstone. |
| Автор: romul 7.4.2008, 11:01 | ||||
| Спасибо за ответ. То, что с клиентом не так это 100%, поскольку работающий клиент на Java обменивается данными на ура. Наиболее важную часть своего клиента я в большом своем письме привел самым последним. Но чтобы не мотать туда-сюда страничку повторю и добавлю подробности: Это функция вызывающая SCardTransmit из MS-овской библиотечки winscard.dll для работы PS/CS.
Вызываю ее со следущими строками (Send мой запрос, Responce получаемый ответ):
К сообщению прикрепляю полный код клиента и компонента для работы с библиотечкой. |
| Автор: firstone 7.4.2008, 13:24 | ||
Странно. У меня Ваш клиент работает:
Добавлено через 10 минут и 26 секунд Каким ридером Вы пользуетесь? |
| Автор: romul 7.4.2008, 14:32 | ||||
Это хорошая новость!
А это хорошая мысль. Зря я ее отгонял так далеко от себя. Smart Card Reader ACR38T. Вроди бы китайский какой-то. Попробую другие использовать. |
| Автор: romul 7.4.2008, 17:01 |
| Попробовал 3 разных кардридера от 2 производителя. Попробовал 2 разных карточки разных производителя. Эффект тот же. Очень странно. |
| Автор: firstone 7.4.2008, 17:52 |
| Попробуйте на другом компьютере. |
| Автор: romul 8.4.2008, 10:07 |
| Не работает на 3-х компьютерах. Эксперименты продолжаю. Наверно легче убить "сибя ап стенку", чем заставить ее заработать. А каким ридером пользуетесь Вы? И что у вас за карточка на которой эксперимент был удачным? И на какой оси пробовали? |
| Автор: firstone 8.4.2008, 11:24 |
| Да Действительно странно... У меня Omnikey CardMan 5321 ридер. Кстати очень рекомендую заиметь такой. ОС: WinXP Карта от Athena Добавлено через 7 минут и 49 секунд Ваше приложение написано на Object Paskal для .NET? |
| Автор: romul 8.4.2008, 12:39 |
| Клиент был написан для Turbo Delphi под Win32. Но код неспецифичен и довольно легко переносится куда угодно. Есть еще одно предположение. Возможно дело в скомпилированном cap файле. Я использовал Eclipse Version: 3.3.1.1 + plugin IBM JCOP Tools 3.1.1.b. Может быть cap file кривой? А чем компилировали Вы? Может быть Вы можете выслать мне мылом ваш cap file? |
| Автор: firstone 8.4.2008, 13:11 |
| Да. Как-то я не подумал об этом. Хорошая идея. Вот мой CAP. |
| Автор: romul 8.4.2008, 14:38 |
| Я использую для upload JCOPTools22 cardman.exe. Он требует для upload - X.cab и возможно X.exp X.props. При попытке upload Вашего cab файла утиль кричит "Header component corrupted". Чем Вы делаете upload? Какие файлы кроме .cab генеряться для upload-а? |
| Автор: firstone 8.4.2008, 15:40 |
| Eclipse 3.1.2 JCOP Tools: 3.1.1.b Видимо версия не совпадает. Генерятся еще 2 файла: .exp & .props Но для загрузки они не нужны. Мой клиент спокойно грузит на карту только .cap Какой версии Ваши Java Card? |
| Автор: romul 8.4.2008, 17:26 |
| Есть 2.X, есть 3.0. C загрузчиком пока непонятки. А есть у Вас загрузчик как отдельное приложение. Чтобы грузить не из Eclipse? Если есть можно его намылить? |
| Автор: firstone 9.4.2008, 11:41 |
| Послал. Пожалуйста обратите внимание на то, что я написал Вам в личку. |
| Автор: romul 22.5.2008, 10:06 |
| Когда докапываешься до ответа на вопрос, почему-то всегда стыдно, что не дошел до этого раньше. В настройках карты можно указать режим ответа. В одном из них карта возвращает специальный код + длину данных. После этого нужно вычитать остальные данные. Но для SELECT-а этот вариант не проходит например. Причем такой метод вычитки понадобился именно для "дуплексного режима". В драйвере присутствовало 2 функции. Одна делала вычитку обычным способом, другая проверяла ответ на наличие "извращенного". Я же в своем стремлении к универсализации использовал только первую. В некоторых случаях это проходило (в зависимости от настроек карты), в некоторых нет. Посему отловить причину бага сразу не удалось. Помогла трассировка драйвера. Отдельная большая благодарность http://forum.vingrad.ru/act-ST/f-485/t-203671.html# за терпение в помощи решения проблемы. |
| Автор: firstone 22.5.2008, 10:27 |
| romul, Я рад, что все разрешилось. Как видно, проблема была совсем нетривиальна и Вы все же с ней справились! Будем Вам очень рады, если вы заглянете еще раз. |
| Автор: foxsik 15.4.2009, 14:17 |
| Vsem zdrasti ! U menja takaja problemma ! Rabotaju s readerom.... pishu programmu na delphi Da vot odna stroka ne dajot spat` spokojno....... label2.caption := Bin2HexExt(pcsc.GetResponseFromCard(Hex2Bin('FF00000004D44A0100')), true, true); label2.caption := Bin2HexExt(pcsc.GetResponseFromCard(Hex2Bin('FFC000000E')), true, true); Poka k readeru ne podnesjo6 karto4ku programma visit.... :( ktonebut` znaet kak s etim barotsja ? |
| Автор: neutrino 23.6.2009, 16:38 |
| Дело в том, что не зная как работает класс pcsc невозможно ответить на Ваш вопрос. Два совета: 1) Создайте отдельную тему 2) Хотя бы опишите в общих чертах как работает класс pcsc. Судя по названию это какой-то враппер для PC/SC WinAPI, приведите список его методов. 3) Когда подносят карту к ридеру (я так понимаю у вас бесконтактные ридер и карта - ISO/IEC 13334), то PC/SC WinAPI вызывает специальное событие. Было бы неплохо увидеть всю актуальную для работы с pcsc часть кода... |
| Автор: mobilka 25.10.2010, 14:44 | ||
подскажи как подключиться к этому ридеру? PCSCLink.Close; PCSCLink.Init; pcsclink.UseReaderNum:=0; pcsclink.Connect; PCSCLink : TPCSCConnector; |
| Автор: neutrino 25.10.2010, 16:07 |
| mobilka, Что такое PCSCLink(TPCSCConnector)? Я коннектился с помощью своего враппера для PCSC. |
| Автор: mobilka 25.10.2010, 16:41 | ||||
а что это и где взять? Добавлено через 4 минуты и 44 секунды вообщем к USB FT SCR 2000 я подключаюсь через этот компонент без проблем. а к Smart Card Reader USB Omnikey CardMan 1021 не могу |
| Автор: neutrino 25.10.2010, 17:40 |
| Заметь, у тебя другая модель. У меня была 5321. Я сам этот враппер написал. Поищу дома если найду кину тебе. |
| Автор: mobilka 25.10.2010, 18:11 |
| я уже разобрался спасибо. все ридеры в системе убил и начала соединяться. но если кинешь не откажусь |
| Автор: miheevnik 18.3.2011, 15:39 |
| Мне тоже помогли ваши рекомендации. Спасибо за объяснения! |
| Автор: hokop 8.4.2011, 10:38 | ||||
Ты потом отпиши, все узнал? |