Eclipse JCOP重启后DF丢失?
我正在开发一个小型票务原型。 我想做的是-如果选择了顶级ADF,我想返回所有包含DFs的帮助,乍一看它工作得非常好 我创建ADF和1或2个DFs。当选择ADF时,这些DFs的帮助将返回良好,我可以添加EFs(或DFs) 现在,当我重新启动整个程序时(我使用的是JCOP btw),我仍然可以选择ADF,但DFs中的辅助信息不再返回,事实上,我得到的是6F00“无精确诊断” 对于我的数据结构,首先您可以看到ADF的最小构造函数,它没有父级Eclipse JCOP重启后DF丢失?,eclipse,bytearray,javacard,jcop,Eclipse,Bytearray,Javacard,Jcop,我正在开发一个小型票务原型。 我想做的是-如果选择了顶级ADF,我想返回所有包含DFs的帮助,乍一看它工作得非常好 我创建ADF和1或2个DFs。当选择ADF时,这些DFs的帮助将返回良好,我可以添加EFs(或DFs) 现在,当我重新启动整个程序时(我使用的是JCOP btw),我仍然可以选择ADF,但DFs中的辅助信息不再返回,事实上,我得到的是6F00“无精确诊断” 对于我的数据结构,首先您可以看到ADF的最小构造函数,它没有父级 public DirectoryFile(byte[] ai
public DirectoryFile(byte[] aid) {
super(aid);
this.aid = aid;
numApp = 1;
created = true;
}
第二种结构相同,但对于具有parentDirectoryFile和基本文件数组(arrayFiles)的“常用”目录文件:
public DirectoryFile(byte[] aid, DirectoryFile parent) {
super(aid, parent);
for (byte i = 0; i < numberFiles; i++) {
arrayFiles[i].setActive(false);
}
}
这应该是一个非常基本的文件系统,只要卡连接到终端,它就可以工作,但在重新启动程序后,信息似乎会丢失,尽管我根本没有为此使用瞬态阵列
返回代码总是“6F00-无精确诊断”,这会导致未检索的字节[]或类似的内容,除了创建新对象时实例化的DF对象之外,我找不到任何其他对象
编辑:刚刚发现这可能是一个更“普遍”的问题,这就是我做错的地方
现在,如果我使用“Hello World”并添加一些插件,就像我在这里做的那样:
public class HalloWeltApplet extends Applet {
private static byte[] helloWorld = new byte[11];
private static final byte HW_CLA = (byte)0x80;
private static final byte HW_INS = (byte)0x00;
private static final byte HW_INS1 = (byte)0x01;
private static final byte HW_INS2 = (byte)0x02;
public static void install(byte[] bArray, short bOffset, byte bLength) {
new HalloWeltApplet().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
}
public void process(APDU apdu) {
if (selectingApplet()) {
return;
}
byte[] buffer = apdu.getBuffer();
byte CLA = (byte) (buffer[ISO7816.OFFSET_CLA] & 0xFF);
byte INS = (byte) (buffer[ISO7816.OFFSET_INS] & 0xFF);
if(CLA != HW_CLA) {
ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
}
switch(INS) {
case HW_INS:
getHelloWorld(apdu);
break;
case HW_INS1:
getHelloWorld1(apdu);
break;
case HW_INS2:
getHelloWorld2(apdu);
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
private void getHelloWorld( APDU apdu) {
byte[] buffer = apdu.getBuffer();
short length = (short) helloWorld.length;
byte[] test = {(byte)'H',(byte)'e',(byte)'l',(byte)'l',(byte)'o',(byte)' ',(byte)'W',(byte)'o',(byte)'r',(byte)'l',(byte)'d',};
Util.arrayCopy(test, (short) 0, helloWorld, (short) 0, (short) test.length);
}
private void getHelloWorld1( APDU apdu) {
byte[] buffer = apdu.getBuffer();
short length = (short) helloWorld.length;
byte[] test = {(byte)'H',(byte)'i',(byte)' ',(byte)'W',(byte)'o',(byte)'r',(byte)'l',(byte)'d'};
Util.arrayCopy(test, (short) 0, helloWorld, (short) 0, (short) test.length);
}
private void getHelloWorld2( APDU apdu) {
byte[] buffer = apdu.getBuffer();
apdu.setOutgoing();
apdu.setOutgoingLength((short) helloWorld.length);
apdu.sendBytesLong(helloWorld, (short) 0, (short) helloWorld.length);
}
}
因此,在我看来,这应该将“Hello World”或“Hi World”保存到
helloWorld
中,并且使用INS2,我可以显示哪个被保存。但是每当我重新启动程序时,helloWorld
将由于启动而为空,对吗?这到底是我的问题吗?如果是的话,怎么解决呢?问题可能就在这里:
super(aid);
this.aid = aid;
首先正确复制数据,然后用在目录文件
构造函数中使用的字段覆盖文件
中的字段。如果这是一个临时缓冲区,或者更糟的是,JCRE拥有的APDU缓冲区,那么您的代码将失败,因为JCRE拥有的对象不应该通过持久引用使用
请注意,AID是应用程序标识符。它们识别应用程序,如Java卡小程序。通常情况下,文件和非应用程序DF(尤其是子DF)不使用AID标识或选择,而是使用文件标识符或(相关)短文件标识符。有关详细信息,请参见ISO/IEC 7816-4(我猜任何版本)
请注意,重置在JCOP模拟器中工作,但当您重新启动进程时,所有信息都会丢失;数据不会保存到磁盘,必须重新加载小程序 我认为
DirectoryFile
构造函数中的辅助工具根本没有使用,所以我完全忽略了它。但这不会有什么不同@AID的-我知道这一点,但我有“某种”主ADF,只有从ADF应该是应用程序,因此我使用的是AIDs,而不是文件ID。每当我重新启动HelloWorld示例并“打印”HelloWorld的内容时,它会返回空数组?不要写入静态字节数组,删除静态
关键字。静态在Javacard中很棘手。我看不到任何可疑的东西。尝试将阵列复制到apduBuffer上,并对JCOP sim使用apdu.setOutgoingand send insteadjusted answer。
super(aid);
this.aid = aid;