Change in pysim[master]: WIP

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/.

Falkenber9 gerrit-no-reply at lists.osmocom.org
Thu May 6 11:18:50 UTC 2021


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


Change subject: WIP
......................................................................

WIP

Break down autodetect into different detection methods
based on:
- ATR
- ICCID
- typical files

This comes handy especially if ATR is not available, i.e.
using ModemATCommandLink instead of PCSC

Change-Id: I862c42f2c3805886f18214d8b4c39da55a735473
---
M pySim/cards.py
1 file changed, 103 insertions(+), 36 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/61/24161/1

diff --git a/pySim/cards.py b/pySim/cards.py
index 30857b3..f2809a4 100644
--- a/pySim/cards.py
+++ b/pySim/cards.py
@@ -39,6 +39,27 @@
 		self._adm_chv_num = 4
 		self._aids = []
 
+	@classmethod
+	def match_atr(kls, atr) -> bool:
+		return False
+
+	@classmethod
+	def match_iccids(kls, iccid) -> bool:
+		return iccid.startswith("98")
+
+	@classmethod
+	def match_typical_files(kls, scc) -> bool:
+		return False
+
+	@classmethod
+	def autodetect(kls, scc):
+		generic_card = Card(scc)
+		(iccid, sw) = generic_card.read_iccid()
+		if iccid is not None:
+			if kls.match_iccids(iccid):
+				return kls(scc)
+		return None
+
 	def reset(self):
 		self._scc.reset_card()
 
@@ -285,6 +306,16 @@
 	def __init__(self, ssc):
 		super(UsimCard, self).__init__(ssc)
 
+	@classmethod
+	def autodetect(kls, scc):
+		try:
+			# Look for ATR
+			if kls.match_atr(scc.get_atr()):
+				return kls(scc)
+		except:
+			pass
+		return None
+
 	def read_ehplmn(self):
 		(res, sw) = self._scc.read_binary(EF_USIM_ADF_map['EHPLMN'])
 		if sw == '9000':
@@ -355,6 +386,10 @@
 	def __init__(self, ssc):
 		super(IsimCard, self).__init__(ssc)
 
+	@classmethod
+	def autodetect(kls, scc):
+		return None
+
 	def read_pcscf(self):
 		rec_cnt = self._scc.record_count(EF_ISIM_ADF_map['PCSCF'])
 		pcscf_recs = ""
@@ -770,9 +805,9 @@
 	name = 'sysmoUSIM-GR1'
 
 	@classmethod
-	def autodetect(kls, scc):
+	def match_atr(kls, atr) -> bool:
 		# TODO: Access the ATR
-		return None
+		return False
 
 	def program(self, p):
 		# TODO: check if verify_chv could be used or what it needs
@@ -877,13 +912,27 @@
 		self._scc.sel_ctrl = "0004" #request an FCP
 
 	@classmethod
+	def match_atr(kls, atr) -> bool:
+		return atr == toBytes("3B 9F 96 80 1F C7 80 31 A0 73 BE 21 13 67 43 20 07 18 00 00 01 A5")
+
+	@classmethod
+	def match_iccids(kls, iccid) -> bool:
+		return iccid.startswith("89882110000003")	# to be verified by sysmocom
+
+	@classmethod
 	def autodetect(kls, scc):
 		try:
 			# Look for ATR
-			if scc.get_atr() == toBytes("3B 9F 96 80 1F C7 80 31 A0 73 BE 21 13 67 43 20 07 18 00 00 01 A5"):
+			if kls.match_atr(scc.get_atr()):
 				return kls(scc)
 		except:
-			return None
+			pass
+		# Look for known ICCIDs
+		generic_card = Card(scc)
+		(iccid, sw) = generic_card.read_iccid()
+		if iccid is not None:
+			if kls.match_iccids(iccid):
+				return kls(scc)
 		return None
 
 	def verify_adm(self, key):
@@ -1003,17 +1052,9 @@
 		self._adm_chv_num = 0x11
 		self._adm2_chv_num = 0x12
 
-
 	@classmethod
-	def autodetect(kls, scc):
-		try:
-			# Look for ATR
-			if scc.get_atr() == toBytes("3B 9F 96 80 1F C7 80 31 A0 73 BE 21 13 67 44 22 06 10 00 00 01 A9"):
-				return kls(scc)
-		except:
-			return None
-		return None
-
+	def match_atr(kls, atr) -> bool:
+		return atr == toBytes("3B 9F 96 80 1F C7 80 31 A0 73 BE 21 13 67 44 22 06 10 00 00 01 A9")
 
 	def verify_adm2(self, key):
 		'''
@@ -1177,14 +1218,8 @@
 		self._scc.sel_ctrl = "0004" #request an FCP
 
 	@classmethod
-	def autodetect(kls, scc):
-		try:
-			# Look for ATR
-			if scc.get_atr() == toBytes("3B 9F 95 80 1F C7 80 31 E0 73 F6 21 13 67 4D 45 16 00 43 01 00 8F"):
-				return kls(scc)
-		except:
-			return None
-		return None
+	def match_atr(kls, atr) -> bool:
+		return atr == toBytes("3B 9F 95 80 1F C7 80 31 E0 73 F6 21 13 67 4D 45 16 00 43 01 00 8F")
 
 	def program(self, p):
 		if not p['pin_adm']:
@@ -1268,26 +1303,58 @@
 		self._scc.sel_ctrl = "0004" #request an FCP
 
 	@classmethod
+	def match_atr(kls, atr) -> bool:
+		atrs = [
+			# Try card model #1
+			"3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 75 30 34 05 4B A9",
+			# Try card model #2
+			"3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 75 31 33 02 51 B2",
+			# Try card model #3
+			"3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 52 75 31 04 51 D5"
+		]
+		return atr in [toBytes(a) for a in atrs]
+
+	@classmethod
+	def match_iccids(kls, iccid) -> bool:
+		return iccid.startswith("89882110000004")	# to be verified by sysmocom
+
+	@classmethod
 	def autodetect(kls, scc):
 		try:
-			# Try card model #1
-			atr = "3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 75 30 34 05 4B A9"
-			if scc.get_atr() == toBytes(atr):
-				return kls(scc)
-
-			# Try card model #2
-			atr = "3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 75 31 33 02 51 B2"
-			if scc.get_atr() == toBytes(atr):
-				return kls(scc)
-
-			# Try card model #3
-			atr = "3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 52 75 31 04 51 D5"
-			if scc.get_atr() == toBytes(atr):
+			# Look for ATR
+			if kls.match_atr(scc.get_atr()):
 				return kls(scc)
 		except:
-			return None
+			pass
+		# Look for known ICCIDs
+		generic_card = Card(scc)
+		(iccid, sw) = generic_card.read_iccid()
+		if iccid is not None:
+			if kls.match_iccids(iccid):
+				return kls(scc)
 		return None
 
+	# @classmethod
+	# def autodetect(kls, scc):
+	# 	try:
+	# 		# Try card model #1
+	# 		atr = "3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 75 30 34 05 4B A9"
+	# 		if scc.get_atr() == toBytes(atr):
+	# 			return kls(scc)
+
+	# 		# Try card model #2
+	# 		atr = "3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 75 31 33 02 51 B2"
+	# 		if scc.get_atr() == toBytes(atr):
+	# 			return kls(scc)
+
+	# 		# Try card model #3
+	# 		atr = "3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 52 75 31 04 51 D5"
+	# 		if scc.get_atr() == toBytes(atr):
+	# 			return kls(scc)
+	# 	except:
+	# 		return None
+	# 	return None
+
 	def verify_adm(self, key):
 		# authenticate as ADM using default key (written on the card..)
 		if not key:

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

Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: I862c42f2c3805886f18214d8b4c39da55a735473
Gerrit-Change-Number: 24161
Gerrit-PatchSet: 1
Gerrit-Owner: Falkenber9 <robert.falkenberg at tu-dortmund.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210506/668ea9ad/attachment.htm>


More information about the gerrit-log mailing list