Модераторы: AntonSaburov
  

Поиск:

Добавить материал
 

PC\SC - Интерфейс между PC и смарт картой
firstone
Репутация: 5
Всего: 7

Профиль
Быстрая цитата Цитата
Теги:
PC\SC - Интерфейс между PC и смарт картой

Общие сведения.
Для того, чтобы обеспечить простой и понятный интерфейс между персональным компьютером и смарт картой был разработан стандарт PC/SC (Personal Computer - Smart Card). В частности этот стандарт определяет прозрачный интерфейс между приложением на PC и смарт картой. Совершенно неважно какой именно ридер (считывающее устройство) и через какой порт он подключен к Вашему компьютеру, Вы можете посылать данные прямиком на карту не заботясь о протоколах между ридером и компьютером и между ридером и смарт картой. Это существенно упрощает работу. Кроме этого, PCSC имеет возможность сообщить Вам когда и на каком ридере произошло какое либо событие, например: карта была удалена из устройства или наоборот вставлена, ошибки и сбои в передачи данных.

Стандарт PCSC поддерживается практически всеми операционными системами. В ос Windows реализация PCSC представлена библиотекой winscard.dll. В ос Linux PCSC представлен опциональным пакетом pcsc-lite. Для Java разработан специальный фреймворк jPCSC.

Спецификация
Как и стандарты ISO стандарт PCSC разбит на разделы:
Часть 1: Введение и обзор архитектуры
Часть 2: Требования к интерфейсу совместимых карт и ридеров
Часть 3: Требования для устройств соединяющихся с ПК
Часть 4: Обсуждение дизайна считывающих устройств
Часть 5: Определение мэнеджера ICC ресурсов (ICC = Integrated Circuit Card или Integrated Chip Card, т.е. смарт карта)
Часть 6: Определение интерфейса ICC Service Provider'а
Часть 7: Application Domain/Developer Design Considerations    
Часть 8: Рекомендации для безопасности карт и устройств секретности
Часть 9: Ридеры с расширенными возможностями
Часть 10: Ридеры с возможностью Secure Pin Entry

В отличии от ISO, PCSC - открытый стандарт и доступен для скачивания с сайта организации PCSCWorkGroup (см. Ссылки (1)).

Больше всего нас интересует пятая часть спецификации. Именно в ней определены все функции PCSC-интерфейса. Далее мы рассмотрим основные функции для работы со смарт картами (хотя в самой спецификации вы можете найти также функции для работы с ридерами).

Архитектура и функциональность.
Полностью дизайн архитектуры мы затрагивать не будем, так как это иррелевантно для нас. Единственное, что необходимо уяснить - это как хранятся данные о ридерах и смарт картах в самой системе. И так, вся функциональность обеспечивается за счет:
  • Главного объекта управления ресурсами (ResourceManager),
  • Базы данных ридеров и смарт карт известных системе т.е. подключенных к ней (ResourceDB), 
  • Дополнительного объекта позволяющего производить выборку из этой базы данных (ResourceQuery),
  • Объекта позволяющего следить за событиями относящимся к смарт карте (SCardTrack),
  • Объекта предоставляющего интерфейс для передачи и принятия данных со смарт карты (SCardComm),
Интерфейс многих функций немного отличается от интерфейса определенным в MSDN и pcsc-lite. Это объясняется тем, что в реальном мире могут быть получены множественные контексты (handles - см. ниже) привязанные к ResourceManager`у, и поэтому необходимо передать их в качестве параметров соответствующие функции. Это необходимо системе, чтобы знать в каком именно контексте будут выполнены функции PCSC. Еще один фактор влияющий на тип и количество параметров - операционная система и язык программирования. Так, в C/C++ наряду с массивами должны быть переданы в функцию и длины этих массивов, а если параметры являются OUT-параметрами, то и получены. Для удобства я привел рядом с каждой функцией ссылку на ее определение в MSDN. Для C#-программистов я приложил файл, который импортирует все необходимые P/Invoke методы и определяет нужные константы.
 
Константы и определения типов:
RESPONSECODE - код возврата из всех PCSC-функций. Коды и их значения смотрите в ссылке 4.

Функции ResourceManager`а:
Для того, чтобы выполнить какую-либо операцию необходимо заведомо получить контекст для ResourceManager`a, который будет использован. Без этого контекста (проще говоря - handle) работа с PCSC невозможна.

Цитата

RESPONSECODE EstablishContext (
IN DWORD Scope, // A scope indicator 
IN DWORD Reserved1, // Reserved for future use to allow privileged
// administrative programs to act on behalf of another user

IN DWORD Reserved2 // Reserved for future use to allow privileged
// administrative programs to act on behalf ofanother terminal

)


Устанавливает и возвращает новый контекст - handle на объект ResourceManager.
Параметры:

Scope - определяет область активности handle`a, Могут быть переданы следующие константы (реальные значения этих констант могут варьироваться в зависимости от среды):
SCARD_SCOPE_USER = 0x00000000
Все операции с базой данных выполняются в сфере пользователя.

SCARD_SCOPE_TERMINAL = 0x00000001
Операции с базой данных выполняются на уровне всего терминала (т.е. компьютера, например)

SCARD_SCOPE_SYSTEM = 0x00000002
Операции выполняются на уровне всей системы.

Reserved1,
Reserved2
 - Зарезервированы для будующего использования и должны быть равны нулю.

MSDN:SCardEstablishContext

Цитата

RESPONSECODE ReleaseContext()


Освобождает ранее выделенный handle (контекст) функцией EstablishContext.

MSDN: SCardReleaseContext

Функции ResourceDB нас не будут особо интересовать. Если вы все же хотите с ними ознакомиться, зайдите на следующую страничку: Smart Card Database Management Functions

Из функций ResourceQuery нам будет нужна только одна функция - ListReaders, которая позволяет получить список имен всех подключенных ридеров. Имя ридера необходимо для того, чтобы подключить смарт карту через PCSC.

Цитата

RESPONSECODE ListReaders(
IN STR[] Groups // Array of strings containing Group names of interest
OUT STR[] Readers // Array of strings containing Readers within the Groups
)


Параметры:
Groups - содержит список названий групп, ридеры которых необходимо вернуть. В базе данных ресурсов (ResourceDB) наряду с ридерами хранятся еще и группы. Каждый ридер может быть ассоциирован с несколькими группами а каждая группа идентифицируется уникальным текстовым именем (впрочем, как и ридер). Я еще никогда не прибегал к использованию этого параметра, и всегда передавал NULL в этом параметре, что означает - вернуть список ридеров всех групп без повторений.
Readers - этот OUT-параметр будет содержать указатель на список наименований ридеров, установленных в системе.

MSDN: SCardListReaders

Функции SCardTrack-а. 
Как я упомянул выше, класс SCardTrack позволяет программе получать оповещения о каком-либо событии, например: установка соединения со смарт картой и его потеря, нахождение определенной смарт карты с заданным ATR (Answer To Reset - см. ISO/IEC 7816-4) и т.д. Мне приходилось писать средства мониторинга смарт карт и поэтому я не раз прибегал к использованию функционала этого класса. И так, разберем наиболее полезные функции.

Цитата

RESPONSECODE GetStatusChange(
IN OUT SCARD_READERSTATE[] ReaderStates // Array of READERSTATE structures for readers of interest
IN DWORD Timeout // Time-out value in milliseconds
)

Параметры:
ReaderStates - массив структур SCARD_READERSTATE, каждая из которых содержит предыдущее состояние ридера (до вероятного изменения) и текущее состояние ридера.
Timeout - таймаут в течении которого производится мониторинг заданных ридеров.

Функция возвращает значение либо в случае события на одном из заданных ридеров либо по истечении заданного тайм-аута.

Структура SCARD_READERSTATE имеет следующий вид:

Цитата

structure {
STR Reader; // reader name
VOID UserData; // user defined data
DWORD CurrentState; // current state of reader at time of call
DWORD EventState; // state of reader after state change
SCARD_READERSTATE;


Нас интересуют прежде всего вот эти поля:
Reader - имя ридера, на котором зарегестрировано изменение состояния
CurrentState - предыдущее сотояние ридера
EventState - новое состояние ридера.

Предыдущее и новое состояния ридера могут включать в себя следующие флаги:
Цитата

SCARD_STATE_UNAWARE - приложению неважно текущее состояние. Все биты равны нулю.
SCARD_STATE_IGNORE - этот ридер игнорируется приложением.
SCARD_STATE_UNAVAILABLE - приложение полагает, что этот ридер недоступен.
SCARD_STATE_EMPTY - нет карточки в ридере (для контактных карт) или она вне поля досягаемости антенны ридера (для бесконтактных карт).
SCARD_STATE_PRESENT - карточка присутствует.
SCARD_STATE_ATRMATCH - присутствует карточка с заранее заданным ATR - Answer To Reset (см. статью ATR). 
SСАD_STATE_EXCLUSIVE - карточка присутствует, но блокирована другим приложением.
SCARD_STATE_INUSE - карточка присутствует и другое приложение работает с ней, тем не менее наше приложение тоже может с ней работать.


MSDN: SCARD_READERSTATE Structure
MSDN: SCardGetStatusChange

Цитата

RESPONSECODE Cancel()

Этот метод отменяет все операции мониторинга (в частности работу функции GetStatusChange).

MSDN: SCardCancel


Функции SCardComm - пересылка данных на карту и получение данных от карты.

Цитата

RESPONSECODE Connect(
IN STR ReaderName // Friendly name for a Reader
IN DWORD Flags // Desired access mode information
IN DWORD PreferredProtocols // Card communications protocols that may be used
OUT DWORD ActiveProtocol // Protocol actually in use
)

Метод Connect устонавливает связь со смарт картой. Вызов этого метода обязателен для работы со смарт картой.
Параметры:
ReaderName - имя ридера где присутствует карта. Может быть получено вызовом ListReaders.
Flags - задает режим доступа к карте: 
эксклюзивный (SCARD_SHARE_EXCLUSIVE) - только текущее приложение имеет доступ к карте, 
общий (SCARD_SHARE_SHARED) - другие приложения могут иметь доступ к карте,
прямой (SCARD_SHARE_DIRECT) - прямой доступ к ридеру вне зависимости от того есть ли в нем карта или нет.
PreferredProtocols - предпочитаемые протоколы для связи с картой (см. "Протоколы Т0 и Т1"):
Т0 (SCARD_PROTOCOL_T0)
Т1 (SCARD_PROTOCOL_T1)
Лучше всегда задавать оба протокола. В этом случает система сама выберет нужный.

ActiveProtocol - Возвращаемое значение - выбранный протокол для связи.

MSDN: SCardConnect

Цитата

RESPONSECODE Disconnect(
IN DWORD Disposition // Desired Card disposition action
)

Закрывает доступ к карточке. Последующие операции ввода/вывода не возможны.
Параметры:
Disposition - действие при отключении от карты:
SCARD_LEAVE_CARD - оставить карту в ридере и не предпринимать никаких действий
SCARD_RESET_CARD - выполнить reset (сброс)
SCARD_UNPOWER_CARD - отключить питание карты
SCARD_EJECT_CARD - вытащить карту из ридера (ридер должен иметь соответствующий механизм)
Есть еще режим для конфискации карты, но он почему-то не поддерживается WinAPI.

MSDN: SCardDisconnect

Цитата

RESPONSECODE Transmit(
IN SCARD_IO_HEADER SendPci // Send protocol structure
IN BYTE[] SendBuffer // Data buffer for send data
IN OUT SCARD_IO_HEADER RecvPci // Receive protocol structure
IN OUT BYTE[] RecvBuffer // Data buffer for receive data
OUT DWORD RecvLength // Length of received data
)

А это самая главная функция. Ее задача - переслать на карту данные и получить ответ.
Параметры:
SendPci - структура содержащая информацию о протоколе для пересылки. Эта структура имеет следующие поля:
Цитата

structure {
DWORD Protocol; // код протокола (Т0 или Т1)
DWORD Length; // длина этой структуры в байтах
SCARD_IO_HEADER;

SendBuffer - содержит данные, которые нужно послать на карту
RecvPci - содержит протокол для принятия данных с карты.
RecvBuffer - содержит данные полученные с карты. 
RecvLength - длина RecvBuffer на входе/количество байт полученных с карты на выходе.

Я на самом деле не понимаю почему нельзя былo сделать эту функцию попроще (убрать эти структуры). Из своего опыта я могу заключить, что если пересылать вместо параметров SendPci и RecvPci нули (т.е. NULL), то все прекрасно работает.

MSDN: SCardTransmit

Библиография:
1) Interoperability Specification for ICCs and Personal Computer Systems (Part 5. ICC Resource Manager Definition)

Ссылки:
1) Страница Download спецификации PCSC
2) winscard.h
3) winsmcrd.h
4) scarderr.h


user posted image



Это сообщение отредактировал(а) firstone - 28.2.2008, 18:49
  
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java Card | Следующая тема »


 




[ Время генерации скрипта: 0.0652 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.