<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/pysim/+/26085">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">sim-rest-server: Add capability to obtain IMSI + ICCID of card<br><br>$ curl http://localhost:8000/sim-info-api/v1/slot/0<br>{<br>    "imsi": "262011500776110",<br>    "iccid": "89490240001879910128"<br>}<br><br>Change-Id: I9df8854f6a962e7f86f62b2d44ec7696271c58c8<br>---<br>M contrib/sim-rest-server.py<br>1 file changed, 50 insertions(+), 8 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/85/26085/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/contrib/sim-rest-server.py b/contrib/sim-rest-server.py</span><br><span>index 0f77dfe..fb73ef8 100755</span><br><span>--- a/contrib/sim-rest-server.py</span><br><span>+++ b/contrib/sim-rest-server.py</span><br><span>@@ -34,6 +34,23 @@</span><br><span>         #print("CMD: %s -> RSP: %s %s" % (cmd, sw, resp))</span><br><span>         pass</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+def connect_to_card(slot_nr:int):</span><br><span style="color: hsl(120, 100%, 40%);">+    tp = PcscSimLink(slot_nr, apdu_tracer=ApduPrintTracer())</span><br><span style="color: hsl(120, 100%, 40%);">+    tp.connect()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    scc = SimCardCommands(tp)</span><br><span style="color: hsl(120, 100%, 40%);">+    card = UsimCard(scc)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    # this should be part of UsimCard, but FairewavesSIM breaks with that :/</span><br><span style="color: hsl(120, 100%, 40%);">+    scc.cla_byte = "00"</span><br><span style="color: hsl(120, 100%, 40%);">+    scc.sel_ctrl = "0004"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    card.read_aids()</span><br><span style="color: hsl(120, 100%, 40%);">+    card.select_adf_by_aid(adf='usim')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    return tp, scc, card</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> @route('/sim-auth-api/v1/slot/<int:slot>')</span><br><span> def auth(request, slot):</span><br><span>     """REST API endpoint for performing authentication against a USIM.</span><br><span>@@ -49,8 +66,7 @@</span><br><span>         return "Malformed Request"</span><br><span> </span><br><span>     try:</span><br><span style="color: hsl(0, 100%, 40%);">-        tp = PcscSimLink(slot, apdu_tracer=ApduPrintTracer())</span><br><span style="color: hsl(0, 100%, 40%);">-        tp.connect()</span><br><span style="color: hsl(120, 100%, 40%);">+        tp, scc, card = connect_to_card(slot)</span><br><span>     except ReaderError:</span><br><span>         request.setResponseCode(404)</span><br><span>         return "Specified SIM Slot doesn't exist"</span><br><span>@@ -61,13 +77,7 @@</span><br><span>         request.setResponseCode(410)</span><br><span>         return "No SIM card inserted in slot"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    scc = SimCardCommands(tp)</span><br><span style="color: hsl(0, 100%, 40%);">-    card = UsimCard(scc)</span><br><span style="color: hsl(0, 100%, 40%);">-    # this should be part of UsimCard, but FairewavesSIM breaks with that :/</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>     try:</span><br><span style="color: hsl(0, 100%, 40%);">-        card.read_aids()</span><br><span>         card.select_adf_by_aid(adf='usim')</span><br><span>         res, sw = scc.authenticate(rand, autn)</span><br><span>     except SwMatchError as e:</span><br><span>@@ -78,6 +88,38 @@</span><br><span> </span><br><span>     return json.dumps(res, indent=4)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+@route('/sim-info-api/v1/slot/<int:slot>')</span><br><span style="color: hsl(120, 100%, 40%);">+def info(request, slot):</span><br><span style="color: hsl(120, 100%, 40%);">+    """REST API endpoint for obtaining information about an USIM.</span><br><span style="color: hsl(120, 100%, 40%);">+    Expects empty body in request.</span><br><span style="color: hsl(120, 100%, 40%);">+    Returns a JSON body containing ICCID, IMSI."""</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    try:</span><br><span style="color: hsl(120, 100%, 40%);">+        tp, scc, card = connect_to_card(slot)</span><br><span style="color: hsl(120, 100%, 40%);">+    except ReaderError:</span><br><span style="color: hsl(120, 100%, 40%);">+        request.setResponseCode(404)</span><br><span style="color: hsl(120, 100%, 40%);">+        return "Specified SIM Slot doesn't exist"</span><br><span style="color: hsl(120, 100%, 40%);">+    except ProtocolError:</span><br><span style="color: hsl(120, 100%, 40%);">+        request.setResponseCode(500)</span><br><span style="color: hsl(120, 100%, 40%);">+        return "Error"</span><br><span style="color: hsl(120, 100%, 40%);">+    except NoCardError:</span><br><span style="color: hsl(120, 100%, 40%);">+        request.setResponseCode(410)</span><br><span style="color: hsl(120, 100%, 40%);">+        return "No SIM card inserted in slot"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    try:</span><br><span style="color: hsl(120, 100%, 40%);">+        card.select_adf_by_aid(adf='usim')</span><br><span style="color: hsl(120, 100%, 40%);">+        iccid, sw = card.read_iccid()</span><br><span style="color: hsl(120, 100%, 40%);">+        imsi, sw = card.read_imsi()</span><br><span style="color: hsl(120, 100%, 40%);">+        res = {"imsi": imsi, "iccid": iccid }</span><br><span style="color: hsl(120, 100%, 40%);">+    except SwMatchError as e:</span><br><span style="color: hsl(120, 100%, 40%);">+        request.setResponseCode(500)</span><br><span style="color: hsl(120, 100%, 40%);">+        return "Communication Error %s" % e</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    tp.disconnect()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    return json.dumps(res, indent=4)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> def main(argv):</span><br><span>     parser = argparse.ArgumentParser()</span><br><span>     parser.add_argument("-H", "--host", help="Host/IP to bind HTTP to", default="localhost")</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/pysim/+/26085">change 26085</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/+/26085"/><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: I9df8854f6a962e7f86f62b2d44ec7696271c58c8 </div>
<div style="display:none"> Gerrit-Change-Number: 26085 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>