From b4a8badc45a05283944859e2822a202197eed1c4 Mon Sep 17 00:00:00 2001 From: Tim Ehlers Date: Tue, 14 Feb 2012 23:54:25 +0100 Subject: mobile: Add vty option to force rekeying for every new channel Written-by: Tim Ehlers Signed-off-by: Sylvain Munaut --- .../layer23/include/osmocom/bb/mobile/settings.h | 1 + .../layer23/include/osmocom/bb/mobile/subscriber.h | 1 + src/host/layer23/src/mobile/gsm48_mm.c | 4 ++-- src/host/layer23/src/mobile/gsm48_rr.c | 2 +- src/host/layer23/src/mobile/subscriber.c | 8 +++++++ src/host/layer23/src/mobile/vty_interface.c | 27 ++++++++++++++++++++++ 6 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/host/layer23/include/osmocom/bb/mobile/settings.h b/src/host/layer23/include/osmocom/bb/mobile/settings.h index e09d9084..6d446967 100644 --- a/src/host/layer23/include/osmocom/bb/mobile/settings.h +++ b/src/host/layer23/include/osmocom/bb/mobile/settings.h @@ -87,6 +87,7 @@ struct gsm_settings { /* radio */ uint16_t dsc_max; + uint8_t force_rekey; /* dialing */ struct llist_head abbrev; diff --git a/src/host/layer23/include/osmocom/bb/mobile/subscriber.h b/src/host/layer23/include/osmocom/bb/mobile/subscriber.h index 50c305a8..3e50e29d 100644 --- a/src/host/layer23/include/osmocom/bb/mobile/subscriber.h +++ b/src/host/layer23/include/osmocom/bb/mobile/subscriber.h @@ -105,6 +105,7 @@ int gsm_subscr_dump_forbidden_plmn(struct osmocom_ms *ms, void gsm_subscr_dump(struct gsm_subscriber *subscr, void (*print)(void *, const char *, ...), void *priv); char *gsm_check_imsi(const char *imsi); +int gsm_subscr_get_key_seq(struct osmocom_ms *ms, struct gsm_subscriber *subscr); #endif /* _SUBSCRIBER_H */ diff --git a/src/host/layer23/src/mobile/gsm48_mm.c b/src/host/layer23/src/mobile/gsm48_mm.c index 76b9c261..a8f699d2 100644 --- a/src/host/layer23/src/mobile/gsm48_mm.c +++ b/src/host/layer23/src/mobile/gsm48_mm.c @@ -2344,7 +2344,7 @@ static int gsm48_mm_tx_loc_upd_req(struct osmocom_ms *ms) /* location updating type */ nlu->type = mm->lupd_type; /* cipering key */ - nlu->key_seq = subscr->key_seq; + nlu->key_seq = gsm_subscr_get_key_seq(ms, subscr); /* LAI (last SIM stored LAI) * * NOTE: The TMSI is only valid within a LAI! @@ -2806,7 +2806,7 @@ static int gsm48_mm_tx_cm_serv_req(struct osmocom_ms *ms, int rr_prim, /* type and key */ nsr->cm_service_type = cm_serv; - nsr->cipher_key_seq = subscr->key_seq; + nsr->cipher_key_seq = gsm_subscr_get_key_seq(ms, subscr); /* classmark 2 */ cm2lv[0] = sizeof(struct gsm48_classmark2); gsm48_rr_enc_cm2(ms, (struct gsm48_classmark2 *)(cm2lv + 1), diff --git a/src/host/layer23/src/mobile/gsm48_rr.c b/src/host/layer23/src/mobile/gsm48_rr.c index 5000d3ca..b6083afe 100644 --- a/src/host/layer23/src/mobile/gsm48_rr.c +++ b/src/host/layer23/src/mobile/gsm48_rr.c @@ -3251,7 +3251,7 @@ static int gsm48_rr_dl_est(struct osmocom_ms *ms) gh->msg_type = GSM48_MT_RR_PAG_RESP; pr = (struct gsm48_pag_rsp *) msgb_put(nmsg, sizeof(*pr)); /* key sequence */ - pr->key_seq = subscr->key_seq; + pr->key_seq = gsm_subscr_get_key_seq(ms, subscr); /* classmark 2 */ pr->cm2_len = sizeof(pr->cm2); gsm48_rr_enc_cm2(ms, &pr->cm2, rr->cd_now.arfcn); diff --git a/src/host/layer23/src/mobile/subscriber.c b/src/host/layer23/src/mobile/subscriber.c index b6dfc2f0..8ebb1738 100644 --- a/src/host/layer23/src/mobile/subscriber.c +++ b/src/host/layer23/src/mobile/subscriber.c @@ -1144,6 +1144,14 @@ int gsm_subscr_is_forbidden_plmn(struct gsm_subscriber *subscr, uint16_t mcc, return 0; } +int gsm_subscr_get_key_seq(struct osmocom_ms *ms, struct gsm_subscriber *subscr) +{ + if (ms->settings.force_rekey) + return 7; + else + return subscr->key_seq; +} + int gsm_subscr_dump_forbidden_plmn(struct osmocom_ms *ms, void (*print)(void *, const char *, ...), void *priv) { diff --git a/src/host/layer23/src/mobile/vty_interface.c b/src/host/layer23/src/mobile/vty_interface.c index ca1c5828..dc9e09d9 100644 --- a/src/host/layer23/src/mobile/vty_interface.c +++ b/src/host/layer23/src/mobile/vty_interface.c @@ -1300,6 +1300,9 @@ static void config_write_ms(struct vty *vty, struct osmocom_ms *ms) if (!hide_default || set->auto_answer) vty_out(vty, " %sauto-answer%s", (set->auto_answer) ? "" : "no ", VTY_NEWLINE); + if (!hide_default || set->force_rekey) + vty_out(vty, " %sforce-rekey%s", + (set->force_rekey) ? "" : "no ", VTY_NEWLINE); if (!hide_default || set->clip) vty_out(vty, " %sclip%s", (set->clip) ? "" : "no ", VTY_NEWLINE); @@ -1730,6 +1733,28 @@ DEFUN(cfg_auto_answer, cfg_ms_auto_answer_cmd, "auto-answer", return CMD_SUCCESS; } +DEFUN(cfg_no_force_rekey, cfg_ms_no_force_rekey_cmd, "no force-rekey", + NO_STR "Disable key renew forcing after every event") +{ + struct osmocom_ms *ms = vty->index; + struct gsm_settings *set = &ms->settings; + + set->force_rekey = 0; + + return CMD_SUCCESS; +} + +DEFUN(cfg_force_rekey, cfg_ms_force_rekey_cmd, "force-rekey", + "Enable key renew forcing after every event") +{ + struct osmocom_ms *ms = vty->index; + struct gsm_settings *set = &ms->settings; + + set->force_rekey = 1; + + return CMD_SUCCESS; +} + DEFUN(cfg_clip, cfg_ms_clip_cmd, "clip", "Force caller ID presentation") { @@ -2782,6 +2807,8 @@ int ms_vty_init(void) install_element(MS_NODE, &cfg_ms_no_cw_cmd); install_element(MS_NODE, &cfg_ms_auto_answer_cmd); install_element(MS_NODE, &cfg_ms_no_auto_answer_cmd); + install_element(MS_NODE, &cfg_ms_force_rekey_cmd); + install_element(MS_NODE, &cfg_ms_no_force_rekey_cmd); install_element(MS_NODE, &cfg_ms_clip_cmd); install_element(MS_NODE, &cfg_ms_clir_cmd); install_element(MS_NODE, &cfg_ms_no_clip_cmd); -- cgit v1.2.3