From 454bd5257286eda041278561d7da037e3b911e35 Mon Sep 17 00:00:00 2001 From: Sylvain Munaut Date: Sun, 26 Dec 2010 21:31:24 +0100 Subject: [PATCH] 27c3: Add a ccc-fix script to correct bad SMSP file ... Signed-off-by: Sylvain Munaut --- ccc-fix.py | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100755 ccc-fix.py diff --git a/ccc-fix.py b/ccc-fix.py new file mode 100755 index 00000000..db2ee210 --- /dev/null +++ b/ccc-fix.py @@ -0,0 +1,153 @@ +#!/usr/bin/env python + +# +# Utility to write the cards +# +# +# Copyright (C) 2009 Sylvain Munaut +# Copyright (C) 2010 Harald Welte +# +# 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 . +# + +from optparse import OptionParser + +from pySim.commands import SimCardCommands +from pySim.cards import _cards_classes + + + +def card_detect(opts, scc): + + # Detect type if needed + card = None + ctypes = dict([(kls.name, kls) for kls in _cards_classes]) + + if opts.type in ("auto", "auto_once"): + for kls in _cards_classes: + card = kls.autodetect(scc) + if card: + print "Autodetected card type %s" % card.name + card.reset() + break + + if card is None: + print "Autodetection failed" + return + + if opts.type == "auto_once": + opts.type = card.name + + elif opts.type in ctypes: + card = ctypes[opts.type](scc) + + else: + raise ValueError("Unknown card type %s" % opts.type) + + return card + + +# +# Main +# + +def parse_options(): + + parser = OptionParser(usage="usage: %prog [options]") + + # Card interface + 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("-t", "--type", dest="type", + help="Card type (user -t list to view) [default: %default]", + default="auto", + ) + + (options, args) = parser.parse_args() + + if options.type == 'list': + for kls in _cards_classes: + print kls.name + sys.exit(0) + + if args: + parser.error("Extraneous arguments") + + return options + + +def main(): + + # Parse options + opts = parse_options() + + # 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) + + # Iterate + done = False + first = True + card = None + + while not done: + # Connect transport + print "Insert card now (or CTRL-C to cancel)" + sl.wait_for_card(newcardonly=not first) + + # Not the first anymore ! + first = False + + # Get card + card = card_detect(opts, scc) + if card is None: + if opts.batch_mode: + first = False + continue + else: + sys.exit(-1) + + # Check type + if card.name != 'fakemagicsim': + print "Can't fix this type of card ..." + continue + + # Fix record + data, sw = scc.read_record(['000c'], 1) + data_new = data[0:100] + 'fffffffffffffffffffffffffdffffffffffffffffffffffff0791947106004034ffffffffffffff' + scc.update_record(['000c'], 1, data_new) + + # Done for this card and maybe for everything ? + print "Card should be fixed now !\n" + + +if __name__ == '__main__': + main()