def chooseOneFromAIDList(aidList): text = '' itemCnt = 1 for (adfName, AppLabel) in aidList: text += '\xDF\xA2\x02\01' text += chr(itemCnt) itemCnt += 1 text += '\xDF\xA2\x03' text += chr(len(AppLabel)) text += AppLabel.decode('ascii') log.log("chooseOneFromAIDList text options") conn.send([0xD2, 0x03, 0x00, 0x00], text) status, buf, uns = conn.receive() check_status_error(status) tlv = TLVParser(buf) itemNumber = tlv.getTag((0xDF, 0xA2, 0x02)) itemNumber = itemNumber[0] # get value of tag to bytearray itemNumber = int( itemNumber[0]) # get first element from bytearray and convert to int log.log("Chosen value is: ", itemNumber) if itemNumber > len(aidList): log.logerr("Returned choice value = ", itemNumber, " is out of bounds") return None itemIdx = itemNumber - 1 log.log("This value maps to: ", aidList[itemIdx][0]) return aidList[itemIdx][0]
def process_language(lang, is_list, is_user): req_unsolicited = conn.connect() if req_unsolicited: status, buf, uns = conn.receive() check_status_error(status) p1 = 0x00 if is_user else 0x01 if lang or is_list else 0x02 p2 = 0x00 if is_list else 0x01 conn.send([0xD2, 0xD0, p1, p2], [[(0xDF, 0xA2, 0x22), bytes(lang, encoding='utf-8')]] if lang else None) status, buf, uns = conn.receive() check_status_error(status) tlv = TLVParser(buf) languages = tlv.getTag((0xDF, 0xA2, 0x20)) if lang: return if len(languages) == 0: log.logerr("No language returned") exit(1) log.log( "Available languages:" if is_list else "User selected language:" if is_user else "Current language:", ", ".join(l.decode('utf-8') for l in languages))
def OnlinePIN(): ''' First create connection ''' req_unsolicited = conn.connect() ''' If unsolicited read it''' #status, buf, uns = conn.receive() #check_status_error( status ) ''' Send data ''' pan = b'\x54\x13\x33\x00\x89\x00\x00\x39' c_tag = tagStorage() #BUG: Unable to push the direct string not bytearray c_tag.store( (0xDF, 0xEC, 0x05), 0x00 ) c_tag.store( (0xDF, 0xED, 0x05), 0x08 ) c_tag.store( (0xDF, 0x17), '\x00\x00\x00\x00\x01\x51' ) c_tag.store( (0xDF, 0x24), '\x08\x26' ) c_tag.store( (0xDF, 0x1C,), 0x02 ) c_tag.store( (0x5A), pan ) conn.send([0xDE, 0xD6, 0x03, 0x00] , c_tag.getTemplate(0xE0)) sleep(3) conn.send([0xD0, 0x00, 0x00, 0x32]) status, buf, uns = conn.receive() check_status_error( status ) # Wait for last package status, buf, uns = conn.receive() slog = getSyslog() if status == 0x9F41: slog.loginfo('Status is "Cancelled amount" as expected:', hex(status)) else: slog.logerr('Status is not "Cancelled amount"', hex(status), buf) sys.exit(-1)
def get_certificates(is_return_file, level): req_unsolicited = conn.connect() if req_unsolicited: status, buf, uns = conn.receive() check_status_error(status) p1 = 0x01 if is_return_file else 0x00 get_all_levels = level is None current_level = 0x00 if get_all_levels else level while True: conn.send([0xC5, 0x06, p1, 0x00], (0xE0, [ [(0xDF, 0x83, 0x10), current_level.to_bytes(4, byteorder='big')], ])) status, buf, uns = conn.receive() if status == 0x9F13: log.log("No more certificates in the chain") break check_status_error(status) tlv = TLVParser(buf) certs = tlv.getTag((0xDF, 0x83, 0x12) if is_return_file else (0xDF, 0x83, 0x11)) if len(certs) != 1: log.logerr("One return tag expected in response, got:", len(certs)) exit(1) cert = certs[0].decode('utf-8') label = "file name: " if is_return_file else "content:\n" log.log("Certificate level %d %s%s" % (current_level, label, cert)) if not get_all_levels: break current_level = current_level + 1
def reconnect(): '''if not connected reconnect''' req_unsolicited = conn.connect() ''' If unsolicited read it''' if req_unsolicited: status, buf, uns = conn.receive() check_status_error(status)
def test_ns(): ''' First create connection ''' req_unsolicited = conn.connect() ''' If unsolicited read it''' if req_unsolicited: status, buf, uns = conn.receive() check_status_error( status ) res = key_exchange() # res = 1 if res <= 0: return res res = init_ns() if res <= 0: return res log.log("Initialization completed successfully") os.system('reset') while True: print(" 1 = Inject PIN" ) print(" 2 = Verify ARS Password 1" ) print(" 3 = Verify ARS Password 2" ) print(" 4 = Store new ARS Password 1" ) print(" 5 = Store new ARS Password 2" ) print(" 0 = Exit" ) selection = input("Select: ") if selection == '1': log.log("Perform PIN transaction") res = process_tx() elif selection == '2': log.log("Verify ARS Password 1") res = get_session_key(1) if res > 0: res = transmit_password(0, 1) elif selection == '3': log.log("Verify ARS Password 2") res = get_session_key(1) if res > 0: res = transmit_password(0, 2) elif selection == '4': log.log("Store New ARS Password 1") res = get_session_key(1) if res > 0: res = transmit_password(1, 1) elif selection == '5': log.log("Store New ARS Password 2") res = get_session_key(1) if res > 0: res = transmit_password(1, 2) #insert other selections here elif selection == '0': break else: log.log("Unknown Option Selected!") # While ends return 0
def demo_function(): ''' First create connection ''' req_unsolicited = conn.connect() ''' If unsolicited read it''' if req_unsolicited: status, buf, uns = conn.receive() check_status_error(status) ''' Wait for anything from client''' status, buf, uns = conn.receive() check_status_error(status)
def update_key_command(conn, host_id, pvk_enc): log.log("Updating the PVK using Master session key, host_id is", host_id) #pvk_enc=b'\x65\xF3\x8A\xFD\x1B\x85\xDB\xB6\xCB\xFC\xD9\xCD\xD1\x46\xAC' c_tag = tagStorage() c_tag.store((0xDF, 0xEC, 0x46), 0x01) c_tag.store((0xDF, 0xEC, 0x2E), pvk_enc) conn.send([0xC4, 0x0A, host_id, 0x01], c_tag.getTemplate(0xE0)) status, buf, uns = conn.receive() log.log("Received key update status") check_status_error(status)
def GetSecurityConfiguration(): req_unsolicited = conn.connect() if req_unsolicited: status, buf, uns = conn.receive() check_status_error(status) log.log("Get Security Configuration: host_id 6") #conn.send([0xC4, 0x11, 0x00, 0x06]) conn.send([0xC4, 0x11, 0x01, 0x00]) status, buf, uns = conn.receive() log.log("Received Get Security Configuration status") check_status_error( status )
def demo_function(): ''' First create connection ''' req_unsolicited = conn.connect() ''' If unsolicited read it''' if req_unsolicited: status, buf, uns = conn.receive() check_status_error( status ) ''' Reset display ''' conn.send([0xD2, 0x01, 0x01, 0x00]) status, buf, uns = conn.receive() check_status_error( status ) ''' Send data ''' argParse = utility.get_argparser() args = argParse.parse_args() print ("Display:", args.html) resource = bytearray() resource.extend(map(ord, args.html)) conn.send([0xD2, 0xE0, 0x00, 0x01], (0xE0, [ [(0xDF, 0xAA, 0x01), resource], [(0xDF, 0xAA, 0x02), b'title_text'], [(0xDF, 0xAA, 0x03), b'Enter number'], [(0xDF, 0xAA, 0x02), b'TEMPLATE_INPUT_TYPE'], [(0xDF, 0xAA, 0x03), b'number'], [(0xDF, 0xAA, 0x02), b'input_precision'], [(0xDF, 0xAA, 0x03), b'0'], [(0xDF, 0xAA, 0x02), b'entry_mode_visibility'], [(0xDF, 0xAA, 0x03), b'hidden'], [(0xDF, 0xAA, 0x02), b'timeout'], [(0xDF, 0xAA, 0x03), b'10'], ])) ''' Check for display status ''' status, buf, uns = conn.receive() check_status_error( status ) ''' Check for HTML display result ''' status, buf, uns = conn.receive() check_status_error( status )
def GenerateRSAKey(): if not os.path.exists(CERT_DIR): os.makedirs(CERT_DIR) if query_yes_no("Gen new certs?", default="no"): CreateCACertificate(conn, log) CreatePOSCertificate(log) log.loginfo( "Mutual auth cert handshake, DD 23 can take a while ( ~10sec) ") ''' 0x08 1024 in ~ 10 sec ''' ''' 0x08 2048 in ~ 1 min ''' ''' 0x10 4096 in~ 10 min ''' conn.send([0xDD, 0x23, 0x00, 0x00], (0xE0, [[(0xDF, 0x83, 0x1C), b'\x08\x00']])) status, buf, uns = conn.receive() util.check_status_error(status) tlv = TLVParser(buf) if (tlv.tagCount((0xDF, 0x83, 0x1B)) == 1): certSignReq = tlv.getTag((0xDF, 0x83, 0x1B))[0] strCSR = toascii(certSignReq) csrFile = os.path.join(CERT_DIR, "ped.csr") terminalCert = os.path.join(CERT_DIR, "ped.pem") log.log("Saving CSR") file = open(csrFile, 'w') file.write(strCSR) file.close() log.log("Signing terminal CSR + save in: ", terminalCert) os.system("openssl x509 -req -days 360 -in " + csrFile + " -CA " + CACert + " -CAkey " + CAKey + " -CAcreateserial -out " + terminalCert) ''' Retrieve public key from ped''' log.log("Extracting terminal public key from terminal certificate") os.system("openssl x509 -pubkey -noout -in " + terminalCert + " > " + TermPub) log.log("Terminal public key is extracted: " + TermPub + " sending signed terminal certificate to terminal") PutFile(conn, log, terminalCert, "ped.pem") else: log.logerror("Terminal response fialure") exit(1) log.loginfo("Key generation and upload success!")
def demo_update_font(): ''' First create connection ''' req_unsolicited = conn.connect() ''' If unsolicited read it''' if req_unsolicited: status, buf, uns = conn.receive() check_status_error( status ) # ''' Reset display ''' ''' Send data ''' tags = [ [(0x84), b'fonts.pp1000' ] ] e0_temp = ( 0xE0, tags ) conn.send([0xD2, 0x0A, 0x81, 0x00],e0_temp) status, buf, uns = conn.receive() check_status_error( status ) conn.setnad(prev_nad)
def demo_function(): ''' First create connection ''' req_unsolicited = conn.connect() ''' If unsolicited read it''' if req_unsolicited: status, buf, uns = conn.receive() check_status_error(status) for buf, msg, sleeptime in commands: log.log(msg) conn.send(buf) is_unsolicited = True while is_unsolicited: # unsolicited responses come when echo mode is on status, buf, is_unsolicited = conn.receive() check_status_error(status) sleep(sleeptime)
def demo_function(): ''' First create connection ''' req_unsolicited = conn.connect() ''' If unsolicited read it''' if req_unsolicited: status, buf, uns = conn.receive() check_status_error(status) ''' Store the tags for numeric entry ''' c_tag = tagStorage() #index or text, one mandatory # index #c_tag.store( (0xDF, 0xA2, 0x06), [0x00, 0x0D] ) # enter card pan #c_tag.store( (0xDF, 0xA2, 0x06), [0x00, 0x57] ) # press enter # text c_tag.store((0xDF, 0xA2, 0x13), [0x41, 0x42, 0x43, 0x44]) #c_tag.store( (0xDF, 0xA2, 0x13), [0x41, 0x42, 0x43, 0x44, 0x46, 0x47, 0x48, 0x49] ) #c_tag.store( (0xDF, 0xA2, 0x13), [0x41, 0x42, 0x43, 0x44, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x41] ) # max len c_tag.store((0xDF, 0x83, 0x05), [0x0A]) ''' Send the message ''' NAD_PINPAD = 2 conn.setnad(NAD_PINPAD) conn.send([0xD2, 0xF1, 0x00, 0x00], c_tag.getTemplate(0xE0)) #''' abort ''' #time.sleep(7) #conn.send([0xD0, 0xFF, 0x00, 0x00]) #time.sleep(5) #status, buf, uns = conn.receive(3) #check_status_error( status ) #return ''' Receive and check ''' status, buf, uns = conn.receive(30) check_status_error(status) '''print the buffer example ''' '''print(buf) ''' tlv = TLVParser(buf) user_input = tlv.getTag((0xDF, 0x83, 0x01)) log.log('User enter [', str(user_input[0], 'iso8859-1'), ']')
def demo_test_pp1000(): ''' First create connection ''' req_unsolicited = conn.connect() ''' If unsolicited read it''' if req_unsolicited: status, buf, uns = conn.receive() check_status_error(status) # ''' Reset display ''' prev_nad = conn.setnad(NAD_PINPAD) # conn.send([0xD2, 0x01, 0x01, 0x00]) # status, buf, uns = conn.receive() # check_status_error( status ) ''' Send data ''' conn.send([0xD2, 0x01, 0x00, 0x01], 'FIRST LINE\x0ASECOND LINE') # sys.settrace(traceit) status, buf, uns = conn.receive() check_status_error(status) conn.setnad(prev_nad)
def getdata(tag): req_unsolicited = conn.connect() if req_unsolicited: status, buf, uns = conn.receive() check_status_error(status) conn.send([0x00, 0xCA, 0x00, 0x00], unhexlify(tag)) status, buf, uns = conn.receive() check_status_error(status) tlv = TLVParser(buf) values = tlv.getTag(tuple(unhexlify(tag))) if len(values) == 0: log.logerr("No tag found:", tag) exit(1) log.log("Value for tag", tag, ":") log.log(" * hex:", hexlify(values[0]).decode('utf-8')) log.log(" * ascii:", values[0].decode('utf-8')) log.log(" * int:", int.from_bytes(values[0], byteorder='big', signed=True))
def entry(): req_unsolicited = conn.connect() if req_unsolicited: status, buf, uns = conn.receive() check_status_error(status) conn.send([0xD2, 0x01, 0x01, 0x00]) # Reset display status, buf, uns = conn.receive() check_status_error(status) p1 = ENTRY_PAN | ENTRY_CVV2 conn.send([0xD2, 0x14, p1, 0x01], [ [(0xDF, 0xAA, 0x02), b'TEMPLATE_INPUT_TYPE'], [(0xDF, 0xAA, 0x03), b'number'], [(0xDF, 0xAA, 0x02), b'input_precision'], [(0xDF, 0xAA, 0x03), b'0'], [(0xDF, 0xAA, 0x02), b'entry_mode_visibility'], [(0xDF, 0xAA, 0x03), b'hidden'], [(0xDF, 0xAA, 0x02), b'timeout'], [(0xDF, 0xAA, 0x03), b'10'], [(0xDF, 0xAA, 0x01), b'mapp/alphanumeric_entry.html'], [(0xDF, 0xAA, 0x02), b'title_text'], [(0xDF, 0xAA, 0x03), b'Enter PAN'], [(0xDF, 0xAA, 0x01), b'mapp/alphanumeric_entry.html'], [(0xDF, 0xAA, 0x02), b'title_text'], [(0xDF, 0xAA, 0x03), b'Enter CVV2'], ]) status, buf, uns = conn.receive() check_status_error(status)
def LoadHMACKeys(): req_unsolicited = conn.connect() if req_unsolicited: status, buf, uns = conn.receive() check_status_error(status) log.log("Loading the HMAC keys: host_id 6 and 7 - ver 2") hmackey06 = b'\xFE\xDC\xBA\x98\x76\x54\x32\x10\x01\x23\x45\x67\x89\xAB\xCD\xEF' hmackey06 += b'\xFE\xDC\xBA\x98\x76\x54\x32\x10\x01\x23\x45\x67\x89\xAB\xCD\xEF' hmackey06 += b'\xFE\xDC\xBA\x98\x76\x54\x32\x10\x01\x23\x45\x67\x89\xAB\xCD\xEF' hmackey06 += b'\xFE\xDC\xBA\x98\x76\x54\x32\x10\x01\x23\x45\x67\x89\xAB\xCD\xEF' log.log("HMAC key 06:", hexlify(hmackey06).decode('utf-8')) hmackey07 = b'\x01\x23\x45\x67\x89\xAB\xCD\xEF\xFE\xDC\xBA\x98\x76\x54\x32\x10' hmackey07 += b'\x01\x23\x45\x67\x89\xAB\xCD\xEF\xFE\xDC\xBA\x98\x76\x54\x32\x10' hmackey07 += b'\x01\x23\x45\x67\x89\xAB\xCD\xEF\xFE\xDC\xBA\x98\x76\x54\x32\x10' hmackey07 += b'\x01\x23\x45\x67\x89\xAB\xCD\xEF\xFE\xDC\xBA\x98\x76\x54\x32\x10' log.log("HMAC key 07:", hexlify(hmackey07).decode('utf-8')) c_tag = tagStorage() c_tag.store((0xDF, 0xEC, 0x46), 0x03) c_tag.store((0xDF, 0xEC, 0x2E), hmackey06) conn.send([0xC4, 0x0A, 0x06, 0x01], c_tag.getTemplate(0xE0)) status, buf, uns = conn.receive() log.log("Received key 06 update status") check_status_error(status) c_tag = tagStorage() c_tag.store((0xDF, 0xEC, 0x46), 0x03) c_tag.store((0xDF, 0xEC, 0x2E), hmackey07) conn.send([0xC4, 0x0A, 0x07, 0x01], c_tag.getTemplate(0xE0)) status, buf, uns = conn.receive() log.log("Received key 07 update status") check_status_error(status)
def dump_logs(): ''' First create connection ''' req_unsolicited = conn.connect() ''' If unsolicited read it''' if req_unsolicited: status, buf, uns = conn.receive() check_status_error( status ) ''' Reset display ''' conn.send([0xD2, 0x01, 0x01, 0x00]) status, buf, uns = conn.receive(3) check_status_error( status ) ''' Dump logs ''' conn.send( [0xD0, 0x05, 0x00, P2_VIPA_LOG]) ''' Receive and check ''' status, buf, uns = conn.receive(30) check_status_error( status ) tlv = TLVParser(buf) template = tlv.getTag((0x6F)) filename = TLVParser(template).getTag((0x84))[0].decode('utf-8') localfile = filename.split('/')[-1]; log.log('Log file on terminal: %s, downloading as %s' % (filename, localfile)) ''' Retrieve log file ''' progress = partial(utility.display_console_progress_bar, utility.get_terminal_width()) fileops.getfile(conn, log, filename, localfile, progress)
def request_choice_on_pinpad_demo(): ''' First create connection ''' req_unsolicited = conn.connect() ''' If unsolicited read it''' if req_unsolicited: status, buf, uns = conn.receive() check_status_error(status) ''' Reset display ''' conn.setnad(2) conn.send([0xD2, 0x01, 0x01, 0x00]) status, buf, uns = conn.receive() check_status_error(status) ''' Send data ''' c_tag = tagStorage() c_tag.store((0xDF, 0xA2, 0x12), LIST_STYLE_SCROLL) #BUG: Unable to push the direct string not bytearray c_tag.store((0xDF, 0xA2, 0x11), 'Optional title') for i in range(1, 6): c_tag.store((0xDF, 0xA2, 0x02), i) c_tag.store((0xDF, 0xA2, 0x03), 'Item %d' % i) conn.send([0xD2, 0x03, 0x00, 0x01], c_tag.get()) is_unsolicited = True while is_unsolicited: # unsolicited responses come when echo mode is on status, buf, is_unsolicited = conn.receive() check_status_error(status) sleep(3)
def demo_function(): ''' First create connection ''' req_unsolicited = conn.connect() ''' If unsolicited read it''' if req_unsolicited: status, buf, uns = conn.receive() check_status_error( status ) ''' Reset display ''' conn.send([0xD2, 0x01, 0x01, 0x00]) status, buf, uns = conn.receive(3) check_status_error( status ) ''' Store the tags for numeric entry ''' c_tag = tagStorage() c_tag.store( (0xDF, 0xA2, 0x06), [0x00, 0x0D, 0x00, 0x57, 0x00, 0x00] ) c_tag.store( (0xDF, 0xA2, 0x07), [0x30, 0x00] ) c_tag.store( (0xDF, 0xA2, 0x08), b'123' ) ''' Send the message ''' conn.send( [0xD2, 0x04, 0x00, 0x01], c_tag.getTemplate( 0xE0 ) ) ''' Receive and check ''' status, buf, uns = conn.receive(30) check_status_error( status ) '''print the buffer example ''' '''print(buf) ''' tlv = TLVParser(buf) user_input = tlv.getTag((0xDF, 0xA2, 0x08)) log.log('User enter [', str(user_input[0], 'iso8859-1'), ']')
def password_entry(): req_unsolicited = conn.connect() if req_unsolicited: status, buf, uns = conn.receive() check_status_error(status) conn.send([0xD2, 0x01, 0x01, 0x00]) # Reset display status, buf, uns = conn.receive(3) check_status_error(status) conn.send( [0xD2, 0xF3, 0x00, 0x04], ( 0xE0, [ [(0xDF, 0xB0, 0x05), (ENTRY_UPPER | ENTRY_LOWER).to_bytes( 4, byteorder='big')], # entry modes [(0xDF, 0xB0, 0x06), (ENTRY_UPPER).to_bytes(4, byteorder='big') ], # initial entry mode ])) status, buf, uns = conn.receive() check_status_error(status) tlv = TLVParser(buf) password = tlv.getTag((0xDF, 0x83, 0x01))[0].decode('utf-8') log.log('Password entered:', password)
def GenerateHMAC(): req_unsolicited = conn.connect() if req_unsolicited: status, buf, uns = conn.receive() check_status_error(status) pan = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' c_tag = tagStorage() c_tag.store((0xDF, 0xEC, 0x0E), pan) # message for MAC c_tag.store((0xDF, 0xEC, 0x23), 0x07) # host ID conn.send([0xC4, 0x22, 0x00, 0x00], c_tag.getTemplate(0xE0)) log.log("Generate HMAC sent") status, buf, uns = conn.receive() log.log("Generate HMAC response received") check_status_error(status) tlv = TLVParser(buf) tag_output_data = (0xDF, 0xEC, 0x7B) if (tlv.tagCount(tag_output_data) == 1): hmac = tlv.getTag(tag_output_data)[0] log.log("Generated HMAC:", hexlify(hmac).decode('utf-8'))
def demo_test_font_pp1000(): ''' First create connection ''' req_unsolicited = conn.connect() ''' If unsolicited read it''' if req_unsolicited: status, buf, uns = conn.receive() check_status_error(status) # ''' Reset display ''' prev_nad = conn.setnad(NAD_PINPAD) # conn.send([0xD2, 0x01, 0x01, 0x00]) # status, buf, uns = conn.receive() # check_status_error( status ) ''' Send data ''' tags = [[(0xDF, 0xA2, 0x10), b'M2.FON'], [(0xDF, 0x81, 0x04), b'Tralalalala']] start_templ = (0xE0, tags) conn.send([0xD2, 0x02, 0x00, 0x01], start_templ) # sys.settrace(traceit) status, buf, uns = conn.receive() check_status_error(status) conn.setnad(prev_nad)
def demo_test_multiple_choice_pp1000(): ''' First create connection ''' req_unsolicited = conn.connect() ''' If unsolicited read it''' if req_unsolicited: status, buf, uns = conn.receive() check_status_error(status) # ''' Reset display ''' prev_nad = conn.setnad(NAD_PINPAD) # conn.send([0xD2, 0x01, 0x01, 0x00]) # status, buf, uns = conn.receive() # check_status_error( status ) ''' Send data ''' conn.send([ 0xD2, 0x03, 0x00, 0x01 ], '0123456\x0A11234567\x0A212345678\x0A3123456789\x0A4123456789A\x0A5123456789AB\x0A5123456789ABC\x0A5123456789ABCD\x0A5123456789ABCDE\x0A5123456789ABCDEF' ) # sys.settrace(traceit) status, buf, uns = conn.receive() check_status_error(status) conn.setnad(prev_nad)
def demo_function(): ''' First create connection ''' req_unsolicited = conn.connect() ''' If unsolicited read it''' if req_unsolicited: status, buf, uns = conn.receive() check_status_error(status) ''' Reset display ''' conn.send([0xD2, 0x01, 0x01, 0x00]) status, buf, uns = conn.receive() check_status_error(status) ''' Send data ''' conn.send([0xD2, 0x01, 0x00, 0x01], 'Test tralala') status, buf, uns = conn.receive() check_status_error(status)
def demo_function(): ''' First create connection ''' req_unsolicited = conn.connect() ''' If unsolicited read it''' if req_unsolicited: status, buf, uns = conn.receive() check_status_error(status) ''' Reset display ''' conn.send([0xD2, 0x01, 0x01, 0x00]) status, buf, uns = conn.receive() check_status_error(status) ''' Send data ''' conn.send_rawhex( '010036DD210100B2E0B0DF831308D202964900000000DF831A203030203030203030203030203030203030203030203030203030203030203036' ) ''' Check for status ''' status, buf, uns = conn.receive() check_status_error(status)
def put_data_sample(): ''' First create connection ''' req_unsolicited = conn.connect() ''' If unsolicited read it''' if req_unsolicited: status, buf, uns = conn.receive() check_status_error(status) ''' Reset display ''' conn.send([0xD2, 0x01, 0x01, 0x00]) status, buf, uns = conn.receive() check_status_error(status) ''' Send data ''' c_tag = tagStorage() #BUG: Unable to push the direct string not bytearray c_tag.store((0xE0), [0xDF, 0xA2, 0x0F]) conn.send([0x00, 0xDA, 0xFF, 0xFF], c_tag.get()) status, buf, uns = conn.receive() check_status_error(status)
def GenerateHMAC(): req_unsolicited = conn.connect() if req_unsolicited: status, buf, uns = conn.receive() check_status_error(status) #pan = b'\x41\x11\x11\x11\x11\x11\x11\x11' pan = '4111111111111111' # expected HMAC for TC test secrets: d1f8827dd9276f9f80f8890d3e607ac03ca022ba91b8024356dcdf54ad434f83 # pan = b'\x34\x30\x30\x35\x35\x36\x32\x32\x33\x31\x32\x31\x32\x31\x34\x39' c_tag = tagStorage() c_tag.store((0xDF, 0xEC, 0x0E), pan) # message for MAC c_tag.store((0xDF, 0xEC, 0x23), 0x06) # host ID #c_tag.store((0xDF, 0xEC, 0x23), 0x07) # host ID conn.send([0xC4, 0x22, 0x00, 0x00], c_tag.getTemplate(0xE0)) log.log("Generate HMAC sent") status, buf, uns = conn.receive() log.log("Generate HMAC response received") check_status_error(status) tlv = TLVParser(buf) tag_output_data = (0xDF, 0xEC, 0x7B) if (tlv.tagCount(tag_output_data) == 1): hmac = tlv.getTag(tag_output_data)[0] log.log("Generated HMAC:", hexlify(hmac).decode('utf-8')) c_tag = tagStorage() c_tag.store((0xDF, 0xEC, 0x0E), hmac) # message for MAC #c_tag.store((0xDF, 0xEC, 0x23), 0x06) # host ID c_tag.store((0xDF, 0xEC, 0x23), 0x07) # host ID conn.send([0xC4, 0x22, 0x00, 0x00], c_tag.getTemplate(0xE0)) log.log("Generate HMAC sent") status, buf, uns = conn.receive() log.log("Generate HMAC response received") check_status_error(status) tlv = TLVParser(buf) tag_output_data = (0xDF, 0xEC, 0x7B) if (tlv.tagCount(tag_output_data) == 1): hmac = tlv.getTag(tag_output_data)[0] log.log("Generated HMAC:", hexlify(hmac).decode('utf-8'))
def OnlinePIN(): ''' First create connection ''' req_unsolicited = conn.connect() ''' If unsolicited read it''' if req_unsolicited: status, buf, uns = conn.receive() check_status_error(status) #host_id = 5; # Alter from default of 2 to VSS Script index 2 (host_id=3) host_id = 2 # Alter from default of 2 to VSS Script index 2 (host_id=3) ''' Send data ''' pan = b'\x54\x13\x33\x00\x89\x00\x00\x39' amount = b'\x00\x00\x00\x01\x23\x00' c_tag = tagStorage() #BUG: Unable to push the direct string not bytearray c_tag.store((0xDF, 0xEC, 0x05), 0x00) # pin try flag c_tag.store((0xDF, 0xED, 0x05), 0x08) # max pin length c_tag.store((0xDF, 0xED, 0x04), 0x04) # min pin length c_tag.store((0xDF, 0xDF, 0x17), amount) # c_tag.store( (0xDF, 0xDF, 0x24), b'PLN') c_tag.store((0xDF, 0xDF, 0x24), (0x08, 0x26)) c_tag.store((0xDF, 0xDF, 0x1C), 2) c_tag.store((0x5A), pan) conn.send([0xDE, 0xD6, host_id, 0x01], c_tag.getTemplate(0xE0)) log.log("Get online PIN sent") log.log('*** PIN ENTRY WAIT ***') # possible_cancel(conn,log,host_id) status, buf, uns = conn.receive() log.log("Get online PIN received") check_status_error(status) tlv = TLVParser(buf) if (tlv.tagCount((0xDF, 0xED, 0x6C)) == 1 and tlv.tagCount( (0xDF, 0xED, 0x03)) == 1): #encryptedPIN = tlv.getTag((0xDF, 0xED, 0x6C), TLVParser.CONVERT_HEX_STR)[0].upper() encryptedPIN = tlv.getTag((0xDF, 0xED, 0x6C))[0] ksn = tlv.getTag((0xDF, 0xED, 0x03), TLVParser.CONVERT_HEX_STR)[0].upper() log.log("Encrypted PIN: ", hexlify(encryptedPIN)) log.log("KSN: ", ksn) # We have KSN, let's find key keyTable = { 'FFFF9876543210E00001': '042666B49184CF5C68DE9628D0397B36', 'FFFF9876543210E00002': 'C46551CEF9FD244FAA9AD834130D3B38', 'FFFF9876543210E00003': '0DF3D9422ACA561A47676D07AD6BAD05', 'FFFF9876543210E00004': '279C0F6AEED0BE9A2B2C733E1383AE6E', 'FFFF9876543210E00005': '5F8DC6D2C845C1DA508DDC048093B8C0', 'FFFF9876543210E00006': '5E415CB0BAF9F0C3D0C14B63FB62FFBC', 'FFFF9876543210E00007': '0C8F780B7C8B492FAE84A9EB2A6CE69F', 'FFFF9876543210E00008': '27F66D5244FF621EAA6F6120EDEB427F', 'FFFF9876543210E00009': '27E31064FDC565968900E2057F658E81', 'FFFF9876543210E0000A': '6CF2500A22507C83C776CEADC1E330EB', 'FFFF9876543210E0000B': '3E8260BA04B2D6DFC01482B3819A1848', 'FFFF9876543210E0000C': 'B716E1E11CF53D7F726CAEE75C3A62B0', 'FFFF9876543210E0000D': 'E072EDF9534053A0B6C581C58FBF25CC', 'FFFF9876543210E0000E': 'A80046087F5B8FDB5AAD95E1842908B0', 'FFFF9876543210E0000F': '93DD5B956C4878B82E453AAEFD32A555', 'FFFF9876543210E00010': '59598DCBD9BD943F94165CE453585FA8', 'FFFF9876543210E00011': '2B5F01F4F0CC0515639D523231BF1B5D', 'FFFF9876543210E00012': '9CF640F279C2AE1915F725EEEAC2CB50', 'FFFF9876543210E00013': 'C3DF489FDF11534BF03DE97C27DC4CD0', 'FFFF9876543210E00014': '658488507721B30E4737FA93F923CB2D', 'FFFF9876543210E00015': 'E161D1956A61F62DF37AFD7F9CC36965', } if not ksn in keyTable: raise exceptions.logicalException( "Cannot find key in static table - please inject Security keys again!!!" ) key = keyTable[ksn] log.log("Key: ", key) #encryptedPIN = unhexlify(encryptedPIN) open("pin.dat", "wb").write(encryptedPIN) if os.path.isfile("pindec.dat"): os.remove("pindec.dat") vscmd = "openssl" #args = ' ' + "des-ede -nosalt -nopad -d -in pin.dat -out pindec.dat -k " + key args = ' ' + "des-ede -p -nosalt -nopad -d -in pin.dat -out pindec.dat -K " + key + " -iv 0000000000000000" log.log("calling openssl ", vscmd, ", params: ", args) if os.system(vscmd + args): raise exceptions.logicalException("Openssl call failed.") dec = open("pindec.dat", "rb").read() log.log("Decrypted PIN block: ", hexlify(dec)) pinLen = dec[0] & 0x0F log.log("PIN length detected: ", pinLen) if (pinLen < 4 or pinLen > 12): raise exceptions.logicalException("Invalid PIN Block length!") if (pinLen % 2): pinLen += 1 pinLen = (int)(pinLen / 2) #pan = bytearray(pan[-6:]) # Take last 12 PAN digits pan = bytearray(unhexlify((hexlify(bytearray(pan))[-13:])[:12])) pan.reverse() encodedPIN = bytearray(dec) encodedPIN.reverse() appendCnt = len(encodedPIN) - len(pan) #print('encoded pin: ', hexlify(encodedPIN)) #print('pan: ', hexlify(pan)) clearPIN = bytearray() for idx in range(len(pan)): #print('encpin val ', encodedPIN[idx], '; pan val ', pan[idx]) val = encodedPIN[idx] val ^= pan[idx] clearPIN.append(val) encodedPIN.reverse() while (appendCnt > 0): appendCnt -= 1 clearPIN.append(encodedPIN[appendCnt]) clearPIN.reverse() log.log("PIN block: ", hexlify(clearPIN)) clearPIN = clearPIN[1:pinLen + 1] PIN = str(hexlify(clearPIN)).replace("f", "") log.loginfo('PIN entered: ', PIN) os.remove("pin.dat") os.remove("pindec.dat") else: log.logerr("Invalid data!")