本文改编自:http://www.dreamingfish123.info/?p=580,旨在对原文进行扩展,对JCDK v3.0.0.5的情况进行说明。
JAVA CARD技术基本概念
Java Card是基于硬件与应用的要求所开发的技术,目的是使得Java技术能够再如同smart card芯片般大小的有限资源下执行,是能运行Java程序的智能卡。Java Card技术提供了一种开放式开发构架,现在的智能卡开发者可以开发出在多种智能卡上应用的程序,不同的应用程序可以在同一个卡片上运行。
从一个 applet 的编写、编译、转换、部署、使用的过程看,会是这样的与脚本相关的过程:
- javac – 编译 *.java
- converter – 生成 cap, jca, exp
- genscript – 由 cap 文件产生 scr 脚本
- apdutool – 利用 scr 脚本,将 applet 部署到卡(虚拟机的 eeprom文件)中
- apdutool – 利用虚拟机测试 applet
JAVA CARD DEVELOPMENT TOOLS
目前Oracle已经提供了所有开发Java Card Applet所需要的tools、libraries和一系列的APIs,最多使用的是2.2.1和2.2.2版本。
Note: 目前还不需要用到JCDK 3.x,因为还没有实体java卡支持其开发,而在没有可以实时部署和测试的环境的情况下,去学习这个版本试没有意义的。
JCDK中包含Converter、APDUTool、ScriptGen等重要的工具,还提供两个Java智能卡运行环境的仿真工具Cref和JCWDE,通过这两个工具,无需读/写器和智能卡卡片,开发人员可以在PC软件平台上模拟Java智能卡的运行,进行Applet的调试运行。
JAVA CARD APPLET STRUCTURE
几个比较重要的functions:
public static void install(byte[] bArray, short bOffset, byte bLength){}
public void process(APDU apdu){}
protected final void register(){}
//or protected final void register(byte[] bArray, short bOffset, byte bLength){} throws SystemException public boolean select(){}
- install( ):构建了Applet子类的实例,JCRE将会最先调用这个;所有的初始化和分配内存的操作应该在这个里面实现;可以获取卡外实体传进来的一些应用初始化参数。
- process( ):类似于正常java class的main,在安装后,APDU的执行将在这里实现。
- register( ):applet用来在JCRE中注册该applet实例。
- register(parameters):和register( )功能一样,增加了可以分配其特定的AID的功能。
- select( ):JCRE一旦接收到SELECT[by name]命令时,将寻找命令中指示的AID对应的Applet,使之处于活跃状态,接收并处理接下来的APDU命令;在选择新的Applet前,JCRE先调用当前Applet的 deselect 方法;Applet可以拒绝被选择,此时 select 方法返回false;SELECT[by name]命令本身也将传递给applet处理,此时通过 selectingApplet 用以判断当前状态。
ECLIPSEJCDE
开发环境搭建
- 在Sun/Oracle官网上下载 Java Platform 1.5(JDK) (http://www.oracle.com/technetwork/java/javase/downloads/index.html)
- 在Sun/Oracle官网上下载 Java Card Development Kit v2.2.2 (JCDK)(http://www.oracle.com/technetwork/java/javame/javacard/download/devkit/index.html),解压到 “java-card-dev-kit-root”,例如“C:\java_card_kit-2_2_2”
- 解压“java-card-dev-kit-root/java_card_kit-2_2_2/java_card_kit-2_2_2-rr-bin-windows-do.zip”到“java-card-dev-kit-home”,例如“C:\java_card_kit-2_2_2-windows\java_card_kit-2_2_2”
- 下载eclipse 4.3 (http://www.eclipse.org/downloads/),将其内容解压到“eclipse-root”,例如“C:\eclipse”
- 下载EclipseJCDE(http://sourceforge.net/projects/eclipse-jcde/files/),将其内容解压到“eclipse-root”
- 启动eclipse
- 菜单栏中“Java Card” => “Preferences”
- 点击“Browse”,指向“java-card-dev-kit-home”路径
Tools
- “Set Package AID”:设定选中包的AID,这个AID将会在生成CAP文件和APDU脚本、以及将该包安装到模拟器中时用到。
- “Set Applet AID”:设定选中的Java Card Applet的AID
- “Convert”:将Java Card package转换为CAP文件;可以选择是否同时生成EXP文件和JCA文件。
- CAP文件:转化后的applet文件,可被JAVA卡装载并安装的可执行代码
- EXP文件:输出文件,包含JAVA卡包的公共信息和连接信息
- JCA文件:可读汇编语言,由转换器生成,可进一步生成CAP文件
- “Generate Script”:生成APDU脚本文件*.script
- “Run Script”:发送APDU脚本文件中的APDU命令到模拟器中。
模拟器
- “CREF”:是一个C语言实现的参考JCRE的模拟器,但不支持Java Card应用运行在debug模式。
- “JCWDE”:Java Card Workstation Development Environment,是另一个模拟器,其支持Java Card应用运行在debug模式下。它是一个模拟了JCRE的java应用,但少了其中一些特征。
验证
EclipseJCDE提供了一组编译时验证,当Java Card应用程序在安装或运行在模拟器上时验证Java卡项目的一致性,避免运行时错误。
EclipseJCDE提供以下的验证:
- “Applet AID validation”:检查所有Java卡项目中的Java Card applet是否都有applet AID。
- “Package AID validation”:检查所有Java卡项目中的包是否都有package AID。
- “Duplicate AID validation”:检查所有Java卡项目以防有重复的AID。
开发实例-HELLOWORLD
Applet实现功能:将所有发送给此Applet的命令原封不动的返回给卡外应用。
该sample以CREF作为模拟器,用两种方法实现整个开发流程:Eclipse+JCDE 和 CMD
- Eclipse+JCDE是利用Eclipse上添加JCDE插件以便于Applet开发。
- CMD即所有compiling、converting等过程都在命令行下进行,可以在没有IDE的情况下完成Applet的开发。需要预先设置好环境变量
例如javacard_env.bat
1
2
3
4
5
|
@
echo
off
set
JC_HOME=C:\java_card_kit-2_2_2-windows\java_card_kit-2_2_2
set
JAVA_HOME=C:\jdk1.5.0_22
set
PATH=.;%JC_HOME%\bin;%JAVA_HOME%\bin;%PATH%
set
CLASSPATH=%JC_HOME%\lib\api.jar;%CLASSPATH%
|
Note:jdk的路径最好不要有空格,默认是装到”program files”目录下,这就有空格,会导致后面一些命令出错。
Compiling
编译sample applet中的java源代码:
- Eclipse+JCDE: 若Project – Build Automatically为选中状态,则此时源代码已经编译好。
- CMD:
1
javac -g HelloWorld.java
Converting
转换class文件,生成 .cap, .exp, .jca文件,其中 .cap 文件是实际加载安装到java card中的文件。