aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/tests/sgsn
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2014-12-08 15:26:47 +0100
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2014-12-10 12:45:22 +0100
commit2e5e94c3283fa4f5160962f42e7cd5d4e39b7d1e (patch)
treebd2e4951b0e688162b08147f96c0bc6090e6078c /openbsc/tests/sgsn
parent4adb136da63a1d3ed523ad85e12fd99fc62f5701 (diff)
sgsn: Support subscriber based authentication
This commit mainly extends sgsn_auth.c to use and support the auth_state SGSN_AUTH_AUTHENTICATE. It will be activated when IMSI and IMEI are available, authentication is required (subscr->sgsn_data->authenticate is set), but the MM context is not marked as authenticated. If the state has been set to SGSN_AUTH_AUTHENTICATE and sgsn_auth_update() is called, the GMM layer will be informed by invoking gsm0408_gprs_authenticate(). Sponsored-by: On-Waves ehf
Diffstat (limited to 'openbsc/tests/sgsn')
-rw-r--r--openbsc/tests/sgsn/sgsn_test.c55
-rw-r--r--openbsc/tests/sgsn/sgsn_test.ok1
2 files changed, 56 insertions, 0 deletions
diff --git a/openbsc/tests/sgsn/sgsn_test.c b/openbsc/tests/sgsn/sgsn_test.c
index 26d81a7f1..f5f68206b 100644
--- a/openbsc/tests/sgsn/sgsn_test.c
+++ b/openbsc/tests/sgsn/sgsn_test.c
@@ -591,6 +591,60 @@ static void test_gmm_attach_subscr(void)
subscr_request_update_cb = __real_gprs_subscr_request_update;
}
+int my_subscr_request_update_fake_auth(struct sgsn_mm_ctx *mmctx) {
+ int rc;
+ rc = __real_gprs_subscr_request_update(mmctx);
+ if (rc == -ENOTSUP) {
+ struct gsm_subscriber *subscr;
+ int old_sgsn_tx_counter = sgsn_tx_counter;
+
+ OSMO_ASSERT(mmctx->subscr);
+ /* Prevent subscr from being deleted */
+ subscr = subscr_get(mmctx->subscr);
+
+ /* Start authentication procedure */
+ gprs_subscr_update(subscr);
+
+ /* This will cause a GPRS AUTH AND CIPHERING REQ (cksn broken) */
+ OSMO_ASSERT(old_sgsn_tx_counter == sgsn_tx_counter - 1);
+
+ /* Restore sgsn_tx_counter to keep test_gmm_attach happy */
+ sgsn_tx_counter = old_sgsn_tx_counter;
+
+ /* Fake an authentication */
+ OSMO_ASSERT(subscr->sgsn_data->mm);
+ subscr->sgsn_data->mm->is_authenticated = 1;
+ gprs_subscr_update(subscr);
+
+ subscr_put(subscr);
+ }
+ return rc;
+};
+
+static void test_gmm_attach_subscr_fake_auth(void)
+{
+ const enum sgsn_auth_policy saved_auth_policy = sgsn->cfg.auth_policy;
+ struct gsm_subscriber *subscr;
+
+ sgsn_inst.cfg.auth_policy = SGSN_AUTH_POLICY_REMOTE;
+ subscr_request_update_cb = my_subscr_request_update_fake_auth;
+
+ subscr = gprs_subscr_get_or_create("123456789012345");
+ subscr->authorized = 1;
+ subscr->sgsn_data->authenticate = 1;
+ subscr_put(subscr);
+
+ printf("Auth policy 'remote', auth faked: ");
+ test_gmm_attach();
+
+ subscr = gprs_subscr_get_by_imsi("123456789012345");
+ OSMO_ASSERT(subscr != NULL);
+ gprs_subscr_delete(subscr);
+
+ sgsn->cfg.auth_policy = saved_auth_policy;
+ subscr_request_update_cb = __real_gprs_subscr_request_update;
+}
+
/*
* Test the GMM Rejects
*/
@@ -1112,6 +1166,7 @@ int main(int argc, char **argv)
test_gmm_status_no_mmctx();
test_gmm_attach_acl();
test_gmm_attach_subscr();
+ test_gmm_attach_subscr_fake_auth();
test_gmm_reject();
test_gmm_cancel();
test_gmm_ptmsi_allocation();
diff --git a/openbsc/tests/sgsn/sgsn_test.ok b/openbsc/tests/sgsn/sgsn_test.ok
index 4b061a5f9..7d739add4 100644
--- a/openbsc/tests/sgsn/sgsn_test.ok
+++ b/openbsc/tests/sgsn/sgsn_test.ok
@@ -7,6 +7,7 @@ Testing GMM detach accept (unexpected)
Testing GMM Status (no MMCTX)
Auth policy 'closed': Testing GMM attach
Auth policy 'remote': Testing GMM attach
+Auth policy 'remote', auth faked: Testing GMM attach
Testing GMM reject
- Attach Request (invalid MI length)
- Attach Request (invalid MI type)