예제 #1
0
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)
예제 #6
0
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
예제 #7
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)
예제 #8
0
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)
예제 #16
0
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)
예제 #20
0
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'), ']') 
예제 #22
0
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)
예제 #27
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)
    ''' 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)
예제 #28
0
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)
예제 #29
0
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'))
예제 #30
0
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!")