Javax SmartCardIO:向读取记录发送0x00不返回长度

时间:2016-03-30 22:52:17

标签: java smartcard emv

我正在开发一个个人应用程序,使用EMV阅读器和Javax SmartCardIO,我试图从SmartCard获取所有简单数据,我一直在阅读规范和一些教程,甚至在这里阅读一些问题但我想出了一个问题:

我正在尝试获取SFI中记录的大小,以便使用该信息迭代所有记录。

我已经阅读了一些教程,我需要发送长度为0的请求,芯片将回答错误代码和正确的记录长度(“6C XX”),但是在我的卡片中( Visa和AMEX正在返回另一个响应,转换为卡的类型(“VISA ELECTRON和AMERICAN EXPRESS”),我没有收到“6c xx”错误。

到目前为止我的代码看起来像这样:

byte[] commandArr = {(byte)0x00, (byte)0xB2, (byte)0x01, (byte)0x0C, (byte)0x00};
CommandAPDU commandTest = new CommandAPDU(commandArr);
ResponseAPDU test = this.channel.transmit(commandTest);
System.out.println(hexToAscii(bytesToHex(test.getBytes())));

两张卡都有01的第一张PSE记录的SFI(在88标签后用选择的PSE命令得到)。

我是新手使用这项技术,我现在有点迷失,欢迎任何帮助。

谢谢!

2 个答案:

答案 0 :(得分:3)

除了Alexander Vaganov的答案外,javax.smartcardio包还会自动处理61XX6CXX个案,除非被告知不这样做(sun.security.smartcardio.t0GetResponse和{{1}系统属性)。

将此属性设置为sun.security.smartcardio.t1GetResponse会导致预期的行为(即获取false状态字。)

我不知道有任何相关文档,因此请查看here

要禁用上述6CXX61XX个案例的自动处理,请在6CXX命令行中添加以下参数:

java
祝你好运!

答案 1 :(得分:2)

在联系人模式下与卡建立连接时,您可以选择两个传输协议 T0 T1 中的一个。它们的主要功能是相同的 - 与卡通信,但实现和接口是不同的。购物车可以支持这些协议之一或两者。不同之处在于如何从卡片中获得响应。在T0中,响应可以包含两部分(命令)。当您获得SW = 61XX ,其中xx响应长度需要执行命令 GetResponce 00C00000XX以“读取”响应数据。在T1中,您可以立即获得SW的所有数据。

在您的情况下,它似乎使用T1,因此卡返回所有数据,而不是SW = 61XX。

文档的某些部分:

public abstract Card connect(String protocol) throws CardException

要使用的协议(“T = 0”,“T = 1”或“T = CL”)或“*”以使用任何可用协议进行连接。

public abstract ResponseAPDU transmit(CommandAPDU command) throws CardException

实现应该透明地处理传输协议的工件。例如,当使用T = 0协议时,应按照ISO / IEC 7816-4中的描述进行以下处理:

  • 如果响应APDU的SW1为61,则实现应该使用SW2作为Lefield发出GET RESPONSE命令。只要接收到61的SW1,就重复该过程。这些交流的响应机构被连接起来形成最终的回应机构。
  • 如果响应APDU是6C XX,则实现应该使用XX作为Le字段重新发出命令。