diff --git a/pySim-run-gsm.py b/pySim-run-gsm.py new file mode 100755 index 00000000..f4fd453f --- /dev/null +++ b/pySim-run-gsm.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python2 + +# +# Utility to run an A3/A8 algorithm on a SIM card +# +# Copyright (C) 2018 Alexander Chemeris +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +import sys +from optparse import OptionParser +from pySim.commands import SimCardCommands + +def parse_options(): + + parser = OptionParser(usage="usage: %prog [options]", + description="Utility to run an A3/A8 algorithm on a SIM card. " + "Prints generated SRES and Kc for a given RAND number " + "and exits.") + + parser.add_option("-d", "--device", dest="device", metavar="DEV", + help="Serial Device for SIM access [default: %default]", + default="/dev/ttyUSB0", + ) + parser.add_option("-b", "--baud", dest="baudrate", type="int", metavar="BAUD", + help="Baudrate used for SIM access [default: %default]", + default=9600, + ) + parser.add_option("-p", "--pcsc-device", dest="pcsc_dev", type='int', metavar="PCSC", + help="Which PC/SC reader number for SIM access", + default=None, + ) + parser.add_option("-r", "--rand", dest="rand", metavar="RAND", + help="16 bytes of RAND value", + default=None, + ) + + (options, args) = parser.parse_args() + + if args: + parser.error("Extraneous arguments") + + return options + + +if __name__ == '__main__': + + # Parse options + opts = parse_options() + + if opts.rand is None: + print("Please specify RAND value") + sys.exit(1) + if len(opts.rand) != 32: + print("RAND must be 16 bytes long") + sys.exit(1) + + # Connect to the card + if opts.pcsc_dev is None: + from pySim.transport.serial import SerialSimLink + sl = SerialSimLink(device=opts.device, baudrate=opts.baudrate) + else: + from pySim.transport.pcsc import PcscSimLink + sl = PcscSimLink(opts.pcsc_dev) + + # Create command layer + scc = SimCardCommands(transport=sl) + + # Wait for SIM card + sl.wait_for_card() + + # Program the card + print("Running GSM algorithm with RAND %s" % (opts.rand,)) + + # Run GSM A3/A8 + (res, sw) = scc.run_gsm(opts.rand) + if sw == '9000': + sres, kc = res + print("SRES = %s" % (sres,)) + print("Kc = %s" % (kc,)) + else: + print("Error %s, result data '%s'" % (sw, res)) + + # Done for this card and maybe for everything ? + print "Done !\n"