laforge has uploaded this change for review.

View Change

pySim/cat: Fix contruct for Address class/IE

Something like "this._.total_len-1" only works during decode. Let's
use GreedyBytes instead, working for encode and decode.

Change-Id: Idf8326298cab7ebc68b09c7e829bfc2061222f51
---
M pySim/cat.py
A smpp_ota_apdu2.py
2 files changed, 116 insertions(+), 1 deletion(-)

git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/39/36839/1
diff --git a/pySim/cat.py b/pySim/cat.py
index 1dff194..fdaf8f3 100644
--- a/pySim/cat.py
+++ b/pySim/cat.py
@@ -32,7 +32,7 @@
# TS 102 223 Section 8.1
class Address(COMPR_TLV_IE, tag=0x06):
_construct = Struct('ton_npi'/Int8ub,
- 'call_number'/BcdAdapter(Bytes(this._.total_len-1)))
+ 'call_number'/BcdAdapter(GreedyBytes))

# TS 102 223 Section 8.2
class AlphaIdentifier(COMPR_TLV_IE, tag=0x05):
diff --git a/smpp_ota_apdu2.py b/smpp_ota_apdu2.py
new file mode 100755
index 0000000..60f7863
--- /dev/null
+++ b/smpp_ota_apdu2.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python3
+import logging
+import sys
+from pprint import pprint as pp
+
+from pySim.ota import OtaKeyset, OtaDialectSms
+from pySim.utils import b2h, h2b
+
+import smpplib.gsm
+import smpplib.client
+import smpplib.consts
+
+logger = logging.getLogger(__name__)
+
+# if you want to know what's happening
+logging.basicConfig(level='DEBUG')
+
+class Foo:
+ def smpp_rx_handler(self, pdu):
+ sys.stdout.write('delivered {}\n'.format(pdu.receipted_message_id))
+ if pdu.short_message:
+ dec = self.ota_dialect.decode_resp(self.ota_keyset, self.spi, pdu.short_message)
+ pp(dec)
+ return None
+
+ def __init__(self):
+ # Two parts, UCS2, SMS with UDH
+ #parts, encoding_flag, msg_type_flag = smpplib.gsm.make_parts(u'Привет мир!\n'*10)
+
+ client = smpplib.client.Client('localhost', 2775, allow_unknown_opt_params=True)
+
+ # Print when obtain message_id
+ client.set_message_sent_handler(
+ lambda pdu: sys.stdout.write('sent {} {}\n'.format(pdu.sequence, pdu.message_id)))
+ #client.set_message_received_handler(
+ # lambda pdu: sys.stdout.write('delivered {}\n'.format(pdu.receipted_message_id)))
+ client.set_message_received_handler(self.smpp_rx_handler)
+
+ client.connect()
+ client.bind_transceiver(system_id='test', password='test')
+
+ self.client = client
+
+ if False:
+ KIC1 = h2b('000102030405060708090a0b0c0d0e0f')
+ KID1 = h2b('101112131415161718191a1b1c1d1e1f')
+ self.ota_keyset = OtaKeyset(algo_crypt='aes_cbc', kic_idx=1, kic=KIC1,
+ algo_auth='aes_cmac', kid_idx=1, kid=KID1)
+ self.tar = h2b('000001') # ISD-R according to Annex H of SGP.02
+ #self.tar = h2b('000002') # ECASD according to Annex H of SGP.02
+
+ if True:
+ KIC1 = h2b('4BE2D58A1FA7233DD723B3C70996E6E6')
+ KID1 = h2b('4a664208eba091d32c4ecbc299da1f34')
+ self.ota_keyset = OtaKeyset(algo_crypt='triple_des_cbc2', kic_idx=1, kic=KIC1,
+ algo_auth='triple_des_cbc2', kid_idx=1, kid=KID1)
+ #KIC3 = h2b('A4074D8E1FE69B484A7E62682ED09B51')
+ #KID3 = h2b('41FF1033910112DB4EBEBB7807F939CD')
+ #self.ota_keyset = OtaKeyset(algo_crypt='triple_des_cbc2', kic_idx=3, kic=KIC3,
+ # algo_auth='triple_des_cbc2', kid_idx=3, kid=KID3)
+ #self.tar = h2b('B00011') # USIM RFM
+ self.tar = h2b('000000') # RAM
+
+ self.ota_dialect = OtaDialectSms()
+ self.spi = {'counter':'no_counter', 'ciphering':True, 'rc_cc_ds': 'cc', 'por_in_submit':False,
+ 'por_shall_be_ciphered':True, 'por_rc_cc_ds': 'cc', 'por': 'por_required'}
+
+
+ def tx_sms_tpdu(self, tpdu: bytes):
+ self.client.send_message(
+ source_addr_ton=smpplib.consts.SMPP_TON_INTL,
+ #source_addr_npi=smpplib.consts.SMPP_NPI_ISDN,
+ # Make sure it is a byte string, not unicode:
+ source_addr='12',
+
+ dest_addr_ton=smpplib.consts.SMPP_TON_INTL,
+ #dest_addr_npi=smpplib.consts.SMPP_NPI_ISDN,
+ # Make sure thease two params are byte strings, not unicode:
+ destination_addr='23',
+ short_message=tpdu,
+
+ data_coding=smpplib.consts.SMPP_ENCODING_BINARY,
+ esm_class=smpplib.consts.SMPP_GSMFEAT_UDHI,
+ protocol_id=0x7f,
+ #registered_delivery=True,
+ )
+
+ def tx_c_apdu(self, apdu: bytes):
+ logger.info("C-APDU: %s" % b2h(apdu))
+ # translate to Secured OTA RFM
+ secured = self.ota_dialect.encode_cmd(self.ota_keyset, self.tar, self.spi, apdu=apdu)
+ # add user data header
+ tpdu = b'\x02\x70\x00' + secured
+ # send via SMPP
+ self.tx_sms_tpdu(tpdu)
+
+
+f = Foo()
+print("initialized")
+#f.tx_c_apdu(h2b('80a40400023f00'))
+#f.tx_c_apdu(h2b('80EC010100'))
+f.tx_c_apdu(h2b('80EC0101' + '0E' + '350103' + '390203e8' + '3e052101020304'))
+f.client.listen()

To view, visit change 36839. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: Idf8326298cab7ebc68b09c7e829bfc2061222f51
Gerrit-Change-Number: 36839
Gerrit-PatchSet: 1
Gerrit-Owner: laforge <laforge@osmocom.org>
Gerrit-MessageType: newchange