EMV Applet设计文档.doc_第1页
EMV Applet设计文档.doc_第2页
EMV Applet设计文档.doc_第3页
EMV Applet设计文档.doc_第4页
EMV Applet设计文档.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

EMV Applet系统设计说明1.概述本Applet是根据EMV Integrated Circuit Card Specifications for Payment Systems v4.3及Visa Integrated Circuit Card Specification系列国际规范,基于NXP的JCOP平台,开发的用于金融交易的软件产品。本Applet运行的平台要求:支持JAVA CARD 2.2.1及以上版本、Global Platform v2.1.1及以上版本的JAVA 虚拟机。个人化按照规范EMV Card Personalization Specification v1.1,采用Global Platform Card Specification v2.1.1规范中定义的Store data命令,使用DGI作为数据分组标识。能够达到快速发卡,可二次发卡的功能。2包(Package)本Applet包的设计可以有两种方式供选择:1 单package设计:即所有类都在一个包中,优点是整个工程结构简单,程序运行时减少包与包之间变量传递等,减低效率损耗,缺点是文件系统部分没有单独做一个package,不能以后直接拿出来给其它applet使用;2 双package设计:即文件系统单独做一个包,功能部分做另一个包,其优缺点跟单package是对应的,即可能会使结构复杂,增加效率损耗,优点是文件系统如果设计的比较全面,可以在以后其它applet中拿来直接使用。在本Applet中,倾向于选择第一种,单package设计,因为以后的applet对文件系统的需求并不确定,目前设计文件系统不一定完全满足需求,或者不需要这么大的系统,反而生成的cap文件占用了较大的卡片空间。以下对采用单Package设计包含的类结构进行大致描述:com.bhz.emvAPICommonEMVAppletRecordFile图1 类结构图以下将对各个类分别进行描述。3.EMVApplet类本类的声明如下:public class EMVApplet extends Applet implements Application,AppletEvent本类是本软件中最重要的类。在本类中,要完成所有EEPROM空间的申请,包括文件创建和密钥体创建等;要对个人化写入的数据进行处理,分别写入对应的记录文件、数据对象或密钥对象中;此外,更重要的是,本类还要实现所有APDU命令的处理。3.1EMVApplet构造方法EMVApplet构造方法定义本类中需要用到的全局变量,创建其它类的实例,创建所有文件和密钥、PIN都在此方法中完成。其中密钥方面,对称密钥(3DES密钥)可以直接使用buildkey进行创建,RSA密钥位数在Common类中已经进行配置,直接创建对象;此外,PIN值、长度、最大重试次数也已经在Common中定义了常量。记录文件的创建也在此方法中完成,举例:RecordFile EF;EF0 = new RecordFile(short)0x01,(short)800,(byte)UNDER_PSE);EF1 = new RecordFile(short)0x02,(short)500,(byte)UNDER_ADF);密钥对象的创建举例:RSA_PriK_Crt =(RSAPrivateCrtKey)KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_CRT_PRIVATE,Common.RSA_KEY_LENGTH,false);为了提高交易效率,以下个人化阶段写入的变量在本类中定义初始值:TAG变量定义9F36Public byte ATC9F13Public byte LAST_ONLINE_ATC9F27Public byte CID9F10Public byte ISS_APP_DATA表1 EMVApplet中定义的交易数据对象3.2Process和ProcessData方法Process方法是所有APDU的命令入口,进入各条命令处理之前,应用需要做一些卡片生命周期判断。ProcessData主要是处理个人化阶段STORE DATA命令传递进来的数据,我们需要做的是接收数据,获取DGI标识,分别写入对应的记录或其它预先定义的变量中。对于RSA私钥和DES密钥,需要密文传入,卡内要知道此用于密钥解密的密钥,写入对象前解密。DGI与对象的对应表如下:DGI名称类型用途0B01PSE下DIR文件记录,只有一条记录的记录文件中写入DIR信息0101EF0第一条记录记录写交易数据,通过readrecord返回给终端0102EF0第二条记录记录写交易数据,通过readrecord返回给终端0103EF0第三条记录记录写交易数据,通过readrecord返回给终端0201EF1第一条记录记录写交易数据,通过readrecord返回给终端0202EF1第二条记录记录写交易数据,通过readrecord返回给终端0203EF1第三条记录记录写交易数据,通过readrecord返回给终端0204EF1第四条记录记录写交易数据,通过readrecord返回给终端0205EF1第五条记录记录写交易数据,通过readrecord返回给终端0206EF1第六条记录记录写交易数据,通过readrecord返回给终端0301EF2第一条记录记录写交易数据,通过readrecord返回给终端0302EF2第二条记录记录写交易数据,通过readrecord返回给终端0401EF3第一条记录记录写交易数据,通过readrecord返回给终端0501EF4第一条记录记录写交易数据,通过readrecord返回给终端0502EF4第二条记录记录写交易数据,通过readrecord返回给终端8000三条DES密钥密文DES对象数据解密后,分别写入三个密钥对象9001RSA私钥的P,密文RSA私钥元素解密后,写入RSA私钥对象9002RSA私钥的Q,密文RSA私钥元素解密后,写入RSA私钥对象9003RSA私钥的Dp,密文RSA私钥元素解密后,写入RSA私钥对象9004RSA私钥的Dq,密文RSA私钥元素解密后,写入RSA私钥对象9005RSA私钥的U,密文RSA私钥元素解密后,写入RSA私钥对象表2 个人化数据分组标识3.3所有命令的实现本类中还包括一些命令实现,要实现的命令如下:1、 SELECT命令(*编码规范中建议方法首字母小写,对process中处理命令的方法是否首字母大写以区分?)声明:private void SelectFile(APDU apdu) 2、 READRECORD声明:private void ReadRecord(APDU apdu)3、 GETCHALLENGE声明:private void GetChallenge(APDU apdu)4、 VERIFY声明:private void Verify(APDU apdu)5、 GETDATA声明:private void GetData(APDU apdu)6、 APP_BLOCK声明:private void AppBlock(APDU apdu)7、 APP_UNBLOCK声明:private void AppUnblock(APDU apdu)8、 CARD_BLOCK声明:private void CardBlock(APDU apdu)9、 UPDATA_RECORD声明:private void UpdateRecord(APDU apdu)10、GET_PROCESSING_OPTIONS声明:private void GetProcessOption(APDU apdu)11、GENERATE_AC声明:private void GenerateAC(APDU apdu)12、INTER_AUTH声明:private void InterAuth(APDU apdu)13、EXTER_AUTH声明:private void ExterAuth(APDU apdu)14、PIN CHANGE/UNBLOCK声明:private void PinChangeUnblock(APDU apdu)15、PUT_DATA声明:private void PutData(APDU apdu)对本命令,有以下两种情况:CLA值命令描述04按照Visa规范处理。80用于个人化的私有命令,非个人化阶段,此命令无效。主要用于更新表1和表5定义的所有交易数据对象,其中P1,P2代表要修改的对象TAG,若TAG为1字节,则P1为00,P2为TAG值;若TAG为2字节,P1代表TAG第一字节,P2代表TAG第二字节。数据域为要修改的新值,不需要带MAC。由于此命令属于应用实现的私有命令,应该在第7章的个人化流程结束后,进入应用后,执行此命令修改数据对象。3.4其它主要方法本小节描述本类中主要实现的方法,见下表:主要方法描述protected EMVApplet(byte bArray, short bOffset, byte bLength)构造方法public void GAC1(APDU apdu)第一条GAC命令的实现Public void GAC2(APDU apdu)第二条GAC命令的实现private void buildReturnData(APDU apdu,byte inbuffer,short ModulusLen)GAC命令返回响应数据的组织表3 EMVApplet的主要方法4.RecordFile类本Applet出于高效的考虑,不创建文件系统,在使用选择命令选择PSE和ADF时,给出正确的响应即可。但记录文件类型的EF实体作为主要的数据载体还是要创建的。本类是记录文件的实现,其成员定义如下:公有属性:short sfi,size;文件的SFI和大小;byte data;记录内容;byte tag;在哪个ADF下标志,主要是处理不同DF下具有相同SFI的情况构造方法如下:RecordFile(short SFI,short LEN,byte tag)This.sfi = SFI;This.size = LEN;This.tag = 0;/编码时使用static final 常量定义在ADF下还是PSE下。Data = new byteLEN;在RecordFile类中,各条记录长度不等,都按照LV的格式依次排列,物理结构上相当于二进制文件,Record长度统一使用1字节表示。举例:Record1长度Record1值Record2长度Record1值其它主要方法:Public void updateRecord(short recnumer,byte buf,short offset,short recordlen)Public short readRecord(short recnumber,byte buf,short offset)本类为每个记录文件分配一整段空间,在记录文件第一次执行updateRecord写记录内容时,将按照上表的方式,依次写入各条记录的长度和内容,如果某条记录已经被写入了内容,再次执行updateRecord,必须写入与原记录长度相等的数据,否则不允许写入。5.API类本类实现所有需要进行加密、签名、计算过程密钥的方法,除此外,还实现很多功能性方法,与类成员无关,可被静态调用的方法,譬如判断某字节某位是否为1的方法等,数量很多,这里不一一描述。主要方法如下:主要方法描述public generateSessionKey(DESKey mk)根据输入的密钥生成过程密钥public calculateMAC(byte inBuff,short inOffset,short inLength)计算MACpublic short rsaSignature(byte inBuff,short inOffset,short inLength,byte outBuff,short outOffset)计算RSA签名public short des(DESKey key,byte inbuf,short,inoff,byte outbuf,short outoff,boolean tag)DES加密和解密public boolean isBitTrue(byte bByte, byte bitnumber )判断某字节某位是否为1表4 Algorithm的主要方法6.Common类本类定义了常用的变量,其它类使用静态调用的方法调用本类成员和方法。同时,本类还起到配置文件的作用,当有定制需求时,一些配置项可以在本类定义的静态常量进行设置。主要定义内容举例如下:public static final byte PSE = byte)0x31,(byte)0x50,(byte)0x41,(byte)0x59, (byte)0x2E,(byte)0x53,(byte)0x59,(byte)0x53, (byte)0x2E,(byte)0x44,(byte)0x44,(byte)0x46, (byte)0x30,(byte)0x31;public static final byte ADF = (byte)0xA0,(byte)0x00,(byte)0x00,(byte)0x03, (byte)0x33,(byte)0x10, (byte)0x10;public static final short RSA_KEY_LENGTH = (short)1024;public static final short PIN_LENGTH = (short)3;public static final short PIN_TRY_TIMES = (short)3;public static final byte PIN = (byte)0x24,(byte)0x12,(byte)0x34;为了方便代码搜索,状态码需要自定义的也在本类中进行定义,举例如下:Public static final short WRONG_6F01 = (short)0x6F01;直接对数据对象的访问能大大提高交易速度,因此,针对某一种发卡模板,在代码中直接定义下列数据对象的值,如果改为其它模板的发卡,使用私有命令PUT_TRANSDATA修改即可。定义举例如下:public byte AIP =(byte)0x7C,(byte)0x00;public byte AFL=(byte0x08,(byte)0x01,(byte)0x03,(byte)0x00,(byte)0x10,(byte)0x01,(byte)0x03,(byte)0x01);本表格总结所有需要在本类中定义的交易数据对象:TAG对象声明9F55Public static byte GEO_INDICATOR82Public static byte AIP94Public static byte AFL87Public static byte APP_PRIORITY_INDICATOR9F08Public static byte APP_VERSION_NUM9F56Public static byte ISS_AUTH_INDICATOR8CPublic static byte CDOL18DPublic static byte CDOL29F0DPublic static byte ISS_ACTION_CODE_DEFAULT9F0EPublic static byte ISS_ACTION_CODE_DENIAL9F0FPublic static byte ISS_ACTION_CODE_ONLINE5F28Public static byte ISS_COUNTRY_CODE5F2DPublic static byte LANGUAGE_PREFRENCE9F51Public static byte APP_CURRENCY_CODE50Public static byte APP_LABLE9F07Public static byte AUC8EPublic static byte CVM_LIST9F49Public static byte DDOL9F52Public static byte ADA5F34Public static byte PAN_SEQUENCE_NUMBER5F30Public static byte SERVICE_CODE5F24Public static byte APP_EFFECTIVE_DATE5F25Public static byte APP_EXPIRATION_DATE9F14Public static byte LOWER_CON_OFFLINE_LIMIT9F23Public static byte UPPER_CON_OFFLINE_LIMIT表5 Common定义的数据交易对象7.个人化数据处理7.1卡片处理本节主要介绍个人化过程中,数据传入后,Applet内部的处理流程,主要是以下两个步骤

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论