首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JCOP重启后DF是否丢失?

在JCOP重启后DF是否丢失?
EN

Stack Overflow用户
提问于 2014-05-28 20:12:02
回答 1查看 163关注 0票数 0

我正在开发一个小的票务原型。我想要做的是-如果顶层ADF被选中,我想返回所有包含DFs的AID,第一眼看起来它工作得很好。

我创建了ADF和1或2个DFs。当选择ADF时,这些DFs的辅助功能返回正常,我可以添加EFs (或DFs),...

现在,当我重新启动整个程序时(我使用的是JCOP btw。)我仍然可以选择ADF,但DFs中的艾滋病不再返回,事实上我得到了一个6F00“没有准确的诊断”。

对于我的数据结构-首先,您会看到ADF的最小构造函数,它没有父级

代码语言:javascript
复制
public DirectoryFile(byte[] aid) {
  super(aid);
  this.aid = aid;
  numApp = 1;
  created = true;
}

第二个结构是相同的,但对于具有parentDirectoryFile和基本文件数组(arrayFiles)的“常用”DirectoryFile:

代码语言:javascript
复制
public DirectoryFile(byte[] aid, DirectoryFile parent) {
    super(aid, parent);
    for (byte i = 0; i < numberFiles; i++) {
      arrayFiles[i].setActive(false);
    }   
}

两者都继承自相同的File.class

代码语言:javascript
复制
public File (byte aid[]) {
    Util.arrayCopy(aid, (short) 0, this.aid, (short) 0, (short) 6); 
}

public File (byte[] aid, DirectoryFile parentFile) {
    this.parentFile = parentFile;
    Util.arrayCopy(aid, (short) 0, this.aid, (short) 0, (short) 6); 
}

这应该是一个非常基本的文件系统,只要卡连接到终端,它就可以工作,但是在程序重新启动后,信息似乎丢失了,尽管我根本没有使用瞬态数组。

返回代码总是"6F00 -没有精确诊断“,这会导致一个未引用的byte[]或类似的东西,除了创建新对象时被实例化的DF对象之外,我找不到任何其他对象。

编辑:我刚刚发现这可能是一个更“一般”的问题,而这正是我做错的地方。

现在,如果我使用像http://umer555.wordpress.com/2012/05/17/java-card-hello-world-applet/这样的"Hello World“并添加一些INS,就像我在这里所做的那样:

代码语言:javascript
复制
  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将是空的,对吗?这到底是不是我的问题,如果是的话,怎么解决呢?

EN

回答 1

Stack Overflow用户

发布于 2014-05-29 05:24:36

问题可能出在这里:

代码语言:javascript
复制
super(aid);
this.aid = aid;

首先正确地复制数据,然后用在DirectoryFile构造函数中使用的字段覆盖File中的字段。如果这是一个临时缓冲区,或者更糟糕的是,JCRE拥有的APDU缓冲区,那么您的代码将失败,因为JCRE拥有的对象不应该通过持久引用使用。

请注意,AID是应用程序标识符。它们标识应用程序,如Java Card applet。通常,文件和非应用程序DF(尤其是子DF)不是用AID标识或选择的,而是用文件标识符或(相关的)短文件标识符标识或选择的。有关详细信息,请参阅ISO/IEC 7816-4 (我猜是任何版本)。

请注意,重置在JCOP模拟器中有效,但是当您重新启动进程时,所有信息都会丢失;数据不会保存到磁盘,必须重新加载applet。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23911274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档