Compare commits

...

3 Commits

Author SHA1 Message Date
Philipp Maier fedf92e536 sysmo_isim_sja2: add full TUAK support and unit-tests
we do not have full TUAK support yet. All we can do so far is to set the
algorithm to TUAK, but we can not set configuration parameters and keys.
This patch adds features to modify the TUAK configuration byte. The key
and the TOP/TOPc is modified using the existing key and OP/OPC
commandline otions.

This patch also addes tests to verify sysmo-isim-tool,sja5.py. This also
includes TUAK.

Related: SYS#6473
2023-06-23 13:53:11 +02:00
Philipp Maier a7a8f8b776 sysmo_isim_sja2: fix OP/OPc display for 4g5g
When the OP/OPc for 4g5g should be displayed, then actually 3g key is displayed,
which is wrong.

Related: SYS#6473
2023-06-23 13:53:11 +02:00
Philipp Maier de8db1c189 sysmo_isim_sja2: improve class model
In the current form we assume that the files that store the key material
and the related configuration parameters have the same layout for all
algorithms. This assumption makes sense since for the currently
supported algorithms (not TUAK) this is indeed true.

(With the exception that there may be RFU bits still set to 1, even
though the spec clearly state those bits should be 0. However, this does
not matter in practice)

With the advent of TUAK longer keys were introduced. This made a new file
layout necessary. Unfortunately this also means that we can not rely on
the coincidence described above. This means we have to be more specific
when reading and writing the files.

This patch adds classes to model the file layout for each algorithm.

We also print the key (and OP/OPc) for each location individually
(2g,3g,4g5g). Even though the programmed key should be the same in all
locations, this allows better diagnosis. Also with the advent of TUAK we
may have different key material in 4g5g location.

Related: SYS#6473
2023-06-23 12:36:43 +02:00
26 changed files with 3157 additions and 169 deletions

View File

@ -32,7 +32,8 @@ from common import *
class Application(Common):
getopt_dump = False
getopt_show_tuak_cfg = False
getopt_write_tuak_cfg = None
# Automatically executed by superclass
def _banner(self):
@ -46,16 +47,26 @@ class Application(Common):
for opt, arg in opts:
if opt in ("-d", "--dump"):
self.getopt_dump = True
elif opt in ("-w", "--tuak-cfg"):
self.getopt_show_tuak_cfg = True
elif opt in ("-W", "--set-tuak-cfg"):
self.getopt_write_tuak_cfg = arg.split(':', 3)
# Automatically executed by superclass when -h or --help is supplied as option
def _helptext(self):
print(" -d, --dump ..................... Dump propritary file contents")
print(" -w, --tuak-cfg ................. Show TUAK configuration")
print(" -W, --set-tuak-cfg R:M:C:K ..... Set TUAK configuration")
print("")
print(" For Option -T, the following algorithms are valid:")
print('\n'.join([' %d %s' % entry for entry in sysmo_isimsja5_algorithms]))
print("")
print(" For Option -W, the following values are applicable:")
print(" R = RES-Size in bits: 32, 64, 128 or 256")
print(" M = MAC-A and MAC-S size in bits: 64, 128 or 256")
print(" C = CK and IK size in bits: 128 or 256")
print(" K = Number of Keccak iterations: 1-255")
print("")
# Automatically executed by superclass before _execute() is called
def _init(self):
@ -67,11 +78,15 @@ class Application(Common):
if self.getopt_dump:
self.sim.dump()
elif self.getopt_show_tuak_cfg:
self.sim.show_tuak_cfg()
elif self.getopt_write_tuak_cfg:
self.sim.write_tuak_cfg(self.getopt_write_tuak_cfg[0], self.getopt_write_tuak_cfg[1], \
self.getopt_write_tuak_cfg[2], self.getopt_write_tuak_cfg[3])
def main(argv):
Application(argv, "d", ["dump"], True)
Application(argv, "dwW:", ["dump"], True)
if __name__ == "__main__":

View File

@ -91,165 +91,367 @@ sysmo_isimsja5_algorithms = sysmo_isimsja2_algorithms + [
(SYSMO_ISIMSJA5_ALGO_TUAK, 'TUAK'),
]
# Algorithms that use a 16 byte Key in the familiar format of sysmo-isim-sja2
sysmo_isimsjax_16_byte_key_algorithms = [
SYSMO_ISIMSJA2_ALGO_COMP12V1,
SYSMO_ISIMSJA2_ALGO_COMP12V2,
SYSMO_ISIMSJA2_ALGO_COMP12V3,
SYSMO_ISIMSJA2_ALGO_MILENAGE,
SYSMO_ISIMSJA2_ALGO_SHA1AKA,
SYSMO_ISIMSJA2_ALGO_XOR,
SYSMO_ISIMSJA5_ALGO_XOR_2G,
]
# TUAK configuration byte
SYSMO_ISIMSJA5_TUAK_RES_SIZE_32_BIT = 0
SYSMO_ISIMSJA5_TUAK_RES_SIZE_64_BIT = 1
SYSMO_ISIMSJA5_TUAK_RES_SIZE_128_BIT = 2
SYSMO_ISIMSJA5_TUAK_RES_SIZE_256_BIT = 3
SYSMO_ISIMSJA5_TUAK_MAC_SIZE_64_BIT = 0
SYSMO_ISIMSJA5_TUAK_MAC_SIZE_128_BIT = 1
SYSMO_ISIMSJA5_TUAK_MAC_SIZE_256_BIT = 2
SYSMO_ISIMSJA5_TUAK_CKIK_SIZE_128_BIT = 0
SYSMO_ISIMSJA5_TUAK_CKIK_SIZE_256_BIT = 1
sysmo_isimsja5_res_sizes = [
(SYSMO_ISIMSJA5_TUAK_RES_SIZE_32_BIT, "32"),
(SYSMO_ISIMSJA5_TUAK_RES_SIZE_64_BIT, "64"),
(SYSMO_ISIMSJA5_TUAK_RES_SIZE_128_BIT, "128"),
(SYSMO_ISIMSJA5_TUAK_RES_SIZE_256_BIT, "256")
]
sysmo_isimsja5_mac_sizes = [
(SYSMO_ISIMSJA5_TUAK_MAC_SIZE_64_BIT, "64"),
(SYSMO_ISIMSJA5_TUAK_MAC_SIZE_128_BIT, "128"),
(SYSMO_ISIMSJA5_TUAK_MAC_SIZE_256_BIT, "256")
]
sysmo_isimsja5_ckik_sizes = [
(SYSMO_ISIMSJA5_TUAK_CKIK_SIZE_128_BIT, "128"),
(SYSMO_ISIMSJA5_TUAK_CKIK_SIZE_256_BIT, "256")
]
sysmo_isimsjax_op_opc = [
(True, 'OPc'),
(False, 'OP'),
]
sysmo_isimsja5_top_topc = [
(True, 'TOPc'),
(False, 'TOP'),
]
class SYSMO_ISIMSJAX_ALGO_PARS_MILENAGE:
use_opc = False
sres_dev_func = 1
four_byte_res = 0 #sysmo-usim-sja5 only
def __init__(self, content = None):
if content == None:
return
header = content[0]
self.use_opc = bool((header >> 4) & 1)
if (header >> 5) & 1:
self.sres_dev_func = 2
self.four_byte_res = bool((header >> 6) & 1)
def __str__(self) -> str:
dump = ""
pfx = " "
if self.use_opc == True:
dump += pfx + "use OPc\n"
else:
dump += pfx + "use OP\n"
dump += pfx + "use SRES deviation function " + str(self.sres_dev_func) + "\n"
if self.four_byte_res:
dump += pfx + "Return 4 byte RES\n"
else:
dump += pfx + "Return full 8 byte RES\n"
return dump
def encode(self) -> int:
out = 0x00
if self.use_opc == True:
out |= 1 << 4
out |= ((self.sres_dev_func-1) & 1) << 5
out |= ((self.four_byte_res) & 1) << 6
return out
class SYSMO_ISIMSJAX_ALGO_PARS_SHA1AKA:
four_byte_res = 0 #sysmo-usim-sja5 only
def __init__(self, content = None):
if content == None:
return
header = content[0]
self.four_byte_res = bool((header >> 6) & 1)
def __str__(self) -> str:
dump = ""
pfx = " "
if self.four_byte_res:
dump += pfx + "Return 4 byte RES\n"
else:
dump += pfx + "Return full 8 byte RES (default)\n"
return dump
def encode(self) -> int:
out = 0x00
out |= ((self.four_byte_res) & 1) << 6
return out
class SYSMO_ISIMSJAX_ALGO_PARS_XOR:
sres_dev_func = 1
four_byte_res = 0
sixteen_byte_res = 0 #Return 16 byte RES (ignores full_res)
def __init__(self, content = None):
if content == None:
return
header = content[0]
if (header >> 5) & 1:
self.sres_dev_func = 2
self.four_byte_res = bool((header >> 6) & 1)
self.sixteen_byte_res = bool((header >> 7) & 1)
def __str__(self) -> str:
dump = ""
pfx = " "
dump += pfx + "use SRES deviation function" + str(self.sres_dev_func) + "\n"
if self.sixteen_byte_res:
dump += pfx + "Return extended 16 byte RES\n"
elif self.four_byte_res:
dump += pfx + "Return 4 byte RES\n"
else:
dump += pfx + "Return full 8 byte RES (default)\n"
return dump
def encode(self) -> int:
out = 0x00
out |= ((self.sres_dev_func-1) & 1) << 5
out |= ((self.four_byte_res) & 1) << 6
out |= ((self.sixteen_byte_res) & 1) << 7
return out
class SYSMO_ISIMSJA5_ALGO_PARS_TUAK:
use_topc = False
sres_dev_func = 1
use_256_bit_key = False
def __init__(self, content = None):
if content == None:
return
header = content[0]
self.use_topc = bool((header >> 4) & 1)
if (header >> 5) & 1:
self.sres_dev_func = 2
self.use_256_bit_key = bool((header >> 6) & 1)
def __str__(self) -> str:
dump = ""
pfx = " "
if self.use_topc == True:
dump += pfx + "use TOPc\n"
else:
dump += pfx + "use TOP\n"
dump += pfx + "use SRES deviation function " + str(self.sres_dev_func) + "\n"
if self.use_256_bit_key:
dump += pfx + "256 bit key length\n"
else:
dump += pfx + "128 bit key length\n"
return dump
def encode(self) -> int:
out = 0x00
if self.use_topc == True:
out |= 1 << 4
out |= ((self.sres_dev_func-1) & 1) << 5
out |= ((self.use_256_bit_key) & 1) << 6
return out
class SYSMO_ISIMSJAX_FILE_EF_XSIM_AUTH_KEY:
"""
Superclass model that generates that handles the header byte of
Superclass model that generates and parses the header byte of
SYSMO_ISIMSJA2_EF_USIM_AUTH_KEY, SYSMO_ISIMSJA2_EF_USIM_AUTH_KEY_2G
and SYSMO_ISIMSJA2_EF_USIM_AUTH_KEY_GBA.
"""
algo = SYSMO_ISIMSJA2_ALGO_COMP12V1
use_opc = False
sres_dev_func = 1
algo_pars = None
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
if self.algo == SYSMO_ISIMSJA2_ALGO_MILENAGE:
self.algo_pars = SYSMO_ISIMSJAX_ALGO_PARS_MILENAGE(content)
elif self.algo == SYSMO_ISIMSJA2_ALGO_SHA1AKA:
self.algo_pars = SYSMO_ISIMSJAX_ALGO_PARS_SHA1AKA(content)
elif self.algo == SYSMO_ISIMSJA2_ALGO_XOR:
self.algo_pars = SYSMO_ISIMSJAX_ALGO_PARS_XOR(content)
elif self.algo == SYSMO_ISIMSJA5_ALGO_TUAK:
self.algo_pars = SYSMO_ISIMSJA5_ALGO_PARS_TUAK(content)
def __str__(self) -> str:
dump = ""
pfx = " "
dump += pfx + "Algorithm: "
dump += id_to_str(sysmo_isimsja5_algorithms, self.algo)
dump += "\n"
if self.use_opc == True:
dump += pfx + "Milenage: use OPc\n"
else:
dump += pfx + "Milenage: use OP\n"
dump += pfx + "Milenage: use SRES deviation function " + str(self.sres_dev_func) + "\n"
if self.algo_pars:
dump += str(self.algo_pars)
return dump
def encode(self) -> list:
def encode(self):
out = [0x00]
out[0] = self.algo & 0x0F
if self.use_opc == True:
out[0] |= 1 << 4
out[0] |= ((self.sres_dev_func-1) & 1) << 5
if self.algo_pars:
out[0] |= self.algo_pars.encode()
return out
class SYSMO_ISIMSJAX_ALGO_KEY_COMP128:
class SYSMO_ISIMSJAX_FILE_EF_SIM_AUTH_KEY(SYSMO_ISIMSJAX_FILE_EF_XSIM_AUTH_KEY):
key = [0xAA] * 16
opc = [0xBB] * 16
ki = [0x00] * 16
def __init__(self, content = None):
if content == None:
return
self.ki = content[1:17]
SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY.__init__(self, content)
self.key = content[1:17]
def __str__(self) -> str:
dump = ""
pfx = " "
dump += pfx + "Ki: " + hexdump(self.ki)
return dump
def encode(self) -> list:
return self.ki
#XOR has the same key length COMP128 (16 byte, no extra data)
class SYSMO_ISIMSJAX_ALGO_KEY_XOR(SYSMO_ISIMSJAX_ALGO_KEY_COMP128):
pass
#SHA1AKA has the same key length COMP128 (16 byte, no extra data)
class SYSMO_ISIMSJAX_ALGO_KEY_SHA1AKA(SYSMO_ISIMSJAX_ALGO_KEY_COMP128):
pass
#Milenage adds a 16 byte OP/c
class SYSMO_ISIMSJAX_ALGO_KEY_MILENAGE(SYSMO_ISIMSJAX_ALGO_KEY_COMP128):
opc = [0x00] * 16
def __init__(self, content = None):
if content == None:
return
super().__init__(content)
self.opc = content[17:33]
def __str__(self) -> str:
dump = ""
pfx = " "
dump += SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY.__str__(self)
if self.algo == SYSMO_ISIMSJA2_ALGO_MILENAGE:
dump += pfx + "Key: " + hexdump(self.key) + "\n"
dump += pfx + "OPc: " + hexdump(self.opc)
elif self.algo == SYSMO_ISIMSJA2_ALGO_XOR:
dump += pfx + "Key: " + hexdump(self.key) + "\n"
dump += pfx + "OPc: " + hexdump(self.opc)
elif self.algo == SYSMO_ISIMSJA2_ALGO_SHA1AKA:
dump += pfx + "Root key: " + hexdump(self.key) + "\n"
dump += pfx + "OPc: " + hexdump(self.opc) + " (unused)"
else:
dump += pfx + "Key: " + hexdump(self.key) + "\n"
dump += pfx + "OPc: " + hexdump(self.opc) + " (unused)"
dump += super().__str__()
dump += "\n"
dump += pfx + "OPc: " + hexdump(self.opc)
return dump
def encode(self) -> list:
return super().encode() + self.opc
class SYSMO_ISIMSJAX_ALGO_KEY_TUAK:
res_size = 0 #3 bit value
mac_size = 0 #3 bit value
ckik_size = 0 #1 bit value
num_keccak = 0 #1 byte value
topc = [0x00] * 32
key = [0x00] * 32
def __init__(self, content = None):
if content == None:
return
self.res_size = int(content[1] & 7)
self.mac_size = int((content[1] >> 3) & 7)
self.ckik_size = bool((content[1] >> 6) & 1)
self.num_keccak = content[2]
self.topc = content[3:35]
self.key = content[35:67]
def __str__(self) -> str:
dump = ""
pfx = " "
dump += pfx + "RES size: %s bit" % id_to_str(sysmo_isimsja5_res_sizes, self.res_size) + "\n"
dump += pfx + "MAC-A/MAC-S size: %s bit" % id_to_str(sysmo_isimsja5_mac_sizes, self.mac_size) + "\n"
dump += pfx + "Keccak iterations: %d" % self.num_keccak + "\n"
dump += pfx + "TOPc: " + hexdump(self.topc) + "\n"
#TODO: Keys may be 128 or 256 bits long. The key length is defined
#in the header of the file, which means we cannot access this bit
#from here but it would be nice to display the key in its correct
#length though.
dump += pfx + "Key: " + hexdump(self.key)
return dump
def encode(self) -> list:
out = SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY.encode(self)
out += self.key + self.opc
param_byte = self.res_size & 7
param_byte |= (self.res_size & 7) << 3
param_byte |= (self.ckik_size & 1) << 6
out = [param_byte]
out += [self.num_keccak]
out += self.topc
out += self.key
return out
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)
key = [0x00] * 16
opc = [0x00] * 16 # Only for Milenage
algo_key = None
def __init__(self, content = None):
if content == None:
return
SYSMO_ISIMSJAX_FILE_EF_XSIM_AUTH_KEY.__init__(self, content)
header = content[0]
self.full_res = bool((header >> 6) & 1)
self.ext_res = bool((header >> 7) & 1)
self.key = content[1:17]
if len(content) > 17:
self.opc = content[17:33]
# The superclass constructor must ensure that a valid algo and
# algo parameters are set since we need this information to pick
# the key configuration below.
super().__init__(content)
if self.algo == SYSMO_ISIMSJA2_ALGO_COMP12V1 or \
self.algo == SYSMO_ISIMSJA2_ALGO_COMP12V2 or \
self.algo == SYSMO_ISIMSJA2_ALGO_COMP12V3:
self.algo_key = SYSMO_ISIMSJAX_ALGO_KEY_COMP128(content)
elif self.algo == SYSMO_ISIMSJA2_ALGO_MILENAGE:
self.algo_key = SYSMO_ISIMSJAX_ALGO_KEY_MILENAGE(content)
elif self.algo == SYSMO_ISIMSJA2_ALGO_SHA1AKA:
self.algo_key = SYSMO_ISIMSJAX_ALGO_KEY_SHA1AKA(content)
elif self.algo == SYSMO_ISIMSJA2_ALGO_XOR or \
self.algo == SYSMO_ISIMSJA5_ALGO_XOR_2G:
self.algo_key = SYSMO_ISIMSJAX_ALGO_KEY_XOR(content)
elif self.algo == SYSMO_ISIMSJA5_ALGO_TUAK:
self.algo_key = SYSMO_ISIMSJAX_ALGO_KEY_TUAK(content)
def __str__(self) -> str:
dump = ""
pfx = " "
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:
dump += pfx + "3G: Return first four bytes of RES\n"
elif self.ext_res == True:
dump += pfx + "3G: Return 16-byte RES (XOR 3G only)\n"
else:
dump += pfx + "(invalid RES length setting)"
if self.algo != SYSMO_ISIMSJA2_ALGO_XOR and self.ext_res:
dump += pfx + "Warning: 16-byte RES is only valid with XOR 3G!\n"
if self.algo == SYSMO_ISIMSJA2_ALGO_MILENAGE:
dump += pfx + "Key: " + hexdump(self.key) + "\n"
dump += pfx + "OPc: " + hexdump(self.opc)
elif self.algo == SYSMO_ISIMSJA2_ALGO_XOR:
dump += pfx + "Key: " + hexdump(self.key) + "\n"
dump += pfx + "OPc: " + hexdump(self.opc)
elif self.algo == SYSMO_ISIMSJA2_ALGO_SHA1AKA:
dump += pfx + "Root key: " + hexdump(self.key) + "\n"
dump += pfx + "OPc: " + hexdump(self.opc) + " (unused)"
else:
dump += pfx + "Key: " + hexdump(self.key) + "\n"
dump += pfx + "OPc: " + hexdump(self.opc) + " (unused)"
dump += super().__str__()
dump += str(self.algo_key)
return dump
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:
out[0] |= 1 << 7
out += self.key
# Note: Normally an OPc is only used with milenage, but lets
# write the value anyway, even if it is not used.
out += self.opc
out = super().encode()
if self.algo_key:
out += self.algo_key.encode()
else:
raise ValueError("key data encoding not supported for selected algorithm!")
return out
# EF_USIM_AUTH_KEY_2G and EF_USIM_AUTH_KEY_GBA have the same layout as
# EF_USIM_AUTH_KEY_2G, EF_SIM_AUTH_KEY 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_SIM_AUTH_KEY(SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY):
pass
class SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_2G(SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY):
pass
@ -628,6 +830,20 @@ class Sysmo_isim_sja2(Sysmo_usim):
print(" * ADF_ISIM/EF_ISIM_SQN:")
print(SYSMO_ISIMSJAX_FILE_EF_USIM_SQN(res.apdu))
def __display_key(self, ef, gen:str):
"""
Helper method to display key
"""
if ef.algo in sysmo_isimsjax_16_byte_key_algorithms:
print(" %s: Key: %s" % (gen, hexdump(ef.algo_key.ki)))
elif ef.algo is SYSMO_ISIMSJA5_ALGO_TUAK:
if not ef.algo_pars.use_256_bit_key:
print(" %s: Key: %s" % (gen, hexdump(ef.algo_key.key[0:16])))
else:
print(" %s: Key: %s" % (gen, hexdump(ef.algo_key.key)))
else:
print(" * %s: Key not applicable for selected algorithm." % gen)
def show_key_params(self):
"""
Show current Key value
@ -635,16 +851,50 @@ class Sysmo_isim_sja2(Sysmo_usim):
print("Reading Key value...")
self._init()
# 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_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
ef_2g = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
self.__select_xsim_auth_key(isim = False, _2G = False)
res = self._read_binary(self.sim.filelen)
ef_3g = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
if self.sim.has_isim:
self.__select_xsim_auth_key(isim = True, _2G = False)
res = self._read_binary(self.sim.filelen)
ef_4g5g = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
else:
ef_4g5g = None
print(" * Current Key setting:")
print(" Key: " + hexdump(ef.key))
self.__display_key(ef_2g, "2g")
self.__display_key(ef_3g, "3g")
if ef_4g5g:
self.__display_key(ef_4g5g, "4g5g")
print("")
def __program_key(self, key, gen:str):
"""
Helper method to program key, EF must be selected first
"""
res = self._read_binary(self.sim.filelen)
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
if ef.algo in sysmo_isimsjax_16_byte_key_algorithms:
ef.algo_key.ki = key
self.sim.update_binary(ef.encode())
print(" * %s: Key programmed." % gen)
elif ef.algo is SYSMO_ISIMSJA5_ALGO_TUAK:
ef.algo_key.key = key
ef.algo_pars.use_256_bit_key = False
if len(key) > 16:
ef.algo_pars.use_256_bit_key = True
self.sim.update_binary(ef.encode())
print(" * %s: Key programmed." % gen)
else:
print(" * %s: Key not applicable for selected algorithm." % gen)
def write_key_params(self, key):
"""
Program new Key value
@ -655,23 +905,12 @@ class Sysmo_isim_sja2(Sysmo_usim):
print(" Key: " + hexdump(key))
print(" * Programming...")
self.__select_xsim_auth_key(isim = False, _2G = True)
res = self._read_binary(self.sim.filelen)
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
ef.key = key
self.sim.update_binary(ef.encode())
self.__program_key(key, "2g")
self.__select_xsim_auth_key(isim = False, _2G = False)
res = self._read_binary(self.sim.filelen)
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
ef.key = key
self.sim.update_binary(ef.encode())
self.__program_key(key, "3g")
if self.sim.has_isim:
self.__select_xsim_auth_key(isim = True, _2G = False)
res = self._read_binary(self.sim.filelen)
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
ef.key = key
self.sim.update_binary(ef.encode())
self.__program_key(key, "4g5g")
print("")
@ -760,6 +999,19 @@ class Sysmo_isim_sja2(Sysmo_usim):
print("")
def __display_opc(self, ef, gen:str):
"""
Helper method to display OP/OPc
"""
if ef.algo is SYSMO_ISIMSJA2_ALGO_MILENAGE:
print(" %s: %s: %s" % (gen, id_to_str(sysmo_isimsjax_op_opc, ef.algo_pars.use_opc), \
hexdump(ef.algo_key.opc)))
elif ef.algo is SYSMO_ISIMSJA5_ALGO_TUAK:
print(" %s: %s: %s" % (gen, id_to_str(sysmo_isimsja5_top_topc, ef.algo_pars.use_topc), \
hexdump(ef.algo_key.topc)))
else:
print(" * %s: OP/OPc not applicable for selected algorithm." % gen)
def show_opc_params(self):
"""
Show OP/OPc current configuration. (see also method: write_opc_params).
@ -767,58 +1019,71 @@ class Sysmo_isim_sja2(Sysmo_usim):
print("Reading OP/c value...")
self._init()
# Note: The OPc is expected to be the same in all eligible files
print(" * Reading...")
self.__select_xsim_auth_key(isim = False, _2G = False)
res = self._read_binary(self.sim.filelen)
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
if ef.use_opc:
mode_str = "OPc"
else:
mode_str = "OP"
print(" * Current OP/OPc setting:")
print(" %s: %s" % (mode_str, hexdump(ef.opc)))
print("")
def write_opc_params(self, select, op):
"""
Program new OPc value
"""
if select:
print("Writing OPc value...")
mode_str = "OPc"
else:
print("Writing OP value...")
mode_str = "OP"
self._init()
print(" * New OPc setting:")
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_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
ef.opc = op
ef.use_opc = bool(select)
self.sim.update_binary(ef.encode())
ef_2g = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
self.__select_xsim_auth_key(isim = False, _2G = False)
res = self._read_binary(self.sim.filelen)
ef_3g = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
if self.sim.has_isim:
self.__select_xsim_auth_key(isim = True, _2G = False)
res = self._read_binary(self.sim.filelen)
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
ef.opc = op
ef.use_opc = bool(select)
self.sim.update_binary(ef.encode())
ef_4g5g = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
else:
ef_4g5g = None
self.__select_xsim_auth_key(isim = False, _2G = False)
print(" * Current OP/OPc setting:")
self.__display_opc(ef_2g, "2g")
self.__display_opc(ef_3g, "3g")
if ef_4g5g:
self.__display_opc(ef_4g5g, "4g5g")
print("")
def __program_opc(self, select:bool, op, gen:str):
"""
Helper method to program OP/OPc, EF must be selected first
"""
res = self._read_binary(self.sim.filelen)
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
ef.opc = op
ef.use_opc = bool(select)
self.sim.update_binary(ef.encode())
if ef.algo is SYSMO_ISIMSJA2_ALGO_MILENAGE:
ef.algo_key.opc = op
ef.algo_pars.use_opc = bool(select)
self.sim.update_binary(ef.encode())
print(" %s %s programmed." % (gen, id_to_str(sysmo_isimsjax_op_opc, bool(select))));
elif ef.algo is SYSMO_ISIMSJA5_ALGO_TUAK and len(op) is 32:
ef.algo_key.topc = op
ef.algo_pars.use_topc = bool(select)
self.sim.update_binary(ef.encode())
print(" %s %s programmed." % (gen, id_to_str(sysmo_isimsja5_top_topc, bool(select))));
else:
print(" %s OP/OPc not applicable for selected algorithm, skipping..." % gen)
def write_opc_params(self, select:bool, op):
"""
Program new OP/OPc value. The new OP/OPc value is programmed into all files where the algorithm is
configured to Milenage. When Milenage is not configured, then the respective file is not touched.
As a simplification we program the same OP/OPc configuration to all files (2G, 3G, 4G/5G). Even though
the cards would permit a different setting in each file, it is extremly unlikely that any HLR/HSS would
use such a configuration.
"""
print("Writing %s value..." % id_to_str(sysmo_isimsjax_op_opc, bool(select)))
self._init()
print(" * New OPc setting:")
print(" %s: %s" % (id_to_str(sysmo_isimsjax_op_opc, bool(select)), hexdump(op)))
print(" * Programming...")
self.__select_xsim_auth_key(isim = False, _2G = True)
self.__program_opc(select, op, "2g")
self.__select_xsim_auth_key(isim = False, _2G = False)
self.__program_opc(select, op, "3g")
if self.sim.has_isim:
self.__select_xsim_auth_key(isim = True, _2G = False)
self.__program_opc(select, op, "4g5g")
print("")
@ -869,6 +1134,109 @@ class Sysmo_isim_sja2(Sysmo_usim):
print("")
def __display_tuak_cfg(self, ef, gen:str):
"""
Helper method to display key
"""
if ef.algo is SYSMO_ISIMSJA5_ALGO_TUAK:
print(" %s: TUAK configuration:" % gen)
print(" RES size: %s bit" % id_to_str(sysmo_isimsja5_res_sizes, ef.algo_key.res_size))
print(" MAC-A/MAC-S size: %s bit" % id_to_str(sysmo_isimsja5_mac_sizes, ef.algo_key.mac_size))
print(" CK/IK size: %s bit" % id_to_str(sysmo_isimsja5_ckik_sizes, ef.algo_key.ckik_size))
print(" Keccak iterations: %d" % ef.algo_key.num_keccak)
else:
print(" * %s: TUAK configuration not applicable for selected algorithm." % gen)
def show_tuak_cfg(self):
print("Reading TUAK configuration...")
self._init()
print(" * Reading...")
self.__select_xsim_auth_key(isim = False, _2G = True)
res = self._read_binary(self.sim.filelen)
ef_2g = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
self.__select_xsim_auth_key(isim = False, _2G = False)
res = self._read_binary(self.sim.filelen)
ef_3g = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
if self.sim.has_isim:
self.__select_xsim_auth_key(isim = True, _2G = False)
res = self._read_binary(self.sim.filelen)
ef_4g5g = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
else:
ef_4g5g = None
print(" * Current TUAK configuration:")
self.__display_tuak_cfg(ef_2g, "2g")
self.__display_tuak_cfg(ef_3g, "3g")
if ef_4g5g:
self.__display_tuak_cfg(ef_4g5g, "4g5g")
print("")
def __program_tuak_cfg(self, res_size:int, mac_size:int, ckik_size:int, num_keccak:int, gen:str):
"""
Helper method to program key, EF must be selected first
"""
res = self._read_binary(self.sim.filelen)
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
if ef.algo is SYSMO_ISIMSJA5_ALGO_TUAK:
ef.algo_key.res_size = res_size
ef.algo_key.mac_size = mac_size
ef.algo_key.ckik_size = bool(ckik_size)
ef.algo_key.num_keccak = num_keccak
self.sim.update_binary(ef.encode())
print(" %s TUAK configuration programmed." % gen);
else:
print(" %s TUAK configuration not applicable for selected algorithm, skipping..." % gen)
def write_tuak_cfg(self, res_size_str:str, mac_size_str:str, ckik_size_str:str, num_keccak_str:str):
print("Writing TUAK configuration...")
self._init()
print(" * New TUAK configuration:")
res_size = str_to_id(sysmo_isimsja5_res_sizes, res_size_str, -1)
if res_size < 0:
print(" * Invalid TUAK configuration, RES-Size must be 32, 64, 128 or 256 bit!")
print("")
return
mac_size = str_to_id(sysmo_isimsja5_mac_sizes, mac_size_str, -1)
if mac_size < 0:
print(" * Invalid TUAK configuration, MAC-Size must be 64, 128 or 256 bit!")
print("")
return
ckik_size = str_to_id(sysmo_isimsja5_ckik_sizes, ckik_size_str, -1)
if ckik_size < 0:
print(" * Invalid TUAK configuration, MAC-Size must be 128 or 256 bit!")
print("")
return
num_keccak = int(num_keccak_str)
if num_keccak > 255:
print(" * Invalid TUAK configuration, number of Keccak iterations must not exceed 256!")
print("")
return
print(" RES size: %s bit" % id_to_str(sysmo_isimsja5_res_sizes, res_size))
print(" MAC-A/MAC-S size: %s bit" % id_to_str(sysmo_isimsja5_mac_sizes, mac_size))
print(" CK/IK size: %s bit" % id_to_str(sysmo_isimsja5_ckik_sizes, ckik_size))
print(" Keccak iterations: %d" % num_keccak)
print(" * Programming...")
self.__select_xsim_auth_key(isim = False, _2G = True)
self.__program_tuak_cfg(res_size, mac_size, ckik_size, num_keccak, "2g")
self.__select_xsim_auth_key(isim = False, _2G = False)
self.__program_tuak_cfg(res_size, mac_size, ckik_size, num_keccak, "3g")
if self.sim.has_isim:
self.__select_xsim_auth_key(isim = True, _2G = False)
self.__program_tuak_cfg(res_size, mac_size, ckik_size, num_keccak, "4g5g")
print("")
class Sysmo_isim_sja5(Sysmo_isim_sja2):
algorithms = sysmo_isimsja5_algorithms

View File

@ -32,3 +32,23 @@ echo ""
echo ""
echo ""
echo ""
# The sysmo-isim-sja5 related tests will be activated as soon as a physical
# card becomes available in the test fixture.
#
#echo "=========================================================="
#echo " EXECUTING TESTS FOR SYSMO-USIM-SJA5"
#echo "=========================================================="
#echo ""
#cd ./sja5
#echo "Location $PWD"
#echo ""
#sh ./run-tests
#if [ ! $? -eq 0 ]; then
# exit 1
#fi
#cd ..
#echo ""
#echo ""
#echo ""
#echo ""

View File

@ -1,6 +1,30 @@
sysmoISIM-SJA2 parameterization tool
Copyright (c) 2019-2022 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 75 30 34 05 4B A9
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Programming Authentication parameters...
* Initalizing...
* New algorithm setting:
2g: 4=MILENAGE
3g: 4=MILENAGE
4g5g: 4=MILENAGE
* Programming...
Done!
sysmoISIM-SJA2 parameterization tool
Copyright (c) 2019-2022 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 75 30 34 05 4B A9
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
@ -18,6 +42,9 @@ Writing OPc value...
* New OPc setting:
OPc: 000102030405060708090a0b0c0d0e0f
* Programming...
2g OPc programmed.
3g OPc programmed.
4g5g OPc programmed.
Done!
sysmoISIM-SJA2 parameterization tool
@ -39,7 +66,9 @@ Reading OP/c value...
* Initalizing...
* Reading...
* Current OP/OPc setting:
OPc: 000102030405060708090a0b0c0d0e0f
2g: OPc: 000102030405060708090a0b0c0d0e0f
3g: OPc: 000102030405060708090a0b0c0d0e0f
4g5g: OPc: 000102030405060708090a0b0c0d0e0f
Done!
sysmoISIM-SJA2 parameterization tool
@ -62,6 +91,9 @@ Writing OP value...
* New OPc setting:
OP: 840337c3d45397ce8ea8609ffdc47224
* Programming...
2g OP programmed.
3g OP programmed.
4g5g OP programmed.
Done!
sysmoISIM-SJA2 parameterization tool
@ -83,6 +115,8 @@ Reading OP/c value...
* Initalizing...
* Reading...
* Current OP/OPc setting:
OP: 840337c3d45397ce8ea8609ffdc47224
2g: OP: 840337c3d45397ce8ea8609ffdc47224
3g: OP: 840337c3d45397ce8ea8609ffdc47224
4g5g: OP: 840337c3d45397ce8ea8609ffdc47224
Done!

View File

@ -1,6 +1,10 @@
#!/bin/sh
. ./test-data
# OP/OPc is milenage specific, make sure we have milenage configured before
# testing.
$TOOL -a $ADMPIN -T "MILENAGE:MILENAGE"
$TOOL -a $ADMPIN -C 000102030405060708090a0b0c0d0e0f
$TOOL -a $ADMPIN -o

View File

@ -18,6 +18,9 @@ Writing Key value...
* New Key setting:
Key: a0b1c2d3e4f5061728394a5b6c7d8e9f
* Programming...
* 2g: Key programmed.
* 3g: Key programmed.
* 4g5g: Key programmed.
Done!
sysmoISIM-SJA2 parameterization tool
@ -39,7 +42,9 @@ Reading Key value...
* Initalizing...
* Reading...
* Current Key setting:
Key: a0b1c2d3e4f5061728394a5b6c7d8e9f
2g: Key: a0b1c2d3e4f5061728394a5b6c7d8e9f
3g: Key: a0b1c2d3e4f5061728394a5b6c7d8e9f
4g5g: Key: a0b1c2d3e4f5061728394a5b6c7d8e9f
Done!
sysmoISIM-SJA2 parameterization tool
@ -62,6 +67,9 @@ Writing Key value...
* New Key setting:
Key: d7882eae7cd14f06108c55f8e5cffe93
* Programming...
* 2g: Key programmed.
* 3g: Key programmed.
* 4g5g: Key programmed.
Done!
sysmoISIM-SJA2 parameterization tool
@ -83,6 +91,8 @@ Reading Key value...
* Initalizing...
* Reading...
* Current Key setting:
Key: d7882eae7cd14f06108c55f8e5cffe93
2g: Key: d7882eae7cd14f06108c55f8e5cffe93
3g: Key: d7882eae7cd14f06108c55f8e5cffe93
4g5g: Key: d7882eae7cd14f06108c55f8e5cffe93
Done!

16
tests/sja5/01_auth.out Normal file
View File

@ -0,0 +1,16 @@
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Done!

4
tests/sja5/01_auth.sh Executable file
View File

@ -0,0 +1,4 @@
#!/bin/sh
. ./test-data
$TOOL -a $ADMPIN

1440
tests/sja5/02_algo.out Normal file

File diff suppressed because it is too large Load Diff

9
tests/sja5/02_algo.sh Executable file
View File

@ -0,0 +1,9 @@
#!/bin/sh
. ./test-data
ALGOS="1:1 3:1 4:1 5:1 15:1 1:4 3:15 2:2 1:3 1:6 6:6 6:1 1:2:3 1:4:5 5:4:15 5:4:6 "
ALGOS=$ALGOS"MILENAGE:MILENAGE COMP128v1:MILENAGE COMP128v3:MILENAGE COMP128v2:MILENAGE SHA1-AKA:XOR SHA1-AKA:TUAK TUAK:MILENAGE TUAK:TUAK COMP128v1:MILENAGE COMP128v1:MILENAGE:SHA1-AKA COMP128v2:COMP128v1:COMP128v3 COMP128v2:COMP128v1:TUAK COMP128v2:TUAK:COMP128v1 TUAK:COMP128v1:COMP128v3"
for algo in $ALGOS; do
$TOOL -a $ADMPIN -T $algo
$TOOL -a $ADMPIN -t
done

View File

@ -0,0 +1,124 @@
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Programming Milenage parameters...
* Initalizing...
* New Milenage Parameters for (EF.MILENAGE_CFG):
R1: 0xaa
R2: 0xbb
R3: 0xcc
R4: 0xdd
R5: 0xee
C1: 1234567890abcdef1234567890abcdef
C2: f1234567890abcdef1234567890abcde
C3: ef1234567890abcdef1234567890abcd
C4: def1234567890abcdef1234567890abc
C5: cdef1234567890abcdef1234567890ab
* Programming...
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Reading Milenage parameters...
* Initalizing...
* Reading...
* Current Milenage Parameters:
R1: 0xaa
R2: 0xbb
R3: 0xcc
R4: 0xdd
R5: 0xee
C1: 1234567890abcdef1234567890abcdef
C2: f1234567890abcdef1234567890abcde
C3: ef1234567890abcdef1234567890abcd
C4: def1234567890abcdef1234567890abc
C5: cdef1234567890abcdef1234567890ab
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Programming Milenage parameters...
* Initalizing...
* New Milenage Parameters for (EF.MILENAGE_CFG):
R1: 0x40
R2: 0x0
R3: 0x20
R4: 0x40
R5: 0x60
C1: 00000000000000000000000000000000
C2: 00000000000000000000000000000001
C3: 00000000000000000000000000000002
C4: 00000000000000000000000000000004
C5: 00000000000000000000000000000008
* Programming...
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Reading Milenage parameters...
* Initalizing...
* Reading...
* Current Milenage Parameters:
R1: 0x40
R2: 0x0
R3: 0x20
R4: 0x40
R5: 0x60
C1: 00000000000000000000000000000000
C2: 00000000000000000000000000000001
C3: 00000000000000000000000000000002
C4: 00000000000000000000000000000004
C5: 00000000000000000000000000000008
Done!

24
tests/sja5/03_milenage_par.sh Executable file
View File

@ -0,0 +1,24 @@
#!/bin/sh
. ./test-data
# Write and reread with test data
C1="1234567890ABCDEF1234567890ABCDEF"
C2="F1234567890ABCDEF1234567890ABCDE"
C3="EF1234567890ABCDEF1234567890ABCD"
C4="DEF1234567890ABCDEF1234567890ABC"
C5="CDEF1234567890ABCDEF1234567890AB"
R12345="AA:BB:CC:DD:EE"
PARAMS=$C1$C2$C3$C4$C5$R12345
$TOOL -a $ADMPIN -L $PARAMS
$TOOL -a $ADMPIN -l
# Write and reread with factory defaults
C1="00000000000000000000000000000000"
C2="00000000000000000000000000000001"
C3="00000000000000000000000000000002"
C4="00000000000000000000000000000004"
C5="00000000000000000000000000000008"
R12345="40:00:20:40:60"
PARAMS=$C1$C2$C3$C4$C5$R12345
$TOOL -a $ADMPIN -L $PARAMS
$TOOL -a $ADMPIN -l

122
tests/sja5/04_op_opc.out Normal file
View File

@ -0,0 +1,122 @@
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Programming Authentication parameters...
* Initalizing...
* New algorithm setting:
2g: 4=MILENAGE
3g: 4=MILENAGE
4g5g: 4=MILENAGE
* Programming...
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Writing OPc value...
* Initalizing...
* New OPc setting:
OPc: 000102030405060708090a0b0c0d0e0f
* Programming...
2g OPc programmed.
3g OPc programmed.
4g5g OPc programmed.
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Reading OP/c value...
* Initalizing...
* Reading...
* Current OP/OPc setting:
2g: OPc: 000102030405060708090a0b0c0d0e0f
3g: OPc: 000102030405060708090a0b0c0d0e0f
4g5g: OPc: 000102030405060708090a0b0c0d0e0f
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Writing OP value...
* Initalizing...
* New OPc setting:
OP: 840337c3d45397ce8ea8609ffdc47224
* Programming...
2g OP programmed.
3g OP programmed.
4g5g OP programmed.
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Reading OP/c value...
* Initalizing...
* Reading...
* Current OP/OPc setting:
2g: OP: 840337c3d45397ce8ea8609ffdc47224
3g: OP: 840337c3d45397ce8ea8609ffdc47224
4g5g: OP: 840337c3d45397ce8ea8609ffdc47224
Done!

13
tests/sja5/04_op_opc.sh Executable file
View File

@ -0,0 +1,13 @@
#!/bin/sh
. ./test-data
# OP/OPc is milenage specific, make sure we have milenage configured before
# testing.
$TOOL -a $ADMPIN -T "MILENAGE:MILENAGE"
$TOOL -a $ADMPIN -C 000102030405060708090a0b0c0d0e0f
$TOOL -a $ADMPIN -o
$TOOL -a $ADMPIN -O 840337c3d45397ce8ea8609ffdc47224
$TOOL -a $ADMPIN -o

98
tests/sja5/05_key.out Normal file
View File

@ -0,0 +1,98 @@
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Writing Key value...
* Initalizing...
* New Key setting:
Key: a0b1c2d3e4f5061728394a5b6c7d8e9f
* Programming...
* 2g: Key programmed.
* 3g: Key programmed.
* 4g5g: Key programmed.
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Reading Key value...
* Initalizing...
* Reading...
* Current Key setting:
2g: Key: a0b1c2d3e4f5061728394a5b6c7d8e9f
3g: Key: a0b1c2d3e4f5061728394a5b6c7d8e9f
4g5g: Key: a0b1c2d3e4f5061728394a5b6c7d8e9f
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Writing Key value...
* Initalizing...
* New Key setting:
Key: d7882eae7cd14f06108c55f8e5cffe93
* Programming...
* 2g: Key programmed.
* 3g: Key programmed.
* 4g5g: Key programmed.
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Reading Key value...
* Initalizing...
* Reading...
* Current Key setting:
2g: Key: d7882eae7cd14f06108c55f8e5cffe93
3g: Key: d7882eae7cd14f06108c55f8e5cffe93
4g5g: Key: d7882eae7cd14f06108c55f8e5cffe93
Done!

11
tests/sja5/05_key.sh Executable file
View File

@ -0,0 +1,11 @@
#!/bin/sh
. ./test-data
# set to arbitrary value + read back
$TOOL -a $ADMPIN -K a0b1c2d3e4f5061728394a5b6c7d8e9f
$TOOL -a $ADMPIN -k
# set to original value + read back
$TOOL -a $ADMPIN -K $KI
$TOOL -a $ADMPIN -k

75
tests/sja5/06_seq.out Normal file
View File

@ -0,0 +1,75 @@
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Reading Milenage Sequence parameters...
* Initalizing...
* Current SQN Configuration for ADF_USIM:
IND (bits): 5
SQN Check enabled
SQN Age Limit disabled
SQN Max Delta enabled
SQN Skip first enabled
SQN Conceal AUTN enabled
SQN Conceal AUTS enabled
SQN No AMF clear disabled
Max Delta: 8589934592
Age Limit: 8589934592
Freshness Data:
000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000
* Current SQN Configuration for ADF_ISIM:
IND (bits): 5
SQN Check enabled
SQN Age Limit disabled
SQN Max Delta enabled
SQN Skip first enabled
SQN Conceal AUTN enabled
SQN Conceal AUTS enabled
SQN No AMF clear disabled
Max Delta: 8589934592
Age Limit: 8589934592
Freshness Data:
000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
* Resetting SQN Configuration to defaults...
* Initalizing...
* Resetting...
Done!

8
tests/sja5/06_seq.sh Executable file
View File

@ -0,0 +1,8 @@
#!/bin/sh
. ./test-data
# we can only read them for now, which will of course change once we perform auth against it
$TOOL -a $ADMPIN -s
# test if resetting SQN parameters works
$TOOL -a $ADMPIN -S

132
tests/sja5/07_mnclen.out Normal file
View File

@ -0,0 +1,132 @@
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Writing MNCLEN value...
* Initalizing...
* New MNCLEN setting:
MNCLEN: 0x02
* Programming...
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Reading MNCLEN value...
* Initalizing...
* Reading...
* Current MNCLEN setting:
MNCLEN: 0x02
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Writing MNCLEN value...
* Initalizing...
* New MNCLEN setting:
MNCLEN: 0x03
* Programming...
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Reading MNCLEN value...
* Initalizing...
* Reading...
* Current MNCLEN setting:
MNCLEN: 0x03
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Writing MNCLEN value...
* Initalizing...
* New MNCLEN setting:
MNCLEN: 0x02
* Programming...
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Reading MNCLEN value...
* Initalizing...
* Reading...
* Current MNCLEN setting:
MNCLEN: 0x02
Done!

15
tests/sja5/07_mnclen.sh Executable file
View File

@ -0,0 +1,15 @@
#!/bin/sh
. ./test-data
# set to 2 (default) + read back
$TOOL -a $ADMPIN -N 02
$TOOL -a $ADMPIN -n
# set to 3 + read back
$TOOL -a $ADMPIN -N 03
$TOOL -a $ADMPIN -n
# set to 2 (default) + read back
$TOOL -a $ADMPIN -N 02
$TOOL -a $ADMPIN -n

349
tests/sja5/08_tuak.out Normal file
View File

@ -0,0 +1,349 @@
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Programming Authentication parameters...
* Initalizing...
* New algorithm setting:
2g: 1=COMP128v1
3g: 4=MILENAGE
4g5g: 6=TUAK
* Programming...
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Writing TUAK configuration...
* Initalizing...
* New TUAK configuration:
RES size: 32 bit
MAC-A/MAC-S size: 64 bit
CK/IK size: 128 bit
Keccak iterations: 123
* Programming...
2g TUAK configuration not applicable for selected algorithm, skipping...
3g TUAK configuration not applicable for selected algorithm, skipping...
4g5g TUAK configuration programmed.
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Reading TUAK configuration...
* Initalizing...
* Reading...
* Current TUAK configuration:
* 2g: TUAK configuration not applicable for selected algorithm.
* 3g: TUAK configuration not applicable for selected algorithm.
4g5g: TUAK configuration:
RES size: 32 bit
MAC-A/MAC-S size: 64 bit
CK/IK size: 128 bit
Keccak iterations: 123
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Writing Key value...
* Initalizing...
* New Key setting:
Key: a0b1c2d3e4f5061728394a5b6c7d8e9f
* Programming...
* 2g: Key programmed.
* 3g: Key programmed.
* 4g5g: Key programmed.
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Reading Key value...
* Initalizing...
* Reading...
* Current Key setting:
2g: Key: a0b1c2d3e4f5061728394a5b6c7d8e9f
3g: Key: a0b1c2d3e4f5061728394a5b6c7d8e9f
4g5g: Key: a0b1c2d3e4f5061728394a5b6c7d8e9f
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Writing Key value...
* Initalizing...
* New Key setting:
Key: a0b1ca0b1c2d3e4fe8394a55061722d3b6c7d8e9f8394a5506172e9fb6c7d84f
* Programming...
* 2g: Key programmed.
* 3g: Key programmed.
* 4g5g: Key programmed.
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Reading Key value...
* Initalizing...
* Reading...
* Current Key setting:
2g: Key: a0b1ca0b1c2d3e4fe8394a55061722d3
3g: Key: a0b1ca0b1c2d3e4fe8394a55061722d3
4g5g: Key: a0b1ca0b1c2d3e4fe8394a55061722d3b6c7d8e9f8394a5506172e9fb6c7d84f
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Writing OP value...
* Initalizing...
* New OPc setting:
OP: e8394a55061a0b1ca3e4f722d3b6c7d8e172e9fb680b1cc7d84f9f2d394a5506
* Programming...
2g OP/OPc not applicable for selected algorithm, skipping...
3g OP programmed.
4g5g TOP programmed.
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Reading OP/c value...
* Initalizing...
* Reading...
* Current OP/OPc setting:
* 2g: OP/OPc not applicable for selected algorithm.
3g: OP: e8394a55061a0b1ca3e4f722d3b6c7d8
4g5g: TOP: e8394a55061a0b1ca3e4f722d3b6c7d8e172e9fb680b1cc7d84f9f2d394a5506
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Writing OPc value...
* Initalizing...
* New OPc setting:
OPc: 03b694a5506c7d8e172e9fb680b1cc7d61a0b1ca3e4f722d84e8394a55f9f2d3
* Programming...
2g OP/OPc not applicable for selected algorithm, skipping...
3g OPc programmed.
4g5g TOPc programmed.
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Reading OP/c value...
* Initalizing...
* Reading...
* Current OP/OPc setting:
* 2g: OP/OPc not applicable for selected algorithm.
3g: OPc: 03b694a5506c7d8e172e9fb680b1cc7d
4g5g: TOPc: 03b694a5506c7d8e172e9fb680b1cc7d61a0b1ca3e4f722d84e8394a55f9f2d3
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Programming Authentication parameters...
* Initalizing...
* New algorithm setting:
2g: 1=COMP128v1
3g: 1=COMP128v1
4g5g: 1=COMP128v1
* Programming...
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Writing Key value...
* Initalizing...
* New Key setting:
Key: d7882eae7cd14f06108c55f8e5cffe93
* Programming...
* 2g: Key programmed.
* 3g: Key programmed.
* 4g5g: Key programmed.
Done!
sysmoISIM-SJA5 parameterization tool
Copyright (c) 2023 sysmocom - s.f.m.c. GmbH
Trying to find card with ATR: 3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4
Initializing smartcard terminal...
* Detected Card IMSI: 901700000046734
ISIM Application installed
USIM Application installed
Authenticating...
* Remaining attempts: 3
* Authenticating...
* Authentication successful
* Remaining attempts: 3
Reading Key value...
* Initalizing...
* Reading...
* Current Key setting:
2g: Key: d7882eae7cd14f06108c55f8e5cffe93
3g: Key: d7882eae7cd14f06108c55f8e5cffe93
4g5g: Key: d7882eae7cd14f06108c55f8e5cffe93
Done!

30
tests/sja5/08_tuak.sh Executable file
View File

@ -0,0 +1,30 @@
#!/bin/sh
. ./test-data
# First we select a configuration that includes TUAK
$TOOL -a $ADMPIN -T "COMP128v1:MILENAGE:TUAK"
# Program/read-back valid TUAK configuration
$TOOL -a $ADMPIN -W 32:64:128:123
$TOOL -a $ADMPIN -w
# Program/read-back a 128 bit key
$TOOL -a $ADMPIN -K a0b1c2d3e4f5061728394a5b6c7d8e9f
$TOOL -a $ADMPIN -k
# Program/read-back a 256 bit key
$TOOL -a $ADMPIN -K a0b1ca0b1c2d3e4fe8394a55061722d3b6c7d8e9f8394a5506172e9fb6c7d84f
$TOOL -a $ADMPIN -k
# Program/read-back a TOP value
$TOOL -a $ADMPIN -O e8394a55061a0b1ca3e4f722d3b6c7d8e172e9fb680b1cc7d84f9f2d394a5506
$TOOL -a $ADMPIN -o
# Program/read-back a TOPc value
$TOOL -a $ADMPIN -C 03b694a5506c7d8e172e9fb680b1cc7d61a0b1ca3e4f722d84e8394a55f9f2d3
$TOOL -a $ADMPIN -o
# restore original Ki value + read back
$TOOL -a $ADMPIN -T "COMP128v1:COMP128v1:COMP128v1"
$TOOL -a $ADMPIN -K $KI
$TOOL -a $ADMPIN -k

9
tests/sja5/prepare Executable file
View File

@ -0,0 +1,9 @@
#!/bin/sh
. ./test-data
echo "================ PREPARING TEST CARD ================"
$TOOL -a $ADMPIN -J $IMSI
$TOOL -a $ADMPIN -S
echo "================ TEST CARD PREPARED ================="
echo ""

14
tests/sja5/regen Executable file
View File

@ -0,0 +1,14 @@
#!/bin/sh
echo "Regenerating test output..."
./prepare
./01_auth.sh > ./01_auth.out
./02_algo.sh > ./02_algo.out
./03_milenage_par.sh > ./03_milenage_par.out
./04_op_opc.sh > ./04_op_opc.out
./05_ki.sh > ./05_ki.out
./06_seq.sh > ./06_seq.out
./07_mnclen.sh > ./07_mnclen.out
echo "Reference output regenerated!"
echo ""

39
tests/sja5/run-tests Executable file
View File

@ -0,0 +1,39 @@
#!/bin/sh
# default: execute all tests
TESTS="01_auth.sh 02_algo.sh 03_milenage_par.sh 04_op_opc.sh 05_key.sh 06_seq.sh 07_mnclen.sh 08_tuak.sh"
# if command line specifies some specific tests, execute only those
if [ $# -ge 1 ]; then
TESTS=$*
fi
TMP=`tempfile`
NUM_FAIL=0
# prepare test card
./prepare
for T in $TESTS; do
echo "==> Executing Testcase $T"
EXPOUT=${T%%.sh}.out
rm $TMP
./$T > $TMP
diff -u $EXPOUT $TMP
if [ $? -eq 0 ]; then
echo "Test $T passed"
else
echo "Test $T FAILED!"
NUM_FAIL=$((NUM_FAIL+1))
fi
done
echo
echo
echo "Summary: $NUM_FAIL Tests failed"
if [ $NUM_FAIL -gt 0 ]; then
exit 1
else
exit 0
fi

5
tests/sja5/test-data Normal file
View File

@ -0,0 +1,5 @@
TOOL=../../sysmo-isim-tool.sja5.py
# data for the test scripts. The values have to match the SIM card inserted while executing the test
IMSI=901700000046734
ADMPIN=11111111 # <==== CHANGE THIS TO THE ADM1 KEY OF YOUR TEST CARD!
KI=D7882EAE7CD14F06108C55F8E5CFFE93