Compare commits

...

10 Commits

Author SHA1 Message Date
Philipp Maier bb4d30a81b sysmo_isim_sja2: convert #comments to python comments where possible
Related: SYS#6473
2023-06-23 09:53:47 +02:00
Philipp Maier b5b0dc6fd4 sysmo_isim_sja2: rename classes SYSMO_ISIMSJA2_ to SYSMO_ISIMSJAX_
The classes that model the file layout are applicable on both card
models, so lets replace the 2 with an X
2023-06-23 09:53:47 +02:00
Philipp Maier 5f39c63861 sysmo_isim_sja2: Add comments to explain sysmo_isimsjax_algorithms
Related: OS#6473
2023-06-23 09:53:47 +02:00
Philipp Maier aeafcc6e70 sysmo_isim_sja2: define return types for __str__ and encode methods
Related: OS#6473
2023-06-23 09:53:47 +02:00
Philipp Maier 0b59551050 sysmo_isim_sja2: fix file naming in comment
Related: SYS#6473
2023-06-23 09:53:47 +02:00
Philipp Maier 720aa1ac55 sysmo_isim_sja2: update copyright header
Related: SYS#6473
2023-06-23 09:53:47 +02:00
Philipp Maier 026415636d sysmo_isim_sja2: cosmetic: remove unnecessary new lines
Related: SYS#6473
2023-06-23 09:53:47 +02:00
Philipp Maier 86a6bb6ea5 tests: restore incorrect ADM PIN
The test data, which was submitted with the previous patch also
contained incorrect ADM PIN data, which was not intended. This patch
fixes this.

Related: SYS#6473
2023-06-22 21:53:32 +02:00
Philipp Maier 4e196ceaf4 cosmetic: rename Ki to Key
sysmo-isim-sja2 and sysmo-isim-sjs1 support multiple different
authentication algorithms. The commandline options and the log output
always speaks of "Ki", this is only correct when COMP128 is used. So
lets be more generic and call it "Key" rather then "Ki".

Related: OS#6473
2023-06-22 21:46:24 +02:00
Philipp Maier 7209731730 utils: allow to use a safe default with str_to_id
The input to str_to_id may originate from user input. It may be that the
input is not found in the given table. In this case an exception is
raised. This may be impractical in some cases. Let's add an optional
safe default that is returned in case the string is not found, this can
be used to either select default settings or to detect an error.

Related: SYS#6473
2023-06-22 21:39:04 +02:00
10 changed files with 129 additions and 139 deletions

View File

@ -28,8 +28,8 @@ import sys, getopt
COMMON_GETOPTS = "hfa:J:nN:lL:kK:tT:oO:C:sSip"
COMMON_GETOPTS_LONG = ["help", "force", "adm1=", "set-imsi=", "mnclen",
"set-mnclen=", "milenage", "set-milenage=", "ki",
"set-ki=", "auth", "set-auth=", "opc", "set-op=",
"set-mnclen=", "milenage", "set-milenage=", "key",
"set-key=", "auth", "set-auth=", "opc", "set-op=",
"set-opc=", "seq-parameters", "reset-seq-parameters"
"iccid", "aid"]
@ -46,8 +46,8 @@ class Common():
show_mnclen = None
show_milenage = False
write_milenage = None
show_ki = None
write_ki = None
show_key = None
write_key = None
show_auth = False
write_auth = None
show_opc = False
@ -91,10 +91,10 @@ class Common():
self.show_milenage = True
elif opt in ("-L", "--set-milenage"):
self.write_milenage = asciihex_to_list(arg)
elif opt in ("-k", "--ki"):
self.show_ki = True
elif opt in ("-K", "--set-ki"):
self.write_ki = asciihex_to_list(arg)
elif opt in ("-k", "--key"):
self.show_key = True
elif opt in ("-K", "--set-key"):
self.write_key = asciihex_to_list(arg)
elif opt in ("-t", "--auth"):
self.show_auth = True
elif opt in ("-T", "--set-auth"):
@ -141,8 +141,8 @@ class Common():
print(" -N, --set-mnclen ............... Set MNC length value")
print(" -l, --milenage ................. Show milenage parameters")
print(" -L, --set-milenage HEXSTRING ... Set milenage parameters")
print(" -k, --ki ....................... Show KI value")
print(" -K, --set-ki ................... Set KI value")
print(" -k, --key ...................... Show auth key value")
print(" -K, --set-key .................. Set auth key value")
print(" -t, --auth ..................... Show Authentication algorithms")
print(" -T, --set-auth 2G:3G ........... Set 2G/3G Auth algo (e.g. COMP128v1:COMP128v1)")
print(" -o, --opc ...................... Show OP/c configuration")
@ -182,11 +182,11 @@ class Common():
if self.show_milenage:
self.sim.show_milenage_params()
if self.write_ki:
self.sim.write_ki_params(self.write_ki)
if self.write_key:
self.sim.write_key_params(self.write_key)
if self.show_ki:
self.sim.show_ki_params()
if self.show_key:
self.sim.show_key_params()
if self.show_auth:
self.sim.show_auth_params()

View File

@ -2,9 +2,9 @@
# -*- 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
Author: Philipp Maier
@ -40,15 +40,15 @@ import math
# |
# +--[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)
# |
# +--[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.
@ -74,6 +74,7 @@ SYSMO_ISIMSJA5_ALGO_TUAK = 0x06
SYSMO_ISIMSJA5_ALGO_XOR_2G = 0x0E
SYSMO_ISIMSJA2_ALGO_XOR = 0x0F
# Algorithms that are supported by sysmo-isim-sja2 (and also sysmo-isim-sja5)
sysmo_isimsja2_algorithms = [
(SYSMO_ISIMSJA2_ALGO_COMP12V1, 'COMP128v1'),
(SYSMO_ISIMSJA2_ALGO_COMP12V2, 'COMP128v2'),
@ -83,12 +84,14 @@ sysmo_isimsja2_algorithms = [
(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_ALGO_XOR_2G, 'XOR-2G'),
(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
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):
if content == None:
return
header = content[0]
self.algo = header & 0x0F
self.use_opc = bool((header >> 4) & 1)
if (header >> 5) & 1:
self.sres_dev_func = 2
else:
self.sres_dev_func = 1
def __str__(self):
def __str__(self) -> str:
dump = ""
pfx = " "
@ -130,8 +130,7 @@ class SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY:
return dump
def encode(self):
def encode(self) -> list:
out = [0x00]
out[0] = self.algo & 0x0F
if self.use_opc == True:
@ -140,7 +139,7 @@ class SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY:
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
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.opc = content[17:33]
def __str__(self):
def __str__(self) -> str:
dump = ""
pfx = " "
@ -176,13 +174,13 @@ class SYSMO_ISIMSJA2_FILE_EF_SIM_AUTH_KEY(SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY):
return dump
def encode(self):
def encode(self) -> list:
out = SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY.encode(self)
out += self.key + self.opc
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
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:
return
SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY.__init__(self, content)
SYSMO_ISIMSJAX_FILE_EF_XSIM_AUTH_KEY.__init__(self, content)
header = content[0]
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:
self.opc = content[17:33]
def __str__(self):
def __str__(self) -> str:
dump = ""
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:
dump += pfx + "3G: Return full 8-byte RES\n"
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
def encode(self):
out = SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY.encode(self)
def encode(self) -> list:
out = SYSMO_ISIMSJAX_FILE_EF_XSIM_AUTH_KEY.encode(self)
if self.full_res == True:
out[0] |= 1 << 6
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, 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
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
@ -278,7 +275,6 @@ class SYSMO_ISIMSJA2_FILE_EF_MILENAGE_CFG:
C5 = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08]
def __init__(self, content = None):
if content == None:
return
@ -295,8 +291,7 @@ class SYSMO_ISIMSJA2_FILE_EF_MILENAGE_CFG:
self.C4 = content[53:69]
self.C5 = content[69:85]
def __str__(self):
def __str__(self) -> str:
dump = " R1: " + str(hex(self.R1)) + "\n"
dump += " R2: " + str(hex(self.R2)) + "\n"
dump += " R3: " + str(hex(self.R3)) + "\n"
@ -309,14 +304,13 @@ class SYSMO_ISIMSJA2_FILE_EF_MILENAGE_CFG:
dump += " C5: " + hexdump(self.C5)
return dump
def encode(self):
def encode(self) -> list:
out = [self.R1, self.R2, self.R3, self.R4, self.R5]
out += self.C1 + self.C2 + self.C3 + self.C4 + self.C5
return out
class SYSMO_ISIMSJA2_FILE_EF_USIM_SQN:
class SYSMO_ISIMSJAX_FILE_EF_USIM_SQN:
# Flag1:
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.freshness_data = content[15:(6*2**self.ind_size_bits)]
def __str__(self):
def __str__(self) -> str:
pfx = " "
dump = ""
dump += "%sIND (bits): %u\n" % (pfx, self.ind_size_bits)
if self.sqn_check_enabled:
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 += "%sAge Limit: %u\n" % (pfx, self.age_limit)
dump += pfx + "Freshness Data:\n" + hexdump(self.freshness_data, True)
return dump
def encode(self):
def encode(self) -> list:
out = [0x00, 0x00]
# Flag1:
@ -445,12 +435,10 @@ class SYSMO_ISIMSJA2_FILE_EF_USIM_SQN:
out += self.freshness_data
return out
def reset(self):
self.freshness_data = [0x00] * (6*2**self.ind_size_bits)
class Sysmo_isim_sja2(Sysmo_usim):
algorithms = sysmo_isimsja2_algorithms
@ -469,7 +457,6 @@ class Sysmo_isim_sja2(Sysmo_usim):
if card_detected == True:
return
# Try card model #2
try:
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:
return
# Exit when we are not able to detect the card
if card_detected != True:
sys.exit(1)
# Show current milenage parameters
def show_milenage_params(self):
"""
Show current milenage parameters
"""
print("Reading Milenage parameters...")
self._init()
@ -515,10 +502,10 @@ class Sysmo_isim_sja2(Sysmo_usim):
print(str(ef))
print("")
# Write new milenage parameters
def write_milenage_params(self, params):
"""
Write new milenage parameters
"""
print("Programming Milenage parameters...")
if (len(params) < 85):
@ -545,14 +532,12 @@ class Sysmo_isim_sja2(Sysmo_usim):
self.sim.update_binary(ef_milenage_cfg.encode())
print("")
# Select DF_SYSTEM/EF_SIM_AUTH_KEY
def __select_ef_sim_auth_key(self):
self.sim.select(GSM_SIM_MF)
self.sim.select(SYSMO_ISIMSJA2_DF_SYSTEM)
self.sim.select(SYSMO_ISIMSJA2_EF_SIM_AUTH_KEY)
# Authentication keys exist in various different files, which are
# similar, thie method simplifies the selection of those files
def __select_xsim_auth_key(self, isim = False, _2G = False):
@ -567,7 +552,6 @@ class Sysmo_isim_sja2(Sysmo_usim):
else:
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_AUTH_KEY)
# In the SJA2 model the key material and the algorithm configuration
# is distributed over multiple files, which may also have redundant
# 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)
res = self._read_binary(self.sim.filelen)
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:
# ADF_ISIM/EF_ISIM_AUTH_KEY_2G:
self.__select_xsim_auth_key(isim = True, _2G = True)
res = self._read_binary(self.sim.filelen)
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:
self.__select_xsim_auth_key(isim = False, _2G = False)
res = self._read_binary(self.sim.filelen)
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:
# ADF_ISIM/EF_ISIM_AUTH_KEY:
self.__select_xsim_auth_key(isim = True, _2G = False)
res = self._read_binary(self.sim.filelen)
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:
self.sim.select(GSM_SIM_MF)
@ -633,7 +617,7 @@ class Sysmo_isim_sja2(Sysmo_usim):
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_SQN)
res = self._read_binary(self.sim.filelen)
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:
# ADF_USIM/EF_ISIM_SQN:
@ -642,72 +626,71 @@ class Sysmo_isim_sja2(Sysmo_usim):
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_SQN)
res = self._read_binary(self.sim.filelen)
print(" * ADF_ISIM/EF_ISIM_SQN:")
print(SYSMO_ISIMSJA2_FILE_EF_USIM_SQN(res.apdu))
print(SYSMO_ISIMSJAX_FILE_EF_USIM_SQN(res.apdu))
# Show current KI value
def show_ki_params(self):
print("Reading KI value...")
def show_key_params(self):
"""
Show current Key value
"""
print("Reading Key value...")
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...")
self.__select_xsim_auth_key(isim = False, _2G = True)
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(" KI: " + hexdump(ef.key))
print(" * Current Key setting:")
print(" Key: " + hexdump(ef.key))
print("")
# Program new KI value
def write_ki_params(self, ki):
print("Writing KI value...")
def write_key_params(self, key):
"""
Program new Key value
"""
print("Writing Key value...")
self._init()
print(" * New KI setting:")
print(" KI: " + hexdump(ki))
print(" * New Key setting:")
print(" Key: " + hexdump(key))
print(" * Programming...")
self.__select_xsim_auth_key(isim = False, _2G = True)
res = self._read_binary(self.sim.filelen)
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
ef.key = ki
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
ef.key = key
self.sim.update_binary(ef.encode())
self.__select_xsim_auth_key(isim = False, _2G = False)
res = self._read_binary(self.sim.filelen)
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(res.apdu)
ef.key = ki
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
ef.key = key
self.sim.update_binary(ef.encode())
if self.sim.has_isim:
self.__select_xsim_auth_key(isim = True, _2G = False)
res = self._read_binary(self.sim.filelen)
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(res.apdu)
ef.key = ki
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
ef.key = key
self.sim.update_binary(ef.encode())
print("")
# Show current athentication parameters
# (Which algorithim is used for which rat?)
def show_auth_params(self):
"""
Show current authentication parameters
"""
print("Reading Authentication parameters...")
self._init()
print(" * Reading...")
self.__select_xsim_auth_key(isim = False, _2G = True)
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
self.__select_xsim_auth_key(isim = False, _2G = False)
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
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("")
# Program new authentication parameters
def write_auth_params(self, algo_2g_str, algo_3g_str):
"""
Write new authentication parameters
"""
print("Programming Authentication parameters...")
self._init()
@ -739,28 +723,29 @@ class Sysmo_isim_sja2(Sysmo_usim):
self.__select_xsim_auth_key(isim = False, _2G = True)
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
self.sim.update_binary(ef.encode())
self.__select_xsim_auth_key(isim = False, _2G = False)
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
self.sim.update_binary(ef.encode())
if self.sim.has_isim:
self.__select_xsim_auth_key(isim = True, _2G = False)
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
self.sim.update_binary(ef.encode())
print("")
# Show current OPc value
def show_opc_params(self):
"""
Show OP/OPc current configuration. (see also method: write_opc_params).
"""
print("Reading OP/c value...")
self._init()
@ -768,7 +753,7 @@ class Sysmo_isim_sja2(Sysmo_usim):
print(" * Reading...")
self.__select_xsim_auth_key(isim = False, _2G = False)
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:
mode_str = "OPc"
@ -779,9 +764,10 @@ class Sysmo_isim_sja2(Sysmo_usim):
print(" %s: %s" % (mode_str, hexdump(ef.opc)))
print("")
# Program new OPc value
def write_opc_params(self, select, op):
"""
Program new OPc value
"""
if select:
print("Writing OPc value...")
mode_str = "OPc"
@ -794,10 +780,9 @@ class Sysmo_isim_sja2(Sysmo_usim):
print(" %s: %s" % (mode_str, hexdump(op)))
print(" * Programming...")
self.__select_xsim_auth_key(isim = False, _2G = True)
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.use_opc = bool(select)
self.sim.update_binary(ef.encode())
@ -805,23 +790,24 @@ class Sysmo_isim_sja2(Sysmo_usim):
if self.sim.has_isim:
self.__select_xsim_auth_key(isim = True, _2G = False)
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.use_opc = bool(select)
self.sim.update_binary(ef.encode())
self.__select_xsim_auth_key(isim = False, _2G = False)
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.use_opc = bool(select)
self.sim.update_binary(ef.encode())
print("")
# Show current milenage SQN parameters
def show_milenage_sqn_params(self):
"""
Show current milenage SQN parameters
"""
print("Reading Milenage Sequence parameters...")
self._init()
@ -830,7 +816,7 @@ class Sysmo_isim_sja2(Sysmo_usim):
self.sim.card.SELECT_ADF_USIM()
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_SQN)
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:
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.select(SYSMO_ISIMSJA2_EF_USIM_SQN)
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("")
# Reset milenage SQN configuration
def reset_milenage_sqn_params(self):
"""
Reset milenage SQN configuration
"""
print(" * Resetting SQN Configuration to defaults...")
self._init()
@ -853,18 +840,17 @@ class Sysmo_isim_sja2(Sysmo_usim):
self.sim.card.SELECT_ADF_USIM()
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())
if self.sim.has_isim:
self.sim.card.SELECT_ADF_ISIM()
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())
print("")
class Sysmo_isim_sja5(Sysmo_isim_sja2):
algorithms = sysmo_isimsja5_algorithms

View File

@ -471,7 +471,7 @@ class Sysmo_usim_sjs1(Sysmo_usim):
# Show current KI value
def show_ki_params(self):
def show_key_params(self):
print("Reading KI value...")
print(" * Reading...")
self.sim.select(GSM_SIM_DF_GSM)
@ -484,7 +484,7 @@ class Sysmo_usim_sjs1(Sysmo_usim):
# Program new KI value
def write_ki_params(self, ki):
def write_key_params(self, ki):
print("Writing KI value...")
self._init()

View File

@ -13,10 +13,10 @@ Authenticating...
* Authentication successful
* Remaining attempts: 3
Writing KI value...
Writing Key value...
* Initalizing...
* New KI setting:
KI: a0b1c2d3e4f5061728394a5b6c7d8e9f
* New Key setting:
Key: a0b1c2d3e4f5061728394a5b6c7d8e9f
* Programming...
Done!
@ -35,11 +35,11 @@ Authenticating...
* Authentication successful
* Remaining attempts: 3
Reading KI value...
Reading Key value...
* Initalizing...
* Reading...
* Current KI setting:
KI: a0b1c2d3e4f5061728394a5b6c7d8e9f
* Current Key setting:
Key: a0b1c2d3e4f5061728394a5b6c7d8e9f
Done!
sysmoISIM-SJA2 parameterization tool
@ -57,10 +57,10 @@ Authenticating...
* Authentication successful
* Remaining attempts: 3
Writing KI value...
Writing Key value...
* Initalizing...
* New KI setting:
KI: d7882eae7cd14f06108c55f8e5cffe93
* New Key setting:
Key: d7882eae7cd14f06108c55f8e5cffe93
* Programming...
Done!
@ -79,10 +79,10 @@ Authenticating...
* Authentication successful
* Remaining attempts: 3
Reading KI value...
Reading Key value...
* Initalizing...
* Reading...
* Current KI setting:
KI: d7882eae7cd14f06108c55f8e5cffe93
* Current Key setting:
Key: d7882eae7cd14f06108c55f8e5cffe93
Done!

View File

@ -1,7 +1,7 @@
#!/bin/sh
# 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 [ $# -ge 1 ]; then

View File

@ -1,7 +1,7 @@
#!/bin/sh
# 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 [ $# -ge 1 ]; then

View File

@ -99,11 +99,15 @@ def id_to_str(table, nr):
return dict_by_nr.get(nr) or '(invalid)'
# Convert a string back to its ID by looking it up in a given table
def str_to_id(table, string):
# Convert a string back to its ID by looking it up in a given table. In
# 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])
id = dict_by_name.get(string.upper())
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