pySim/ts_51_011: Properly re-compute ScAddr length
EF.SMSP contains up to two addresses: Both are stored in a fixed-length field of 12 octets. However, the actually used size depends on the number of digits in the respective number. Let's compute that length field properly Change-Id: Idef54a3545d1a5367a1efa2f0a6f7f0c1f860105
This commit is contained in:
@@ -40,6 +40,7 @@ from osmocom.utils import *
|
|||||||
from osmocom.construct import *
|
from osmocom.construct import *
|
||||||
|
|
||||||
from pySim.utils import dec_iccid, enc_iccid, dec_imsi, enc_imsi, dec_plmn, enc_plmn, dec_xplmn_w_act
|
from pySim.utils import dec_iccid, enc_iccid, dec_imsi, enc_imsi, dec_plmn, enc_plmn, dec_xplmn_w_act
|
||||||
|
from pySim.utils import bytes_for_nibbles
|
||||||
from pySim.profile import CardProfile, CardProfileAddon
|
from pySim.profile import CardProfile, CardProfileAddon
|
||||||
from pySim.filesystem import *
|
from pySim.filesystem import *
|
||||||
from pySim.ts_31_102_telecom import DF_PHONEBOOK, DF_MULTIMEDIA, DF_MCS, DF_V2X
|
from pySim.ts_31_102_telecom import DF_PHONEBOOK, DF_MULTIMEDIA, DF_MCS, DF_V2X
|
||||||
@@ -286,9 +287,18 @@ class EF_SMSP(LinFixedEF):
|
|||||||
else:
|
else:
|
||||||
raise ValueError
|
raise ValueError
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def sc_addr_len(ctx):
|
||||||
|
"""Compute the length field for an address field (like TP-DestAddr or TP-ScAddr)."""
|
||||||
|
if not hasattr(ctx, 'call_number') or len(ctx.call_number) == 0:
|
||||||
|
return 0xff
|
||||||
|
else:
|
||||||
|
return bytes_for_nibbles(len(ctx.call_number)) + 1
|
||||||
|
|
||||||
def __init__(self, fid='6f42', sfid=None, name='EF.SMSP', desc='Short message service parameters', **kwargs):
|
def __init__(self, fid='6f42', sfid=None, name='EF.SMSP', desc='Short message service parameters', **kwargs):
|
||||||
super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=(28, None), **kwargs)
|
super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=(28, None), **kwargs)
|
||||||
ScAddr = Struct('length'/Int8ub, 'ton_npi'/TonNpi, 'call_number'/BcdAdapter(Rpad(Bytes(10))))
|
ScAddr = Struct('length'/Rebuild(Int8ub, lambda ctx: EF_SMSP.sc_addr_len(ctx)),
|
||||||
|
'ton_npi'/TonNpi, 'call_number'/BcdAdapter(Rpad(Bytes(10))))
|
||||||
self._construct = Struct('alpha_id'/COptional(GsmOrUcs2Adapter(Rpad(Bytes(this._.total_len-28)))),
|
self._construct = Struct('alpha_id'/COptional(GsmOrUcs2Adapter(Rpad(Bytes(this._.total_len-28)))),
|
||||||
'parameter_indicators'/InvertAdapter(BitStruct(
|
'parameter_indicators'/InvertAdapter(BitStruct(
|
||||||
Const(7, BitsInteger(3)),
|
Const(7, BitsInteger(3)),
|
||||||
|
|||||||
@@ -526,6 +526,13 @@ def expand_hex(hexstring, length):
|
|||||||
# no change
|
# no change
|
||||||
return hexstring
|
return hexstring
|
||||||
|
|
||||||
|
def bytes_for_nibbles(num_nibbles: int) -> int:
|
||||||
|
"""compute the number of bytes needed to store the given number of nibbles."""
|
||||||
|
n_bytes = num_nibbles // 2
|
||||||
|
if num_nibbles & 1:
|
||||||
|
n_bytes += 1
|
||||||
|
return n_bytes
|
||||||
|
|
||||||
|
|
||||||
def boxed_heading_str(heading, width=80):
|
def boxed_heading_str(heading, width=80):
|
||||||
"""Generate a string that contains a boxed heading."""
|
"""Generate a string that contains a boxed heading."""
|
||||||
|
|||||||
Reference in New Issue
Block a user