<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/24722">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add Kc128 to gsm0808 Create Ciphering Command<br><br>Prepare for A5/4 support in osmo-msc.<br><br>Add new function gsm0808_create_cipher2() which takes a struct as<br>argument instead of individual fields. This is akin to e.g.<br>gsm0808_create_handover_request() below in the file, and allows<br>backwards compatibly extending the argument list without needing a new<br>function signature every time.<br><br>Add struct gsm0808_cipher_mode_command, as argument list for<br>gsm0808_create_cipher2(), with kc128 included.<br><br>Encode the Kc128 IE in gsm0808_create_cipher2().<br><br>Implement gsm0808_create_cipher() by calling gsm0808_create_cipher2().<br><br>Change-Id: Ib3906085e0c6e5a496a9f755f0f786238a86ca34<br>---<br>M include/osmocom/gsm/gsm0808.h<br>M include/osmocom/gsm/gsm0808_utils.h<br>M src/gsm/gsm0808.c<br>M src/gsm/gsm0808_utils.c<br>M src/gsm/libosmogsm.map<br>5 files changed, 68 insertions(+), 10 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/22/24722/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/gsm/gsm0808.h b/include/osmocom/gsm/gsm0808.h</span><br><span>index dc3610f..a7df316 100644</span><br><span>--- a/include/osmocom/gsm/gsm0808.h</span><br><span>+++ b/include/osmocom/gsm/gsm0808.h</span><br><span>@@ -54,6 +54,21 @@</span><br><span> struct msgb *gsm0808_create_clear_complete(void);</span><br><span> struct msgb *gsm0808_create_cipher(const struct gsm0808_encrypt_info *ei,</span><br><span>                               const uint8_t *cipher_response_mode);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm0808_cipher_mode_command {</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm0808_encrypt_info ei;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     bool cipher_response_mode_present;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t cipher_response_mode;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       bool kc128_present;</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t kc128[16];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* more items are defined in the spec and may be added later */</span><br><span style="color: hsl(120, 100%, 40%);">+       bool more_items; /*< always set this to false */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+struct msgb *gsm0808_create_cipher2(const struct gsm0808_cipher_mode_command *cmc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct msgb *gsm0808_create_cipher_complete(struct msgb *layer3, uint8_t alg_id);</span><br><span> struct msgb *gsm0808_create_cipher_reject(enum gsm0808_cause cause);</span><br><span> struct msgb *gsm0808_create_cipher_reject_ext(enum gsm0808_cause_class class, uint8_t ext);</span><br><span>diff --git a/include/osmocom/gsm/gsm0808_utils.h b/include/osmocom/gsm/gsm0808_utils.h</span><br><span>index 76e9064..60e665b 100644</span><br><span>--- a/include/osmocom/gsm/gsm0808_utils.h</span><br><span>+++ b/include/osmocom/gsm/gsm0808_utils.h</span><br><span>@@ -125,6 +125,8 @@</span><br><span>                             const struct gsm0808_encrypt_info *ei);</span><br><span> int gsm0808_dec_encrypt_info(struct gsm0808_encrypt_info *ei,</span><br><span>                         const uint8_t *elem, uint8_t len);</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm0808_enc_kc128(struct msgb *msg, const uint8_t *kc128);</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm0808_dec_kc128(uint8_t *kc128, const uint8_t *elem, uint8_t len);</span><br><span> uint8_t gsm0808_enc_cell_id_list2(struct msgb *msg, const struct gsm0808_cell_id_list2 *cil);</span><br><span> uint8_t gsm0808_enc_cell_id_list(struct msgb *msg,</span><br><span>                              const struct gsm0808_cell_id_list *cil)</span><br><span>diff --git a/src/gsm/gsm0808.c b/src/gsm/gsm0808.c</span><br><span>index 3a39fd1..4f072f7 100644</span><br><span>--- a/src/gsm/gsm0808.c</span><br><span>+++ b/src/gsm/gsm0808.c</span><br><span>@@ -228,22 +228,32 @@</span><br><span>    return msg;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/*! Create BSSMAP Cipher Mode Command message</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Superseded by gsm0808_create_cipher2() to include Kc128.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Create BSSMAP Cipher Mode Command message (without Kc128).</span><br><span>  *  \param[in] ei Mandatory Encryption Information</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] kc128 optional kc128 key for A5/4</span><br><span>  *  \param[in] cipher_response_mode optional 1-byte Cipher Response Mode</span><br><span>  *  \returns callee-allocated msgb with BSSMAP Cipher Mode Command message */</span><br><span> struct msgb *gsm0808_create_cipher(const struct gsm0808_encrypt_info *ei,</span><br><span>                                const uint8_t *cipher_response_mode)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm0808_cipher_mode_command cmc = {</span><br><span style="color: hsl(120, 100%, 40%);">+            .ei = *ei,</span><br><span style="color: hsl(120, 100%, 40%);">+            .cipher_response_mode_present = (cipher_response_mode != NULL),</span><br><span style="color: hsl(120, 100%, 40%);">+               .cipher_response_mode = (cipher_response_mode ? *cipher_response_mode : 0),</span><br><span style="color: hsl(120, 100%, 40%);">+   };</span><br><span style="color: hsl(120, 100%, 40%);">+    return gsm0808_create_cipher2(&cmc);</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%);">+/*! Create BSSMAP Cipher Mode Command message.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] cmc  Information to encode.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns callee-allocated msgb with BSSMAP Cipher Mode Command message */</span><br><span style="color: hsl(120, 100%, 40%);">+struct msgb *gsm0808_create_cipher2(const struct gsm0808_cipher_mode_command *cmc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span>      /* See also: 3GPP TS 48.008 3.2.1.30 CIPHER MODE COMMAND */</span><br><span>  struct msgb *msg;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* Mandatory emelent! */</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(ei);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        msg =</span><br><span style="color: hsl(0, 100%, 40%);">-       msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM,</span><br><span style="color: hsl(0, 100%, 40%);">-                           "cipher-mode-command");</span><br><span style="color: hsl(120, 100%, 40%);">+     msg = msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM, "cipher-mode-command");</span><br><span>    if (!msg)</span><br><span>            return NULL;</span><br><span> </span><br><span>@@ -251,12 +261,16 @@</span><br><span>     msgb_v_put(msg, BSS_MAP_MSG_CIPHER_MODE_CMD);</span><br><span> </span><br><span>    /* Encryption Information 3.2.2.10 */</span><br><span style="color: hsl(0, 100%, 40%);">-   gsm0808_enc_encrypt_info(msg, ei);</span><br><span style="color: hsl(120, 100%, 40%);">+    gsm0808_enc_encrypt_info(msg, &cmc->ei);</span><br><span> </span><br><span>  /* Cipher Response Mode 3.2.2.34 */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (cipher_response_mode)</span><br><span style="color: hsl(120, 100%, 40%);">+     if (cmc->cipher_response_mode_present)</span><br><span>            msgb_tv_put(msg, GSM0808_IE_CIPHER_RESPONSE_MODE,</span><br><span style="color: hsl(0, 100%, 40%);">-                           *cipher_response_mode);</span><br><span style="color: hsl(120, 100%, 40%);">+                       cmc->cipher_response_mode);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Kc128 3.2.2.109 */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (cmc->kc128_present)</span><br><span style="color: hsl(120, 100%, 40%);">+            gsm0808_enc_kc128(msg, cmc->kc128);</span><br><span> </span><br><span>   /* pre-pend the header */</span><br><span>    msg->l3h =</span><br><span>diff --git a/src/gsm/gsm0808_utils.c b/src/gsm/gsm0808_utils.c</span><br><span>index 94c9a79..b5b8431 100644</span><br><span>--- a/src/gsm/gsm0808_utils.c</span><br><span>+++ b/src/gsm/gsm0808_utils.c</span><br><span>@@ -767,6 +767,30 @@</span><br><span>        return (int)(elem - old_elem);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! Encode TS 48.008 Kc128 IE.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[out] msg  Message Buffer to which IE is to be appended.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] kc128  Pointer to 16 bytes of Kc128 key data.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns number of bytes appended to msg */</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm0808_enc_kc128(struct msgb *msg, const uint8_t *kc128)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t *start = msg->tail;</span><br><span style="color: hsl(120, 100%, 40%);">+        msgb_tv_fixed_put(msg, GSM0808_IE_KC_128, 16, kc128);</span><br><span style="color: hsl(120, 100%, 40%);">+ return msg->tail - start;</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%);">+/*! Decode TS 48.008 Kc128 IE.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[out] kc128  Target buffer for received Kc128 key, 16 bytes long.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] elem  IE value to be decoded (without IE discriminator).</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] len  Length of elem in bytes.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns number of bytes parsed; negative on error */</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm0808_dec_kc128(uint8_t *kc128, const uint8_t *elem, uint8_t len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  if (len != 16)</span><br><span style="color: hsl(120, 100%, 40%);">+                return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       memcpy(kc128, elem, 16);</span><br><span style="color: hsl(120, 100%, 40%);">+      return len;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Store individual Cell Identifier information in a CGI, without clearing the remaining ones.</span><br><span>  * This is useful to supplement one CGI with information from more than one Cell Identifier,</span><br><span>  * which in turn is useful to match Cell Identifiers of differing kinds to each other.</span><br><span>diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map</span><br><span>index 437599b..475ec02 100644</span><br><span>--- a/src/gsm/libosmogsm.map</span><br><span>+++ b/src/gsm/libosmogsm.map</span><br><span>@@ -170,6 +170,7 @@</span><br><span> gsm0808_create_assignment_failure;</span><br><span> gsm0808_create_ass_fail;</span><br><span> gsm0808_create_cipher;</span><br><span style="color: hsl(120, 100%, 40%);">+gsm0808_create_cipher2;</span><br><span> gsm0808_create_cipher_complete;</span><br><span> gsm0808_create_cipher_reject;</span><br><span> gsm0808_create_cipher_reject_ext;</span><br><span>@@ -218,6 +219,8 @@</span><br><span> gsm0808_dec_channel_type;</span><br><span> gsm0808_enc_encrypt_info;</span><br><span> gsm0808_dec_encrypt_info;</span><br><span style="color: hsl(120, 100%, 40%);">+gsm0808_enc_kc128;</span><br><span style="color: hsl(120, 100%, 40%);">+gsm0808_dec_kc128;</span><br><span> gsm0808_enc_cell_id_list;</span><br><span> gsm0808_enc_cell_id_list2;</span><br><span> gsm0808_dec_cell_id_list;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/24722">change 24722</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/+/24722"/><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: Ib3906085e0c6e5a496a9f755f0f786238a86ca34 </div>
<div style="display:none"> Gerrit-Change-Number: 24722 </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>