为什么需要删除小程序的包才能删除我的小程序?

Why do I need to delete the applet's package to delete my applet?

我有一个空的 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

小程序及其包现已消失:

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

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

请注意,这种情况仅针对特定的 cap 文件出现。

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

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