Christina Quast | 74876d2 | 2015-03-13 23:45:30 +0100 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
| 2 | |
| 3 | import usb.core |
| 4 | import usb.util |
| 5 | import sys |
| 6 | |
| 7 | # SuperSIM ATR |
| 8 | atr= [0x3B, 0x9A, 0x94, 0x00, 0x92, 0x02, 0x75, 0x93, 0x11, 0x00, 0x01, 0x02, 0x02, 0x19] |
Christina Quast | 69734e9 | 2015-03-15 16:09:55 +0100 | [diff] [blame^] | 9 | RESP_OK = [0x60, 0x00] |
Christina Quast | 74876d2 | 2015-03-13 23:45:30 +0100 | [diff] [blame] | 10 | |
| 11 | def 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 | |
| 19 | def 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 Quast | 69734e9 | 2015-03-15 16:09:55 +0100 | [diff] [blame^] | 49 | def 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 Quast | 74876d2 | 2015-03-13 23:45:30 +0100 | [diff] [blame] | 56 | |
Christina Quast | 69734e9 | 2015-03-15 16:09:55 +0100 | [diff] [blame^] | 57 | if c == ord('R'): |
| 58 | try: |
Christina Quast | 74876d2 | 2015-03-13 23:45:30 +0100 | [diff] [blame] | 59 | written = dev.write(0x1, atr, 1000) # Probably we received a Reset, so we send ATR |
| 60 | print("Written data: " + written) |
Christina Quast | 69734e9 | 2015-03-15 16:09:55 +0100 | [diff] [blame^] | 61 | except: |
| 62 | print("Timeout sending ATR!") |
| 63 | return |
Christina Quast | 74876d2 | 2015-03-13 23:45:30 +0100 | [diff] [blame] | 64 | |
Christina Quast | 69734e9 | 2015-03-15 16:09:55 +0100 | [diff] [blame^] | 65 | 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 | |
| 88 | def emulate_sim(): |
| 89 | dev = find_dev() |
| 90 | |
| 91 | while True: |
| 92 | try: |
| 93 | handle_phone_request() |
| 94 | |
Christina Quast | 74876d2 | 2015-03-13 23:45:30 +0100 | [diff] [blame] | 95 | except KeyboardInterrupt: |
| 96 | print("Bye") |
| 97 | sys.exit() |
| 98 | except: |
| 99 | print("Timeout") |