【问题标题】:smartcard: pyscard get remaining bytes from apdu智能卡:pyscard 从 apdu 获取剩余字节
【发布时间】:2014-01-16 09:58:32
【问题描述】:

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

【问题讨论】:

    标签: python smartcard apdu pyscard


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢你我解决并发布了代码。感谢您的回复!
    【解决方案2】:

    我知道这是在发布尸体。 无论如何:

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

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

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

    【讨论】:

      【解决方案3】:

      这是怎么做的:

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

      【讨论】:

      • 您能否指定您正在与哪个智能卡通话?上述解决方案绝对不常见,而且 - 在我看来 - 滥用了 ISO 7816 规范(在可能的情况下,因为非常可怕的 ISO 7816-4 规范可以解释为指定一个有点麻烦的数独)
      • 您好,如果您能建议我一个更好的方法,我很高兴。我不是专家。它的小 USB 东西叫做 Yubikey NEO,我认为这是继 SSD 驱动器之后计算机上发生的最酷的事情:D
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多