[英]Java Card to send data without get data APDU
我是这个领域的新手,如果我的问题很幼稚,请原谅我。
我要发行一个具有自动选择小程序的Java卡,并且几乎所有APDU都将在此小程序中处理。 我需要此applet来将数据发送到CAD,而不使用Java卡标准中的常规格式(即,不发送0x61 0xbytesToRead
并等待0x00 0xc0
)。
例如,我想发送0x23
字节作为对0xA0A40000027F20
答复,这几乎是一个SELECT命令,但首字节错误!
那么这有可能做到吗? 如果可能的话,请告诉我怎么做。
谢谢。
对的,这是可能的。 为了实现您的目标,您需要执行以下两个步骤:
对于第一步,因为它是回答在这里 :
这取决于卡-安装后,并非所有卡似乎都支持将applet设置为默认值。 但是您可以使用具有--make-default选项的Java开源GlobalPlatform工具:
java -jar gp.jar --make-default A000100201100001
IIRC JCOP是实际上支持它的卡之一。
对于第二步,在这里回答:
我猜您正在执行“如果选择Applet()然后返回”的“良好做法”? 您需要处理传入的APDU,而不是简单的返回。 您可以返回数据以选择正常方式,但是如果选择成功,请小心返回0x9000。
它必须看起来像这样:
public void process(APDU apdu)
{
byte[] buf = apdu.getBuffer();
if (selectingApplet())
{
//send the data in buffer return;
}
}
更新:
在此答案下面回答您的评论:
我写了下面的程序:
package test;
import javacard.framework.APDU;
import javacard.framework.ISO7816;
import javacard.framework.Applet;
import javacard.framework.ISOException;
import javacard.framework.Util;
public class Test extends Applet {
public static final byte[] res = { (byte) 0x00, (byte) 0x00, (byte) 0x3B,
(byte) 0xAD, (byte) 0x3F, (byte) 0x00, (byte) 0x01, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x16,
(byte) 0xB3, (byte) 0x03, (byte) 0x06, (byte) 0x04, (byte) 0x00,
(byte) 0x83, (byte) 0x8A, (byte) 0x83, (byte) 0x8A, (byte) 0x00,
(byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x3B, (byte) 0xAD,
(byte) 0x00, (byte) 0x00, (byte) 0x3B, (byte) 0xAD, (byte) 0x2F,
(byte) 0x06, (byte) 0x02 };
public static void install(byte[] bArray, short bOffset, byte bLength) {
new test.Test()
.register(bArray, (short) (bOffset + 1), bArray[bOffset]);
}
public void process(APDU apdu) {
if (selectingApplet()) {
return;
}
byte[] buf = apdu.getBuffer();
if (buf[ISO7816.OFFSET_CLA] == (byte)0xA0 && buf[ISO7816.OFFSET_INS] == (byte) 0xA4 && buf[ISO7816.OFFSET_P1] == (byte) 0x00&& buf[ISO7816.OFFSET_P2] == (byte) 0x00
&& buf[ISO7816.OFFSET_LC] == (byte) 0x02 && buf[ISO7816.OFFSET_LC + 1] == (byte) 0x7F && buf[ISO7816.OFFSET_LC + 2] == (byte) 0x20) {
ISOException.throwIt((short) 0x9F23);
} else if (buf[ISO7816.OFFSET_CLA] == (byte) 0xA0 && buf[ISO7816.OFFSET_INS] == (byte) 0xC0 && buf[ISO7816.OFFSET_P1] == (byte) 0x00
&& buf[ISO7816.OFFSET_P2] == (byte) 0x00 && buf[ISO7816.OFFSET_P2+1] == (byte) 0x23 ) {
Util.arrayCopyNonAtomic(res, (short) 0, buf, (short) 0, (short) 35);
apdu.setOutgoingAndSend((short) 0, (short) 35);
} else {
ISOException.throwIt((short) 0x9090);
}
}
}
然后我将其安装为默认选择的applet:
CommandLine> gp -install e:\soq.cap --default
CommandLine>
然后我将APDU命令发送给它:
CommandLine> OSC.exe -s A0A40000027F20 -s a0c0000023
Using reader with a card: ACS CCID USB Reader 0
Sending: A0 A4 00 00 02 7F 20
Received (SW1=0x9F, SW2=0x23)
Sending: A0 C0 00 00 23
Received (SW1=0x90, SW2=0x00):
00 00 3B AD 3F 00 01 00 00 00 00 00 16 B3 03 06 ..;.?...........
04 00 83 8A 83 8A 00 03 00 00 3B AD 00 00 3B AD ..........;...;.
2F 06 02 /..
看来它可以按照您的要求工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.