Add MM Auth test; add auth_action_str() function

Add basic MM Authentication test setup, with fake DB access and RAND_bytes().

So far implement simple tests for IO error during DB access and missing auth
entry.

To print the auth action during tests, add struct auth_action_names and
auth_action_str() inline function in auth.[hc].
changes/88/3188/1
Neels Hofmeyr 7 years ago committed by Harald Welte
parent 56ea30ff3f
commit 37984bdb1b
  1. 1
      openbsc/.gitignore
  2. 1
      openbsc/configure.ac
  3. 8
      openbsc/include/openbsc/auth.h
  4. 9
      openbsc/src/libmsc/auth.c
  5. 2
      openbsc/tests/Makefile.am
  6. 21
      openbsc/tests/mm_auth/Makefile.am
  7. 119
      openbsc/tests/mm_auth/mm_auth_test.c
  8. 8
      openbsc/tests/mm_auth/mm_auth_test.ok
  9. 7
      openbsc/tests/testsuite.at

@ -80,6 +80,7 @@ tests/sgsn/sgsn_test
tests/subscr/subscr_test
tests/oap/oap_test
tests/gtphub/gtphub_test
tests/mm_auth/mm_auth_test
tests/atconfig
tests/atlocal

@ -216,6 +216,7 @@ AC_OUTPUT(
tests/subscr/Makefile
tests/oap/Makefile
tests/gtphub/Makefile
tests/mm_auth/Makefile
doc/Makefile
doc/examples/Makefile
Makefile)

@ -1,6 +1,8 @@
#ifndef _AUTH_H
#define _AUTH_H
#include <osmocom/core/utils.h>
struct gsm_auth_tuple;
struct gsm_subscriber;
@ -11,6 +13,12 @@ enum auth_action {
AUTH_DO_AUTH = 3, /* Only authentication, no ciphering */
};
extern const struct value_string auth_action_names[];
static inline const char *auth_action_str(enum auth_action a)
{
return get_value_string(auth_action_names, a);
}
int auth_get_tuple_for_subscr(struct gsm_auth_tuple *atuple,
struct gsm_subscriber *subscr, int key_seq);

@ -31,6 +31,15 @@
#include <stdlib.h>
const struct value_string auth_action_names[] = {
#define AUTH_ACTION_STR(X) { X, #X }
{ -1, "(internal error)" }, /* soon to be fixed with an enum val */
AUTH_ACTION_STR(AUTH_NOT_AVAIL),
AUTH_ACTION_STR(AUTH_DO_AUTH_THEN_CIPH),
AUTH_ACTION_STR(AUTH_DO_CIPH),
AUTH_ACTION_STR(AUTH_DO_AUTH),
#undef AUTH_ACTION_STR
};
static int
_use_xor(struct gsm_auth_info *ainfo, struct gsm_auth_tuple *atuple)

@ -1,4 +1,4 @@
SUBDIRS = gsm0408 db channel mgcp gprs abis gbproxy trau subscr
SUBDIRS = gsm0408 db channel mgcp gprs abis gbproxy trau subscr mm_auth
if BUILD_NAT
SUBDIRS += bsc-nat bsc-nat-trie

@ -0,0 +1,21 @@
AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include
AM_CFLAGS=-Wall \
$(LIBOSMOCORE_CFLAGS) \
$(LIBOSMOGSM_CFLAGS) \
$(LIBCRYPTO_CFLAGS)
noinst_PROGRAMS = mm_auth_test
EXTRA_DIST = mm_auth_test.ok
mm_auth_test_SOURCES = mm_auth_test.c
mm_auth_test_LDFLAGS = \
-Wl,--wrap=db_get_authinfo_for_subscr \
-Wl,--wrap=db_get_lastauthtuple_for_subscr \
-Wl,--wrap=db_sync_lastauthtuple_for_subscr
mm_auth_test_LDADD = $(top_builddir)/src/libmsc/libmsc.a \
$(top_builddir)/src/libcommon/libcommon.a \
$(LIBOSMOCORE_LIBS) \
$(LIBOSMOGSM_LIBS)

@ -0,0 +1,119 @@
#include <stdbool.h>
#include <osmocom/core/application.h>
#include <osmocom/core/logging.h>
#include <openbsc/debug.h>
#include <openbsc/gsm_data.h>
#include <openbsc/gsm_subscriber.h>
#include <openbsc/auth.h>
/* override, requires '-Wl,--wrap=db_get_authinfo_for_subscr' */
int __real_db_get_authinfo_for_subscr(struct gsm_auth_info *ainfo,
struct gsm_subscriber *subscr);
int test_get_authinfo_rc = 0;
struct gsm_auth_info test_auth_info = {0};
struct gsm_auth_info default_auth_info = {
.auth_algo = AUTH_ALGO_COMP128v1,
.a3a8_ki_len = 16,
.a3a8_ki = { 0 }
};
int __wrap_db_get_authinfo_for_subscr(struct gsm_auth_info *ainfo,
struct gsm_subscriber *subscr)
{
*ainfo = test_auth_info;
printf("wrapped: db_get_authinfo_for_subscr(): rc = %d\n", test_get_authinfo_rc);
return test_get_authinfo_rc;
}
/* override, requires '-Wl,--wrap=db_get_lastauthtuple_for_subscr' */
int __real_db_get_lastauthtuple_for_subscr(struct gsm_auth_tuple *atuple,
struct gsm_subscriber *subscr);
int test_get_lastauthtuple_rc = 0;
struct gsm_auth_tuple test_last_auth_tuple = { 0 };
struct gsm_auth_tuple default_auth_tuple = { 0 };
int __wrap_db_get_lastauthtuple_for_subscr(struct gsm_auth_tuple *atuple,
struct gsm_subscriber *subscr)
{
*atuple = test_last_auth_tuple;
printf("wrapped: db_get_lastauthtuple_for_subscr(): rc = %d\n", test_get_lastauthtuple_rc);
return test_get_lastauthtuple_rc;
}
/* override, requires '-Wl,--wrap=db_sync_lastauthtuple_for_subscr' */
int __real_db_sync_lastauthtuple_for_subscr(struct gsm_auth_tuple *atuple,
struct gsm_subscriber *subscr);
int test_sync_lastauthtuple_rc = 0;
int __wrap_db_sync_lastauthtuple_for_subscr(struct gsm_auth_tuple *atuple,
struct gsm_subscriber *subscr)
{
test_last_auth_tuple = *atuple;
printf("wrapped: db_sync_lastauthtuple_for_subscr(): rc = %d\n", test_sync_lastauthtuple_rc);
return test_sync_lastauthtuple_rc;
}
int auth_get_tuple_for_subscr_verbose(struct gsm_auth_tuple *atuple,
struct gsm_subscriber *subscr,
int key_seq)
{
int auth_action;
auth_action = auth_get_tuple_for_subscr(atuple, subscr, key_seq);
printf("auth_get_tuple_for_subscr(key_seq=%d) --> auth_action == %s\n",
key_seq, auth_action_str(auth_action));
return auth_action;
}
/* override libssl RAND_bytes() to get testable crypto results */
int RAND_bytes(uint8_t *rand, int len)
{
memset(rand, 23, len);
return 1;
}
static void test_error()
{
int auth_action;
struct gsm_auth_tuple atuple = {0};
struct gsm_subscriber subscr = {0};
int key_seq = 0;
printf("\n* test_error()\n");
/* any error (except -ENOENT) */
test_get_authinfo_rc = -EIO;
auth_action = auth_get_tuple_for_subscr_verbose(&atuple, &subscr,
key_seq);
OSMO_ASSERT(auth_action == -1);
}
static void test_auth_not_avail()
{
int auth_action;
struct gsm_auth_tuple atuple = {0};
struct gsm_subscriber subscr = {0};
int key_seq = 0;
printf("\n* test_auth_not_avail()\n");
/* no entry */
test_get_authinfo_rc = -ENOENT;
auth_action = auth_get_tuple_for_subscr_verbose(&atuple, &subscr,
key_seq);
OSMO_ASSERT(auth_action == AUTH_NOT_AVAIL);
}
int main(void)
{
osmo_init_logging(&log_info);
log_set_log_level(osmo_stderr_target, LOGL_INFO);
test_error();
test_auth_not_avail();
return 0;
}

@ -0,0 +1,8 @@
* test_error()
wrapped: db_get_authinfo_for_subscr(): rc = -5
auth_get_tuple_for_subscr(key_seq=0) --> auth_action == (internal error)
* test_auth_not_avail()
wrapped: db_get_authinfo_for_subscr(): rc = -2
auth_get_tuple_for_subscr(key_seq=0) --> auth_action == AUTH_NOT_AVAIL

@ -117,3 +117,10 @@ AT_CHECK([test "$enable_gtphub_test" != no || exit 77])
cat $abs_srcdir/gtphub/gtphub_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/gtphub/gtphub_test], [], [expout], [ignore])
AT_CLEANUP
AT_SETUP([mm_auth])
AT_KEYWORDS([mm_auth])
cat $abs_srcdir/mm_auth/mm_auth_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/mm_auth/mm_auth_test], [], [expout], [ignore])
AT_CLEANUP

Loading…
Cancel
Save