智能卡接口的编程
- 格式:doc
- 大小:66.50 KB
- 文档页数:7
pkcs11 卡内密钥运算-回复PKCS11是一种应用程序接口(API),用于访问安全模块(如智能卡或USB令牌)中的密钥和其他密码学功能。
PKCS11卡内密钥运算是利用PKCS11接口对于智能卡或USB令牌内部密钥进行计算操作的一种方法。
本文将一步一步介绍PKCS11卡内密钥运算的原理和步骤。
第一步,初始化PKCS11库。
运行PKCS11卡内密钥运算之前,需要先初始化PKCS11库。
这可以通过调用PKCS11提供的初始化函数来实现。
初始化函数会加载PKCS11库并准备好后续的操作。
第二步,登录到智能卡或USB令牌。
登录即是向智能卡或USB令牌进行身份验证,确保用户具备执行卡内密钥运算的权限。
登录函数需要提供访问智能卡或USB令牌的用户PIN码或其他安全凭证。
登录成功后,用户可以进行卡内密钥运算操作。
第三步,查找密钥对象。
在进行卡内密钥运算之前,需要先获得待使用的密钥的句柄。
通过PKCS11提供的函数可以根据密钥标签、密钥类型等相关信息进行搜索,并获得对应的密钥句柄。
密钥句柄是密钥在智能卡或USB令牌中的唯一标识符。
第四步,开启卡内密钥运算会话。
为了执行卡内密钥运算,需要创建一个会话对象。
会话对象可以通过调用PKCS11提供的函数来创建。
在创建会话对象时,需要指定会话类型、读写权限等参数。
第五步,引入卡内密钥到会话。
在会话中引入卡内密钥是指将步骤三中获得的密钥句柄加载到会话中,以供后续的卡内密钥运算操作。
通过调用PKCS11提供的函数,可以将密钥句柄加载到会话中。
第六步,进行卡内密钥运算。
卡内密钥运算可以是对称加密算法(如AES、DES等)的加密或解密操作,也可以是非对称加密算法(如RSA、椭圆曲线加密等)的签名或验证操作。
根据具体的密钥类型和运算需求,调用PKCS11提供的函数执行卡内密钥运算。
运算的输入和输出数据都是通过会话对象进行传递。
第七步,关闭会话和登出。
在卡内密钥运算完成后,应关闭会话对象,并登出智能卡或USB令牌。
第二部分行业间交换命令目录1范围 (3)2参考文件 (3)3定义 (3)4缩略语和记号 (5)5基本组织结构 (5)5.2 卡的安全体系结构 (9)5.3 APDU报文结构 (11)5.4 命令首标、数据字段和响应尾标用的编码约定 (13)5.5 逻辑信道 (18)5.6 安全报文交换 (19)6基本的行业间命令 (23)6.1 READ BINARY命令 (23)6.2 WRITE BINARY命令 (24)6.3 UPDATE BINARY命令 (25)6.4 ERASE BINARY命令 (26)6.5 READ RECORD命令 (27)6.6 WRITE RECORD命令 (29)6.7 APPEND RECORD命令 (31)6.8 UPDATE RECORD命令 (32)6.9 GET DATA 命令 (33)6.10 PUT DATA 命令 (35)6.11 SELECT FILE 命令 (36)6.12 VERIFY 命令 (38)6.13 INTERNAL AUTHENTICATE 命令 (39)6.14 EXTERNAL AUTHENTICATE 命令 (40)6.15 GET CHALLENGE命令 (42)6.16 MANAGE CHANNEL命令 (42)7面向传输的行业间命令 (43)7.1 GET RESPONSE 命令 (43)7.2 ENVELOPE 命令 (44)8历史字节 (45)9与应用无关的卡服务 (49)通过T=0传输APDU报文 (52)通过T=1传输APDU报文 (57)1 范围本规范规定了:——由接口设备至卡以及相反方向所发送的报文、命令和响应的内容;——在复位应答期间卡所发送的历史字节的结构及内容;——当处理交换用的行业间命令时,在接口处所看到的文件和数据的结构;——访问卡内文件和数据的方法;——定义访问卡内文件和数据的权利的安全体系结构;——安全报文交换的方法;——访问卡所处理算法的方法。
《智能卡技术及应用》实验指导书2015.05实验一存储器卡读写实验一.实验目的I2串行总线的工作原理;1.了解C2.通过实验了解存储器卡存、取数据的过程。
二.实验器材1.KEIL软件;2.PROTEUS仿真软件。
三.实验内容往24C04芯片中写入一个数据(如“129”),然后再从24C04芯片中读出刚才的数据并把它显示在数码管上。
四.实验步骤1.硬件电路仿真使用Proteus软件画出如图1所示的电路图,要求:使用两个按钮来分别模拟读卡和拔卡(清除数据)的过程,用一个发光二极管来模拟卡座上电的过程。
(注:电路图画好后,给存储器24C04导入24C04.bin文件,给51单片机导入hex文件)本次实验用到的元器件名称如下:24C04A,80C51,BUTTON,CAP,CAP-ELEC,CRYSTAL,LED-GREEN,NPN,RESPACK-8,SWITCH,7SEG-MPX4-CA-BLUE图 1 硬件电路图2.软件编写程序编写的思路见图2,请同学们自行完成。
图2 程序流程图3.实验结果刚开始运行时,单片机没有读取任何数据,此时数码管显示数字为0;当“读卡”按钮按下时,此时发光二极管亮,数码管显示预先存入24C04芯片的数值;当“清除”按钮按下时,此时此时发光二极管灭,数码管数值清零。
实验二基本对话框编程实验一、实验目的1、练习VC环境下,工程的创建、编译、调试方法2、掌握基本对话框编程的方法3、理解Windows程序的运行原理二、实验要求编写基本对话框实现计算器的功能,具体可实现两个数的加、减、乘、除等运算。
参考界面如图2所示。
图2 计算器对话框界面三、实验步骤1、建立基于MFC的基本对话框工程;2、删除、添加相关控件,设计软件界面;3、设定控件ID并关联变量;4、向工程添加实现计算器功能的类模版;5、添加消息处理函数;6、编译并运行。
四、实验结果能够正常编译运行的计算器。
实验三非接触式逻辑加密卡(M1卡)读写控制实验(一)一、实验目的1、掌握M!卡的存储结构;2、熟悉数据块操作和值块操作的方法(值块的数据格式);3、掌握第0扇区第一块(即厂商块)的数据格式;4、掌握各扇区密码操作和存取控制原理和方法。
USBCAN-I/II 智能CAN接口卡用户手册V1.2广州周立功单片机发展有限公司2003年11月26日目录一、版权信息-------------------------------------------------------1二、功能特点-------------------------------------------------------1三、硬件参数-------------------------------------------------------13.1外观-------------------------------------------------------13.2参数-------------------------------------------------------13.3软件支持---------------------------------------------------13.4产品清单---------------------------------------------------23.5典型应用---------------------------------------------------2四、设备安装-------------------------------------------------------24.1供电模式---------------------------------------------------24.2 DB9插座引脚----------------------------------------------24.3信号指示灯-------------------------------------------------34.4系统连接---------------------------------------------------44.5驱动程序安装----------------------------------------------4五、常见问题-------------------------------------------------------7六、产品服务-------------------------------------------------------86.1 保修期----------------------------------------------------86.2 保修政策包括的范围---------------------------------------86.3 保修政策不包括的范围-------------------------------------86.4 软件升级--------------------------------------------------86.5 技术支持--------------------------------------------------8附录A、ZLGCAN产品简介-------------------------------------------9 附录B、CAN2.0B协议帧格式-------------------------------------------11 附录C、SJA1000标准波特率----------------------------------------12一、版权信息USBCAN-I/II智能CAN接口卡及相关软件均属广州市周立功单片机发展有限公司所有,其产权受国家法律绝对保护,未经本公司授权,其他公司、单位、代理商及个人不得非法使用和拷贝,否则将受到国家法律的严厉制裁。
pcsc协议中文版篇一:PCSC规范介绍PC/SC规范介绍1.简介:PC/SC规范由微软公司与世界其它著名的智能卡厂商组成的PC/SC工作组提出的。
PC/SC规范是一个基于WINDOWS平台的一个标准用户接口(AP1),提供了一个从个人电脑(Personal Computer)到智能卡(SmartCard)的整合环境,虽然到目前为止,WONDOWS是唯一支持PC/SC标准的操作系统平台,但由于WINDOWS的影响力,PC/SC规范也为智能卡业界所接收。
到目前为止,PC/SC规范的最新版本是PC/SC Specifications 1.0。
PC/SC规范建立在工业标准-ISO7816和EMV标准的基础上,但它对底层的设备接口和独立于设备的应用API接口(例如用来允许多个应用共享使用系统同一张智能卡的资源管理器)做了更详尽的补充。
它的提出主要是为了达到以下目标:遵从现在ICC和PC的标准并在适当的地方予在扩充跨平台的可操作性,使该规范可在多种硬件和软件平台上实现应用程序可以采用不同厂商提供的产品(独立于厂商)建立应用级的智能卡服务接口,推广ICC在PC上的应用,并促成PC采用ICC作主标准设备。
2.PC/SC体系的主要组成:PC/SC体系由三个主要部件组成,分别规定的操作系统厂商、读写器(IFD)厂商、智能卡(ICC)厂商的职责。
(即读写器)控制器是由IFD厂商提供的可安装部件。
ii. Resource manager(资源管理器)使用Win32API函数实现,是由操作系统厂商提供的系统级部件。
iii. Service Providers(服务提供者),服务程序是由厂商提供的可安装部件,用于提供访问特殊服务的手段,其使用的是基本COM的界面方式。
3.CRW系列IC读卡器PC/SC驱程序的安装支持PC/SC规范的CRW系列IC读卡器包装盒有一个PC/SC驱动程序安装软盘。
运行安装程序SETUP.EXE 驱动程序会自动安装到系统中,就可以按PC/SC规范使用CRW系列读卡器。
VC封装USB接口的智能卡读写(应用层)编译时需要包含头文件“Winscard.h”和库文件winscard.1ib。
第一步要通过初始化连接函数获得设备的连接旬柄:SCARDCONTEXT hSC = NULL;LONG IReturn = 0:IReturn=SCardEstablishContext(SCARD COPE SER.NULL.NULL.& hSC):第一个参数指定资源管理连接的范围,另一个可选值为SCARD_ SCOPE_ SYSTEM。
第二步要取得读写器列表:char szReaderNameList[MAX_RESPONSE]:DWORD dwLength = O:IReturn= SCardListReaders(hSC, NULL, szReaderNameList,&dwLength):如果调用成功,则szReaderNameList中存放的是读写器的名字,如果有多个则中间用‘\O’分割,dwLength的值为返回的有效字符的长度,包括所有的‘\O’。
得到读写器的名字后就可以取得某个读写器中智能卡的句柄.第三步要取得指定读写器中卡片的句柄(与卡片建立连接):要取得读写器列表中第一个读写器中卡片的句柄:SCARDHANDLE hCardHandIe = NULL;DW0RD dwActiveProtocol= O:IReturn=SCardConnect{hSC,szReaderNameList,SCARD_ SHARE_EXCLUSIVE,SCARD_ PROTOCOL_T0,SCARD_PR0T0C0L_T1,& hCardHandle,&dwActiveProtoco1);第三个参数表示连接的共享模式,另外两个模式是SCARD_ SHARE SHARED和SCARD_SHARE_DIRECT。
第四个参数指定首选的通信协议类型包括T:0和T=1,dwActiveProtocol返回最终确定的通信协议类型。
C卡与其它卡片的区别主要是:IC 卡能在卡上存储器中安全可靠地存储大量有用信息,并且可以对数据提供多级安全保密措施.因此,为设计一个好的IC 卡应用系统,必须了解IC卡的数据结构特点.掌握IC卡的编程和读写方法.从使用角度来看,不管是普通存储卡,逻辑加密卡,或智能CPU卡,卡上必定有:用于与其它应用系统相区别的发行商代码, 用于与本系统中其他用户相区别的个人代码,用于控制对卡上数据修改的擦除密码,以及用于存放数据的存储区.由于IC 卡平时不与电源相接,要保证卡上存储的数据不会丢失,只能使用只读存储器即ROM 型存储器.因此卡上数据可以长期保存,一般数据可存放100年.又由于IC卡上数据在使用中要经常修改,故一般应该使用电可擦除可编程只读存储器,即EEPROM.一般IC 卡数据改写次数大于100000次.目前的各种IC卡应用系统中使用的IC卡主要是逻辑加密型卡. 这种卡带有多级密码保护,比普通存储卡安全性能强得多;同时又比智能CPU卡结构简单,不需要复杂的密码计算过程,而且结构简单,编程使用方便.本讲中以美国ATMEL公司的逻辑加密卡A T88SC1604为例,来说明对IC卡应用系统中的IC 卡发行软件和用户应用软件的编程方法,以及IC卡写入过程.一.逻辑存储卡的数据结构和编程特性A T88SC1604卡具有一个公用区和四个应用数据区.其数据结构如附表所示.公用区内有厂商代码,发行商代码,总密码,密码计数器等等.我们可以规划和利用这些数据区对全卡基本特性进行控制.应用区共四个,第个分区有自己的分区密码, 擦除密码,密码计数器和读写控制位,用于对本区内数据的写入,读出和修改进行控制.应用区其余部分是存储数据的存储单元.1604卡的第一分区存储容量为9K位,其它三个分区数据存储容量为2K位.连同公用区总存储量为16K位.厂商代码又叫制造商代码,是由IC卡制造商在卡出厂时写入.一般对某一发行商提供的一批卡提供同一代码,以便与其它厂商的卡相区别. 写入时将相应保护熔丝1熔断,此时IC卡开发者可以读出厂商代码,判断其生产厂商,但不能修改它.发行商代码:用于IC卡个人化,发卡时由系统软件写入, 用来表明此卡属于哪一应用系统.例如:工商行发行的金融IC卡写入的发行商代码,表明了所属的金融系统.此卡使用时,ATM机会自动核实这一代码.如果不正确,说明这不是本系统的卡,不能使用.发行商代码受熔丝2控制,熔断前,此密码可修改,熔断熔丝后.此密码可读出, 可核实,但不能修改.IC卡上的熔丝是IC卡个人化标记.除控制发行商代码外,也控制整个卡上数据的读写.熔丝熔断前,卡上数据读写受总密码SC和读写控制位控制, 各分区密码不起作用,此时可用IC 卡读写器对卡进行初始数据的规划和写入.熔丝熔断后, 卡发给用户个人,此时各分区数据操作不但受总密码SC控制,而且受各分区密码和擦除密码和控制.总密码SC一般用作用户密码,应通过IC卡发行软件中提供的用户环境,由用户自己设置并且写到卡上.此密码一旦写入,不可读出也不保留在系统中,只能核对.用户在以后使用IC卡时,可能通过由应用程序提供的密码核对功能界面,由用户本人键入加以核对.密码输入正确,说明是合法用户,可以对卡上数据进行读写.密码输入错误时,密码计数器SCAC减1.此外,在熔丝熔断之前,总密码还控制各分区密码的读写.密码计数器SCAC用于统计用户密码核对次数.输入正确密码时,计数器清零( 即8位全置-1-).每输错一次,计数器一位变为-0-,若八次输入错误,计数器各位全变为-0-时,则此卡已作废.擦除密码控制对存储器中已写数据的擦除.由于EEPROM 在写入数据时只能写入到空白区(即各位为-1-),对已写有数据的存储区只能先探险,后写入.每次要擦除一行信息.擦除密码在卡发行时写入,由应用系统控制,只能核实,不能读出以防止非法破坏卡上已有的数据.各分区有自己的分区密码,以便实现一卡多用.分区密码和分区擦除密码控制本区数据的读,写,擦操作.例如用一个1604卡兼工作证,医疗证,工资卡和就餐卡.在不同场合使用此卡时读写器分别核实各分区密码,仅操作本区数据,而不影响其它分区.存储分区位地址位数字节地址字节数FZ 厂方代码区0-15 16 0-1 2IZ 发行商代码16-79 64 2-9 8SC 总密码80-95 16 10-11 2SCAC 总密码错误计数器96-103 8 12 1CPZ 代码保护区104-167 64 13-20 8SC1 一区密码168-183 16 21-22 2S1AC 一区密码错误计数器184-191 8 23 1EZ1 一区擦除密码192-207 16 24-25 2E1AC 一区擦除密码错误计数器208-215 8 26 1AZ1 应用区一216-9775 9650 27-1221 1195SC2 二区密码9776-9791 16 1222-1223 2EZ2 二区擦除密码9792-9807 16 1224-1225 2E2AC 二区擦除密码错误计数器9808-9815 8 1226 1AZ2 应用区二9816-11863 2048 1227-1482 256SC3 三区密码11864-11879 16 1483-1484 2EZ3 三区擦除密码11880-11895 16 1485-1486 2E3AC 三区擦除密码错误计数器11896-11903 8 1487 1AZ3 应用区三11904-13951 2048 1488-1743 256SC4 四区密码13952-13967 16 1744-1745 2EZ4 四区擦除密码13968-13983 16 1746-1747 2E4AC 四区擦除密码错误计数器13984-13991 8 1748 1AZ4 应用区四13992-16039 2048 1749-2004 256测试区16040-16055 16 2005-2006 2合计16056 2007二.IC卡编程和使用流程对IC卡的读写操作主要在发卡时和用户持卡交费及持卡消费时时行. 发卡是卡片发行者根据用户要求对空白卡的个人化过程. 这一过程由发卡单位的微机上运行的发卡程序执行,如银行,工厂,机关等部.这一发卡程序也需IC卡开发人员根据上述经构特点进行开发设计.用户持卡消费则在商店POS机或银行A TM机上进行,持卡交费也需要在银行或交费处进行.这一过程是读出或修改卡上数据的过程,由IC卡用户应用程序在用户终端上完成.此时用户需与终端进行交互式处理.这种用户应用程序也是IC卡开发人员进行设计的.下面,综合上一节讨论的IC卡存储结构特点, 说明在这两种软件中的操作过程.1.IC卡个人化操作流程如前所述,此流程嵌在IC卡发卡软件中执行,可完成IC卡的人人化即初始数据录入过程.首先系统核对IC卡的厂商代码和卡型,正确时,在空白卡上写入发行商代码,确定此卡为本系统有效卡.然后软件应提供交互式用户界面, 让用户从键盘输入自己的用户密码(SC).此密码不应由发行者保留和处理,而应该通过调用密码写入函数而直接写入卡上. 多分区中的分区密码也可以通过给用户提供的界面由用户直接输入.为了简化密码记忆要求,也可以采用根据统一用户密码经一定算法来分别产生分区密码并写入卡上. 擦除密码则是在个人化时由发行商也就是系统来产生并且入卡上的,供系统使用.在上述密码写入后, 软件还应提供用户对密码核实和再次修改的机会.在确认无误后,软件发出熔断命令,熔断熔丝2,完成IC卡的个人化进程.随后系统可对IC卡数据区需写入的数据作初始写入.2.IC卡用户应用软件流程如前所述,此流程嵌于各IC卡读写终端的用户软件中.每次涉及对IC卡操作时执行此流程.一旦IC卡插入读写器,用户软件首先应核对厂商代码,发行商代码,以确认此卡的合法性.在确定是本系统中的有效卡后,进入用户密码核对流程, 如果是无效卡,应报警.接着在用户密码核对界面中对持卡人的合法性进行鉴别. 要求持卡人键入用户密码,与卡上密码核对,无误后可开始对卡读写. 如有分区密码也要求用户键入核实.如果需对卡上已有数据进行修改,则应与系统中保留的探险密码进行核对. 正确时可先读出卡上数据进行修改运算,再擦除相应存储区,最后将修改后数据写回该存储区.根据以上叙述,我们知道IC卡的合法性, 持卡人合法性和系统的合法性要相互确认.这些确认和对IC卡的读写操作均需调用随IC 卡读写器提供的函数库中的函数来完成.三.IC卡应用程序编程中使用的函数如上所述:开发IC卡应用系统的要点就是在一个数据库管理软件中,合理地嵌入和调用IC卡操作函数,来完成诸如合法性验证和IC卡读出,擦除和写入等操作.为此,我们需要了解由读写器驱动程序包中提供的IC止操作函数库.这些函数可分为两大类:在WINDOWS应用环境中,提供了一组动态链接库函数(.DLL文件)供各种程序调用. 在DOS 环境中, 则针对不同语言提供了各自的函数库. 这时限于篇幅仅举FOXPROFOR DOS中使用的部分函数加以说明.详细资料可查看相应手册.在FOXPRO程序执行前,执行命令:.SET LIBRARY TO MWIC.LIB则FOXPRO会自动登录-MWIC.LIB-中的IC卡函数,以后可以像使用FOXPRO 内部函数一样在程序使用中使用其中的接口函数.而在编译用户程序为.EXE文件时,又要将-MWIC.LIB-链入即可执行.MWIC.LIB中的接口函数可分两类:通用函数:用于各种卡型的基本操作.1.MW-INITCOM() 初始化串行通迅口.2.MW-SETTYPE() 设置卡型.3.MW-READ() 读卡上的数据.4.MW-WRITE() 向卡上写入数据.5.MW-ERASE() 擦除指定区域.AT88SC1604卡专用函数:仅用于这种卡型,因为不同卡型中密码的结构和位置不同.1.MW-PASS16() 检验总密码和擦除密码2.MW-CPASS16() 改变总密码和擦除密码3.MW-RDECU16() 读错误计数值4.MW-FUSE16() 烧断熔丝。
CPU卡的接口特性、传输协议与读写程序设计接收数据子程序程序代码如下:void Reset(BYTE *len, BYTE *resp){if(!ECPU){ //冷复位ICVCC=1;delay_10ms(1);ICIO =1;ICCLK=1;ECPU =TRUE;}else{ //热复位ICRST=0;}TMOD=0x22; //开定时器T1为模式2, T0为模式2TH1=-52;TL1=-52;ET1=FALSE;TR1=TRUE;do{}while(!TF1); //延时200 个时钟周期200/3.57Mhz=56us,//56us/1.085us=51.6CylTF1=FALSE;ET0=FALSE;ET1=TRUE;TR1=FALSE;ICRST=1;qry_ext1(2,resp); //接收前两个复位响应数据*len=(resp[1]&0x0f)+2;qry_ext1(*len,&(resp[2])); //根据第二个字节的后半字节+2,判断复位响应所剩数据长度,//再接收其余字节*len+=2;}触点释放子程序程序代码如下:void Power_off(void){ICRST=0;ICCLK=0;ECPU =FALSE;ICIO =0;ICVCC=0;}读写程序代码及注释:函数介绍:●void qry_ext1(BYTE bytenr,BYTE *Buffer):接收数据子程序(参数含义分别是:接收数据字节数,接收数据的存放处)●void RSXmt(void):发送数据子程序●WORD CPUC_Cmd(BYTE len,BYTE* comm, BYTE *lenr, BYTE* resp):CPU卡命令子程序(参数含义分别是:发送命令长度,发送命令,返回字节数,返回数据),函数返回状态字节SW1SW2程序源代码:WORD CPUC_Cmd(BYTE len,BYTE* comm, BYTE *lenr, BYTE* resp){BYTE Lc, Le, sw1, sw2, i;BYTE BPrc,INS;Begin:INS=comm[1]; //变量赋值,INS等于命令字第二个字节if(len>5) //变量赋值,根据命令字的不同长度确定Lc和Le{Lc=comm[4];if(len>5+Lc)Le=comm[5+Lc];elseLe=0x00;}else{Le=comm[4];Lc=0;}for(i=0;i<5;i++) //发送命令头CLA, INS, P1, P2, 0/Le/Lc{XmtDat=comm[i];RSXmt();}A:qry_ext1(1,&BPrc); //接收第一个返回字节if(BPrc==0x60) //若第一个返回字节为60,继续等待接收{goto A;}else if(BPrc==INS) //若第一个返回字节等于INS{if(Lc==0) //若=INS, 没有要发送数据,接收Le+2个返回字节{qry_ext1(Le+2,resp);sw1=resp[Le]; sw2=resp[Le+1];}else{ //若=INS, 有要发送数据,发送后,Lc清零,重新接收delay_50us_NOP(1);for(i=0;i<Lc;i++){XmtDat=comm[5+i];RSXmt();}Lc=0;goto A;}}else{sw1=BPrc;qry_ext1(1,&BPrc);sw2=BPrc;if(sw1==0x61) //若第一个返回字节等于‘61’,P3置为第二个{ //返回字节的值,发送GET RESPONSE 指令comm[0]=0x00;comm[1]=0xC0;comm[2]=0x00;comm[3]=0x00;comm[4]=sw2;comm[5]=0;len=5;delay_50us_NOP(1);goto Begin;}if(sw1==0x6C) //若第一个返回字节等于‘6C’,P3置为第二个{ //返回字节的值,重发命令头comm[4]=sw2;comm[5]=0x00;len=5;delay_50us_NOP(1);goto Begin;}}*lenr=Le; //设置返回长度的参数为Lereturn ( (((WORD)sw1)<<8)+sw2 ); //返回SW1SW2}注释:①Le—接收数据长度②Licc—卡实际要返回的数据长度③Lc—发送数据长度。
依时利IC卡考勤门禁机接口C#实现1.依时利这个坑爹的货,竟然不提供C#方面的Demo支持!哎俺自己写一个,存一下怕以后忘记哈哈!!2.首先创建一个winfrom项目名称为:edaxKQ (仅供参考,俺乱命名的不准笑话小弟哈哈!)如图:由于依时利提供的接口是delphi编写的,所以嘛不能直接引用,需要借助: [DllImport("EastRiver.dll")] 方式引入:将依时利提供的EastRiver.dll文件拷贝到项目的bin\Debug目录下(当然也可以放别的目录只要你能让dllImport找到是吧哈哈)。
3.好了到这里前期准备做好了,现在我们开始编写连接卡机和端口连接的接口;(其实接口可以通过依时利提供的API找到,但是实在有点坑爹)4.连接接口实现打开依时利API我们可以找到连接接口,在C#中进行重写,(名字能错哦,好吧我废话了,重写当然不能错)///<summary>///联机卡机:///其他值成功返回端口句柄 //// -1 端口无效或真正使用 //// 0 无法联机///</summary>///<param name="port">COM端口号</param>///<param name="BaudRate">端口波特率</param>///<param name="clock_id">卡机序号</param>///<returns></returns>[DllImport("EastRiver.dll")]public static extern IntPtr ConnectClock(int port, int BaudRate, int clock_id);重写了接口后,我们打开Form1窗体,在里面创建对应参数的输入和测试按钮,如图:(对应参数这里就不解释了哦!做考勤机开发的应该都知道了吧哈哈!啊对了卡机序列号解释下,开启依时利卡机后,在屏幕上可以看到一个序列号便是卡机序列号了,一般都是1),双击测试联机按钮,进入代码体,调用联机接口:_port = Convert.ToInt32(this.txtCom.Text.ToString());_BaudRate =Convert.ToInt32(this.txtBaudRate.Text.ToString());_clock_id = Convert.ToInt16(this.txtClock.Text.ToString(),16);_hPort = ICheck.ConnectClock(_port,_BaudRate,_clock_id);if (_hPort.ToInt32() != 0){MessageBox.Show("联机成功!");}else{MessageBox.Show("联机失败!");}看到这里有些童鞋可能不知道上面那些参数是干嘛的,别的不解释了都是定义的变量,这里介绍下_hPort变量,这个变量是在接口联通的时候,存储由接口返回的COM口句柄,在后面的使用需要联机操作的接口中,都需要使用到该变量中存储的Com口句柄;(说白了就等于是一个已经打开的SQL连接,这个貌似好理解点)到这里我们就联机成功了。
VC中PC/SC智能卡接口的编程(一)2010-05-06 15:35转载自hxw1984最终编辑hxw1984[摘要]本文介绍了如何在VC中通过PC/SC接口实现对智能卡读写器的操作,并给出了详细的例子代码。
[关键词] 智能卡、PC/SC、智能卡读写器1 引言完整的智能卡应用系统由后台服务程序、主机或终端应用程序和智能卡等组成,如图1所示。
其中,后台服务程序提供了支持智能卡的服务。
例如,在一个电子付款系统中,后台服务程序可以提供到信用卡和帐户信息的访问;主机或终端应用程序一般存在于台式机或者终端、电子付款终端、手机或者一个安全子系统中,终端应用程序要处理用户、智能卡和后台服务程序之间的通讯;智能卡则存储用户的一些信息。
终端应用程序需要通过读卡器来访问智能卡,在一个系统中,通常存在多家厂商提供的读卡器,因此需要一个统一的读卡器设备驱动接口。
随着智能卡的广泛应用,为解决计算机与各种读卡器之间的互操作性问题,人们提出了PC/SC(Personal Computer/Smart Card)规范,PC/SC规范作为读卡器和卡与计算机之间有一个标准接口,实现不同生产商的卡和读卡器之间的互操作性,其独立于设备的API使得应用程序开发人员不必考虑当前实现形式和将来实现形式之间的差异,并避免了由于基本硬件改变而引起的应用程序变更,从而降低了软件开发成本。
Microsoft在其Platform SDK中实现了PC/SC,作为连接智能卡读卡器与计算机的一个标准模型,提供了独立于设备的API,并与Windows平台集成。
因此,我们可以用PC/SC接口来访问智能卡。
2 PC/SC概述PC/SC接口包含30多个以Scard为前缀的函数,所有函数的原型都在winscard.h 中声明,应用程序需要包含winscard.lib,所有函数的正常返回值都是SCARD_S_SUCCESS。
在这30多个函数中,常用的函数只有几个,与智能卡的访问流程(图2)对应,下面将详细介绍这些常用函数。
3 PC/SC的使用3.1建立资源管理器的上下文函数ScardEstablishContext()用于建立将在其中进行设备数据库操作的资源管理器上下文(范围)。
函数原型:LONG SCardEstablishContext(DWORD dwScope, LPCVOID pvReserved1, LPCVOID pvReserved2, LPSCARDCONTEXT phContext);各个参数的含义:(1)dwScope:输入类型;表示资源管理器上下文范围,取值为:SCARD_SCOPE_USER(在用户域中完成设备数据库操作)、SCARD_SCOPE_SYSTEM(在系统域中完成设备数据库操作)。
要求应用程序具有相应的操作权限。
(2)pvReserved1:输入类型;保留,必须为NULL。
(3)pvReserved2:输入类型;保留,必须为NULL。
(4)phContext:输出类型;建立的资源管理器上下文的句柄。
下面是建立资源管理器上下文的代码:SCARDCONTEXT hSC;LONG lReturn;lReturn = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hSC);if ( lReturn!=SCARD_S_SUCCESS )printf("Failed SCardEstablishContext\n");3.2 获得系统中安装的读卡器列表函数ScardListReaders()可以列出系统中安装的读卡器的名字。
函数原型:LONG SCardListReaders(SCARDCONTEXT hContext, LPCTSTR mszGroups, LPTSTR mszReaders, LPDWORD pcchReaders);各个参数的含义:(1)hContext:输入类型;ScardEstablishContext()建立的资源管理器上下文的句柄,不能为NULL。
(2)mszGroups:输入类型;读卡器组名,为NULL时,表示列出所有读卡器。
(3)mszReaders:输出类型;系统中安装的读卡器的名字,各个名字之间用’\0’分隔,最后一个名字后面为两个连续的’\0’。
(4)pcchReaders:输入输出类型;mszReaders的长度。
系统中可能安装多个读卡器,因此,需要保存各个读卡器的名字,以便以后与需要的读卡器建立连接。
下面是获得系统中安装的读卡器列表的代码:char mszReaders[1024];LPTSTR pReader, pReaderName[2];DWORD dwLen=sizeof(mzsReaders);int nReaders=0;lReturn = SCardListReaders(hSC, NULL, (LPTSTR)mszReaders, &dwLen);if ( lReturn==SCARD_S_SUCCESS ){pReader = (LPTSTR)pmszReaders;while (*pReader !='\0' ){if ( nReaders<2 ) //使用系统中前2个读卡器pReaderName[nReaders++]=pReader;printf("Reader: %S\n", pReader );//下一个读卡器名pReader = pReader + strlen(pReader) + 1;}}VC中PC/SC智能卡接口的编程(二)2010-05-06 15:36转载自hxw1984最终编辑hxw19843.3 与读卡器(智能卡)连接函数ScardConnect()在应用程序与读卡器上的智能卡之间建立一个连接。
函数原型:LONG SCardConnect(SCARDCONTEXT hContext, LPCTSTR szReader, DWORD dwShareMode, DWORD dwPreferredProtocols, LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol);各个参数的含义:(1)hContext:输入类型;ScardEstablishContext()建立的资源管理器上下文的句柄。
(2)szReader:输入类型;包含智能卡的读卡器名称(读卡器名称由ScardListReaders()给出)。
(3)dwShareMode:输入类型;应用程序对智能卡的操作方式,SCARD_SHARE_SHARED(多个应用共享同一个智能卡)、SCARD_SHARE_EXCLUSIVE(应用独占智能卡)、SCARD_SHARE_DIRECT(应用将智能卡作为私有用途,直接操纵智能卡,不允许其它应用访问智能卡)。
(4)dwPreferredProtocols:输入类型;连接使用的协议,SCARD_PROTOCOL_T0(使用T=0协议)、SCARD_PROTOCOL_T1(使用T=1协议)。
(5)phCard:输出类型;与智能卡连接的句柄。
(6)PdwActiveProtocol:输出类型;实际使用的协议。
下面是与智能卡建立连接的代码:SCARDHANDLE hCardHandle[2];DWORD dwAP;lReturn = SCardConnect( hContext, pReaderName[0],SCARD_SHARE_SHARED,SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &hCardHandle[0], &dwAP ); if ( lReturn!=SCARD_S_SUCCESS ){printf("Failed SCardConnect\n");exit(1);}与智能卡建立连接后,就可以向智能卡发送指令,与其交换数据了。
3.4 向智能卡发送指令函数ScardTransmit()向智能卡发送指令,并接受返回的数据。
函数原型:LONG SCardTransmit(SCARDHANDLE hCard,LPCSCARD_I0_REQUEST pioSendPci, LPCBYTE pbSendBuffer, DWORD cbSendLength, LPSCARD_IO_REQUEST pioRecvPci, LPBYTE pbRecvBuffer, LPDWORD pcbRecvLength);各个参数的含义:(1)hCard:输入类型;与智能卡连接的句柄。
(2)pioSendPci:输入类型;指令的协议头结构的指针,由SCARD_IO_REQUEST结构定义。
后面是使用的协议的协议控制信息。
一般使用系统定义的结构,SCARD_PCI_T0(T=0协议)、SCARD_PCI_T1(T=1协议)、SCARD_PCI_RAW(原始协议)。
(3)pbSendBuffer:输入类型;要发送到智能卡的数据的指针。
(4)cbSendLength:输入类型;pbSendBuffer的字节数目。
(5)pioRecvPci:输入输出类型;指令协议头结构的指针,后面是使用的协议的协议控制信息,如果不返回协议控制信息,可以为NULL。
(6)pbRecvBuffer:输入输出类型;从智能卡返回的数据的指针。
(7)pcbRecvLength:输入输出类型;pbRecvBuffer的大小和实际大小。
对于T=0协议,收发缓冲的用法如下:(a)向智能卡发送数据:要向智能卡发送n>0字节数据时,pbSendBuffer 前4字节分别为T=0的CLA、INS、P1、P2,第5字节是n,随后是n字节的数据;cbSendLength值为n+5(4字节头+1字节Lc+n字节数据)。
PbRecvBuffer将接收SW1、SW2状态码;pcbRecvLength值在调用时至少为2,返回后为2。
BYTE recvBuffer[260];int sendSize, recvSize;BTYE sw1, sw2;BYTE select_mf[]={0xC0, 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00};sendSize=7;recvSize=sizeof(recvBuffer);lReturn = SCardTransmit(hCardHandle[0], SCARD_PCI_T0, select_mf, sendSize, NULL, recvBuffer, &recvSize);if ( lReturn != SCARD_S_SUCCESS ){printf("Failed SCardTransmit\n");exit(1);}//返回的数据,recvSize=2sw1=recvBuffer[recvSize-2];sw2=recvBuffer[recvSize-1];(b)从智能卡接收数据:为从智能卡接收n>0字节数据,pbSendBuffer 前4字节分别为T=0的CLA、INS、P1、P2,第5字节是n(即Le),如果从智能卡接收256字节,则第5字节为0;cbSendLength值为5(4字节头+1字节Le)。