<p>guilly@gmail.com has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/pysim/+/18710">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">cards.py: added generic USIM<br><br>Work in progress<br><br>a generic USIM class card will try to CLA set to 00<br>and assume it's an USIM card type if it gets a reply<br><br>Change-Id: I8c0a914ed00a713fe473fc64f35d17ba34176e52<br>---<br>M pySim-read.py<br>M pySim/cards.py<br>M pySim/transport/serial.py<br>3 files changed, 57 insertions(+), 14 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/10/18710/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/pySim-read.py b/pySim-read.py</span><br><span>index b23e6ee..345e6d5 100755</span><br><span>--- a/pySim-read.py</span><br><span>+++ b/pySim-read.py</span><br><span>@@ -88,17 +88,6 @@</span><br><span>       # Wait for SIM card</span><br><span>  sl.wait_for_card()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  # Assuming UICC SIM</span><br><span style="color: hsl(0, 100%, 40%);">-     scc.cla_byte = "00"</span><br><span style="color: hsl(0, 100%, 40%);">-   scc.sel_ctrl = "0004"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- # Testing for Classic SIM or UICC</span><br><span style="color: hsl(0, 100%, 40%);">-       (res, sw) = sl.send_apdu(scc.cla_byte + "a4" + scc.sel_ctrl + "02" + "3f00")</span><br><span style="color: hsl(0, 100%, 40%);">-      if sw == '6e00':</span><br><span style="color: hsl(0, 100%, 40%);">-                # Just a Classic SIM</span><br><span style="color: hsl(0, 100%, 40%);">-            scc.cla_byte = "a0"</span><br><span style="color: hsl(0, 100%, 40%);">-           scc.sel_ctrl = "0000"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>      # Program the card</span><br><span>   print("Reading ...")</span><br><span> </span><br><span>@@ -240,7 +229,8 @@</span><br><span> </span><br><span>         # Check whether we have th AID of USIM, if so select it by its AID</span><br><span>   # EF.UST - File Id in ADF USIM : 6f38</span><br><span style="color: hsl(0, 100%, 40%);">-   if '9000' == card.select_adf_by_aid():</span><br><span style="color: hsl(120, 100%, 40%);">+        </span><br><span style="color: hsl(120, 100%, 40%);">+      if card.name == 'GenericUSIM' and '9000' == card.select_adf_by_aid():</span><br><span>                # EF.UST</span><br><span>             (res, sw) = card.read_binary(EF_USIM_ADF_map['UST'])</span><br><span>                 if sw == '9000':</span><br><span>@@ -252,7 +242,7 @@</span><br><span> </span><br><span>   # Check whether we have th AID of ISIM, if so select it by its AID</span><br><span>   # EF.IST - File Id in ADF ISIM : 6f07</span><br><span style="color: hsl(0, 100%, 40%);">-   if '9000' == card.select_adf_by_aid(adf="isim"):</span><br><span style="color: hsl(120, 100%, 40%);">+    if card.name != 'GenericUSIM' and '9000' == card.select_adf_by_aid(adf="isim"):</span><br><span>            # EF.IST</span><br><span>             (res, sw) = card.read_binary('6f07')</span><br><span>                 if sw == '9000':</span><br><span>diff --git a/pySim/cards.py b/pySim/cards.py</span><br><span>index 808fde1..b0bc537 100644</span><br><span>--- a/pySim/cards.py</span><br><span>+++ b/pySim/cards.py</span><br><span>@@ -1156,11 +1156,63 @@</span><br><span> </span><br><span>          return</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+class GenericUSIM(Card):</span><br><span style="color: hsl(120, 100%, 40%);">+  """</span><br><span style="color: hsl(120, 100%, 40%);">+    Generic USIM card</span><br><span style="color: hsl(120, 100%, 40%);">+     """</span><br><span style="color: hsl(120, 100%, 40%);">+    </span><br><span style="color: hsl(120, 100%, 40%);">+      name = 'GenericUSIM'</span><br><span style="color: hsl(120, 100%, 40%);">+          </span><br><span style="color: hsl(120, 100%, 40%);">+      def __init__(self, ssc):</span><br><span style="color: hsl(120, 100%, 40%);">+              super(GenericUSIM, self).__init__(ssc)</span><br><span style="color: hsl(120, 100%, 40%);">+                self._scc.cla_byte = "00"</span><br><span style="color: hsl(120, 100%, 40%);">+           self._scc.sel_ctrl = "0004" #request an FCP</span><br><span style="color: hsl(120, 100%, 40%);">+         </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%);">+             # reset the card, and send a PDU with CLA, P1 & P2 for USIM.</span><br><span style="color: hsl(120, 100%, 40%);">+              scc.reset_card()</span><br><span style="color: hsl(120, 100%, 40%);">+              scc._tp.wait_for_card()</span><br><span style="color: hsl(120, 100%, 40%);">+               #</span><br><span style="color: hsl(120, 100%, 40%);">+             (res, sw) = scc._tp.send_apdu("00a40004023f00")</span><br><span style="color: hsl(120, 100%, 40%);">+             if sw == '9000':</span><br><span style="color: hsl(120, 100%, 40%);">+                      return kls(scc)</span><br><span style="color: hsl(120, 100%, 40%);">+               #if it is not successfull, the it's not a USIM card</span><br><span style="color: hsl(120, 100%, 40%);">+               return None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+      # Select ADF.USIM in the Card using its full AID</span><br><span style="color: hsl(120, 100%, 40%);">+      def select_adf_by_aid(self):</span><br><span style="color: hsl(120, 100%, 40%);">+          for aid in self._aids:</span><br><span style="color: hsl(120, 100%, 40%);">+                        if "a0000000871002" in aid:</span><br><span style="color: hsl(120, 100%, 40%);">+                         (res, sw) = self._scc.select_adf(aid)</span><br><span style="color: hsl(120, 100%, 40%);">+                         return sw</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           return None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ # Read the (full) AID </span><br><span style="color: hsl(120, 100%, 40%);">+        def read_aid(self):</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         # First (known) halves of the AID</span><br><span style="color: hsl(120, 100%, 40%);">+             aid_usim = "a0000000871002"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               # Find out how many records the EF.DIR has, then go through</span><br><span style="color: hsl(120, 100%, 40%);">+           # all records and try to find the AID we are looking for</span><br><span style="color: hsl(120, 100%, 40%);">+              aid_record_count = self._scc.record_count(['2F00'])</span><br><span style="color: hsl(120, 100%, 40%);">+           for i in range(0, aid_record_count):</span><br><span style="color: hsl(120, 100%, 40%);">+                  record = self._scc.read_record(['2F00'], i + 1)</span><br><span style="color: hsl(120, 100%, 40%);">+                       if aid_usim in record[0]:</span><br><span style="color: hsl(120, 100%, 40%);">+                             aid_len = int(record[0][6:8], 16)</span><br><span style="color: hsl(120, 100%, 40%);">+                             return record[0][8:8 + aid_len * 2]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         return None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> # In order for autodetection ...</span><br><span> _cards_classes = [ FakeMagicSim, SuperSim, MagicSim, GrcardSim,</span><br><span>                SysmoSIMgr1, SysmoSIMgr2, SysmoUSIMgr1, SysmoUSIMSJS1,</span><br><span style="color: hsl(0, 100%, 40%);">-                  FairwavesSIM, OpenCellsSim, WavemobileSim, SysmoISIMSJA2 ]</span><br><span style="color: hsl(120, 100%, 40%);">+            FairwavesSIM, OpenCellsSim, WavemobileSim, SysmoISIMSJA2, GenericUSIM ]</span><br><span> </span><br><span> def card_autodetect(scc):</span><br><span>  for kls in _cards_classes:</span><br><span>diff --git a/pySim/transport/serial.py b/pySim/transport/serial.py</span><br><span>index 11fcd6a..12a7874 100644</span><br><span>--- a/pySim/transport/serial.py</span><br><span>+++ b/pySim/transport/serial.py</span><br><span>@@ -184,6 +184,7 @@</span><br><span>    def send_apdu_raw(self, pdu):</span><br><span>                """see LinkBase.send_apdu_raw"""</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+            self._dbg_print("TX PDU: %s" % pdu)</span><br><span>                pdu = h2b(pdu)</span><br><span>               data_len = ord(pdu[4])  # P3</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/pysim/+/18710">change 18710</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/+/18710"/><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: I8c0a914ed00a713fe473fc64f35d17ba34176e52 </div>
<div style="display:none"> Gerrit-Change-Number: 18710 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: guilly@gmail.com <guilly@gmail.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>