首页 文章

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

提问于
浏览
2

下面引用的段落是一篇名为“如何编写Java Card小程序”的文章的一部分:开发人员指南,由Zhiqun Chen撰写 .

我看到了here

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


Update :

此外,下面的段落是Oracle文章的一部分,该文章名为Writing A JavaCard Applet(Here):

检查标头过程方法检查APDU标头的前两个字节,CLA字节和INS字节 . 如果CLA字节的值为0且INS字节的值为0xA4,则表示这是SELECT APDU命令的标头 . 在这种情况下,process方法将控制权返回给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()方法,收到返回后会发生什么?!

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


Q1 : 基于上面的段落(特别是粗体部分)我得出结论,我可以编写一个applet,因为它选择了,它不可能选择另一个applet(直到卡从CAD中删除) . 为此我们只需要在 process() 方法中编写代码,以便在收到 SELECT APDU 命令时自行选择 . 这是正确的吗?

Q2 : 有没有办法取消选择小程序而不发送另一个选择命令或从CAD中删除卡?

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

感谢任何帮助 .

2 回答

  • 0

    Q0 (update) :如果收到的是一个没有选择当前applet的SELECT by NAME,那么:

    • 如果选择了另一个Applet,则只调用 deselect 方法

    • 如果未选择其他Applet,则仅调用 process 方法

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

    请注意,如果使用当前Applet的AID接收到SELECT by NAME,则系统甚至会重新选择当前Applet(因此将取消选择取消选择时清除的所有内存和对象,并调用 selectdeselect 方法) .

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

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

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

  • 2

    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处理()) .

相关问题