aboutsummaryrefslogtreecommitdiffstats
path: root/src/db_auc.c
diff options
context:
space:
mode:
authorNeels Hofmeyr <nhofmeyr@sysmocom.de>2017-03-15 00:07:43 +0100
committerNeels Hofmeyr <nhofmeyr@sysmocom.de>2017-03-16 05:51:11 +0100
commitcab2fcd5b5a7276fc9a89e449e9d3ede11790711 (patch)
tree3ac8a5510a7db3bfcc13501ac2ad9d44b467fd1f /src/db_auc.c
parentee392bb3b1fdfd45e8b4401622e0ee6cc66f9695 (diff)
UMTS AKA: implement SQN increment according to SEQ and IND
Add ind_bitlen column to auc_3g to record each USIM's IND size according to 3GPP TS 33.102 -- default is 5 bits, as suggested by the spec. Introduce auc_3g_ind to each connecting GSUP client to use as IND index for generating auth tuples sent to this client. With osmo_gsup_server_add_conn(), implement a scheme where clients receive fixed auc_3g_ind indexes based on the order in which they connect; each new connection takes the lowest unused auc_3g_ind, so in case one of the clients restarts, it will most likely receive the same auc_3g_ind, and if one client disconnects, no other clients' auc_3g_ind are affected. Add gsup_server_test.c to test the auc_3g_ind index distribution scheme. Depends: libosmocore I4eac5be0c0b2cede04464c4c3a0873102d952453 for llist_first Related: OS#1969 Change-Id: If4501ed4ff8e923fa6fe8b80c44c5ad647a8ed60
Diffstat (limited to 'src/db_auc.c')
-rw-r--r--src/db_auc.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/db_auc.c b/src/db_auc.c
index ac81404..8a369b5 100644
--- a/src/db_auc.c
+++ b/src/db_auc.c
@@ -159,6 +159,7 @@ int db_get_auth_data(struct db_context *dbc, const char *imsi,
aud3g->u.umts.opc_is_op = 1;
}
aud3g->u.umts.sqn = sqlite3_column_int64(stmt, 7);
+ aud3g->u.umts.ind_bitlen = sqlite3_column_int(stmt, 8);
/* FIXME: amf? */
aud3g->type = OSMO_AUTH_TYPE_UMTS;
} else
@@ -186,8 +187,9 @@ out:
/* return -1 in case of error, 0 for unknown imsi, positive for number
* of vectors generated */
int db_get_auc(struct db_context *dbc, const char *imsi,
- struct osmo_auth_vector *vec, unsigned int num_vec,
- const uint8_t *rand_auts, const uint8_t *auts)
+ unsigned int auc_3g_ind, struct osmo_auth_vector *vec,
+ unsigned int num_vec, const uint8_t *rand_auts,
+ const uint8_t *auts)
{
struct osmo_sub_auth_data aud2g, aud3g;
uint64_t subscr_id;
@@ -198,6 +200,16 @@ int db_get_auc(struct db_context *dbc, const char *imsi,
if (rc <= 0)
return rc;
+ aud3g.u.umts.ind = auc_3g_ind;
+ if (aud3g.type == OSMO_AUTH_TYPE_UMTS
+ && aud3g.u.umts.ind >= (1U << aud3g.u.umts.ind_bitlen)) {
+ LOGAUC(imsi, LOGL_NOTICE, "3G auth: SQN's IND bitlen %u is"
+ " too small to hold an index of %u. Truncating. This"
+ " may cause numerous additional AUTS resyncing.\n",
+ aud3g.u.umts.ind_bitlen, aud3g.u.umts.ind);
+ aud3g.u.umts.ind &= (1U << aud3g.u.umts.ind_bitlen) - 1;
+ }
+
LOGAUC(imsi, LOGL_DEBUG, "Calling to generate %u vectors\n", num_vec);
rc = auc_compute_vectors(vec, num_vec, &aud2g, &aud3g, rand_auts, auts);
if (rc < 0) {