【问题标题】:Why do I need to delete the applet's package to delete my applet?为什么我需要删除小程序的包才能删除我的小程序?
【发布时间】:2020-12-15 06:24:35
【问题描述】:

我有一个空的 Javacard,如下所示:

user@system$ java -jar gp.jar --list
ISD: A000000003000000 (OP_READY)
     Privs:    SecurityDomain, CardLock, CardTerminate, CardReset, CVMManagement

我在上面安装了一个奇怪的小程序:

user@system$ java -jar gp.jar --install applet.cap
CAP loaded
user@system$ 

嗯,小程序安装成功:

user@system$ java -jar gp.jar --list
ISD: A000000003000000 (OP_READY)
     Privs:    SecurityDomain, CardLock, CardTerminate, CardReset, CVMManagement

APP: 01020304050601(SELECTABLE)

PKG: 010203040506(LOADED)

user@system$ 

但是当我尝试删除小程序时我失败了:

user@system$ java -jar gp.jar --delete 01020304050601 --debug --verbose

# Successful Mutual Authentication with Security Level = 01 (CMAC)

A>> 84F28002 0A 4F00<CMAC> 00
A<< E3114F08A0000000030000009F700101C5019E 9000

A>> 84F24002 0A 4F00<CMAC> 00
A<< E3104F07010203040506019F700107C50100 9000

A>> 84F21002 0A 4F00<CMAC> 00
A<< E30F4F060102030405069F700101C50100 9000

A>> 84F22002 0A 4F00<CMAC> 00
A<< E30C4F060102030405069F700101 9000

A>> 84E40000 11 4F0701020304050601<CMAC>
A<< 6985

Could not delete D3646467329901. Some app still active?

我也尝试过以下形式的删除命令:

user@system$ java -jar gp.jar --delete 01020304050601 --force  ==> Same result
user@system$ java -jar gp.jar --delete 010203040506  ==> Same result

我可以用来删除小程序的唯一成功的形式如下:

user@system$ java -jar gp.jar --delete 010203040506 --force

# Successful Mutual Authentication with Security Level = 01 (CMAC)

A>> 84F28002 0A 4F00<CMAC> 00
A<< E3114F08A0000000030000009F700101C5019E 9000

A>> 84F24002 0A 4F00<CMAC> 00
A<< E3104F07010203040506019F700107C50100 9000

A>> 84F21002 0A 4F00<CMAC> 00
A<< E30F4F060102030405069F700101C50100 9000

A>> 84F22002 0A 4F00<CMAC> 00
A<< E30C4F060102030405069F700101 9000

A>> 84E40080 10 4F06010203040506<CMAC>
A<< 9000

applet 及其软件包现已消失:

user@system$ java -jar gp.jar --list
ISD: A000000003000000 (OP_READY)
     Privs:    SecurityDomain, CardLock, CardTerminate, CardReset, CVMManagement

问题:为什么我需要删除包才能删除小程序本身?

请注意,这种情况只出现在特定的 cap 文件中。

仅供参考:我尝试了不同的工具(包括 gpshell、pyapdu 等)并且得到了相同的结果。

【问题讨论】:

    标签: javacard globalplatform


    【解决方案1】:

    小程序的卸载过程没有成功运行,因此无法单独删除小程序实例,很可能您在小程序代码中声明了私有静态瞬态字节数组等静态内容。在这种情况下,您必须通过覆盖 Applet 的 uninstall 方法将任何静态对象取消初始化为 null。检查 JCRE 中的对象所有权以了解问题

    【讨论】:

    • 为什么 JCRE 不自动执行此操作(静态对象的去初始化)?这是因为卡内资源有限吗?此外,由于静态对象的所有者在某种程度上是包(即可执行加载文件),并且包的删除会破坏小程序中使用的静态数据,因此强制用户在删除小程序之前删除小程序是有意义的。包(它也间接警告用户删除包会导致小程序崩溃)。但反向过程限制对我来说似乎是不必要的。我说的对吗?
    • 啊,亲爱的保罗,我知道 OP。我们在不同类型的 Javacard 上尝试了这个奇怪的小程序。在其中一些我们可以单独删除小程序,但在其中一些我们需要删除包含小程序的包。你怎么解释这个?哪组卡片可以正常工作?
    • 我最后要注意的是:我们不能单独删除小程序或包。我们只能使用带有P2 = 80data = package AID 的DELETE APDU 命令同时删除包+所有相关对象(即包含小程序)。 P2 = 80 不意味着/实现为:1)先删除所有小程序,2)然后删除包。?
    • 我认为这是不允许的,因为否则你会失去对静态对象的引用,因此你会有悬空的死对象。
    • 我目前没有在 java 卡上工作,但我确信我们遇到了同样的问题,在仔细阅读 JCRE 多次后,我们的推理似乎合乎逻辑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多