关于Javacards中SELECT APDU命令的一些问题

时间:2014-09-21 10:07:55

标签: smartcard javacard

下面引用的文章是一篇文章的一部分,该文章命名为如何编写Java Card applet:开发人员指南并由Zhiqun Chen撰写。

我看到它here

  

选择小程序后,JCRE会转发所有后续APDU   命令(包括SELECT命令)到applet的进程()   方法。在process()方法中,applet解释每个APDU   命令并执行命令指定的任务。对于每一个   命令APDU,applet通过发送回来响应CAD   响应APDU,通知CAD处理结果   命令APDU。类javacard.framework.Applet中的process()方法   是一个抽象方法:Applet类的子类必须覆盖   这个方法实现了applet的功能。“


更新:

以下段落也是Oracle文章的一部分,该文章命名为编写JavaCard Applet Here):

  

检查标题

     

进程方法检查APDU头的前两个字节,   CLA字节和INS字节。如果CLA字节的值为0且为   INS字节的值为0xA4,表示这是标题   SELECT APDU命令。在这种情况下,处理方法返回   控制到JCRE:

// check SELECT APDU command 
if ((buffer[ISO7816.OFFSET_CLA] == 0) &&
(buffer[ISO7816.OFFSET_INS] == (byte) (0xA4)) )  
 return;

enter image description here Q0:在上面的图像中已经选择了App1。当新的SELECT APP2命令由 JCRE 接收时,它做什么?它将它引用到 App1 process()方法并从中接收返回值?或者调用 App1 deselect()方法,然后调用 App2的 select()方法

如果JCRE将 SELECT App2 APDU 命令发送到 App1 process()方法,收到返回<后会发生什么? / em>从它?!

如果JCRE在收到 SELECT App2 APDU 命令后立即调用app1的deselect(),然后调用app2的select(),从app2 select()方法收到true后它会怎么做?它等待下一个命令吗?


Q1:基于以上段落(特别是以粗体显示的部分)我得出结论,我可以编写一个选择的applet,它无法选择另一个applet(直到卡片删除为此目的,我们只需要在其process()方法中编写代码,以便在收到SELECT APDU命令时自行选择。 这是对的吗?

Q2:有没有办法在不发送其他选择命令或从CAD中删除卡片的情况下取消选择小程序?

问题3:是否可以以在另一个活动小程序的后台保持活动的方式编写小程序? (类似计算机中的键盘记录器)我自己认为这是不可能的,因为java卡与多线程不兼容。是吗?

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

Q0(更新):如果收到一个没有选择当前小程序的NAME SELECT,那么:

  • 如果选择了另一个Applet,则只调用deselect方法
  • 如果未选择其他Applet,则仅调用process方法

Q1 :不会。系统仍然会在将其转发到Applet process方法之前处理所有SELECT by NAME APDU。因此,在将SELECT发送到当前选定的applet之前,可以选择另一个Applet,而新选择的Applet将接收APDU。

请注意,如果使用当前Applet的AID收到SELECT by NAME,系统甚至会重新选择当前的Applet(因此取消选择时清除的所有内存和对象都将被清除,并且{{将调用1}}和select方法。

请注意,以后的API(陈的书仍然适用,但有点老化)添加了一种方法来检查APDU是否用于选择当前的Applet。这对于检查如何选择也很有用,如果Applet在默认情况下选择,即在收到任何APDU之前,这主要是有用的。

Q2 :不,目前没有。这是一个棘手的功能,具有防火墙和安全隐患。所以这不是Java Card标准的一个小更新。它虽然在论坛上出现了很多。当然,您可以通过防火墙访问其他小程序。

Q3 :确实没有后台任务。添加多线程将完全打破Java Card Classic Edition的API,因此永远不会添加它。要共享信息,必须明确设计Applet,并且防火墙规则将生效。

答案 1 :(得分:0)

Q0 :如果收到SELECT by NAME,JCRE将检查APDU partialEquals()中指定的AID是否由JCRE注册的任何AID。如果JCRE没有注册此类AID,则SELECT by NAME APDU将被发送到当前选定的applet。如果JCRE注册了这样的AID,无论当前选择了什么applet,都将取消选择当前选择的applet(调用deselect())并选择匹配AID的applet(调用select()并传递SelectingApplet()= True处理())​​。