pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmocom-bb/+/32551 )
Change subject: layer23: modem: Resolve auth requests coming from GMM layer ......................................................................
layer23: modem: Resolve auth requests coming from GMM layer
Change-Id: I75dc3fe3e4d9e23443fb778e36ca024f1bc46641 --- M src/host/layer23/include/osmocom/bb/common/ms.h M src/host/layer23/include/osmocom/bb/modem/gmm.h M src/host/layer23/src/modem/app_modem.c M src/host/layer23/src/modem/gmm.c 4 files changed, 57 insertions(+), 1 deletion(-)
git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/51/32551/1
diff --git a/src/host/layer23/include/osmocom/bb/common/ms.h b/src/host/layer23/include/osmocom/bb/common/ms.h index e4888a7..d9c6255 100644 --- a/src/host/layer23/include/osmocom/bb/common/ms.h +++ b/src/host/layer23/include/osmocom/bb/common/ms.h @@ -20,6 +20,11 @@ #include <osmocom/bb/common/sim.h> #include <osmocom/bb/common/l1ctl.h>
+struct osmobb_ms_gmm_layer { + uint8_t ac_ref_nr; + uint8_t key_seq; + uint8_t rand[16]; +};
struct osmosap_entity { struct osmo_fsm_inst *fi; @@ -93,6 +98,7 @@
/* GPRS */ struct gprs_settings gprs; + struct osmobb_ms_gmm_layer gmmlayer;
/* Audio I/O */ struct gapk_io_state *gapk_io; diff --git a/src/host/layer23/include/osmocom/bb/modem/gmm.h b/src/host/layer23/include/osmocom/bb/modem/gmm.h index 6269c82..41e1e7e 100644 --- a/src/host/layer23/include/osmocom/bb/modem/gmm.h +++ b/src/host/layer23/include/osmocom/bb/modem/gmm.h @@ -1,6 +1,7 @@ #pragma once
#include <stdbool.h> +#include <stdint.h>
struct osmocom_ms;
@@ -8,3 +9,5 @@
int modem_gmm_gmmreg_attach_req(const struct osmocom_ms *ms); int modem_gmm_gmmreg_detach_req(const struct osmocom_ms *ms); +int modem_gmm_gmmreg_sim_auth_rsp(const struct osmocom_ms *ms, + uint8_t *sres, uint8_t *kc, uint8_t kc_len); diff --git a/src/host/layer23/src/modem/app_modem.c b/src/host/layer23/src/modem/app_modem.c index d80fe91..07211d0 100644 --- a/src/host/layer23/src/modem/app_modem.c +++ b/src/host/layer23/src/modem/app_modem.c @@ -135,7 +135,9 @@ case S_L23_SUBSCR_SIM_AUTH_RESP: sim_auth_resp = signal_data; ms = sim_auth_resp->ms; - /* TODO: pass sim_auth_resp->sres to GMM layer */ + modem_gmm_gmmreg_sim_auth_rsp(ms, sim_auth_resp->sres, + ms->subscr.key, + sizeof(ms->subscr.key)); break; default: OSMO_ASSERT(0); diff --git a/src/host/layer23/src/modem/gmm.c b/src/host/layer23/src/modem/gmm.c index 0ad3035..129c4ba 100644 --- a/src/host/layer23/src/modem/gmm.c +++ b/src/host/layer23/src/modem/gmm.c @@ -65,6 +65,22 @@ __func__, pdu_name, cause, get_value_string(gsm48_gmm_cause_names, cause)); } break; + case OSMO_PRIM(OSMO_GPRS_GMM_GMMREG_SIM_AUTH, PRIM_OP_INDICATION): + LOGP(DGMM, LOGL_NOTICE, "%s(): Rx %s ac_ref_nr=%u key_seq=%u rand=%s\n", + __func__, pdu_name, + gmm_prim->gmmreg.sim_auth_ind.ac_ref_nr, + gmm_prim->gmmreg.sim_auth_ind.key_seq, + osmo_hexdump(gmm_prim->gmmreg.sim_auth_ind.rand, + sizeof(gmm_prim->gmmreg.sim_auth_ind.rand))); + /* Cache request information, it'll be needed during response time: */ + ms->gmmlayer.ac_ref_nr = gmm_prim->gmmreg.sim_auth_ind.ac_ref_nr; + ms->gmmlayer.key_seq = gmm_prim->gmmreg.sim_auth_ind.key_seq; + memcpy(ms->gmmlayer.rand, gmm_prim->gmmreg.sim_auth_ind.rand, + sizeof(ms->gmmlayer.rand)); + /* Request SIM to authenticate. Wait for signal S_L23_SUBSCR_SIM_AUTH_RESP. */ + rc = gsm_subscr_generate_kc(ms, gmm_prim->gmmreg.sim_auth_ind.key_seq, + gmm_prim->gmmreg.sim_auth_ind.rand, false); + break; case OSMO_PRIM(OSMO_GPRS_GMM_GMMREG_DETACH, PRIM_OP_CONFIRM): case OSMO_PRIM(OSMO_GPRS_GMM_GMMREG_DETACH, PRIM_OP_INDICATION): default: @@ -185,3 +201,23 @@ LOGP(DMM, LOGL_ERROR, "Failed submitting GMMREG-DETACH.req\n"); return rc; } + +int modem_gmm_gmmreg_sim_auth_rsp(const struct osmocom_ms *ms, uint8_t *sres, uint8_t *kc, uint8_t kc_len) +{ + struct osmo_gprs_gmm_prim *gmm_prim; + int rc; + + gmm_prim = osmo_gprs_gmm_prim_alloc_gmmreg_sim_auth_rsp(); + gmm_prim->gmmreg.sim_auth_rsp.ac_ref_nr = ms->gmmlayer.ac_ref_nr; + gmm_prim->gmmreg.sim_auth_rsp.key_seq = ms->gmmlayer.key_seq; + memcpy(gmm_prim->gmmreg.sim_auth_rsp.rand, ms->gmmlayer.rand, + sizeof(gmm_prim->gmmreg.sim_auth_rsp.rand)); + memcpy(gmm_prim->gmmreg.sim_auth_rsp.sres, sres, + sizeof(gmm_prim->gmmreg.sim_auth_rsp.sres)); + memcpy(gmm_prim->gmmreg.sim_auth_rsp.kc, kc, + kc_len); + rc = osmo_gprs_gmm_prim_upper_down(gmm_prim); + if (rc < 0) + LOGP(DMM, LOGL_ERROR, "Failed submitting GMMREG-SIM_AUTH.rsp\n"); + return rc; +}