<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/24727">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bsc: split f_verify_encr_info() from f_cipher_mode()<br><br>The verification of correct encryption information so far is part of<br>f_cipher_mode(); put it in a separate new function f_verify_encr_info()<br>so that it can be re-used for handover channel activation.<br><br>Related: SYS#5324<br>Change-Id: I11602d23670f436a22b891fc744fe07e470f2b79<br>---<br>M bsc/MSC_ConnectionHandler.ttcn<br>1 file changed, 57 insertions(+), 30 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/27/24727/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/bsc/MSC_ConnectionHandler.ttcn b/bsc/MSC_ConnectionHandler.ttcn</span><br><span>index 9b6f8b1..0e79420 100644</span><br><span>--- a/bsc/MSC_ConnectionHandler.ttcn</span><br><span>+++ b/bsc/MSC_ConnectionHandler.ttcn</span><br><span>@@ -713,12 +713,63 @@</span><br><span>         }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+function f_verify_encr_info(RSL_Message rsl) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+       var RSL_IE_Body encr_info;</span><br><span style="color: hsl(120, 100%, 40%);">+    var RSL_AlgId alg_rsl;</span><br><span style="color: hsl(120, 100%, 40%);">+        var template octetstring expect_kc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* If no encryption is enabled, then make sure there is no RSL_IE_ENCR_INFO */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (not ispresent(g_pars.encr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (f_rsl_find_ie(rsl, RSL_IE_ENCR_INFO, encr_info)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Found Encryption IE, but expected no encryption");</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</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%);">+   /* RSL uses a different representation of the encryption algorithm,</span><br><span style="color: hsl(120, 100%, 40%);">+    * so we need to convert first */</span><br><span style="color: hsl(120, 100%, 40%);">+     alg_rsl := f_chipher_mode_bssmap_to_rsl(g_pars.encr.enc_alg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (alg_rsl == RSL_ALG_ID_A5_4 and ispresent(g_pars.encr.enc_kc128)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                expect_kc := g_pars.encr.enc_kc128;</span><br><span style="color: hsl(120, 100%, 40%);">+   } else if (alg_rsl == RSL_ALG_ID_A5_0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* When A5/0 is chosen, no encryption is active, so technically, no key is needed. However, 3GPP TS</span><br><span style="color: hsl(120, 100%, 40%);">+            * 48.058 9.3.7 Encryption Information stays quite silent about presence or absence of a key for A5/0.</span><br><span style="color: hsl(120, 100%, 40%);">+                 * The only thing specified is how to indicate the length of the key; the possibility that the key may</span><br><span style="color: hsl(120, 100%, 40%);">+                 * be zero length is not explicitly mentioned. So it seems that we should always send the key along,</span><br><span style="color: hsl(120, 100%, 40%);">+           * even for A5/0. Still, let's also allow a zero length key for A5/0. */</span><br><span style="color: hsl(120, 100%, 40%);">+          expect_kc := (g_pars.encr.enc_key, ''O);</span><br><span style="color: hsl(120, 100%, 40%);">+      } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              expect_kc := g_pars.encr.enc_key;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     log("for encryption algo ", alg_rsl, " expect kc = ", expect_kc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (not f_rsl_find_ie(rsl, RSL_IE_ENCR_INFO, encr_info)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            if (alg_rsl == RSL_ALG_ID_A5_0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* For A5/0, encryption is not active. It is fine to omit the Encryption Information in this</span><br><span style="color: hsl(120, 100%, 40%);">+                   * case. Note that the first channel may see an RSL Encryption Command with A5/0 indicated, and</span><br><span style="color: hsl(120, 100%, 40%);">+                        * a subsequent handover may activate a new channel without any Encryption Information. */</span><br><span style="color: hsl(120, 100%, 40%);">+                    setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+                     return;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+             Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    "Missing Encryption Information IE");</span><br><span style="color: hsl(120, 100%, 40%);">+               return;</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%);">+   if (not match(encr_info, tr_EncrInfo(alg_rsl, expect_kc))) {</span><br><span style="color: hsl(120, 100%, 40%);">+          Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    "Unexpected Kc in Encryption Information IE");</span><br><span style="color: hsl(120, 100%, 40%);">+              return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> function f_cipher_mode(TestHdlrEncrParams enc, boolean exp_fail := false)</span><br><span> runs on MSC_ConnHdlr {</span><br><span>        var PDU_BSSAP bssap;</span><br><span>         var RSL_Message rsl;</span><br><span style="color: hsl(0, 100%, 40%);">-    var RSL_AlgId alg_rsl;</span><br><span style="color: hsl(0, 100%, 40%);">-  var template octetstring expect_kc;</span><br><span> </span><br><span>      if (isvalue(enc.enc_kc128)) {</span><br><span>                BSSAP.send(ts_BSSMAP_CipherModeCmdKc128(enc.enc_alg, enc.enc_key, valueof(enc.enc_kc128)));</span><br><span>@@ -726,39 +777,14 @@</span><br><span>          BSSAP.send(ts_BSSMAP_CipherModeCmd(enc.enc_alg, enc.enc_key));</span><br><span>       }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* RSL uses a different representation of the encryption algorithm,</span><br><span style="color: hsl(0, 100%, 40%);">-      * so we need to convert first */</span><br><span style="color: hsl(0, 100%, 40%);">-       alg_rsl := f_chipher_mode_bssmap_to_rsl(enc.enc_alg);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if (alg_rsl == RSL_ALG_ID_A5_4 and ispresent(enc.enc_kc128)) {</span><br><span style="color: hsl(0, 100%, 40%);">-          expect_kc := enc.enc_kc128;</span><br><span style="color: hsl(0, 100%, 40%);">-     } else if (alg_rsl == RSL_ALG_ID_A5_0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                /* When A5/0 is chosen, no encryption is active, so technically, no key is needed. However, 3GPP TS</span><br><span style="color: hsl(0, 100%, 40%);">-              * 48.058 9.3.7 Encryption Information stays quite silent about presence or absence of a key for A5/0.</span><br><span style="color: hsl(0, 100%, 40%);">-           * The only thing specified is how to indicate the length of the key; the possibility that the key may</span><br><span style="color: hsl(0, 100%, 40%);">-           * be zero length is not explicitly mentioned. So it seems that we should always send the key along,</span><br><span style="color: hsl(0, 100%, 40%);">-             * even for A5/0. Still, let's also allow a zero length key for A5/0. */</span><br><span style="color: hsl(0, 100%, 40%);">-            expect_kc := (enc.enc_key, ''O);</span><br><span style="color: hsl(0, 100%, 40%);">-        } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                expect_kc := enc.enc_key;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       log("for encryption algo ", alg_rsl, " expect kc = ", expect_kc);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>        alt {</span><br><span>        /* RSL/UE Side */</span><br><span style="color: hsl(0, 100%, 40%);">-       [] RSL.receive(tr_RSL_ENCR_CMD(g_chan_nr, ?, alg_rsl, ?)) -> value rsl {</span><br><span style="color: hsl(120, 100%, 40%);">+   [] RSL.receive(tr_RSL_ENCR_CMD(g_chan_nr)) -> value rsl {</span><br><span>                 var PDU_ML3_NW_MS l3 := dec_PDU_ML3_NW_MS(rsl.ies[3].body.l3_info.payload);</span><br><span>          log("Rx L3 from net: ", l3);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              var RSL_IE_Body encr_info;</span><br><span style="color: hsl(0, 100%, 40%);">-              if (not f_rsl_find_ie(rsl, RSL_IE_ENCR_INFO, encr_info)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Missing Encryption IE in RSL ENCR CMD");</span><br><span style="color: hsl(0, 100%, 40%);">-          } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (not match(encr_info, tr_EncrInfo(alg_rsl, expect_kc))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                            Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                      "Unexpected Kc in Encryption IE in RSL ENCR CMD");</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(120, 100%, 40%);">+             f_verify_encr_info(rsl);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>           if (ischosen(l3.msgs.rrm.cipheringModeCommand)) {</span><br><span>                    f_rsl_reply(ts_RRM_CiphModeCompl, rsl);</span><br><span>              }</span><br><span>@@ -769,6 +795,7 @@</span><br><span>                      Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Unexpected Cipher Mode Complete");</span><br><span>             } else {</span><br><span>                     setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+                     var RSL_AlgId alg_rsl := f_chipher_mode_bssmap_to_rsl(g_pars.encr.enc_alg);</span><br><span>                  if (oct2int(bssap.pdu.bssmap.cipherModeComplete.chosenEncryptionAlgorithm.algorithmIdentifier) != enum2int(alg_rsl)) {</span><br><span>                               setverdict(fail, "Unexpected Encryption Algorithm ID in BSSMAP Cipher Mode Complete");</span><br><span>                     }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/24727">change 24727</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-ttcn3-hacks/+/24727"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ttcn3-hacks </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I11602d23670f436a22b891fc744fe07e470f2b79 </div>
<div style="display:none"> Gerrit-Change-Number: 24727 </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>