blob: 0c9efd85d899d26a4587f911c661729ecd8bf16f [file] [log] [blame]
Christina Quast69d1f902015-04-03 11:41:23 +02001import usb.core
2import usb.util
3
Christina Quast88c7fa12015-04-06 00:35:03 +02004from ccid_raw import SmartcardConnection
Christina Quast158c1dd2015-04-17 20:19:29 +02005from smartcard_emulator import SmartCardEmulator
Christina Quast95270b12015-04-04 19:59:03 +02006
Christina Quast88c7fa12015-04-06 00:35:03 +02007from contextlib import closing
8
Christina Quastf2e53f02015-04-11 08:42:38 +02009from util import HEX
Christina Quast9547e9f2015-04-14 22:18:30 +020010from constants import *
Christina Quast53840612015-04-16 11:10:59 +020011from apdu_split import Apdu_splitter, apdu_states
Christina Quast88c7fa12015-04-06 00:35:03 +020012
Christina Quast69d1f902015-04-03 11:41:23 +020013def find_dev():
14 dev = usb.core.find(idVendor=0x03eb, idProduct=0x6004)
15 if dev is None:
16 raise ValueError("Device not found")
17 else:
18 print("Found device")
19 return dev
20
Christina Quast88c7fa12015-04-06 00:35:03 +020021def pattern_match(inpt):
22 print("Matching inpt", inpt)
Christina Quast94ddb912015-04-11 12:29:41 +020023 if (inpt == ATR_SYSMOCOM1) or (inpt == ATR_STRANGE_SIM):
24 print("ATR: ", inpt)
Christina Quast88c7fa12015-04-06 00:35:03 +020025 return NEW_ATR
26 elif (inpt == CMD_SEL_FILE):
Christina Quast94ddb912015-04-11 12:29:41 +020027 print("CMD_SEL_FILE:", inpt)
28 return CMD_SEL_ROOT
29 elif (inpt == CMD_GET_DATA):
30 print("CMD_DATA:", inpt)
Christina Quast88c7fa12015-04-06 00:35:03 +020031 return CMD_SEL_ROOT
32 else:
33 return inpt
Christina Quast69d1f902015-04-03 11:41:23 +020034
Christina Quast88c7fa12015-04-06 00:35:03 +020035def poll_ep(dev, ep):
36 try:
Christina Quast3a47a4f2015-04-11 18:16:14 +020037 return dev.read(ep, 64, 10)
Christina Quast88c7fa12015-04-06 00:35:03 +020038 except usb.core.USBError as e:
39 if e.errno != ERR_TIMEOUT:
40 raise
41 return None
Christina Quast69d1f902015-04-03 11:41:23 +020042
Christina Quast88c7fa12015-04-06 00:35:03 +020043def write_phone(dev, resp):
Christina Quastf2e53f02015-04-11 08:42:38 +020044 print("WR: ", HEX(resp))
Christina Quast3a47a4f2015-04-11 18:16:14 +020045 dev.write(PHONE_WR, resp, 10)
Christina Quast88c7fa12015-04-06 00:35:03 +020046
Christina Quast158c1dd2015-04-17 20:19:29 +020047def do_mitm(sim_emul=True):
Christina Quast69d1f902015-04-03 11:41:23 +020048 dev = find_dev()
Christina Quast158c1dd2015-04-17 20:19:29 +020049 if sim_emul == True:
50 my_class = SmartCardEmulator
51 else:
52 my_class = SmartcardConnection
53 with closing(my_class()) as sm_con:
Christina Quast6f664a32015-04-06 19:08:04 +020054 atr = sm_con.getATR()
Christina Quast53840612015-04-16 11:10:59 +020055
56 apdus = []
57 apdu = Apdu_splitter()
58
Christina Quast88c7fa12015-04-06 00:35:03 +020059 while True:
60 cmd = poll_ep(dev, PHONE_INT)
61 if cmd is not None:
Christina Quastf2e53f02015-04-11 08:42:38 +020062 print("Int line ", HEX(cmd))
Christina Quast88c7fa12015-04-06 00:35:03 +020063 assert cmd[0] == ord('R')
Christina Quast6f664a32015-04-06 19:08:04 +020064# FIXME: restart card anyways?
65# sm_con.reset_card()
Christina Quastf2e53f02015-04-11 08:42:38 +020066 print("Write atr: ", HEX(atr))
Christina Quast6f664a32015-04-06 19:08:04 +020067 write_phone(dev, atr)
Christina Quast69d1f902015-04-03 11:41:23 +020068
Christina Quast88c7fa12015-04-06 00:35:03 +020069 cmd = poll_ep(dev, PHONE_RD)
70 if cmd is not None:
Christina Quastf2e53f02015-04-11 08:42:38 +020071 print("RD: ", HEX(cmd))
Christina Quast53840612015-04-16 11:10:59 +020072 for c in cmd:
73 apdu.split(c)
74 if apdu.state == apdu_states.APDU_S_SW1:
75 if len(apdu.data) == 0:
76 # FIXME: implement other ACK types
77 write_phone(dev, apdu.ins)
78 apdu.split(apdu.ins)
79 else:
80 sim_data = sm_con.send_receive_cmd(apdu.buf)
81 write_phone(dev, sim_data)
82 for c in sim_data:
83 apdu.split(c)
84 elif apdu.state == apdu_states.APDU_S_FIN:
85 apdus.append(apdu)
86 apdu = Apdu_splitter()