blob: 98a2e811675ce6b4eba0375c497632e4d0f0eda9 [file] [log] [blame]
Pau Espin Pedrolac23ad52017-12-29 20:30:35 +01001#!/usr/bin/env python2
Alexander Chemeris6e589142013-07-04 17:34:06 +04002
3#
4# Utility to display some informations about a SIM card
5#
6#
7# Copyright (C) 2009 Sylvain Munaut <tnt@246tNt.com>
8# Copyright (C) 2010 Harald Welte <laforge@gnumonks.org>
9# Copyright (C) 2013 Alexander Chemeris <alexander.chemeris@gmail.com>
10#
11# This program is free software: you can redistribute it and/or modify
12# it under the terms of the GNU General Public License as published by
13# the Free Software Foundation, either version 2 of the License, or
14# (at your option) any later version.
15#
16# This program is distributed in the hope that it will be useful,
17# but WITHOUT ANY WARRANTY; without even the implied warranty of
18# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19# GNU General Public License for more details.
20#
21# You should have received a copy of the GNU General Public License
22# along with this program. If not, see <http://www.gnu.org/licenses/>.
23#
24
25import hashlib
26from optparse import OptionParser
27import os
28import random
29import re
30import sys
Philipp Maiera2650492018-07-11 23:05:58 +020031from pySim.ts_51_011 import EF, DF
Alexander Chemeris6e589142013-07-04 17:34:06 +040032
Alexander Chemeris6e589142013-07-04 17:34:06 +040033from pySim.commands import SimCardCommands
Supreeth Herle4c306ab2020-03-18 11:38:00 +010034from pySim.cards import card_detect, Card
Supreeth Herle4b1c7632019-12-22 09:00:59 +010035from pySim.utils import h2b, swap_nibbles, rpad, dec_imsi, dec_iccid, dec_msisdn, format_xplmn_w_act, dec_spn
Alexander Chemeris6e589142013-07-04 17:34:06 +040036
37
38def parse_options():
39
40 parser = OptionParser(usage="usage: %prog [options]")
41
42 parser.add_option("-d", "--device", dest="device", metavar="DEV",
43 help="Serial Device for SIM access [default: %default]",
44 default="/dev/ttyUSB0",
45 )
46 parser.add_option("-b", "--baud", dest="baudrate", type="int", metavar="BAUD",
47 help="Baudrate used for SIM access [default: %default]",
48 default=9600,
49 )
50 parser.add_option("-p", "--pcsc-device", dest="pcsc_dev", type='int', metavar="PCSC",
51 help="Which PC/SC reader number for SIM access",
52 default=None,
53 )
Vadim Yanitskiy9f9f5a62018-10-27 02:10:34 +070054 parser.add_option("--osmocon", dest="osmocon_sock", metavar="PATH",
55 help="Socket path for Calypso (e.g. Motorola C1XX) based reader (via OsmocomBB)",
56 default=None,
57 )
Alexander Chemeris6e589142013-07-04 17:34:06 +040058
59 (options, args) = parser.parse_args()
60
61 if args:
62 parser.error("Extraneous arguments")
63
64 return options
65
66
67if __name__ == '__main__':
68
69 # Parse options
70 opts = parse_options()
71
Vadim Yanitskiy588f3ac2018-10-27 06:30:33 +070072 # Init card reader driver
73 if opts.pcsc_dev is not None:
Vadim Yanitskiy35a96ed2018-10-29 02:02:14 +070074 print("Using PC/SC reader (dev=%d) interface"
75 % opts.pcsc_dev)
Alexander Chemeris6e589142013-07-04 17:34:06 +040076 from pySim.transport.pcsc import PcscSimLink
77 sl = PcscSimLink(opts.pcsc_dev)
Vadim Yanitskiy9f9f5a62018-10-27 02:10:34 +070078 elif opts.osmocon_sock is not None:
Vadim Yanitskiy35a96ed2018-10-29 02:02:14 +070079 print("Using Calypso-based (OsmocomBB, sock=%s) reader interface"
80 % opts.osmocon_sock)
Vadim Yanitskiy9f9f5a62018-10-27 02:10:34 +070081 from pySim.transport.calypso import CalypsoSimLink
82 sl = CalypsoSimLink(sock_path=opts.osmocon_sock)
Vadim Yanitskiy588f3ac2018-10-27 06:30:33 +070083 else: # Serial reader is default
Vadim Yanitskiy35a96ed2018-10-29 02:02:14 +070084 print("Using serial reader (port=%s, baudrate=%d) interface"
85 % (opts.device, opts.baudrate))
Vadim Yanitskiy588f3ac2018-10-27 06:30:33 +070086 from pySim.transport.serial import SerialSimLink
87 sl = SerialSimLink(device=opts.device, baudrate=opts.baudrate)
Alexander Chemeris6e589142013-07-04 17:34:06 +040088
89 # Create command layer
90 scc = SimCardCommands(transport=sl)
91
92 # Wait for SIM card
93 sl.wait_for_card()
94
95 # Program the card
96 print("Reading ...")
97
Supreeth Herle4c306ab2020-03-18 11:38:00 +010098 # Initialize Card object by auto detecting the card
99 card = card_detect("auto", scc) or Card(scc)
100
Alexander Chemeris6e589142013-07-04 17:34:06 +0400101 # EF.ICCID
Supreeth Herle3566b8e2020-03-18 12:02:34 +0100102 (res, sw) = card.read_iccid()
Alexander Chemeris6e589142013-07-04 17:34:06 +0400103 if sw == '9000':
Supreeth Herle3566b8e2020-03-18 12:02:34 +0100104 print("ICCID: %s" % (res,))
Alexander Chemeris6e589142013-07-04 17:34:06 +0400105 else:
106 print("ICCID: Can't read, response code = %s" % (sw,))
107
108 # EF.IMSI
Supreeth Herlef9762dc2020-03-18 12:05:06 +0100109 (res, sw) = card.read_imsi()
Alexander Chemeris6e589142013-07-04 17:34:06 +0400110 if sw == '9000':
Supreeth Herlef9762dc2020-03-18 12:05:06 +0100111 print("IMSI: %s" % (res,))
Alexander Chemeris6e589142013-07-04 17:34:06 +0400112 else:
113 print("IMSI: Can't read, response code = %s" % (sw,))
114
Supreeth Herleab46d622020-03-05 15:30:22 +0100115 # EF.GID1
116 try:
Supreeth Herle98a69272020-03-18 12:14:48 +0100117 (res, sw) = card.read_gid1()
Supreeth Herleab46d622020-03-05 15:30:22 +0100118 if sw == '9000':
119 print("GID1: %s" % (res,))
120 else:
121 print("GID1: Can't read, response code = %s" % (sw,))
122 except Exception as e:
123 print("GID1: Can't read file -- %s" % (str(e),))
124
Supreeth Herle0e90e6c2020-03-05 15:33:00 +0100125 # EF.GID2
126 try:
Supreeth Herlee573ccb2020-04-01 09:21:20 +0200127 (res, sw) = card.read_binary('GID2')
Supreeth Herle0e90e6c2020-03-05 15:33:00 +0100128 if sw == '9000':
129 print("GID2: %s" % (res,))
130 else:
131 print("GID2: Can't read, response code = %s" % (sw,))
132 except Exception as e:
133 print("GID2: Can't read file -- %s" % (str(e),))
134
Alexander Chemeris6e589142013-07-04 17:34:06 +0400135 # EF.SMSP
Supreeth Herleebe6dba2020-03-19 12:08:20 +0100136 (res, sw) = card.read_record('SMSP', 1)
Alexander Chemeris6e589142013-07-04 17:34:06 +0400137 if sw == '9000':
138 print("SMSP: %s" % (res,))
139 else:
140 print("SMSP: Can't read, response code = %s" % (sw,))
141
Supreeth Herlef8299452019-06-08 07:49:08 +0200142 # EF.SPN
143 try:
Supreeth Herle846cefb2020-03-19 12:11:25 +0100144 (res, sw) = card.read_spn()
Supreeth Herlef8299452019-06-08 07:49:08 +0200145 if sw == '9000':
Supreeth Herle846cefb2020-03-19 12:11:25 +0100146 print("SPN: %s" % (res[0] or "Not available"))
147 print("Display HPLMN: %s" % (res[1],))
148 print("Display OPLMN: %s" % (res[2],))
Supreeth Herlef8299452019-06-08 07:49:08 +0200149 else:
150 print("SPN: Can't read, response code = %s" % (sw,))
151 except Exception as e:
152 print("SPN: Can't read file -- %s" % (str(e),))
153
Philipp Maiera2650492018-07-11 23:05:58 +0200154 # EF.PLMNsel
155 try:
Supreeth Herle9efd8ef2020-03-19 12:14:10 +0100156 (res, sw) = card.read_binary('PLMNsel')
Denis 'GNUtoo' Carikli84d2cb32019-09-12 01:46:25 +0200157 if sw == '9000':
158 print("PLMNsel: %s" % (res))
159 else:
160 print("PLMNsel: Can't read, response code = %s" % (sw,))
Philipp Maiera2650492018-07-11 23:05:58 +0200161 except Exception as e:
Vadim Yanitskiya3bb3342020-01-25 12:45:37 +0700162 print("PLMNsel: Can't read file -- " + str(e))
Philipp Maiera2650492018-07-11 23:05:58 +0200163
164 # EF.PLMNwAcT
Denis 'GNUtoo' Carikli84d2cb32019-09-12 01:46:25 +0200165 try:
Supreeth Herle14084402020-03-19 12:42:10 +0100166 (res, sw) = card.read_plmn_act()
Denis 'GNUtoo' Carikli84d2cb32019-09-12 01:46:25 +0200167 if sw == '9000':
Supreeth Herle14084402020-03-19 12:42:10 +0100168 print("PLMNwAcT:\n%s" % (res))
Denis 'GNUtoo' Carikli84d2cb32019-09-12 01:46:25 +0200169 else:
170 print("PLMNwAcT: Can't read, response code = %s" % (sw,))
Philipp Maiera2650492018-07-11 23:05:58 +0200171 except Exception as e:
Vadim Yanitskiy6727f0c2020-01-22 23:38:24 +0700172 print("PLMNwAcT: Can't read file -- " + str(e))
Philipp Maiera2650492018-07-11 23:05:58 +0200173
174 # EF.OPLMNwAcT
Denis 'GNUtoo' Carikli84d2cb32019-09-12 01:46:25 +0200175 try:
Supreeth Herle1757b262020-03-19 12:43:11 +0100176 (res, sw) = card.read_oplmn_act()
Denis 'GNUtoo' Carikli84d2cb32019-09-12 01:46:25 +0200177 if sw == '9000':
Supreeth Herle1757b262020-03-19 12:43:11 +0100178 print("OPLMNwAcT:\n%s" % (res))
Denis 'GNUtoo' Carikli84d2cb32019-09-12 01:46:25 +0200179 else:
180 print("OPLMNwAcT: Can't read, response code = %s" % (sw,))
Philipp Maiera2650492018-07-11 23:05:58 +0200181 except Exception as e:
Vadim Yanitskiy6727f0c2020-01-22 23:38:24 +0700182 print("OPLMNwAcT: Can't read file -- " + str(e))
Philipp Maiera2650492018-07-11 23:05:58 +0200183
184 # EF.HPLMNAcT
Denis 'GNUtoo' Carikli84d2cb32019-09-12 01:46:25 +0200185 try:
Supreeth Herlea850a472020-03-19 12:44:11 +0100186 (res, sw) = card.read_hplmn_act()
Denis 'GNUtoo' Carikli84d2cb32019-09-12 01:46:25 +0200187 if sw == '9000':
Supreeth Herlea850a472020-03-19 12:44:11 +0100188 print("HPLMNAcT:\n%s" % (res))
Denis 'GNUtoo' Carikli84d2cb32019-09-12 01:46:25 +0200189 else:
190 print("HPLMNAcT: Can't read, response code = %s" % (sw,))
Philipp Maiera2650492018-07-11 23:05:58 +0200191 except Exception as e:
Vadim Yanitskiy6727f0c2020-01-22 23:38:24 +0700192 print("HPLMNAcT: Can't read file -- " + str(e))
Alexander Chemeris6e589142013-07-04 17:34:06 +0400193
194 # EF.ACC
Supreeth Herled1fb6fc2020-03-19 12:45:45 +0100195 (res, sw) = card.read_binary('ACC')
Alexander Chemeris6e589142013-07-04 17:34:06 +0400196 if sw == '9000':
197 print("ACC: %s" % (res,))
198 else:
199 print("ACC: Can't read, response code = %s" % (sw,))
200
201 # EF.MSISDN
Sylvain Munaut9f138972013-07-18 10:36:51 +0200202 try:
Supreeth Herle6d66af62020-03-19 12:49:16 +0100203 (res, sw) = card.read_msisdn()
Sylvain Munaut9f138972013-07-18 10:36:51 +0200204 if sw == '9000':
Supreeth Herle6d66af62020-03-19 12:49:16 +0100205 # (npi, ton, msisdn) = res
206 if res is not None:
207 print("MSISDN (NPI=%d ToN=%d): %s" % res)
Sylvain Munaut9f138972013-07-18 10:36:51 +0200208 else:
209 print("MSISDN: Not available")
Alexander Chemeris6e589142013-07-04 17:34:06 +0400210 else:
Sylvain Munaut9f138972013-07-18 10:36:51 +0200211 print("MSISDN: Can't read, response code = %s" % (sw,))
Philipp Maierea6bdf02018-07-11 23:02:36 +0200212 except Exception as e:
Vadim Yanitskiy6727f0c2020-01-22 23:38:24 +0700213 print("MSISDN: Can't read file -- " + str(e))
Alexander Chemeris6e589142013-07-04 17:34:06 +0400214
Philipp Maieree908ae2019-03-21 16:21:12 +0100215 # EF.AD
Supreeth Herle52ef6752020-03-19 12:50:27 +0100216 (res, sw) = card.read_binary('AD')
Philipp Maieree908ae2019-03-21 16:21:12 +0100217 if sw == '9000':
218 print("AD: %s" % (res,))
219 else:
220 print("AD: Can't read, response code = %s" % (sw,))
221
Alexander Chemeris6e589142013-07-04 17:34:06 +0400222 # Done for this card and maybe for everything ?
Vadim Yanitskiy6727f0c2020-01-22 23:38:24 +0700223 print("Done !\n")