1

netbeansを使ってJavaカードクラシックアプレットを作りました

読み取り操作をプログラムするとき、APDU の最初のバイトが 0x80 であることを確認し、次に0xB0、バイト 2 と 3 からファイル内で読み取るオフセットを取得し、読み取るバイト数を取得します。バイト4から

デフォルトのものとしてAPDUになる

0x80 0xB0 0x00 0x03 0x60これは、オフセット番号3から始まる現在のファイルから60バイトを読み取ります

このコマンドを試すと、エラーが返されましInput data length != Lc around line 12た。

再試行した後、問題が見つかりました

問題は、コンパイラがバイト 4 がデータの長さであると想定しているため、コマンドで 60 バイトを待機することです。

検索すると、バイト4は送信データ長を意味しないことがわかりました。INS=B0

なぜこのようになったのかわかりません。コンパイラをデバッグしようとすると、プロセス関数にも入りませんでした。

私のスクリプトファイルは

0x00 0xA4 0x04 0x00 0X06 0X87 0XF1 0X3F 0X5E 0X22 0X47 0x7F;
0x80 0xA4 0x00 0x00 0x02 0x3F 0x00 0x7F;
0x80 0xA4 0x00 0x00 0x02 0x50 0x15 0x7F;
0x80 0xA4 0x00 0x00 0x02 0x53 0x00 0x7F;
0x80 0xA4 0x00 0x00 0x02 0x50 0x31 0x7F;
0x80 0xB0 0x00 0x00 0x33 0x7F ; 
powerdown;

読み取り機能は

 void read(APDU apdu)
    {
        if(current.isDF())//can not read DF file
        {
            ISOException.throwIt((short)27014);
        }
        EFile f = (EFile)current;
       byte[]data=apdu.getBuffer();
        short offset = Util.getShort(data, (short)2);
        if(offset < 0 || offset > f.length)//can not read
        {
            ISOException.throwIt((short)27270);
        }
        data=apdu.getBuffer();
        short len = (short)(data[4]&0xFF);
       if(offset + len > f.length)//can not read 
       {
            ISOException.throwIt((short)26368);
       }
        apdu.setOutgoing();
        apdu.setOutgoingLength(len);
        apdu.sendBytesLong(f.data, (short)(f.offset + offset),len);//return the data

    }

最初にプログラムを選択してからファイルを選択し、機能しないデータを読み取ろうとする

しかし 、標準でも0x80 0xB0 0x00 0x00 0x02 0x00 0x00ファイナルは使用されていませんが、オフセット0から2バイトの書き込みを読み取ると0x00 0x00

なぜ私がしなければならないのか私の問題ですが、コマンドのデータは、データの長さが赤である必要がありました

このエラーを修正するにはどうすればよいですか?

4

2 に答える 2

0

まず、CLSバイトとして0x80を使用しているのはなぜですか?実際には、0x80はグローバルプラットフォームコマンド用に予約されています。カードが2Gの場合は、0xA0を使用する必要があり、カードが3Gの場合は、0x0x(通常はチャネル0の場合は0x00)を使用することをお勧めします。2番目-読み取りバイナリAPDUはOUTAPDUです。これは、P3が予想されるデータ長を指定していることを意味します。

0x00 0xB0 P1 P2 P3

ここで:P1コード化:

|   b8   |   B7   |   b6   |   b5   |   b4   |   b3   |   b2   |   b1   |   Meaning
----------------------------------------------------------------------------------------------------------------------
|   0    |   X    |   X    |   X    |   X    |   X    |   X    |   X    | b7-b1 is the offset to the first byte 
|        |        |        |        |        |        |        |        | to read – P2 is the low part of the offset
----------------------------------------------------------------------------------------------------------------------
|   1    |   0    |   0    |   X    |   X    |   X    |   X    |   X    | SFI referencing used,  b1-b5 are the SFI 
|        |        |        |        |        |        |        |        | and P2 is the offset to the first byte to read

P2-オフセット

P3-予想される長さであり、その後に他のバイトを指定しないでください。P3が0に等しい場合、256バイトのデータが転送されます

詳細については、標準のETSI TS 102 221(http://pda.etsi.org/pda/home.asp?wki_id=,m5nDbNrlEWZbXcW5h86B)を確認してください。アカウントは必要ありません。メールアドレスを入力するだけで、次のことが可能になります。ダウンロードします。

それがお役に立てば幸いです。

KR、-Nodir

于 2012-11-15T14:39:31.877 に答える
0

Java Card API を正しく使用していません。以下に、頭のてっぺんからタイプしたコードを追加しました。コードを試してみて、実行されない場合は多少編集してください。

void read() {
    final APDU apdu = APDU.getCurrentAPDU();
    final byte[] buf = apdu.getBuffer();

    if(current.isDF()) {
        ISOException.throwIt(ISO7816.SW_COMMAND_NOT_ALLOWED);
    }

    final EFile file = (EFile) current;

    final short fileOffset = Util.getShort(buf, ISO7816.OFFSET_P1);
    if (fileOffset < 0 || fileOffset >= file.length) {
        ISOException.throwIt(ISO7816.SW_INCORRECT_P1P2);
    }

    // Ne (encoded by Le) is the *maximum* size of the response data 
    final short ne = apdu.setOutgoing();            

    // Re is the actual number of the bytes to be returned
    final short fileDataLeft = file.length - fileOffset;
    final short re = ne < fileDataLeft ? ne : fileDataLeft;

    apdu.setOutgoingLength(re);
    apdu.sendBytes(file.data, fileOffset, re);
}
于 2012-11-19T19:58:38.167 に答える