Compare commits
9 Commits
daniel/ota
...
lynxis/esi
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
369bdb98c6 | ||
|
|
4f30a9c2f7 | ||
|
|
51d91896ff | ||
|
|
125449126d | ||
|
|
572a81f2af | ||
|
|
ff4f2491b8 | ||
|
|
05fd870d1b | ||
|
|
c07ecbae52 | ||
|
|
e20f9e6cdf |
@@ -329,7 +329,7 @@ def do_info(pes: ProfileElementSequence, opts):
|
|||||||
print("Security domain Instance AID: %s" % b2h(sd.decoded['instance']['instanceAID']))
|
print("Security domain Instance AID: %s" % b2h(sd.decoded['instance']['instanceAID']))
|
||||||
# FIXME: 'applicationSpecificParametersC9' parsing to figure out enabled SCP
|
# FIXME: 'applicationSpecificParametersC9' parsing to figure out enabled SCP
|
||||||
for key in sd.keys:
|
for key in sd.keys:
|
||||||
print("\tKVN=0x%02x, KID=0x%02x, %s" % (key.key_version_number, key.key_identifier, key.key_components))
|
print("\t%s" % repr(key))
|
||||||
|
|
||||||
# RFM
|
# RFM
|
||||||
print()
|
print()
|
||||||
|
|||||||
@@ -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 -
|
||||||
|
|||||||
@@ -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())
|
||||||
@@ -985,9 +1006,9 @@ class SecurityDomainKey:
|
|||||||
self.key_components = key_components
|
self.key_components = key_components
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
return 'SdKey(KVN=0x%02x, ID=0x%02x, Usage=%s, Comp=%s)' % (self.key_version_number,
|
return 'SdKey(KVN=0x%02x, ID=0x%02x, Usage=0x%x, Comp=%s)' % (self.key_version_number,
|
||||||
self.key_identifier,
|
self.key_identifier,
|
||||||
self.key_usage_qualifier,
|
build_construct(KeyUsageQualifier, self.key_usage_qualifier)[0],
|
||||||
repr(self.key_components))
|
repr(self.key_components))
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|||||||
@@ -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]),
|
||||||
|
|||||||
@@ -477,11 +477,15 @@ class RuntimeLchan:
|
|||||||
|
|
||||||
def get_file_for_filename(self, name: str):
|
def get_file_for_filename(self, name: str):
|
||||||
"""Get the related CardFile object for a specified filename."""
|
"""Get the related CardFile object for a specified filename."""
|
||||||
|
if is_hex(name):
|
||||||
|
name = name.lower()
|
||||||
sels = self.selected_file.get_selectables()
|
sels = self.selected_file.get_selectables()
|
||||||
return sels[name]
|
return sels[name]
|
||||||
|
|
||||||
def activate_file(self, name: str):
|
def activate_file(self, name: str):
|
||||||
"""Request ACTIVATE FILE of specified file."""
|
"""Request ACTIVATE FILE of specified file."""
|
||||||
|
if is_hex(name):
|
||||||
|
name = name.lower()
|
||||||
sels = self.selected_file.get_selectables()
|
sels = self.selected_file.get_selectables()
|
||||||
f = sels[name]
|
f = sels[name]
|
||||||
data, sw = self.scc.activate_file(f.fid)
|
data, sw = self.scc.activate_file(f.fid)
|
||||||
|
|||||||
@@ -750,7 +750,7 @@ class EF_ARR(LinFixedEF):
|
|||||||
@cmd2.with_argparser(LinFixedEF.ShellCommands.read_rec_dec_parser)
|
@cmd2.with_argparser(LinFixedEF.ShellCommands.read_rec_dec_parser)
|
||||||
def do_read_arr_record(self, opts):
|
def do_read_arr_record(self, opts):
|
||||||
"""Read one EF.ARR record in flattened, human-friendly form."""
|
"""Read one EF.ARR record in flattened, human-friendly form."""
|
||||||
(data, _sw) = self._cmd.lchan.read_record_dec(opts.record_nr)
|
(data, _sw) = self._cmd.lchan.read_record_dec(opts.RECORD_NR)
|
||||||
data = self._cmd.lchan.selected_file.flatten(data)
|
data = self._cmd.lchan.selected_file.flatten(data)
|
||||||
self._cmd.poutput_json(data, opts.oneline)
|
self._cmd.poutput_json(data, opts.oneline)
|
||||||
|
|
||||||
|
|||||||
@@ -389,7 +389,10 @@ 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 = self._compact_pubkey_list(hpkl.to_dict()['hnet_pubkey_list'])
|
|
||||||
|
hnet_pubkey_list = []
|
||||||
|
if hpkl.to_dict()['hnet_pubkey_list']:
|
||||||
|
hnet_pubkey_list = self._compact_pubkey_list(hpkl.to_dict()['hnet_pubkey_list'])
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'prot_scheme_id_list': prot_scheme_id_list,
|
'prot_scheme_id_list': prot_scheme_id_list,
|
||||||
|
|||||||
Reference in New Issue
Block a user