diff options
Diffstat (limited to 'src/shared/libosmocore/src/gsm')
-rw-r--r-- | src/shared/libosmocore/src/gsm/a5.c | 8 | ||||
-rw-r--r-- | src/shared/libosmocore/src/gsm/auth_milenage.c | 15 | ||||
-rw-r--r-- | src/shared/libosmocore/src/gsm/lapd_core.c | 3 | ||||
-rw-r--r-- | src/shared/libosmocore/src/gsm/milenage/milenage.c | 15 | ||||
-rw-r--r-- | src/shared/libosmocore/src/gsm/milenage/milenage.h | 2 |
5 files changed, 35 insertions, 8 deletions
diff --git a/src/shared/libosmocore/src/gsm/a5.c b/src/shared/libosmocore/src/gsm/a5.c index e330c759..34f271a8 100644 --- a/src/shared/libosmocore/src/gsm/a5.c +++ b/src/shared/libosmocore/src/gsm/a5.c @@ -89,10 +89,10 @@ osmo_a5(int n, const uint8_t *key, uint32_t fn, ubit_t *dl, ubit_t *ul) #define A5_R3_MASK ((1<<A5_R3_LEN)-1) #define A5_R4_MASK ((1<<A5_R4_LEN)-1) -#define A5_R1_TAPS 0x072000 /* x^19 + x^5 + x^2 + x + 1 */ -#define A5_R2_TAPS 0x300000 /* x^22 + x + 1 */ -#define A5_R3_TAPS 0x700080 /* x^23 + x^15 + x^2 + x + 1 */ -#define A5_R4_TAPS 0x010800 /* x^17 + x^5 + 1 */ +#define A5_R1_TAPS 0x072000 /* x^19 + x^18 + x^17 + x^14 + 1 */ +#define A5_R2_TAPS 0x300000 /* x^22 + x^21 + 1 */ +#define A5_R3_TAPS 0x700080 /* x^23 + x^22 + x^21 + x^8 + 1 */ +#define A5_R4_TAPS 0x010800 /* x^17 + x^12 + 1 */ /*! \brief Computes parity of a 32-bit word * \param[in] x 32 bit word diff --git a/src/shared/libosmocore/src/gsm/auth_milenage.c b/src/shared/libosmocore/src/gsm/auth_milenage.c index 2a9ba334..5b2787dd 100644 --- a/src/shared/libosmocore/src/gsm/auth_milenage.c +++ b/src/shared/libosmocore/src/gsm/auth_milenage.c @@ -83,10 +83,21 @@ static int milenage_gen_vec_auts(struct osmo_auth_vector *vec, const uint8_t *_rand) { uint8_t sqn_out[6]; + uint8_t gen_opc[16]; + uint8_t *opc; int rc; - rc = milenage_auts(aud->u.umts.opc, aud->u.umts.k, - rand_auts, auts, sqn_out); + /* Check if we only know OP and compute OPC if required */ + if (aud->type == OSMO_AUTH_TYPE_UMTS && aud->u.umts.opc_is_op) { + rc = milenage_opc_gen(gen_opc, aud->u.umts.k, + aud->u.umts.opc); + if (rc < 0) + return rc; + opc = gen_opc; + } else + opc = aud->u.umts.opc; + + rc = milenage_auts(opc, aud->u.umts.k, rand_auts, auts, sqn_out); if (rc < 0) return rc; diff --git a/src/shared/libosmocore/src/gsm/lapd_core.c b/src/shared/libosmocore/src/gsm/lapd_core.c index fb79a2f0..96099edb 100644 --- a/src/shared/libosmocore/src/gsm/lapd_core.c +++ b/src/shared/libosmocore/src/gsm/lapd_core.c @@ -707,7 +707,7 @@ static void lapd_acknowledge(struct lapd_msg_ctx *lctx) { struct lapd_datalink *dl = lctx->dl; uint8_t nr = lctx->n_recv; - int s = 0, rej = 0, t200_reset = 0, t200_start = 0; + int s = 0, rej = 0, t200_reset = 0; int i, h; /* supervisory frame ? */ @@ -758,7 +758,6 @@ static void lapd_acknowledge(struct lapd_msg_ctx *lctx) if (dl->tx_hist[sub_mod(dl->v_send, 1, dl->range_hist)].msg) { LOGP(DLLAPD, LOGL_INFO, "start T200, due to unacked I " "frame(s)\n"); - t200_start = 1; lapd_start_t200(dl); } } diff --git a/src/shared/libosmocore/src/gsm/milenage/milenage.c b/src/shared/libosmocore/src/gsm/milenage/milenage.c index cc4e95c5..b43f986a 100644 --- a/src/shared/libosmocore/src/gsm/milenage/milenage.c +++ b/src/shared/libosmocore/src/gsm/milenage/milenage.c @@ -327,3 +327,18 @@ int milenage_check(const u8 *opc, const u8 *k, const u8 *sqn, const u8 *_rand, return 0; } + +int milenage_opc_gen(u8 *opc, const u8 *k, const u8 *op) +{ + int i; + + /* Encrypt OP using K */ + if (aes_128_encrypt_block(k, op, opc)) + return -1; + + /* XOR the resulting Ek(OP) with OP */ + for (i = 0; i < 16; i++) + opc[i] = opc[i] ^ op[i]; + + return 0; +} diff --git a/src/shared/libosmocore/src/gsm/milenage/milenage.h b/src/shared/libosmocore/src/gsm/milenage/milenage.h index d5054d6d..a91e946a 100644 --- a/src/shared/libosmocore/src/gsm/milenage/milenage.h +++ b/src/shared/libosmocore/src/gsm/milenage/milenage.h @@ -30,4 +30,6 @@ int milenage_f1(const u8 *opc, const u8 *k, const u8 *_rand, int milenage_f2345(const u8 *opc, const u8 *k, const u8 *_rand, u8 *res, u8 *ck, u8 *ik, u8 *ak, u8 *akstar); +int milenage_opc_gen(u8 *opc, const u8 *k, const u8 *op); + #endif /* MILENAGE_H */ |