<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>