Exemple #1
0
    def __init__(self, readerName=None, cardServiceClass=None):
        """Session constructor. Initializes a smart card session and
        connect to the card.

        @param readerName: reader to connect to; default is first PCSC reader
        @param cardServiceClass: card service to bind the session to; default
                            is None
        """

        # if reader name not given, select first reader
        if readerName is None:
            if len(readers()) > 0:
                self.reader = readers()[0]
                self.readerName = repr(self.reader)
            else:
                raise NoReadersException()

        # otherwise select reader from name
        else:
            self.readerName = readerName
            for reader in readers():
                if readerName == str(reader):
                    self.reader = reader
                    self.readerName = repr(self.reader)

        try:
            self.reader
        except AttributeError:
            raise InvalidReaderException(self.readerName)

        # open card connection and bind PassThruCardService
        cc = self.reader.createConnection()
        self.cs = PassThruCardService(cc)
        self.cs.connection.connect()
Exemple #2
0
    def __init__(self, readerName=None, cardServiceClass=None):
        """Session constructor. Initializes a smart card session and
        connect to the card.

        @param readerName: reader to connect to; default is first PCSC reader
        @param cardServiceClass: card service to bind the session to; default
                            is None
        """

        # if reader name not given, select first reader
        if readerName is None:
            if len(readers()) > 0:
                self.reader = readers()[0]
                self.readerName = repr(self.reader)
            else:
                raise NoReadersException()

        # otherwise select reader from name
        else:
            self.readerName = readerName
            for reader in readers():
                if readerName == str(reader):
                    self.reader = reader
                    self.readerName = repr(self.reader)

        try:
            self.reader
        except AttributeError:
            raise InvalidReaderException(self.readerName)

        # open card connection and bind PassThruCardService
        cc = self.reader.createConnection()
        self.cs = PassThruCardService(cc)
        self.cs.connection.connect()
Exemple #3
0
def checklocalconfig():
    try:
        f = open('local_config.py', 'r')
    except IOError:
        print 'local_config.py not found; generating local_config.py...'

    # generate local configuration
    f = open('local_config.py', 'w+')

    f.write('from smartcard.util import toHexString\n')
    f.write('expectedReaders = ')
    f.write(str(readers()) + '\n')
    expectedATRs = []
    for reader in readers():
        try:
            expectedATRs.append(getATR(reader))
        except NoCardException:
            expectedATRs.append([])
    f.write('expectedATRs = ')
    #for atr in expectedATRs: print `toHexString(atr)`
    f.write( ` expectedATRs ` + '\n')

    f.write('expectedATRinReader = {}\n')
    f.write('for i in xrange(len(expectedReaders)):\n')
    f.write('    expectedATRinReader[expectedReaders[i]] = expectedATRs[i]\n')

    f.write('expectedReaderForATR = {}\n')
    f.write('for i in xrange(len(expectedReaders)):\n')
    f.write(
        '    expectedReaderForATR[toHexString(expectedATRs[i])] = expectedReaders[i]\n'
    )

    f.write('expectedReaderGroups = [\'SCard$DefaultReaders\']\n')

    f.close()
def main():
    """ main """
    card_connection = readers()[0].createConnection()
    card_connection.connect(mode=SCARD_SHARE_DIRECT,
        disposition=SCARD_LEAVE_CARD)

    feature_list = getFeatureRequest(card_connection)

    get_tlv_properties = hasFeature(feature_list, FEATURE_GET_TLV_PROPERTIES)
    if get_tlv_properties:
        tlv = getTlvProperties(card_connection)
        print "Reader:   ", readers()[0]
        print "IdVendor:  0x%04X" % tlv['PCSCv2_PART10_PROPERTY_wIdVendor']
        print "IdProduct: 0x%04X" % tlv['PCSCv2_PART10_PROPERTY_wIdProduct']

    ccid_esc_command = hasFeature(feature_list, FEATURE_CCID_ESC_COMMAND)
    if ccid_esc_command is None:
        raise Exception("FEATURE_CCID_ESC_COMMAND is not supported or allowed")

    # Proprietary command for Gemalto readers
    # This is implemented by the Gemalto Pinpad v2 and C200 readers
    firmware_features = [0x6A]
    try:
        res = card_connection.control(ccid_esc_command, firmware_features)
    except SmartcardException, ex:
        print "Failed:", ex
        return
Exemple #5
0
def checklocalconfig():
    try:
        f = open('local_config.py', 'r')
    except IOError:
        print 'local_config.py not found; generating local_config.py...'

    # generate local configuration
    f = open('local_config.py', 'w+')

    f.write('from smartcard.util import toHexString\n')
    f.write('expectedReaders = ')
    f.write(str(readers()) + '\n')
    expectedATRs = []
    for reader in readers():
        try:
            expectedATRs.append(getATR(reader))
        except NoCardException:
            expectedATRs.append([])
    f.write('expectedATRs = ')
    #for atr in expectedATRs: print `toHexString(atr)`
    f.write(`expectedATRs` + '\n')

    f.write('expectedATRinReader = {}\n')
    f.write('for i in xrange(len(expectedReaders)):\n')
    f.write('    expectedATRinReader[expectedReaders[i]] = expectedATRs[i]\n')

    f.write('expectedReaderForATR = {}\n')
    f.write('for i in xrange(len(expectedReaders)):\n')
    f.write('    expectedReaderForATR[toHexString(expectedATRs[i])] = expectedReaders[i]\n')

    f.write('expectedReaderGroups = [\'SCard$DefaultReaders\']\n')

    f.close()
Exemple #6
0
    def testcase_CardRequestNewCardInReaderNotPresentInfiniteTimeOut(self):
        """Test smartcard.CardRequest for any new card in a specific
        reader not present without time-out."""

        print('please remove a smart card reader')
        _readerz = readers()
        while True:
            readerz = readers()
            if len(_readerz) > len(readerz):
                break
            time.sleep(.1)

        for reader in readerz:
            _readerz.remove(reader)

        cardtype = AnyCardType()
        cardrequest = CardRequest(
            timeout=None,
            readers=[_readerz[0]],
            cardType=cardtype,
            newcardonly=True)
        print('Re-insert reader ', _readerz[0], 'with a card inside')
        cardservice = cardrequest.waitforcard()
        cardservice.connection.connect()
        print(toHexString(
            cardservice.connection.getATR()), \
            'in', cardservice.connection.getReader())
        cardservice.connection.disconnect()
def main():
    """ main """
    card_connection = readers()[0].createConnection()
    card_connection.connect(mode=SCARD_SHARE_DIRECT,
                            disposition=SCARD_LEAVE_CARD)

    feature_list = getFeatureRequest(card_connection)

    get_tlv_properties = hasFeature(feature_list, FEATURE_GET_TLV_PROPERTIES)
    if get_tlv_properties:
        tlv = getTlvProperties(card_connection)
        print "Reader:   ", readers()[0]
        print "IdVendor:  0x%04X" % tlv['PCSCv2_PART10_PROPERTY_wIdVendor']
        print "IdProduct: 0x%04X" % tlv['PCSCv2_PART10_PROPERTY_wIdProduct']

    ccid_esc_command = hasFeature(feature_list, FEATURE_CCID_ESC_COMMAND)
    if ccid_esc_command is None:
        raise Exception("FEATURE_CCID_ESC_COMMAND is not supported or allowed")

    # Proprietary command for Gemalto readers
    # This is implemented by the Gemalto Pinpad v2 and C200 readers
    firmware_features = [0x6A]
    try:
        res = card_connection.control(ccid_esc_command, firmware_features)
    except SmartcardException, ex:
        print "Failed:", ex
        return
    def testcase_CardRequestNewCardInReaderNotPresentInfiniteTimeOut(self):
        """Test smartcard.CardRequest for any new card in a specific
        reader not present without time-out."""

        print 'please remove a smart card reader'
        _readerz = readers()
        while True:
            readerz = readers()
            if len(_readerz) > len(readerz):
                break
            time.sleep(.1)

        for reader in readerz:
            _readerz.remove(reader)

        cardtype = AnyCardType()
        cardrequest = CardRequest(
            timeout=None,
            readers=[_readerz[0]],
            cardType=cardtype,
            newcardonly=True)
        print 'Re-insert reader ', _readerz[0], 'with a card inside'
        cardservice = cardrequest.waitforcard()
        cardservice.connection.connect()
        print toHexString(
            cardservice.connection.getATR()), \
            'in', cardservice.connection.getReader()
        cardservice.connection.disconnect()
    def testcase_Card_Eq_NotEq(self):
        """Test == and != for Cards."""
        for reader in readers():
            card = Card(str(reader), expectedATRinReader[str(reader)])
            cardcopy = Card(str(reader), expectedATRinReader[str(reader)])
            self.assertEqual(True, card == cardcopy)
            self.assertEqual(True, not card != cardcopy)

        for reader in readers():
            card = Card(str(reader), expectedATRinReader[str(reader)])
            cardcopy = Card(str(reader), [0, 0])
            self.assertEqual(True, card != cardcopy)
            self.assertEqual(True, not card == cardcopy)
Exemple #10
0
    def testcase_Card_Eq_NotEq(self):
        """Test == and != for Cards."""
        for reader in readers():
            card = Card(str(reader), expectedATRinReader[str(reader)])
            cardcopy = Card(str(reader), expectedATRinReader[str(reader)])
            self.assertEqual(True, card == cardcopy)
            self.assertEqual(True, not card != cardcopy)

        for reader in readers():
            card = Card(str(reader), expectedATRinReader[str(reader)])
            cardcopy = Card(str(reader), [0, 0])
            self.assertEqual(True, card != cardcopy)
            self.assertEqual(True, not card == cardcopy)
Exemple #11
0
def readCard(request):
    response_data = {}
    response_error = {}
    # define the APDUs used in this script
    COMMAND = [0xFF, 0xCA, 0x00, 0x00, 0x00]

    # get all the available readers
    r = readers()
    if len(r) > 0:
        reader = r[0]
        try:
            connection = reader.createConnection()
            connection.connect()
            data, sw1, sw2 = connection.transmit(COMMAND)
            response_data['reader'] = str(reader)
            response_data['UUIDec'] = str(data)
            response_data['UUIDHex'] = "".join(
                ['{:02X}'.format(h) for h in data])
            response_data['command'] = str(sw1) + " " + str(sw2)
            response_data['message'] = "Ok"
            #raise Exception('hola')
        except Exception:
            response_error['error'] = 'No se detecto ninguna tarjeta'
            return HttpResponse(json.dumps(response_error),
                                content_type="application/json")
        return HttpResponse(json.dumps(response_data),
                            content_type="application/json")
    else:
        response_error['error'] = 'No se detecto ningun lector'
        return HttpResponse(json.dumps(response_error),
                            content_type="application/json")
Exemple #12
0
 def testcase_readers_in_readergroup_nonexistent(self):
     foundreaders = {}
     for reader in readers(['dummy$group']):
         foundreaders[reader] = 1
     for reader in expectedReaders:
         self.assert_(not foundreaders.has_key(reader))
     self.assertEquals(0, len(foundreaders))
Exemple #13
0
def work():
    r = readers()

    if len(r) < 1:
            print ("error: No readers available!")
            sys.exit()
    else :
        reader = r[0]
        print ("Using: ", reader)

    connection = reader.createConnection()

    while(True):
        try:
            connection.connect()
            cmdMap = {
                "getuid":[0xFF, 0xCA, 0x00, 0x00, 0x00]
            }
            data, sw1, sw2 = connection.transmit( cmdMap['getuid'] )
            uid = toHexString(data)
            checkUid(uid)
            sleep(1)
        except:
            print("No Card")
            window.deiconify()
            sleep(1)
            continue
Exemple #14
0
	def setUp(self):
		r = readers()
		self.max = maxim.MaximAPI(r[0])
		self.max.Connect()
		self.CardInterfaces = [1,2]
		self.UnknownInterfaces = [3, 7]
		self.timeout = 0b10000111
Exemple #15
0
def main():
    global logger
    global consumer

    setup_logging()
    logger = logging.getLogger(__name__)

    logger.info(
        "Insert MIFARE Desfire card to any reader to get its applications.")

    available_reader = readers()
    logger.info("Available readers: %s", available_reader)
    if not available_reader:
        sys.exit("No smartcard readers detected")

    consumer = ConsumerThread()
    consumer.start()

    cardmonitor = CardMonitor()
    cardobserver = MyObserver()
    cardmonitor.addObserver(cardobserver)

    try:
        while True:
            time.sleep(1)
    finally:
        consumer.alive = False

    # don't forget to remove observer, or the
    # monitor will poll forever...
    cardmonitor.deleteObserver(cardobserver)
Exemple #16
0
def Baca(blok):
    try:
        r = readers()
        print "Available readers:", r

        reader = r[0]

        connection = reader.createConnection()
        connection.connect()

        cmdott = [0xFF, 0x88, 0x00, blok, 0x60, 0x00]
        cmd = [0xFF, 0xB0, 0x00, blok, 0x10]

        dataott, sw1, sw2 = connection.transmit(cmdott)
        # print "Select Applet: %02X %02X" % (sw1, sw2)
        if hex(sw1) == hex(144):
            print "Ott Sukses"
        else:
            print "Ott Gagal"

        data, sw1, sw2 = connection.transmit(cmd)
        if hex(sw1) == hex(144):
            print "Baca Sukses"
        else:
            print "Baca Gagal"

    except smartcard.Exceptions.CardConnectionException as inst:
        print "Kartu Tidak di Temukan, Mohon Untuk Men Tap Kartu Pada Reader! "
    except:
        print "Ada Error/NFC Reader Belum Terhubung!"

    return toASCIIString(data)
Exemple #17
0
def open_key_multiple_readers(name=None):
    """
    Opens a smartcard reader matching the given name and connects to the
    ykneo-oath applet through it.

    Returns a reference to the YkneoYubiOath object.
    """
    for reader in readers():
        print "list of readers"
        print readers
        try:
            conn = reader.createConnection()
            conn.connect()

            data, status = _cmd2(conn, 0, 0xa4, 0x04, 0x00, 'a0000005272101'.decode('hex'))

            
            if (status) != 0x9000:
                print "unable to select the applet on reader %s" % reader
            else:
                print "using reader"
                print reader
                return YkneoYubiOath(conn)
        except Exception, e:
            print "WARNING: %s" % e
            print "i am in the except of multiple readers"
Exemple #18
0
def closing_connection():
	import time
	import os, shutil, os.path
	"""
		This method will ask the user the reject the card!
	"""
	# Destroy session for next use!
	session.clear()
	# Destroy all files within data directory!
	folder = 'data/'
	for the_file in os.listdir(folder):
		file_path = os.path.join(folder, the_file)
		try:
			if os.path.isfile(file_path):
			    os.unlink(file_path)
				#elif os.path.isdir(file_path): shutil.rmtree(file_path)
		except Exception as e:
			print(e)
	# Write file is_exist_card for an ajax to check it
	write_data_to_file("is_exist_card", 'data_exist')
	r = readers()
	reader = r[0]
	connection = reader.createConnection()
	connection.disconnect()
	time.sleep(10) # delays for 10 seconds
	os.remove('is_exist_card')
	return redirect(url_for('index'))
Exemple #19
0
    def __init__(self):
        # Get all the available readers
        readerList = readers()
        print('Available readers:')
        for readerIndex, readerItem in enumerate(readerList):
            print(readerIndex, readerItem)

        # Select reader
        readerSelectIndex = 0  # int(input('Select reader[0]: ') or '0')
        reader = readerList[readerSelectIndex]

        print('Using:', reader)
        self.connection = reader.createConnection()
        self.connection.connect()
        atr = self.connection.getATR()

        print('ATR: ' + toHexString(atr))
        if (atr[0] == 0x3B & atr[1] == 0x67):
            self.req = [0x00, 0xc0, 0x00, 0x01]
        else:
            self.req = [0x00, 0xc0, 0x00, 0x00]

        # Check card
        data, sw1, sw2 = self.connection.transmit(SELECT + THAI_CARD)
        print('Select Applet: %02X %02X' % (sw1, sw2))

        self.PHOTO = [
            CMD_PHOTO1, CMD_PHOTO2, CMD_PHOTO3, CMD_PHOTO4, CMD_PHOTO5,
            CMD_PHOTO6, CMD_PHOTO7, CMD_PHOTO8, CMD_PHOTO9, CMD_PHOTO10,
            CMD_PHOTO11, CMD_PHOTO12, CMD_PHOTO13, CMD_PHOTO14, CMD_PHOTO15,
            CMD_PHOTO16, CMD_PHOTO17, CMD_PHOTO18, CMD_PHOTO19, CMD_PHOTO20]
Exemple #20
0
 def __init__(self, reader_number: int = 0, **kwargs):
     super().__init__(**kwargs)
     r = readers()
     if reader_number >= len(r):
         raise ReaderError
     self._reader = r[reader_number]
     self._con = self._reader.createConnection()
Exemple #21
0
def connexion():
    #Tant que la carte n'a pas été insérée
    while (True):
        try:
            r = readers()
            connection = r[0].createConnection()
            connection.connect()
            #Selection AID
            data, sw1, sw2 = connection.transmit([
                0x00, 0xA4, 0x04, 0x00, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05,
                0x06, 0x07, 0x08
            ])
            if ((int(sw1) != 144) or (int(sw2) != 0)):
                print("Problème de communication")
                sys.exit()
            if ((int(sw1) == 144) and (int(sw2) == 0)):
                print("Connexion établie")
            if (AUTH == False):
                authentification(connection)
            break
        except NoCardException:
            print("Veuillez insérer la carte")
            time.sleep(5)
        except CardConnectionException:
            print("La carte a été retirée")
            print("Veuillez insérer la carte")
    return connection
Exemple #22
0
    def __send_intro_message(self, waiting):
        """ sends introduction message and returns active connection to device """

        logging.debug('Initialized communication. waiting for device...')

        if waiting:
            cardrequest = CardRequest(timeout=3000)
            cardrequest.waitforcard()

        r = readers()
        reader = r[0]

        connection = reader.createConnection()
        connection.connect()

        logging.debug('Connected to device. ')
        logging.debug('Sending initial message with AID.')

        # Send introductory message with AID from configuration file
        intro_message = APDUMessage(APDUHeader.SELECT_AID,
                                    config.AID).convertToByteArray()

        data, sw1, sw2 = connection.transmit(intro_message)

        logging.debug('Got response: %02X %02X' % (sw1, sw2))

        # Return active connection that is later used to communicate with device
        return connection
Exemple #23
0
def getDongle(debug=False, selectCommand=None):
    dev = None
    hidDevicePath = None
    ledger = True
    for hidDevice in hid.enumerate(0, 0):
        if hidDevice['vendor_id'] == 0x2c97:
            hidDevicePath = hidDevice['path']
    if hidDevicePath is not None:
        dev = hid.device()
        dev.open_path(hidDevicePath)
        dev.set_nonblocking(True)
        return HIDDongleHIDAPI(dev, ledger, debug)
    if SCARD:
        connection = None
        for reader in readers():
            try:
                connection = reader.createConnection()
                connection.connect()
                if selectCommand != None:
                    response, sw1, sw2 = connection.transmit(
                        toBytes("00A4040010FF4C4547522E57414C5430312E493031"))
                    sw = (sw1 << 8) | sw2
                    if sw == 0x9000:
                        break
                    else:
                        connection.disconnect()
                        connection = None
                else:
                    break
            except:
                connection = None
                pass
        if connection is not None:
            return DongleSmartcard(connection, debug)
    raise CommException("No dongle found")
Exemple #24
0
def message_received(client, server, message):
    if message == "GetInfo":
        try:
            Select = [0xFF, 0xA4, 0x00, 0x00, 0x01, 0x06]
            ReadName = [0xFF, 0xB0, 0x00, 0x20, 0x09]
            ReadBirthday = [0xFF, 0xB0, 0x00, 0x30, 0x08]
            ReadID = [0xFF, 0xB0, 0x00, 0x40, 0x0A]

            r = readers()
            reader = r[0]

            connection = reader.createConnection()
            connection.connect()

            connection.transmit(Select)

            send_data = ''
            data, sw1, sw2 = connection.transmit(ReadName)
            send_data += bytes(data).decode('utf8') + ","
            data, sw1, sw2 = connection.transmit(ReadBirthday)
            send_data += ''.join(chr(i) for i in data) + ","
            data, sw1, sw2 = connection.transmit(ReadID)
            send_data += ''.join(chr(i) for i in data) + "\n"

            server.send_message_to_all(send_data)
        except:
            server.send_message_to_all('error')
Exemple #25
0
 def __init__(self, AppID="A0000010000112"):
     """Search for a Cryptnox and connect to it."""
     reader_detected = False
     self.appid = AppID
     readers_list = readers()
     if len(readers_list) > 0:
         logger.debug("Available smartcard readers : %s", readers_list)
         for r in readers_list:
             if not str(r).startswith("Yubico"):
                 try:
                     logger.debug("Trying with reader : %s", r)
                     self.connection = r.createConnection()
                     self.connection.connect(CardConnection.T1_protocol)
                     reader_detected = hasattr(self, "connection")
                 except Exception:
                     logger.debug("Fail with this reader")
                     pass
             if reader_detected:
                 logger.debug("A Cryptnox detected, using %s", r)
                 break
     if reader_detected:
         self.select()
     else:
         raise Exception("Can't find any Cryptnox connected.")
     self.sec_chan = None
     self.SNID = None  # will be set by get_manufacturer_cert (cert ID)
     self.session_pub_key = self.check_genuine()
def switch_interface(interface):
    """
    switch from contact to contactless (or reverse) on a GemProx DU reader
    """
    for reader in readers():
        cardConnection = reader.createConnection()
        cardConnection.connect(mode=SCARD_SHARE_DIRECT, disposition=SCARD_LEAVE_CARD)

        switch_interface_cmd = [0x52, 0xF8, 0x04, 0x01, 0x00, interface]
        print("Reader:", reader, "=>", end=' ')
        try:
            res = cardConnection.control(IOCTL_SMARTCARD_VENDOR_IFD_EXCHANGE,
                switch_interface_cmd)
        except:
            print("FAILED")
        else:
            if res != [0, 0, 0, 0]:
                print("Failed: ", end='')
                err = res[0] * 256 + res[1]
                if err == 0xFF83:
                    print("Wrong data parameters")
                elif err == 0xFF84:
                    print("Wrong command bytes")
                else:
                    print("Unknown error:", [hex(x) for x in res])
            else:
                print("Success")
Exemple #27
0
def switch_interface(interface):
    """
    switch from contact to contactless (or reverse) on a GemProx DU reader
    """
    for reader in readers():
        cardConnection = reader.createConnection()
        cardConnection.connect(mode=SCARD_SHARE_DIRECT, disposition=SCARD_LEAVE_CARD)

        switch_interface_cmd = [0x52, 0xF8, 0x04, 0x01, 0x00, interface]
        print("Reader:", reader, "=>", end=' ')
        try:
            res = cardConnection.control(IOCTL_SMARTCARD_VENDOR_IFD_EXCHANGE,
                switch_interface_cmd)
        except SmartcardException as e:
            print("FAILED")
        else:
            if res != [0, 0, 0, 0]:
                print("Failed: ", end='')
                err = res[0] * 256 + res[1]
                if err == 0xFF83:
                    print("Wrong data parameters")
                elif err == 0xFF84:
                    print("Wrong command bytes")
                else:
                    print("Unknown error:", [hex(x) for x in res])
            else:
                print("Success")
def mp_procedure(reader_name):
    print("Input the serial: ")
    serial_hex = input()
    print("\n------")
    print("Current serial: {}".format(serial_hex))
    input("Insert a canokey then press enter to continue, Ctrl-C to exit")

    try:
        r = readers()
        if len(r) == 0:
            print("No readers available")
            return False
        for reader in r:
            if reader_name in str(reader):
                print("Target:", reader)
                break
        else:
            print("No matching reader. Available readers:", r)
            return False
        dev_key, dev_cert = gen_device_key(serial_hex)
        connection = reader.createConnection()
        connection.connect()
        write_configs(connection)
        transmit_apdu(connection, "0030000004{}".format(serial_hex))
        transmit_apdu(connection, "0001000020{}".format(dev_key))
        transmit_apdu(connection, "0002000000{:04X}{}".format(len(dev_cert)//2, dev_cert))
        connection.disconnect()
        print("Successfully initialized. Next.")
    except:
        print("Failed to initialize the canokey")
        traceback.print_exc()
        return False

    return True
Exemple #29
0
    def do_cards(self, line):
        """Lists all cards in the system"""
        if not self.check_root() or not self.check_pid():
            return self.return_code(1)

        print('\nLoading connected cards...\n')

        # List all cards
        try:
            rlist = readers()
            devices = []
            available_readers = []
            for reader in rlist:
                dev = EBCardReader(reader)
                try:
                    connection = reader.createConnection()
                    connection.connect()
                    dev.card_ok = True
                    available_readers.append(reader)

                    ebcard = EBCard(reader, connection)
                    ebcard.select_importcard()
                    dev.import_applet_ok = True

                    # Read the card key
                    key = ebcard.get_pubkey()
                    dev.card_id = self.format_pubkey(key)
                    dev.card_id_short = dev.card_id[:23]

                except errors.InvalidApplet as e:
                    dev.import_applet_ok = False

                except Exception as e:
                    dev.card_ok = False

                devices.append(dev)

            if len(devices) == 0:
                print(self.t.red('No card reader connected'))
                return self.return_code(1, True)

            for idx, dev in enumerate(devices):
                if not dev.card_ok:
                    print('%02d. No card present\n reader: %s\n' %
                          (idx + 1, dev.reader))
                elif not dev.import_applet_ok:
                    print('%02d. Unknown card\n reader: %s\n' %
                          (idx + 1, dev.reader))
                elif dev.card_id is None:
                    print('%02d. Uninitialized card\n reader: %s\n' %
                          (idx + 1, dev.reader))
                else:
                    print('%02d. Import card %s\n reader: %s\n' %
                          (idx + 1, dev.card_id_short, dev.reader))

            return self.return_code(0)

        except Exception as e:
            logger.error('Exception in setting import card: %s', e)
            raise
Exemple #30
0
def main():
    """ main """
    card_connection = readers()[0].createConnection()
    card_connection.connect(mode=SCARD_SHARE_DIRECT,
                            disposition=SCARD_LEAVE_CARD)

    feature_list = getFeatureRequest(card_connection)
    #print getPinProperties(card_connection)

    mct_reader_direct = hasFeature(feature_list, FEATURE_MCT_READER_DIRECT)
    if mct_reader_direct is None:
        raise Exception("The reader does not support MCT_READER_DIRECT")

    secoder_info = [0x20, 0x70, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00]
    res = card_connection.control(mct_reader_direct, secoder_info)
    parse_info(res)

    secoder_select = [
        0x20, 0x71, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x80, 0x05, 0x31, 0x2E,
        0x31, 0x2E, 0x30, 0x84, 0x02, 0x64, 0x65, 0x90, 0x01, 0x01, 0x85, 0x03,
        ord('g'),
        ord('k'),
        ord('p'), 0x00, 0x00
    ]
    res = card_connection.control(mct_reader_direct, secoder_select)
    parse_select(res)
Exemple #31
0
 def testcase_readers_in_readergroup_nonexistent(self):
     foundreaders = {}
     for reader in readers(['dummy$group']):
         foundreaders[reader] = 1
     for reader in expectedReaders:
         self.assert_(not reader in foundreaders)
     self.assertEquals(0, len(foundreaders))
Exemple #32
0
def main():
    """ Ask the first reader/driver to return its Vendor Name if any """
    card_connection = readers()[0].createConnection()
    card_connection.connect(mode=SCARD_SHARE_DIRECT,
        disposition=SCARD_LEAVE_CARD)

    try:
        # Vendor name
        name = card_connection.getAttrib(SCARD_ATTR_VENDOR_NAME)
        print(''.join([chr(char) for char in name]))

        # Vendor-supplied interface device version (DWORD in the form
        # 0xMMmmbbbb where MM = major version, mm = minor version, and
        # bbbb = build number).
        version = card_connection.getAttrib(SCARD_ATTR_VENDOR_IFD_VERSION)
        print("Version: %d.%d.%d" % (version[3], version[2],
                version[0]))

        # Vendor-supplied interface device serial number.
        # only for readers with a USB serial number
        serial = card_connection.getAttrib(SCARD_ATTR_VENDOR_IFD_SERIAL_NO)
        print(serial)

        # Reader's display name
        # only with pcsc-lite version >= 1.6.0
        name = card_connection.getAttrib(SCARD_ATTR_DEVICE_FRIENDLY_NAME)
        print(''.join([chr(char) for char in name]))

    except smartcard.Exceptions.SmartcardException, message:
        print("Exception:", message)
Exemple #33
0
def selection(SELECT_APPLIC, SELECT_APPLET):
    global connection
    global reponse

    try:
        r = readers()
        print(r)
        connection = r[0].createConnection()
        connection.connect()
        reponse = 1
        print(reponse)
        try:
            data, sw1, sw2 = connection.transmit(SELECT_APPLIC)
            sw1 = "%x" % sw1
            sw2 = "%x" % sw2

            if ((sw1 == "90") and (sw2 == "0")):
                data, sw1, sw2 = connection.transmit(SELECT_APPLET)
                sw1 = "%x" % sw1
                sw2 = "%x" % sw2
                # verifier la reponse de selection de l'applet
                if ((sw1 == "90") and (sw2 == "0")):
                    return 1
        except:
            return 0
    except:
        return 0
Exemple #34
0
    def run(self):
        found= False
        for reader in readers():
            try:
                connection = reader.createConnection()
                connection.connect()
                ATR = toHexString(connection.getATR())
                APDU = [0xFF,0xCA,0x00,0x00,0x00]
                data, sw1, sw2 = connection.transmit(APDU)
                UID= toHexString(data)
            except NoCardException:
                print(reader, 'no card inserted')

            except:
                self.signals.error.emit((reader, 'error !!'))

            else:
                found= True
                self.signals.result.emit(UID)

            finally:
                QThread.sleep(2)
        if(found):
            self.signals.finished.emit()
        else:
            self.signals.error.emit((reader,'aucune carte à proximité ou insérée !!!'))
def list_readers():
    """

    :rtype : object
    """
    r = readers()
    return r
Exemple #36
0
def main():
    """ Ask the first reader/driver to return its Vendor Name if any """
    card_connection = readers()[0].createConnection()
    card_connection.connect(mode=SCARD_SHARE_DIRECT,
                            disposition=SCARD_LEAVE_CARD)

    try:
        # Vendor name
        name = card_connection.getAttrib(SCARD_ATTR_VENDOR_NAME)
        print ''.join([chr(char) for char in name])

        # Vendor-supplied interface device version (DWORD in the form
        # 0xMMmmbbbb where MM = major version, mm = minor version, and
        # bbbb = build number).
        version = card_connection.getAttrib(SCARD_ATTR_VENDOR_IFD_VERSION)
        print "Version: %d.%d.%d" % (version[3], version[2], version[0])

        # Vendor-supplied interface device serial number.
        # only for readers with a USB serial number
        serial = card_connection.getAttrib(SCARD_ATTR_VENDOR_IFD_SERIAL_NO)
        print serial

        # Reader's display name
        # only with pcsc-lite version >= 1.6.0
        name = card_connection.getAttrib(SCARD_ATTR_DEVICE_FRIENDLY_NAME)
        print ''.join([chr(char) for char in name])

    except smartcard.Exceptions.SmartcardException, message:
        print "Exception:", message
Exemple #37
0
 def testcase_readers_in_readergroup_nonexistent(self):
     foundreaders = {}
     for reader in readers(['dummy$group']):
         foundreaders[reader] = 1
     for reader in expectedReaders:
         self.assertTrue(not reader in foundreaders)
     self.assertEqual(0, len(foundreaders))
Exemple #38
0
def connexion():
    r=readers()
    connection=r[0].createConnection()
    connection.connect()
#Partie LOG
    # création de l'objet logger qui va nous servir à écrire dans les logs
    # on met le niveau du logger à DEBUG, comme ça il écrit tout
    logger.setLevel(logging.DEBUG)
    #logger.setLevel(logging.RELEASE)
    
    # création d'un formateur qui va ajouter le temps, le niveau
    # de chaque message quand on écrira un message dans le log
    formatter = logging.Formatter('%(asctime)s :: %(levelname)s :: %(message)s')
    # création d'un handler qui va rediriger une écriture du log vers
    # un fichier en mode 'append', avec 1 backup et une taille max de 1Mo
    file_handler = RotatingFileHandler('activity.log', 'a', 1000000, 1)
    # on lui met le niveau sur DEBUG, on lui dit qu'il doit utiliser le formateur
    # créé précédement et on ajoute ce handler au logger
    file_handler.setLevel(logging.DEBUG)
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)
    
    # création d'un second handler qui va rediriger chaque écriture de log
    # sur la console
    stream_handler = logging.StreamHandler()
    stream_handler.setLevel(logging.DEBUG)
    logger.addHandler(stream_handler)
Exemple #39
0
def find_reader(reader_name):
    """ Looks for a specific card reader

    Tries to find a card reader with specified name.

    Args:
        reader_name (str): string providing name of reader

    Returns:
        reader:
            :obj:`PyScardReader`: PyScard wrapper object.
            Chooses first reader with specified name if multiple 
            readers are found.

    Raises:
        RuntimeError: No reader found with specified name.
        
        Any exceptions thrown by the reader wrapper are passed through.
    """
    logger.debug('FIND READER name %s', reader_name)
    r = readers()
    for reader in r:
        if reader_name in str(reader):
            try:
                return open_pyscard(r[r.index(reader)])
            except:
                raise RuntimeError('No card on reader')
    raise RuntimeError('No reader found')
Exemple #40
0
def setup(readernumber):
	"""Open up a connection to the specified reader via PCSC
	"""

	r = readers()
	connection = r[readernumber].createConnection()
	connection.connect()
	return connection
Exemple #41
0
	def setUp(self):
		r = readers()
		self.max = maxim.MaximAPI(r[0])
		self.max.Connect()
		self.UnknownInterfaces = [3, 7]
		self._ENABLE = 0x00
		self._DISABLE = 0x01
		self._READ = 0b10000000
Exemple #42
0
def print_welcome():
    print "Welcome to sandwich-manager beta release."
    r = readers()
    if len(r) < 1:
        print "Warning: no reader available"
    else:
        print "Reader: " + str(r[0])
    print "Type 'help' or 'h' for help."
	def __init__(self, dbus_server):
		self.dbus_server = dbus_server
		r = readers()
		self.ttag = r[r.index('ACS ACR 38U-CCID 00 00')].createConnection()
		self.ttag.connect()
		#set retry time to 1
		RTO = get_set_retry_time_to_one()
		data, sw1, sw2 = self.ttag.transmit( RTO )
    def testcase_CardDictionary(self):
        """Create a dictionnary with Card keys"""
        mydict = {}
        for reader in readers():
            card = Card(reader, expectedATRinReader[str(reader)])
            mydict[card] = reader

        for card in list(mydict.keys()):
            self.assertTrue(str(card.reader) in expectedReaders)
Exemple #45
0
	def setUp(self):
		r = readers()
		self.max = maxim.MaximAPI(r[0])
		self.max.Connect()
		self.UnknownInterfaces = [3, 7]
		self.timeout = 0b00000111 # 7 seconds
		self.EMV_SELECT_COMMAND = [0x00, 0xA4, 0x04, 0x00, 0x0E, 0x31, 0x50, 0x41, 0x59, 
															 0x2E, 0x53, 0x59, 0x53, 0x2E, 0x44, 0x44, 0x46, 0x30,
															 0x31, 0x00]
Exemple #46
0
def getAttribute(): 
  r=readers()
  connection = r[0].createConnection()
  connection.connect()
  
  GETATTR = [0x80, 0x2B, 0x00, 0x00]

  data, sw1, sw2 = connection.transmit( GETATTR )
  return (data, sw1, sw2)
Exemple #47
0
 def __init__(self):
     reader = readers()
     print(reader)
     if not reader:
         print("Reader NOT CONNECTED")
         print("Connect reader please, and try again")
         Read.exit_app()
     else:
         print("Приложите карту ")
         app_init()
 def get_status(self): 
     cards = 0
     for reader in readers():
         try: 
             connection = reader.createConnection()
             connection.connect()
             cards = cards + 1
         except NoCardException: pass
     self.cards = cards
     return (self.cards > 0)
Exemple #49
0
    def testcase_ATRCardTypeWithoutMask(self):
        """Test smartcard.ATRCardType without mask."""

        for reader in readers():
            if [] != expectedATRinReader[str(reader)]:
                ct = ATRCardType(expectedATRinReader[str(reader)])
                connection = reader.createConnection()
                connection.connect()
                self.assertEquals(True, ct.matches(connection.getATR()))
                self.assertEquals(True, ct.matches(connection.getATR(), reader))
                connection.disconnect()
Exemple #50
0
    def testcase_AnyCardType(self):
        """Test smartcard.AnyCardType."""

        ct = AnyCardType()
        for reader in readers():
            if [] != expectedATRinReader[str(reader)]:
                connection = reader.createConnection()
                connection.connect()
                self.assertEquals(True, ct.matches(connection.getATR()))
                self.assertEquals(True, ct.matches(connection.getATR(), reader))
                connection.disconnect()
Exemple #51
0
def check_reader_availability():
    global connection
    r = readers()
    if len(r) < 1:
        print "Warning: no reader available"
    else:
        #from smartcard.CardConnectionObserver import ConsoleCardConnectionObserver
        #observer = ConsoleCardConnectionObserver()
        connection = r[0].createConnection()
        #connection.addObserver(observer)
        connection.connect()
Exemple #52
0
def connectCard(reader_name=""):
    r = readers()
    rege = re.compile(r".*" + reader_name + r".*")
    cons = [rr for rr in r if rege.match(rr.__str__())]
    if len(cons) != 1:
        print "Non uniq connections:", cons
        return
    c = GAFConnection(cons[0].createConnection())
    observer = ConsoleObserver()
    c.addObserver(observer)
    dispTime(c, False)  # default: time not printed
    c.connect()
    return c
def list_devices():
    devices = []
    for reader in readers():
        if CARD_PATTERN.match(reader.name):
            conn = reader.createConnection()
            try:
                conn.connect()
                data, sw1, sw2 = conn.transmit(hex2cmd('00a4040007%s' % AID))
                if (sw1, sw2) == (0x90, 0x00):
                    devices.append(CCIDDevice(conn))
            except:
                pass
    return devices
    def testcase_CardConnectionT1inTransmit(self):
        """Test that T1 in transmit for a T0 card fails."""
        SELECT = [0xA0, 0xA4, 0x00, 0x00, 0x02]
        DF_TELECOM = [0x7F, 0x10]

        for reader in readers():
            cc = reader.createConnection()
            if [] != expectedATRinReader[str(reader)]:
                cc.connect()
                self.assertRaises(CardConnectionException, cc.transmit, SELECT + DF_TELECOM, CardConnection.T1_protocol)
            else:
                self.assertRaises(NoCardException, cc.connect)
        cc.disconnect()
    def testcase_CardConnectionT1inConnect(self):
        """Test that connecting with T1 on a T0 card fails."""

        for reader in readers():
            cc = reader.createConnection()
            # on Mac OS X Tiger, trying to connect with T=1 protocol does not except
            if not 'pcsclite-tiger' == resourceManagerSubType:
                if [] != expectedATRinReader[str(reader)]:
                    # should fail since the test card does not support T1
                    self.assertRaises(CardConnectionException, cc.connect, CardConnection.T1_protocol)
                else:
                    self.assertRaises(NoCardException, cc.connect)
        cc.disconnect()
Exemple #56
0
def connectReaderFun(envi,readerIndex = None):
    "establish a link between the shell and a card"
    
    if "connection" in envi and envi["connection"] != None:
        print "there is already a connection to reader"
        return False
    
    r = readers()
    if readerIndex == None:
        indice = 0
        if len(r) > 1:
            Executer.printOnShell("Warning : the connection will open on the first available reader but there are others")
    else:
        indice = readerIndex
    
    if len(r) == 0:
        Executer.printOnShell("there is no reader available")
        return False
     
    try:
        reader = r[indice]
    except IndexError:
        Executer.printOnShell("invalid indice")
        return False
        
    try:
        envi["connection"] = reader.createConnection() #create a connection on the reader
    except Exception as e:
        Executer.printOnShell(str(e))
        return False
        
    try:
        envi["connection"].connect()#create a connection on the card
    except Exception as e:
        del envi["connection"]
        Executer.printOnShell(str(e))
        return False
    
    card = None
    for c in cardobserver.cardList:
        if c.atr == envi["connection"].getATR() and c.reader == reader:
            card = c
            card.connection = envi["connection"]
            card.connection.card = card

    if card == None:
        Executer.printOnShell("WARNING : the connected card is not in the card list")
    
    envi["connectedReader"] = reader
    
    return True
def reader_exists(reader_prefix):
    """Returns boolean based on the existence of our reader

    The just happens to be the first place the app falls over if pcsc isn't available,
    beware the anecdotal attempt at cross platform exception handling."""
    try:
        for r in readers():
            if reader_prefix in str(r) and str(r).index(reader_prefix) == 0:
                return True
        return False
    except TypeError:  # Occurs when SCardSvr is not running on Windows
        raise exceptions.PyScardFailure
    except PCSCExceptions.ListReadersException:  # When pcscd is not running
        raise exceptions.PyScardFailure
    def testcase_CardConnectionT0T1inTransmitMustFail(self):
        """Test with bad parameter in transmit  the response to SELECT
        DF_TELECOM."""
        SELECT = [0xA0, 0xA4, 0x00, 0x00, 0x02]
        DF_TELECOM = [0x7F, 0x10]

        for reader in readers():
            cc = reader.createConnection()
            if [] != expectedATRinReader[str(reader)]:
                cc.connect(CardConnection.T0_protocol | CardConnection.T1_protocol)
                self.assertRaises(CardConnectionException, cc.transmit, SELECT + DF_TELECOM, CardConnection.T0_protocol | CardConnection.T1_protocol)
            else:
                self.assertRaises(NoCardException, cc.connect)
        cc.disconnect()
Exemple #59
0
def open_key(name=None):
    """
    Opens a smartcard reader matching the given name and connects to the
    ykneo-bitcoin applet through it.

    Returns a reference to the YkneoBitcoin object.
    """
    r = re.compile(name) if name else READER_PATTERN
    for reader in readers():
        if r.match(reader.name):
            conn = reader.createConnection()
            conn.connect()
            return YkneoBitcoin(conn)
    raise Exception('No smartcard reader found matching: %s' % r.pattern)