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应用开发处于入门阶段的朋友有所帮助


本文标签: 脚本 执行 工程 插件 变量