implement resetting of SQN parameters
This commit is contained in:
parent
5c15b238f5
commit
d7b90f8db7
|
@ -52,6 +52,7 @@ def helptext():
|
||||||
print " -k, --ki ....................... Show KI value"
|
print " -k, --ki ....................... Show KI value"
|
||||||
print " -K, --set-ki ................... Set KI value"
|
print " -K, --set-ki ................... Set KI value"
|
||||||
print " -s --seq-parameters ........... Show MILENAGE SEQ/SQN parameters"
|
print " -s --seq-parameters ........... Show MILENAGE SEQ/SQN parameters"
|
||||||
|
print " -S --reset-seq-parameters...... Reset MILENAGE SEQ/SQN parameters to default"
|
||||||
print ""
|
print ""
|
||||||
|
|
||||||
|
|
||||||
|
@ -74,16 +75,17 @@ def main(argv):
|
||||||
getopt_force = False
|
getopt_force = False
|
||||||
getopt_write_iccid = None
|
getopt_write_iccid = None
|
||||||
getopt_seq_par = False
|
getopt_seq_par = False
|
||||||
|
getopt_reset_seq_par = False
|
||||||
|
|
||||||
# Analyze commandline options
|
# Analyze commandline options
|
||||||
try:
|
try:
|
||||||
opts, args = getopt.getopt(argv,
|
opts, args = getopt.getopt(argv,
|
||||||
"hva:ucmtT:lL:oO:C:kK:fiI:s",
|
"hva:ucmtT:lL:oO:C:kK:fiI:sS",
|
||||||
["help","verbose","adm1=","usim","classic",
|
["help","verbose","adm1=","usim","classic",
|
||||||
"mode","auth","set-auth=","milenage",
|
"mode","auth","set-auth=","milenage",
|
||||||
"set-milenage","opc","set-op=","set-opc=",
|
"set-milenage","opc","set-op=","set-opc=",
|
||||||
"ki","set-ki=","force","iccid","set-iccid=",
|
"ki","set-ki=","force","iccid","set-iccid=",
|
||||||
"seq-parameters"])
|
"seq-parameters", "reset-seq-parameters"])
|
||||||
except getopt.GetoptError:
|
except getopt.GetoptError:
|
||||||
print " * Error: Invalid commandline options"
|
print " * Error: Invalid commandline options"
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
|
@ -126,6 +128,8 @@ def main(argv):
|
||||||
getopt_write_iccid = asciihex_to_list(pad_asciihex(arg))
|
getopt_write_iccid = asciihex_to_list(pad_asciihex(arg))
|
||||||
elif opt in ("-s", "--sqe-parameters"):
|
elif opt in ("-s", "--sqe-parameters"):
|
||||||
getopt_seq_par = True
|
getopt_seq_par = True
|
||||||
|
elif opt in ("-S", "--reset-sqe-parameters"):
|
||||||
|
getopt_reset_seq_par = True
|
||||||
|
|
||||||
|
|
||||||
if not getopt_adm1:
|
if not getopt_adm1:
|
||||||
|
@ -222,6 +226,12 @@ def main(argv):
|
||||||
sysmo_usim_write_iccid(sim, getopt_write_iccid)
|
sysmo_usim_write_iccid(sim, getopt_write_iccid)
|
||||||
print("")
|
print("")
|
||||||
|
|
||||||
|
if getopt_reset_seq_par:
|
||||||
|
print "Resetting MILENAGE Sequence Parameters..."
|
||||||
|
sysmo_usim_reset_milenage_sqn_params(sim)
|
||||||
|
print("")
|
||||||
|
|
||||||
|
|
||||||
print "Done!"
|
print "Done!"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -139,10 +139,10 @@ class SYSMO_USIMSJS1_FILE_EF_SQNC:
|
||||||
# Default parameters
|
# Default parameters
|
||||||
ind_size_bits = 5
|
ind_size_bits = 5
|
||||||
sqn_check_enabled = True
|
sqn_check_enabled = True
|
||||||
sqn_age_limit_enabled = True
|
sqn_age_limit_enabled = False
|
||||||
sqn_max_delta_enabled = True
|
sqn_max_delta_enabled = True
|
||||||
sqnms_offset = 0
|
sqnms_offset = 0
|
||||||
max_delta = 0;
|
max_delta = 2**28 << ind_size_bits
|
||||||
age_limit = 2**28 << ind_size_bits
|
age_limit = 2**28 << ind_size_bits
|
||||||
|
|
||||||
def __init__(self, content = None):
|
def __init__(self, content = None):
|
||||||
|
@ -171,11 +171,28 @@ class SYSMO_USIMSJS1_FILE_EF_SQNC:
|
||||||
dump += "%sAge Limit: %u\n" % (pfx, self.age_limit)
|
dump += "%sAge Limit: %u\n" % (pfx, self.age_limit)
|
||||||
return dump
|
return dump
|
||||||
|
|
||||||
|
def encode(self):
|
||||||
|
out = list(range(0, 3))
|
||||||
|
out[0] = self.ind_size_bits & 0x0f
|
||||||
|
if self.sqn_check_enabled:
|
||||||
|
out[0] |= 0x10
|
||||||
|
if self.sqn_age_limit_enabled:
|
||||||
|
out[0] |= 0x20
|
||||||
|
if self.sqn_max_delta_enabled:
|
||||||
|
out[0] |= 0x40
|
||||||
|
out[1] = (self.sqnms_offset*6) & 0xff
|
||||||
|
out[2] = (self.sqnms_offset*6) >> 8
|
||||||
|
out += int_to_list(self.max_delta, 6)
|
||||||
|
out += int_to_list(self.age_limit, 6)
|
||||||
|
return out
|
||||||
|
|
||||||
class SYSMO_USIMSJS1_FILE_EF_SQNA:
|
class SYSMO_USIMSJS1_FILE_EF_SQNA:
|
||||||
seq_array = []
|
seq_array = []
|
||||||
|
|
||||||
def __init__(self, content, ind = 5):
|
def __init__(self, content, ind = 5):
|
||||||
if content == None:
|
if content == None:
|
||||||
|
for i in range(0, 2**ind):
|
||||||
|
self.seq_array.append(0)
|
||||||
return
|
return
|
||||||
if len(content) != 6*(2**ind):
|
if len(content) != 6*(2**ind):
|
||||||
raise ValueError("unexpected length of %u bytes", len(content))
|
raise ValueError("unexpected length of %u bytes", len(content))
|
||||||
|
@ -191,6 +208,12 @@ class SYSMO_USIMSJS1_FILE_EF_SQNA:
|
||||||
dump += "%sSEQ[%03d]: %u\n" % (pfx, i, self.seq_array[i])
|
dump += "%sSEQ[%03d]: %u\n" % (pfx, i, self.seq_array[i])
|
||||||
return dump
|
return dump
|
||||||
|
|
||||||
|
def encode(self):
|
||||||
|
out = []
|
||||||
|
for i in self.seq_array:
|
||||||
|
out += int_to_list(i, 6)
|
||||||
|
return out
|
||||||
|
|
||||||
|
|
||||||
# Initalize card (select master file)
|
# Initalize card (select master file)
|
||||||
def sysmo_usim_init(sim):
|
def sysmo_usim_init(sim):
|
||||||
|
@ -309,6 +332,21 @@ def sysmo_usim_get_auth_counter(sim):
|
||||||
else:
|
else:
|
||||||
return ctr
|
return ctr
|
||||||
|
|
||||||
|
def sysmo_usim_set_auth_counter(sim, ctr):
|
||||||
|
if ctr == "LOCKED":
|
||||||
|
ctr = 0
|
||||||
|
elif ctr == "DISABLED":
|
||||||
|
ctr = 0xFFFFFFFF
|
||||||
|
data = int_to_list(ctr, 4)
|
||||||
|
sim.select(SYSMO_USIMSJS1_EF_AC)
|
||||||
|
res = sim.update_binary(data, offset=0)
|
||||||
|
if ctr == 0:
|
||||||
|
return "LOCKED"
|
||||||
|
elif ctr == 0xFFFFFFFF:
|
||||||
|
return "DISABLED"
|
||||||
|
else:
|
||||||
|
return ctr
|
||||||
|
|
||||||
def sysmo_usim_read_milenage_sqn_params(sim):
|
def sysmo_usim_read_milenage_sqn_params(sim):
|
||||||
sysmo_usim_init(sim)
|
sysmo_usim_init(sim)
|
||||||
|
|
||||||
|
@ -331,6 +369,22 @@ def sysmo_usim_read_milenage_sqn_params(sim):
|
||||||
auth_ctr = sysmo_usim_get_auth_counter(sim)
|
auth_ctr = sysmo_usim_get_auth_counter(sim)
|
||||||
print "* Authentication Counter: %s\n" % auth_ctr
|
print "* Authentication Counter: %s\n" % auth_ctr
|
||||||
|
|
||||||
|
def sysmo_usim_reset_milenage_sqn_params(sim):
|
||||||
|
sysmo_usim_init(sim)
|
||||||
|
|
||||||
|
print "* Resetting SQN Configuration to defaults..."
|
||||||
|
|
||||||
|
sim.card.SELECT_ADF_USIM()
|
||||||
|
ef_sqnc = SYSMO_USIMSJS1_FILE_EF_SQNC(None)
|
||||||
|
sim.select(SYSMO_USIMSJS1_EF_SQNC)
|
||||||
|
res = sim.update_binary(ef_sqnc.encode())
|
||||||
|
|
||||||
|
ef_sqna = SYSMO_USIMSJS1_FILE_EF_SQNA(None, ef_sqnc.ind_size_bits)
|
||||||
|
sim.select(SYSMO_USIMSJS1_EF_SQNA)
|
||||||
|
res = sim.update_binary(ef_sqna.encode())
|
||||||
|
|
||||||
|
sysmo_usim_set_auth_counter(sim, "DISABLED")
|
||||||
|
|
||||||
# Show current milenage parameters
|
# Show current milenage parameters
|
||||||
def sysmo_usim_show_milenage_params(sim):
|
def sysmo_usim_show_milenage_params(sim):
|
||||||
sysmo_usim_init(sim)
|
sysmo_usim_init(sim)
|
||||||
|
|
7
utils.py
7
utils.py
|
@ -69,3 +69,10 @@ def swap_nibbles(array):
|
||||||
# Convert from list of bytes to big-endian integer
|
# Convert from list of bytes to big-endian integer
|
||||||
def list_to_int(arr):
|
def list_to_int(arr):
|
||||||
return int(hexdump(arr), 16)
|
return int(hexdump(arr), 16)
|
||||||
|
|
||||||
|
def int_to_list(inp, num_bytes):
|
||||||
|
out = []
|
||||||
|
for i in range(0, num_bytes):
|
||||||
|
shift_bits = ((num_bytes-1-i) * 8)
|
||||||
|
out.append((inp >> shift_bits) & 0xFF)
|
||||||
|
return out
|
||||||
|
|
Loading…
Reference in New Issue