Compare commits

...

7 Commits

Author SHA1 Message Date
Philipp Maier 4f605a6d56 sysmo_isim_sja2: convert #comments to python comments where possible
Related: SYS#6473
2023-06-23 10:04:55 +02:00
Philipp Maier f75c4fb7e4 sysmo_isim_sja2: rename classes SYSMO_ISIMSJA2_ to SYSMO_ISIMSJAX_
The classes that model the file layout are applicable on both card
models, so lets replace the 2 with an X
2023-06-23 10:04:55 +02:00
Philipp Maier 12ce2512be sysmo_isim_sja2: Add comments to explain sysmo_isimsjax_algorithms
Related: OS#6473
2023-06-23 09:56:29 +02:00
Philipp Maier 0a2aa28f4e sysmo_isim_sja2: define return types for __str__ and encode methods
Related: OS#6473
2023-06-23 09:56:16 +02:00
Philipp Maier e3d250b805 sysmo_isim_sja2: fix file naming in comment
Related: SYS#6473
2023-06-23 09:55:52 +02:00
Philipp Maier 93facf5eda sysmo_isim_sja2: update copyright header
Related: SYS#6473
2023-06-23 09:55:35 +02:00
Philipp Maier 359d8ef645 sysmo_isim_sja2: cosmetic: remove unnecessary new lines
Related: SYS#6473
2023-06-23 09:55:24 +02:00
1 changed files with 74 additions and 90 deletions

View File

@ -2,9 +2,9 @@
# -*- coding: utf-8 -*-
"""
Gadgets to modify sysmoISIM-SJA2 parameters
Gadgets to modify sysmoISIM-SJA2/sysmoISIM-SJA5 parameters
(C) 2017-2022 by sysmocom - s.f.m.c. GmbH
(C) 2017-2023 by sysmocom - s.f.m.c. GmbH
All Rights Reserved
Author: Philipp Maier
@ -40,15 +40,15 @@ import math
# |
# +--[ADF_USIM]
# | |
# | +--[USIM_AUTH_KEY 0xAF20] (regular file)
# | +--[EF_USIM_AUTH_KEY 0xAF20] (regular file)
# | |
# | +--[EF_USIM_AUTH_KEY_2G 0xAF22] (link to DF_SYSTEM/EF_SIM_AUTH_KEY)
# |
# +--[ADF_ISIM]
# |
# +--[USIM_AUTH_KEY 0xAF20] (regular file)
# +--[EF_ISIM_AUTH_KEY 0xAF20] (regular file)
# |
# +--[EF_USIM_AUTH_KEY_2G 0xAF22] (link to DF_SYSTEM/EF_SIM_AUTH_KEY)
# +--[EF_ISIM_AUTH_KEY_2G 0xAF22] (link to DF_SYSTEM/EF_SIM_AUTH_KEY)
#
# Note: EF_MILENAGE_CFG and EF_USIM_SQN not yet listed here.
@ -74,6 +74,7 @@ SYSMO_ISIMSJA5_ALGO_TUAK = 0x06
SYSMO_ISIMSJA5_ALGO_XOR_2G = 0x0E
SYSMO_ISIMSJA2_ALGO_XOR = 0x0F
# Algorithms that are supported by sysmo-isim-sja2 (and also sysmo-isim-sja5)
sysmo_isimsja2_algorithms = [
(SYSMO_ISIMSJA2_ALGO_COMP12V1, 'COMP128v1'),
(SYSMO_ISIMSJA2_ALGO_COMP12V2, 'COMP128v2'),
@ -83,12 +84,14 @@ sysmo_isimsja2_algorithms = [
(SYSMO_ISIMSJA2_ALGO_XOR, 'XOR'),
]
# Algorithms that are supported by sysmo-isim-sja5. This also includes all
# algorithms supported by sysmo-isim-sja2y
sysmo_isimsja5_algorithms = sysmo_isimsja2_algorithms + [
(SYSMO_ISIMSJA5_ALGO_XOR_2G, 'XOR-2G'),
(SYSMO_ISIMSJA5_ALGO_TUAK, 'TUAK'),
]
class SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY:
class SYSMO_ISIMSJAX_FILE_EF_XSIM_AUTH_KEY:
"""
Superclass model that generates that handles the header byte of
SYSMO_ISIMSJA2_EF_USIM_AUTH_KEY, SYSMO_ISIMSJA2_EF_USIM_AUTH_KEY_2G
@ -102,18 +105,15 @@ class SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY:
def __init__(self, content = None):
if content == None:
return
header = content[0]
self.algo = header & 0x0F
self.use_opc = bool((header >> 4) & 1)
if (header >> 5) & 1:
self.sres_dev_func = 2
else:
self.sres_dev_func = 1
def __str__(self):
def __str__(self) -> str:
dump = ""
pfx = " "
@ -130,8 +130,7 @@ class SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY:
return dump
def encode(self):
def encode(self) -> list:
out = [0x00]
out[0] = self.algo & 0x0F
if self.use_opc == True:
@ -140,7 +139,7 @@ class SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY:
return out
class SYSMO_ISIMSJA2_FILE_EF_SIM_AUTH_KEY(SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY):
class SYSMO_ISIMSJAX_FILE_EF_SIM_AUTH_KEY(SYSMO_ISIMSJAX_FILE_EF_XSIM_AUTH_KEY):
key = [0xAA] * 16
opc = [0xBB] * 16
@ -153,8 +152,7 @@ class SYSMO_ISIMSJA2_FILE_EF_SIM_AUTH_KEY(SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY):
self.key = content[1:17]
self.opc = content[17:33]
def __str__(self):
def __str__(self) -> str:
dump = ""
pfx = " "
@ -176,13 +174,13 @@ class SYSMO_ISIMSJA2_FILE_EF_SIM_AUTH_KEY(SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY):
return dump
def encode(self):
def encode(self) -> list:
out = SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY.encode(self)
out += self.key + self.opc
return out
class SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY):
class SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(SYSMO_ISIMSJAX_FILE_EF_XSIM_AUTH_KEY):
full_res = True # Return full 8-byte RES or first 4 bytes only
ext_res = False # Return 16 byte RES (ignores full_res, only valid with 3G XOR)
@ -194,7 +192,7 @@ class SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY)
if content == None:
return
SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY.__init__(self, content)
SYSMO_ISIMSJAX_FILE_EF_XSIM_AUTH_KEY.__init__(self, content)
header = content[0]
self.full_res = bool((header >> 6) & 1)
@ -204,12 +202,11 @@ class SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY)
if len(content) > 17:
self.opc = content[17:33]
def __str__(self):
def __str__(self) -> str:
dump = ""
pfx = " "
dump += SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY.__str__(self)
dump += SYSMO_ISIMSJAX_FILE_EF_XSIM_AUTH_KEY.__str__(self)
if self.full_res == True and self.ext_res == False:
dump += pfx + "3G: Return full 8-byte RES\n"
elif self.full_res == False and self.ext_res == False:
@ -237,8 +234,8 @@ class SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY)
return dump
def encode(self):
out = SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY.encode(self)
def encode(self) -> list:
out = SYSMO_ISIMSJAX_FILE_EF_XSIM_AUTH_KEY.encode(self)
if self.full_res == True:
out[0] |= 1 << 6
if self.ext_res == True:
@ -253,11 +250,11 @@ class SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(SYSMO_ISIMSJA2_FILE_EF_XSIM_AUTH_KEY)
# EF_USIM_AUTH_KEY_2G and EF_USIM_AUTH_KEY_GBA have the same layout as
# EF_USIM_AUTH_KEY, so there is nothing to specialize other than the class name
class SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY_2G(SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY):
class SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_2G(SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY):
pass
class SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY_GBA(SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY):
class SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_GBA(SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY):
pass
@ -278,7 +275,6 @@ class SYSMO_ISIMSJA2_FILE_EF_MILENAGE_CFG:
C5 = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08]
def __init__(self, content = None):
if content == None:
return
@ -295,8 +291,7 @@ class SYSMO_ISIMSJA2_FILE_EF_MILENAGE_CFG:
self.C4 = content[53:69]
self.C5 = content[69:85]
def __str__(self):
def __str__(self) -> str:
dump = " R1: " + str(hex(self.R1)) + "\n"
dump += " R2: " + str(hex(self.R2)) + "\n"
dump += " R3: " + str(hex(self.R3)) + "\n"
@ -309,14 +304,13 @@ class SYSMO_ISIMSJA2_FILE_EF_MILENAGE_CFG:
dump += " C5: " + hexdump(self.C5)
return dump
def encode(self):
def encode(self) -> list:
out = [self.R1, self.R2, self.R3, self.R4, self.R5]
out += self.C1 + self.C2 + self.C3 + self.C4 + self.C5
return out
class SYSMO_ISIMSJA2_FILE_EF_USIM_SQN:
class SYSMO_ISIMSJAX_FILE_EF_USIM_SQN:
# Flag1:
ind_size_bits = 5 # speficy file length by 2^ind_len
@ -376,11 +370,9 @@ class SYSMO_ISIMSJA2_FILE_EF_USIM_SQN:
self.age_limit = list_to_int(content[8:14])
self.freshness_data = content[15:(6*2**self.ind_size_bits)]
def __str__(self):
def __str__(self) -> str:
pfx = " "
dump = ""
dump += "%sIND (bits): %u\n" % (pfx, self.ind_size_bits)
if self.sqn_check_enabled:
dump += "%sSQN Check enabled\n" % pfx
@ -413,11 +405,9 @@ class SYSMO_ISIMSJA2_FILE_EF_USIM_SQN:
dump += "%sMax Delta: %u\n" % (pfx, self.max_delta)
dump += "%sAge Limit: %u\n" % (pfx, self.age_limit)
dump += pfx + "Freshness Data:\n" + hexdump(self.freshness_data, True)
return dump
def encode(self):
def encode(self) -> list:
out = [0x00, 0x00]
# Flag1:
@ -445,12 +435,10 @@ class SYSMO_ISIMSJA2_FILE_EF_USIM_SQN:
out += self.freshness_data
return out
def reset(self):
self.freshness_data = [0x00] * (6*2**self.ind_size_bits)
class Sysmo_isim_sja2(Sysmo_usim):
algorithms = sysmo_isimsja2_algorithms
@ -469,7 +457,6 @@ class Sysmo_isim_sja2(Sysmo_usim):
if card_detected == True:
return
# Try card model #2
try:
atr = "3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 75 31 33 02 51 B2"
@ -494,14 +481,14 @@ class Sysmo_isim_sja2(Sysmo_usim):
if card_detected == True:
return
# Exit when we are not able to detect the card
if card_detected != True:
sys.exit(1)
# Show current milenage parameters
def show_milenage_params(self):
"""
Show current milenage parameters
"""
print("Reading Milenage parameters...")
self._init()
@ -515,10 +502,10 @@ class Sysmo_isim_sja2(Sysmo_usim):
print(str(ef))
print("")
# Write new milenage parameters
def write_milenage_params(self, params):
"""
Write new milenage parameters
"""
print("Programming Milenage parameters...")
if (len(params) < 85):
@ -545,14 +532,12 @@ class Sysmo_isim_sja2(Sysmo_usim):
self.sim.update_binary(ef_milenage_cfg.encode())
print("")
# Select DF_SYSTEM/EF_SIM_AUTH_KEY
def __select_ef_sim_auth_key(self):
self.sim.select(GSM_SIM_MF)
self.sim.select(SYSMO_ISIMSJA2_DF_SYSTEM)
self.sim.select(SYSMO_ISIMSJA2_EF_SIM_AUTH_KEY)
# Authentication keys exist in various different files, which are
# similar, thie method simplifies the selection of those files
def __select_xsim_auth_key(self, isim = False, _2G = False):
@ -567,7 +552,6 @@ class Sysmo_isim_sja2(Sysmo_usim):
else:
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_AUTH_KEY)
# In the SJA2 model the key material and the algorithm configuration
# is distributed over multiple files, which may also have redundant
# contents. Files can also be hard linked to other files so that
@ -588,27 +572,27 @@ class Sysmo_isim_sja2(Sysmo_usim):
self.__select_xsim_auth_key(isim = False, _2G = True)
res = self._read_binary(self.sim.filelen)
print(" * ADF_USIM/EF_USIM_AUTH_KEY_2G:")
print(SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY_2G(res.apdu))
print(SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_2G(res.apdu))
if self.sim.has_isim:
# ADF_ISIM/EF_ISIM_AUTH_KEY_2G:
self.__select_xsim_auth_key(isim = True, _2G = True)
res = self._read_binary(self.sim.filelen)
print(" * ADF_ISIM/EF_ISIM_AUTH_KEY_2G:")
print(SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY_2G(res.apdu))
print(SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_2G(res.apdu))
# ADF_USIM/EF_USIM_AUTH_KEY:
self.__select_xsim_auth_key(isim = False, _2G = False)
res = self._read_binary(self.sim.filelen)
print(" * ADF_USIM/EF_USIM_AUTH_KEY:")
print(SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(res.apdu))
print(SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu))
if self.sim.has_isim:
# ADF_ISIM/EF_ISIM_AUTH_KEY:
self.__select_xsim_auth_key(isim = True, _2G = False)
res = self._read_binary(self.sim.filelen)
print(" * ADF_ISIM/EF_ISIM_AUTH_KEY:")
print(SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(res.apdu))
print(SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu))
# ADF_USIM/EF_MILENAGE_CFG:
self.sim.select(GSM_SIM_MF)
@ -633,7 +617,7 @@ class Sysmo_isim_sja2(Sysmo_usim):
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_SQN)
res = self._read_binary(self.sim.filelen)
print(" * ADF_USIM/EF_USIM_SQN:")
print(SYSMO_ISIMSJA2_FILE_EF_USIM_SQN(res.apdu))
print(SYSMO_ISIMSJAX_FILE_EF_USIM_SQN(res.apdu))
if self.sim.has_isim:
# ADF_USIM/EF_ISIM_SQN:
@ -642,8 +626,7 @@ 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))
def show_key_params(self):
"""
@ -656,13 +639,12 @@ 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)
print(" * Current Key setting:")
print(" Key: " + hexdump(ef.key))
print("")
def write_key_params(self, key):
"""
Program new Key value
@ -672,44 +654,43 @@ class Sysmo_isim_sja2(Sysmo_usim):
print(" * New Key setting:")
print(" Key: " + hexdump(key))
print(" * Programming...")
self.__select_xsim_auth_key(isim = False, _2G = True)
res = self._read_binary(self.sim.filelen)
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
ef.key = key
self.sim.update_binary(ef.encode())
self.__select_xsim_auth_key(isim = False, _2G = False)
res = self._read_binary(self.sim.filelen)
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(res.apdu)
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
ef.key = key
self.sim.update_binary(ef.encode())
if self.sim.has_isim:
self.__select_xsim_auth_key(isim = True, _2G = False)
res = self._read_binary(self.sim.filelen)
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(res.apdu)
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
ef.key = key
self.sim.update_binary(ef.encode())
print("")
# Show current athentication parameters
# (Which algorithim is used for which rat?)
def show_auth_params(self):
"""
Show current authentication parameters
"""
print("Reading Authentication parameters...")
self._init()
print(" * Reading...")
self.__select_xsim_auth_key(isim = False, _2G = True)
res = self._read_binary(self.sim.filelen)
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
algo_2g = ef.algo
self.__select_xsim_auth_key(isim = False, _2G = False)
res = self._read_binary(self.sim.filelen)
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(res.apdu)
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
algo_3g = ef.algo
print(" * Current algorithm setting:")
@ -717,9 +698,10 @@ class Sysmo_isim_sja2(Sysmo_usim):
print(" 3G: %d=%s" % (algo_3g, id_to_str(self.algorithms, algo_3g)))
print("")
# Program new authentication parameters
def write_auth_params(self, algo_2g_str, algo_3g_str):
"""
Write new authentication parameters
"""
print("Programming Authentication parameters...")
self._init()
@ -741,28 +723,29 @@ class Sysmo_isim_sja2(Sysmo_usim):
self.__select_xsim_auth_key(isim = False, _2G = True)
res = self._read_binary(self.sim.filelen)
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
ef.algo = algo_2g
self.sim.update_binary(ef.encode())
self.__select_xsim_auth_key(isim = False, _2G = False)
res = self._read_binary(self.sim.filelen)
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(res.apdu)
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
ef.algo = algo_3g
self.sim.update_binary(ef.encode())
if self.sim.has_isim:
self.__select_xsim_auth_key(isim = True, _2G = False)
res = self._read_binary(self.sim.filelen)
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(res.apdu)
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
ef.algo = algo_3g
self.sim.update_binary(ef.encode())
print("")
# Show current OPc value
def show_opc_params(self):
"""
Show OP/OPc current configuration. (see also method: write_opc_params).
"""
print("Reading OP/c value...")
self._init()
@ -770,7 +753,7 @@ class Sysmo_isim_sja2(Sysmo_usim):
print(" * Reading...")
self.__select_xsim_auth_key(isim = False, _2G = False)
res = self._read_binary(self.sim.filelen)
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(res.apdu)
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
if ef.use_opc:
mode_str = "OPc"
@ -781,9 +764,10 @@ class Sysmo_isim_sja2(Sysmo_usim):
print(" %s: %s" % (mode_str, hexdump(ef.opc)))
print("")
# Program new OPc value
def write_opc_params(self, select, op):
"""
Program new OPc value
"""
if select:
print("Writing OPc value...")
mode_str = "OPc"
@ -796,10 +780,9 @@ class Sysmo_isim_sja2(Sysmo_usim):
print(" %s: %s" % (mode_str, hexdump(op)))
print(" * Programming...")
self.__select_xsim_auth_key(isim = False, _2G = True)
res = self._read_binary(self.sim.filelen)
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY_2G(res.apdu)
ef.opc = op
ef.use_opc = bool(select)
self.sim.update_binary(ef.encode())
@ -807,23 +790,24 @@ class Sysmo_isim_sja2(Sysmo_usim):
if self.sim.has_isim:
self.__select_xsim_auth_key(isim = True, _2G = False)
res = self._read_binary(self.sim.filelen)
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(res.apdu)
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
ef.opc = op
ef.use_opc = bool(select)
self.sim.update_binary(ef.encode())
self.__select_xsim_auth_key(isim = False, _2G = False)
res = self._read_binary(self.sim.filelen)
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_AUTH_KEY(res.apdu)
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_AUTH_KEY(res.apdu)
ef.opc = op
ef.use_opc = bool(select)
self.sim.update_binary(ef.encode())
print("")
# Show current milenage SQN parameters
def show_milenage_sqn_params(self):
"""
Show current milenage SQN parameters
"""
print("Reading Milenage Sequence parameters...")
self._init()
@ -832,7 +816,7 @@ class Sysmo_isim_sja2(Sysmo_usim):
self.sim.card.SELECT_ADF_USIM()
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_SQN)
res = self._read_binary(self.sim.filelen)
print(SYSMO_ISIMSJA2_FILE_EF_USIM_SQN(res.apdu))
print(SYSMO_ISIMSJAX_FILE_EF_USIM_SQN(res.apdu))
if self.sim.has_isim:
print(" * Current SQN Configuration for ADF_ISIM:")
@ -840,13 +824,14 @@ class Sysmo_isim_sja2(Sysmo_usim):
self.sim.card.SELECT_ADF_ISIM()
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_SQN)
res = self._read_binary(self.sim.filelen)
print(SYSMO_ISIMSJA2_FILE_EF_USIM_SQN(res.apdu))
print(SYSMO_ISIMSJAX_FILE_EF_USIM_SQN(res.apdu))
print("")
# Reset milenage SQN configuration
def reset_milenage_sqn_params(self):
"""
Reset milenage SQN configuration
"""
print(" * Resetting SQN Configuration to defaults...")
self._init()
@ -855,18 +840,17 @@ class Sysmo_isim_sja2(Sysmo_usim):
self.sim.card.SELECT_ADF_USIM()
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_SQN)
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_SQN()
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_SQN()
self.sim.update_binary(ef.encode())
if self.sim.has_isim:
self.sim.card.SELECT_ADF_ISIM()
self.sim.select(SYSMO_ISIMSJA2_EF_USIM_SQN)
ef = SYSMO_ISIMSJA2_FILE_EF_USIM_SQN()
ef = SYSMO_ISIMSJAX_FILE_EF_USIM_SQN()
self.sim.update_binary(ef.encode())
print("")
class Sysmo_isim_sja5(Sysmo_isim_sja2):
algorithms = sysmo_isimsja5_algorithms