2

以下に、APDU コマンドの受信時に EEPROM の使用可能なメモリを返すように記述されたプログラムを示します。

public class HelloWorld extends Applet {
    public static void install(byte[] bArray, short bOffset, byte bLength) {
        new helloWorld.HelloWorld().register(bArray, (short) (bOffset + 1),
                bArray[bOffset]);
    }

    public void process(APDU apdu) {
        if (selectingApplet()) {
            return;
        }

        getAvailableMem(apdu);

    }

    public void getAvailableMem(APDU apdu){
        byte[] buffer = apdu.getBuffer();
        short[] AvailableMem = {};

        UtilX.getAvailableMemoryInfo(AvailableMem, (short) 0,
                UtilX.MEMORY_TYPE_PERSISTENT);

        for(short i=0;i<(short)AvailableMem.length;i++){
            buffer[i]=(byte)AvailableMem[i];
        }

        apdu.setOutgoingAndSend((short)0, (short)(2*AvailableMem.length));
    }
}

しかし、APDU コマンドをアプレットに送信すると、以下が返されます0x6F00

OSC: opensc-tool -s 00a4040006010203040506 -s 00000000
Using reader with a card: ACS CCID USB Reader 0

Sending: 00 A4 04 00 06 01 02 03 04 05 06
Received (SW1=0x90, SW2=0x00)

Sending: 00 00 00 00
Received (SW1=0x6F, SW2=0x00)

上記のプログラムを以下のループでも試したことに注意してください。

for(byte i=0;i<(byte)AvailableMem.length;i++){
                buffer[i]=(byte)AvailableMem[i];
            }

コンパイルも成功しました!コンパイラは、配列インデックスの型をbyteonly またはshortonly に制限すべきではありませんか? インデックスに両方のタイプを受け入れるのはなぜですか?

-この 2 番目のプログラムは、OpenSCTool で同じ出力が得られます。どうしたの?

4

2 に答える 2

0

私のアプレットの 1 つから取り出したコード例:

私のクラスの最初の宣言

    short[] mem = new short[2];

プロセス ツリー内から:

case Cmd.GET_FREE_MEM:
                UtilX.getAvailableMemoryInfo(mem, (short) 0, UtilX.MEMORY_TYPE_PERSISTENT);
                Util.setShort(apdu.getBuffer(), (short) 0, mem[0]);
                Util.setShort(apdu.getBuffer(), (short) 2, mem[1]);
                UtilX.getAvailableMemoryInfo(mem, (short) 0, UtilX.MEMORY_TYPE_TRANSIENT_RESET);
                Util.setShort(apdu.getBuffer(), (short) 4, mem[0]);
                Util.setShort(apdu.getBuffer(), (short) 6, mem[1]);
                apdu.setOutgoingAndSend((short) 0, (short) 8);
                break;
于 2015-03-18T17:24:51.160 に答える