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 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)
def main(): """ main """ card_connection = readers()[0].createConnection() card_connection.connect(mode=SCARD_SHARE_DIRECT, disposition=SCARD_LEAVE_CARD) feature_list = getFeatureRequest(card_connection) ccid_esc_command = hasFeature(feature_list, FEATURE_CCID_ESC_COMMAND) if ccid_esc_command is None: raise Exception("The reader does not support FEATURE_CCID_ESC_COMMAND") # 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 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)
# You have to enable the use of Escape commands with the # DRIVER_OPTION_CCID_EXCHANGE_AUTHORIZED bit in the ifdDriverOptions # option of the CCID driver Info.plist file from smartcard.System import readers from smartcard.pcsc.PCSCPart10 import (getFeatureRequest, hasFeature, getTlvProperties, FEATURE_CCID_ESC_COMMAND, SCARD_SHARE_DIRECT) # use the first reader card_connection = readers()[0].createConnection() card_connection.connect(mode=SCARD_SHARE_DIRECT) # get CCID Escape control code feature_list = getFeatureRequest(card_connection) ccid_esc_command = hasFeature(feature_list, FEATURE_CCID_ESC_COMMAND) if ccid_esc_command is None: raise Exception("The reader does not support FEATURE_CCID_ESC_COMMAND") # get the TLV PROPERTIES tlv = getTlvProperties(card_connection) # check we are using a Xiring Leo v1 or v2 reader if tlv['PCSCv2_PART10_PROPERTY_wIdVendor'] == 0x0F14 \ and (tlv['PCSCv2_PART10_PROPERTY_wIdProduct'] in [0x0037, 0x0038]): # proprietary escape command for Xiring Leo readers version = [ord(c) for c in "VERSION"] res = card_connection.control(ccid_esc_command, version) print(res) print("VERSION:", ''.join([chr(x) for x in res]))
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 as ex: print("Failed:", ex) return print(res) print("LogicalLCDLineNumber (Logical number of LCD lines):", res[0]) print("LogicalLCDRowNumber (Logical number of characters per LCD line):", res[1]) print("LcdInfo:", res[2]) print(" b0 indicates if scrolling available:", test_bit(res[2], 0)) print("EntryValidationCondition:", res[3]) print("PC/SCv2 features:") print(" VerifyPinStart:", test_bit(res[4], 0)) print(" VerifyPinFinish:", test_bit(res[4], 1)) print(" ModifyPinStart:", test_bit(res[4], 2)) print(" ModifyPinFinish:", test_bit(res[4], 3)) print(" GetKeyPressed:", test_bit(res[4], 4)) print(" VerifyPinDirect:", test_bit(res[4], 5)) print(" ModifyPinDirect:", test_bit(res[4], 6)) print(" Abort:", test_bit(res[4], 7)) print(" GetKey:", test_bit(res[5], 0)) print(" WriteDisplay:", test_bit(res[5], 1)) print(" SetSpeMessage:", test_bit(res[5], 2)) # bits 3-7 are RFU # bytes 6 and 7 are RFU print(" bTimeOut2:", test_bit(res[8], 0)) bListSupportedLanguages = test_bit(res[8], 1) print(" bListSupportedLanguages:", bListSupportedLanguages) if bListSupportedLanguages: try: # Reader is able to indicate the list of supported languages # through CCID-ESC 0x6B languages = card_connection.control(ccid_esc_command, [0x6B]) except SmartcardException as ex: print("Failed:", ex) print(" ", languages) languages = iter(languages) for low, high in izip(languages, languages): lang_x = high * 256 + low try: lang_t = USBLangID[lang_x] except KeyError: lang_t = "unkonwn" print(" 0x%04X: %s" % (lang_x, lang_t)) print(" bNumberMessageFix:", test_bit(res[8], 2)) print(" bPPDUSupportOverXferBlock:", test_bit(res[8], 3)) print(" bPPDUSupportOverEscape:", test_bit(res[8], 4)) # bits 5-7 are RFU # bytes 9, 10 and 11 and RFU print("VersionNumber:", res[12]) print("MinimumPINSize:", res[13]) print("MaximumPINSize:", res[14]) Firewall = test_bit(res[15], 0) print("Firewall:", Firewall) # bits 1-7 are RFU if Firewall: print("FirewalledCommand_SW1: 0x%02X" % res[16]) print("FirewalledCommand_SW2: 0x%02X" % res[17])
from smartcard.pcsc.PCSCPart10 import ( getFeatureRequest, hasFeature, getTlvProperties, FEATURE_CCID_ESC_COMMAND, SCARD_SHARE_DIRECT, ) # use the first reader card_connection = readers()[0].createConnection() card_connection.connect(mode=SCARD_SHARE_DIRECT) # get CCID Escape control code feature_list = getFeatureRequest(card_connection) ccid_esc_command = hasFeature(feature_list, FEATURE_CCID_ESC_COMMAND) if ccid_esc_command is None: raise Exception("The reader does not support FEATURE_CCID_ESC_COMMAND") # get the TLV PROPERTIES tlv = getTlvProperties(card_connection) # check we are using a Xiring Leo v1 or v2 reader if tlv["PCSCv2_PART10_PROPERTY_wIdVendor"] == 0x0F14 and (tlv["PCSCv2_PART10_PROPERTY_wIdProduct"] in [0x0037, 0x0038]): # proprietary escape command for Xiring Leo readers version = [ord(c) for c in "VERSION"] res = card_connection.control(ccid_esc_command, version) print res print "VERSION:", "".join([chr(x) for x in res])
def main(): """ main """ card_connection = readers()[0].createConnection() card_connection.connect(mode=SCARD_SHARE_DIRECT, disposition=SCARD_LEAVE_CARD) feature_list = getFeatureRequest(card_connection) ccid_esc_command = hasFeature(feature_list, FEATURE_CCID_ESC_COMMAND) if ccid_esc_command is None: raise Exception("The reader does not support FEATURE_CCID_ESC_COMMAND") status = [0x40, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] res = card_connection.control(ccid_esc_command, status) print np.array(res) print "STATUS OK" if len(sys.argv) > 1: f = open(sys.argv[1], 'r') #skip first 16 bytes f.read(16) for i in range(0,12): print i addr = i*16 res = card_connection.control(ccid_esc_command, status) print np.array(res) wr_cmd = [ 0x40, 0xc2, addr, 0x00, 0x00, 0x03, 0x10, 0x00 ] data_s = f.read(16) data = map(ord, data_s) wr_cmd.extend(data) print "to_write", np.array(wr_cmd) res = card_connection.control(ccid_esc_command, wr_cmd) print np.array(res) # write serial if len(sys.argv) == 3: serial = sys.argv[2] addr = 0x5d slen = len(serial) wr_cmd = [ 0x40, 0xc2, addr, 0x00, 0x00, 0x03, 2*(slen+1), 0x00 ] data = [ (slen+1)*2, 3 ] for ch in serial: data.append(ord(ch)) data.append(0) wr_cmd.extend(data) print "to_write", np.array(wr_cmd) res = card_connection.control(ccid_esc_command, wr_cmd) print np.array(res) else: for i in range(0,29): addr = i*8 get_data = [0x40, 0xc3, addr, 0x00, 0x00, 0x00, 0x08, 0x00] res = card_connection.control(ccid_esc_command, get_data) print np.array(get_data) print np.array(res)