DF теряется после перезапуска JCOP?

Я работаю над небольшим прототипом билетов. Что я хочу сделать, так это - если выбран ADF верхнего уровня, я хочу вернуть AID всех содержащих DFs, и на первый взгляд это работает довольно хорошо.

Я создаю АПД и 1 или 2 ДФ. Когда ADF выбран, AID этих DF возвращаются нормально, и я могу добавить EF (или DF), ...

Теперь, когда я перезапускаю все это (я использую JCOP, между прочим), я все еще могу выбрать АПД, но AID из DF больше не возвращаются, фактически я получаю 6F00 "без точного диагноза".

Для моей структуры данных - сначала вы видите минимальный конструктор для АПД, который не имеет родителей

public DirectoryFile(byte[] aid) {
  super(aid);
  this.aid = aid;
  numApp = 1;
  created = true;
}

вторая структура такая же, но для "обычного" DirectoryFile с parentDirectoryFile и массивом (arrayFiles) элементарных файлов:

public DirectoryFile(byte[] aid, DirectoryFile parent) {
    super(aid, parent);
    for (byte i = 0; i < numberFiles; i++) {
      arrayFiles[i].setActive(false);
    }   
}

оба наследуют от одного и того же File.class

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 - без точного диагноза", что приводит к появлению нереферентного байта [] или чего-то в этом роде, который я не могу найти нигде, кроме объектов DF, которые создаются при создании нового объекта.

РЕДАКТИРОВАТЬ: просто понял, что это может быть более "общая" проблема, и это то, что я делаю неправильно.

Теперь, если я возьму "Hello World", например http://umer555.wordpress.com/2012/05/17/java-card-hello-world-applet/ и добавлю несколько INS, как я сделал здесь:

  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);
   }
 }

Так что это должно в моих глазах сохранить "Привет мир" или "Привет мир" в helloWorld и с INS2 я могу показать, какой из них сохранен. Но всякий раз, когда я перезапускаю программу, helloWorld будет пустым из-за инициации, верно? Может ли это быть моей проблемой, и если да, то как ее можно решить?

1 ответ

Проблема, вероятно, здесь:

super(aid);
this.aid = aid;

Сначала вы правильно копируете данные, затем перезаписываете поле в File с тем, который вы использовали в DirectoryFile конструктор. Если это временный буфер или, что еще хуже, буфер APDU, принадлежащий JCRE, то ваш код потерпит неудачу, поскольку объекты, принадлежащие JCRE, не должны использоваться через постоянные ссылки.

Обратите внимание, что AID являются идентификаторами приложений. Они идентифицируют приложения, такие как ваш апплет Java Card. Обычно файлы и DF вне приложения (особенно дочерние DF) идентифицируются или выбираются не с помощью AID, а с помощью идентификатора файла или (связанного) короткого идентификатора файла. См. ISO/IEC 7816-4 (любая версия, которую я предполагаю) для деталей.

Обратите внимание, что происходит сброс работы в симуляторе JCOP, но вся информация теряется при перезапуске процесса; данные не сохраняются на диск и апплеты должны быть перезагружены.

Другие вопросы по тегам