laforge has submitted this change. (
https://gerrit.osmocom.org/c/pysim/+/31070 )
Change subject: ts_51_011: Improve decoding of SELECT response for classic SIM
......................................................................
ts_51_011: Improve decoding of SELECT response for classic SIM
When decoding the SELECT response of a clasic GSM SIM without
UICC functionality, we
* did not decode the record length or number of records
* accidentially reported the EF file_size as available_memory (like DF)
Let's fix those two, and also add a comment on how the output dict
of decode_select_response() should look like.
As a result, code like 'read_records' now knows the number of records
and can iterate over them rather than raising exceptions.
Change-Id: Ia8e890bda74e3b4dacca0673d6e5ed8692dabd87
Closes: OS#5874
---
M pySim/ts_51_011.py
1 file changed, 9 insertions(+), 2 deletions(-)
Approvals:
Jenkins Builder: Verified
laforge: Verified
pespin: Looks good to me, but someone else must approve
fixeria: Looks good to me, approved
diff --git a/pySim/ts_51_011.py b/pySim/ts_51_011.py
index 18138a0..cd17ec8 100644
--- a/pySim/ts_51_011.py
+++ b/pySim/ts_51_011.py
@@ -1124,6 +1124,9 @@
@staticmethod
def decode_select_response(resp_hex: str) -> object:
+ # we try to build something that resembles a dict resulting from the TLV decoder
+ # of TS 102.221 (FcpTemplate), so that higher-level code only has to deal with
one
+ # format of SELECT response
resp_bin = h2b(resp_hex)
struct_of_file_map = {
0: 'transparent',
@@ -1142,21 +1145,25 @@
'proprietary_info': {},
}
ret['file_id'] = b2h(resp_bin[4:6])
- ret['proprietary_info']['available_memory'] = int.from_bytes(
- resp_bin[2:4], 'big')
file_type = type_of_file_map[resp_bin[6]
] if resp_bin[6] in type_of_file_map else
resp_bin[6]
ret['file_descriptor']['file_descriptor_byte']['file_type'] =
file_type
if file_type in ['mf', 'df']:
+ ret['proprietary_info']['available_memory'] =
int.from_bytes(resp_bin[2:4], 'big')
ret['file_characteristics'] = b2h(resp_bin[13:14])
ret['num_direct_child_df'] = resp_bin[14]
ret['num_direct_child_ef'] = resp_bin[15]
ret['num_chv_unblock_adm_codes'] = int(resp_bin[16])
# CHV / UNBLOCK CHV stats
elif file_type in ['working_ef']:
+ ret['file_size'] = int.from_bytes(resp_bin[2:4], 'big')
file_struct = struct_of_file_map[resp_bin[13]
] if resp_bin[13] in struct_of_file_map else
resp_bin[13]
ret['file_descriptor']['file_descriptor_byte']['structure'] =
file_struct
+ if file_struct != 'transparent':
+ record_len = resp_bin[14]
+ ret['file_descriptor']['record_len'] = record_len
+ ret['file_descriptor']['num_of_rec'] =
ret['file_size'] // record_len
ret['access_conditions'] = b2h(resp_bin[8:10])
if resp_bin[11] & 0x01 == 0:
ret['life_cycle_status_int'] = 'operational_activated'
2 is the latest approved patch-set.
No files were changed between the latest approved patch-set and the submitted one.
--
To view, visit
https://gerrit.osmocom.org/c/pysim/+/31070
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: Ia8e890bda74e3b4dacca0673d6e5ed8692dabd87
Gerrit-Change-Number: 31070
Gerrit-PatchSet: 3
Gerrit-Owner: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
Gerrit-MessageType: merged