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