Christina Quast | 69d1f90 | 2015-04-03 11:41:23 +0200 | [diff] [blame] | 1 | import usb.core |
| 2 | import usb.util |
| 3 | |
Christina Quast | 88c7fa1 | 2015-04-06 00:35:03 +0200 | [diff] [blame] | 4 | from ccid_raw import SmartcardConnection |
Christina Quast | 95270b1 | 2015-04-04 19:59:03 +0200 | [diff] [blame] | 5 | import phone |
| 6 | |
Christina Quast | 88c7fa1 | 2015-04-06 00:35:03 +0200 | [diff] [blame] | 7 | from contextlib import closing |
| 8 | |
| 9 | |
Christina Quast | 69d1f90 | 2015-04-03 11:41:23 +0200 | [diff] [blame] | 10 | def find_dev(): |
| 11 | dev = usb.core.find(idVendor=0x03eb, idProduct=0x6004) |
| 12 | if dev is None: |
| 13 | raise ValueError("Device not found") |
| 14 | else: |
| 15 | print("Found device") |
| 16 | return dev |
| 17 | |
Christina Quast | 88c7fa1 | 2015-04-06 00:35:03 +0200 | [diff] [blame] | 18 | def pattern_match(inpt): |
| 19 | print("Matching inpt", inpt) |
| 20 | if (inpt == ATR_SYSMOCOM1): |
| 21 | return NEW_ATR |
| 22 | elif (inpt == CMD_SEL_FILE): |
| 23 | return CMD_SEL_ROOT |
| 24 | else: |
| 25 | return inpt |
Christina Quast | 69d1f90 | 2015-04-03 11:41:23 +0200 | [diff] [blame] | 26 | |
| 27 | SIM_WR = 0x1 |
| 28 | SIM_RD = 0x82 |
| 29 | SIM_INT = 0x83 |
| 30 | |
| 31 | PHONE_WR = 0x4 |
| 32 | PHONE_RD = 0x85 |
| 33 | PHONE_INT = 0x86 |
| 34 | |
Christina Quast | 88c7fa1 | 2015-04-06 00:35:03 +0200 | [diff] [blame] | 35 | ERR_TIMEOUT = 110 |
Christina Quast | 69d1f90 | 2015-04-03 11:41:23 +0200 | [diff] [blame] | 36 | |
Christina Quast | 88c7fa1 | 2015-04-06 00:35:03 +0200 | [diff] [blame] | 37 | def poll_ep(dev, ep): |
| 38 | try: |
| 39 | return dev.read(ep, 64, 1000) |
| 40 | except usb.core.USBError as e: |
| 41 | if e.errno != ERR_TIMEOUT: |
| 42 | raise |
| 43 | return None |
Christina Quast | 69d1f90 | 2015-04-03 11:41:23 +0200 | [diff] [blame] | 44 | |
Christina Quast | 88c7fa1 | 2015-04-06 00:35:03 +0200 | [diff] [blame] | 45 | def write_phone(dev, resp): |
| 46 | dev.write(PHONE_WR, resp, 1000) |
| 47 | |
Christina Quast | 95270b1 | 2015-04-04 19:59:03 +0200 | [diff] [blame] | 48 | def do_mitm(): |
Christina Quast | 69d1f90 | 2015-04-03 11:41:23 +0200 | [diff] [blame] | 49 | dev = find_dev() |
Christina Quast | 88c7fa1 | 2015-04-06 00:35:03 +0200 | [diff] [blame] | 50 | with closing(SmartcardConnection()) as sm_con: |
Christina Quast | 6f664a3 | 2015-04-06 19:08:04 +0200 | [diff] [blame] | 51 | atr = sm_con.getATR() |
Christina Quast | 88c7fa1 | 2015-04-06 00:35:03 +0200 | [diff] [blame] | 52 | while True: |
| 53 | cmd = poll_ep(dev, PHONE_INT) |
| 54 | if cmd is not None: |
| 55 | print(cmd) |
| 56 | assert cmd[0] == ord('R') |
Christina Quast | 6f664a3 | 2015-04-06 19:08:04 +0200 | [diff] [blame] | 57 | # FIXME: restart card anyways? |
| 58 | # sm_con.reset_card() |
| 59 | write_phone(dev, atr) |
Christina Quast | 69d1f90 | 2015-04-03 11:41:23 +0200 | [diff] [blame] | 60 | |
Christina Quast | 88c7fa1 | 2015-04-06 00:35:03 +0200 | [diff] [blame] | 61 | cmd = poll_ep(dev, PHONE_RD) |
| 62 | if cmd is not None: |
| 63 | print(cmd) |
| 64 | sim_data = sm_con.send_receive_cmd(cmd) |
Christina Quast | 88c7fa1 | 2015-04-06 00:35:03 +0200 | [diff] [blame] | 65 | write_phone(dev, sim_data) |