2016-09-01 18 views
2

いくつかのデータをオフセットISO7816.OFFSET_CDATAでAPDUバッファに保存し、それらのバイトを応答として送信するJava Cardアプレットを作成しました。スマートカードからの応答ステータスワード0x61xxの意味は何ですか?

Util.arrayCopy(Input_Data, (short)0, buffer, (short) ISO7816.OFFSET_CDATA, (short)Datalength); 
apdu.setOutgoing(); 
apdu.setOutgoingLength((short)(DataLength)); 

apdu.sendBytesLong(buffer, ISO7816.OFFSET_CDATA, (short)(DataLength)); 

これをシミュレータで問題なくテストしました。しかし、私が実際のスマートカード(Gemaltoが製造したJava Card v2.2.1)でこれをテストすると、ステータスワード0x6180が返されます。

私のコマンドAPDUは00 40 00 00 80 Dataです。データの長さは128バイトなので、バッファに4 + 128バイトあり、(260-(4 + 128))バイトはnullです。

答えて

4

シミュレータではおそらくT=1トランスポートプロトコルが使用されていますが、実際のカードは使用しません。これは、T=0プロトコルを使用します。つまり、データを受信するか、単一のAPDUでデータを送信することができます。

ステータスワード0x6180は、カードから受信するアドレスが0x80であることを示します。一般に、61XXは、受信するためにXXバイトを意味します。

どのように受信するのですか?さて、GET RESPONSEという特殊なAPDUコマンドがあります。 61XXステータスワードを取得するたびに呼び出す必要があります。 DataLength

  • Datalength:あなたのコードに基づいてGET RESPONSE APDU

    APDU -> 61 XX 
    00 C0 00 00 XX -> your data 90 00 
    

    他のいくつかのノートのLeバイトとしてXXを使用しますか?あなたはshortたびにDataLengthをキャストしないのはなぜ

  • 0代わり
  • ISO7816.OFFSET_CDATAのにあなたの出力データをコピーしますか?それはshortですか?その後キャストしないでください。それはbyteですか?符号なしバイト値> 0x80が負の値shortにキャストされるため、間違った方法でキャストします。符号なしbyteからshortに正しいキャストは(short) (DataLength & 0xFF)
  • です。できるだけ、いつでもsetOutgoingAndSendを使用してください。はるかに簡単です。
  • 固定配列にコピーしていない場合は、arrayCopyの代わりにarrayCopyNonAtomicを使用してください。 arrayCopyNonAtomicのパフォーマンスがはるかに優れています。
+0

すみません。私はアンデュドゥードゥアップではありません00 C0 00 00 xx。私はapduを送る00 00 00 00 80 INS = 40で自分の機能を選択するデータ。私の機能を選択する方法私はapduでC0を使用していますか? –

+0

@FatemeJafari「00 40 00 00 80 Data」を使用すると、「61XX」が受信され、「00 C0 00 00 XX」が使用されます。これは、カードからデータを受信するための特別なコマンドです。 '40'コマンドの応答を返します。あなたは他のアプレットを選択する必要はありません... – vojta

+0

ありがとう非常に親愛なるvojta。この状態で私は1つのapduで私の応答を得るでしょうか?私は256以上の応答があれば、どうすればいいですか? –

関連する問題