<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/17998">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">sim: When decoding SW, take application specific SW into account<br><br>So far we only looked at SW definitions of the card profile. However,<br>if we have a currently selected application, we also must check<br>that application for SW definitions.<br><br>This breaks ABI and API all over the place, but as there are no<br>known users beyond osmo-sim-test, this is acceptable.<br><br>Change-Id: I3a1d60898529c173f73587e34c155660ba5f5fb1<br>---<br>M TODO-RELEASE<br>M include/osmocom/sim/sim.h<br>M src/sim/core.c<br>M utils/osmo-sim-test.c<br>4 files changed, 46 insertions(+), 21 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/98/17998/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/TODO-RELEASE b/TODO-RELEASE</span><br><span>index 4145300..bc95b91 100644</span><br><span>--- a/TODO-RELEASE</span><br><span>+++ b/TODO-RELEASE</span><br><span>@@ -9,3 +9,4 @@</span><br><span> #library what                    description / commit summary line</span><br><span> gsm                API/ABI change          l1sap.h, added struct members to ph_data_param and ph_tch_param</span><br><span> sim          API/ABI change          new osim_file_desc_find_aid()</span><br><span style="color: hsl(120, 100%, 40%);">+sim              API/ABI change          all over the place</span><br><span>diff --git a/include/osmocom/sim/sim.h b/include/osmocom/sim/sim.h</span><br><span>index 33ebdd7..bfd1ac9 100644</span><br><span>--- a/include/osmocom/sim/sim.h</span><br><span>+++ b/include/osmocom/sim/sim.h</span><br><span>@@ -309,6 +309,7 @@</span><br><span> const struct osim_card_app_profile *</span><br><span> osim_app_profile_find_by_aid(const uint8_t *aid, uint8_t aid_len);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+const struct osim_card_sw *osim_app_profile_find_sw(const struct osim_card_app_profile *ap, uint16_t sw_in);</span><br><span> </span><br><span> /*! A card profile (e.g. SIM card */</span><br><span> struct osim_card_profile {</span><br><span>@@ -319,15 +320,13 @@</span><br><span>  const struct osim_card_sw **sws;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-const struct osim_card_sw *osim_find_sw(const struct osim_card_profile *cp,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   uint16_t sw);</span><br><span style="color: hsl(0, 100%, 40%);">-enum osim_card_sw_class osim_sw_class(const struct osim_card_profile *cp,</span><br><span style="color: hsl(0, 100%, 40%);">-                                  uint16_t sw_in);</span><br><span style="color: hsl(120, 100%, 40%);">+const struct osim_card_sw *osim_cprof_find_sw(const struct osim_card_profile *cp, uint16_t sw_in);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct osim_card_hdl;</span><br><span style="color: hsl(0, 100%, 40%);">-char *osim_print_sw_buf(char *buf, size_t buf_len, const struct osim_card_hdl *ch, uint16_t sw_in);</span><br><span style="color: hsl(0, 100%, 40%);">-char *osim_print_sw(const struct osim_card_hdl *ch, uint16_t sw_in);</span><br><span style="color: hsl(0, 100%, 40%);">-char *osim_print_sw_c(const void *ctx, const struct osim_card_hdl *ch, uint16_t sw_in);</span><br><span style="color: hsl(120, 100%, 40%);">+struct osim_chan_hdl;</span><br><span style="color: hsl(120, 100%, 40%);">+enum osim_card_sw_class osim_sw_class(const struct osim_chan_hdl *ch, uint16_t sw_in);</span><br><span style="color: hsl(120, 100%, 40%);">+char *osim_print_sw_buf(char *buf, size_t buf_len, const struct osim_chan_hdl *ch, uint16_t sw_in);</span><br><span style="color: hsl(120, 100%, 40%);">+char *osim_print_sw(const struct osim_chan_hdl *ch, uint16_t sw_in);</span><br><span style="color: hsl(120, 100%, 40%);">+char *osim_print_sw_c(const void *ctx, const struct osim_chan_hdl *ch, uint16_t sw_in);</span><br><span> </span><br><span> extern const struct tlv_definition ts102221_fcp_tlv_def;</span><br><span> extern const struct value_string ts102221_fcp_vals[14];</span><br><span>diff --git a/src/sim/core.c b/src/sim/core.c</span><br><span>index 8b2d6f9..d11c2d8 100644</span><br><span>--- a/src/sim/core.c</span><br><span>+++ b/src/sim/core.c</span><br><span>@@ -367,14 +367,19 @@</span><br><span> }</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-char *osim_print_sw_buf(char *buf, size_t buf_len, const struct osim_card_hdl *ch, uint16_t sw_in)</span><br><span style="color: hsl(120, 100%, 40%);">+char *osim_print_sw_buf(char *buf, size_t buf_len, const struct osim_chan_hdl *ch, uint16_t sw_in)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  const struct osim_card_sw *csw;</span><br><span style="color: hsl(120, 100%, 40%);">+       const struct osim_card_sw *csw = NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      if (!ch || !ch->prof)</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!ch)</span><br><span>             goto ret_def;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       csw = osim_find_sw(ch->prof, sw_in);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (ch->cur_app && ch->cur_app->prof)</span><br><span style="color: hsl(120, 100%, 40%);">+                csw = osim_app_profile_find_sw(ch->cur_app->prof, sw_in);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!csw && ch->card->prof)</span><br><span style="color: hsl(120, 100%, 40%);">+             csw = osim_cprof_find_sw(ch->card->prof, sw_in);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     if (!csw)</span><br><span>            goto ret_def;</span><br><span> </span><br><span>@@ -397,13 +402,13 @@</span><br><span>    return buf;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-char *osim_print_sw(const struct osim_card_hdl *ch, uint16_t sw_in)</span><br><span style="color: hsl(120, 100%, 40%);">+char *osim_print_sw(const struct osim_chan_hdl *ch, uint16_t sw_in)</span><br><span> {</span><br><span>    static __thread char sw_print_buf[256];</span><br><span>      return osim_print_sw_buf(sw_print_buf, sizeof(sw_print_buf), ch, sw_in);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-char *osim_print_sw_c(const void *ctx, const struct osim_card_hdl *ch, uint16_t sw_in)</span><br><span style="color: hsl(120, 100%, 40%);">+char *osim_print_sw_c(const void *ctx, const struct osim_chan_hdl *ch, uint16_t sw_in)</span><br><span> {</span><br><span>         char *buf = talloc_size(ctx, 256);</span><br><span>   if (!buf)</span><br><span>@@ -411,8 +416,8 @@</span><br><span>      return osim_print_sw_buf(buf, 256, ch, sw_in);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-const struct osim_card_sw *osim_find_sw(const struct osim_card_profile *cp,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      uint16_t sw_in)</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Find status word within given card profile */</span><br><span style="color: hsl(120, 100%, 40%);">+const struct osim_card_sw *osim_cprof_find_sw(const struct osim_card_profile *cp, uint16_t sw_in)</span><br><span> {</span><br><span>   const struct osim_card_sw **sw_lists = cp->sws;</span><br><span>   const struct osim_card_sw *sw_list, *sw;</span><br><span>@@ -426,10 +431,30 @@</span><br><span>     return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-enum osim_card_sw_class osim_sw_class(const struct osim_card_profile *cp,</span><br><span style="color: hsl(0, 100%, 40%);">-                                uint16_t sw_in)</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Find application-specific status word within given card application profile */</span><br><span style="color: hsl(120, 100%, 40%);">+const struct osim_card_sw *osim_app_profile_find_sw(const struct osim_card_app_profile *ap, uint16_t sw_in)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     const struct osim_card_sw *csw = osim_find_sw(cp, sw_in);</span><br><span style="color: hsl(120, 100%, 40%);">+     const struct osim_card_sw *sw_list = ap->sw, *sw;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        for (sw = sw_list; sw->code != 0 && sw->mask != 0; sw++) {</span><br><span style="color: hsl(120, 100%, 40%);">+              if ((sw_in & sw->mask) == sw->code)</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 NULL;</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%);">+enum osim_card_sw_class osim_sw_class(const struct osim_chan_hdl *ch, uint16_t sw_in)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   const struct osim_card_sw *csw = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(ch);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(ch->card);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (ch->cur_app && ch->cur_app->prof)</span><br><span style="color: hsl(120, 100%, 40%);">+                csw = osim_app_profile_find_sw(ch->cur_app->prof, sw_in);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!csw && ch->card->prof)</span><br><span style="color: hsl(120, 100%, 40%);">+             csw = osim_cprof_find_sw(ch->card->prof, sw_in);</span><br><span> </span><br><span>   if (!csw)</span><br><span>            return SW_CLS_NONE;</span><br><span>diff --git a/utils/osmo-sim-test.c b/utils/osmo-sim-test.c</span><br><span>index cf423c4..ae55b83 100644</span><br><span>--- a/utils/osmo-sim-test.c</span><br><span>+++ b/utils/osmo-sim-test.c</span><br><span>@@ -411,7 +411,7 @@</span><br><span>                                   fclose(f_data);</span><br><span>                              return -EIO;</span><br><span>                         }</span><br><span style="color: hsl(0, 100%, 40%);">-                       printf("SW: %s\n", osim_print_sw(chan->card, msgb_apdu_sw(msg)));</span><br><span style="color: hsl(120, 100%, 40%);">+                        printf("SW: %s\n", osim_print_sw(chan, msgb_apdu_sw(msg)));</span><br><span> </span><br><span>                    hex = osmo_hexdump_nospc(msgb_apdu_de(rmsg), msgb_apdu_le(rmsg));</span><br><span>                    printf("Rec %03u: %s\n", i+1, hex);</span><br><span>@@ -593,7 +593,7 @@</span><br><span>                          osmo_hexdump_nospc(cah->aid, cah->aid_len));</span><br><span>                   continue;</span><br><span>            }</span><br><span style="color: hsl(0, 100%, 40%);">-               printf("SW: %s\n", osim_print_sw(chan->card, msgb_apdu_sw(msg)));</span><br><span style="color: hsl(120, 100%, 40%);">+                printf("SW: %s\n", osim_print_sw(chan, msgb_apdu_sw(msg)));</span><br><span>                chan->cur_app = cah;</span><br><span>              chan->cwd = cap->adf;</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/17998">change 17998</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/libosmocore/+/17998"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I3a1d60898529c173f73587e34c155660ba5f5fb1 </div>
<div style="display:none"> Gerrit-Change-Number: 17998 </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>