<p>Falkenber9 has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/pysim/+/24161">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">WIP<br><br>Break down autodetect into different detection methods<br>based on:<br>- ATR<br>- ICCID<br>- typical files<br><br>This comes handy especially if ATR is not available, i.e.<br>using ModemATCommandLink instead of PCSC<br><br>Change-Id: I862c42f2c3805886f18214d8b4c39da55a735473<br>---<br>M pySim/cards.py<br>1 file changed, 103 insertions(+), 36 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/61/24161/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/pySim/cards.py b/pySim/cards.py</span><br><span>index 30857b3..f2809a4 100644</span><br><span>--- a/pySim/cards.py</span><br><span>+++ b/pySim/cards.py</span><br><span>@@ -39,6 +39,27 @@</span><br><span> self._adm_chv_num = 4</span><br><span> self._aids = []</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ @classmethod</span><br><span style="color: hsl(120, 100%, 40%);">+ def match_atr(kls, atr) -> bool:</span><br><span style="color: hsl(120, 100%, 40%);">+ return False</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ @classmethod</span><br><span style="color: hsl(120, 100%, 40%);">+ def match_iccids(kls, iccid) -> bool:</span><br><span style="color: hsl(120, 100%, 40%);">+ return iccid.startswith("98")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ @classmethod</span><br><span style="color: hsl(120, 100%, 40%);">+ def match_typical_files(kls, scc) -> bool:</span><br><span style="color: hsl(120, 100%, 40%);">+ return False</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ @classmethod</span><br><span style="color: hsl(120, 100%, 40%);">+ def autodetect(kls, scc):</span><br><span style="color: hsl(120, 100%, 40%);">+ generic_card = Card(scc)</span><br><span style="color: hsl(120, 100%, 40%);">+ (iccid, sw) = generic_card.read_iccid()</span><br><span style="color: hsl(120, 100%, 40%);">+ if iccid is not None:</span><br><span style="color: hsl(120, 100%, 40%);">+ if kls.match_iccids(iccid):</span><br><span style="color: hsl(120, 100%, 40%);">+ return kls(scc)</span><br><span style="color: hsl(120, 100%, 40%);">+ return None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> def reset(self):</span><br><span> self._scc.reset_card()</span><br><span> </span><br><span>@@ -285,6 +306,16 @@</span><br><span> def __init__(self, ssc):</span><br><span> super(UsimCard, self).__init__(ssc)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ @classmethod</span><br><span style="color: hsl(120, 100%, 40%);">+ def autodetect(kls, scc):</span><br><span style="color: hsl(120, 100%, 40%);">+ try:</span><br><span style="color: hsl(120, 100%, 40%);">+ # Look for ATR</span><br><span style="color: hsl(120, 100%, 40%);">+ if kls.match_atr(scc.get_atr()):</span><br><span style="color: hsl(120, 100%, 40%);">+ return kls(scc)</span><br><span style="color: hsl(120, 100%, 40%);">+ except:</span><br><span style="color: hsl(120, 100%, 40%);">+ pass</span><br><span style="color: hsl(120, 100%, 40%);">+ return None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> def read_ehplmn(self):</span><br><span> (res, sw) = self._scc.read_binary(EF_USIM_ADF_map['EHPLMN'])</span><br><span> if sw == '9000':</span><br><span>@@ -355,6 +386,10 @@</span><br><span> def __init__(self, ssc):</span><br><span> super(IsimCard, self).__init__(ssc)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ @classmethod</span><br><span style="color: hsl(120, 100%, 40%);">+ def autodetect(kls, scc):</span><br><span style="color: hsl(120, 100%, 40%);">+ return None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> def read_pcscf(self):</span><br><span> rec_cnt = self._scc.record_count(EF_ISIM_ADF_map['PCSCF'])</span><br><span> pcscf_recs = ""</span><br><span>@@ -770,9 +805,9 @@</span><br><span> name = 'sysmoUSIM-GR1'</span><br><span> </span><br><span> @classmethod</span><br><span style="color: hsl(0, 100%, 40%);">- def autodetect(kls, scc):</span><br><span style="color: hsl(120, 100%, 40%);">+ def match_atr(kls, atr) -> bool:</span><br><span> # TODO: Access the ATR</span><br><span style="color: hsl(0, 100%, 40%);">- return None</span><br><span style="color: hsl(120, 100%, 40%);">+ return False</span><br><span> </span><br><span> def program(self, p):</span><br><span> # TODO: check if verify_chv could be used or what it needs</span><br><span>@@ -877,13 +912,27 @@</span><br><span> self._scc.sel_ctrl = "0004" #request an FCP</span><br><span> </span><br><span> @classmethod</span><br><span style="color: hsl(120, 100%, 40%);">+ def match_atr(kls, atr) -> bool:</span><br><span style="color: hsl(120, 100%, 40%);">+ 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")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ @classmethod</span><br><span style="color: hsl(120, 100%, 40%);">+ def match_iccids(kls, iccid) -> bool:</span><br><span style="color: hsl(120, 100%, 40%);">+ return iccid.startswith("89882110000003") # to be verified by sysmocom</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ @classmethod</span><br><span> def autodetect(kls, scc):</span><br><span> try:</span><br><span> # Look for ATR</span><br><span style="color: hsl(0, 100%, 40%);">- 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"):</span><br><span style="color: hsl(120, 100%, 40%);">+ if kls.match_atr(scc.get_atr()):</span><br><span> return kls(scc)</span><br><span> except:</span><br><span style="color: hsl(0, 100%, 40%);">- return None</span><br><span style="color: hsl(120, 100%, 40%);">+ pass</span><br><span style="color: hsl(120, 100%, 40%);">+ # Look for known ICCIDs</span><br><span style="color: hsl(120, 100%, 40%);">+ generic_card = Card(scc)</span><br><span style="color: hsl(120, 100%, 40%);">+ (iccid, sw) = generic_card.read_iccid()</span><br><span style="color: hsl(120, 100%, 40%);">+ if iccid is not None:</span><br><span style="color: hsl(120, 100%, 40%);">+ if kls.match_iccids(iccid):</span><br><span style="color: hsl(120, 100%, 40%);">+ return kls(scc)</span><br><span> return None</span><br><span> </span><br><span> def verify_adm(self, key):</span><br><span>@@ -1003,17 +1052,9 @@</span><br><span> self._adm_chv_num = 0x11</span><br><span> self._adm2_chv_num = 0x12</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> @classmethod</span><br><span style="color: hsl(0, 100%, 40%);">- def autodetect(kls, scc):</span><br><span style="color: hsl(0, 100%, 40%);">- try:</span><br><span style="color: hsl(0, 100%, 40%);">- # Look for ATR</span><br><span style="color: hsl(0, 100%, 40%);">- 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"):</span><br><span style="color: hsl(0, 100%, 40%);">- return kls(scc)</span><br><span style="color: hsl(0, 100%, 40%);">- except:</span><br><span style="color: hsl(0, 100%, 40%);">- return None</span><br><span style="color: hsl(0, 100%, 40%);">- return None</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+ def match_atr(kls, atr) -> bool:</span><br><span style="color: hsl(120, 100%, 40%);">+ 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")</span><br><span> </span><br><span> def verify_adm2(self, key):</span><br><span> '''</span><br><span>@@ -1177,14 +1218,8 @@</span><br><span> self._scc.sel_ctrl = "0004" #request an FCP</span><br><span> </span><br><span> @classmethod</span><br><span style="color: hsl(0, 100%, 40%);">- def autodetect(kls, scc):</span><br><span style="color: hsl(0, 100%, 40%);">- try:</span><br><span style="color: hsl(0, 100%, 40%);">- # Look for ATR</span><br><span style="color: hsl(0, 100%, 40%);">- 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"):</span><br><span style="color: hsl(0, 100%, 40%);">- return kls(scc)</span><br><span style="color: hsl(0, 100%, 40%);">- except:</span><br><span style="color: hsl(0, 100%, 40%);">- return None</span><br><span style="color: hsl(0, 100%, 40%);">- return None</span><br><span style="color: hsl(120, 100%, 40%);">+ def match_atr(kls, atr) -> bool:</span><br><span style="color: hsl(120, 100%, 40%);">+ 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")</span><br><span> </span><br><span> def program(self, p):</span><br><span> if not p['pin_adm']:</span><br><span>@@ -1268,26 +1303,58 @@</span><br><span> self._scc.sel_ctrl = "0004" #request an FCP</span><br><span> </span><br><span> @classmethod</span><br><span style="color: hsl(120, 100%, 40%);">+ def match_atr(kls, atr) -> bool:</span><br><span style="color: hsl(120, 100%, 40%);">+ atrs = [</span><br><span style="color: hsl(120, 100%, 40%);">+ # Try card model #1</span><br><span style="color: hsl(120, 100%, 40%);">+ "3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 75 30 34 05 4B A9",</span><br><span style="color: hsl(120, 100%, 40%);">+ # Try card model #2</span><br><span style="color: hsl(120, 100%, 40%);">+ "3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 75 31 33 02 51 B2",</span><br><span style="color: hsl(120, 100%, 40%);">+ # Try card model #3</span><br><span style="color: hsl(120, 100%, 40%);">+ "3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 52 75 31 04 51 D5"</span><br><span style="color: hsl(120, 100%, 40%);">+ ]</span><br><span style="color: hsl(120, 100%, 40%);">+ return atr in [toBytes(a) for a in atrs]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ @classmethod</span><br><span style="color: hsl(120, 100%, 40%);">+ def match_iccids(kls, iccid) -> bool:</span><br><span style="color: hsl(120, 100%, 40%);">+ return iccid.startswith("89882110000004") # to be verified by sysmocom</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ @classmethod</span><br><span> def autodetect(kls, scc):</span><br><span> try:</span><br><span style="color: hsl(0, 100%, 40%);">- # Try card model #1</span><br><span style="color: hsl(0, 100%, 40%);">- atr = "3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 75 30 34 05 4B A9"</span><br><span style="color: hsl(0, 100%, 40%);">- if scc.get_atr() == toBytes(atr):</span><br><span style="color: hsl(0, 100%, 40%);">- return kls(scc)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- # Try card model #2</span><br><span style="color: hsl(0, 100%, 40%);">- atr = "3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 75 31 33 02 51 B2"</span><br><span style="color: hsl(0, 100%, 40%);">- if scc.get_atr() == toBytes(atr):</span><br><span style="color: hsl(0, 100%, 40%);">- return kls(scc)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- # Try card model #3</span><br><span style="color: hsl(0, 100%, 40%);">- atr = "3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 52 75 31 04 51 D5"</span><br><span style="color: hsl(0, 100%, 40%);">- if scc.get_atr() == toBytes(atr):</span><br><span style="color: hsl(120, 100%, 40%);">+ # Look for ATR</span><br><span style="color: hsl(120, 100%, 40%);">+ if kls.match_atr(scc.get_atr()):</span><br><span> return kls(scc)</span><br><span> except:</span><br><span style="color: hsl(0, 100%, 40%);">- return None</span><br><span style="color: hsl(120, 100%, 40%);">+ pass</span><br><span style="color: hsl(120, 100%, 40%);">+ # Look for known ICCIDs</span><br><span style="color: hsl(120, 100%, 40%);">+ generic_card = Card(scc)</span><br><span style="color: hsl(120, 100%, 40%);">+ (iccid, sw) = generic_card.read_iccid()</span><br><span style="color: hsl(120, 100%, 40%);">+ if iccid is not None:</span><br><span style="color: hsl(120, 100%, 40%);">+ if kls.match_iccids(iccid):</span><br><span style="color: hsl(120, 100%, 40%);">+ return kls(scc)</span><br><span> return None</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ # @classmethod</span><br><span style="color: hsl(120, 100%, 40%);">+ # def autodetect(kls, scc):</span><br><span style="color: hsl(120, 100%, 40%);">+ # try:</span><br><span style="color: hsl(120, 100%, 40%);">+ # # Try card model #1</span><br><span style="color: hsl(120, 100%, 40%);">+ # atr = "3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 75 30 34 05 4B A9"</span><br><span style="color: hsl(120, 100%, 40%);">+ # if scc.get_atr() == toBytes(atr):</span><br><span style="color: hsl(120, 100%, 40%);">+ # return kls(scc)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ # # Try card model #2</span><br><span style="color: hsl(120, 100%, 40%);">+ # atr = "3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 75 31 33 02 51 B2"</span><br><span style="color: hsl(120, 100%, 40%);">+ # if scc.get_atr() == toBytes(atr):</span><br><span style="color: hsl(120, 100%, 40%);">+ # return kls(scc)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ # # Try card model #3</span><br><span style="color: hsl(120, 100%, 40%);">+ # atr = "3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 52 75 31 04 51 D5"</span><br><span style="color: hsl(120, 100%, 40%);">+ # if scc.get_atr() == toBytes(atr):</span><br><span style="color: hsl(120, 100%, 40%);">+ # return kls(scc)</span><br><span style="color: hsl(120, 100%, 40%);">+ # except:</span><br><span style="color: hsl(120, 100%, 40%);">+ # return None</span><br><span style="color: hsl(120, 100%, 40%);">+ # return None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> def verify_adm(self, key):</span><br><span> # authenticate as ADM using default key (written on the card..)</span><br><span> if not key:</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/pysim/+/24161">change 24161</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/pysim/+/24161"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: pysim </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I862c42f2c3805886f18214d8b4c39da55a735473 </div>
<div style="display:none"> Gerrit-Change-Number: 24161 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Falkenber9 <robert.falkenberg@tu-dortmund.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>