提问者:小点点

TLV格式的EMV·贾瓦德·APDU回应


我有一个简单的JavaCard HelloWorld脚本,我使用虚拟阅读器在JCIDE中执行它,然后我从pyapdutool发送apdu命令:00a404000e aid然后是80000000,我收到javacard字符串,一切运行良好。我的问题是:如何返回 tlv 格式的数据而不是该响应?我在 emv 书 4.3 中寻找关于这个的内容,并且在谷歌上也没有找到一个在 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);
     }
   }

简而言之:我希望能够以这种格式发送响应,比如:6f1a 840 e 315041592 e 5359532 e 4444463031 a 5088801025 f2d 02656 e,然后当我去http://www.emvlab.org/tlvutils/时能够解码它。


共1个答案

匿名用户

Javacard中有几个TLV类,但它们是可选的,据我所知,没有任何发卡机构实现这些类。因此,您可以:

    < li >如果TLV对象没有任何变化,则对其进行硬编码 < li >您可以手动构建这些部分,并在每次出现新的TLV对象时将它们连接到您的代码中,或者 < li >您构建自己的TLV解析器/编码器

最后一个选项很难在javacard中实现无错误和高性能,所以如果你是初学者,坚持使用第一个选项,一旦你太烦了,你可以尝试构建一个tlv解析器