WIP: Prepare support for TUAK / Refactor existing code
- new classes for algorithm parameters - new classes for key material - algorithm type checks before reading/writing algorithm specific data - add return types to methods - show Ki and OP/OPc in each location
This commit is contained in:
parent
da7e7b1ded
commit
6de38540ee
|
@ -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
|
||||
|
@ -42,13 +42,13 @@ import math
|
|||
# | |
|
||||
# | +--[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) # <-- FIXME: is this still true?
|
||||
# |
|
||||
# +--[ADF_ISIM]
|
||||
# |
|
||||
# +--[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) # <-- FIXME: is this still true?
|
||||
#
|
||||
# Note: EF_MILENAGE_CFG and EF_USIM_SQN not yet listed here.
|
||||
|
||||
|
@ -88,7 +88,135 @@ sysmo_isimsja5_algorithms = sysmo_isimsja2_algorithms + [
|
|||
(SYSMO_ISIMSJA5_ALGO_TUAK, 'TUAK'),
|
||||
]
|
||||
|
||||
class SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY:
|
||||
# Algorithms that use a 16 byte Ki
|
||||
sysmo_isimsjax_ki_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,
|
||||
]
|
||||
|
||||
sysmo_isimsjax_op_opc = [
|
||||
(True, 'OPc'),
|
||||
(False, 'OP'),
|
||||
]
|
||||
|
||||
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 + "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.four_byte_res:
|
||||
dump += pfx + "Milenage: Return 4 byte RES\n"
|
||||
else:
|
||||
dump += pfx + "Milenage: 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 + "SHA1-AKA: Return 4 byte RES\n"
|
||||
else:
|
||||
dump += pfx + "SHA1-AKA: 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 + "XOR (3G): use SRES deviation function" + str(self.sres_dev_func) + "\n"
|
||||
|
||||
if self.sixteen_byte_res:
|
||||
dump += pfx + "XOR (3G): Return extended 16 byte RES\n"
|
||||
elif self.four_byte_res:
|
||||
dump += pfx + "XOR (3G): Return 4 byte RES\n"
|
||||
else:
|
||||
dump += pfx + "XOR (3G): 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_ISIMSJAX_FILE_EF_XSIM_AUTH_KEY:
|
||||
"""
|
||||
Superclass model that generates and parses the header byte of
|
||||
SYSMO_ISIMSJA2_EF_USIM_AUTH_KEY, SYSMO_ISIMSJA2_EF_USIM_AUTH_KEY_2G
|
||||
|
@ -96,8 +224,7 @@ class SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY:
|
|||
"""
|
||||
|
||||
algo = SYSMO_ISIMSJA2_ALGO_COMP12V1
|
||||
milenage_use_opc = False
|
||||
sres_dev_func = 1
|
||||
algo_pars = None
|
||||
|
||||
def __init__(self, content = None):
|
||||
if content == None:
|
||||
|
@ -105,28 +232,24 @@ class SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY:
|
|||
|
||||
header = content[0]
|
||||
self.algo = header & 0x0F
|
||||
self.milenage_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)
|
||||
|
||||
|
||||
def __str__(self):
|
||||
def __str__(self) -> str:
|
||||
dump = ""
|
||||
pfx = " "
|
||||
|
||||
dump += pfx + "Algorithm: "
|
||||
dump += id_to_str(sysmo_isimsja5_algorithms, self.algo)
|
||||
dump += "\n"
|
||||
|
||||
if self.milenage_use_opc == True:
|
||||
dump += pfx + "Milenage: use OPc\n"
|
||||
else:
|
||||
dump += pfx + "Milenage: use OP\n"
|
||||
|
||||
dump += pfx + "use SRES deviation function (if applicable) " + str(self.sres_dev_func) + "\n"
|
||||
if self.algo_pars:
|
||||
dump += str(self.algo_pars)
|
||||
|
||||
return dump
|
||||
|
||||
|
@ -134,130 +257,124 @@ class SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY:
|
|||
def encode(self):
|
||||
out = [0x00]
|
||||
out[0] = self.algo & 0x0F
|
||||
if self.milenage_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_ISIMSJA2_FILE_EF_SIM_AUTH_KEY(SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY):
|
||||
ki = [0x00] * 16
|
||||
|
||||
key = [0xAA] * 16
|
||||
opc = [0xBB] * 16
|
||||
def __init__(self, content = None):
|
||||
if content == None:
|
||||
return
|
||||
|
||||
self.ki = content[1:17]
|
||||
|
||||
|
||||
def __str__(self) -> str:
|
||||
|
||||
dump = ""
|
||||
pfx = " "
|
||||
dump += pfx + "Ki: " + hexdump(self.ki) + "\n"
|
||||
|
||||
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.key = content[1:17]
|
||||
self.opc = content[17:33]
|
||||
|
||||
|
||||
def __str__(self):
|
||||
def __str__(self) -> str:
|
||||
|
||||
dump = ""
|
||||
pfx = " "
|
||||
|
||||
dump += super().__str__()
|
||||
|
||||
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 += pfx + "OPc: " + hexdump(self.opc)
|
||||
|
||||
return dump
|
||||
|
||||
|
||||
def encode(self):
|
||||
out = super().encode()
|
||||
out += self.key + self.opc
|
||||
return out
|
||||
def encode(self) -> list:
|
||||
|
||||
return super().encode() + self.opc
|
||||
|
||||
|
||||
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)
|
||||
|
||||
key = [0x00] * 16
|
||||
opc = [0x00] * 16 # Only for Milenage
|
||||
algo_key = None
|
||||
|
||||
def __init__(self, content = None):
|
||||
if content == None:
|
||||
return
|
||||
|
||||
# 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)
|
||||
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]
|
||||
|
||||
|
||||
def __str__(self):
|
||||
dump = ""
|
||||
pfx = " "
|
||||
|
||||
dump += super().__str__()
|
||||
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)
|
||||
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:
|
||||
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)"
|
||||
self.algo_key = SYSMO_ISIMSJAX_ALGO_KEY_SHA1AKA(content)
|
||||
elif self.algo == SYSMO_ISIMSJA2_ALGO_XOR or \
|
||||
self.algo_key == SYSMO_ISIMSJA5_ALGO_XOR_2G:
|
||||
self.algo_key = SYSMO_ISIMSJAX_ALGO_KEY_XOR(content)
|
||||
|
||||
|
||||
def __str__(self) -> str:
|
||||
|
||||
dump = ""
|
||||
dump += super().__str__()
|
||||
dump += str(self.algo_key)
|
||||
return dump
|
||||
|
||||
|
||||
def encode(self):
|
||||
def encode(self) -> list:
|
||||
out = super().encode()
|
||||
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
|
||||
if self.algo_key:
|
||||
out += self.algo_key.encode()
|
||||
#FIXME
|
||||
# else:
|
||||
# # See note in constructor above. An algo_key object must exist!
|
||||
# raise ValueError("key data encoding not supported for this 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_USIM_AUTH_KEY_2G(SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY):
|
||||
class SYSMO_ISIMSJA2_FILE_EF_SIM_AUTH_KEY(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_2G(SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY):
|
||||
pass
|
||||
|
||||
|
||||
class SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_GBA(SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY):
|
||||
pass
|
||||
|
||||
|
||||
|
@ -296,7 +413,7 @@ class SYSMO_ISIMSJA2_FILE_EF_MILENAGE_CFG:
|
|||
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"
|
||||
|
@ -310,13 +427,13 @@ class SYSMO_ISIMSJA2_FILE_EF_MILENAGE_CFG:
|
|||
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
|
||||
|
@ -377,7 +494,7 @@ class SYSMO_ISIMSJA2_FILE_EF_USIM_SQN:
|
|||
self.freshness_data = content[15:(6*2**self.ind_size_bits)]
|
||||
|
||||
|
||||
def __str__(self):
|
||||
def __str__(self) -> str:
|
||||
pfx = " "
|
||||
dump = ""
|
||||
|
||||
|
@ -417,7 +534,7 @@ class SYSMO_ISIMSJA2_FILE_EF_USIM_SQN:
|
|||
return dump
|
||||
|
||||
|
||||
def encode(self):
|
||||
def encode(self) -> list:
|
||||
out = [0x00, 0x00]
|
||||
|
||||
# Flag1:
|
||||
|
@ -450,7 +567,6 @@ class SYSMO_ISIMSJA2_FILE_EF_USIM_SQN:
|
|||
self.freshness_data = [0x00] * (6*2**self.ind_size_bits)
|
||||
|
||||
|
||||
|
||||
class Sysmo_isim_sja2(Sysmo_usim):
|
||||
algorithms = sysmo_isimsja2_algorithms
|
||||
|
||||
|
@ -518,7 +634,6 @@ class Sysmo_isim_sja2(Sysmo_usim):
|
|||
|
||||
# Write new milenage parameters
|
||||
def write_milenage_params(self, params):
|
||||
|
||||
print("Programming Milenage parameters...")
|
||||
|
||||
if (len(params) < 85):
|
||||
|
@ -588,27 +703,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 +748,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,53 +757,88 @@ 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
|
||||
# Show current Ki value
|
||||
def show_ki_params(self):
|
||||
print("Reading KI value...")
|
||||
print("Reading Ki value...")
|
||||
self._init()
|
||||
|
||||
# Note: The KI 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_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 Ki setting:")
|
||||
|
||||
if ef_2g.algo in sysmo_isimsjax_ki_algorithms:
|
||||
print(" 2g: Ki: " + hexdump(ef_2g.algo_key.ki))
|
||||
else:
|
||||
print(" * 2g: Ki not applicable for selected algorithm.")
|
||||
|
||||
if ef_3g.algo in sysmo_isimsjax_ki_algorithms:
|
||||
print(" 3g: Ki: " + hexdump(ef_3g.algo_key.ki))
|
||||
else:
|
||||
print(" * 3g: Ki not applicable for selected algorithm.")
|
||||
|
||||
if ef_4g5g.algo in sysmo_isimsjax_ki_algorithms:
|
||||
if ef_4g5g.algo is SYSMO_ISIMSJA2_ALGO_MILENAGE:
|
||||
print(" 4g5g: Ki: " + hexdump(ef_4g5g.algo_key.ki))
|
||||
else:
|
||||
print(" * 4g5g: Ki not applicable for selected algorithm.")
|
||||
|
||||
print(" * Current KI setting:")
|
||||
print(" KI: " + hexdump(ef.key))
|
||||
print("")
|
||||
|
||||
|
||||
# Program new KI value
|
||||
# Program new Ki value
|
||||
def write_ki_params(self, ki):
|
||||
print("Writing KI value...")
|
||||
print("Writing Ki value...")
|
||||
self._init()
|
||||
|
||||
print(" * New KI setting:")
|
||||
print(" KI: " + hexdump(ki))
|
||||
print(" * New Ki setting:")
|
||||
print(" Ki: " + hexdump(ki))
|
||||
|
||||
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
|
||||
self.sim.update_binary(ef.encode())
|
||||
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
|
||||
if ef.algo in sysmo_isimsjax_ki_algorithms:
|
||||
ef.algo_key.ki = ki
|
||||
self.sim.update_binary(ef.encode())
|
||||
else:
|
||||
print(" * The selected 2g algorithm does not use a Ki, skipping...")
|
||||
|
||||
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
|
||||
self.sim.update_binary(ef.encode())
|
||||
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
|
||||
if ef.algo in sysmo_isimsjax_ki_algorithms:
|
||||
ef.algo_key.ki = ki
|
||||
self.sim.update_binary(ef.encode())
|
||||
else:
|
||||
print(" * The selected 3g algorithm does not use a Ki, skipping...")
|
||||
|
||||
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
|
||||
self.sim.update_binary(ef.encode())
|
||||
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
|
||||
if ef.algo in sysmo_isimsjax_ki_algorithms:
|
||||
ef.algo_key.ki = ki
|
||||
self.sim.update_binary(ef.encode())
|
||||
else:
|
||||
print(" * The selected 3g4g algorithm does not use a Ki, skipping...")
|
||||
|
||||
print("")
|
||||
|
||||
|
@ -702,17 +852,26 @@ class Sysmo_isim_sja2(Sysmo_usim):
|
|||
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
|
||||
|
||||
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)
|
||||
algo_4g5g = ef.algo
|
||||
else:
|
||||
algo_4g5g = algo_3g
|
||||
|
||||
print(" * Current algorithm setting:")
|
||||
print(" 2G: %d=%s" % (algo_2g, id_to_str(self.algorithms, algo_2g)))
|
||||
print(" 3G: %d=%s" % (algo_3g, id_to_str(self.algorithms, algo_3g)))
|
||||
print(" 2g: %d=%s" % (algo_2g, id_to_str(self.algorithms, algo_2g)))
|
||||
print(" 3g: %d=%s" % (algo_3g, id_to_str(self.algorithms, algo_3g)))
|
||||
print(" 4g5g: %d=%s" % (algo_3g, id_to_str(self.algorithms, algo_4g5g)))
|
||||
print("")
|
||||
|
||||
|
||||
|
@ -731,91 +890,131 @@ class Sysmo_isim_sja2(Sysmo_usim):
|
|||
else:
|
||||
algo_3g = str_to_id(self.algorithms, algo_3g_str)
|
||||
|
||||
# FIXME: Allow 4g algo to be set by the caller via a parameter
|
||||
algo_4g5g = algo_3g
|
||||
|
||||
print(" * New algorithm setting:")
|
||||
print(" 2G: %d=%s" % (algo_2g, id_to_str(self.algorithms, algo_2g)))
|
||||
print(" 3G: %d=%s" % (algo_3g, id_to_str(self.algorithms, algo_3g)))
|
||||
print(" 2g: %d=%s" % (algo_2g, id_to_str(self.algorithms, algo_2g)))
|
||||
print(" 3g: %d=%s" % (algo_3g, id_to_str(self.algorithms, algo_3g)))
|
||||
print(" 4g5g: %d=%s" % (algo_4g5g, id_to_str(self.algorithms, algo_4g5g)))
|
||||
|
||||
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.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.algo = algo_3g
|
||||
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
|
||||
ef.algo = algo_4g5g
|
||||
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()
|
||||
|
||||
# Note: The OPc 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_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 = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(res.apdu)
|
||||
ef_3g = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
|
||||
|
||||
if ef.milenage_use_opc:
|
||||
mode_str = "OPc"
|
||||
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:
|
||||
mode_str = "OP"
|
||||
ef_4g5g = None
|
||||
|
||||
print(" * Current OP/OPc setting:")
|
||||
print(" %s: %s" % (mode_str, hexdump(ef.opc)))
|
||||
|
||||
if ef_2g.algo is SYSMO_ISIMSJA2_ALGO_MILENAGE:
|
||||
print(" 2g: %s: %s" % (id_to_str(sysmo_isimsjax_op_opc, ef_2g.algo_pars.use_opc), \
|
||||
hexdump(ef_2g.algo_key.opc)))
|
||||
else:
|
||||
print(" * 2g: OP/OPc not applicable for selected algorithm.")
|
||||
|
||||
if ef_3g.algo is SYSMO_ISIMSJA2_ALGO_MILENAGE:
|
||||
print(" 3g: %s: %s" % (id_to_str(sysmo_isimsjax_op_opc, ef_2g.algo_pars.use_opc), \
|
||||
hexdump(ef_3g.algo_key.opc)))
|
||||
else:
|
||||
print(" * 3g: OP/OPc not applicable for selected algorithm.")
|
||||
|
||||
if ef_4g5g:
|
||||
if ef_4g5g.algo is SYSMO_ISIMSJA2_ALGO_MILENAGE:
|
||||
print(" 4g5g: %s: %s" % (id_to_str(sysmo_isimsjax_op_opc, ef_2g.algo_pars.use_opc), \
|
||||
hexdump(ef_4g5g.algo_key.opc)))
|
||||
else:
|
||||
print(" * 4g5g: OP/OPc not applicable for selected algorithm.")
|
||||
|
||||
print("")
|
||||
|
||||
|
||||
# Program new OPc value
|
||||
def write_opc_params(self, select, op):
|
||||
if select:
|
||||
print("Writing OPc value...")
|
||||
mode_str = "OPc"
|
||||
else:
|
||||
print("Writing OP value...")
|
||||
mode_str = "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" % (mode_str, hexdump(op)))
|
||||
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)
|
||||
res = self._read_binary(self.sim.filelen)
|
||||
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
|
||||
ef.opc = op
|
||||
ef.milenage_use_opc = bool(select)
|
||||
self.sim.update_binary(ef.encode())
|
||||
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
|
||||
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())
|
||||
else:
|
||||
print(" 2G algorithm not configured for milenage, skipping...");
|
||||
|
||||
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.algo is SYSMO_ISIMSJA2_ALGO_MILENAGE:
|
||||
ef.algo_key.opc = op
|
||||
ef.algo_pars.use_opc = bool(select)
|
||||
self.sim.update_binary(ef.encode())
|
||||
else:
|
||||
print(" 3G algorithm not configured for milenage, skipping...");
|
||||
|
||||
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.opc = op
|
||||
ef.milenage_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.opc = op
|
||||
ef.milenage_use_opc = bool(select)
|
||||
self.sim.update_binary(ef.encode())
|
||||
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
|
||||
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())
|
||||
else:
|
||||
print(" 4G/5G algorithm not configured for milenage, skipping...");
|
||||
|
||||
print("")
|
||||
|
||||
|
@ -830,7 +1029,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,7 +1037,7 @@ 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("")
|
||||
|
||||
|
@ -853,13 +1052,13 @@ 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("")
|
||||
|
|
|
@ -16,8 +16,9 @@ Authenticating...
|
|||
Programming Authentication parameters...
|
||||
* Initalizing...
|
||||
* New algorithm setting:
|
||||
2G: 1=COMP128v1
|
||||
3G: 1=COMP128v1
|
||||
2g: 1=COMP128v1
|
||||
3g: 1=COMP128v1
|
||||
4g5g: 1=COMP128v1
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -40,8 +41,9 @@ Reading Authentication parameters...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current algorithm setting:
|
||||
2G: 1=COMP128v1
|
||||
3G: 1=COMP128v1
|
||||
2g: 1=COMP128v1
|
||||
3g: 1=COMP128v1
|
||||
4g5g: 1=COMP128v1
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -62,8 +64,9 @@ Authenticating...
|
|||
Programming Authentication parameters...
|
||||
* Initalizing...
|
||||
* New algorithm setting:
|
||||
2G: 3=COMP128v3
|
||||
3G: 1=COMP128v1
|
||||
2g: 3=COMP128v3
|
||||
3g: 1=COMP128v1
|
||||
4g5g: 1=COMP128v1
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -86,8 +89,9 @@ Reading Authentication parameters...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current algorithm setting:
|
||||
2G: 3=COMP128v3
|
||||
3G: 1=COMP128v1
|
||||
2g: 3=COMP128v3
|
||||
3g: 1=COMP128v1
|
||||
4g5g: 1=COMP128v1
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -108,8 +112,9 @@ Authenticating...
|
|||
Programming Authentication parameters...
|
||||
* Initalizing...
|
||||
* New algorithm setting:
|
||||
2G: 4=MILENAGE
|
||||
3G: 1=COMP128v1
|
||||
2g: 4=MILENAGE
|
||||
3g: 1=COMP128v1
|
||||
4g5g: 1=COMP128v1
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -132,8 +137,9 @@ Reading Authentication parameters...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current algorithm setting:
|
||||
2G: 4=MILENAGE
|
||||
3G: 1=COMP128v1
|
||||
2g: 4=MILENAGE
|
||||
3g: 1=COMP128v1
|
||||
4g5g: 1=COMP128v1
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -154,8 +160,9 @@ Authenticating...
|
|||
Programming Authentication parameters...
|
||||
* Initalizing...
|
||||
* New algorithm setting:
|
||||
2G: 5=SHA1-AKA
|
||||
3G: 1=COMP128v1
|
||||
2g: 5=SHA1-AKA
|
||||
3g: 1=COMP128v1
|
||||
4g5g: 1=COMP128v1
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -178,8 +185,9 @@ Reading Authentication parameters...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current algorithm setting:
|
||||
2G: 5=SHA1-AKA
|
||||
3G: 1=COMP128v1
|
||||
2g: 5=SHA1-AKA
|
||||
3g: 1=COMP128v1
|
||||
4g5g: 1=COMP128v1
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -200,8 +208,9 @@ Authenticating...
|
|||
Programming Authentication parameters...
|
||||
* Initalizing...
|
||||
* New algorithm setting:
|
||||
2G: 15=XOR
|
||||
3G: 1=COMP128v1
|
||||
2g: 15=XOR
|
||||
3g: 1=COMP128v1
|
||||
4g5g: 1=COMP128v1
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -224,8 +233,9 @@ Reading Authentication parameters...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current algorithm setting:
|
||||
2G: 15=XOR
|
||||
3G: 1=COMP128v1
|
||||
2g: 15=XOR
|
||||
3g: 1=COMP128v1
|
||||
4g5g: 1=COMP128v1
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -246,8 +256,9 @@ Authenticating...
|
|||
Programming Authentication parameters...
|
||||
* Initalizing...
|
||||
* New algorithm setting:
|
||||
2G: 1=COMP128v1
|
||||
3G: 4=MILENAGE
|
||||
2g: 1=COMP128v1
|
||||
3g: 4=MILENAGE
|
||||
4g5g: 4=MILENAGE
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -270,8 +281,9 @@ Reading Authentication parameters...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current algorithm setting:
|
||||
2G: 1=COMP128v1
|
||||
3G: 4=MILENAGE
|
||||
2g: 1=COMP128v1
|
||||
3g: 4=MILENAGE
|
||||
4g5g: 4=MILENAGE
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -292,8 +304,9 @@ Authenticating...
|
|||
Programming Authentication parameters...
|
||||
* Initalizing...
|
||||
* New algorithm setting:
|
||||
2G: 3=COMP128v3
|
||||
3G: 15=XOR
|
||||
2g: 3=COMP128v3
|
||||
3g: 15=XOR
|
||||
4g5g: 15=XOR
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -316,8 +329,9 @@ Reading Authentication parameters...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current algorithm setting:
|
||||
2G: 3=COMP128v3
|
||||
3G: 15=XOR
|
||||
2g: 3=COMP128v3
|
||||
3g: 15=XOR
|
||||
4g5g: 15=XOR
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -338,8 +352,9 @@ Authenticating...
|
|||
Programming Authentication parameters...
|
||||
* Initalizing...
|
||||
* New algorithm setting:
|
||||
2G: 2=COMP128v2
|
||||
3G: 2=COMP128v2
|
||||
2g: 2=COMP128v2
|
||||
3g: 2=COMP128v2
|
||||
4g5g: 2=COMP128v2
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -362,8 +377,9 @@ Reading Authentication parameters...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current algorithm setting:
|
||||
2G: 2=COMP128v2
|
||||
3G: 2=COMP128v2
|
||||
2g: 2=COMP128v2
|
||||
3g: 2=COMP128v2
|
||||
4g5g: 2=COMP128v2
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -384,8 +400,9 @@ Authenticating...
|
|||
Programming Authentication parameters...
|
||||
* Initalizing...
|
||||
* New algorithm setting:
|
||||
2G: 1=COMP128v1
|
||||
3G: 3=COMP128v3
|
||||
2g: 1=COMP128v1
|
||||
3g: 3=COMP128v3
|
||||
4g5g: 3=COMP128v3
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -408,8 +425,9 @@ Reading Authentication parameters...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current algorithm setting:
|
||||
2G: 1=COMP128v1
|
||||
3G: 3=COMP128v3
|
||||
2g: 1=COMP128v1
|
||||
3g: 3=COMP128v3
|
||||
4g5g: 3=COMP128v3
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -430,8 +448,9 @@ Authenticating...
|
|||
Programming Authentication parameters...
|
||||
* Initalizing...
|
||||
* New algorithm setting:
|
||||
2G: 14=XOR-2G
|
||||
3G: 4=MILENAGE
|
||||
2g: 14=XOR-2G
|
||||
3g: 4=MILENAGE
|
||||
4g5g: 4=MILENAGE
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -454,8 +473,9 @@ Reading Authentication parameters...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current algorithm setting:
|
||||
2G: 14=XOR-2G
|
||||
3G: 4=MILENAGE
|
||||
2g: 14=XOR-2G
|
||||
3g: 4=MILENAGE
|
||||
4g5g: 4=MILENAGE
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -476,8 +496,9 @@ Authenticating...
|
|||
Programming Authentication parameters...
|
||||
* Initalizing...
|
||||
* New algorithm setting:
|
||||
2G: 2=COMP128v2
|
||||
3G: 6=TUAK
|
||||
2g: 2=COMP128v2
|
||||
3g: 6=TUAK
|
||||
4g5g: 6=TUAK
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -500,8 +521,9 @@ Reading Authentication parameters...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current algorithm setting:
|
||||
2G: 2=COMP128v2
|
||||
3G: 6=TUAK
|
||||
2g: 2=COMP128v2
|
||||
3g: 6=TUAK
|
||||
4g5g: 6=TUAK
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -522,8 +544,9 @@ Authenticating...
|
|||
Programming Authentication parameters...
|
||||
* Initalizing...
|
||||
* New algorithm setting:
|
||||
2G: 6=TUAK
|
||||
3G: 4=MILENAGE
|
||||
2g: 6=TUAK
|
||||
3g: 4=MILENAGE
|
||||
4g5g: 4=MILENAGE
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -546,8 +569,9 @@ Reading Authentication parameters...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current algorithm setting:
|
||||
2G: 6=TUAK
|
||||
3G: 4=MILENAGE
|
||||
2g: 6=TUAK
|
||||
3g: 4=MILENAGE
|
||||
4g5g: 4=MILENAGE
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -568,8 +592,9 @@ Authenticating...
|
|||
Programming Authentication parameters...
|
||||
* Initalizing...
|
||||
* New algorithm setting:
|
||||
2G: 14=XOR-2G
|
||||
3G: 6=TUAK
|
||||
2g: 14=XOR-2G
|
||||
3g: 6=TUAK
|
||||
4g5g: 6=TUAK
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -592,8 +617,9 @@ Reading Authentication parameters...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current algorithm setting:
|
||||
2G: 14=XOR-2G
|
||||
3G: 6=TUAK
|
||||
2g: 14=XOR-2G
|
||||
3g: 6=TUAK
|
||||
4g5g: 6=TUAK
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -614,8 +640,9 @@ Authenticating...
|
|||
Programming Authentication parameters...
|
||||
* Initalizing...
|
||||
* New algorithm setting:
|
||||
2G: 4=MILENAGE
|
||||
3G: 4=MILENAGE
|
||||
2g: 4=MILENAGE
|
||||
3g: 4=MILENAGE
|
||||
4g5g: 4=MILENAGE
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -638,8 +665,9 @@ Reading Authentication parameters...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current algorithm setting:
|
||||
2G: 4=MILENAGE
|
||||
3G: 4=MILENAGE
|
||||
2g: 4=MILENAGE
|
||||
3g: 4=MILENAGE
|
||||
4g5g: 4=MILENAGE
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -660,8 +688,9 @@ Authenticating...
|
|||
Programming Authentication parameters...
|
||||
* Initalizing...
|
||||
* New algorithm setting:
|
||||
2G: 6=TUAK
|
||||
3G: 6=TUAK
|
||||
2g: 6=TUAK
|
||||
3g: 6=TUAK
|
||||
4g5g: 6=TUAK
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -684,8 +713,9 @@ Reading Authentication parameters...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current algorithm setting:
|
||||
2G: 6=TUAK
|
||||
3G: 6=TUAK
|
||||
2g: 6=TUAK
|
||||
3g: 6=TUAK
|
||||
4g5g: 6=TUAK
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -706,8 +736,9 @@ Authenticating...
|
|||
Programming Authentication parameters...
|
||||
* Initalizing...
|
||||
* New algorithm setting:
|
||||
2G: 1=COMP128v1
|
||||
3G: 4=MILENAGE
|
||||
2g: 1=COMP128v1
|
||||
3g: 4=MILENAGE
|
||||
4g5g: 4=MILENAGE
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -730,8 +761,9 @@ Reading Authentication parameters...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current algorithm setting:
|
||||
2G: 1=COMP128v1
|
||||
3G: 4=MILENAGE
|
||||
2g: 1=COMP128v1
|
||||
3g: 4=MILENAGE
|
||||
4g5g: 4=MILENAGE
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -752,8 +784,9 @@ Authenticating...
|
|||
Programming Authentication parameters...
|
||||
* Initalizing...
|
||||
* New algorithm setting:
|
||||
2G: 3=COMP128v3
|
||||
3G: 4=MILENAGE
|
||||
2g: 3=COMP128v3
|
||||
3g: 4=MILENAGE
|
||||
4g5g: 4=MILENAGE
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -776,8 +809,9 @@ Reading Authentication parameters...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current algorithm setting:
|
||||
2G: 3=COMP128v3
|
||||
3G: 4=MILENAGE
|
||||
2g: 3=COMP128v3
|
||||
3g: 4=MILENAGE
|
||||
4g5g: 4=MILENAGE
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -798,8 +832,9 @@ Authenticating...
|
|||
Programming Authentication parameters...
|
||||
* Initalizing...
|
||||
* New algorithm setting:
|
||||
2G: 2=COMP128v2
|
||||
3G: 4=MILENAGE
|
||||
2g: 2=COMP128v2
|
||||
3g: 4=MILENAGE
|
||||
4g5g: 4=MILENAGE
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -822,8 +857,9 @@ Reading Authentication parameters...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current algorithm setting:
|
||||
2G: 2=COMP128v2
|
||||
3G: 4=MILENAGE
|
||||
2g: 2=COMP128v2
|
||||
3g: 4=MILENAGE
|
||||
4g5g: 4=MILENAGE
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -844,8 +880,9 @@ Authenticating...
|
|||
Programming Authentication parameters...
|
||||
* Initalizing...
|
||||
* New algorithm setting:
|
||||
2G: 2=COMP128v2
|
||||
3G: 6=TUAK
|
||||
2g: 2=COMP128v2
|
||||
3g: 6=TUAK
|
||||
4g5g: 6=TUAK
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -868,8 +905,9 @@ Reading Authentication parameters...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current algorithm setting:
|
||||
2G: 2=COMP128v2
|
||||
3G: 6=TUAK
|
||||
2g: 2=COMP128v2
|
||||
3g: 6=TUAK
|
||||
4g5g: 6=TUAK
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -890,8 +928,9 @@ Authenticating...
|
|||
Programming Authentication parameters...
|
||||
* Initalizing...
|
||||
* New algorithm setting:
|
||||
2G: 2=COMP128v2
|
||||
3G: 14=XOR-2G
|
||||
2g: 2=COMP128v2
|
||||
3g: 14=XOR-2G
|
||||
4g5g: 14=XOR-2G
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -914,8 +953,9 @@ Reading Authentication parameters...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current algorithm setting:
|
||||
2G: 2=COMP128v2
|
||||
3G: 14=XOR-2G
|
||||
2g: 2=COMP128v2
|
||||
3g: 14=XOR-2G
|
||||
4g5g: 14=XOR-2G
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -936,8 +976,9 @@ Authenticating...
|
|||
Programming Authentication parameters...
|
||||
* Initalizing...
|
||||
* New algorithm setting:
|
||||
2G: 5=SHA1-AKA
|
||||
3G: 15=XOR
|
||||
2g: 5=SHA1-AKA
|
||||
3g: 15=XOR
|
||||
4g5g: 15=XOR
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -960,8 +1001,9 @@ Reading Authentication parameters...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current algorithm setting:
|
||||
2G: 5=SHA1-AKA
|
||||
3G: 15=XOR
|
||||
2g: 5=SHA1-AKA
|
||||
3g: 15=XOR
|
||||
4g5g: 15=XOR
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -982,8 +1024,9 @@ Authenticating...
|
|||
Programming Authentication parameters...
|
||||
* Initalizing...
|
||||
* New algorithm setting:
|
||||
2G: 1=COMP128v1
|
||||
3G: 4=MILENAGE
|
||||
2g: 1=COMP128v1
|
||||
3g: 4=MILENAGE
|
||||
4g5g: 4=MILENAGE
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -1006,8 +1049,9 @@ Reading Authentication parameters...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current algorithm setting:
|
||||
2G: 1=COMP128v1
|
||||
3G: 4=MILENAGE
|
||||
2g: 1=COMP128v1
|
||||
3g: 4=MILENAGE
|
||||
4g5g: 4=MILENAGE
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -1028,8 +1072,9 @@ Authenticating...
|
|||
Programming Authentication parameters...
|
||||
* Initalizing...
|
||||
* New algorithm setting:
|
||||
2G: 14=XOR-2G
|
||||
3G: 6=TUAK
|
||||
2g: 14=XOR-2G
|
||||
3g: 6=TUAK
|
||||
4g5g: 6=TUAK
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -1052,7 +1097,8 @@ Reading Authentication parameters...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current algorithm setting:
|
||||
2G: 14=XOR-2G
|
||||
3G: 6=TUAK
|
||||
2g: 14=XOR-2G
|
||||
3g: 6=TUAK
|
||||
4g5g: 6=TUAK
|
||||
|
||||
Done!
|
||||
|
|
|
@ -1,6 +1,30 @@
|
|||
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
|
||||
|
@ -39,7 +63,9 @@ Reading OP/c value...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current OP/OPc setting:
|
||||
OPc: 000102030405060708090a0b0c0d0e0f
|
||||
2g: OPc: 000102030405060708090a0b0c0d0e0f
|
||||
3g: OPc: 000102030405060708090a0b0c0d0e0f
|
||||
4g5g: OPc: 000102030405060708090a0b0c0d0e0f
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -83,6 +109,8 @@ Reading OP/c value...
|
|||
* Initalizing...
|
||||
* Reading...
|
||||
* Current OP/OPc setting:
|
||||
OP: 840337c3d45397ce8ea8609ffdc47224
|
||||
2g: OP: 840337c3d45397ce8ea8609ffdc47224
|
||||
3g: OP: 840337c3d45397ce8ea8609ffdc47224
|
||||
4g5g: OP: 840337c3d45397ce8ea8609ffdc47224
|
||||
|
||||
Done!
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#!/bin/sh
|
||||
. ./test-data
|
||||
|
||||
$TOOL -a $ADMPIN -T "MILENAGE:MILENAGE"
|
||||
|
||||
$TOOL -a $ADMPIN -C 000102030405060708090a0b0c0d0e0f
|
||||
$TOOL -a $ADMPIN -o
|
||||
|
||||
|
|
|
@ -13,10 +13,10 @@ Authenticating...
|
|||
* Authentication successful
|
||||
* Remaining attempts: 3
|
||||
|
||||
Writing KI value...
|
||||
Writing Ki value...
|
||||
* Initalizing...
|
||||
* New KI setting:
|
||||
KI: a0b1c2d3e4f5061728394a5b6c7d8e9f
|
||||
* New Ki setting:
|
||||
Ki: a0b1c2d3e4f5061728394a5b6c7d8e9f
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -35,11 +35,13 @@ Authenticating...
|
|||
* Authentication successful
|
||||
* Remaining attempts: 3
|
||||
|
||||
Reading KI value...
|
||||
Reading Ki value...
|
||||
* Initalizing...
|
||||
* Reading...
|
||||
* Current KI setting:
|
||||
KI: a0b1c2d3e4f5061728394a5b6c7d8e9f
|
||||
* Current Ki setting:
|
||||
2g: Ki: a0b1c2d3e4f5061728394a5b6c7d8e9f
|
||||
3g: Ki: a0b1c2d3e4f5061728394a5b6c7d8e9f
|
||||
4g5g: Ki: a0b1c2d3e4f5061728394a5b6c7d8e9f
|
||||
|
||||
Done!
|
||||
sysmoISIM-SJA5 parameterization tool
|
||||
|
@ -57,10 +59,10 @@ Authenticating...
|
|||
* Authentication successful
|
||||
* Remaining attempts: 3
|
||||
|
||||
Writing KI value...
|
||||
Writing Ki value...
|
||||
* Initalizing...
|
||||
* New KI setting:
|
||||
KI: d7882eae7cd14f06108c55f8e5cffe93
|
||||
* New Ki setting:
|
||||
Ki: d7882eae7cd14f06108c55f8e5cffe93
|
||||
* Programming...
|
||||
|
||||
Done!
|
||||
|
@ -79,10 +81,12 @@ Authenticating...
|
|||
* Authentication successful
|
||||
* Remaining attempts: 3
|
||||
|
||||
Reading KI value...
|
||||
Reading Ki value...
|
||||
* Initalizing...
|
||||
* Reading...
|
||||
* Current KI setting:
|
||||
KI: d7882eae7cd14f06108c55f8e5cffe93
|
||||
* Current Ki setting:
|
||||
2g: Ki: d7882eae7cd14f06108c55f8e5cffe93
|
||||
3g: Ki: d7882eae7cd14f06108c55f8e5cffe93
|
||||
4g5g: Ki: d7882eae7cd14f06108c55f8e5cffe93
|
||||
|
||||
Done!
|
||||
|
|
Loading…
Reference in New Issue