From 1b8c6b48eac9a856dac34239119da7cc32e2d6f6 Mon Sep 17 00:00:00 2001 From: Eric Wild Date: Wed, 23 Sep 2026 17:51:04 +0200 Subject: [PATCH] cat: add sms_pp_download_envelope() Put a helper for wrapping an SMS-DELIVER TPDU in the ENVELOPE of TS 102 223 section 7.5.1 the assembly next to SMSPPDownload, where the IEs already live, so it can be reused by other tooling, for example for triggering scp81 sessions. Change-Id: Id23227eac53d697f4f13a84e087c32bf1d60f474 --- pySim-smpp2sim.py | 6 ++---- pySim/cat.py | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/pySim-smpp2sim.py b/pySim-smpp2sim.py index f7a45f5ae..95b9ccd5c 100755 --- a/pySim-smpp2sim.py +++ b/pySim-smpp2sim.py @@ -55,6 +55,7 @@ from pySim.transport import LinkBase, ProactiveHandler, argparse_add_reader_args from pySim.commands import SimCardCommands from pySim.cards import UiccCardBase from pySim.exceptions import * +from pySim.cat import sms_pp_download_envelope from pySim.cat import ProactiveCommand, SendShortMessage, SMS_TPDU, SMSPPDownload, BearerDescription from pySim.cat import DeviceIdentities, Address, OtherAddress, UiccTransportLevel, BufferSize from pySim.cat import ChannelStatus, ChannelData, ChannelDataLength @@ -169,10 +170,7 @@ class MyServer: tpdu = SMS_DELIVER.from_smpp_submit(pdu) logger.info(tpdu) # 2) wrap into the CAT ENVELOPE for SMS-PP-Download - tpdu_ie = SMS_TPDU(decoded={'tpdu': b2h(tpdu.to_bytes())}) - addr_ie = Address(decoded={'ton_npi': {'ext':False, 'type_of_number':'unknown', 'numbering_plan_id':'unknown'}, 'call_number': '0123456'}) - dev_ids = DeviceIdentities(decoded={'source_dev_id': 'network', 'dest_dev_id': 'uicc'}) - sms_dl = SMSPPDownload(children=[dev_ids, addr_ie, tpdu_ie]) + sms_dl = sms_pp_download_envelope(tpdu) # 3) send to the card envelope_hex = b2h(sms_dl.to_tlv()) logger.info("ENVELOPE: %s" % envelope_hex) diff --git a/pySim/cat.py b/pySim/cat.py index d755545ad..895900405 100644 --- a/pySim/cat.py +++ b/pySim/cat.py @@ -763,6 +763,22 @@ class SMSPPDownload(BER_TLV_IE, tag=0xD1, nested=[DeviceIdentities, Address, SMS_TPDU]): pass + +def sms_pp_download_envelope(tpdu, call_number: str = '0123456') -> SMSPPDownload: + """TS 31.111 Section 7.1.1.2 wrap of a SMS-DELIVER TPDU in the ENVELOPE (SMS-PP Download) + call_number : + SMSC address to report, defined in TS 31.111 7.1.1.2 as + "the RP_Originating_Address of the Service Centre (TS-Service-Centre-Address, 3GPP TS 24.011)" + its presence is Conditional, and the note there says the UICC should be fine + if its missing, so for remote management its presence should suffice (?). + """ + return SMSPPDownload(children=[ + DeviceIdentities(decoded={'source_dev_id': 'network', 'dest_dev_id': 'uicc'}), + Address(decoded={'ton_npi': {'ext': False, 'type_of_number': 'unknown', + 'numbering_plan_id': 'unknown'}, + 'call_number': call_number}), + SMS_TPDU(decoded={'tpdu': b2h(tpdu.to_bytes())})]) + # TS 101 220 Table 7.17 + 31.111 7.1.1.3 class SMSCBDownload(BER_TLV_IE, tag=0xD2, nested=[DeviceIdentities, CBSPage]):