社保卡规范vs银行卡规范
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
社保卡规范vs银行卡规范一社保卡体系及实现
1. 密钥·权限·状态机
用Write Key命令写外部认证密钥时,密钥的后续状态就是密钥子类型。
状态机由b_pinflag变量与d_dfac变量共同构成。
二规范比较及程序变更
1. 不分主题
○遵循《社会保障(个人)卡规范》。应用规范部分系全新设计。
●在项目中增加了sbtrans.c文件,移除了getblan.c、inttra.c、trans.c文件。
●在mainx.h中移除了FINAL_V AR*、EDLOAD、EPLOAD、UNLOAD、EDCASH、
EDPUR、EPPUR、EDUPDA TE、CREDITPUR、TRANSIDLE、TRANSLOAD、
TRANSCASH、TRANSUNLOAD、TRANSUPDATE等宏的定义,定义了
FINAL_V AR0~19、EFMXID、EFEDID、EFEDLEN、DSK、EDLOAD、EDPURCHASE、TRANSIDLE、TRANSLOAD、TRANSPURSE等宏。
●在data.c和data.h中移除了b_financeflag变量的定义;在相关各处移除了使用该变
量的语句。
●在func.h和sbtrans.c中将debit_for_purchase_or_unload函数更名为
debit_for_purchase。在func.h和sbtrans.c中定义了read_or_update_starting_day函数。
●在main.c的cmdtable变量初始值中移除了Credit for Load、Debit for Purchase / Cash
Withdraw / Unload、Get Balance、Get Transaction Proof、Initialize、Update Overdraw Limit等命令入口,增加了Credit for Load、Debit for Purchase、Get Balance、Get Transaction Proof、Initialize、Read / Update Starting Day等命令入口;在func.h中移
除了update_overdraw_limit函数的定义,定义了read_or_update_starting_day函数;
在main.c中改写了checkcmdata、main函数。
●在cfile.c中改写了create_file函数。
○交易类型的代号不是1、2,而是31、32。
●在mainx.h中改变了EFLOAD、EDPURCHASE宏的定义,并改写了sbtrans.c中相
关的调用。
○消费初始化,返回的个人累计不对,原因是没有专门准备这一个值。
●在消费初始化时,修改了消费准备响应报文的程序。
○对消费时金额累加可能导致的溢出未作处理。
●在sbtrans.c中改写了creditloadbegin函数。
○社保卡对ATR的历史字节有要求(p.21)。
●在main.c中改写了main函数。
○不再支持用卡片初始密钥做外部认证。
●在inauthe.c中改写了external_authentication函数,移除了对MF的特殊处理。
2. 权限控制
○命令的操作权限由两套机制联合控制:对PIN进行校验,用指定密钥做外部认证。PIN 验证成功与否只影响PIN标志位,不影响应用状态。社保卡规范中的PIN是全局PIN,选择其他应用时,PIN验证结果不变(p.94)。同一ADF下先后执行的多个外部认证所引发的应用状态变化都要保留,直到断电或选择其他应用。
●在sub.c中改写了clrdf、judgeac函数。
●在inauthe.c中改写了external_authentication函数。
●在pin.c中改写了verify函数。
○要使用Card Block、Application Block、PIN Change/Unblock、Update Starting Day等命令,
必须首先对特定的外部认证密钥进行外部认证,通过后才允许执行这些命令。
●在func.h和sub.c中改变了findkey函数的定义和实现;在sub.c、writekey.c中改写
了使用该函数的语句。
●在func.h和sub.c中改变了searchkeycore函数的定义和实现;在sub.c、writekey.c
中改写了使用该函数的语句。
●在mainx.h中定义了PUK、BK、LK、DSK等宏。
●在func.h和sub.c中定义并实现了check_authentication函数;在app.c中改写了
block_unblock函数;在pin.c中改写了pin_change_and_unblock函数;在sbtrans.c
中改写了read_or_update_starting_day函数。
○没有Reload PIN命令。
●在pin.c中移除了reload_pin函数的定义和实现。
●在pin.c中改写了change_pin函数,将change_or_reload_pin函数的处理合并进来。
●在func.h和pin.c中移除了change_or_reload_pin函数的定义和实现;在main.c的
cmdtable变量初始值中改变了Change PIN命令入口的函数调用。
○持卡人可以将PIN设定为无效,此时PIN必须存在,其长度为0,且任何需校验PIN的操作均允许执行。正常PIN的长度是4~16位(2~8字节),不是4~12位(2~6字节)。
根据PIN的有效与否,Change PIN命令(p.33)允许只给出当前PIN和新的PIN这两者中的一个。Verify命令(p.47)的Lc可以是'00',这种情况下的返回码有特殊含义。
●在pin.c中改写了checknumber、change_pin、verify函数。
○PIN Change/Unblock命令(p.38)要支持PIN Unblock功能,且PIN Change功能的实现也与金融卡不同。该命令必须在PUK认证通过后才能执行,计算MAC用的是STK。
●在pin.c中改写了pin_change_and_unblock函数。
○计算MAC及加密时,社保卡必须使用过程密钥(pp.54-56),而金融卡仅在金融交易中使用过程密钥(pp.122-123, 138)。过程密钥的生成方式是以随机数作为初始值,按照原始密钥(计算MAC时固定为应用维护密钥)的长度,执行单DES或三DES运算。用过程密钥计算MAC及加密时,只能使用单DES算法。若连续三次MAC校验未通过,应用维护密钥STK*应该被锁定,但Card Block和Application Block命令除外(见p.108)。
PIN Change/Unblock命令应该锁定STK,不是PUK,规范p.109的说法是不正确的。使用已被锁定的应用维护密钥,返回码应该是6985。应用维护密钥不能解锁?
●在data.h和data.c中改变了sessionkey变量的定义,并将其重新命名为d_sessionkey。
●在mainx.h中改变了SENDBUF_A、REC_BUF_A、RECEIVELIMIT、
LOCALMEMORY和FINAL_V AR0~14宏的定义,移除了FINAL_VAR15宏的定义,将FINAL_V AR16~17宏重新命名为FINAL_V AR15~16。
●在sub.c、inttra.c、trans.c中用d_sessionkey替换了sessionkey。
●在func.h和sub.c中定义并实现了calc_sessionkey函数。在func.h和sub.c中移除了
session_key函数的定义和实现。在inttra.c、trans.c中用calc_sessionkey函数调用替
代了session_key函数调用。
●在func.h和sub.c中改变了transmac函数的定义和实现;在binary.c、increase.c、
inttra.c、sub.c中改写了使用该函数的语句。
●在inauthe.c中改写了external_authentication和internal_authentication函数;在sub.c
中改写了decrypt函数。
●在data.h中改变了df.bs的说明;在pin.c中改写了pin_change_and_unblock函数;
在sub.c中改写了searchkeycore、incerrcounter函数。注意,incerrcounter函数仅服
务于文件读写,它的存在是因为d_key所用内存与文件数据缓冲区重叠。