命令 APDU 在结果中返回 6985(不满足使用条件)
Posted
技术标签:
【中文标题】命令 APDU 在结果中返回 6985(不满足使用条件)【英文标题】:Command APDU returning 6985 (Conditions of use not satisfied) in result 【发布时间】:2018-11-13 06:16:43 【问题描述】:我正在用 Java 读取智能卡。当我执行下面的代码时,卡返回6985(不满足使用条件)。
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
System.out.println("Terminals: " + terminals);
if (terminals != null && !terminals.isEmpty())
// Use the first terminal
CardTerminal terminal = terminals.get(0);
// Connect with the card
Card card = terminal.connect("*");
System.out.println("card: " + card);
CardChannel channel = card.getBasicChannel();
CommandAPDU commandAPDU = new CommandAPDU(0x00, 0xA4, 0x00, 0x0C,
new byte[]0002,0,0x01);
ResponseAPDU responseCheck = channel.transmit(commandApdu);
System.out.println(responseCheck.getSW1()+":"+responseCheck.getSW2()+":"+
commandApdu.toString());
客户端提供的参数有:
CLA = 00 INS = A4 P1 = 00 P2 = 0C LC = 02 Data = XXXX(这里传递的数据是File Identifier),因为我要选择EF文件所以客户端给的文件的EFID是0002【问题讨论】:
您确定粘贴了您要运行的代码吗? P1 和 P2 之间似乎缺少逗号。此外,您的 AID 似乎是 4(或 5)字节长,因此您不会有 LC=02。另外,你的 DF/EF 等于 010201FF 还是 01000201FF?您将 0x0002 转换为字节,因此它将仅为 0x02。最后你只有 4 个字节(如果这应该是 AID,我想它应该至少有 5 个字节长才能符合 ISO7816-5)。 @MichalGluchowski 我已经编辑和更正了代码,但是有一些查询,因为我必须选择文件并且为其提供的 EF 文件 ID 是 0002,它应该作为数据参数传递。正确的 APDU 命令应该是什么? @MichaelRoland 如前所述,文件标识符应该作为数据参数传递,值为0002,那么应该如何传递呢?根据客户的说明,LC参数也是必需的。 你应该完全按照我向你展示的那样传递它new byte[]0, 2
。
那么传递 LC 参数呢,我没有 Client.@MichaelRoland 提供的 LE 参数
【参考方案1】:
CommandAPDU commandAPDU = new CommandAPDU(0x00, 0xA4, 0x00, 0x0C, new byte[]0002,0,0x01);
不会做你期望它做的事情。
new byte[]0002
将为您提供一个字节数组,其中一个字节的值为 2。此外,,0,0x01);
(最后两个参数)将使构造函数仅从 DATA 数组中选择一个字节。所以你的 APDU 看起来像这样:
这可能不是您所期望的。你想要new byte[]0, 2
吗?使用
CommandAPDU commandAPDU = new CommandAPDU(0x00, 0xA4, 0x00, 0x0C, new byte[]0, 2, 256)
将产生以下 APDU(注意 Le 存在并设置为 0 (Ne = 256);Lc 是从 DATA 数组的大小自动推断出来的):
+------+------+------+------+------+------------+-- ----+ |共轭亚油酸 | INS | P1 | P2 | LC |数据 |乐 | | 0x00 | 0xA4 | 0x00 | 0x0C | 0x02 | 0x00 0x02 | 0x00 | +------+------+------+------+------+------------+-- ----+或使用
CommandAPDU commandAPDU = new CommandAPDU(0x00, 0xA4, 0x00, 0x0C, new byte[]0, 2)
将产生以下 APDU(注意 Le 不存在(Ne = 0);Lc 是从 DATA 数组的大小自动推断出来的):
+------+------+------+------+------+------------+-- ----+ |共轭亚油酸 | INS | P1 | P2 | LC |数据 |乐 | | 0x00 | 0xA4 | 0x00 | 0x0C | 0x02 | 0x00 0x02 | --- | +------+------+------+------+------+------------+-- ----+【讨论】:
以上是关于命令 APDU 在结果中返回 6985(不满足使用条件)的主要内容,如果未能解决你的问题,请参考以下文章
EMV:第二次生成 AC 结果导致 6985 SW_Error 访问条件不满足
在两种不同的场景中给出 6985 和 61xx 的初始化更新