下面引用的文章是一篇文章的一部分,该文章命名为如何编写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;
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卡与多线程不兼容。是吗?
感谢任何帮助。
答案 0 :(得分:2)
Q0(更新):如果收到一个没有选择当前小程序的NAME SELECT,那么:
deselect
方法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处理())。