我正在开发一个个人应用程序,使用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命令得到)。
我是新手使用这项技术,我现在有点迷失,欢迎任何帮助。
谢谢!
答案 0 :(得分:3)
除了Alexander Vaganov的答案外,javax.smartcardio
包还会自动处理61XX
和6CXX
个案,除非被告知不这样做(sun.security.smartcardio.t0GetResponse
和{{1}系统属性)。
将此属性设置为sun.security.smartcardio.t1GetResponse
会导致预期的行为(即获取false
状态字。)
我不知道有任何相关文档,因此请查看here。
要禁用上述6CXX
和61XX
个案例的自动处理,请在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中的描述进行以下处理: