4 Commits

Author SHA1 Message Date
Alexander Couzens
369bdb98c6 working without the step 0 hack
Change-Id: I52a8799be88a8cc5d6113466cd6f4d0d42f37adc
2025-12-16 14:49:21 +01:00
Alexander Couzens
4f30a9c2f7 osmo-smdpp: ignore EID check in EUM cert
Change-Id: Ia5baf42878f0e83b0d24350c5b265a8aadbe1a34
2025-12-16 14:21:13 +01:00
Alexander Couzens
51d91896ff Hack: make the congress profile working
Change-Id: I121a4a1a0c2279b7a44417a1f805b29dff1adc8e
2025-12-15 22:34:36 +01:00
Alexander Couzens
125449126d ts_31_102: EF SUCI_Calc_Info: fix decoding empty files
When trying to use `edit_binary_decoded` with an empty file, pysim
runs into a len(None) exception, because hpkl.to_dict()['hnet_pubkey_list'] returns
None.

Can reproduced with a CCC Camp 2023 usim and editing the file.

Change-Id: Ib8e322e65dd768bfd49e7a5620a2163f12a74ec7
2025-12-14 23:51:49 +01:00
4 changed files with 30 additions and 6 deletions

View File

@@ -618,7 +618,7 @@ class SmDppHttpServer:
# Verify EID is within permitted range of EUM certificate # Verify EID is within permitted range of EUM certificate
if not validate_eid_range(ss.eid, eum_cert): if not validate_eid_range(ss.eid, eum_cert):
raise ApiError('8.1.4', '6.1', 'EID is not within the permitted range of the EUM certificate') logger.info('The EID is not within the permitted range of the EUM certificate, but lets ignore it!')
# Verify that the serverChallenge attached to the ongoing RSP session matches the # Verify that the serverChallenge attached to the ongoing RSP session matches the
# serverChallenge returned by the eUICC. Otherwise, the SM-DP+ SHALL return a status code "eUICC - # serverChallenge returned by the eUICC. Otherwise, the SM-DP+ SHALL return a status code "eUICC -

View File

@@ -144,6 +144,9 @@ class File:
def file_size(self) -> Optional[int]: def file_size(self) -> Optional[int]:
"""Return the size of the file in bytes.""" """Return the size of the file in bytes."""
if self.file_type in ['LF', 'CY']: if self.file_type in ['LF', 'CY']:
if self._file_size and self.nb_rec is None and self.rec_len:
self.nb_rec = self._file_size // self.rec_len
return self.nb_rec * self.rec_len return self.nb_rec * self.rec_len
elif self.file_type in ['TR', 'BT']: elif self.file_type in ['TR', 'BT']:
return self._file_size return self._file_size
@@ -291,6 +294,13 @@ class File:
dfName = fileDescriptor.get('dfName', None) dfName = fileDescriptor.get('dfName', None)
if dfName: if dfName:
self.df_name = dfName self.df_name = dfName
dfName = fileDescriptor.get('dfName', None)
if dfName:
self.df_name = dfName
efFileSize = fileDescriptor.get('efFileSize', None)
if efFileSize:
self._file_size = self._decode_file_size(efFileSize)
pefi = fileDescriptor.get('proprietaryEFInfo', {}) pefi = fileDescriptor.get('proprietaryEFInfo', {})
securityAttributesReferenced = fileDescriptor.get('securityAttributesReferenced', None) securityAttributesReferenced = fileDescriptor.get('securityAttributesReferenced', None)
if securityAttributesReferenced: if securityAttributesReferenced:
@@ -300,13 +310,11 @@ class File:
fdb_dec = fd_dec['file_descriptor_byte'] fdb_dec = fd_dec['file_descriptor_byte']
self.shareable = fdb_dec['shareable'] self.shareable = fdb_dec['shareable']
if fdb_dec['file_type'] == 'working_ef': if fdb_dec['file_type'] == 'working_ef':
efFileSize = fileDescriptor.get('efFileSize', None)
if fd_dec['num_of_rec']: if fd_dec['num_of_rec']:
self.nb_rec = fd_dec['num_of_rec'] self.nb_rec = fd_dec['num_of_rec']
if fd_dec['record_len']: if fd_dec['record_len']:
self.rec_len = fd_dec['record_len'] self.rec_len = fd_dec['record_len']
if efFileSize: if efFileSize:
self._file_size = self._decode_file_size(efFileSize)
if self.rec_len and self.nb_rec == None: if self.rec_len and self.nb_rec == None:
# compute the number of records from file size and record length # compute the number of records from file size and record length
self.nb_rec = self._file_size // self.rec_len self.nb_rec = self._file_size // self.rec_len
@@ -352,6 +360,9 @@ class File:
fd = self.get_tuplelist_item(l, 'fileDescriptor') fd = self.get_tuplelist_item(l, 'fileDescriptor')
if not fd and not self._template_derived: if not fd and not self._template_derived:
raise ValueError("%s: No fileDescriptor found in tuple, and none set by template before" % self) raise ValueError("%s: No fileDescriptor found in tuple, and none set by template before" % self)
if self.name == "EF.SUCI_Calc_Info":
breakpoint()
#breakpoint()
if fd: if fd:
self.from_fileDescriptor(dict(fd)) self.from_fileDescriptor(dict(fd))
# BODY # BODY
@@ -386,6 +397,16 @@ class File:
stream = io.BytesIO() stream = io.BytesIO()
# Providing file content within "fillFileContent" / "fillFileOffset" shall have the same effect as # Providing file content within "fillFileContent" / "fillFileOffset" shall have the same effect as
# creating a file with a fill/repeat pattern and thereafter updating the content via Update. # creating a file with a fill/repeat pattern and thereafter updating the content via Update.
# Step 0: determine file size
#file_size = self._file_size
#for k, v in l:
# if k != 'fileDescriptor':
# continue
# file_desc = v
# if 'efFileSize' in file_desc:
# file_size = self._decode_file_size(file_desc['efFileSize'])
# Step 1: Fill with pattern from Fcp or Template # Step 1: Fill with pattern from Fcp or Template
if self.fill_pattern: if self.fill_pattern:
stream.write(self.expand_fill_pattern()) stream.write(self.expand_fill_pattern())

View File

@@ -673,7 +673,7 @@ class FilesUsimDf5GS(ProfileTemplate):
FileTemplate(0x4f06, 'EF.UAC_AIC', 'TR', None, 4, 2, 0x06, None, True, ass_serv=[126]), FileTemplate(0x4f06, 'EF.UAC_AIC', 'TR', None, 4, 2, 0x06, None, True, ass_serv=[126]),
FileTemplate(0x4f07, 'EF.SUCI_Calc_Info', 'TR', None, None, 2, 0x07, 'FF...FF', False, ass_serv=[124]), FileTemplate(0x4f07, 'EF.SUCI_Calc_Info', 'TR', None, None, 2, 0x07, 'FF...FF', False, ass_serv=[124]),
FileTemplate(0x4f08, 'EF.OPL5G', 'LF', None, 10, 10, 0x08, 'FF...FF', False, ['nb_rec'], ass_serv=[129]), FileTemplate(0x4f08, 'EF.OPL5G', 'LF', None, 10, 10, 0x08, 'FF...FF', False, ['nb_rec'], ass_serv=[129]),
FileTemplate(0x4f09, 'EF.SUPI_NAI', 'TR', None, None, 2, 0x09, None, True, ['size'], ass_serv=[130]), FileTemplate(0x4f09, 'EF.SUPI_NAI', 'TR', None, None, 2, 0x09, None, True, ['size'], ass_serv=[130], pe_name='ef-supinai'),
FileTemplate(0x4f0a, 'EF.Routing_Indicator', 'TR', None, 4, 2, 0x0a, 'F0FFFFFF', False, ass_serv=[124]), FileTemplate(0x4f0a, 'EF.Routing_Indicator', 'TR', None, 4, 2, 0x0a, 'F0FFFFFF', False, ass_serv=[124]),
] ]
@@ -818,7 +818,7 @@ class FilesIsimOptional(ProfileTemplate):
base_path = Path('ADF.ISIM') base_path = Path('ADF.ISIM')
extends = FilesIsimMandatory extends = FilesIsimMandatory
files = [ files = [
FileTemplate(0x6f09, 'EF.P-CSCF', 'LF', 1, None, 2, None, None, True, ['size'], ass_serv=[1,5]), FileTemplate(0x6f09, 'EF.P-CSCF', 'LF', 1, None, 2, None, None, True, ['size'], ass_serv=[1,5], pe_name='ef-pcscf'),
FileTemplate(0x6f3c, 'EF.SMS', 'LF', 10, 176, 5, None, '00FF...FF', False, ass_serv=[6,8]), FileTemplate(0x6f3c, 'EF.SMS', 'LF', 10, 176, 5, None, '00FF...FF', False, ass_serv=[6,8]),
FileTemplate(0x6f42, 'EF.SMSP', 'LF', 1, 38, 5, None, 'FF...FF', False, ass_serv=[8]), FileTemplate(0x6f42, 'EF.SMSP', 'LF', 1, 38, 5, None, 'FF...FF', False, ass_serv=[8]),
FileTemplate(0x6f43, 'EF.SMSS', 'TR', None, 2, 5, None, 'FFFF', False, ass_serv=[6,8]), FileTemplate(0x6f43, 'EF.SMSS', 'TR', None, 2, 5, None, 'FFFF', False, ass_serv=[6,8]),

View File

@@ -389,6 +389,9 @@ class EF_SUCI_Calc_Info(TransparentEF):
# remaining data holds Home Network Public Key Data Object # remaining data holds Home Network Public Key Data Object
hpkl = EF_SUCI_Calc_Info.HnetPubkeyList() hpkl = EF_SUCI_Calc_Info.HnetPubkeyList()
hpkl.from_tlv(in_bytes[pos:]) hpkl.from_tlv(in_bytes[pos:])
hnet_pubkey_list = []
if hpkl.to_dict()['hnet_pubkey_list']:
hnet_pubkey_list = self._compact_pubkey_list(hpkl.to_dict()['hnet_pubkey_list']) hnet_pubkey_list = self._compact_pubkey_list(hpkl.to_dict()['hnet_pubkey_list'])
return { return {