javacardcap文件.docx
- 文档编号:23776059
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:22
- 大小:124.79KB
javacardcap文件.docx
《javacardcap文件.docx》由会员分享,可在线阅读,更多相关《javacardcap文件.docx(22页珍藏版)》请在冰豆网上搜索。
javacardcap文件
当创建一个JavaCard应用程序的时候的典型的步骤是:
1、编写Java源代码。
2、编译你的源代码。
3、把类文件改变为一个ConvertedApplet(CAP)文件。
4、检验这个CAP是否有效;这个步骤是可选的。
5、安装这个CAP文件。
当用Java程序设计语言开发传统的程序的时候,头两个步骤是相同的:
编写.java文件并且把它们编译成.class文件。
可是,一旦你已经创建JavaCard类文件,过程会变化的。
JavaCard虚拟机(JCVM)被分成卡外虚拟机和卡内虚拟机。
这个分解移除了昂贵的卡外操作,并且考虑到了在卡本身上的小的内存空间,但是它导致在开发JavaCard应用程序的时候的额外步骤。
在JavaCard类可以被导入一个JavaCard设备之前,他们必须被转化成标准的CAP文件格式,然后选择性地检验:
·转化必然伴有把每个Java程序包变换到一个CAP文件中,在一个程序包中包含类和接口的联合二进制表示法。
转化是一个卡外操作。
验证是一个可选择的过程,来确认CAP文件的结构、有效的字节码子集和程序包内依赖性。
你可能想在你使用的第三方供应商程序包上进行验证,或者如果你的转换工具来自一个第三方供应商。
验证一般来说是一个卡外操作,但是一些卡片产品可能包括一个机载的检验器
一旦检验,CAP文件就即将安装在JavaCard设备上了。
SunJavaCardDevelopment工具箱
你可以使用SunJavaCard开发工具箱编写JavaCard小应用程序,并且甚至可以不使用一个智能卡或者读卡器来测试它们。
这个工具箱包括所有你开发和测试所需要的JavaCard小应用程序的基本工具:
1、JavaCardWorkstationDevelopmentEnvironment(JCWDE),一个便利的易于使用的JavaCard模拟工具,允许开发者直接执行类文件,而不要转化和安装CAP文件。
JCWDE可以和调试程序和IDE整合。
从这个开发工具箱的2.2.1版本开始,JCWDE支持JavaCardRMI(JCRMI)。
注意JCWDE不是一个成熟的JavaCard模拟器。
它不支持许多JCRE特性,例如包安装、小应用程序实例创建、防火墙和事务。
请参阅这个开发工具箱的用户指南获取更多信息。
2、C语言JavaCard运行时环境(C-JCRE),一个使用C语言编写的可执行参考实现。
C-JCRE是一个JavaCard应用程序编程接口、虚拟机和运行时环境完全兼容的实现。
它能让一个开发者在一个工作站环境中精确地测试小应用程序的行为。
C-JCRE有一些限制:
它在一个卡片会话期间支持多达八个可以返回的引用,多达16个可以同时被导出的远程对象,8个远程方法中的数组类型参数,32个支持的Java程序包和16个JavaCard小应用程序。
想要获得这些限制条件,请参阅JavaCard开发工具箱用户指南。
3、JavaCard转化工具,用于生成CAP文件。
4、JavaCard检验,用于选择性地核对CAP和导出文件的有效性。
5、一个发送和接收应用程序协议数据单元(ApplicationProtocolDataUnits,APDUs)的APDU工具(apdutool)。
这样你就可以在JavaCard小应用程序测试期间发送APDU。
你可以apdutool读取的脚本文件,发送APDUs到C-JCRE或者JCWDE中。
6、一个capdump工具,用于转出CAP的内容,和一个打印EXP文件的exp2text。
7、一个scriptgen工具,转换CAP文件为APDU脚本文件。
这个工具还被认为是卡外安装程序。
8、支持库(用于JavaCard应用编程接口的类文件和导出文件)文档和范例。
当SunJavaCard开发工具箱允许你编写和测试JavaCard小应用程序的时候,部署一个现实的端对端的智能卡应用程序需要开发工具箱中没有包含的工具,例如利用了终端应用程序编程接口,如OpenCard和GlobalPlatform应用程序编程接口。
它可能还需要利用例如SubscriberIdentificationModule(用户识别模块,SIM)工具包这样的工具来帮助你管理SIM。
图1显示了这个工具包的目录结构(Windows版本),以及包含开发工具的bin目录的内容。
Figure1a.DevelopmentKitDirectoryStructure
Figure1b.Contentsofbindirectory
现在让我们在看一次JavaCard开发步骤,这次使用SunJavaCardDevelopment工具箱:
1.使用你喜爱的编辑器或者IDE编写Java源程序。
2.使用你喜爱的编译程序或者IDE编译Java源程序。
3.选择性地,使用JCWDE模拟器测试你的JavaCard小应用程序。
重申一下,JCWDE不是一个成熟的JavaCard模拟器。
4.使用工具包的bin目录下的转换程序把类文件转化成一个ConvertedApplet(转化过的小应用程序,CAP)文件。
注意,除类文件之外,另一个输入到这个转换工具中的文件是导出文件,提供了关于你的应用程序导入的(引用)的程序包的信息。
这些是还被装载到卡片中的程序包。
导出文件还是转换工具的一个输出。
5.选择性地,检验CAP的有效性。
这一步包括使用verifycap脚本来验证CAP文件的有效性,使用verifyexp来验证导出文件,并且使用verifyrev来检验程序包修正之间的二进制兼容性。
工具verifycap、verifyexp和verifyrev脚本全部都可在bin目录中得到。
6.安装CAP文件。
使用scriptgen工具转换CAP文件为一个(安装)APDU脚本文件。
然后使用apdutool发送脚本文件(安装APDU命令和CAP文件)到JavaCard设备上的C-JCRE或者一个JCRE。
JCRE保存CAP文件到卡片的内存中。
下面的图总结了这些步骤。
注意每个JavaCard供应商提供它自己的工具,但是这些用于开发一个JavaCard小应用程序的步骤在开发工具箱之间通常是相同的:
Figure2.JavaCardDevelopmentSteps(clickforlargerimage)
---------------------------------------
JAVA卡的APPLET
开发Java卡Applet的软硬件清单
硬件:
PC(奔腾II266以上),读卡器,JAVA卡
软件:
Windows95/98/NT4.0,VJ++6.0,JDK1.2.2,JavaCard2.1.1DevelopmentKit
在上述软件清单中,JavaCard2.1.1DevelopmentKit(JAVA卡开发工具)是开发JAVA智能卡Applet所特有的工具。
我们在这对它进行简单的介绍。
你能在网址得到这个JAVA卡开发工具。
JavaCard2.1.1DevelopmentKit主要包括了:
1.应用工具:
如转换器(converter),apdutools等。
它们位于bin目录下。
2.文档:
JavaCard?
2.1.1DevelopmentKitUser’sGuide(JAVA卡开发工具用户指南),位于doc目录下
3.JAVA卡编译时必须的exp和class文件。
exp文件位于api21目录的子目录下,它们分别是,,和。
class文件主要存放在文件中,位于bin目录下
4.例子:
一些有用的例子位于sample目录下
JAVA卡Applet的生成
一些术语:
在介绍JAVA卡Applet生成过程之前,我们先来回顾一些JAVA智能卡的术语:
APDU(应用协议数据单元):
用于智能卡与外界进行数据交换的基本命令单位。
一个APDU要么包含一个指令消息,要么包含一个响应消息,这个消息发自智能卡或者读卡设备。
它是智能卡与外界通信的基础。
详细信息参照ISO7816-3标准。
EEPROM(Electrically-ErasableProgrammableRead-OnlyMemory——电气可拭除可编程只读存储器):
一种出厂后还能被写入数据的存储器
AID(Applicationidentifier应用ID号):
ISO7816-5定义了AID的结构,为了能使每一个Applet都有一个唯一的ID身份号。
JAVA卡通过AID来确认Applet。
AID是由ISO国际组织来管理的,所以它是唯一的。
JCRE(JavaCardRuntimeEnvironmentJAVA卡运行环境):
它包括JAVA虚拟机,JAVA卡的框架(Framework)和一些基本函数(nativefunctions)。
一些与生成JAVA卡Applet有关的重要的文件:
∙*.java JAVA语言的源代码文件
∙*.class JAVA语言的字节代码(Bytecode),它是由JAVA编译器javac编译产生的二进制代码,由JAVA解释器执行
∙*.jca JAVA卡的可读汇编语言,由转换器生成,并可进一步生成Cap文件
∙*.exp 输出文件,包含JAVA卡包(packages)的公共信息和连接信息。
∙*.cap 转化以后的Applet文件,它就是可以被JAVA卡装载并安装的可执行代码。
∙*.jar JAVA文档文件,JAR文件是一个与平台无关的,包含多个文件的文件格式。
Applet的生成
JAVA卡的Applet生成大致可分为以下几个步骤:
JAVA源代码编辑:
开发JAVA卡Applet首先当然要编辑JAVA源代码,开发人员可以任意选用他所喜爱的编辑工具,如UltraEdit,VJ++,VisualCafé等等。
JAVA源代码编译:
开发人员编写好JAVA源代码后,就可以用JAVA编译器生成class文件,当然这一过程还要包括必要的代码调试过程。
这一过程需要使用JAVA编译器。
Cap文件生成:
JAVA卡的运行环境并不“认识”JAVA的class文件,为了使开发好的Applet能在JAVA卡中运行,包含Applet的class文件必须被转换成Cap文件。
Cap文件就是可以被装载到JAVA卡上的Applet。
这一过程需要使用JAVA卡转换器(converter)。
Applet的安装:
当Applet的Cap文件生成后,我们就要进行Applet的安装。
在这一过程中一般我们需要使用PC机,读卡器和控制读卡器的软件工具。
我们通过使用在PC机上的控制读卡器的软件来控制读卡器,从而把Cap文件装载到JAVA卡上。
编译与转换
在JAVA卡的开发过程中,编译和转换过程是两个非常关键的过程,现在我们来介绍一下这两个过程。
在介绍之前,我们先来了解一下编译和转换时,一些文件在硬盘上存放的结构:
如下图所示。
我们有三层目录:
根目录,项目目录和JavaCard目录。
根目录是存放所有项目目录的目录。
项目目录存放着JAVA卡源代码文件和编译后的class文件。
JavaCard目录是由转换器自动生成的,它存放的是转换器的输出文件:
Cap文件,Exp文件和Jca文件。
一般上述这些文件的文件名需与项目目录的目录名一致,正常情况下,我们就用项目名来命名项目目录和这些文件名,如下图所示
∙编译(compiler)
编译过程与普通的JAVA编译过程没什么区别,它将编译JAVA文件,产生一些class文件。
编译器来自于Sun公司的JavaDevelopmentKit(Java开发工具)。
它是一个执行程序“”,位于JDK的bin目录下。
编译时,输入文件是:
Java源代码程序(*.java)和一些JAVA卡的包(package)。
这些包保存在文件中。
位于JavaCardDevelopmentKit的bin目录下。
输出文件是:
class文件,它的前缀与输入文件一致,后缀为.class,它将位于Java源文件(*.java)同一目录下。
编译命令行:
<编译执行程序的路径和程序名><可选参数>
相信大家对JAVA编译命令行都较为熟悉了,不过请注意在JAVA卡Applet编译时我们只用“-g”参数,而不用“-O”参数,因为用“-g”参数时,我们能在class文件中产生“LocalVariableTable”属性,而这个属性在转换时(converter)要被使用到。
但如果同时又使用了“-O”参数,“LocalVariableTable”属性就不会被产生了。
这样转换时就会出错。
另外–d参数指明生成的class文件放置的根目录,注意它是根目录,也就是说class文件位于此根目录下的项目目录中。
例如:
c:
\JDK\bin\–g–dc:
\sample\-classpathc:
\jc211\bin\c:
\sample\Helloworld\
如上命令行即完成了的编译,同时在编译时用到了中的一些class文件
∙转换(converter)
转换器(converter)是由JavaCardDevelopmentkit提供的字节代码工具。
作为字节代码工具,它需要Java解释器的帮助才能运行。
它将class文件转换成一些输出文件。
转换时,输入文件是:
由编译器生成的class文件。
输出文件是:
Cap文件,Export文件,JCA文件,它们的后缀分别是:
*.cap,*.exp,*.jca,文件名与输入文件一致。
它们将位于Java卡项目目录下的一个叫Javacard的子目录中。
转换器命令行:
<解释器><-classpath><被执行的class><可选参数><包(package)名><包AID><版本>
解释器:
提供解释器的路径和文件名,如c:
\JDK\bin\
被执行的class:
就是位于中com\sun\javacard\converter\converter\目录下的一些类。
在安装了JavaCardDevelopmentkit(Java卡开发工具)后,开发工具会提供给你一个批处理文件:
,它包含的就是命令行中:
<解释器><-classpath><被执行的class>这三部分内容。
也就是说,你在进行Applet转换时,对这三部分参数的可以不十分了解,而直接使用进行文件转换。
∙命令行的一些可选参数的介绍:
-classdir:
项目的根目录
-exportpath:
一些转换时要用到的Exp文件的父目录,
-d:
输出的路径,它指明的是根目录
-applet[AID][classname]:
指明缺省Applet的AID,和含Install()方法的class文件名
-out[CAP][EXP][JCA]:
说明要转换器生成什么文件,一般默认为生成CAP和EXP文件
-nobanner:
信息使用标准输出
包(package)名:
要被转换的包名
包AID:
5到16十进制,十六进制或八进制数,表明Applet的AID
版本:
用户自定义的版本号
例如
c:
\JDK\bin\–classpathc:
\jc211\bin\-outEXPJCACAP-exportpathc:
\jc211\api21-applet0xa0:
0x0:
0x0:
0x0:
0x62:
0x3:
0x1:
0xc:
0x1:
0x10xa0:
0x0:
0x0:
0x0:
0x62:
0x3:
0x1:
0xc:
0x11.0
或-outEXPJCACAP-exportpathc:
\jc211\api21-applet0xa0:
0x0:
0x0:
0x0:
0x62:
0x3:
0x1:
0xc:
0x1:
0x10xa0:
0x0:
0x0:
0x0:
0x62:
0x3:
0x1:
0xc:
0x11.0
开发JAVA卡Applet的过程
JAVA卡Applet的开发过程与其他软件的开发过程是完全一样的,必须进行设计,实现,测试等过程。
在这里我们简单介绍一下JAVA卡Applet的设计过程,并通过一个简单的例子的引入,进行每个过程的说明。
根据JAVA卡Applet的特点,一般它的设计过程有以下四个步骤:
1.Applet功能定义
功能定义是确定我们将要完成的Applet的功能,即定义Applet能做什么,而不能做什么。
那我们这个Applet的功能是什么呢?
我们的例子是一个简单的“电子钱包”,它支持存款(credit),取款(debit),和检查存款余额(getbalance)等功能。
当然,为了防治非法对“电子钱包”进行操作,这个简单的例子也包含了一些安全保护措施。
它要求在使用此“电子钱包”的某些功能前,如存款,取款等功能,用户的PIN码必须被验证。
如果用户的PIN码连续三次验证都是错的,那么这个“电子钱包”就不能再被使用了。
当然,真正的“电子钱包”的安全措施要复杂得多。
同时,为了简化“电子钱包”存储过程,我们规定“电子钱包”的最大存储额为32767(0X7FFF),每次的存取金额最多为127(0X7F)。
2.获取Applet的AID
在JAVA卡的技术中,我们用AID来识别Applet。
每个商用Applet都有自己唯一的AID。
ISO7816根据如下规定来保证AID的唯一
其中RID是ISO分配给各个卡供应商的ID号,它们是唯一的。
而PIX是由各个供应商自己来管理的Applet的ID号。
AID将会在转换过程中被使用。
请参阅上文。
当然,读者在编写自己的Applet时,AID只需符合ISO7816的长度规定,而无须向ISO申请RID号。
3.设计Applet程序的类结构
JAVA卡Applet必须从类扩展而来,并需要实现一些必须的方法。
下面就是这些必须实现的方法,当JAVA卡收到终端发出的APDU命令后,这些方法就将被调用:
select()
当Applet收到“Select”的APDU命令,相对应的Applet的select()方法将被调用,在select()方法中,我们做一些初始化的工作。
当select()方法返回true,则说明被选择的Applet已被选择,并准备好处理APDU命令。
deselect()
当另一个Applet被选中,当前选中的Applet的deselect()方法将被调用,在deselect()方法中一般执行一些复位的工作,在本例子中,我们复位PIN码。
install(byte[]bArray,shortbOffset,bytebLength)
Applet必须用install()方法来创建一个Applet的实例,同时调用register()方法来注册这个实例
process(APDUapdu)
一旦Applet被选中,当Applet收到APDU指令时,process()方法会被调用。
在process()方法中,我们将分析APDU指令,从而进行相应处理,并返回相应的返回值。
register()
调用register()方法用来注册Applet的实例
还有一些经常被使用的方法:
1.getShareableInterfaceObject(AIDclientAID,byteparameter)
getShareableInterfaceObject()方法是用来实现Applet之间相互通信的方法。
selectingApplet()
由于当Applet被选中后,所有的APDU命令,包括select命令都会发送至process()方法,selectingApplet()方法就是为了区别select命令与其他命令。
一般selectingApplet()由process()方法调用,返回true说明是select命令。
2.制定Applet与终端之间的接口
为了实现Applet与终端之间的通信,我们就要制定它们之间的通信协议。
根据ISO7816规定,终端与卡之间的通信遵循APDU的通信准则,即终端发出APDU命令,智能卡执行完这个APDU命令后,返回APDU响应。
有关APDU通信的详细资料请参阅本系列的第一篇文章《智能卡与安全》。
然而,虽然ISO7816制定了智能卡与终端的通信准则,但它并没有制定通信的具体内容。
所以为了实现智能卡与终端的通信,为了使智能卡与终端能够彼此“听懂”对方的“语言”,我们必须在APDU通信的基础上人为制定一些双方明白的“语言”。
下面我们例举了本例子的一些通信接口“语言”:
Verify指令(验证PIN码命令)
VerifyAPDU指令(验证PIN码指令)-终端发给卡
CLA
INS
P1
P2
Lc
DataField
Le
0xB0
0x20
0x0
0x0
PIN码的长度
PIN码
无
oCLA指明我们的Applet的指令集是“B0”
oINS指明“Verify”指令是“20”,当终端发出“20”的指令给Applet,Applet就知道它是“Verify”命令(验证PIN码命令)
oP1,P2在这没有用,我们设置为0
oLc指明DataField的长度,在这里就是PIN码的长度
oDataField在这里就是PIN码的值
oLe没有用
VerifyAPDU响应(验证PIN码指令响应)-卡发给终端
DataField
SW1+SW2(状态字)
状态字含义
无
0x9000
命令执行成功
无
0x6300
验证PIN码失败
DataField在这里没有用
CREDIT指令(存款指令)
CREDITAPDU指令(存款指令)-终端发给卡
CLA
INS
P1
P2
Lc
DataField
Le
0xB0
0x30
0x0
0x0
1
存款金额
无
为了方便介绍,我们规定每次的存取金额最多为127(0X7F),所以存款金额(DataField)用一个字节就
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- javacard cap文件 cap 文件