<p>Hoernchen has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24635">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">[WIP] a5/4 support<br><br>Change-Id: I7c458c8a7350f34ff79531b3c891e1b367614469<br>Related: SYS#5324<br>---<br>M include/osmocom/bsc/gsm_data.h<br>M src/osmo-bsc/abis_rsl.c<br>M src/osmo-bsc/handover_fsm.c<br>M src/osmo-bsc/osmo_bsc_bssap.c<br>4 files changed, 41 insertions(+), 3 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/35/24635/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index 2515d7e..cc0bbe5 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -234,6 +234,7 @@</span><br><span>   struct gsm0808_channel_type ct;</span><br><span>      struct gsm0808_speech_codec_list scl;</span><br><span>        struct gsm0808_encrypt_info ei;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t kc128[16];</span><br><span>      struct gsm_classmark classmark;</span><br><span>      /* chosen_encr_alg reflects the encoded value as in RSL_ENC_ALG_A5(a5_numer):</span><br><span>         * chosen_encr_alg == 1 means A5/0 i.e. no encryption, chosen_encr_alg == 4 means A5/3.</span><br><span>@@ -544,6 +545,7 @@</span><br><span>        uint8_t alg_id;</span><br><span>      uint8_t key_len;</span><br><span>     uint8_t key[MAX_A5_KEY_LEN];</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t kc128[16];</span><br><span> };</span><br><span> </span><br><span> #define LOGPLCHAN(lchan, ss, level, fmt, args...) \</span><br><span>diff --git a/src/osmo-bsc/abis_rsl.c b/src/osmo-bsc/abis_rsl.c</span><br><span>index 69052ee..3e3d92e 100644</span><br><span>--- a/src/osmo-bsc/abis_rsl.c</span><br><span>+++ b/src/osmo-bsc/abis_rsl.c</span><br><span>@@ -156,8 +156,11 @@</span><br><span> static int build_encr_info(uint8_t *out, struct gsm_lchan *lchan)</span><br><span> {</span><br><span>        *out++ = lchan->encr.alg_id & 0xff;</span><br><span style="color: hsl(0, 100%, 40%);">-      if (lchan->encr.key_len)</span><br><span style="color: hsl(120, 100%, 40%);">+   if (lchan->encr.alg_id == GSM0808_ALG_ID_A5_4)</span><br><span style="color: hsl(120, 100%, 40%);">+             memcpy(out, lchan->encr.kc128, 16);</span><br><span style="color: hsl(120, 100%, 40%);">+        else if (lchan->encr.key_len)</span><br><span>             memcpy(out, lchan->encr.key, lchan->encr.key_len);</span><br><span style="color: hsl(120, 100%, 40%);">+!!! only one key</span><br><span>   return lchan->encr.key_len + 1;</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/handover_fsm.c b/src/osmo-bsc/handover_fsm.c</span><br><span>index 8141a5d..e18504e 100644</span><br><span>--- a/src/osmo-bsc/handover_fsm.c</span><br><span>+++ b/src/osmo-bsc/handover_fsm.c</span><br><span>@@ -454,6 +454,8 @@</span><br><span>   int payload_length;</span><br><span>  bool aoip = gscon_is_aoip(conn);</span><br><span>     bool sccplite = gscon_is_sccplite(conn);</span><br><span style="color: hsl(120, 100%, 40%);">+      bool has_a54 = false;</span><br><span style="color: hsl(120, 100%, 40%);">+ int i;</span><br><span> </span><br><span>   if ((aoip && sccplite) || !(aoip || sccplite)) {</span><br><span>             LOG_HO(conn, LOGL_ERROR, "Received BSSMAP Handover Request, but conn is not"</span><br><span>@@ -485,6 +487,22 @@</span><br><span>                return false;</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ for( i= 0; i < req->ei.perm_algo_len; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+            has_a54 = req->ei.perm_algo[i] == GSM0808_ALG_ID_A5_4;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (has_a54)</span><br><span style="color: hsl(120, 100%, 40%);">+                  break;</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%);">+   /* kc128 mandatory for a5/4 */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (has_a54) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!(e = TLVP_GET(tp, GSM0808_IE_KC_128)) || e->len != 16) {</span><br><span style="color: hsl(120, 100%, 40%);">+            LOG_HO(conn, LOGL_ERROR, "Missing kc128 IE\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            return false;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+        memcpy(req->kc128, e->val, 16);</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%);">+</span><br><span>      if ((e = TLVP_GET(tp, GSM0808_IE_CLASSMARK_INFORMATION_TYPE_1))) {</span><br><span>           if (e->len != sizeof(req->classmark.classmark1)) {</span><br><span>                     LOG_HO(conn, LOGL_ERROR, "Classmark Information 1 has wrong size\n");</span><br><span>@@ -513,9 +531,9 @@</span><br><span>                               req->chosen_encr_alg);</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   LOG_HO(conn, LOGL_DEBUG, "Handover Request encryption info: chosen=A5/%u key=%s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ LOG_HO(conn, LOGL_DEBUG, "Handover Request encryption info: chosen=A5/%u key=%s kc128=%s\n",</span><br><span>              (req->chosen_encr_alg ? : 1) - 1, req->ei.key_len?</span><br><span style="color: hsl(0, 100%, 40%);">-        osmo_hexdump_nospc(req->ei.key, req->ei.key_len) : "none");</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_hexdump_nospc(req->ei.key, req->ei.key_len) : "none", has_a54 ? osmo_hexdump_nospc(req->kc128, 16) : "none");</span><br><span> </span><br><span>       if (TLVP_PRESENT(tp, GSM0808_IE_AOIP_TRASP_ADDR)) {</span><br><span>          int rc;</span><br><span>@@ -718,6 +736,7 @@</span><br><span>                }</span><br><span>            memcpy(info.encr.key, req->ei.key, req->ei.key_len);</span><br><span>           info.encr.key_len = req->ei.key_len;</span><br><span style="color: hsl(120, 100%, 40%);">+               memcpy(info.encr.kc128, req->kc128, 16);</span><br><span>  }</span><br><span> </span><br><span>        if (req->last_eutran_plmn_valid) {</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_bssap.c b/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>index da0429b..1b7e537 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>@@ -542,6 +542,14 @@</span><br><span>         * a5_encryption == 2 --> 0x04 ... */</span><br><span>     enc_bits_msc = data[0];</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* kc128 mandatory for a5/4 */</span><br><span style="color: hsl(120, 100%, 40%);">+     if (enc_bits_msc & 0xf0 && !TLVP_PRESENT(&tp, GSM0808_IE_KC_128)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DMSC, LOGL_ERROR, "IE kc128 missing.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              reject_cause = GSM0808_CAUSE_INFORMATION_ELEMENT_OR_FIELD_MISSING;</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>  /* The bit-mask of permitted ciphers from the MSC (sent in ASSIGNMENT COMMAND) is intersected</span><br><span>         * with the vty-configured mask a the BSC.  Finally, the best (highest) possible cipher is</span><br><span>    * chosen. */</span><br><span>@@ -553,6 +561,12 @@</span><br><span>                 goto reject;</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if(chosen_cipher == 4) {</span><br><span style="color: hsl(120, 100%, 40%);">+              data = TLVP_VAL(&tp, GSM0808_IE_KC_128);</span><br><span style="color: hsl(120, 100%, 40%);">+          enc_key = &data[0];</span><br><span style="color: hsl(120, 100%, 40%);">+               enc_key_len = 16;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* To complete the confusion, gsm0808_cipher_mode again expects the encryption as a number</span><br><span>    * from 0 to 7. */</span><br><span>   if (gsm0808_cipher_mode(conn, chosen_cipher, enc_key, enc_key_len,</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24635">change 24635</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/+/24635"/><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: I7c458c8a7350f34ff79531b3c891e1b367614469 </div>
<div style="display:none"> Gerrit-Change-Number: 24635 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>