From 9fd87ecd11138efa8bdbb13c47659edaf106e2c3 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Tue, 22 Mar 2016 00:49:21 +0100 Subject: iu_tx_sec_mode_cmd(): add send_ck flag parameter In this way the caller can distinguish between sending an IK or an IK+CK Security Mode Command. --- openbsc/src/gprs/gprs_gmm.c | 2 +- openbsc/src/libiu/iu.c | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) (limited to 'openbsc/src') diff --git a/openbsc/src/gprs/gprs_gmm.c b/openbsc/src/gprs/gprs_gmm.c index ac8c0c410..630810aaa 100644 --- a/openbsc/src/gprs/gprs_gmm.c +++ b/openbsc/src/gprs/gprs_gmm.c @@ -755,7 +755,7 @@ static int gsm48_gmm_authorize(struct sgsn_mm_ctx *ctx) /* The MS is authorized */ if (ctx->ran_type == MM_CTX_T_UTRAN_Iu && !ctx->iu.integrity_active) { - return iu_tx_sec_mode_cmd(ctx->iu.ue_ctx, &ctx->auth_triplet); + return iu_tx_sec_mode_cmd(ctx->iu.ue_ctx, &ctx->auth_triplet, 0); } switch (ctx->pending_req) { diff --git a/openbsc/src/libiu/iu.c b/openbsc/src/libiu/iu.c index ed428a1af..56b6ec1d3 100644 --- a/openbsc/src/libiu/iu.c +++ b/openbsc/src/libiu/iu.c @@ -116,7 +116,8 @@ int iu_rab_deact(struct ue_conn_ctx *ue_ctx, uint8_t rab_id) return -1; } -int iu_tx_sec_mode_cmd(struct ue_conn_ctx *uectx, struct gsm_auth_tuple *tp) +int iu_tx_sec_mode_cmd(struct ue_conn_ctx *uectx, struct gsm_auth_tuple *tp, + int send_ck) { struct osmo_scu_prim *prim; struct msgb *msg; @@ -124,10 +125,6 @@ int iu_tx_sec_mode_cmd(struct ue_conn_ctx *uectx, struct gsm_auth_tuple *tp) uint8_t ck[16]; unsigned int i; - /* C4 function to dervie CK from Kc */ - memcpy(ck, tp->kc, 8); - memcpy(ck+8, tp->kc, 8); - /* C5 function to derive IK from Kc */ for (i = 0; i < 4; i++) ik[i] = tp->kc[i] ^ tp->kc[i+4]; @@ -135,8 +132,14 @@ int iu_tx_sec_mode_cmd(struct ue_conn_ctx *uectx, struct gsm_auth_tuple *tp) for (i = 12; i < 16; i++) ik[i] = ik[i-12]; + if (send_ck) { + /* C4 function to derive CK from Kc */ + memcpy(ck, tp->kc, 8); + memcpy(ck+8, tp->kc, 8); + } + /* crate RANAP message */ - msg = ranap_new_msg_sec_mod_cmd(ik, NULL); + msg = ranap_new_msg_sec_mod_cmd(ik, send_ck? ck : NULL); msg->l2h = msg->data; /* wrap RANAP message in SCCP N-DATA.req */ prim = (struct osmo_scu_prim *) msgb_push(msg, sizeof(*prim)); -- cgit v1.2.3