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

时间:2018-03-06 19:34:55

标签: javacard globalplatform

这里有一个简单的测试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解析?

2 个答案:

答案 0 :(得分:3)

虽然您提出的问题太多了,但我的一些观点仍然存在。

  

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

卡的行为很好。

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

简而言之,并非每个命令都直接发送到选定的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章:“逻辑通道和小程序选择”

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

我的意思是有没有办法从序列中删除MANAGE CHANNEL APDU命令?

没有

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