您的位置:首页 > 其它

PC/SC简介以及相关开发

2013-09-04 14:28 267 查看
一、PC/SC规范介绍

PC/SC规范由微软公司与世界其它著名的智能卡厂商组成的PC/SC工作组提出的。PC/SC规范是一个基于WINDOWS平台的一个标准用户接口(API),提供了一个从个人电脑(Personal Computer)到智能卡(SmartCard)的整合环境,虽然到目前为止,WONDOWS是唯一支持PC/SC标准的操作系统平台,但由于WINDOWS的影响力,PC/SC规范也为智能卡业界所接收。到目前为止,PC/SC规范的最新版本是PC/SC Specifications 1.0。

PC/SC规范建立在工业标准ISO7816EMV标准的基础上,但它对底层的设备接口和独立于设备的应用API接口(例如用来允许多个应用共享使用系统同一张智能卡的资源管理器)做了更详尽的补充。它的提出主要是为了达到以下目标:

1)、遵从现在ICC和PC的标准并在适当的地方予在扩充
2)、跨平台的可操作性,使该规范可在多种硬件和软件平台上实现
3)、应用程序可以采用不同厂商提供的产品(独立于厂商)
4)、建立应用级的智能卡服务接口,推广ICC在PC上的应用,并促成PC采用ICC作主标准设备。

二、PC/SC的体系结构

PC/SC体系由三个主要部件组成,分别规定的操作系统厂商、读写器(IFD)厂商、智能卡(ICC)厂商的职责。
1). IFD
(即读写器)控制器是由IFD厂商提供的可安装部件。
2). Resource manager(资源管理器)使用Win32API函数实现,是由操作系统厂商提供的系统级部件。
3). Service Providers(服务提供者),服务程序是由厂商提供的可安装部件,用于提供访问特殊服务的手段,其使用的是基本COM的界面方式。

三、PC/SC的API函数使用方法
PC/SC的API包含30多个以Scard为前缀的函数,所有函数的原型都在winscard.h中声明,应用程序需要包含winscard.lib,所有函数的正常返回值都是SCARD_S_SUCCESS。在这30多个函数中,常用的函数只有几个,下面将详细介绍这些常用函数。

1、函数ScardEstablishContext()
用于建立将在其中进行设备数据库操作的资源管理器上下文
函数原型:
LONG SCardEstablishContext(DWORD dwScope, LPCVOID pvReserved1, LPCVOID pvReserved2, LPSCARDCONTEXT phContext);

参数含义:

输入参数:
dwScope:表示资源管理器上下文范围,取值为:SCARD_SCOPE_USER(在用户域中完成设备数据库操作)、SCARD_SCOPE_SYSTEM(在系统域中完成设备数据库操作)。要求应用程序具有相应的操作权限。
pvReserved1:保留,必须为NULL。
pvReserved2:保留,必须为NULL。
输出参数:
phContext:输出类型;建立的资源管理器上下文的句柄。

2、函数ScardListReaders()
可以列出系统中安装的读卡器的名字,获得系统中安装的读卡器列表

函数原型:
LONG SCardListReaders(SCARDCONTEXT hContext, LPCTSTR mszGroups, LPTSTR mszReaders, LPDWORD pcchReaders);

参数含义:
输入参数:
hContext:ScardEstablishContext()建立的资源管理器上下文的句柄,不能为NULL。
mszGroups:读卡器组名,为NULL时,表示列出所有读卡器。
输出参数:
mszReaders:系统中安装的读卡器的名字,各个名字之间用’\0’分隔,最后一个名字后面为两个连续的’\0’。
pcchReaders:输入输出类型;mszReaders的长度。

3、函数ScardConnect()
在应用程序与读卡器上的智能卡之间建立一个连接。
函数原型:
LONG SCardConnect(SCARDCONTEXT hContext, LPCTSTR szReader, DWORD dwShareMode, DWORD dwPreferredProtocols, LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol);

参数含义:
输入参数:
hContext:ScardEstablishContext()建立的资源管理器上下文的句柄。
szReader:包含智能卡的读卡器名称(读卡器名称由ScardListReaders()给出)。
dwShareMode:应用程序对智能卡的操作方式,SCARD_SHARE_SHARED(多个应用共享同一个智能卡)、SCARD_SHARE_EXCLUSIVE(应用独占智能卡)、SCARD_SHARE_DIRECT(应用将智能卡作为私有用途,直接操纵智能卡,不允许其它应用访问智能卡)。
dwPreferredProtocols:连接使用的协议,SCARD_PROTOCOL_T0(使用T=0协议)、SCARD_PROTOCOL_T1(使用T=1协议)。
输出参数:
phCard:与智能卡连接的句柄。
PdwActiveProtocol:实际使用的协议。

4、函数SCardTransmit()
向智能卡发送指令,并接受返回的数据。
函数原型:
LONG SCardTransmit(SCARDHANDLE hCard, LPCSCARD_I0_REQUEST pioSendPci, LPCBYTE pbSendBuffer, DWORD cbSendLength, LPSCARD_IO_REQUEST pioRecvPci, LPBYTE pbRecvBuffer, LPDWORD pcbRecvLength);
参数含义:
输入参数:
hCard:与智能卡连接的句柄。
pioSendPci:指令的协议头结构的指针,由SCARD_IO_REQUEST结构定义。后面是使用的协议的协议控制信息。一般使用系统定义的结构,SCARD_PCI_T0(T=0协议)、 SCARD_PCI_T1(T=1协议)、SCARD_PCI_RAW(原始协议)。
pbSendBuffer:要发送到智能卡的数据的指针。
cbSendLength:输入类型;pbSendBuffer的字节数目。
pioRecvPci:输入输出类型;指令协议头结构的指针,后面是使用的协议的协议控制信息,如果不返回协议控制信息,可以为NULL。
输出参数:
pbRecvBuffer:输入输出类型;从智能卡返回的数据的指针。
pcbRecvLength:输入输出类型;pbRecvBuffer的大小和实际大小。

5、函数ScardDisconnect()
断开与读卡器(智能卡)的连接。
函数原型:
LONG SCardDisconnect(SCARDHANDLE hCard, DWORD dwDisposition);
参数含义:
输入参数:
hCard:与智能卡连接的句柄。
dwDisposition:断开连接时,对智能卡的操作,SCARD_LEAVE_CARD(不做任何操作)、SCARD_RESET_CARD(复位智能卡)、SCARD_UNPOWER_CARD(给智能卡掉电)、SCARD_EJECT_CARD(弹出智能卡)。

6、函数ScardReleaseContext()
释放资源管理上下文
函数原型:
LONG SCardReleaseContext(SCARDCONTEXT hContext);
参数含义:
输入参数:
hContext:ScardEstablishContext()建立的资源管理器上下文的句柄,不能为NULL。

7、函数SCardStatus()
取得卡片的状态
函数原型:
LONG SCardStatus( SCARDHANDLE hCard, LPTSTR szReaderName, LPDWORD pcchReaderLen, LPDWORD pdwState, LPDWORD pdwProtocol, LPBYTE pbAtr, LPDWORD pbcAtrLen );
参数含义:
输入参数:
hCard:与智能卡连接的句柄。
输出参数:
szReaderName:PC/SC读卡器名称
pcchReaderLen:读卡器长度
pdwState:卡片状态
pdwProtocol:连接使用的协议
pbAtr:ATR值指针
pbcAtrLen:ATR值长度
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐