智能卡:pyscard从apdu获取剩余字节

时间:2014-01-16 09:58:32

标签: python smartcard apdu pyscard

我目前可以正确使用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))

3 个答案:

答案 0 :(得分:1)

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

最适合任何命令的方法是在APDU中使用扩展长度规范,如果你的卡支持它,但必须找到这个以及最大缓冲区大小。如果存在LC,则使用字节零,高字节,低字节指定扩展长度,然后使用高字节LE指定低字节。如果没有LC,则扩展长度指示符(零字节)必须在两个字节LE规范之前。有关详细信息(一如既往),请参阅ISO 7816-4。

答案 1 :(得分:1)

我知道这是necroposting。 无论如何:

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

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

返回0xXX字节而不轮询90 00 ack。

答案 2 :(得分:0)

这是怎么做的:

您需要发送一个特殊的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))