0

私は単純な JavaCard HelloWorld スクリプトを持っています。仮想リーダーを使用して JCIDE で実行し、pyapdutool から apdu コマンドを送信します。私の質問は、その応答の代わりに tlv 形式のデータを返すにはどうすればよいですか? 私はこれについて emv book 4.3 を調べていましたが、Google でも、javacard スクリプトで emv tlv タグを実装する単一の例が見つかりませんでした。誰かがこれを理解するために私を正しい道に導くことができますか?

package helloworld;
import javacard.framework.*;

public class helloworld extends Applet
{
private static final byte[] javacard = {(byte)'J',(byte)'a',(byte)'v'(byte)'a',(byte)' ',(byte)'C',(byte)'a',(byte)'r',(byte)'d',(byte)'!',};
private static final byte JC_CLA = (byte)0x80;
private static final byte JC_INS = (byte)0x00;

public static void install(byte[] bArray, short bOffset, byte bLength)
{
   new helloworld().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
}

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

  byte[] buf = apdu.getBuffer();

  byte CLA = (byte) (buf[ISO7816.OFFSET_CLA] & 0xFF);
    byte INS = (byte) (buf[ISO7816.OFFSET_INS] & 0xFF);

    if (CLA != JC_CLA)
    {
        ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
    }

  switch (buf[ISO7816.OFFSET_INS])
  {
  case (byte)0x00:
     OutPut(apdu);
     break;
  default:
     ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
  }
}

private void OutPut( APDU apdu)
    {
    byte[] buffer = apdu.getBuffer();
    short length = (short) javacard.length;
    Util.arrayCopyNonAtomic(javacard, (short)0, buffer, (short)0, (short)  length);
    apdu.setOutgoingAndSend((short)0, length);
     }
   }

要するに、次のような形式で応答を送信できるようにしたいのですが、次のようなものです

4

1 に答える 1

0

Javacard にはいくつかの TLV クラスがありますが、それらはオプションであり、私の知る限り、これらのクラスを実装したカード発行会社はありません。したがって、次のいずれかを実行できます。

  • まったく変更されない場合は、TLV オブジェクトをハードコーディングします。
  • パーツを手動で構築し、新しい TLV オブジェクトが出現するたびにそれらをコード内で連結できます。
  • 独自の TLV パーサー/エンコーダーを構築する

最後のオプションは、javacard でエラーをなくしてパフォーマンスを向上させるのはかなり難しいため、初心者で最初のオプションに固執し、イライラしすぎた場合は、tlv パーサーの構築を試みることができます。

于 2016-04-04T08:11:02.397 に答える