智能卡接口的编程

合集下载

pkcs11 卡内密钥运算 -回复

pkcs11 卡内密钥运算 -回复

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令牌。

VC中PCSC智能卡接口的编程

VC中PCSC智能卡接口的编程

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 的大小和实际大小。

智能卡ISO7816-4规范(中文版)

智能卡ISO7816-4规范(中文版)

第二部分行业间交换命令目录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 接口卡说明书

广州周立功单片机发展有限公 usbcan-i ii 智能can 接口卡说明书

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接口卡及相关软件均属广州市周立功单片机发展有限公司所有,其产权受国家法律绝对保护,未经本公司授权,其他公司、单位、代理商及个人不得非法使用和拷贝,否则将受到国家法律的严厉制裁。

IC卡接口技术

IC卡接口技术
2.存储器结构
SLE4442的存储器结构如图所示。主要包括3个存储器:2568 B的E2PROM型主存储器;321 B的PROM型保护存储器;48 B的 E2PROM型加密存储器。
SLE4442卡的存储器结构
SLE4442卡概述
(1OM型存储器,按字节寻址、擦除和 写入。主存储器的地址是从0(00H)~255(FFH),共256 B(2 KB)。 主存储器可分为两个数据区:保护数据区和应用数据区。
SLE4442卡硬件接口电路
SLE4442卡接口设备的硬件组成包括:卡座(IC卡适配插 座)、输入接口电路、存储器、微处理器和外围接口组成,如 图所示。
卡座
卡座是读写器与卡的物理连接部件,是影响读写器寿命的主要因 素,也是设计或选购读写器的重要指标。它包括与卡接触的8个片触点、 检测“插卡到位”的一对状态开关、固定和弹出卡的机械装置、与输 入接口电路相接的电气终端和安装基座。
① 有很高的数据处理和计算能力以及较大的存储容量,因此应 用的灵活性、适应性较强。
特点: ② 极强的安全防伪能力。它不仅可验证卡和持卡人的合法性,
而且可鉴别读写终端,已成为一卡多用及对数据安全保密性 特别敏感场合的最佳选择,如金融信用卡和手机SIM卡等。 ③ 真正意义上的“智能卡”。
根据卡与外界数据交换界面的不同分类
根据应用领域的不同分类
根据应用领域的不同可将智能卡分为金融卡和非金融 卡(即银行卡和非银行卡)。金融卡又分为信用卡和现金 卡。前者用于消费支付时,可按预先设定额度透支资金, 后者可用做电子钱包和电子存折,但不得透支。而非金融 卡的涉及范围极广,实质上囊括了金融卡之外的所有领域, 如门禁卡、组织代码卡、医疗卡、保险卡、IC卡身份证、 电子标签等。
命令控制字地址字数据字备注读加密存储器31h无效无效检查错误计数器是否还有1修改加密存储器39h00h输入数据将错误计数器其中一位由1写0比较校验数据33h01h输入数据参照字数据字节1比较校验数据33h02h输入数据参照字数据字节2比较校验数据33h03h输入数据参照字数据字节3修改加密存储器39h00hffh擦除错误计数器读加密存储器31h无效无效检查错误计数器是否成功擦除psc校验子程序1break在clk为低状态期间如果rst置为高状态则任何操作均无效io线被锁定到高阻状态z状态

STM32_7816智能卡接口笔记

STM32_7816智能卡接口笔记
............................................................................................................... 21
©2007 MXCHIP Corporation. All rights reserved. 021-52655026/025
5
ISO 7816 – 4 – 智能卡命令 ........................................................................................................... 16
5.1
T0 协议 ............................................................................................................................... 16
1.3
协议........................................................................................................................................ 6
1.4
智能卡时钟发生器................................................................................................................ 7
6.3
怎样发送APDU命令给智能卡 ........................................................................................... 35

SmartCardCPU卡读写接口电路-Read

SmartCardCPU卡读写接口电路-Read
起源
SmartcardCPU卡起源于20世纪 80年代,最初主要用于身份识别
领域。
发展
随着技术的不断进步和应用需求的 增加,SmartcardCPU卡逐渐扩展 到金融支付、网络安全等更多领域。
未来趋势
未来,随着物联网、云计算等技术 的普及,SmartcardCPU卡将进一 步拓展应用领域,实现更广泛的应 用价值。
展望
1 2 3
技术革新
未来,随着新材料、新工艺的引入, SmartcardCPU卡读写接口电路有望在速度、功 耗、尺寸等方面实现更大的突破。
应用拓展
随着5G、物联网等技术的普及,该技术的应用 领域将进一步拓展,可能在更多场景中替代传统 的身份认证方式。
安全与隐私保护
随着数据安全和隐私保护需求的提升,该技术将 更加注重数据加密和隐私保护功能,确保用户信 息安全。
04பைடு நூலகம்Read接口电路的实现
硬件实现
电路设计
根据CPU卡协议规范,设 计相应的硬件电路,包括 数据接收、解码、存储等 模块。
元器件选择
选择合适的电子元器件, 如电阻、电容、电感等, 确保电路性能稳定可靠。
PCB板布线
合理规划PCB板布线,降 低电磁干扰,提高信号传 输质量。
软件实现
驱动程序开发
读写接口电路是实现CPU卡与外 部设备进行数据交换的关键部分, 其性能直接影响CPU卡的应用效
果。
目的和意义
随着CPU卡的普及和应用,对 读写接口电路的要求也越来越 高。
设计一个稳定、高效、安全的 读写接口电路,对于提高CPU 卡的应用性能和安全性具有重 要意义。
本研究旨在深入探讨CPU卡读 写接口电路的设计原理,为实 际应用提供理论支持和实践指 导。

pcsc协议中文版

pcsc协议中文版

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系列读卡器。

JavaCard应用程序开发

JavaCard应用程序开发

制作
JavaCard 应用程序开发三部曲
- 4 规范中定义: 表格 1、ISO 7816 CLA 值
CLA 值
指令类
0x0n, 0x1n ISO 7816 - 4 卡指令,比如文件存取和安全操作
20 to 0x7F 保留
0x8n or 0x9n 你可以用作你的特定的应用程序指令的 ISO/IEC 7816 - 4 格式,根据标准解释' X '
⒈APDU 命令 一个 APDU 命令的结构由它的第一个字节的值控制,大部分情况下看上去如下所示:
图 2、APDU 命令
一个 APDU 命令有一个必须有的头和一个可选的体,包含: · CLA(1 字节):这个必要的字段识别指令的一个特定应用程序类。有效的 CLA 值在 ISO 7816
8
Java 爱好者
2
Java 爱好者
制作
JavaCard 应用程序开发三部曲
图 2a. 带有 Java 功能的智能纽扣
图 2b. 带有 Java 功能的 USB 令牌
请参阅 What is a Smart Card? /products/javacard/smartcards.htm
5
Java 爱好者
制作
JavaCard 应用程序开发三部曲
读取端主应用程序 主应用程序存在于一个例如个人计算机这样的台式机或者终端、电子付款终端、手机或者一个 安全子系统中。 主应用程序处理用户、Java Card 小应用程序和供应商的后端应用程序之间的通讯。 传统的读取端应用程序是使用 C 编写的。近来 J2ME 技术的广泛普及有望使用 Java 实现主应 用程序;例如,它可以在一台支持 MIDP 和安全信赖服务应用编程接口(Security and Trust Services API)手机上运行。 智能卡供应商一般不仅提供开发工具箱,而且提供支持读取端应用程序和 Java Card 小应用程序的 应用程序编程接口。例如 OpenCard Framework /,就是一个基于 Java 的 应用程序编程接口集,隐藏了来自不同供应商的读取器的一些细节,并且提供了 Java Card 远程方 法调用分布式对象模型和安全信任服务应用编程接口(SATSA),我在本文后面一部分讨论它们。

VC封装USB接口的智能卡读写应用层

VC封装USB接口的智能卡读写应用层

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返回最终确定的通信协议类型。

IC卡的编程和使用

IC卡的编程和使用

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卡的接口特性、传输协议与读写程序设计

CPU卡的接口特性、传输协议与读写程序设计

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—发送数据长度。

Java语言开发智能卡应用程序

Java语言开发智能卡应用程序

t net 1.4 Java 智能卡
ne k. 1996 年 11 月,Sun 公司正式发布 JAVA Card1.0 版本的规范。现在 Java 卡的最新的规范是 2.2 k. oo 版。
oo nb 其实 Java 卡的实质是一部功能齐全、但规模较小的电脑,其硬件主要是为了保证 Java 卡的运 b c 行环境的需要。
※ 3 ※
.cnbook Java 卡的出现为不同厂商的智能卡提供了统一的开发环境,95%智能卡制造商已经支持了 Java w 卡的 API。
ww 应用 Java 语言开发的智能卡程序可以应用在所有的 Java 卡上。 et (2)Java 是面对对象的编程语言,面向对象的 API 简化了 Java 卡的 Applet 与终端或后台服务 t n 器的通信。 ne k. (3)由于智能卡程序使用 Java 语言,开发人员可以选择所熟悉和喜欢的开发工具,如 JBuilder。 k. oo 因为可以选择面向对象的开发工具,快速开发和调试 Java 卡的应用程序成为了可能。 oo nb 在以前的智能卡开发环境中,应用程序需要下载到卡的 ROM,而卡的 ROM 程序是无法更新的, c 所以调试卡的程序将占用大量的开发时间。 w. (4)Java 卡支持多种用途。 ww Java 卡可以同时存在多个不同的应用,这些应用可以来自不同的卡供应商。例如它可以有电子 t 钱包功能,也可以有身份鉴别功能,也可以有门禁系统功能。 t ne (5)Java 卡支持程序的增、删、改操作。 ne k. Java 卡上的应用可以进行删除或者添加新的应用,不需要更换新的智能卡,大大增强智能卡的 . o 灵活性。 ok bo 综上所述,Java 卡的出现统一了智能卡的编程接口(API),统一了智能卡的编程语言(Java 语 bo cn 言),使智能卡成为统一标准的产业,这便是它如何受欢迎的原因。 cn w. Java 卡内有一个能执行 Java Applet 的虚拟机,它提供 Java 卡编程的 API,使开发人员不需要 . w 了解智能卡的硬件和专用技术就可以进行智能卡的应用开发。 w t Java 卡的 Applet 能够在不同卡片的环境执行,通过虚拟机的机制来达到跨平台的能力,这与 Java t ne 语言可以跨平台运行的原理相同。 ne k. 1.5 智能卡开发流程图 ok. boo Java 智能卡程序的开发流程图如图 3 所示。

依时利IC卡考勤门禁机接口C#实现

依时利IC卡考勤门禁机接口C#实现

依时利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连接,这个貌似好理解点)到这里我们就联机成功了。

应电智能卡技术7读卡器编程.ppt

应电智能卡技术7读卡器编程.ppt
第三章 3.3 任务三 M1卡数据读写程序的编写
SmartCard
编程练习一
记录自己的卡号 用Keil 51创建工程文件 test.prj
包括: test.c、REG516.H、M500A.h、 rc500.lib 单片机芯片型号: STC89C516RD+ 编译、链接 将生成的.HEX 写入读卡器 用M1卡测试
AUTHENTICATION 卡应答:AE位
READ/WRITE/INC/DEC
HALT
SmartCard
while(1) { if(M500PiccRequest(PICC_REQALL,card_type)!=0)
continue; // 寻卡 if(M500PiccAnticoll(0,card_sn)!=0) continue; // 防碰撞 if(M500PiccSelect(card_sn,card_type)!=0) continue;
SmartCard
M
指令
Answer to Request
C
(Request 的应答)
Request std
M
Request all

AntiCollision (防重叠)

Select Tag (选卡片)

Authentication (认证)

Auth_1a
Auth_1b

Load KEY(存取密码)
TE, BE, PE,CE
TE, BE, PE,CE
AE TE, BE, PE,CE
TE, BE TE, BE TE, BE TE, BE TE, BE TE, BE
接收卡片上数据
Tagtype

STM32_7816智能卡接口笔记

STM32_7816智能卡接口笔记

5.2.4
安全API ....................................................................................................................... 25
6
智能卡接口库:描述...................................................................................................................... 27
4
ISO 7816 – 3 – 电信号和传输协议 ............................................................................................... 10
4.1
智能卡上电启动和重置...................................................................................................... 11
5.2
应用层协议.......................................................................................................................... 19
5.2.1
ISO 7816-4 APDU ....................................................................................................... 20

AN2598 使用 STM32F101xx和 STM32F103xx的智能卡接口

AN2598 使用 STM32F101xx和 STM32F103xx的智能卡接口

AN2867 图2
智能卡接口硬件连接
智能卡读卡器的硬件连接
7/30
参照2008年5月 AN2598 英文第2版 本译文仅供参考,如有翻译错误,请以英文原稿为准。请读者随时注意在ST网站下载更新版本
AN2867
ISO7816:协议介绍
3 ISO7816:协议介绍
3.1 简介
“ISO 7816:识别卡——带有触点的集成电路卡”提供了把相对简单的,容易被伪造、偷盗、 丢失的普通识别卡转变成一个防篡改的智能集成电路卡(Intergrated circuit card ICC)的规范,人 们一般称之为智能卡。ISO 7816包括至少6个经审核的部分和一些有待审核的新增部分,如下:
25
6.3.7 SC_VERIFY
25
6.4 奇偶错误管理
25
6.4.1 从智能卡向读卡器发送数据
25
6.4.2 从读卡器向智能卡发送数据
25
7 智能卡接口示例
27
7.1 固件包描述
27
7.1.1 FWLib目录
27
7.1.2 Smartcard_AN目录
27
2/30
参照2008年5月 AN2598 英文第2版 本译文仅供参考,如有翻译错误,请以英文原稿为准。请读者随时注意在ST网站下载更新版本
AN2867
ISO7816-3——电信号和传输协议
4 ISO7816-3——电信号和传输协议
IS0 7816-3开始研究智能卡“智能”方面的规范。该标准描述了智能卡和读卡器之间的关系, 其中智能卡作为从设备,读卡器作为主设备。通讯的基础是,读卡器通过触点给智能卡发送信 号,然后智能卡作出回应,如此不断循环交互。
智能卡接口
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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)。

相关文档
最新文档