Compare commits
9 Commits
bb4d30a81b
...
31b9abed97
Author | SHA1 | Date |
---|---|---|
Philipp Maier | 31b9abed97 | |
Philipp Maier | caba0ccf6b | |
Philipp Maier | de0adadcbb | |
Philipp Maier | 56e23aa246 | |
Philipp Maier | 2be58ad806 | |
Philipp Maier | 6ff21f766c | |
Philipp Maier | 0ac4f8c640 | |
Philipp Maier | 634f8603b2 | |
Philipp Maier | dc428ee19d |
28
common.py
28
common.py
|
@ -28,8 +28,8 @@ import sys, getopt
|
||||||
|
|
||||||
COMMON_GETOPTS = "hfa:J:nN:lL:kK:tT:oO:C:sSip"
|
COMMON_GETOPTS = "hfa:J:nN:lL:kK:tT:oO:C:sSip"
|
||||||
COMMON_GETOPTS_LONG = ["help", "force", "adm1=", "set-imsi=", "mnclen",
|
COMMON_GETOPTS_LONG = ["help", "force", "adm1=", "set-imsi=", "mnclen",
|
||||||
"set-mnclen=", "milenage", "set-milenage=", "ki",
|
"set-mnclen=", "milenage", "set-milenage=", "key",
|
||||||
"set-ki=", "auth", "set-auth=", "opc", "set-op=",
|
"set-key=", "auth", "set-auth=", "opc", "set-op=",
|
||||||
"set-opc=", "seq-parameters", "reset-seq-parameters"
|
"set-opc=", "seq-parameters", "reset-seq-parameters"
|
||||||
"iccid", "aid"]
|
"iccid", "aid"]
|
||||||
|
|
||||||
|
@ -46,8 +46,8 @@ class Common():
|
||||||
show_mnclen = None
|
show_mnclen = None
|
||||||
show_milenage = False
|
show_milenage = False
|
||||||
write_milenage = None
|
write_milenage = None
|
||||||
show_ki = None
|
show_key = None
|
||||||
write_ki = None
|
write_key = None
|
||||||
show_auth = False
|
show_auth = False
|
||||||
write_auth = None
|
write_auth = None
|
||||||
show_opc = False
|
show_opc = False
|
||||||
|
@ -91,10 +91,10 @@ class Common():
|
||||||
self.show_milenage = True
|
self.show_milenage = True
|
||||||
elif opt in ("-L", "--set-milenage"):
|
elif opt in ("-L", "--set-milenage"):
|
||||||
self.write_milenage = asciihex_to_list(arg)
|
self.write_milenage = asciihex_to_list(arg)
|
||||||
elif opt in ("-k", "--ki"):
|
elif opt in ("-k", "--key"):
|
||||||
self.show_ki = True
|
self.show_key = True
|
||||||
elif opt in ("-K", "--set-ki"):
|
elif opt in ("-K", "--set-key"):
|
||||||
self.write_ki = asciihex_to_list(arg)
|
self.write_key = asciihex_to_list(arg)
|
||||||
elif opt in ("-t", "--auth"):
|
elif opt in ("-t", "--auth"):
|
||||||
self.show_auth = True
|
self.show_auth = True
|
||||||
elif opt in ("-T", "--set-auth"):
|
elif opt in ("-T", "--set-auth"):
|
||||||
|
@ -141,8 +141,8 @@ class Common():
|
||||||
print(" -N, --set-mnclen ............... Set MNC length value")
|
print(" -N, --set-mnclen ............... Set MNC length value")
|
||||||
print(" -l, --milenage ................. Show milenage parameters")
|
print(" -l, --milenage ................. Show milenage parameters")
|
||||||
print(" -L, --set-milenage HEXSTRING ... Set milenage parameters")
|
print(" -L, --set-milenage HEXSTRING ... Set milenage parameters")
|
||||||
print(" -k, --ki ....................... Show KI value")
|
print(" -k, --key ...................... Show auth key value")
|
||||||
print(" -K, --set-ki ................... Set KI value")
|
print(" -K, --set-key .................. Set auth key value")
|
||||||
print(" -t, --auth ..................... Show Authentication algorithms")
|
print(" -t, --auth ..................... Show Authentication algorithms")
|
||||||
print(" -T, --set-auth 2G:3G ........... Set 2G/3G Auth algo (e.g. COMP128v1:COMP128v1)")
|
print(" -T, --set-auth 2G:3G ........... Set 2G/3G Auth algo (e.g. COMP128v1:COMP128v1)")
|
||||||
print(" -o, --opc ...................... Show OP/c configuration")
|
print(" -o, --opc ...................... Show OP/c configuration")
|
||||||
|
@ -182,11 +182,11 @@ class Common():
|
||||||
if self.show_milenage:
|
if self.show_milenage:
|
||||||
self.sim.show_milenage_params()
|
self.sim.show_milenage_params()
|
||||||
|
|
||||||
if self.write_ki:
|
if self.write_key:
|
||||||
self.sim.write_ki_params(self.write_ki)
|
self.sim.write_key_params(self.write_key)
|
||||||
|
|
||||||
if self.show_ki:
|
if self.show_key:
|
||||||
self.sim.show_ki_params()
|
self.sim.show_key_params()
|
||||||
|
|
||||||
if self.show_auth:
|
if self.show_auth:
|
||||||
self.sim.show_auth_params()
|
self.sim.show_auth_params()
|
||||||
|
|
|
@ -2,9 +2,9 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Gadgets to modify sysmoISIM-SJA2 parameters
|
Gadgets to modify sysmoISIM-SJA2/sysmoISIM-SJA5 parameters
|
||||||
|
|
||||||
(C) 2017-2022 by sysmocom - s.f.m.c. GmbH
|
(C) 2017-2023 by sysmocom - s.f.m.c. GmbH
|
||||||
All Rights Reserved
|
All Rights Reserved
|
||||||
|
|
||||||
Author: Philipp Maier
|
Author: Philipp Maier
|
||||||
|
@ -40,15 +40,15 @@ import math
|
||||||
# |
|
# |
|
||||||
# +--[ADF_USIM]
|
# +--[ADF_USIM]
|
||||||
# | |
|
# | |
|
||||||
# | +--[USIM_AUTH_KEY 0xAF20] (regular file)
|
# | +--[EF_USIM_AUTH_KEY 0xAF20] (regular file)
|
||||||
# | |
|
# | |
|
||||||
# | +--[EF_USIM_AUTH_KEY_2G 0xAF22] (link to DF_SYSTEM/EF_SIM_AUTH_KEY)
|
# | +--[EF_USIM_AUTH_KEY_2G 0xAF22] (link to DF_SYSTEM/EF_SIM_AUTH_KEY)
|
||||||
# |
|
# |
|
||||||
# +--[ADF_ISIM]
|
# +--[ADF_ISIM]
|
||||||
# |
|
# |
|
||||||
# +--[USIM_AUTH_KEY 0xAF20] (regular file)
|
# +--[EF_ISIM_AUTH_KEY 0xAF20] (regular file)
|
||||||
# |
|
# |
|
||||||
# +--[EF_USIM_AUTH_KEY_2G 0xAF22] (link to DF_SYSTEM/EF_SIM_AUTH_KEY)
|
# +--[EF_ISIM_AUTH_KEY_2G 0xAF22] (link to DF_SYSTEM/EF_SIM_AUTH_KEY)
|
||||||
#
|
#
|
||||||
# Note: EF_MILENAGE_CFG and EF_USIM_SQN not yet listed here.
|
# Note: EF_MILENAGE_CFG and EF_USIM_SQN not yet listed here.
|
||||||
|
|
||||||
|
@ -74,6 +74,7 @@ SYSMO_ISIMSJA5_ALGO_TUAK = 0x06
|
||||||
SYSMO_ISIMSJA5_ALGO_XOR_2G = 0x0E
|
SYSMO_ISIMSJA5_ALGO_XOR_2G = 0x0E
|
||||||
SYSMO_ISIMSJA2_ALGO_XOR = 0x0F
|
SYSMO_ISIMSJA2_ALGO_XOR = 0x0F
|
||||||
|
|
||||||
|
# Algorithms that are supported by sysmo-isim-sja2 (and also sysmo-isim-sja5)
|
||||||
sysmo_isimsja2_algorithms = [
|
sysmo_isimsja2_algorithms = [
|
||||||
(SYSMO_ISIMSJA2_ALGO_COMP12V1, 'COMP128v1'),
|
(SYSMO_ISIMSJA2_ALGO_COMP12V1, 'COMP128v1'),
|
||||||
(SYSMO_ISIMSJA2_ALGO_COMP12V2, 'COMP128v2'),
|
(SYSMO_ISIMSJA2_ALGO_COMP12V2, 'COMP128v2'),
|
||||||
|
@ -83,12 +84,14 @@ sysmo_isimsja2_algorithms = [
|
||||||
(SYSMO_ISIMSJA2_ALGO_XOR, 'XOR'),
|
(SYSMO_ISIMSJA2_ALGO_XOR, 'XOR'),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# Algorithms that are supported by sysmo-isim-sja5. This also includes all
|
||||||
|
# algorithms supported by sysmo-isim-sja2y
|
||||||
sysmo_isimsja5_algorithms = sysmo_isimsja2_algorithms + [
|
sysmo_isimsja5_algorithms = sysmo_isimsja2_algorithms + [
|
||||||
(SYSMO_ISIMSJA5_ALGO_XOR_2G, 'XOR-2G'),
|
(SYSMO_ISIMSJA5_ALGO_XOR_2G, 'XOR-2G'),
|
||||||
(SYSMO_ISIMSJA5_ALGO_TUAK, 'TUAK'),
|
(SYSMO_ISIMSJA5_ALGO_TUAK, 'TUAK'),
|
||||||
]
|
]
|
||||||
|
|
||||||
class SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY:
|
class SYSMO_ISIMSJAX_FILE_EF_XSIM_AUTH_KEY:
|
||||||
"""
|
"""
|
||||||
Superclass model that generates that handles the header byte of
|
Superclass model that generates that handles the header byte of
|
||||||
SYSMO_ISIMSJA2_EF_USIM_AUTH_KEY, SYSMO_ISIMSJA2_EF_USIM_AUTH_KEY_2G
|
SYSMO_ISIMSJA2_EF_USIM_AUTH_KEY, SYSMO_ISIMSJA2_EF_USIM_AUTH_KEY_2G
|
||||||
|
@ -102,18 +105,15 @@ class SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY:
|
||||||
def __init__(self, content = None):
|
def __init__(self, content = None):
|
||||||
if content == None:
|
if content == None:
|
||||||
return
|
return
|
||||||
|
|
||||||
header = content[0]
|
header = content[0]
|
||||||
self.algo = header & 0x0F
|
self.algo = header & 0x0F
|
||||||
self.use_opc = bool((header >> 4) & 1)
|
self.use_opc = bool((header >> 4) & 1)
|
||||||
|
|
||||||
if (header >> 5) & 1:
|
if (header >> 5) & 1:
|
||||||
self.sres_dev_func = 2
|
self.sres_dev_func = 2
|
||||||
else:
|
else:
|
||||||
self.sres_dev_func = 1
|
self.sres_dev_func = 1
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
def __str__(self):
|
|
||||||
dump = ""
|
dump = ""
|
||||||
pfx = " "
|
pfx = " "
|
||||||
|
|
||||||
|
@ -130,8 +130,7 @@ class SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY:
|
||||||
|
|
||||||
return dump
|
return dump
|
||||||
|
|
||||||
|
def encode(self) -> list:
|
||||||
def encode(self):
|
|
||||||
out = [0x00]
|
out = [0x00]
|
||||||
out[0] = self.algo & 0x0F
|
out[0] = self.algo & 0x0F
|
||||||
if self.use_opc == True:
|
if self.use_opc == True:
|
||||||
|
@ -140,7 +139,7 @@ class SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY:
|
||||||
return out
|
return out
|
||||||
|
|
||||||
|
|
||||||
class SYSMO_ISIMSJA2_FILE_EF_SIM_AUTH_KEY(SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY):
|
class SYSMO_ISIMSJAX_FILE_EF_SIM_AUTH_KEY(SYSMO_ISIMSJAX_FILE_EF_XSIM_AUTH_KEY):
|
||||||
|
|
||||||
key = [0xAA] * 16
|
key = [0xAA] * 16
|
||||||
opc = [0xBB] * 16
|
opc = [0xBB] * 16
|
||||||
|
@ -153,8 +152,7 @@ class SYSMO_ISIMSJA2_FILE_EF_SIM_AUTH_KEY(SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY):
|
||||||
self.key = content[1:17]
|
self.key = content[1:17]
|
||||||
self.opc = content[17:33]
|
self.opc = content[17:33]
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
def __str__(self):
|
|
||||||
dump = ""
|
dump = ""
|
||||||
pfx = " "
|
pfx = " "
|
||||||
|
|
||||||
|
@ -176,13 +174,13 @@ class SYSMO_ISIMSJA2_FILE_EF_SIM_AUTH_KEY(SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY):
|
||||||
return dump
|
return dump
|
||||||
|
|
||||||
|
|
||||||
def encode(self):
|
def encode(self) -> list:
|
||||||
out = SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY.encode(self)
|
out = SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY.encode(self)
|
||||||
out += self.key + self.opc
|
out += self.key + self.opc
|
||||||
return out
|
return out
|
||||||
|
|
||||||
|
|
||||||
class SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY):
|
class SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(SYSMO_ISIMSJAX_FILE_EF_XSIM_AUTH_KEY):
|
||||||
|
|
||||||
full_res = True # Return full 8-byte RES or first 4 bytes only
|
full_res = True # Return full 8-byte RES or first 4 bytes only
|
||||||
ext_res = False # Return 16 byte RES (ignores full_res, only valid with 3G XOR)
|
ext_res = False # Return 16 byte RES (ignores full_res, only valid with 3G XOR)
|
||||||
|
@ -194,7 +192,7 @@ class SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY)
|
||||||
if content == None:
|
if content == None:
|
||||||
return
|
return
|
||||||
|
|
||||||
SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY.__init__(self, content)
|
SYSMO_ISIMSJAX_FILE_EF_XSIM_AUTH_KEY.__init__(self, content)
|
||||||
header = content[0]
|
header = content[0]
|
||||||
|
|
||||||
self.full_res = bool((header >> 6) & 1)
|
self.full_res = bool((header >> 6) & 1)
|
||||||
|
@ -204,12 +202,11 @@ class SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY)
|
||||||
if len(content) > 17:
|
if len(content) > 17:
|
||||||
self.opc = content[17:33]
|
self.opc = content[17:33]
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
def __str__(self):
|
|
||||||
dump = ""
|
dump = ""
|
||||||
pfx = " "
|
pfx = " "
|
||||||
|
|
||||||
dump += SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY.__str__(self)
|
dump += SYSMO_ISIMSJAX_FILE_EF_XSIM_AUTH_KEY.__str__(self)
|
||||||
if self.full_res == True and self.ext_res == False:
|
if self.full_res == True and self.ext_res == False:
|
||||||
dump += pfx + "3G: Return full 8-byte RES\n"
|
dump += pfx + "3G: Return full 8-byte RES\n"
|
||||||
elif self.full_res == False and self.ext_res == False:
|
elif self.full_res == False and self.ext_res == False:
|
||||||
|
@ -237,8 +234,8 @@ class SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY)
|
||||||
return dump
|
return dump
|
||||||
|
|
||||||
|
|
||||||
def encode(self):
|
def encode(self) -> list:
|
||||||
out = SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY.encode(self)
|
out = SYSMO_ISIMSJAX_FILE_EF_XSIM_AUTH_KEY.encode(self)
|
||||||
if self.full_res == True:
|
if self.full_res == True:
|
||||||
out[0] |= 1 << 6
|
out[0] |= 1 << 6
|
||||||
if self.ext_res == True:
|
if self.ext_res == True:
|
||||||
|
@ -253,11 +250,11 @@ class SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY)
|
||||||
|
|
||||||
# EF_USIM_AUTH_KEY_2G and EF_USIM_AUTH_KEY_GBA have the same layout as
|
# EF_USIM_AUTH_KEY_2G and EF_USIM_AUTH_KEY_GBA have the same layout as
|
||||||
# EF_USIM_AUTH_KEY, so there is nothing to specialize other than the class name
|
# EF_USIM_AUTH_KEY, so there is nothing to specialize other than the class name
|
||||||
class SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY_2G(SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY):
|
class SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_2G(SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY_GBA(SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY):
|
class SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_GBA(SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@ -278,7 +275,6 @@ class SYSMO_ISIMSJA2_FILE_EF_MILENAGE_CFG:
|
||||||
C5 = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
C5 = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08]
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08]
|
||||||
|
|
||||||
|
|
||||||
def __init__(self, content = None):
|
def __init__(self, content = None):
|
||||||
if content == None:
|
if content == None:
|
||||||
return
|
return
|
||||||
|
@ -295,8 +291,7 @@ class SYSMO_ISIMSJA2_FILE_EF_MILENAGE_CFG:
|
||||||
self.C4 = content[53:69]
|
self.C4 = content[53:69]
|
||||||
self.C5 = content[69:85]
|
self.C5 = content[69:85]
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
def __str__(self):
|
|
||||||
dump = " R1: " + str(hex(self.R1)) + "\n"
|
dump = " R1: " + str(hex(self.R1)) + "\n"
|
||||||
dump += " R2: " + str(hex(self.R2)) + "\n"
|
dump += " R2: " + str(hex(self.R2)) + "\n"
|
||||||
dump += " R3: " + str(hex(self.R3)) + "\n"
|
dump += " R3: " + str(hex(self.R3)) + "\n"
|
||||||
|
@ -309,14 +304,13 @@ class SYSMO_ISIMSJA2_FILE_EF_MILENAGE_CFG:
|
||||||
dump += " C5: " + hexdump(self.C5)
|
dump += " C5: " + hexdump(self.C5)
|
||||||
return dump
|
return dump
|
||||||
|
|
||||||
|
def encode(self) -> list:
|
||||||
def encode(self):
|
|
||||||
out = [self.R1, self.R2, self.R3, self.R4, self.R5]
|
out = [self.R1, self.R2, self.R3, self.R4, self.R5]
|
||||||
out += self.C1 + self.C2 + self.C3 + self.C4 + self.C5
|
out += self.C1 + self.C2 + self.C3 + self.C4 + self.C5
|
||||||
return out
|
return out
|
||||||
|
|
||||||
|
|
||||||
class SYSMO_ISIMSJA2_FILE_EF_USIM_SQN:
|
class SYSMO_ISIMSJAX_FILE_EF_USIM_SQN:
|
||||||
|
|
||||||
# Flag1:
|
# Flag1:
|
||||||
ind_size_bits = 5 # speficy file length by 2^ind_len
|
ind_size_bits = 5 # speficy file length by 2^ind_len
|
||||||
|
@ -376,11 +370,9 @@ class SYSMO_ISIMSJA2_FILE_EF_USIM_SQN:
|
||||||
self.age_limit = list_to_int(content[8:14])
|
self.age_limit = list_to_int(content[8:14])
|
||||||
self.freshness_data = content[15:(6*2**self.ind_size_bits)]
|
self.freshness_data = content[15:(6*2**self.ind_size_bits)]
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
def __str__(self):
|
|
||||||
pfx = " "
|
pfx = " "
|
||||||
dump = ""
|
dump = ""
|
||||||
|
|
||||||
dump += "%sIND (bits): %u\n" % (pfx, self.ind_size_bits)
|
dump += "%sIND (bits): %u\n" % (pfx, self.ind_size_bits)
|
||||||
if self.sqn_check_enabled:
|
if self.sqn_check_enabled:
|
||||||
dump += "%sSQN Check enabled\n" % pfx
|
dump += "%sSQN Check enabled\n" % pfx
|
||||||
|
@ -413,11 +405,9 @@ class SYSMO_ISIMSJA2_FILE_EF_USIM_SQN:
|
||||||
dump += "%sMax Delta: %u\n" % (pfx, self.max_delta)
|
dump += "%sMax Delta: %u\n" % (pfx, self.max_delta)
|
||||||
dump += "%sAge Limit: %u\n" % (pfx, self.age_limit)
|
dump += "%sAge Limit: %u\n" % (pfx, self.age_limit)
|
||||||
dump += pfx + "Freshness Data:\n" + hexdump(self.freshness_data, True)
|
dump += pfx + "Freshness Data:\n" + hexdump(self.freshness_data, True)
|
||||||
|
|
||||||
return dump
|
return dump
|
||||||
|
|
||||||
|
def encode(self) -> list:
|
||||||
def encode(self):
|
|
||||||
out = [0x00, 0x00]
|
out = [0x00, 0x00]
|
||||||
|
|
||||||
# Flag1:
|
# Flag1:
|
||||||
|
@ -445,12 +435,10 @@ class SYSMO_ISIMSJA2_FILE_EF_USIM_SQN:
|
||||||
out += self.freshness_data
|
out += self.freshness_data
|
||||||
return out
|
return out
|
||||||
|
|
||||||
|
|
||||||
def reset(self):
|
def reset(self):
|
||||||
self.freshness_data = [0x00] * (6*2**self.ind_size_bits)
|
self.freshness_data = [0x00] * (6*2**self.ind_size_bits)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Sysmo_isim_sja2(Sysmo_usim):
|
class Sysmo_isim_sja2(Sysmo_usim):
|
||||||
algorithms = sysmo_isimsja2_algorithms
|
algorithms = sysmo_isimsja2_algorithms
|
||||||
|
|
||||||
|
@ -469,7 +457,6 @@ class Sysmo_isim_sja2(Sysmo_usim):
|
||||||
if card_detected == True:
|
if card_detected == True:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
# Try card model #2
|
# Try card model #2
|
||||||
try:
|
try:
|
||||||
atr = "3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 75 31 33 02 51 B2"
|
atr = "3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 75 31 33 02 51 B2"
|
||||||
|
@ -494,14 +481,14 @@ class Sysmo_isim_sja2(Sysmo_usim):
|
||||||
if card_detected == True:
|
if card_detected == True:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
# Exit when we are not able to detect the card
|
# Exit when we are not able to detect the card
|
||||||
if card_detected != True:
|
if card_detected != True:
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
# Show current milenage parameters
|
|
||||||
def show_milenage_params(self):
|
def show_milenage_params(self):
|
||||||
|
"""
|
||||||
|
Show current milenage parameters
|
||||||
|
"""
|
||||||
print("Reading Milenage parameters...")
|
print("Reading Milenage parameters...")
|
||||||
self._init()
|
self._init()
|
||||||
|
|
||||||
|
@ -515,10 +502,10 @@ class Sysmo_isim_sja2(Sysmo_usim):
|
||||||
print(str(ef))
|
print(str(ef))
|
||||||
print("")
|
print("")
|
||||||
|
|
||||||
|
|
||||||
# Write new milenage parameters
|
|
||||||
def write_milenage_params(self, params):
|
def write_milenage_params(self, params):
|
||||||
|
"""
|
||||||
|
Write new milenage parameters
|
||||||
|
"""
|
||||||
print("Programming Milenage parameters...")
|
print("Programming Milenage parameters...")
|
||||||
|
|
||||||
if (len(params) < 85):
|
if (len(params) < 85):
|
||||||
|
@ -545,14 +532,12 @@ class Sysmo_isim_sja2(Sysmo_usim):
|
||||||
self.sim.update_binary(ef_milenage_cfg.encode())
|
self.sim.update_binary(ef_milenage_cfg.encode())
|
||||||
print("")
|
print("")
|
||||||
|
|
||||||
|
|
||||||
# Select DF_SYSTEM/EF_SIM_AUTH_KEY
|
# Select DF_SYSTEM/EF_SIM_AUTH_KEY
|
||||||
def __select_ef_sim_auth_key(self):
|
def __select_ef_sim_auth_key(self):
|
||||||
self.sim.select(GSM_SIM_MF)
|
self.sim.select(GSM_SIM_MF)
|
||||||
self.sim.select(SYSMO_ISIMSJA2_DF_SYSTEM)
|
self.sim.select(SYSMO_ISIMSJA2_DF_SYSTEM)
|
||||||
self.sim.select(SYSMO_ISIMSJA2_EF_SIM_AUTH_KEY)
|
self.sim.select(SYSMO_ISIMSJA2_EF_SIM_AUTH_KEY)
|
||||||
|
|
||||||
|
|
||||||
# Authentication keys exist in various different files, which are
|
# Authentication keys exist in various different files, which are
|
||||||
# similar, thie method simplifies the selection of those files
|
# similar, thie method simplifies the selection of those files
|
||||||
def __select_xsim_auth_key(self, isim = False, _2G = False):
|
def __select_xsim_auth_key(self, isim = False, _2G = False):
|
||||||
|
@ -567,7 +552,6 @@ class Sysmo_isim_sja2(Sysmo_usim):
|
||||||
else:
|
else:
|
||||||
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_AUTH_KEY)
|
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_AUTH_KEY)
|
||||||
|
|
||||||
|
|
||||||
# In the SJA2 model the key material and the algorithm configuration
|
# In the SJA2 model the key material and the algorithm configuration
|
||||||
# is distributed over multiple files, which may also have redundant
|
# is distributed over multiple files, which may also have redundant
|
||||||
# contents. Files can also be hard linked to other files so that
|
# contents. Files can also be hard linked to other files so that
|
||||||
|
@ -588,27 +572,27 @@ class Sysmo_isim_sja2(Sysmo_usim):
|
||||||
self.__select_xsim_auth_key(isim = False, _2G = True)
|
self.__select_xsim_auth_key(isim = False, _2G = True)
|
||||||
res = self._read_binary(self.sim.filelen)
|
res = self._read_binary(self.sim.filelen)
|
||||||
print(" * ADF_USIM/EF_USIM_AUTH_KEY_2G:")
|
print(" * ADF_USIM/EF_USIM_AUTH_KEY_2G:")
|
||||||
print(SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY_2G(res.apdu))
|
print(SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_2G(res.apdu))
|
||||||
|
|
||||||
if self.sim.has_isim:
|
if self.sim.has_isim:
|
||||||
# ADF_ISIM/EF_ISIM_AUTH_KEY_2G:
|
# ADF_ISIM/EF_ISIM_AUTH_KEY_2G:
|
||||||
self.__select_xsim_auth_key(isim = True, _2G = True)
|
self.__select_xsim_auth_key(isim = True, _2G = True)
|
||||||
res = self._read_binary(self.sim.filelen)
|
res = self._read_binary(self.sim.filelen)
|
||||||
print(" * ADF_ISIM/EF_ISIM_AUTH_KEY_2G:")
|
print(" * ADF_ISIM/EF_ISIM_AUTH_KEY_2G:")
|
||||||
print(SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY_2G(res.apdu))
|
print(SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_2G(res.apdu))
|
||||||
|
|
||||||
# ADF_USIM/EF_USIM_AUTH_KEY:
|
# ADF_USIM/EF_USIM_AUTH_KEY:
|
||||||
self.__select_xsim_auth_key(isim = False, _2G = False)
|
self.__select_xsim_auth_key(isim = False, _2G = False)
|
||||||
res = self._read_binary(self.sim.filelen)
|
res = self._read_binary(self.sim.filelen)
|
||||||
print(" * ADF_USIM/EF_USIM_AUTH_KEY:")
|
print(" * ADF_USIM/EF_USIM_AUTH_KEY:")
|
||||||
print(SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(res.apdu))
|
print(SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu))
|
||||||
|
|
||||||
if self.sim.has_isim:
|
if self.sim.has_isim:
|
||||||
# ADF_ISIM/EF_ISIM_AUTH_KEY:
|
# ADF_ISIM/EF_ISIM_AUTH_KEY:
|
||||||
self.__select_xsim_auth_key(isim = True, _2G = False)
|
self.__select_xsim_auth_key(isim = True, _2G = False)
|
||||||
res = self._read_binary(self.sim.filelen)
|
res = self._read_binary(self.sim.filelen)
|
||||||
print(" * ADF_ISIM/EF_ISIM_AUTH_KEY:")
|
print(" * ADF_ISIM/EF_ISIM_AUTH_KEY:")
|
||||||
print(SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(res.apdu))
|
print(SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu))
|
||||||
|
|
||||||
# ADF_USIM/EF_MILENAGE_CFG:
|
# ADF_USIM/EF_MILENAGE_CFG:
|
||||||
self.sim.select(GSM_SIM_MF)
|
self.sim.select(GSM_SIM_MF)
|
||||||
|
@ -633,7 +617,7 @@ class Sysmo_isim_sja2(Sysmo_usim):
|
||||||
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_SQN)
|
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_SQN)
|
||||||
res = self._read_binary(self.sim.filelen)
|
res = self._read_binary(self.sim.filelen)
|
||||||
print(" * ADF_USIM/EF_USIM_SQN:")
|
print(" * ADF_USIM/EF_USIM_SQN:")
|
||||||
print(SYSMO_ISIMSJA2_FILE_EF_USIM_SQN(res.apdu))
|
print(SYSMO_ISIMSJAX_FILE_EF_USIM_SQN(res.apdu))
|
||||||
|
|
||||||
if self.sim.has_isim:
|
if self.sim.has_isim:
|
||||||
# ADF_USIM/EF_ISIM_SQN:
|
# ADF_USIM/EF_ISIM_SQN:
|
||||||
|
@ -642,72 +626,71 @@ class Sysmo_isim_sja2(Sysmo_usim):
|
||||||
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_SQN)
|
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_SQN)
|
||||||
res = self._read_binary(self.sim.filelen)
|
res = self._read_binary(self.sim.filelen)
|
||||||
print(" * ADF_ISIM/EF_ISIM_SQN:")
|
print(" * ADF_ISIM/EF_ISIM_SQN:")
|
||||||
print(SYSMO_ISIMSJA2_FILE_EF_USIM_SQN(res.apdu))
|
print(SYSMO_ISIMSJAX_FILE_EF_USIM_SQN(res.apdu))
|
||||||
|
|
||||||
|
def show_key_params(self):
|
||||||
# Show current KI value
|
"""
|
||||||
def show_ki_params(self):
|
Show current Key value
|
||||||
print("Reading KI value...")
|
"""
|
||||||
|
print("Reading Key value...")
|
||||||
self._init()
|
self._init()
|
||||||
|
|
||||||
# Note: The KI is expected to be the same in all eligible files
|
# Note: The key is expected to be the same in all eligible files
|
||||||
print(" * Reading...")
|
print(" * Reading...")
|
||||||
self.__select_xsim_auth_key(isim = False, _2G = True)
|
self.__select_xsim_auth_key(isim = False, _2G = True)
|
||||||
res = self._read_binary(self.sim.filelen)
|
res = self._read_binary(self.sim.filelen)
|
||||||
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
|
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
|
||||||
|
|
||||||
print(" * Current KI setting:")
|
print(" * Current Key setting:")
|
||||||
print(" KI: " + hexdump(ef.key))
|
print(" Key: " + hexdump(ef.key))
|
||||||
print("")
|
print("")
|
||||||
|
|
||||||
|
def write_key_params(self, key):
|
||||||
# Program new KI value
|
"""
|
||||||
def write_ki_params(self, ki):
|
Program new Key value
|
||||||
print("Writing KI value...")
|
"""
|
||||||
|
print("Writing Key value...")
|
||||||
self._init()
|
self._init()
|
||||||
|
print(" * New Key setting:")
|
||||||
print(" * New KI setting:")
|
print(" Key: " + hexdump(key))
|
||||||
print(" KI: " + hexdump(ki))
|
|
||||||
|
|
||||||
print(" * Programming...")
|
print(" * Programming...")
|
||||||
|
|
||||||
self.__select_xsim_auth_key(isim = False, _2G = True)
|
self.__select_xsim_auth_key(isim = False, _2G = True)
|
||||||
res = self._read_binary(self.sim.filelen)
|
res = self._read_binary(self.sim.filelen)
|
||||||
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
|
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
|
||||||
ef.key = ki
|
ef.key = key
|
||||||
self.sim.update_binary(ef.encode())
|
self.sim.update_binary(ef.encode())
|
||||||
|
|
||||||
self.__select_xsim_auth_key(isim = False, _2G = False)
|
self.__select_xsim_auth_key(isim = False, _2G = False)
|
||||||
res = self._read_binary(self.sim.filelen)
|
res = self._read_binary(self.sim.filelen)
|
||||||
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(res.apdu)
|
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
|
||||||
ef.key = ki
|
ef.key = key
|
||||||
self.sim.update_binary(ef.encode())
|
self.sim.update_binary(ef.encode())
|
||||||
|
|
||||||
if self.sim.has_isim:
|
if self.sim.has_isim:
|
||||||
self.__select_xsim_auth_key(isim = True, _2G = False)
|
self.__select_xsim_auth_key(isim = True, _2G = False)
|
||||||
res = self._read_binary(self.sim.filelen)
|
res = self._read_binary(self.sim.filelen)
|
||||||
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(res.apdu)
|
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
|
||||||
ef.key = ki
|
ef.key = key
|
||||||
self.sim.update_binary(ef.encode())
|
self.sim.update_binary(ef.encode())
|
||||||
|
|
||||||
print("")
|
print("")
|
||||||
|
|
||||||
|
|
||||||
# Show current athentication parameters
|
|
||||||
# (Which algorithim is used for which rat?)
|
|
||||||
def show_auth_params(self):
|
def show_auth_params(self):
|
||||||
|
"""
|
||||||
|
Show current authentication parameters
|
||||||
|
"""
|
||||||
print("Reading Authentication parameters...")
|
print("Reading Authentication parameters...")
|
||||||
self._init()
|
self._init()
|
||||||
|
|
||||||
print(" * Reading...")
|
print(" * Reading...")
|
||||||
self.__select_xsim_auth_key(isim = False, _2G = True)
|
self.__select_xsim_auth_key(isim = False, _2G = True)
|
||||||
res = self._read_binary(self.sim.filelen)
|
res = self._read_binary(self.sim.filelen)
|
||||||
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
|
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
|
||||||
algo_2g = ef.algo
|
algo_2g = ef.algo
|
||||||
|
|
||||||
self.__select_xsim_auth_key(isim = False, _2G = False)
|
self.__select_xsim_auth_key(isim = False, _2G = False)
|
||||||
res = self._read_binary(self.sim.filelen)
|
res = self._read_binary(self.sim.filelen)
|
||||||
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(res.apdu)
|
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
|
||||||
algo_3g = ef.algo
|
algo_3g = ef.algo
|
||||||
|
|
||||||
print(" * Current algorithm setting:")
|
print(" * Current algorithm setting:")
|
||||||
|
@ -715,9 +698,10 @@ class Sysmo_isim_sja2(Sysmo_usim):
|
||||||
print(" 3G: %d=%s" % (algo_3g, id_to_str(self.algorithms, algo_3g)))
|
print(" 3G: %d=%s" % (algo_3g, id_to_str(self.algorithms, algo_3g)))
|
||||||
print("")
|
print("")
|
||||||
|
|
||||||
|
|
||||||
# Program new authentication parameters
|
|
||||||
def write_auth_params(self, algo_2g_str, algo_3g_str):
|
def write_auth_params(self, algo_2g_str, algo_3g_str):
|
||||||
|
"""
|
||||||
|
Write new authentication parameters
|
||||||
|
"""
|
||||||
print("Programming Authentication parameters...")
|
print("Programming Authentication parameters...")
|
||||||
self._init()
|
self._init()
|
||||||
|
|
||||||
|
@ -739,28 +723,29 @@ class Sysmo_isim_sja2(Sysmo_usim):
|
||||||
|
|
||||||
self.__select_xsim_auth_key(isim = False, _2G = True)
|
self.__select_xsim_auth_key(isim = False, _2G = True)
|
||||||
res = self._read_binary(self.sim.filelen)
|
res = self._read_binary(self.sim.filelen)
|
||||||
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
|
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
|
||||||
ef.algo = algo_2g
|
ef.algo = algo_2g
|
||||||
self.sim.update_binary(ef.encode())
|
self.sim.update_binary(ef.encode())
|
||||||
|
|
||||||
self.__select_xsim_auth_key(isim = False, _2G = False)
|
self.__select_xsim_auth_key(isim = False, _2G = False)
|
||||||
res = self._read_binary(self.sim.filelen)
|
res = self._read_binary(self.sim.filelen)
|
||||||
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(res.apdu)
|
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
|
||||||
ef.algo = algo_3g
|
ef.algo = algo_3g
|
||||||
self.sim.update_binary(ef.encode())
|
self.sim.update_binary(ef.encode())
|
||||||
|
|
||||||
if self.sim.has_isim:
|
if self.sim.has_isim:
|
||||||
self.__select_xsim_auth_key(isim = True, _2G = False)
|
self.__select_xsim_auth_key(isim = True, _2G = False)
|
||||||
res = self._read_binary(self.sim.filelen)
|
res = self._read_binary(self.sim.filelen)
|
||||||
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(res.apdu)
|
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
|
||||||
ef.algo = algo_3g
|
ef.algo = algo_3g
|
||||||
self.sim.update_binary(ef.encode())
|
self.sim.update_binary(ef.encode())
|
||||||
|
|
||||||
print("")
|
print("")
|
||||||
|
|
||||||
|
|
||||||
# Show current OPc value
|
|
||||||
def show_opc_params(self):
|
def show_opc_params(self):
|
||||||
|
"""
|
||||||
|
Show OP/OPc current configuration. (see also method: write_opc_params).
|
||||||
|
"""
|
||||||
print("Reading OP/c value...")
|
print("Reading OP/c value...")
|
||||||
self._init()
|
self._init()
|
||||||
|
|
||||||
|
@ -768,7 +753,7 @@ class Sysmo_isim_sja2(Sysmo_usim):
|
||||||
print(" * Reading...")
|
print(" * Reading...")
|
||||||
self.__select_xsim_auth_key(isim = False, _2G = False)
|
self.__select_xsim_auth_key(isim = False, _2G = False)
|
||||||
res = self._read_binary(self.sim.filelen)
|
res = self._read_binary(self.sim.filelen)
|
||||||
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(res.apdu)
|
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
|
||||||
|
|
||||||
if ef.use_opc:
|
if ef.use_opc:
|
||||||
mode_str = "OPc"
|
mode_str = "OPc"
|
||||||
|
@ -779,9 +764,10 @@ class Sysmo_isim_sja2(Sysmo_usim):
|
||||||
print(" %s: %s" % (mode_str, hexdump(ef.opc)))
|
print(" %s: %s" % (mode_str, hexdump(ef.opc)))
|
||||||
print("")
|
print("")
|
||||||
|
|
||||||
|
|
||||||
# Program new OPc value
|
|
||||||
def write_opc_params(self, select, op):
|
def write_opc_params(self, select, op):
|
||||||
|
"""
|
||||||
|
Program new OPc value
|
||||||
|
"""
|
||||||
if select:
|
if select:
|
||||||
print("Writing OPc value...")
|
print("Writing OPc value...")
|
||||||
mode_str = "OPc"
|
mode_str = "OPc"
|
||||||
|
@ -794,10 +780,9 @@ class Sysmo_isim_sja2(Sysmo_usim):
|
||||||
print(" %s: %s" % (mode_str, hexdump(op)))
|
print(" %s: %s" % (mode_str, hexdump(op)))
|
||||||
|
|
||||||
print(" * Programming...")
|
print(" * Programming...")
|
||||||
|
|
||||||
self.__select_xsim_auth_key(isim = False, _2G = True)
|
self.__select_xsim_auth_key(isim = False, _2G = True)
|
||||||
res = self._read_binary(self.sim.filelen)
|
res = self._read_binary(self.sim.filelen)
|
||||||
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
|
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
|
||||||
ef.opc = op
|
ef.opc = op
|
||||||
ef.use_opc = bool(select)
|
ef.use_opc = bool(select)
|
||||||
self.sim.update_binary(ef.encode())
|
self.sim.update_binary(ef.encode())
|
||||||
|
@ -805,23 +790,24 @@ class Sysmo_isim_sja2(Sysmo_usim):
|
||||||
if self.sim.has_isim:
|
if self.sim.has_isim:
|
||||||
self.__select_xsim_auth_key(isim = True, _2G = False)
|
self.__select_xsim_auth_key(isim = True, _2G = False)
|
||||||
res = self._read_binary(self.sim.filelen)
|
res = self._read_binary(self.sim.filelen)
|
||||||
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(res.apdu)
|
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
|
||||||
ef.opc = op
|
ef.opc = op
|
||||||
ef.use_opc = bool(select)
|
ef.use_opc = bool(select)
|
||||||
self.sim.update_binary(ef.encode())
|
self.sim.update_binary(ef.encode())
|
||||||
|
|
||||||
self.__select_xsim_auth_key(isim = False, _2G = False)
|
self.__select_xsim_auth_key(isim = False, _2G = False)
|
||||||
res = self._read_binary(self.sim.filelen)
|
res = self._read_binary(self.sim.filelen)
|
||||||
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(res.apdu)
|
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
|
||||||
ef.opc = op
|
ef.opc = op
|
||||||
ef.use_opc = bool(select)
|
ef.use_opc = bool(select)
|
||||||
self.sim.update_binary(ef.encode())
|
self.sim.update_binary(ef.encode())
|
||||||
|
|
||||||
print("")
|
print("")
|
||||||
|
|
||||||
|
|
||||||
# Show current milenage SQN parameters
|
|
||||||
def show_milenage_sqn_params(self):
|
def show_milenage_sqn_params(self):
|
||||||
|
"""
|
||||||
|
Show current milenage SQN parameters
|
||||||
|
"""
|
||||||
print("Reading Milenage Sequence parameters...")
|
print("Reading Milenage Sequence parameters...")
|
||||||
self._init()
|
self._init()
|
||||||
|
|
||||||
|
@ -830,7 +816,7 @@ class Sysmo_isim_sja2(Sysmo_usim):
|
||||||
self.sim.card.SELECT_ADF_USIM()
|
self.sim.card.SELECT_ADF_USIM()
|
||||||
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_SQN)
|
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_SQN)
|
||||||
res = self._read_binary(self.sim.filelen)
|
res = self._read_binary(self.sim.filelen)
|
||||||
print(SYSMO_ISIMSJA2_FILE_EF_USIM_SQN(res.apdu))
|
print(SYSMO_ISIMSJAX_FILE_EF_USIM_SQN(res.apdu))
|
||||||
|
|
||||||
if self.sim.has_isim:
|
if self.sim.has_isim:
|
||||||
print(" * Current SQN Configuration for ADF_ISIM:")
|
print(" * Current SQN Configuration for ADF_ISIM:")
|
||||||
|
@ -838,13 +824,14 @@ class Sysmo_isim_sja2(Sysmo_usim):
|
||||||
self.sim.card.SELECT_ADF_ISIM()
|
self.sim.card.SELECT_ADF_ISIM()
|
||||||
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_SQN)
|
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_SQN)
|
||||||
res = self._read_binary(self.sim.filelen)
|
res = self._read_binary(self.sim.filelen)
|
||||||
print(SYSMO_ISIMSJA2_FILE_EF_USIM_SQN(res.apdu))
|
print(SYSMO_ISIMSJAX_FILE_EF_USIM_SQN(res.apdu))
|
||||||
|
|
||||||
print("")
|
print("")
|
||||||
|
|
||||||
|
|
||||||
# Reset milenage SQN configuration
|
|
||||||
def reset_milenage_sqn_params(self):
|
def reset_milenage_sqn_params(self):
|
||||||
|
"""
|
||||||
|
Reset milenage SQN configuration
|
||||||
|
"""
|
||||||
print(" * Resetting SQN Configuration to defaults...")
|
print(" * Resetting SQN Configuration to defaults...")
|
||||||
self._init()
|
self._init()
|
||||||
|
|
||||||
|
@ -853,18 +840,17 @@ class Sysmo_isim_sja2(Sysmo_usim):
|
||||||
|
|
||||||
self.sim.card.SELECT_ADF_USIM()
|
self.sim.card.SELECT_ADF_USIM()
|
||||||
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_SQN)
|
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_SQN)
|
||||||
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_SQN()
|
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_SQN()
|
||||||
self.sim.update_binary(ef.encode())
|
self.sim.update_binary(ef.encode())
|
||||||
|
|
||||||
if self.sim.has_isim:
|
if self.sim.has_isim:
|
||||||
self.sim.card.SELECT_ADF_ISIM()
|
self.sim.card.SELECT_ADF_ISIM()
|
||||||
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_SQN)
|
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_SQN)
|
||||||
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_SQN()
|
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_SQN()
|
||||||
self.sim.update_binary(ef.encode())
|
self.sim.update_binary(ef.encode())
|
||||||
|
|
||||||
print("")
|
print("")
|
||||||
|
|
||||||
|
|
||||||
class Sysmo_isim_sja5(Sysmo_isim_sja2):
|
class Sysmo_isim_sja5(Sysmo_isim_sja2):
|
||||||
algorithms = sysmo_isimsja5_algorithms
|
algorithms = sysmo_isimsja5_algorithms
|
||||||
|
|
||||||
|
|
|
@ -471,7 +471,7 @@ class Sysmo_usim_sjs1(Sysmo_usim):
|
||||||
|
|
||||||
|
|
||||||
# Show current KI value
|
# Show current KI value
|
||||||
def show_ki_params(self):
|
def show_key_params(self):
|
||||||
print("Reading KI value...")
|
print("Reading KI value...")
|
||||||
print(" * Reading...")
|
print(" * Reading...")
|
||||||
self.sim.select(GSM_SIM_DF_GSM)
|
self.sim.select(GSM_SIM_DF_GSM)
|
||||||
|
@ -484,7 +484,7 @@ class Sysmo_usim_sjs1(Sysmo_usim):
|
||||||
|
|
||||||
|
|
||||||
# Program new KI value
|
# Program new KI value
|
||||||
def write_ki_params(self, ki):
|
def write_key_params(self, ki):
|
||||||
print("Writing KI value...")
|
print("Writing KI value...")
|
||||||
self._init()
|
self._init()
|
||||||
|
|
||||||
|
|
|
@ -13,10 +13,10 @@ Authenticating...
|
||||||
* Authentication successful
|
* Authentication successful
|
||||||
* Remaining attempts: 3
|
* Remaining attempts: 3
|
||||||
|
|
||||||
Writing KI value...
|
Writing Key value...
|
||||||
* Initalizing...
|
* Initalizing...
|
||||||
* New KI setting:
|
* New Key setting:
|
||||||
KI: a0b1c2d3e4f5061728394a5b6c7d8e9f
|
Key: a0b1c2d3e4f5061728394a5b6c7d8e9f
|
||||||
* Programming...
|
* Programming...
|
||||||
|
|
||||||
Done!
|
Done!
|
||||||
|
@ -35,11 +35,11 @@ Authenticating...
|
||||||
* Authentication successful
|
* Authentication successful
|
||||||
* Remaining attempts: 3
|
* Remaining attempts: 3
|
||||||
|
|
||||||
Reading KI value...
|
Reading Key value...
|
||||||
* Initalizing...
|
* Initalizing...
|
||||||
* Reading...
|
* Reading...
|
||||||
* Current KI setting:
|
* Current Key setting:
|
||||||
KI: a0b1c2d3e4f5061728394a5b6c7d8e9f
|
Key: a0b1c2d3e4f5061728394a5b6c7d8e9f
|
||||||
|
|
||||||
Done!
|
Done!
|
||||||
sysmoISIM-SJA2 parameterization tool
|
sysmoISIM-SJA2 parameterization tool
|
||||||
|
@ -57,10 +57,10 @@ Authenticating...
|
||||||
* Authentication successful
|
* Authentication successful
|
||||||
* Remaining attempts: 3
|
* Remaining attempts: 3
|
||||||
|
|
||||||
Writing KI value...
|
Writing Key value...
|
||||||
* Initalizing...
|
* Initalizing...
|
||||||
* New KI setting:
|
* New Key setting:
|
||||||
KI: d7882eae7cd14f06108c55f8e5cffe93
|
Key: d7882eae7cd14f06108c55f8e5cffe93
|
||||||
* Programming...
|
* Programming...
|
||||||
|
|
||||||
Done!
|
Done!
|
||||||
|
@ -79,10 +79,10 @@ Authenticating...
|
||||||
* Authentication successful
|
* Authentication successful
|
||||||
* Remaining attempts: 3
|
* Remaining attempts: 3
|
||||||
|
|
||||||
Reading KI value...
|
Reading Key value...
|
||||||
* Initalizing...
|
* Initalizing...
|
||||||
* Reading...
|
* Reading...
|
||||||
* Current KI setting:
|
* Current Key setting:
|
||||||
KI: d7882eae7cd14f06108c55f8e5cffe93
|
Key: d7882eae7cd14f06108c55f8e5cffe93
|
||||||
|
|
||||||
Done!
|
Done!
|
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
# default: execute all tests
|
# default: execute all tests
|
||||||
TESTS="01_auth.sh 02_algo.sh 03_milenage_par.sh 04_op_opc.sh 05_ki.sh 06_seq.sh 07_mnclen.sh"
|
TESTS="01_auth.sh 02_algo.sh 03_milenage_par.sh 04_op_opc.sh 05_key.sh 06_seq.sh 07_mnclen.sh"
|
||||||
|
|
||||||
# if command line specifies some specific tests, execute only those
|
# if command line specifies some specific tests, execute only those
|
||||||
if [ $# -ge 1 ]; then
|
if [ $# -ge 1 ]; then
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
TOOL=../../sysmo-isim-tool.sja2.py
|
TOOL=../../sysmo-isim-tool.sja2.py
|
||||||
# data for the test scripts. The values have to match the SIM card inserted while executing the test
|
# data for the test scripts. The values have to match the SIM card inserted while executing the test
|
||||||
IMSI=901700000046734
|
IMSI=901700000046734
|
||||||
ADMPIN=67225880 # <==== CHANGE THIS TO THE ADM1 KEY OF YOUR TEST CARD!
|
ADMPIN=71365692 # <==== CHANGE THIS TO THE ADM1 KEY OF YOUR TEST CARD!
|
||||||
KI=D7882EAE7CD14F06108C55F8E5CFFE93
|
KI=D7882EAE7CD14F06108C55F8E5CFFE93
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
# default: execute all tests
|
# default: execute all tests
|
||||||
TESTS="01_auth.sh 02_mode_read.sh 03_mode_write.sh 04_algo.sh 05_milenage_par.sh 06_op_opc.sh 07_ki.sh 08_seq.sh 09_mnclen.sh"
|
TESTS="01_auth.sh 02_mode_read.sh 03_mode_write.sh 04_algo.sh 05_milenage_par.sh 06_op_opc.sh 07_key.sh 08_seq.sh 09_mnclen.sh"
|
||||||
|
|
||||||
# if command line specifies some specific tests, execute only those
|
# if command line specifies some specific tests, execute only those
|
||||||
if [ $# -ge 1 ]; then
|
if [ $# -ge 1 ]; then
|
||||||
|
|
|
@ -2,5 +2,5 @@ TOOL=../../sysmo-usim-tool.sjs1.py
|
||||||
# data for the test scripts. The values have to match the SIM card inserted while executing the test
|
# data for the test scripts. The values have to match the SIM card inserted while executing the test
|
||||||
ICCID=8988211320300000028
|
ICCID=8988211320300000028
|
||||||
IMSI=262423203000002
|
IMSI=262423203000002
|
||||||
ADMPIN=55538407 # <==== CHANGE THIS TO THE ADM1 KEY OF YOUR TEST CARD!
|
ADMPIN=05039324 # <==== CHANGE THIS TO THE ADM1 KEY OF YOUR TEST CARD!
|
||||||
KI=94c7f52c8c7337fad1af3a73b17b56ac
|
KI=94c7f52c8c7337fad1af3a73b17b56ac
|
||||||
|
|
10
utils.py
10
utils.py
|
@ -99,11 +99,15 @@ def id_to_str(table, nr):
|
||||||
return dict_by_nr.get(nr) or '(invalid)'
|
return dict_by_nr.get(nr) or '(invalid)'
|
||||||
|
|
||||||
|
|
||||||
# Convert a string back to its ID by looking it up in a given table
|
# Convert a string back to its ID by looking it up in a given table. In
|
||||||
def str_to_id(table, string):
|
# case the string is not found in the table, use a safe default (optional).
|
||||||
|
def str_to_id(table, string, safe_default = None):
|
||||||
dict_by_name = dict([(name.upper(), nr) for nr, name in table])
|
dict_by_name = dict([(name.upper(), nr) for nr, name in table])
|
||||||
id = dict_by_name.get(string.upper())
|
id = dict_by_name.get(string.upper())
|
||||||
|
|
||||||
if id is None:
|
if id is None:
|
||||||
raise ValueError('identifier (\"%s\") not in table %s' % (string, str(table)))
|
if safe_default != None:
|
||||||
|
return safe_default
|
||||||
|
else:
|
||||||
|
raise ValueError('identifier (\"%s\") not in table %s' % (string, str(table)))
|
||||||
return id
|
return id
|
||||||
|
|
Loading…
Reference in New Issue