javacard - 删除数据字段中带有 SSD AID 的 APDU 命令,返回 6985
问题描述
我有一个包含 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 中加载了公共令牌密钥和收据密钥,我认为可能提到的错误是由于未在DELETE APDU命令中使用删除令牌。所以我计算了删除令牌如下:
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 状态字。有谁知道问题出在哪里以及如何解决?
更新:
我什至尝试使用DELETE APDU命令P2 = 0x80
删除带有所有相关对象的 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命令有什么问题?
解决方案
使用 RSA 时的委托管理令牌应使用 SHA-1 作为 PKCS#1 方案的散列机制。我有一些未经测试的签名代码和用于组装令牌数据。作为一个开始,这可能会有所帮助。
关于问题2:
我以前没有这样做过,但是您将 SSD AID 和作为应用程序 AID 再次传递给 . 仅当您要修改应用程序的权限时才需要应用程序 AID,例如默认选择的权限。
反而:
80 E6 40 00 16 08 A0 00 00 00 03 00 00 00 00 07 <SSD AID> 01 80 00 00
我会试试这个:
80 E6 40 00 16 <Length SSD AID> <SSD AID> 00 01 80 00 00
推荐阅读
- c++ - 如何将空文件夹和符号链接添加到存档 - libarchive
- python - python3:避免在字典中创建重复键
- c++ - std::numeric_limits::infinity() 的倒数为零吗?
- symfony - symfony 4 控制器不再返回任何响应
- sql - MAX 选择中的 SQL 计数
- python - 基于循环更新 tkinter 标签
- c - 在 c 中启用 Windows 的虚拟终端处理时出现问题
- javascript - 如何在 JavaScript 中将单词列表转换为数组
- python - 如何将 matplotlib 折线图添加到 Tkinter GUI?
- android - 在安卓应用中付款后如何重定向到外部链接?