命令 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 看起来像这样:

+------+------+------+------+------+------+------+ |共轭亚油酸 | INS | P1 | P2 | LC |数据 |乐 | | 0x00 | 0xA4 | 0x00 | 0x0C | 0x01 | 0x02 | --- | +------+------+------+------+------+------+------+

这可能不是您所期望的。你想要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(不满足使用条件)的主要内容,如果未能解决你的问题,请参考以下文章

选择接触式智能卡的MF

EMV:第二次生成 AC 结果导致 6985 SW_Error 访问条件不满足

在两种不同的场景中给出 6985 和 61xx 的初始化更新

FinTS 2.2 (HBCI 2.2) VERIFY 命令返回 69 85

信用卡芯片读取错误

APDU 命令读取二进制命令与文件结构不兼容