javacard cap文件

更新时间:2023-11-29 21:48:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

当创建一个Java Card应用程序的时候的典型的步骤是: 1、编写Java源代码。

2、编译你的源代码。

3、把类文件改变为一个Converted Applet(CAP)文件。

4、检验这个CAP是否有效;这个步骤是可选的。

5、安装这个CAP文件。

当用Java程序设计语言开发传统的程序的时候,头两个步骤是相同的:编写.java文件并且把它们编译成.class文件。可是,一旦你已经创建Java Card类文件,过程会变化的。

Java Card虚拟机(JCVM)被分成卡外虚拟机和卡内虚拟机。这个分解移除了昂贵的卡外操作,并且考虑到了在卡本身上的小的内存空间,但是它导致在开发Java Card应用程序的时候的额外步骤。

在Java Card类可以被导入一个Java Card设备之前,他们必须被转化成标准的CAP文件格式,然后选择性地检验:

· 转化必然伴有把每个Java程序包变换到一个CAP文件中,在一个程序包中包含类和接口的联合二进制表示法。转化是一个卡外操作。

验证是一个可选择的过程,来确认CAP文件的结构、有效的字节码子集和程序包内依赖性。你可能想在你使用的第三方供应商程序包上进行验证,或者如果你的转换工具来自一个第三方供应商。验证一般来说是一个卡外操作,但是一些卡片产品可能包括一个机载的检验器

一旦检验,CAP文件就即将安装在Java Card设备上了。

Sun JavaCard Development工具箱

你可以使用Sun JavaCard开发工具箱编写JavaCard小应用程序,并且甚至可以不使用一个智能卡或者读卡器来测试它们。这个工具箱包括所有你开发和测试所需要的Java Card小应用程序的基本工具:

1、 Java Card Workstation Development Environment ( JCWDE),一个便利的易于使用的JavaCard模拟工具,允许开发者直接执行类文件,而不要转化和安装CAP文件。JCWDE可以和调试程序和IDE整合。 从这个开发工具箱的2.2.1版本开始,JCWDE支持Java Card RMI ( JCRMI)。注意JCWDE不是一个成熟的Java Card模拟器。它不支持许多JCRE特性,例如包安装、小应用程序实例创建、防火墙和事务。请参阅这个开发工具箱的用户指南获取更多信息。

2、 C语言Java Card运行时环境(C-JCRE),一个使用C语言编写的可执行参考实现。C-JCRE是一个Java Card应用程序编程接口、虚拟机和运行时环境完全兼容的实现。它能让一个开发者在一个工作站环境中精确地测试小应用程序的行为。

C-JCRE有一些限制:它在一个卡片会话期间支持多达八个可以返回的引用,多达16个可以同时被导出的

远程对象,8个远程方法中的数组类型参数,32个支持的Java程序包和16个Java Card小应用程序。想要获得这些限制条件,请参阅Java Card开发工具箱用户指南。

3、 JavaCard转化工具,用于生成CAP文件。

4、 JavaCard检验,用于选择性地核对CAP和导出文件的有效性。

5、 一个发送和接收应用程序协议数据单元(Application Protocol Data Units,APDUs)的APDU工具(apdutool)。这样你就可以在Java Card小应用程序测试期间发送APDU。你可以apdutool读取的脚本文件,发送APDUs到C-JCRE或者JCWDE中。

6、 一个capdump工具,用于转出CAP的内容,和一个打印EXP文件的exp2text。

7、 一个scriptgen工具,转换CAP文件为APDU脚本文件。这个工具还被认为是卡外安装程序。

8、 支持库(用于Java Card应用编程接口的类文件和导出文件)文档和范例。

当Sun JavaCard开发工具箱允许你编写和测试Java Card小应用程序的时候,部署一个现实的端对端的智能卡应用程序需要开发工具箱中没有包含的工具,例如利用了终端应用程序编程接口,如OpenCard和Global Platform应用程序编程接口。它可能还需要利用例如Subscriber Identification Module (用户识别模块,SIM)工具包这样的工具来帮助你管理SIM。

图1显示了这个工具包的目录结构(Windows版本),以及包含开发工具的bin目录的内容。

Figure 1a. Development Kit Directory Structure

Figure 1b. Contents of bin directory 现在让我们在看一次Java Card开发步骤,这次使用Sun Java Card Development工具箱:

1.使用你喜爱的编辑器或者IDE编写Java源程序。

2.使用你喜爱的编译程序或者IDE编译Java源程序。

3.选择性地,使用JCWDE模拟器测试你的Java Card小应用程序。重申一下,JCWDE不是一个成熟的Java Card模拟器。

4.使用工具包的bin目录下的转换程序把类文件转化成一个Converted Applet (转化过的小应用程序,CAP)文件。注意,除类文件之外,另一个输入到这个转换工具中的文件是导出文件,提供了关于你的应用程序导入的(引用)的程序包的信息。这些是还被装载到卡片中的程序包。导出文件还是转换工具的一个输出。

5.选择性地,检验CAP的有效性。这一步包括使用verifycap脚本来验证CAP文件的有效性,使用verifyexp来验证导出文件,并且使用verifyrev来检验程序包修正之间的二进制兼容性。工具verifycap、verifyexp和verifyrev脚本全部都可在bin目录中得到。

6.安装CAP文件。使用scriptgen工具转换CAP文件为一个(安装)APDU脚本文件。然后使用apdutool发送脚本文件(安装APDU命令和CAP文件)到Java Card设备上的C-JCRE或者一个JCRE。JCRE保存CAP文件到卡片的内存中。

下面的图总结了这些步骤。注意每个Java Card供应商提供它自己的工具,但是这些用于开发一个Java Card小应用程序的步骤在开发工具箱之间通常是相同的:

Figure 2. Java Card Development Steps(click for larger image)

--------------------------------------- JAVA卡的APPLET

开发Java卡Applet的软硬件清单

硬件:PC(奔腾II 266 以上),读卡器,JAVA 卡

软件:Windows95/98/NT4.0, VJ++6.0, JDK1.2.2, Java Card 2.1.1 Development Kit

在上述软件清单中,Java Card 2.1.1 Development Kit(JAVA 卡开发工具)是开发 JAVA 智能卡 Applet 所特有的工具。我们在这对它进行简单的介绍。你能在 网址得到这个 JAVA 卡开发工具。 Java Card 2.1.1 Development Kit 主要包括了:

1. 应用工具:如转换器(converter),apdutools等。它们位于 bin 目录下。

2. 文档: Java Card? 2.1.1 Development Kit User’s Guide(JAVA 卡开发工具用户指南),位于

doc 目录下

3. JAVA 卡编译时必须的 exp 和 class 文件。exp 文件位于 api21 目录的子目录下,它们分别是 ,

, 和 。class 文件主要存放在 文件中,位于 bin 目录下 4. 例子:一些有用的例子位于 sample 目录下

JAVA 卡 Applet 的生成

一些术语:

在介绍 JAVA 卡 Applet 生成过程之前,我们先来回顾一些 JAVA 智能卡的术语:

APDU(应用协议数据单元):用于智能卡与外界进行数据交换的基本命令单位。一个 APDU 要么包含一个指令消息,要么包含一个响应消息,这个消息发自智能卡或者读卡设备。它是智能卡与外界通信的基础。详细信息参照 ISO 7816-3 标准。

EEPROM (Electrically-Erasable Programmable Read-Only Memory——电气可拭除可编程只读存储

器):一种出厂后还能被写入数据的存储器

AID(Application identifier 应用ID号):ISO 7816-5 定义了 AID 的结构,为了能使每一个 Applet 都有一个唯一的ID身份号。JAVA 卡通过 AID 来确认 Applet。AID 是由ISO国际组织来管理的,所以它是唯一的。

JCRE(Java Card Runtime Environment JAVA 卡运行环境):它包括 JAVA 虚拟机,JAVA 卡的框架(Framework) 和一些基本函数(native functions)。

一些与生成 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++, Visual Café 等等。

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 公司的 Java Development Kit (Java 开发工具)。它是一个执行程序“”,位于 JDK 的 bin 目录下。编译时,输入文件是:Java 源代码程序(*.java)和一些 JAVA 卡的包(package)。这些包保存在 文件中。 位于Java Card Development Kit 的 bin 目录下。输出文件是:class 文件,它的前缀与输入文件一致,后缀为.class ,它将位于 Java 源文件(*.java)同一目录下。

编译命令行:

<编译执行程序的路径和程序名> <可选参数>

相信大家对 JAVA 编译命令行都较为熟悉了,不过请注意在 JAVA 卡 Applet 编译时我们只用“-g”参数,而不用“-O”参数,因为用“-g”参数时,我们能在 class 文件中产生“LocalVariableTable”属性,而这个属性在转换时(converter)要被使用到。但如果同时又使用了“-O”参数,“LocalVariableTable”属性就不会被产生了。这样转换时就会出错。另外 –d 参数指明生成的 class 文件放置的根目录,注意它是根目录,也就是说 class 文件位于此根目录下的项目目录中。

例如:

c:\\JDK\\bin\\ –g –d c:\\sample\\ -classpath c:\\jc211\\bin\\ c:\\sample\\Helloworld\\

如上命令行即完成了 的编译,同时在编译时用到了 中的一些 class 文件

?

转换(converter)

转换器(converter)是由 Java Card Development kit 提供的字节代码工具。作为字节代码工具,它需要 Java 解释器的帮助才能运行。它将 class 文件转换成一些输出文件。转换时,输入文件是:由编译器生成的 class 文件。输出文件是:Cap 文件,Export 文件,JCA 文件,它们的后缀分别是:*.cap,*.exp,*.jca,文件名与输入文件一致。它们将位于 Java 卡项目目录下的一个叫 Javacard 的子目录中。

转换器命令行:

<解释器> <-classpath> <被执行的 class> <可选参数> <包(package)名> <包 AID> <版本>

解释器:提供解释器的路径和文件名,如c:\\JDK\\bin\\

被执行的 class :就是位于 中 com\\sun\\javacard\\converter\\converter\\ 目录下的一些类。

在安装了 Java Card Development kit(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\\ –classpath c:\\jc211\\bin\\ -out EXP JCA CAP -exportpath c:\\jc211\\api21 -applet 0xa0:0x0:0x0:0x0:0x62:0x3:0x1:0xc:0x1:0x1 0xa0:0x0:0x0:0x0:0x62:0x3:0x1:0xc:0x1 1.0

或 -out EXP JCA CAP -exportpath c:\\jc211\\api21 -applet 0xa0:0x0:0x0:0x0:0x62:0x3:0x1:0xc:0x1:0x1 0xa0:0x0:0x0:0x0:0x62:0x3:0x1:0xc:0x1 1.0

开发 JAVA 卡 Applet 的过程

JAVA 卡 Applet 的开发过程与其他软件的开发过程是完全一样的,必须进行设计,实现,测试等过程。在这里我们简单介绍一下 JAVA 卡 Applet 的设计过程,并通过一个简单的例子的引入,进行每个过程的说明。

根据 JAVA 卡 Applet 的特点,一般它的设计过程有以下四个步骤:

1. Applet 功能定义

功能定义是确定我们将要完成的 Applet 的功能,即定义 Applet 能做什么,而不能做什么。那我们这个 Applet 的功能是什么呢?

我们的例子是一个简单的“电子钱包”,它支持存款(credit),取款(debit), 和检查存款余额(get balance)等功能。当然,为了防治非法对“电子钱包”进行操作,这个简单的例子也包含了一些安全保护措施。它要求在使用此 “电子钱包”的某些功能前,如存款,取款等功能,用户的 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, short bOffset, byte bLength)

Applet 必须用 install() 方法来创建一个 Applet 的实例,同时调用 register () 方法来注册这个实例

process (APDU apdu)

一旦 Applet 被选中,当 Applet 收到 APDU 指令时,process() 方法会被调用。在 process() 方法中,我们将分析 APDU 指令,从而进行相应处理,并返回相应的返回值。

register ()

调用register () 方法用来注册 Applet 的实例

还有一些经常被使用的方法:

1. getShareableInterfaceObject (AID client AID, byte parameter)

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 码命令)

Verify APDU 指令 (验证 PIN 码指令 )- 终端发给卡 CLA INS P1 P2 Lc Data Field Le 无 0xB0 0x20 0x0 0x0 PIN 码的长度 PIN 码 o CLA 指明我们的 Applet 的指令集是“B0”

o INS 指明“Verify” 指令是“20”,当终端发出“20”的指令给 Applet,Applet 就知道它是“Ver

ify”命令( 验证 PIN 码命令)

o P1,P2 在这没有用,我们设置为0

o Lc 指明 Data Field 的长度,在这里就是 PIN 码的长度 o Data Field 在这里就是 PIN 码的值 o Le 没有用

Verify APDU 响应 (验证 PIN 码指令响应)- 卡发给终端 Data Field SW1 + SW2 (状态字) 状态字含义 无 无 0x9000 0x6300 命令执行成功 验证 PIN 码失败 Data Field 在这里没有用

CREDIT 指令(存款指令)

CREDIT APDU 指令(存款指令)- 终端发给卡 CLA INS P1 P2 Lc Data Field 0xB0 0x30 0x0 0x0 1 存款金额 Le 无 为了方便介绍,我们规定每次的存取金额最多为 127(0X7F),所以存款金额(Data Field)用一个字节就能表示,而 Lc 一定为1

CREDIT APDU 响应 (存款指令响应)- 卡发给终端 Data Field SW1 + SW2 (状态字) 状态字含义 无 无 无 0x9000 0x6A83 0x6A84 存款命令执行成功 存款金额无效 存储总金额超过最大值

本文来源:https://www.bwwdw.com/article/0fit.html

Top