概述
卡以APDU的形式接收来自CAD的服务请求。JCRE使用SELECT FILE APDU和MANAGE CHANNEL OPEN APDU来指定逻辑通道会话的活动Applet。一旦被选中,一个Applet实例将接收分派到该逻辑通道的所有后续APDU,直到该小程序实例被取消变成Desectected状态。
Javacard 平台支持的IO接口配置有:
- 符合ISO7816 1-4规范的 Contacted 接口
- 符合ISO7816-4 的media接口
- 符合ISO14443 的Contactless 接口也可以是通过SWP
- Dual I/O 接口
注意:要同时在接触和非接触接口上建立卡会话,在ISO7816-2定义的重置信号输入(RST)触点重置卡上,CAD必须首先启动接触会话。即使正在进行非接触式会话,接触式接口上的电源丢失或卡重置也会导致卡撕裂和卡重置事件。非接触式接口上的射频信号丢失或逻辑重置不能影响正在进行的接触式会话。
JCRE按顺序处理APDU,无论是通过相同的I/O接口还是通过两个不同的I/O接口进行顺序处理。I/O子系统必须将并发接收的APDU依次呈现到JCRE命令调度程序,使同时接收的APDU命令按顺序进行的仲裁,以及用于确保与CAD(接触)和接近耦合设备PCD(非接触)进行适当同步的机制,在本规范中没有规定。I/O子系统必须确保通过非接触式I/O接口接收的APDU命令具有更高的优先级,但不会导致接触式I/O接口导致任何同时接收的APDU命令超时。本规范中没有指定用于此目的的算法。
为JavaCard 3平台编写的小程序可以设计为利用逻辑通道支持。这样的小程序可以利用多会话功能,可以在不同的逻辑通道上与另一个小程序同时选择,甚至可以在不同的逻辑通道上同时选择多次。如图4-1所示:不同应用程序的逻辑通道,一个实现可以支持每个I/O接口上的1到20个逻辑通道,每个逻辑通道都有自己不同的CLEAR_ON_DESELECT瞬时内存段
在板卡重置后,在接触的I/O接口上,只有一个逻辑通道,即逻辑通道编号0(基本逻辑通道)处于活动状态。类似地,在PICC激活序列之后,在非接触式I/O接口上,只有一个逻辑通道,即逻辑0(基本逻辑通道)被激活。可以在此逻辑通道上发出管理通道APDU命令,以指示板卡打开一个新的逻辑通道。可以使用选择FILE APDU命令在不同的逻辑通道上选择Applet实例,就像在单个逻辑通道环境中一样。管理通道APDU命令也用于关闭逻辑通道。请注意,基本逻辑通道是永久的,只要I/O接口保持激活,就永远无法关闭。
在能够同时在两个接口上维持逻辑通道会话的卡上,可能有两组20个逻辑通道。在已接触的I/O接口上的逻辑通道号0与在非接触的I/O接口上的逻辑通道号0不相同。在接触的I/O接口上的逻辑通道上选择的小程序实例通常将只从接触的I/O接口接收APDU。但是,只有在非接触式I/O接口上的逻辑通道上同时选择小程序实例时,它也可以从非接触式I/O接口接收APDU。多选择规则适用于第4.3节中所述的多选择应用程序。
为运行在Java Card 3平台上的Java卡平台2.1版本编写的遗留小程序不需要知道逻辑通道支持才能正确工作。JCRE必须确保未被设计为知道多个会话的小程序不会被选择多次,或与同一包中的另一个小程序同时选择。
支持多个逻辑通道(具有Muti-Selected Applet实例)需要更改Java Card平台2.1版选定的Applet的概念。由于可以同时选择多个Applet实例,并且可以在不同的逻辑通道上同时选择一个Applet实例,因此有必要更详细地区分这些小程序实例的状态。
如果一个Applet实例当前至少在一个逻辑通道中选择,最多40个,则该Applet实例被视为活动小程序实例。来自不同包的每个活动Applet实例都使用不同的CLEAR_ON_DESELECT瞬时内存段执行(请参见图4-1:不同应用程序的逻辑通道)。只有当一个小程序实例正在处理当前命令时,该小程序实例才是当前选定的小程序实例。在一个给定的时间内,只能有一个当前选定的小程序实例。
具有同时在多个逻辑通道上选择或同时选择属于同一包的其他小程序能力的小程序称为多可选择Applet。(请参见图4-2:同一软件包中的不同Applet实例。)
默认选择Applet
通常情况下,只有通过成功地选择“文件”命令才能选择小程序实例。然而,一些智能卡CAD应用程序需要一个默认的卡小程序实例,以便在每次卡重置后被隐式选择。此外,当打开一个新的逻辑通道时,一些CAD应用程序可能还需要一个默认的小程序选择。
以类似的方式,一些智能卡接近耦合设备(PCD)应用程序需要在接近卡(PICC)激活序列成功完成后,隐式地选择一个默认的卡小程序实例。此外,在非接触式会话期间打开的每个新逻辑通道也可能需要默认的小程序选择。
Java卡平台允许卡实现者为卡支持的每个逻辑通道指定一个默认的小程序实例。对于任何逻辑通道,卡实现都可以指定一个小程序实例为该逻辑通道的默认小程序实例。或者,对于任何逻辑通道,实现可以选择不指定默认的小程序实例。逻辑通道可以与多个通道的默认小程序实例共享相同的小程序实例。
在接触接口上的卡复位或者在非接触接口上完成PICC激活序列后,只有基本逻辑通道(通道0)自动打开。因此,接触接口的默认卡小程序实例,如果有的话,则是接触接口上的逻辑通道0的默认小程序实例。类似地,非接触接口的默认卡小程序实例,如果有的话,因此是非接触接口上的逻辑通道0的默认小程序实例。同时支持两个I/O接口的卡可以指定相同的小程序实例或不同的小程序实例作为每个接口的默认卡小程序实例。
接触界面卡片复位行为:
- 在接触的I/O接口上的卡复位(或通电,这是一种复位形式)后,JCRE执行其初始化,并检查其内部状态是否表明特定的小程序实例是基本逻辑通道的默认小程序实例。如果是这样,Java卡RE会将此小程序实例作为基本逻辑通道上当前选择的小程序实例,并调用该小程序的Select()方法。如果此方法抛出异常或返回false,或在小程序启动的事务进行时返回true,则JCRE将其设置的状态设置为表示在基本逻辑通道上没有小程序处于活动状态。当默认Applet实例在卡重置时激活时,不需要调用其处理方法。在默认小程序选择期间没有调用小程序实例的Process()方法,因为没有选择FILE APDU。
- JCRE确保发送了重置的答案(ATR),并且该卡现在已经准备好接受APDU命令了。
非接触界面卡片复位行为:
- 在成功完成非接触接口上的PICC激活序列后,如果接触接口尚未激活,Java卡RE执行其初始化,然后检查其内部状态是否表明特定小程序实例是非接触I/O接口上基本逻辑通道的默认小程序实例。如果默认小程序不是muti-Selected Applet(参见第4.3节多选择小程序),并且默认小程序的实例已经在接触接口上活动,或者来自同一包的另一个小程序实例在接触接口上活动,则Java卡RE将其状态设置为指示基本逻辑通道上没有小程序处于活动状态。否则,Java卡RE将此小程序实例作为非接触I/O接口的基本逻辑通道上当前选择的小程序实例,并通知小程序实例的上下文是活动的,则调用方法Multisectable.select,以指示同一小程序实例是否已经激活,否则,如果小程序的状态。当默认卡小程序实例在成功完成非接触接口上的PICC激活序列后成为激活状态时,不需要调用其处理方法。在默认小程序选择期间没有调用小程序实例的进程方法,因为没有SELECT FILE APDU。
- Java卡RE确保发送了选择(ATS)的答案,如果适用,并且该卡现在已经准备好接受APDU命令。
打开新通道时的默认小程序选择行为
Multiselectable Applets
以下列表描述了两种多选择的情况:
- 当多选择来自同一包中的两个不同的小程序实例时,每个小程序实例共享相同的CLEAR_ON_DESELECT内存瞬时段。小程序实例共享上下文防火墙中的对象以及它们的瞬态数据。在取消选择包中的所有小程序实例之前,Java卡RE不得重置此CLEAR_ON_DESELECT瞬态对象,请参见图4-2:同一包中的不同applet实例。
- 当同时在两个不同的逻辑通道上多选择同一个小程序实例时,它将跨逻辑通道共享CLEAR_ON_DESELECT内存段空间。在取消选择包中的所有小程序实例之前,Java卡RE不得重置CLEAR_ON_取消选择临时对象,见图4-3:在多个逻辑通道上选择相同的小程序实例。