SmartCard智能卡网吧收费机设计(三)——接触式逻辑加密卡读写软件设计电子与信息工程学院SmartCard教学目标SLE4442卡读主存储器SLE4442卡更新主存储器SLE4442卡密码校验SmartCard产品开发——智能卡网吧收费机开发任务:设计智能卡网吧收费机卡型:SLE4442智能卡网吧收费机功能分析1、判断卡的合法性2、上网计时收费SmartCard产品开发之第三步:软件实现智能卡网吧收费机工作流程1、判断卡的合法性:判断是否SLE4442卡、是否本网吧发行的卡、密码是否正确、卡中余额是否充足——复位与复位响应、读卡、校验密码2、计时收费:写卡扣款并发送允许上网代码,接收PC机计时时间到发出的控制信号,收到启动信号则重新判断卡合法性并扣款,收到停止信号则下电并提示允许拔卡——写卡SmartCard网吧收费机主程序流程图插卡上电是否4442卡?是否本网吧发行?是否合法卡?是否4442卡?插卡上电更新余额余额足否?发送上网允许代码接收PC机控制信号启动?N发送错误代码1卡类型错误发送错误代码2伪卡错误发送错误代码3密码错误发送错误代码4余额不足NNNYYYNY下电提示允许拔卡SmartCardIOBITP1.0CLKBITP1.1RSTBITP1.2ICSWBITP1.6PWRBITP1.7PSC1EQU0FFHPSC2EQU0FFHPSC3EQU0FFHCOMEQU20HADDREQU21HDATEQU22HNUMEQU2FH;*************主程序**************ORG0030HMAIN:CLREA;关中断MOVSP,#60H;设置堆栈网吧卡功能测试主程序SmartCardLCALLPWRON;上电控制LCALLRESET;复位MOVR0,#30H;设置读数据缓冲区1首地址LCALLREAD;读主存储器NOP;断点①LCALLVERIFY;PSC校验XRLA,#07h;断点②,检查PSC校验是否正确JNZEXIT;PSC校验失败退出MOVR0,#50H;设置写数据缓冲区首地址LCALLWRITE;修改主存储器MOVR0,#40H;设置读数据缓冲区2首地址LCALLREAD;再次读主存储器EXIT:NOP;断点③LCALLPWROFF;下电控制SJMP$SmartCard如何实现卡读写控制?接触式逻辑加密卡SLE4442与读写器如何交换数据?如何启动SLE4442卡工作?信息如何从卡中读出?如何校验密码?信息如何写入卡中?SmartCard软件设计方法——按SLE4442操作时序编制卡读写程序通信协议:2线连接协议,满足ISO7816同步传送协议数据传输:CLK信号下降沿有效。复位和复位响应(ResetandAnswer-to-Reset):上电后启动芯片,符合7816——RESET子程序实现命令(Command)命令=开始+(控制字+地址字+数据字)+附加脉冲+停止——COMMAND子程序实现操作模式(Mode):读数据:输出数据模式(OUTGOINGDATAMODE)——SHIN子程序实现写入、擦除、校验:处理模式(PROCESSINGMODE)——PROCESS子程序实现SmartCardSmartCard分任务1:读主存储器ReadMainMemory命令格式:30H+字节地址+**模式:OUTGOING功能:读出从给定的字节地址(N)开始,直到整个存储器末尾的主存储器内容。说明:在该命令输入以后,接口设备IFD必须提供足够的时钟脉冲,起始地址为N时所需要的时钟脉冲数为M=(256-N)*8+1(N=0~255)例如:地址为7EH(N=254),M=17SmartCardSmartCard读主存储器设置读主存储器控制字、地址字、数据字送读主存储器命令设置要读的字节数读入数据(输出数据模式)读完所需字节?计算剩余脉冲数读入剩余字节(输出数据模式)送数据入读缓冲区1读缓冲区1地址+1读完剩余字节?送附加脉冲置位数据线返回YYNNSmartCard;**********读主存储器子程序**************READ:MOVCOM,#30H;设置读主存储器控制字MOVADDR,#R_ADDR;取读主存储器首地址MOVDAT,#00H;设置读主存储器数据字(任意)MOVR4,NUM;数据个数LCALLCOMMAND;送命令给卡READ0:LCALLSHIN;读数据(输出数据模式)MOV@R0,A;送数据入数据缓冲区INCR0DJNZR4,READ0;未读完继续如何完成命令的发送呢?SmartCardSETBCLK;发送一个附加脉冲LCALLDELAYCLRCLKLCALLDELAYSETBIO;置位数据线LCALLDELAYRETSmartCard命令(Command)复位响应以后,芯片等待着命令。命令=开始+(控制字+地址字+数据字)+附加脉冲+停止。开始:在CLK为高状态(H)期间,I/O的下降沿为开始状态。停止:在CLK为高状态(H)期间,I/O的上升沿为停止状态。SmartCard字节1控制字字节2地址字字节3数据字操作模式B7~B0A7~A0D7~D000110000地址无效读主存储器输出数据模式00111000地址输入数据修改主存储器处理数据模式00110100地址无效读保护存储器输出数据模式00111100地址输入数据写保护存储器处理数据模式00110001地址无效读加密存储器输出数据模式00111001地址输入数据修改加密存储器处理数据模式00110011地址输入数据比较校验数据处理数据模式SLE4442操作命令SmartCard;************命令子程序***************;该子程序送出三字节的SLE4442命令;入口参数:COM为控制字,ADDR为地址字,DAT为数据字COMMAND:SETBCLKLCALLDELAY_12CLRIO;开始LCALLDELAYCLRCLKLCALLDELAYMOVA,COM;送命令字LCALLSHOUTMOVA,ADDR;送地址字LCALLSHOUTMOVA,DAT;送数据LCALLSHOUTLCALLDELAYCLRIOLCALLDELAYSETBCLK;附加脉冲LCALLDELAYSETBIO;停止RET怎样向卡中写入一个字节?SmartCard;sle4442串行输入一个字节函数,即MCU向卡写入一字节SHOUT:PUSHBMOVB,#08HX42:RRCAMOVIO,CNOPSETBCLKLCALLDELAYCLRCLKLCALLDELAYDJNZB,X42POPBRETSmartCard操作模式(Mode)接收了一个命令之后,卡芯片处于两种可能的模式:(1)读数据:输出数据模式;(2)写入、擦除、校验密码:处理模式。SmartCard输出数据(OUTGOING)模式将IC卡芯片中的数据传送给读写器在第一个CLK脉冲的下降沿之后,I/O线上的第一位数据变为有效。随后每增加一个时序脉冲,芯片内部的一位数据被送到I/O线上,低位(LSB)在前。当所需要的最后一个数据送出之后,需要再附加一个时钟脉冲来把I/O线置成高阻状态(状态Z)。循环使用SHIN子程序,每调用一次读入卡输出的一个字节。SmartCard处理数据(PROCESSING)模式对IC卡芯片作内部处理(写/擦除/校验密码)芯片在第一个时钟脉冲的下降沿,将I/O线从高状态(H状态)拉到低状态(L状态)并开始处理。此后芯片在内部连续计时计数,直到第n个时钟脉冲之后的附加一个时钟脉冲的下降沿I/O线被再次置高,完成芯片的处理过程。在整个处理过程中I/O线被锁定成低状态。SmartCard;sle4442处理模式子程序PROCESS:MOVR7,#254DCLRCLKCLRIOLCALLDELAYPRO1:SETBCLKLCALLDELAYCLRCLKLCALLDELAYDJNZR7,PRO1SETBIOLCALLDELAYSETBCLKLCALLDELAYCLRCLKRETSmartCard分任务2:PSC校验PSC校验的过程并不是仅由比较校验数据命令来完成的,而是由多个命令构成的一个流程来共同完成,流程一:用一个修改加密存储器命令将密码错误计数器中的一位写0。流程二:连续用三条比较校验数据命令比较输入的用户密码与加密存储器中存储的密码。比较从字节1开始。流程三:校验密码成功与否是用能否擦除密码错误计数器来证实的。如果校验成功,则擦除操作执行有效;如果校验不成功,擦除操作执行无效,密码错误计数器将不会恢复为“111”。但只要EC不全为0,就允许读写器对芯片进行重试。SmartCard读EC写EC的一位为0EC=000?校验三字节的密码擦除EC读ECEC=111?读SM****修改SM地址0数据校验VD地址1、2、3密码1、2、3修改SM地址007H读SM****YYNN校验通过校验不成功EC中1的个数=允许重试的次数卡被锁死SmartCard比较校验数据CompareVarificationData命令格式:33H+字节地址+数据模式:PROCESSING功能:把输入的“用户密码”的各个字节与相对应的PSC(存放在加密存储器中)进行比较说明:字节地址为01H~03H,数据为用户密码SmartCardSmartCard读加密存储器ReadSecurityMemory命令格式:3lH+**+**模式:OUTGOING功能:类似于读保护存储器,可以读出4个字节的加密存储器的内容。M=33说明:密码比较失败时只能读出错误计数器(字节0)的内容,字节1、2、3的内容将为000000(即不能读出密码)SmartCard修改加密存储器UpdataSecurityMemory命令格式:39H+字节地址+数据模式:PROCESSING功能:用所给出的数据修改加密存储器指定字节地址的内容(即修改错误计数器或修改密码)说明:该命令只能在PSC比较成功之后才能进行。该命令的执行时间和所需要的时钟脉冲与修改主存储器的情况相同SmartCardSmartCard;************PSC校验子程序***************VERIFY:MOVCOM,#31H;设置读加密存储器命令控制字MOVADDR,#00H;设置读加密存储器命令地址字(00H为错误计数器)MOVDAT,#00H;设置读加密存储器命令数据字(任意)LCALLCOMMAND;送读加密存储器命令LCALLSHIN;读错误计数器MOV23H,A;错误计数器值暂存(23H)单元LCALLSHIN;继续读入加密存储器后3个字节MOV24H,ALCALLSHINMOV25H,ALCALLSHINMOV26H,AMOVA,23HSETBIO;附加一个脉冲,置数据线为高LCALLDELAYSETBCLKLCALLDELAYCLRCLKSmartCardJBACC.0,NEXT0;判断错误计数器中是否还有“1”;JBACC.1,NEXT1;如有“1”则减去一个“1”,;JBACC.0,NEXT2LJMPEXIT1;错误计数器为全“0”退出NEXT0:MOVDAT,#06HAJMPCOMP0NEXT1:MOVDAT,#04HAJMPCOMP0NEXT2:MOVDAT,#00HCOMP0:MOVCOM,#39H;设置修改加密存储器命令控制字MOVADDR,#00H;设置修改加密存储器命令地址字(错误计数器)LCALLCOMMAND;送修改加密存储器命令(错误计数器减一个1)LCALLPROCESS;处理模式SmartCardMOVCOM,#33H;设置PSC校验命令控制字MOVADDR,#01H;设置PSC校验命令地址字MOVDAT,#PSC1;取PSC第一个字节LCALLCOMMAND;送PSC校验命令给卡LCALLPROCESS;处理模式MOVCOM,#33H;设置PSC校验命令控制字MOVADDR,#02H;设置