2

現在、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))
4

3 に答える 3

1

おそらく 61xx ステータス コードを参照していると思われます。ここで、xx はまだ使用可能なバイト数を示します。残念ながら、カードが T=0 を使用して通信する場合、これは当然のこととしか考えられません。次に、GET RESPONSE が次のデータのチャンクを返します。同じことが他の通信プロトコルを使用する可能性もあると主張する人もいますが、特にシーケンスカウンターを使用した安全なメッセージングが関与するとすぐに深刻な問題になります.

どのコマンドにも適用できるので、最もクリーンな方法は、カードがサポートしている場合、APDU で拡張長指定を使用することですが、これと最大バッファ サイズを確認する必要があります。LC が存在する場合、バイト 0、上位バイト、下位バイトを使用して拡張長が指定され、その後に上位バイト、下位バイトが続く LE が続きます。LC がない場合、拡張長標識 (0 バイト) が 2 バイトの LE 仕様の前になければなりません。詳細については (いつものように) ISO 7816-4 を参照してください。

于 2014-01-16T13:23:54.273 に答える
0

これを行う方法は次のとおりです。

残りのデータを要求し、ステータス 0x61xx cl, ins, p1, p2, = (0x00, 0xa5, 0x00, 0x00) を探すには、特別な APDU を送信する必要があります。

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))
于 2014-01-16T14:19:09.837 に答える