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