有没有办法默认打开所有逻辑通道?
Is there any way to open all logical channels by default?
这里有一个我编写并安装在我的 Javacard 上的简单测试小程序 "default selected applet"。如您所见,它会在接收到任何带有 INS = 0X00
:
的 APDU 命令时抛出 0x6a6a
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
CLA = 0XE0
?
下面是卡热复位后的另一个命令序列:
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!
问题2:有什么办法可以让所有逻辑通道默认打开?我的意思是有什么方法可以从序列中删除 MANAGE CHANNEL APDU 命令吗?
问题 3: 为什么 CLA = 0xE1
returns 0x6881?
问题4:我的小程序是默认选中的小程序。所以我除了我的小程序之外接收所有 APDU 命令而不是 SELECT APDU 命令而不是卡管理器(安全域)。那么 MANAGE CHANNEL APDU 命令是否有效?我的意思是,为什么 Card Manager 会收到该命令而不是我的小程序?哪些命令将由 Card Manager 而不是我的小程序解析?
虽然你问的问题很多,但这里是我的一些看法。
Question 1: Why I receive 0x6881 for CLA = 0XE0?
卡片行为正常
- CLA字节有bit8:1(专有ClassSpace)
- CLA 字节有 bit7: 1(类型 16,SM,链中的最后一个或唯一命令)
简而言之,并不是每个命令都直接发送到选定的小程序(或者在你的情况下默认选择这里)。 pre-processed JC-Runtime.
只有 class 字节为 '0X' '8X' '9X' 'AX' 的命令才会转发到选定的小程序。
Question 2: Is there any way to make all logical channels open by
default? I mean is there any way to delete the MANAGE CHANNEL APDU
command from the sequence?
不,您必须单独打开它们。
Question 3: Why CLA = 0xE1 returns 0x6881?
同问题 1 的原因
My applet is the default selected applet. So I except my applet to
receive all APDU commands other than SELECT APDU command instead of
Card Manager (Security Domain). So does MANAGE CHANNEL APDU command
work? I mean, Why Card Manager receive that command instead of my
applet? Which commands will be parsed by Card Manager instead of my
applet?
SELECT APDU 和 MANAGE CHANNEL APDU 始终由 JCRE 处理,如果需要(如 SELECT APDU),它会被转发到相关小程序。
你所有的答案都在Java卡运行时环境规范(JCRE)中给出!
你应该阅读第 4 章:"Logical Channels and Applet Selection"
- 关于问题 1:这个 class 字节指的是什么逻辑通道?
- 关于问题 2:可以通过 SELECT 或 MANAGE CHANNEL 命令打开逻辑通道(阅读规范了解所有细节)。
I mean is there any way to delete the MANAGE CHANNEL APDU command from the sequence?
没有
- 关于问题 3:这个 class 字节指的是什么逻辑通道?
- 关于问题 4:您正在尝试做一些不符合 Java 卡片想法的事情。您应该阅读 JCRE 规范,以了解卡管理器出于何种原因解释了哪些命令。
这里有一个我编写并安装在我的 Javacard 上的简单测试小程序 "default selected applet"。如您所见,它会在接收到任何带有 INS = 0X00
:
0x6a6a
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
CLA = 0XE0
?
下面是卡热复位后的另一个命令序列:
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!
问题2:有什么办法可以让所有逻辑通道默认打开?我的意思是有什么方法可以从序列中删除 MANAGE CHANNEL APDU 命令吗?
问题 3: 为什么 CLA = 0xE1
returns 0x6881?
问题4:我的小程序是默认选中的小程序。所以我除了我的小程序之外接收所有 APDU 命令而不是 SELECT APDU 命令而不是卡管理器(安全域)。那么 MANAGE CHANNEL APDU 命令是否有效?我的意思是,为什么 Card Manager 会收到该命令而不是我的小程序?哪些命令将由 Card Manager 而不是我的小程序解析?
虽然你问的问题很多,但这里是我的一些看法。
Question 1: Why I receive 0x6881 for CLA = 0XE0?
卡片行为正常
- CLA字节有bit8:1(专有ClassSpace)
- CLA 字节有 bit7: 1(类型 16,SM,链中的最后一个或唯一命令)
简而言之,并不是每个命令都直接发送到选定的小程序(或者在你的情况下默认选择这里)。 pre-processed JC-Runtime.
只有 class 字节为 '0X' '8X' '9X' 'AX' 的命令才会转发到选定的小程序。
Question 2: Is there any way to make all logical channels open by default? I mean is there any way to delete the MANAGE CHANNEL APDU command from the sequence?
不,您必须单独打开它们。
Question 3: Why CLA = 0xE1 returns 0x6881?
同问题 1 的原因
My applet is the default selected applet. So I except my applet to receive all APDU commands other than SELECT APDU command instead of Card Manager (Security Domain). So does MANAGE CHANNEL APDU command work? I mean, Why Card Manager receive that command instead of my applet? Which commands will be parsed by Card Manager instead of my applet?
SELECT APDU 和 MANAGE CHANNEL APDU 始终由 JCRE 处理,如果需要(如 SELECT APDU),它会被转发到相关小程序。
你所有的答案都在Java卡运行时环境规范(JCRE)中给出!
你应该阅读第 4 章:"Logical Channels and Applet Selection"
- 关于问题 1:这个 class 字节指的是什么逻辑通道?
- 关于问题 2:可以通过 SELECT 或 MANAGE CHANNEL 命令打开逻辑通道(阅读规范了解所有细节)。
I mean is there any way to delete the MANAGE CHANNEL APDU command from the sequence?
没有
- 关于问题 3:这个 class 字节指的是什么逻辑通道?
- 关于问题 4:您正在尝试做一些不符合 Java 卡片想法的事情。您应该阅读 JCRE 规范,以了解卡管理器出于何种原因解释了哪些命令。