<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24677">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">dissolve gsm0808_cipher_mode() into bssmap_handle_cipher_mode()<br><br>An upcoming patch for A5/4 would need to add a kc128 arg and reject<br>cause rc to gsm0808_cipher_mode(). Instead prepare for less cruft by<br>just having a single function.<br><br>Related: SYS#5324<br>Change-Id: I7f7c635943990a251ae28ae7a0d69cc3a239a154<br>---<br>M src/osmo-bsc/osmo_bsc_bssap.c<br>1 file changed, 25 insertions(+), 32 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/77/24677/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo-bsc/osmo_bsc_bssap.c b/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>index da0429b..0b1c649 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>@@ -416,34 +416,6 @@</span><br><span>    return -1;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/*! We received a GSM 08.08 CIPHER MODE from the MSC */</span><br><span style="color: hsl(0, 100%, 40%);">-static int gsm0808_cipher_mode(struct gsm_subscriber_connection *conn, int cipher,</span><br><span style="color: hsl(0, 100%, 40%);">-                           const uint8_t *key, int len, int include_imeisv)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        if (cipher > 0 && key == NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DRSL, LOGL_ERROR, "%s: Need to have an encryption key.\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                    bsc_subscr_name(conn->bsub));</span><br><span style="color: hsl(0, 100%, 40%);">-           return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (len > MAX_A5_KEY_LEN) {</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGP(DRSL, LOGL_ERROR, "%s: The key is too long: %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                    bsc_subscr_name(conn->bsub), len);</span><br><span style="color: hsl(0, 100%, 40%);">-              return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       LOGP(DRSL, LOGL_DEBUG, "(subscr %s) Cipher Mode: cipher=%d key=%s include_imeisv=%d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-            bsc_subscr_name(conn->bsub), cipher, osmo_hexdump_nospc(key, len), include_imeisv);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     conn->lchan->encr.alg_id = RSL_ENC_ALG_A5(cipher);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (key) {</span><br><span style="color: hsl(0, 100%, 40%);">-              conn->lchan->encr.key_len = len;</span><br><span style="color: hsl(0, 100%, 40%);">-          memcpy(conn->lchan->encr.key, key, len);</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return gsm48_send_rr_ciph_mode(conn->lchan, include_imeisv);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static int bssmap_handle_clear_cmd(struct gsm_subscriber_connection *conn,</span><br><span>                                  struct msgb *msg, unsigned int length)</span><br><span> {</span><br><span>@@ -553,13 +525,34 @@</span><br><span>               goto reject;</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* To complete the confusion, gsm0808_cipher_mode again expects the encryption as a number</span><br><span style="color: hsl(0, 100%, 40%);">-       * from 0 to 7. */</span><br><span style="color: hsl(0, 100%, 40%);">-      if (gsm0808_cipher_mode(conn, chosen_cipher, enc_key, enc_key_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                              include_imeisv)) {</span><br><span style="color: hsl(120, 100%, 40%);">+    if (chosen_cipher > 0 && !enc_key_len) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DRSL, LOGL_ERROR, "%s: Need to have an encryption key.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  bsc_subscr_name(conn->bsub));</span><br><span>                reject_cause = GSM0808_CAUSE_PROTOCOL_ERROR_BETWEEN_BSS_AND_MSC;</span><br><span>             goto reject;</span><br><span>         }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (enc_key_len > MAX_A5_KEY_LEN) {</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGP(DRSL, LOGL_ERROR, "%s: The key is too long: %d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  bsc_subscr_name(conn->bsub), len);</span><br><span style="color: hsl(120, 100%, 40%);">+            reject_cause = GSM0808_CAUSE_PROTOCOL_ERROR_BETWEEN_BSS_AND_MSC;</span><br><span style="color: hsl(120, 100%, 40%);">+              goto reject;</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%);">+   conn->lchan->encr.alg_id = RSL_ENC_ALG_A5(chosen_cipher);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (enc_key_len) {</span><br><span style="color: hsl(120, 100%, 40%);">+            conn->lchan->encr.key_len = enc_key_len;</span><br><span style="color: hsl(120, 100%, 40%);">+                memcpy(conn->lchan->encr.key, enc_key, enc_key_len);</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%);">+   LOGP(DRSL, LOGL_DEBUG, "(subscr %s) Cipher Mode: cipher=%d key=%s include_imeisv=%d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+          bsc_subscr_name(conn->bsub), chosen_cipher, osmo_hexdump_nospc(enc_key, enc_key_len),</span><br><span style="color: hsl(120, 100%, 40%);">+      include_imeisv);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (gsm48_send_rr_ciph_mode(conn->lchan, include_imeisv) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+         reject_cause = GSM0808_CAUSE_RADIO_INTERFACE_FAILURE;</span><br><span style="color: hsl(120, 100%, 40%);">+         goto reject;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span>    return 0;</span><br><span> </span><br><span> reject:</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24677">change 24677</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/osmo-bsc/+/24677"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I7f7c635943990a251ae28ae7a0d69cc3a239a154 </div>
<div style="display:none"> Gerrit-Change-Number: 24677 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>