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