From 7ca035decaaed460e66286868b1f14ccd3e00013 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Mon, 25 Apr 2016 15:36:08 +0200 Subject: gsup_messages: Add UMTS AKA related encoding/decoding support --- openbsc/include/openbsc/osmo_gsup_messages.h | 7 +++++ openbsc/src/gprs/osmo_gsup_messages.c | 46 ++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) (limited to 'openbsc') diff --git a/openbsc/include/openbsc/osmo_gsup_messages.h b/openbsc/include/openbsc/osmo_gsup_messages.h index bdc46aaee..4ccc029fc 100644 --- a/openbsc/include/openbsc/osmo_gsup_messages.h +++ b/openbsc/include/openbsc/osmo_gsup_messages.h @@ -51,6 +51,12 @@ enum osmo_gsup_iei { OSMO_GSUP_RAND_IE = 0x20, OSMO_GSUP_SRES_IE = 0x21, OSMO_GSUP_KC_IE = 0x22, + /* 3G support */ + OSMO_GSUP_IK_IE = 0x23, + OSMO_GSUP_CK_IE = 0x24, + OSMO_GSUP_AUTN_IE = 0x25, + OSMO_GSUP_AUTS_IE = 0x26, + OSMO_GSUP_RES_IE = 0x27, }; enum osmo_gsup_message_type { @@ -113,6 +119,7 @@ struct osmo_gsup_message { size_t msisdn_enc_len; const uint8_t *hlr_enc; size_t hlr_enc_len; + const uint8_t *auts; }; int osmo_gsup_decode(const uint8_t *data, size_t data_len, diff --git a/openbsc/src/gprs/osmo_gsup_messages.c b/openbsc/src/gprs/osmo_gsup_messages.c index 773588b63..e820b5a17 100644 --- a/openbsc/src/gprs/osmo_gsup_messages.c +++ b/openbsc/src/gprs/osmo_gsup_messages.c @@ -90,6 +90,7 @@ static int decode_auth_info(uint8_t *data, size_t data_len, uint8_t *value; size_t value_len; enum osmo_gsup_iei iei; + uint8_t presence = 0; /* specific parts */ while (data_len > 0) { @@ -105,6 +106,7 @@ static int decode_auth_info(uint8_t *data, size_t data_len, goto parse_error; memcpy(auth_vector->rand, value, value_len); + presence |= (1 << 0); break; case OSMO_GSUP_SRES_IE: @@ -112,6 +114,7 @@ static int decode_auth_info(uint8_t *data, size_t data_len, goto parse_error; memcpy(auth_vector->sres, value, value_len); + presence |= (1 << 1); break; case OSMO_GSUP_KC_IE: @@ -119,6 +122,35 @@ static int decode_auth_info(uint8_t *data, size_t data_len, goto parse_error; memcpy(auth_vector->kc, value, value_len); + presence |= (1 << 2); + break; + + case OSMO_GSUP_IK_IE: + if (value_len != sizeof(auth_vector->ik)) + goto parse_error; + memcpy(auth_vector->ik, value, value_len); + presence |= (1 << 4); + break; + + case OSMO_GSUP_CK_IE: + if (value_len != sizeof(auth_vector->ck)) + goto parse_error; + memcpy(auth_vector->ck, value, value_len); + presence |= (1 << 5); + break; + + case OSMO_GSUP_AUTN_IE: + if (value_len != sizeof(auth_vector->autn)) + goto parse_error; + memcpy(auth_vector->autn, value, value_len); + presence |= (1 << 6); + break; + case OSMO_GSUP_RES_IE: + if (value_len > sizeof(auth_vector->res)) + goto parse_error; + memcpy(auth_vector->res, value, value_len); + auth_vector->res_len = value_len; + presence |= (1 << 7); break; default: @@ -128,6 +160,11 @@ static int decode_auth_info(uint8_t *data, size_t data_len, } } + if (presence & 0x07) + auth_vector->auth_types |= OSMO_AUTH_TYPE_GSM; + if (presence & 0xf0) + auth_vector->auth_types |= OSMO_AUTH_TYPE_UMTS; + return 0; parse_error: @@ -270,6 +307,15 @@ int osmo_gsup_decode(const uint8_t *const_data, size_t data_len, auth_info; break; + case OSMO_GSUP_AUTS_IE: + if (value_len != 16) { + LOGP(DGPRS, LOGL_ERROR, + "AUTS length != 16 received\n"); + return -GMM_CAUSE_COND_IE_ERR; + } + gsup_msg->auts = value; + break; + case OSMO_GSUP_MSISDN_IE: gsup_msg->msisdn_enc = value; gsup_msg->msisdn_enc_len = value_len; -- cgit v1.2.3