2014-01-16 42 views
1

我目前可以正確使用pyscard與我的智能卡交談,但是當apdu大小高於255字節時,我需要接收命令的剩餘字節。智能卡:pyscard從apdu獲得剩餘字節

什麼方法讓我餘下的字節在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)) 

回答

1

您可能指的是61xx狀態碼,其中xx表示仍然可用的字節數。不幸的是,如果您的卡使用T = 0進行通信,則只能視爲理所當然。然後GET RESPONSE將返回下一塊數據。一些人認爲,同樣可能使用其他通信協議也是如此,但是一旦涉及安全的消息傳送,特別是使用序列計數器,就是嚴重的問題。

由於適用於任何命令,最簡潔的方法是在APDU中使用擴展長度規範(如果您的卡支持它),但是必須找出最大緩衝區大小。如果存在LC,則使用字節0,高字節,低字節指定擴展長度,然後使用高字節LE指定擴展長度,接下來是低字節。如果沒有LC,則擴展長度指示符(零字節)必須在兩個字節LE規範之前。有關詳情,請參閱ISO 7816-4。

+0

謝謝你我解決併發布了代碼。感謝您的回覆! – NoobTom

0

這是如何做到這一點:

您需要發送一個特殊的APDU索要剩餘的數據和尋找狀態0x61xx CL,插件,P1,P2,=(0×00,0xA5的,0×00, 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)) 
+0

您能否指定您正在與哪個智能卡通話?以上的解決方案絕對不是常見的,在我看來 - 濫用ISO 7816規範(可能的話,因爲可怕的ISO 7816-4規範可以解釋爲指定一個有點麻煩的數獨) –

+0

你好,我很高興如果你可以建議我一個更好的方法來做到這一點。我不是專家。它的小小的USB接口稱爲Yubikey NEO,我認爲這是發生在SSD驅動器之後的最酷的電腦:D – NoobTom

0

我知道這是necroposting。 無論如何:

我的方法是不同的:61 xx表示您需要獲得額外的xx字節的數據。 然後,您可以發送

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

獲得不輪詢90 00 ACK的0XXX字節回。