def __init__(self, datasetfile, card_type, host, port, readernum=None, mitmPath=None, ef_cardsecurity=None, ef_cardaccess=None, ca_key=None, cvca=None, disable_checks=False, esign_key=None, esign_ca_cert=None, esign_cert=None, logginglevel=logging.INFO): from os.path import exists logging.basicConfig(level=logginglevel, format="%(asctime)s [%(levelname)s] %(message)s", datefmt="%d.%m.%Y %H:%M:%S") self.cardGenerator = CardGenerator(card_type) # If a dataset file is specified, read the card's data groups from disk if datasetfile is not None: if exists(datasetfile): logging.info("Reading Data Groups from file %s.", datasetfile) self.cardGenerator.readDatagroups(datasetfile) MF, SAM = self.cardGenerator.getCard() # Generate an OS object of the correct card_type if card_type == "iso7816" or card_type == "ePass": self.os = Iso7816OS(MF, SAM) elif card_type == "nPA": from virtualsmartcard.cards.nPA import NPAOS self.os = NPAOS(MF, SAM, ef_cardsecurity=ef_cardsecurity, ef_cardaccess=ef_cardaccess, ca_key=ca_key, cvca=cvca, disable_checks=disable_checks, esign_key=esign_key, esign_ca_cert=esign_ca_cert, esign_cert=esign_cert) elif card_type == "cryptoflex": from virtualsmartcard.cards.cryptoflex import CryptoflexOS self.os = CryptoflexOS(MF, SAM) elif card_type == "relay": from virtualsmartcard.cards.Relay import RelayOS from virtualsmartcard.cards.RelayMiddleman import RelayMiddleman mitm = loadMitMFromPath(mitmPath) if mitmPath else RelayMiddleman() self.os = RelayOS(readernum, mitm=mitm) elif card_type == "handler_test": from virtualsmartcard.cards.HandlerTest import HandlerTestOS self.os = HandlerTestOS() else: logging.warning( "Unknown cardtype %s. Will use standard card_type \ (ISO 7816)", card_type) card_type = "iso7816" self.os = Iso7816OS(MF, SAM) self.type = card_type # Connect to the VPCD self.host = host self.port = port if host: # use normal connection mode try: self.sock = self.connectToPort(host, port) self.sock.settimeout(None) self.server_sock = None except socket.error as e: logging.error("Failed to open socket: %s", str(e)) logging.error( "Is pcscd running at %s? Is vpcd loaded? Is a \ firewall blocking port %u?", host, port) sys.exit() else: # use reversed connection mode try: local_ip = [ (s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)] ][0][1] custom_url = 'vicc://%s:%d' % (local_ip, port) print('VICC hostname: %s' % local_ip) print('VICC port: %d' % port) print( 'On your NFC phone with the Android Smart Card Emulator app scan this code:' ) try: import qrcode qr = qrcode.QRCode() qr.add_data(custom_url) qr.print_ascii() except ImportError: print( 'https://api.qrserver.com/v1/create-qr-code/?data=%s' % custom_url) (self.sock, self.server_sock, host) = self.openPort(port) self.sock.settimeout(None) except socket.error as e: logging.error("Failed to open socket: %s", str(e)) logging.error( "Is pcscd running? Is vpcd loaded and in \ reversed connection mode? Is a firewall \ blocking port %u?", port) sys.exit() logging.info("Connected to virtual PCD at %s:%u", host, port) atexit.register(self.stop)
def __init__(self, filename, datasetfile, card_type, host, port, readernum=None, ef_cardsecurity=None, ef_cardaccess=None, ca_key=None, cvca=None, disable_checks=False, esign_key=None, esign_ca_cert=None, esign_cert=None, logginglevel=logging.INFO): from os.path import exists logging.basicConfig(level = logginglevel, format = "%(asctime)s [%(levelname)s] %(message)s", datefmt = "%d.%m.%Y %H:%M:%S") self.filename = None self.cardGenerator = CardGenerator(card_type) #If a filename is specified, try to load the card from disk if filename != None: self.filename = filename if exists(filename): self.cardGenerator.loadCard(self.filename) else: logging.info("Creating new card which will be saved in %s.", self.filename) #If a dataset file is specified, read the card's data groups from disk if datasetfile != None: if exists(datasetfile): logging.info("Reading Data Groups from file %s.", datasetfile) self.cardGenerator.readDatagroups(datasetfile) MF, SAM = self.cardGenerator.getCard() #Generate an OS object of the correct card_type if card_type == "iso7816" or card_type == "ePass": self.os = Iso7816OS(MF, SAM) elif card_type == "nPA": from virtualsmartcard.cards.nPA import NPAOS self.os = NPAOS(MF, SAM, ef_cardsecurity=ef_cardsecurity, ef_cardaccess=ef_cardaccess, ca_key=ca_key, cvca=cvca, disable_checks=disable_checks, esign_key=esign_key, esign_ca_cert=esign_ca_cert, esign_cert=esign_cert) elif card_type == "cryptoflex": from virtualsmartcard.cards.cryptoflex import CryptoflexOS self.os = CryptoflexOS(MF, SAM) elif card_type == "relay": from virtualsmartcard.cards.Relay import RelayOS self.os = RelayOS(readernum) elif card_type == "handler_test": from virtualsmartcard.cards.HandlerTest import HandlerTestOS self.os = HandlerTestOS() else: logging.warning("Unknown cardtype %s. Will use standard card_type (ISO 7816)", card_type) card_type = "iso7816" self.os = Iso7816OS(MF, SAM) self.type = card_type #Connect to the VPCD self.host = host self.port = port if host: # use normal connection mode try: self.sock = self.connectToPort(host, port) self.sock.settimeout(None) self.server_sock = None except socket.error as e: logging.error("Failed to open socket: %s", str(e)) logging.error("Is pcscd running at %s? Is vpcd loaded? Is a firewall blocking port %u?", host, port) sys.exit() else: # use reversed connection mode try: (self.sock, self.server_sock, host) = self.openPort(port) self.sock.settimeout(None) except socket.error as e: logging.error("Failed to open socket: %s", str(e)) logging.error("Is pcscd running? Is vpcd loaded and in reversed connection mode? Is a firewall blocking port %u?", port) sys.exit() logging.info("Connected to virtual PCD at %s:%u", host, port) signal.signal(signal.SIGINT, self.signalHandler) atexit.register(self.stop)