blob: 25529ba4ccf5f7a023a7f4366d9bb14b64f52dea [file] [log] [blame]
Christina Quastf2582fc2015-03-06 19:09:35 +01001#!/usr/bin/env python
2
3import argparse
4import sniffer
5import ccid
Christina Quast31b5b4e2015-03-09 17:15:13 +01006import ccid_select
Christina Quast80050a52015-04-04 20:00:15 +02007import mitm
Christina Quastf2582fc2015-03-06 19:09:35 +01008
9import usb.core
10import usb.util
Christina Quast158c1dd2015-04-17 20:19:29 +020011import sys
Christina Quast362a4da2015-04-09 13:39:38 +020012import time
Christina Quastf2582fc2015-03-06 19:09:35 +010013
14cmd1 = {0x00, 0x10, 0x00, 0x00}
15cmd2 = {0x00, 0x20, 0x00, 0x00, 0x02}
16cmd_poweron = {0x62, 0x62, 0x00, 0x00}
17cmd_poweroff = {0x63, 0x63, 0x00, 0x00}
18cmd_get_slot_stat = {0x65, 0x65, 0x00, 0x00}
19cmd_get_param = {0x00, 0x6C, 0x00, 0x00}
20
21class find_class(object):
22 def __init__(self, class_):
23 self._class = class_
24 def __call__(self, device):
25 # first, let's check the device
26 if device.bDeviceClass == self._class:
27 return True
28 # ok, transverse all devices to find an
29 # interface that matches our class
30 for cfg in device:
31 # find_descriptor: what's it?
32 intf = usb.util.find_descriptor(
33 cfg,
34 bInterfaceClass=self._class
35 )
36 if intf is not None:
37 return True
38
39 return False
40
Christina Quast4bcc0232015-03-24 21:59:32 +010041def find_dev():
Christina Quast37350392015-05-08 16:47:26 +020042 dev = usb.core.find(idVendor=0x16c0, idProduct=0x0762)
Christina Quast4bcc0232015-03-24 21:59:32 +010043 if dev is None:
44 raise ValueError("Device not found")
45 else:
46 print("Found device")
47 return dev
Christina Quastf2582fc2015-03-06 19:09:35 +010048
49# main code
50def main():
51 parser = argparse.ArgumentParser()
Christina Quast452aee32015-04-03 13:22:18 +020052 parser.add_argument("-C", "--conf", type=int, choices=[1, 2, 3, 4], help="Set USB config")
Christina Quastf2582fc2015-03-06 19:09:35 +010053 parser.add_argument("-b", "--read_bin", help="read ICCID, IMSI, etc.", action='store_true')
54 parser.add_argument("-c", "--cmd", help="cmds to send to sim card (Not supported yet)",
55 choices=["cmd1", "cmd2", "cmd_poweron", "cmd_poweroff", "cmd_get_slot_stat", "cmd_get_param"])
56 parser.add_argument("-s", "--sniff", help="Sniff communication!", action='store_true')
Christina Quast31b5b4e2015-03-09 17:15:13 +010057 parser.add_argument("-S", "--select_file", help="Transmit SELECT cmd!", action='store_true')
Christina Quast381d0fc2015-03-15 15:13:38 +010058 parser.add_argument("-p", "--phone", help="Emulates simcard", action='store_true')
Christina Quast80050a52015-04-04 20:00:15 +020059 parser.add_argument("-m", "--mitm", help="Intercept communication (MITM)", action='store_true')
Christina Quastf2582fc2015-03-06 19:09:35 +010060
61 args = parser.parse_args()
62 print("args: ", args)
63
Christina Quast381d0fc2015-03-15 15:13:38 +010064
Christina Quastf2582fc2015-03-06 19:09:35 +010065# FIXME: why is it a ccid function?
66 if args.conf is not None:
Christina Quast4bcc0232015-03-24 21:59:32 +010067#FIXME: Change means to find devices
68 dev = find_dev()
69 dev.set_configuration(args.conf)
Christina Quast362a4da2015-04-09 13:39:38 +020070 # Give pcsclite time to find the device
71 time.sleep(1)
Christina Quastf2582fc2015-03-06 19:09:35 +010072
73 if args.read_bin is True:
74 ccid.pySim_read()
75
76 if args.cmd is not None:
Christina Quast4bcc0232015-03-24 21:59:32 +010077#FIXME: Change means to find devices
Christina Quastf2582fc2015-03-06 19:09:35 +010078 devs = usb.core.find(find_all=1, custom_match=find_class(0xb)) # 0xb = Smartcard
79 for dev in devs:
80 dev.write(0x1, args.cmd)
81 ret = dev.read(0x82, 64)
Christina Quast31b5b4e2015-03-09 17:15:13 +010082# ret = dev.read(0x83, 64, 100)
Christina Quastf2582fc2015-03-06 19:09:35 +010083 print(ret)
84 if args.sniff is True:
Christina Quast5cf676d2015-05-14 17:21:34 +020085 sniffer.sniff(dev)
Christina Quast31b5b4e2015-03-09 17:15:13 +010086 if args.select_file is True:
87 ccid_select.select()
Christina Quast381d0fc2015-03-15 15:13:38 +010088 if args.phone is True:
Christina Quast158c1dd2015-04-17 20:19:29 +020089 mitm.do_mitm(sim_emul=True)
Christina Quast80050a52015-04-04 20:00:15 +020090 if args.mitm is True:
Christina Quast158c1dd2015-04-17 20:19:29 +020091 mitm.do_mitm(sim_emul=False)
Christina Quast31b5b4e2015-03-09 17:15:13 +010092
Christina Quastf2582fc2015-03-06 19:09:35 +010093 return
94
95# (epi, epo) = find_eps(dev)
96 while True:
97 #ep_out.write("Hello")
98 try:
99 ans = dev.read(0x82, 64, 1000)
100 print("".join("%02x " % b for b in ans))
101 except KeyboardInterrupt:
102 print("Bye")
103 sys.exit()
104 except:
105 print("Timeout")
106 # print(ep_in.read(1, 5000));
107
108main()