智能卡:PysCard 从 APDU 获取剩余字节



我目前可以正确使用 pyscard 与我的智能卡通信,但是当 apdu 大小超过 255 字节时,我需要接收命令的剩余字节。

什么方法让我获得 pyscard 中的剩余字节?据我了解,sw2应该是剩余字节数。

def _cmd(self, cl, ins, p1, p2, data=''):
        command = '%02x%02x%02x%02x%02x%s' % (cl, ins, p1, p2, len(data),
                                              data.encode('hex'))
        data, sw1, sw2 = self.reader.transmit(hex2cmd(command))

        return data, sw1 << 8 | sw2
    def _cmd_ok(self, *args, **kwargs):
        data, status = self._cmd(*args, **kwargs)
        if status != 0x9000:
            raise Exception('APDU error: 0x%04x' % status)
        return ''.join(map(chr, data))

您可能指的是 61xx 状态代码,其中 xx 表示仍然可用的字节数。不幸的是,这只能被认为是理所当然的,如果你的卡使用 T=0 进行通信。然后,GET 响应将返回下一个数据块。有些人主张,同样应该使用其他通信协议,但是一旦涉及安全消息传递,特别是使用序列计数器,就会出现严重的问题。

由于适用于任何命令,最干净的方法是在 APDU 中使用扩展长度规范(如果您的卡支持它),但必须找出此规范以及最大缓冲区大小。如果存在 LC,则使用字节零、高字节、低字节指定扩展长度,然后是高字节、低字节的 LE。如果没有 LC,则扩展长度指示器(零字节)必须在双字节 LE 规范之前。有关详细信息(与往常一样),请参阅 ISO 7816-4。

我知道

这是死灵。无论如何:

我的方法不同:61 xx 意味着您需要获取额外的 xx 字节的数据。然后,您可以发送

response, sw1, sw2 = connection.transmit([0x00,0xC0,0x00,0x00,0xXX])

在不轮询 90 00 ACK 的情况下取回 0xXX 字节。

这是如何做到的:

您需要发送一个特殊的APDU来询问剩余数据并查找状态0x61xx cl, ins, p1, p2, = (0x00, 0xa5, 0x00, 0x00)

def _cmd_ok(self, *args, **kwargs):
        data, status = self._cmd(*args, **kwargs)
        #get high bits
        low = status & 0xFF;
        high = status >> 8;
        if status != 0x9000:
            if high != 0x61:
                raise Exception('APDU error: 0x%04x' % status)
            else:
                while status != 0x9000:
                    part, status = self._cmd(0x00, 0xa5, 0x00, 0x00)
                    data = data + part
        return ''.join(map(chr, data))

最新更新