0

私は小さな発券プロトタイプに取り組んでいます。私がやりたいことは、最上位の ADF が選択されている場合、含まれているすべての DF の AID を返したいということです。一見すると、非常にうまく機能します。

ADF と 1 つまたは 2 つの DF を作成します。ADF が選択されると、それらの DF の AID が正常に返され、EF (または DF) を追加できます...

全体を再起動すると (私は JCOP を使用しています)、ADF を選択することはできますが、DF からの AID は返されなくなりました。

私のデータ構造の場合 - 最初に、親を持たない ADF の最小限のコンストラクターが表示されます。

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

2 番目の構造は同じですが、parentDirectoryFile と Elementary Files の配列 (arrayFiles) を持つ「通常の」DirectoryFile の場合です。

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 - 正確な診断なし」であり、参照されていない byte[] またはそのようなものにつながります。これは、新しいオブジェクトが作成されたときにインスタンス化される DF オブジェクト以外は見つかりません。

編集:それがより「一般的な」問題である可能性があることがわかりました。それが私が間違っていることです。

ここで、http: //umer555.wordpress.com/2012/05/17/java-card-hello-world-applet/のような「Hello World」を取得し、ここで行ったように 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);
   }
 }

したがって、これは私の目には「Hello World」または「Hi World」を保存する必要がhelloWorldあり、INS2 を使用すると、どちらが保存されているかを示すことができます。しかし、プログラムを再起動するたびに、helloWorld開始のために空になりますよね? 結局のところ、それが私の問題である可能性がありますか? もしそうなら、どうすれば解決できますか?

4

1 に答える 1

1

問題はおそらくここにあります:

super(aid);
this.aid = aid;

最初にデータを正しくコピーしてから、コンストラクターFileで使用したフィールドでフィールドを上書きします。DirectoryFileそれが一時的なバッファであるか、さらに悪いことに、JCRE 所有の APDU バッファである場合、JCRE 所有のオブジェクトは永続的な参照を通じて使用されるべきではないため、コードは失敗します。

AID はアプリケーション識別子であることに注意してください。Java Card アプレットなどのアプリケーションを識別します。通常、ファイルおよび非アプリケーション DF (特に子 DF) は、AID ではなく、ファイル識別子または (関連する) 短いファイル識別子で識別または選択されます。詳細については、ISO/IEC 7816-4 (私が推測する任意のバージョン) を参照してください。

リセットは JCOP シミュレーターで機能しますが、プロセスを再起動するとすべての情報が失われることに注意してください。データはディスクに保存されず、アプレットを再ロードする必要があります。

于 2014-05-28T21:24:35.853 に答える