这里有一个简单的测试applet,我在Javacard上编写并安装为“默认选择的applet”。如您所见,它在接收INS = 0x6a6a
的任何APDU命令时抛出0X00
:
package testPack;
import javacard.framework.*;
public class TestApplet extends Applet implements MultiSelectable
{
public boolean select(boolean appInstAlreadySelected) {
return true;
}
public void deselect(boolean appInstStillSelected) {
}
public static void install(byte[] bArray, short bOffset, byte bLength)
{
new TestApplet().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
}
public void process(APDU apdu)
{
if (selectingApplet())
{
return;
}
byte[] buf = apdu.getBuffer();
switch (buf[ISO7816.OFFSET_INS])
{
case (byte)0x00:
ISOException.throwIt((short)0x6A6A);
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
}
如下所示,在卡热复位后,我向卡发送了一些APDU命令:
Reset successful.
Send: 00 00 00 00 01
Recv: 6A 6A
Send: 10 00 00 00 01
Recv: 6A 6A
Send: 80 00 00 00 01
Recv: 6A 6A
Send: E0 00 00 00 01
Recv: 68 81 <====
问题1:为什么我收到0x6881
的{{1}}?
在卡片热重置后,您可以看到另一个命令序列:
CLA = 0XE0
问题2:默认情况下有没有办法让所有逻辑频道都打开?我的意思是有没有办法从序列中删除MANAGE CHANNEL APDU命令?
问题3:为什么Reset successful.
Send: 00 00 00 00 00
Recv: 6A 6A
Send: 01 00 00 00 00 // Try to send commands with logical channel 1 instead of 0
Recv: 68 81 //Error because the channel is not open.
Send: 00 70 00 01 00 // Opening the channel with MANAGE CHANNEL APDU command
Recv: 90 00
Send: 01 00 00 00 00
Recv: 6A 6A
Send: 11 00 00 00 00
Recv: 6A 6A
Send: 81 00 00 00 00
Recv: 6A 6A
Send: E1 00 00 00 00
Recv: 68 81 <== Same Error as before!
会返回0x6881?
问题4:我的applet是默认选择的applet。所以我除了我的applet之外还接收除SELECT APDU命令而不是Card Manager(安全域)之外的所有APDU命令。那么MANAGE CHANNEL APDU命令也可以工作吗?我的意思是,为什么Card Manager会收到该命令而不是我的applet?哪些命令将由Card Manager而不是我的applet解析?
答案 0 :(得分:3)
虽然您提出的问题太多了,但我的一些观点仍然存在。
问题1:为什么我收到CLA = 0XE0的0x6881?
卡的行为很好。
简而言之,并非每个命令都直接发送到选定的applet(或者在您的情况下默认选择)。它由JC-Runtime预处理。
只有类字节为&#39; 0X&#39; &#39; 8X&#39; &#39; 9X&#39; &#39; AX&#39; 会转发到选定的小程序。
问题2:有没有办法让所有逻辑频道都打开 默认?我的意思是有没有办法删除管理通道APDU 从序列命令?
不,你必须单独打开它们。
问题3:为什么CLA = 0xE1会返回0x6881?
与问题1相同的原因。
我的applet是默认选择的applet。所以我除了我的applet 接收SELECT APDU命令以外的所有APDU命令而不是 卡经理(安全域)。 MANAGE CHANNEL APDU命令也是如此 工作?我的意思是,为什么卡片管理器会收到该命令而不是我的命 小程序吗? Card Manager将解析哪些命令而不是我的 小应用程序?
SELECT APDU和MANAGE CHANNEL APDU始终由JCRE处理,如果需要(如在SELECT APDU中),它将被转发到受尊重的applet。
答案 1 :(得分:2)
您的所有答案都在Java Card Runtime Environment Specification(JCRE)中给出!
您应该阅读第4章:“逻辑通道和小程序选择”
我的意思是有没有办法从序列中删除MANAGE CHANNEL APDU命令?
没有