smartcard - 智能卡:pyscard从apdu获得剩余字节

  显示原文与译文双语对照的内容

我当前可以正确地使用pyscard来与我的智能卡交谈,但是当for大小为 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进行通信,那么这只能被接受。 然后,获取响应将返回下一个数据块。 一些主持人同样也应该使用它的他通信协议,但是在使用序列计数器的安全消息。

最简单的方法,因为适用于任何命令,如果你的卡支持,但最大缓冲区大小。 如果存在 LC,则使用字节零,高字节,低字节,低字节,低字节来指定扩展长度。 如果没有 LC,则扩展长度指示器( 零字节) 必须位于两个字节规范之前。 详细信息( 一直一样) 请参见 ISO 7816 -4.

这就是如何执行这里操作的方法:

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


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))

作者:
...