【问题标题】:Is there any way to open all logical channels by default?有没有办法默认打开所有逻辑通道?
【发布时间】:2018-03-06 19:34:54
【问题描述】:

这里有一个简单的测试小程序,我已经编写并安装在我的 Javacard 上,作为“默认选择的小程序”。如您所见,它会在接收到任何具有 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 for 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返回0x6881?

问题 4: 我的小程序是默认选择的小程序。所以我除了我的小程序来接收除了 SELECT APDU 命令而不是卡管理器(安全域)之外的所有 APDU 命令。那么 MANAGE CHANNEL APDU 命令有效吗?我的意思是,为什么 Card Manager 会收到该命令而不是我的小程序? Card Manager 会解析哪些命令而不是我的小程序?

【问题讨论】:

    标签: javacard globalplatform


    【解决方案1】:

    虽然你问了这么多问题,但这里是我的一些看法。

    问题 1:为什么我收到 CLA = 0XE0 的 0x6881?

    卡的行为很好。

    • CLA 字节具有 bit8: 1(专有类空间)
    • CLA 字节具有 bit7: 1(类型 16、SM、链中最后一个或唯一的命令)

    简而言之,并非每个命令都直接发送到选定的小程序(或在您的情况下默认选择)。由 JC-Runtime 预处理。

    仅将类字节为 '0X' '8X' '9X' 'AX' 的命令转发到选定的小程序。

    问题2:有什么办法可以让所有逻辑通道都打开 默认?我的意思是有什么办法可以删除 MANAGE CHANNEL APDU 来自序列的命令?

    不,您必须单独打开它们。

    问题 3:为什么 CLA = 0xE1 返回 0x6881?

    与问题 1 相同。

    我的小程序是默认选择的小程序。所以我除了我的小程序 接收除 SELECT APDU 命令以外的所有 APDU 命令,而不是 卡管理器(安全域)。 MANAGE CHANNEL APDU 命令也是如此 工作?我的意思是,为什么 Card Manager 会收到该命令而不是我的 小程序? Card Manager 会解析哪些命令而不是我的 小程序?

    SELECT APDU 和 MANAGE CHANNEL APDU 始终由 JCRE 处理,如果需要(如在 SELECT APDU 中),它会被转发到相关的小程序。

    【讨论】:

    • 只有类字节为 '0X' '8X' '9X' 'AX' 的命令才会被转发到选定的小程序。 你能否请我参考一个规范?
    • 我不完全记得规范,但这里有一些可以帮助你的东西。 "docs.oracle.com/javacard/3.0.5/prognotes/…"
    【解决方案2】:

    您的所有答案都在 Java Card 运行时环境规范 (JCRE) 中给出!
    您应该阅读第 4 章:“逻辑通道和 Applet 选择”

    • 关于问题1:这个类字节指的是什么逻辑通道?
    • 关于问题 2:逻辑通道可以通过 SELECT 或 MANAGE CHANNEL 命令打开(请阅读规范以了解所有细节)。

    我的意思是有什么方法可以从序列中删除 MANAGE CHANNEL APDU 命令?

    没有。

    • 关于问题3:这个类字节指的是什么逻辑通道?
    • 关于问题 4:您正在尝试做一些不符合 Java Card 理念的事情。您应该阅读 JCRE 规范,以了解卡管理器出于什么原因解释了哪些命令。

    【讨论】:

    • A1 & A3:据我所知,逻辑通道号等于CLA 中的三个最低有效位。所以CLA = 0xE0 的逻辑通道号是0CLA = 0xE1 的逻辑通道号是1。对?在这两种情况下,预期的逻辑通道都是打开的。
    • 您可以在这里做出假设并提出问题,但我认为您将通过阅读规范中的章节获得更多知识,因为它将回答您的所有问题;)
    • 行业间标准类字节根据ISO7816-4由bit8/最高有效位表示。所以 bit8 = 0 表示符合 ISO 标准,而 bit8 = 1 表示专有。这就是为什么例如全局平台命令以 0x80 开头,Java Card 专有类字节也设置了这个位
    • 什么都没有。这只是一个约定。人们坚持标准以使生活更轻松
    • 请注意,具有专有位集的指令通常被认为是不同的指令,即使它们具有相同的 INS 值。尽管专有位表明一切正常,但通常标头中的其他位通常仍符合 ISO 7816-4(等)标准——当然 APDU 结构仍应遵守。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2023-02-14
    • 2022-08-03
    相关资源
    最近更新 更多