diff options
| -rw-r--r-- | include/osmocom/crypt/auth.h | 6 | ||||
| -rw-r--r-- | src/gsm/auth_core.c | 4 | ||||
| -rw-r--r-- | tests/auth/milenage_test.c | 5 | 
3 files changed, 9 insertions, 6 deletions
| diff --git a/include/osmocom/crypt/auth.h b/include/osmocom/crypt/auth.h index e544126b..c653b616 100644 --- a/include/osmocom/crypt/auth.h +++ b/include/osmocom/crypt/auth.h @@ -42,7 +42,7 @@ struct osmo_sub_auth_data {  	union {  		struct {  			uint8_t opc[16]; /*!< operator invariant value */ -			uint8_t k[16];	/*!< secret key of the subscriber */ +			uint8_t k[OSMO_A5_MAX_KEY_LEN_BYTES];	/*!< secret key of the subscriber */  			uint8_t amf[2];  			uint64_t sqn;	/*!< sequence number (in: prev sqn; out: used sqn) */  			int opc_is_op;	/*!< is the OPC field OPC (0) or OP (1) ? */ @@ -60,8 +60,8 @@ struct osmo_sub_auth_data {  struct osmo_auth_vector {  	uint8_t rand[16];	/*!< random challenge */  	uint8_t autn[16];	/*!< authentication nonce */ -	uint8_t ck[16];		/*!< ciphering key */ -	uint8_t ik[16];		/*!< integrity key */ +	uint8_t ck[OSMO_A5_MAX_KEY_LEN_BYTES];		/*!< ciphering key */ +	uint8_t ik[OSMO_A5_MAX_KEY_LEN_BYTES];		/*!< integrity key */  	uint8_t res[16];	/*!< authentication result */  	uint8_t res_len;	/*!< length (in bytes) of res */  	uint8_t kc[8];		/*!< Kc for GSM encryption (A5) */ diff --git a/src/gsm/auth_core.c b/src/gsm/auth_core.c index f171ed49..9e750a01 100644 --- a/src/gsm/auth_core.c +++ b/src/gsm/auth_core.c @@ -98,7 +98,7 @@ int osmo_auth_supported(enum osmo_auth_algo algo)  	return 0;  } -/* C5 function to derive UMTS IK from GSM Kc */ +/* 3GPP TS 33.102 §6.8.2.3 C5 function to derive UMTS IK from GSM Kc */  static inline void c5_function(uint8_t *ik, const uint8_t *kc)  {  	unsigned int i; @@ -110,7 +110,7 @@ static inline void c5_function(uint8_t *ik, const uint8_t *kc)  		ik[i] = ik[i-12];  } -/* C4 function to derive UMTS CK from GSM Kc */ +/* 3GPP TS 33.102 §6.8.2.3 C4 function to derive UMTS CK from GSM Kc */  void osmo_c4(uint8_t *ck, const uint8_t *kc)  {  	memcpy(ck, kc, 8); diff --git a/tests/auth/milenage_test.c b/tests/auth/milenage_test.c index 2bd3cf20..8b058e56 100644 --- a/tests/auth/milenage_test.c +++ b/tests/auth/milenage_test.c @@ -23,7 +23,10 @@ static void dump_auth_vec(struct osmo_auth_vector *vec)  	if (vec->auth_types & OSMO_AUTH_TYPE_GSM) {  		printf("SRES:\t%s\n", osmo_hexdump(vec->sres, sizeof(vec->sres))); -		printf("Kc:\t%s\n", osmo_hexdump(vec->kc, sizeof(vec->kc))); +		/* According to 3GPP TS 55.205 Sec. 4 the GSM-MILENAGE output is limited to 64 bits. +		   According to 3GPP TS 33.102 Annex. B5 in UMTS security context Kc can be 128 bits. +		   Here we test the former, so make sure we only print interesting Kc bits. */ +		printf("Kc:\t%s\n", osmo_hexdump(vec->kc, OSMO_A5_MAX_KEY_LEN_BYTES/2));  	}  } | 
