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

Posted

技术标签:

【中文标题】Javacards中关于SELECT APDU命令的一些问题【英文标题】:Some questions about SELECT APDU command in Javacards 【发布时间】:2014-09-21 10:07:55 【问题描述】:

下面引用的一段是陈志群撰写的一篇名为如何编写Java Card小程序:开发者指南的文章的一部分。

我看到了here

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


更新:

以下段落也是 Oracle 文章的一部分,名为 Writing A JavaCard Applet (Here):

检查标题

process 方法检查 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 已经被选中。当 JCRE 接收到新的 SELECT APP2 命令时,它会做什么?它引用了App1process()方法,并从它那里得到返回?还是调用App1deselect()方法,然后调用App2select()方法?

如果JCRE发送SELECT App2 APDU命令到App1process()方法,收到Return 来自它?!

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


Q1 : 基于以上段落(特别是粗体部分)我得出结论,我可以写一个小程序,当它选择时,不可能再选择另一个小程序(直到卡片移除来自 CAD)。为此,我们只需要在其process() 方法中编写代码,以便在收到SELECT APDU 命令时选择自身。 是这样吗?

Q2:有什么方法可以取消选择小程序而不发送另一个选择命令或从 CAD 中移除卡?

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

感谢任何帮助。

【问题讨论】:

【参考方案1】:

Q0(更新):如果收到的 SELECT by NAME 用于未选择当前小程序的 a,则:

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

Q1:不会。系统仍会在将所有 SELECT by NAME APDU 转发到 Applet process 方法之前对其进行处理。所以在 SELECT 发送到当前选择的小程序之前可以选择另一个小程序,而新选择的小程序将收到 APDU。

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

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

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

Q3:确实没有后台任务。添加多线程会彻底破坏Java Card经典版的API,所以永远不会添加。要共享信息,两个 Applet 必须明确设计为这样做,并且防火墙规则将生效。

【讨论】:

TODO 重写 NOTES 并再次查找方法:) 谢谢亲爱的猫头鹰先生 :) 对不起,猫头鹰先生。今天我在 Oracle 网站上阅读了一篇文章,我对此感到很困惑。所以我在我的问题中添加了一个 Update 部分,并将 Q0 添加到我的问题中。请你看一下好吗?非常感谢您的时间和考虑。 @TheGoodUser 请注意,以上所有内容都可以在免费提供的 Java Card 规范中找到。我想我已经向你指出了一些关于研究的事情。 对不起,先生。 Owlstead,为什么SELECT applet APDU 被发送到applet 的处理方法?我的意思是为什么小程序必须接收小程序的 SELECT APDU 命令,而只有 JCRE 需要它们?【参考方案2】:

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

【讨论】:

以上是关于Javacards中关于SELECT APDU命令的一些问题的主要内容,如果未能解决你的问题,请参考以下文章

APDU 命令读取 SLE4432/42 卡

非接触式智能卡仅响应第一个 APDU 命令

用于超轻型 C 的 Omnikey 5X21 APDU 写入命令

SQL语句中关于select……like的问题

对理解 C-APDU 和 R-APDU 命令的疑问

APDU 命令异步调用