blob: aae6a4159625403d56782a202be7a0e47a2681ba [file] [log] [blame]
Christina Quast74876d22015-03-13 23:45:30 +01001#!/usr/bin/env python3
2
3import usb.core
4import usb.util
5import sys
6
7# SuperSIM ATR
8atr= [0x3B, 0x9A, 0x94, 0x00, 0x92, 0x02, 0x75, 0x93, 0x11, 0x00, 0x01, 0x02, 0x02, 0x19]
Christina Quast69734e92015-03-15 16:09:55 +01009RESP_OK = [0x60, 0x00]
Christina Quast74876d22015-03-13 23:45:30 +010010
11def find_dev():
12 dev = usb.core.find(idVendor=0x03eb, idProduct=0x6004)
13 if dev is None:
14 raise ValueError("Device not found")
15 else:
16 print("Found device")
17 return dev
18
19def find_eps(dev):
20 dev.set_configuration(3)
21
22 cfg = dev.get_active_configuration()
23 print("Active config: ")
24 print(cfg)
25 intf = cfg[(0,0)]
26
27 ep_in = usb.util.find_descriptor(
28 intf,
29 custom_match = \
30 lambda e: \
31 usb.util.endpoint_direction(e.bEndpointAddress) == \
32 usb.util.ENDPOINT_IN)
33
34 assert ep_in is not None
35
36 ep_out = usb.util.find_descriptor(
37 intf,
38 custom_match = \
39 lambda e: \
40 usb.util.endpoint_direction(e.bEndpointAddress) == \
41 usb.util.ENDPOINT_OUT)
42
43 assert ep_out is not None
44 print("****")
45 print(ep_in)
46 print(ep_out)
47 return (ep_in, ep_out)
48
Christina Quast69734e92015-03-15 16:09:55 +010049def handle_phone_request():
50 # ATR handling
51 try:
52 arr = dev.read(0x83, 64, 100) # Notification endpoint
53 print("arr: ", arr)
54 c=arr.pop()
55 print(c)
Christina Quast74876d22015-03-13 23:45:30 +010056
Christina Quast69734e92015-03-15 16:09:55 +010057 if c == ord('R'):
58 try:
Christina Quast74876d22015-03-13 23:45:30 +010059 written = dev.write(0x1, atr, 1000) # Probably we received a Reset, so we send ATR
60 print("Written data: " + written)
Christina Quast69734e92015-03-15 16:09:55 +010061 except:
62 print("Timeout sending ATR!")
63 return
Christina Quast74876d22015-03-13 23:45:30 +010064
Christina Quast69734e92015-03-15 16:09:55 +010065 except:
66 #print("Timeout receiving atr!")
67 pass
68
69 # Read phone request
70 try:
71 cmd = dev.read(0x82, 64, 10000000)
72 print("Received request!: ")
73 print("".join("%02x " % b for b in ans))
74
75 print("Write response");
76 try:
77 written = dev.write(0x01, RESP_OK, 10000000);
78 print("Bytes written:")
79 print(written)
80 except:
81 print("Timeout in send response")
82
83 except:
84 #print("Timeout in receive cmd")
85 pass
86
87
88def emulate_sim():
89 dev = find_dev()
90
91 while True:
92 try:
93 handle_phone_request()
94
Christina Quast74876d22015-03-13 23:45:30 +010095 except KeyboardInterrupt:
96 print("Bye")
97 sys.exit()
98 except:
99 print("Timeout")