有没有办法默认打开所有逻辑通道?

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 规范,以了解卡管理器出于何种原因解释了哪些命令。