如何将2步卡片响应更改为1步



我正在用Java Card开发一个程序。有时,当我向卡发送命令时,它的响应为"0X61 0Xxx",这意味着存在一个长度为0Xxx的响应,我应该回答才能得到它。

我的问题是,我如何才能避免这种反应,并立即得到答案?

提前感谢

这取决于!

有时您收到61XX是因为您正在与这样编写的小程序通信!我的意思是,小程序的编写方式是使用GET RESPONSEAPDU命令返回数据。因此,在这种情况下,除了请求小程序开发人员根据需要修改小程序之外,您不能做任何其他事情。

但有时返回数据的不是如上所述的小程序,而是智能卡。实际上,T=0智能卡是这样返回数据的。因此,您只需将智能卡更改为支持T=1通信协议的新卡即可。在这种情况下,您有一个小程序CAP文件,当您在T=0卡上安装时,它会在两个步骤中返回数据,当您将其安装在T=1智能卡上时,它将在一个步骤中返回数据。


假设您编写的程序如下。它有四个不同的APDU命令(INS = 00, 01, 02, 03)将temp字节数组内容返回给用户:

package soq;
import javacard.framework.*;
public class SOQ extends Applet
{
byte[] temp = {(byte)'T',(byte)'h',(byte)'i',(byte)'s',
(byte)'-',(byte)'I',(byte)'s',(byte)'-',
(byte)'A',(byte)'-',(byte)'T',(byte)'e',(byte)'s',(byte)'t'};
public static void install(byte[] bArray, short bOffset, byte bLength) 
{
new SOQ().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
}
public void process(APDU apdu)
{
if (selectingApplet())
{
return;
}
byte[] buf = apdu.getBuffer();
short le;
switch (buf[ISO7816.OFFSET_INS])
{
case (byte)0x00:
apdu.setOutgoing();
apdu.setOutgoingLength((short)14);
apdu.sendBytesLong(temp, (short)0, (short)14);
break;
case (byte) 0x01:
Util.arrayCopyNonAtomic(temp, (short)0, buf, (short)0, (short)14);
apdu.setOutgoingAndSend((short)0, (short)14);
break;
case (byte) 0x02:
le = apdu.setOutgoing();
if (le != (short)0x000E){
ISOException.throwIt((short)0x6C0E);
}else{
Util.arrayCopyNonAtomic(temp, (short)0, buf, (short)0, (short)14);
apdu.setOutgoingLength((short)le);
apdu.sendBytes((short)0, le);
}
break;
case (byte) 0x03:
le = apdu.setOutgoing();
if (le != (short)0x000E){
ISOException.throwIt((short)0x6C0E);
}else{
apdu.setOutgoingLength((short)14);
apdu.sendBytesLong(temp, (short)0, le);
}
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
}

当它安装在通过T=1协议与用户通信的卡上时,您就有了:

Select Applet begin...
Select Applet successful.
Send: 00 00 00 00 00
Recv: 54 68 69 73 2D 49 73 2D 41 2D 54 65 73 74 90 00
Send: 00 01 00 00 00
Recv: 54 68 69 73 2D 49 73 2D 41 2D 54 65 73 74 90 00
Send: 00 02 00 00 00
Recv: 6C 0E
Send: 00 02 00 00 0E
Recv: 54 68 69 73 2D 49 73 2D 41 2D 54 65 73 74 90 00
Send: 00 03 00 00 00
Recv: 6C 0E
Send: 00 03 00 00 0E
Recv: 54 68 69 73 2D 49 73 2D 41 2D 54 65 73 74 90 00

当它安装在通过T=0协议与用户通信的卡上时,您就有了:

Select Applet begin...
Select Applet successful.
Send: 00 00 00 00 00
Recv: 6C 0E
Send: 00 00 00 00 0E
Recv: 54 68 69 73 2D 49 73 2D 41 2D 54 65 73 74 90 00
Send: 00 01 00 00 00
Recv: 6C 0E
Send: 00 01 00 00 0E
Recv: 54 68 69 73 2D 49 73 2D 41 2D 54 65 73 74 90 00
Send: 00 02 00 00 00
Recv: 6C 0E
Send: 00 02 00 00 0E
Recv: 54 68 69 73 2D 49 73 2D 41 2D 54 65 73 74 90 00
Send: 00 03 00 00 00
Recv: 6C 0E
Send: 00 03 00 00 0E
Recv: 54 68 69 73 2D 49 73 2D 41 2D 54 65 73 74 90 00

如上所述,在这两种情况下,具有INS=0x2 or 0x03Le=0x00的APDU命令都返回0x6C0E。这是因为小程序是这样编写的。但对于INS=0x00 or 0x01,返回值取决于通信协议。对于T=1,它们返回0x6C0E,而对于T=1,它们返回数据。

相关内容

  • 没有找到相关文章

最新更新