我有一个简单的JavaCard HelloWorld脚本,我在JCIDE中使用虚拟阅读器执行它然后我从pyapdutool发送apdu命令:00a404000e aid然后80000000我收到javacard字符串,一切运行正常。我的问题是:如何返回tlv格式数据而不是响应?我正在查看emv书籍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);
}
}
简而言之:我希望能够以这种格式发送响应,例如:6F1A840E315041592E5359532E4444463031A5088801025F2D02656E然后当我转到http://www.emvlab.org/tlvutils/以便能够解码时。
答案 0 :(得分:0)
Javacard中有几个TLV类,但它们是可选的,据我所知,没有任何卡发行商实现这些类。所以你可以:
最后一个选项很难在javacard中没有错误和高效,所以如果你是第一个选项的初学者,一旦你太烦恼你可以尝试构建一个tlv解析器