admin 管理员组文章数量: 887019
2024年2月26日发(作者:js文字特效怎么弄)
JCOP开发调试JavaCard程序及测试脚本的编写执行
一 .JCOP插件的安装
第一步
在eclipse里安装JCOP的插件,安装过程简述:Help->Software Updates->Find and Install调出安装窗口如下图
第二步
选择:Search for new features to install,出现如下图的窗口
第三步
点击 new Local Site按钮,打开JCOP插件所在目录,并选中,如下图所示,确定
然后一直点下一步下一步就可以了,安装完了
二.创建工程
通过创建工程向导创建一个JavaCard工程(如,TestApp)。创建过程如下图
Project name填写工程的名字点next
选择Java Card API的版本,选择GP版本,点next
勾选 Create a Java Card application using one of the templates(使用模板创建一个JAVACARD的应用)
选择模板的类型,比如 Basic Java Card applet 点next
输入Package(包名)和Applet class name(Applet的类名),点next
输入Package AID和Applet AID,前5个字节要保持一致。点Finish,一个JAVACARD的工程就创建完成了
代码模板包括一个install方法和process方法,install方法是用来安装applet的,process方法是用来处理apdu指令的
下面在模板代码的基础上我们来实现一个取随即数的功能
ISO7816规定取随机数的apdu命令是:00 84 00 00 08(04)最后一个字节表示要取的随机数的长度
三.写代码实现功能
package TestAppPkg;
import ;
import 7816;
import ;
import eption;
import em;
import ;
import Data;
public class TestApp extends Applet {
private byte[] randombuffer;
RandomData Random;
public static void install(byte[] bArray, short bOffset, byte bLength) {
}
public void process(APDU apdu) {
// Good practice: Return 9000 on SELECT
if (selectingApplet()) {
}
byte[] buf = fer();
switch (buf[_INS]) {
return;
// GP-compliant JavaCard applet registration
new p().register(bArray, (short) (bOffset + 1),
bArray[bOffset]);
case (byte) 0x84:
if (buf[_CLA] != (byte)0x00)
t(_CLA_NOT_SUPPORTED);
if ((buf[_P1] != (byte)0x00) || (buf[_P2] != (byte)0x00))
t(_INCORRECT_P1P2);
short le = buf[_LC];
if (randombuffer == null){
randombuffer = ansientByteArray( (short)le,_ON_RESET);
}
}
Random = tance(_SECURE_RANDOM);
teData(randombuffer,(short)0,(short)le);
opyNonAtomic(randombuffer,(short)0,buf,(short)0,(short)le);
goingAndSend((short)0,(short)le);
break;
default:
}
// good practice: If you don't know the INStruction, say so:
t(_INS_NOT_SUPPORTED);
四.编译运行测试程序
如下图,选择工程,右键,Run As->Run 打开run对话框如下面两个图所示
双击左测的Java Card Application,创建一个与工程同名的运行项目,选中上面的Java Card simulation可以在虚拟仿真环境下运行程序,如果选择下面的Card reader,然后再选读卡器,插入Java卡片,就可以直接把程序下载并安装到java 卡上,并执行,点run,程序开始执行如下图所示, 就可以看到程序下载到仿真环境过程中的字节码,还有applet安装成功后的信息
在cmd>命令框里输入/send 00A4111122 选择applet
返回9000
再输入/send 取随机数
返回 8个字节的随机数 01 F5 B4 11 5B 88 C3 B2 后跟9000表示命令执行成功
如下图所示
五.DeBug调试程序
DeBug调试需要在要调试的程序段下断点,如图所示,双击33行左侧的空位置,就会设上断点,如下图蓝色的小圆点,如果取消断点,只需在小圆点上再次双击一下。
如下图,选择工程,右键,Debug As->Debug 打开Debug对话框如下面两个图所示
选择已有的工程 TestApp,点Debug按钮,simulation开始加载applet并安装,如下图所示
在cmd>命令框里输入/send 00A4111122 选择applet
返回9000
再输入/send 取随机数
程序就会停到下断点的地方,如下图所示,也可以在程序加载完applet后再设断点
按F6单步执行,F5进入函数,F7跳出当前函数,F8跳到下一个断点,或结束运行。
一边调试可以一边观察Variables视图中对象和变量的赋值变化情况,变量的值还可以修改,如下图所示
六.测试脚本
在插件上运行提供脚本支持,对于想自动调试或者对较大程序的调试都非常有用,因此本期插件开发将脚本支持列为主要工作,这里提供jcop插件的脚本执行的步骤,供参考:
1、创建工程:
通过安装了jcop插件的eclipse的向导创建javacard工程(如,ShellTest)。
这里我们写一个capfile的自动安装的脚本(ShellTest_),脚本最开始应该是变量的申明,2、创建脚本:
也可以直接引用插件生成的变量(第三步), 脚本如下:
#-------------------------------------
#
#cap file auto install javacard shell
#
#--------------------------------------
#这里可以直接进行变量申明,也可以引用插件自动生成的变量
@/"${eclipse:workspace_loc:/ShellTest/bin/shell/}"
/terminal "${TERMINAL}"
/atr
/card -a ${CM_AID} -c ${CM_PLUGIN}
set-key ${KEYS}
print-key
init-update ${IUSET}
if "${CM_SECURED}" == "true"
ext-auth -mac
else
ext-auth
end
# upload/install packages/applets
/echo "upload/install packages/applets"
/set-var I 0
while ${I} < ${PKGCT}
upload -d "${PKG_${I}_CAP}"
/set-var J 0
while ${J} < ${PKG_${I}_APPCT}
install -i ${PKG_${I}_APP_${J}_INSTAID} -q C9#(${PKG_${I}_APP_${J}_INSTDATA}) ${PKG_${I}_AID}
${PKG_${I}_APP_${J}_AID}
/set-var J ${J} + 1
end
/set-var J
/set-var I ${I} + 1
end
/set-var I
3、生成变量:
右键工程选择run/debug,在run/debug configuration视图中选中Shell Initialization选项卡,在Package
Upload中选择第二个checkbox, 给定相应的路径我名称(如/ShellTest/bin/shell/),这里的后缀名可有可无.点击shell Setting选项卡,设置脚本的搜索目录,点击apply,点击debug/run生成此工程目前需要的变量,此时虚拟机处于启动状态。自动生成的变量列表如下:
# -----------------------------------------------------------
# Automatically generated by JCOP Tools -- DO NOT MODIFY!
#
# ShellTest
#
# This script sets shell variables specific to this
# launch. These shell variables can be used to drive
# customized initialization scripts.
#
# You can include this script by adding the following line
# to your own script:
#
# @/"${eclipse:workspace_loc:/ShellTest/bin/shell/}"
#
# -----------------------------------------------------------
KEY_255_2="464748494a4b4c4d4e4f"
PKG_0_APPCT="1"
KEYS="255/1/DES-ECB/464748494a4b4c4d4e4f
255/2/DES-ECB/464748494a4b4c4d4e4f 255/3/DES-ECB/464748494a4b4c4d4e4f"
KEY_255_3="464748494a4b4c4d4e4f"
CM_PLUGIN="nager"
PKG_0_APP_0_INSTDATA=""
PKG_0_CAP="E:PROJECTSJAVACARDJCOP_"
PKG_0_APP_0_INSTAID="aabbccddeeff"
PKG_0_AID="aabbccddee"
KEY_255_1="464748494a4b4c4d4e4f"
MODE="debug"
PKG_0_APP_0_PRIVS="00"
MAX_UPLOAD_BLOCK_SIZE="250"
CM_LEVEL="plain"
PKGCT="1"
PKG_0_APP_0_AID="aabbccddeeff"
TERMINAL="Remote|localhost:2537"
CM_SECURED="255"
CM_AID="a000"
4、脚本执行:
在命令输入框中输入:@ShellTest_autoInstall,此处不需要扩展名。脚本就将被解析执行,如果需要调试,则在相应的地方下断点即可,如需要高度install函数,在install函数中下断点,脚本执行过程中模拟器就会在断点处中断。
5、脚本编写:
此脚本存在一个问题,只适用于模拟器,如果是实卡,则需要先删除原有的applet,可参考以下脚本:
# attempt to delete existing packages/applets
/set-var -s I ${PKGCT}
while 0 < ${I}
/set-var -s I ${I} - 1
/set-var -s J 0
while ${J} < ${PKG_${I}_APPCT}
delete ${PKG_${I}_APP_${J}_INSTAID}
/set-var -s J ${J} + 1
end
/set-var -s J
delete ${PKG_${I}_AID}
end
/set-var -s I
我们还可以在card-info后面添加自己想要的执行流程,如安装完成后选择一下applet,如果选择正确,则发送测试命令8000000000,脚本的规范请参考jcop的帮助文档。
# select the applet
/echo "select the applet"
/echo "----------------------------------------------------"
/select ${PKG_0_APP_0_AID}
if ${response} != '6A82'
# OK and send command
send 8000000000
else
/echo "applet not found"
End
本文档编写于2012-3-10,作者:曹昆,希望对从事javacard应用开发处于入门阶段的朋友有所帮助
版权声明:本文标题:JavaCard Applet开发调试及测试脚本的编写执行 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1708933457h534736.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论