私は小さな発券プロトタイプに取り組んでいます。私がやりたいことは、最上位の 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
開始のために空になりますよね? 結局のところ、それが私の問題である可能性がありますか? もしそうなら、どうすれば解決できますか?