diff --git a/sysmo-usim-tool.sjs1.py b/sysmo-usim-tool.sjs1.py index 0693989..10244d0 100755 --- a/sysmo-usim-tool.sjs1.py +++ b/sysmo-usim-tool.sjs1.py @@ -51,6 +51,7 @@ def helptext(): print " -C, --set-opc HEXSTRING ........ Set OPc value" print " -k, --ki ....................... Show KI value" print " -K, --set-ki ................... Set KI value" + print " -i, --iccid .................... Show ICCID value" print "" @@ -71,15 +72,17 @@ def main(argv): getopt_show_ki = None getopt_write_ki = None getopt_force = False + getopt_show_iccid = False + getopt_write_iccid = None # Analyze commandline options try: opts, args = getopt.getopt(argv, - "hva:ucmtT:lL:oO:C:kK:f", + "hva:ucmtT:lL:oO:C:kK:fiI:", ["help","verbose","adm1=","usim","classic", "mode","auth","set-auth=","milenage", "set-milenage","opc","set-op=","set-opc=", - "ki","set-ki=","force"]) + "ki","set-ki=","force","iccid","set-iccid="]) except getopt.GetoptError: print " * Error: Invalid commandline options" sys.exit(2) @@ -118,6 +121,10 @@ def main(argv): getopt_write_ki = asciihex_to_list(arg) elif opt in ("-f", "--force"): getopt_force = True + elif opt in ("-i", "--iccid"): + getopt_show_iccid = True + elif opt in ("-I", "--set-iccid"): + getopt_write_iccid = asciihex_to_list(pad_asciihex(arg)) if not getopt_adm1: @@ -205,6 +212,16 @@ def main(argv): sysmo_usim_show_ki_params(sim, getopt_adm1) print("") + if getopt_show_iccid: + print "Reading ICCID value..." + sysmo_usim_show_iccid(sim, getopt_adm1) + print("") + + if getopt_write_iccid: + print "Writing ICCID value..." + sysmo_usim_write_iccid(sim, getopt_adm1, getopt_write_iccid) + print("") + print "Done!" diff --git a/sysmo_usimsjs1.py b/sysmo_usimsjs1.py index a68a3e5..0e344d7 100644 --- a/sysmo_usimsjs1.py +++ b/sysmo_usimsjs1.py @@ -358,3 +358,26 @@ def sysmo_usim_write_sim_mode(sim, adm1, usim_enabled = True): sim.update_record(new_record, rec_no = 1) +# Show current ICCID value +def sysmo_usim_show_iccid(sim, adm1): + sysmo_usim_init(sim) + + print " * Reading..." + sim.select(GSM_SIM_EF_ICCID) + res = sim.read_binary(10) + + print " * Current ICCID setting:" + print " ICCID: " + hexdump(swap_nibbles(res.apdu)) + + +# Program new ICCID value +def sysmo_usim_write_iccid(sim, adm1, iccid): + print " * New ICCID setting:" + print " ICCID: " + hexdump(iccid) + + sysmo_usim_init(sim) + + sim.select(GSM_SIM_EF_ICCID) + + print " * Programming..." + sim.update_binary(swap_nibbles(iccid)) diff --git a/utils.py b/utils.py index df47dea..9d0dbcd 100644 --- a/utils.py +++ b/utils.py @@ -48,3 +48,20 @@ def asciihex_to_list(string): except: print "Warning: Invalid hex string -- ignored!" return [] + + +# Pad an ascihex string with a nibble in case it is "incomplete" +def pad_asciihex(string, padding='f'): + + if len(string) % 2 != 0: + return string + padding + return string + + +# Swap nibbles of each byte in an array +def swap_nibbles(array): + + rc = [] + for a in array: + rc.append(((a & 0xf0) >> 4) | ((a & 0x0f) << 4)) + return rc