<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/24758">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">msc: cipher mode: move cipher expect to new function<br><br>Move the ciphering calculations from f_mm_common() to new function<br>f_get_expected_encryption(), so that it can be re-used for ciphering in<br>inter-BSC handover (upcoming patch).<br><br>Add tr_BSSMAP_CipherModeCmd2() to conveniently use the values returned<br>by f_get_expected_encryption().<br><br>To verify the Ciphering Mode Command in f_mm_common(), use the new<br>tr_BSSMAP_CipherModeCmd2(), and rely on template matching instead of<br>checking each IE individually.<br><br>Related: SYS#5324<br>Change-Id: I1f775889fb801d441ea6c8b0f0c34718b814c09e<br>---<br>M library/BSSMAP_Templates.ttcn<br>M msc/BSC_ConnectionHandler.ttcn<br>2 files changed, 56 insertions(+), 29 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/58/24758/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/library/BSSMAP_Templates.ttcn b/library/BSSMAP_Templates.ttcn</span><br><span>index 1dcbef1..cde0fb0 100644</span><br><span>--- a/library/BSSMAP_Templates.ttcn</span><br><span>+++ b/library/BSSMAP_Templates.ttcn</span><br><span>@@ -546,6 +546,11 @@</span><br><span>     }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+template BSSMAP_IE_KC128 tr_BSSMAP_IE_Kc128(template OCT16 kc128) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    elementIdentifier := '83'O,</span><br><span style="color: hsl(120, 100%, 40%);">+   kC128_Value := kc128</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> template (value) BSSMAP_IE_KC128 ts_BSSMAP_IE_Kc128(OCT16 kc128) := {</span><br><span>   elementIdentifier := '83'O,</span><br><span>  kC128_Value := kc128</span><br><span>@@ -1398,21 +1403,25 @@</span><br><span>       }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template PDU_BSSAP tr_BSSMAP_CipherModeCmd(template OCT1 alg, template OCT8 key)</span><br><span style="color: hsl(120, 100%, 40%);">+template PDU_BSSAP tr_BSSMAP_CipherModeCmd2(template BSSMAP_IE_EncryptionInformation encryptionInformation := *,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      template BSSMAP_IE_KC128 kC128 := *)</span><br><span> modifies tr_BSSAP_BSSMAP := {</span><br><span>    pdu := {</span><br><span>             bssmap := {</span><br><span>                  cipherModeCommand := {</span><br><span>                               messageType := '53'O,</span><br><span>                                layer3HeaderInfo := *,</span><br><span style="color: hsl(0, 100%, 40%);">-                          encryptionInformation := tr_BSSMAP_IE_EncrInfo(key, alg),</span><br><span style="color: hsl(120, 100%, 40%);">+                             encryptionInformation := encryptionInformation,</span><br><span>                              cipherResponseMode := *,</span><br><span style="color: hsl(0, 100%, 40%);">-                                kC128 := *</span><br><span style="color: hsl(120, 100%, 40%);">+                            kC128 := kC128</span><br><span>                       }</span><br><span>            }</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+template PDU_BSSAP tr_BSSMAP_CipherModeCmd(template OCT1 alg, template OCT8 key, template BSSMAP_IE_KC128 kC128 := omit)</span><br><span style="color: hsl(120, 100%, 40%);">+ := tr_BSSMAP_CipherModeCmd2(tr_BSSMAP_IE_EncrInfo(key, alg), kC128);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> template PDU_BSSAP ts_BSSMAP_CipherModeCompl(OCT1 alg)</span><br><span> modifies ts_BSSAP_BSSMAP := {</span><br><span>     pdu := {</span><br><span>diff --git a/msc/BSC_ConnectionHandler.ttcn b/msc/BSC_ConnectionHandler.ttcn</span><br><span>index 01db3d0..be72399 100644</span><br><span>--- a/msc/BSC_ConnectionHandler.ttcn</span><br><span>+++ b/msc/BSC_ConnectionHandler.ttcn</span><br><span>@@ -560,44 +560,62 @@</span><br><span>        return res;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+function f_get_expected_encryption(</span><br><span style="color: hsl(120, 100%, 40%);">+     out template BSSMAP_IE_EncryptionInformation encryptionInformation,</span><br><span style="color: hsl(120, 100%, 40%);">+   out template BSSMAP_IE_ChosenEncryptionAlgorithm chosenEncryptionAlgorithm,</span><br><span style="color: hsl(120, 100%, 40%);">+   out template BSSMAP_IE_KC128 kC128,</span><br><span style="color: hsl(120, 100%, 40%);">+   out OCT1 a5_perm_alg)</span><br><span style="color: hsl(120, 100%, 40%);">+     runs on BSC_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   var OCT1 a5_ms := f_alg_mask_from_cm(g_pars.cm2, g_pars.cm3);</span><br><span style="color: hsl(120, 100%, 40%);">+ a5_perm_alg := g_pars.net.kc_support and4b a5_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (not g_pars.net.expect_ciph) {</span><br><span style="color: hsl(120, 100%, 40%);">+             encryptionInformation := *;</span><br><span style="color: hsl(120, 100%, 40%);">+           chosenEncryptionAlgorithm := *;</span><br><span style="color: hsl(120, 100%, 40%);">+               kC128 := *;</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%);">+   encryptionInformation := tr_BSSMAP_IE_EncrInfo(g_pars.vec.kc, a5_perm_alg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var OCT1 chosen_alg := int2oct(f_alg_from_mask(f_best_alg_from_mask(a5_perm_alg)) + 1, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+    chosenEncryptionAlgorithm := tr_BSSMAP_IE_ChosenEncryptionAlgorithm(chosen_alg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (g_pars.use_umts_aka and f_alg_supported_by_mask(a5_perm_alg, 4)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                /* A5/4 is permitted, expecting kc128 to be present */</span><br><span style="color: hsl(120, 100%, 40%);">+                var OCT32 full_sha256 := f_calculate_HMAC_SHA256(g_pars.vec.ck & g_pars.vec.ik, '32'O, 32);</span><br><span style="color: hsl(120, 100%, 40%);">+               var OCT16 expect_kc128 := substr(full_sha256, 0, 16);</span><br><span style="color: hsl(120, 100%, 40%);">+         kC128 := tr_BSSMAP_IE_Kc128(expect_kc128);</span><br><span style="color: hsl(120, 100%, 40%);">+    } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              kC128 := omit</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> </span><br><span> function f_mm_common() runs on BSC_ConnHdlr</span><br><span> {</span><br><span>       f_mm_auth();</span><br><span>         if (g_pars.ran_is_geran) {</span><br><span>           if (g_pars.net.expect_ciph) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   var OCT1 a5_net := f_alg_mask_from_cm(g_pars.cm2, g_pars.cm3);</span><br><span style="color: hsl(0, 100%, 40%);">-                  var OCT1 a5_intersect := g_pars.net.kc_support and4b a5_net;</span><br><span style="color: hsl(0, 100%, 40%);">-                    var boolean has_a54 := f_alg_supported_by_mask(a5_intersect, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+                      var template BSSMAP_IE_EncryptionInformation encryptionInformation;</span><br><span style="color: hsl(120, 100%, 40%);">+                   var template BSSMAP_IE_ChosenEncryptionAlgorithm chosenEncryptionAlgorithm;</span><br><span style="color: hsl(120, 100%, 40%);">+                   var template BSSMAP_IE_KC128 kC128;</span><br><span style="color: hsl(120, 100%, 40%);">+                   var OCT1 a5_perm_alg;</span><br><span style="color: hsl(120, 100%, 40%);">+                 f_get_expected_encryption(encryptionInformation, chosenEncryptionAlgorithm, kC128, a5_perm_alg);</span><br><span> </span><br><span>                         var PDU_BSSAP pdu;</span><br><span style="color: hsl(120, 100%, 40%);">+                    var template PDU_BSSAP expect_ciph_mode_cmd := tr_BSSMAP_CipherModeCmd2(encryptionInformation, kC128);</span><br><span>                       alt {</span><br><span style="color: hsl(0, 100%, 40%);">-                           [] BSSAP.receive(tr_BSSMAP_CipherModeCmd(a5_intersect, g_pars.vec.kc)) -> value pdu {</span><br><span style="color: hsl(0, 100%, 40%);">-                                var PDU_BSSMAP_CipherModeCommand ciphmodcmd := pdu.pdu.bssmap.cipherModeCommand;</span><br><span style="color: hsl(0, 100%, 40%);">-                                if (g_pars.use_umts_aka and has_a54) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                  var OCT32 fulloutput := f_calculate_HMAC_SHA256(g_pars.vec.ck & g_pars.vec.ik, '32'O, 32);</span><br><span style="color: hsl(0, 100%, 40%);">-                                  var OCT16 kc128 := substr(fulloutput, 0, 16);</span><br><span style="color: hsl(0, 100%, 40%);">-                                   if (not ispresent(ciphmodcmd.kC128)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                          setverdict(fail, "kc128 missing in CiphModCmd");</span><br><span style="color: hsl(0, 100%, 40%);">-                                              mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-                                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                                       if (ciphmodcmd.kC128.kC128_Value != kc128) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                            setverdict(fail, "kc128 wrong in CiphModCmd?!", kc128);</span><br><span style="color: hsl(0, 100%, 40%);">-                                               mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-                                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                               } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                        if (ispresent(ciphmodcmd.kC128)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                              setverdict(fail, "kc128 present in CiphModCmd, but should not exist!");</span><br><span style="color: hsl(0, 100%, 40%);">-                                               mtc.stop;</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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                               var OCT1 a5_chosen := f_best_alg_from_mask(a5_intersect);</span><br><span style="color: hsl(120, 100%, 40%);">+                     [] BSSAP.receive(expect_ciph_mode_cmd) -> value pdu {</span><br><span style="color: hsl(120, 100%, 40%);">+                              var OCT1 a5_chosen := f_best_alg_from_mask(a5_perm_alg);</span><br><span>                             var integer a5_nr := f_alg_from_mask(a5_chosen);</span><br><span>                             BSSAP.send(ts_BSSMAP_CipherModeCompl(int2oct(a5_nr+1, 1)));</span><br><span>                          }</span><br><span style="color: hsl(0, 100%, 40%);">-                       [] BSSAP.receive(tr_BSSMAP_CipherModeCmd(?, g_pars.vec.kc)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           setverdict(fail, "Wrong ciphering algorithm mask in CiphModCmd");</span><br><span style="color: hsl(120, 100%, 40%);">+                   [] BSSAP.receive(tr_BSSMAP_CipherModeCmd2) -> value pdu {</span><br><span style="color: hsl(120, 100%, 40%);">+                          log("Error: Ciphering Mode Command with unexpected content. Expected: ",</span><br><span style="color: hsl(120, 100%, 40%);">+                                expect_ciph_mode_cmd, "  got: ", pdu);</span><br><span style="color: hsl(120, 100%, 40%);">+                          setverdict(fail, "Ciphering Mode Command with unexpected content.");</span><br><span>                               mtc.stop;</span><br><span>                            }</span><br><span>                    [] BSSAP.receive(tr_BSSMAP_ClassmarkRequest) {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/24758">change 24758</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/+/24758"/><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: I1f775889fb801d441ea6c8b0f0c34718b814c09e </div>
<div style="display:none"> Gerrit-Change-Number: 24758 </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>