summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmocom/crypt/auth.h6
-rw-r--r--src/gsm/auth_core.c4
-rw-r--r--tests/auth/milenage_test.c5
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));
}
}