# Path: yubioath/yubicommon/compat.py
# def byte2int(i):
#     if _PY2:
#         return ord(i)
#     return i
# 
# def int2byte(i):
#     if _PY2:
#         return chr(i)
#     return bytes((i,))


from smartcard import System
from smartcard.Exceptions import SmartcardException
from yubioath.yubicommon.compat import byte2int, int2byte
#
# If you modify this program, or any covered work, by linking or
# combining it with the OpenSSL project's OpenSSL library (or a
# modified version of that library), containing parts covered by the
# terms of the OpenSSL or SSLeay licenses, We grant you additional
# permission to convey the resulting work. Corresponding Source for a
# non-source form of such a combination shall include the source code
# for the parts of OpenSSL used as well as that of the covered work.

from __future__ import print_function




class ScardDevice(object):

    """
    Pyscard based backend.
    """

    def __init__(self, connection):
        self._conn = connection

    def send_apdu(self, cl, ins, p1, p2, data):
        header = [cl, ins, p1, p2, len(data)]
        # from binascii import b2a_hex
        # print("SEND:", b2a_hex(''.join(map(int2byte, header)) + data))
        resp, sw1, sw2 = self._conn.transmit(
            header + [byte2int(b) for b in data])
        # print("RECV:", b2a_hex(b''.join(map(int2byte, resp + [sw1, sw2]))))

# Path: yubioath/yubicommon/compat.py
# def byte2int(i):
#     if _PY2:
#         return ord(i)
#     return i
# 
# def int2byte(i):
#     if _PY2:
#         return chr(i)
#     return bytes((i,))


# Path: yubioath/core/ccid.py
from smartcard import System
from smartcard.Exceptions import SmartcardException
from yubioath.yubicommon.compat import byte2int, int2byte

#
# If you modify this program, or any covered work, by linking or
# combining it with the OpenSSL project's OpenSSL library (or a
# modified version of that library), containing parts covered by the
# terms of the OpenSSL or SSLeay licenses, We grant you additional
# permission to convey the resulting work. Corresponding Source for a
# non-source form of such a combination shall include the source code
# for the parts of OpenSSL used as well as that of the covered work.

from __future__ import print_function




class ScardDevice(object):

    """
    Pyscard based backend.
    """

    def __init__(self, connection):
        self._conn = connection

    def send_apdu(self, cl, ins, p1, p2, data):
        header = [cl, ins, p1, p2, len(data)]
        # from binascii import b2a_hex
        # print("SEND:", b2a_hex(''.join(map(int2byte, header)) + data))
        resp, sw1, sw2 = self._conn.transmit(
            header + [byte2int(b) for b in data])
        # print("RECV:", b2a_hex(b''.join(map(int2byte, resp + [sw1, sw2]))))

        return b''.join(int2byte(i) for i in resp), sw1 << 8 | sw2