【发布时间】:2020-11-15 18:13:16
【问题描述】:
我有一个包含 SSD(补充安全域)的 Javacard,我想删除它。通常,当我想从我的卡中删除一个小程序或一个包时,我会在成功 相互验证 过程后发送以下 DELETE APDU 命令(没有 MAC 或数据字段加密DELETE APDU 命令需要,Security Level == 0 就足够了):
--> 80 E4 00 00 LC 4F <AID Len> <AID>
<-- 90 00
上面的命令适用于普通的小程序。但是当我将SSD的AID放入其中时,卡会以69 85个状态字响应,这意味着“不满足使用条件。”。
由于我的卡中启用了委托管理功能,并且在 ISD 中加载了 Public Token 密钥和 Receipt 密钥,我想可能提到的错误是由于在 DELETE APDU 命令中没有使用 Delete Token。所以我计算了 Delete Token 如下:
DeleteToken = RSA_Sign("00 00 LC 4F <SSD AID Len> <SSD AID>", TokenPrivateKey)
然后我尝试使用以下命令删除 SSD:
--> 80 E4 00 00 <LC+Len(DeleteToken)> 4F <SSD AID Len> <SSD AID> 9E <Len(DeleteToken> <DeleteToken>
<-- 69 85
但我又得到了 6985 状态词。有谁知道问题出在哪里以及如何解决?
更新:
我什至用P2 = 0x80 尝试了 DELETE APDU 命令来删除带有所有相关对象的 SSD。但它也失败了:
--> 80 E4 00 80 09 4F <SSD AID Len> <SSD AID>
<-- 6A 86 (= Incorrect P1 or P2 parameter)
更新2:
我什至尝试在安全通道 (SecLevel = 03) 中发送 DELETE APDU 命令。但同样,我收到了 6985 个状态词。我需要使用哪种哈希算法来生成删除令牌?据我所知,GP 规范没有指定哈希算法。
更新3:
上面提到的 SSD 是从卡的 ISD 包中实例化的,具有0E 权限,这意味着:
安全域 + 委托管理 + DAP验证
更新4:
我想我找到了问题!
引自2.1.1_Mapping_guidelines_v1.0.1-Final.pdf:
6.1。删除
6.1.2。推荐
命令消息中发送的数据字段
(废话)
在支持补充安全域的实现中,如果尝试删除补充安全域的实例并且补充安全域具有 DAP 验证特权(特权字节集的位 7 ),安全域不会被删除,并返回“6985”响应。
问题1:知道为什么要这样实施/推荐吗?使这种类型的 SSD(具有 DAP 验证权限的 SSD)不可移动的目的是什么?
更新5:
我尝试使用 INSTALL For REGISTRY UPDATE 更改我的 SSD 的权限以从中删除 DAP 验证 权限,然后删除 SSD。但它以6A 80 状态字失败(这意味着“数据字段中的参数不正确”)。
--> 00 A4 04 00 08 A0 00 00 00 03 00 00 00
<-- 6F 10 84 08 A0 00 00 00 03 00 00 00 A5 04 9F 65 01 FF 90 00
--> 80 50 00 00 08 DF 4B 4B B7 15 35 5A 93
<-- 00 00 41 89 00 24 94 97 41 21 01 02 00 77 5C 2B 50 27 5A F4 8A 18 C0 8B 2D C2 20 50 90 00
--> 84 82 00 00 10 30 AD 04 C4 60 A2 80 8B 5A 61 7E 49 3A 39 B6 C6
<-- 90 00
--> 80 E6 40 00 16 08 A0 00 00 00 03 00 00 00 00 07 <SSD AID> 01 80 00 00
<-- 6A 80
问题 2:INSTALL For Registry Update 命令有什么问题?
【问题讨论】:
-
> 问题 1:相同的规范说上面的一些行:“在支持补充安全域的实现上,DELETE 命令能够删除具有 DAP 验证权限的补充安全域的实例,但是,无法删除具有强制 DAP 权限的安全域。”这部分有点不一致。对于 Mandated DAP,这是有道理的,否则通过删除 SSD,就有可能绕过 Applet 管理的强制性 DAP 检查。对于只有 DAP 的 SSD,不是。也许开发人员只是遵循这里的规范。