Change in pysim[master]: Added support for MSISDN programming plus check for SPN length

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

herlesupreeth gerrit-no-reply at lists.osmocom.org
Mon Jan 20 12:18:01 UTC 2020


herlesupreeth has uploaded this change for review. ( https://gerrit.osmocom.org/c/pysim/+/16949 )


Change subject: Added support for MSISDN programming plus check for SPN length
......................................................................

Added support for MSISDN programming plus check for SPN length

Change-Id: I4399aa10a266fff0432cddfe33937b8b96ca0758
---
M pySim-prog.py
M pySim-read.py
M pySim/cards.py
3 files changed, 38 insertions(+), 11 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/49/16949/1

diff --git a/pySim-prog.py b/pySim-prog.py
index 739c7b1..14ea11d 100755
--- a/pySim-prog.py
+++ b/pySim-prog.py
@@ -266,21 +266,21 @@
 	# Digitize MCC/MNC (5 or 6 digits)
 	plmn_digits = _mcc_mnc_digits(mcc, mnc)
 
-	if opts.name is not None and len(opts.name) > 16:
-		raise ValueError('Service Provider Name must max 16 characters!');
+	name = None
+	if opts.name is not None:
+		if len(opts.name) > 16:
+			raise ValueError('Service Provider Name must max 16 characters!');
 		name = opts.name
-	else:
-		name = None
 
+	msisdn = None
 	if opts.msisdn is not None:
-		if not _isnum(opts.msisdn):
-			raise ValueError('MSISDN must be digits only!');
 		if len(opts.msisdn) > 10*2:
-			# Need to support MSISDN of length > 20
+			# ToDo: Support MSISDN of length > 20 (10 Bytes)
 			raise ValueError('For now support for MSISDN of length <= 20 digits!');
+		if (len(opts.msisdn) % 2) != 0:
+			# ToDo: Support odd number of MSISDN digits
+			raise ValueError('For now support for only even number of MSISDN digits!');
 		msisdn = opts.msisdn
-	else:
-		msisdn = None
 
 	# ICCID (19 digits, E.118), though some phase1 vendors use 20 :(
 	if opts.iccid is not None:
diff --git a/pySim-read.py b/pySim-read.py
index 9e3d2f0..ff27b90 100755
--- a/pySim-read.py
+++ b/pySim-read.py
@@ -208,10 +208,14 @@
 	try:
 	#	print(scc.record_size(['3f00', '7f10', '6f40']))
 		(res, sw) = scc.read_record(['3f00', '7f10', '6f40'], 1)
+		#print res
 		if sw == '9000':
 			x_bytes = (len(res)/2) - 14
+			#print res[(x_bytes * 2):]
 			bcd_len = res[(x_bytes * 2):(x_bytes * 2) + 2]
+			#print bcd_len
 			ton_npi = res[(x_bytes * 2) + 2:(x_bytes * 2) + 4]
+			#print ton_npi
 			dial_num = res[(x_bytes * 2) + 4:(x_bytes * 2) + 24]
 			# Refer 3GPP TS 24.008 Called party BCD number information element
 			print("MSISDN: %s" % (swap_nibbles(dial_num).rstrip('f')))
diff --git a/pySim/cards.py b/pySim/cards.py
index ff9c9b1..a7aa72c 100644
--- a/pySim/cards.py
+++ b/pySim/cards.py
@@ -588,8 +588,9 @@
 		data, sw = self._scc.update_binary('00F7', content)
 
 		# set Service Provider Name
-		content = enc_spn(p['name'], True, True)
-		data, sw = self._scc.update_binary('6F46', rpad(content, 32))
+		if p.get('name') is not None:
+			content = enc_spn(p['name'], True, True)
+			data, sw = self._scc.update_binary('6F46', rpad(content, 32))
 
 		# write EF.IMSI
 		data, sw = self._scc.update_binary('6f07', enc_imsi(p['imsi']))
@@ -628,6 +629,28 @@
 		r = self._scc.select_file(['3f00', '7f10'])
 		data, sw = self._scc.update_record('6f42', 1, lpad(p['smsp'], 104), force_len=True)
 
+		# EF.MSISDN
+		if p.get('msisdn') is not None:
+			msisdn = p['msisdn']
+			ton = "81"
+			if msisdn[0] == '+':
+				ton = "91"
+				msisdn = msisdn[1:]
+			l = -1
+			if not (msisdn.isdigit() and ((l== -1) or (len(msisdn) == l))):
+				raise ValueError('MSISDN must be digits only!\n \
+					Start with \'+\' for international numbers')
+			even_dig = ((len(msisdn) % 2) == 0)
+			if even_dig:
+				msisdn = '%02d' % ((len(msisdn)/2)+1,) + ton + swap_nibbles(rpad(msisdn, 24))
+			else:
+				raise ValueError('MSISDN with even number of digits are supported for now!')
+
+			msisdn = (('ff' * 20) + msisdn)
+
+			r = self._scc.select_file(['3f00', '7f10'])
+			data, sw = self._scc.update_record('6F40', 1, msisdn, force_len=True)
+
 	def erase(self):
 		return
 

-- 
To view, visit https://gerrit.osmocom.org/c/pysim/+/16949
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: I4399aa10a266fff0432cddfe33937b8b96ca0758
Gerrit-Change-Number: 16949
Gerrit-PatchSet: 1
Gerrit-Owner: herlesupreeth <herlesupreeth at gmail.com>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200120/51b06083/attachment.htm>


More information about the gerrit-log mailing list