int generate_vector(uint64_t imsi, uint8_t key[16], uint8_t plmn[3], uint8_t sqn[6], auc_vector_t *vector) { /* in E-UTRAN an authentication vector is composed of: * - RAND * - XRES * - AUTN * - KASME */ uint8_t amf[] = { 0x80, 0x00 }; uint8_t mac_a[8]; uint8_t ck[16]; uint8_t ik[16]; uint8_t ak[6]; int i; if (vector == NULL) { return EINVAL; } /* Compute MAC */ f1(key, vector->rand, sqn, amf, mac_a); print_buffer("MAC_A : ", mac_a, 8); print_buffer("SQN : ", sqn, 6); print_buffer("RAND : ", vector->rand, 16); /* Compute XRES, CK, IK, AK */ f2345(key, vector->rand, vector->xres, ck, ik, ak); print_buffer("AK : ", ak, 6); print_buffer("CK : ", ck, 16); print_buffer("IK : ", ik, 16); print_buffer("XRES : ", vector->xres, 8); /* AUTN = SQN ^ AK || AMF || MAC */ generate_autn(sqn, ak, amf, mac_a, vector->autn); print_buffer("AUTN : ", vector->autn, 16); derive_kasme(ck, ik, plmn, sqn, ak, vector->kasme); print_buffer("KASME : ", vector->kasme, 32); return 0; }
static void do_derive_kasme ( uint8_t * sn_id, uint8_t * sqn, uint8_t * ak, uint8_t * ck, uint8_t * ik, uint8_t * kasme_exp) { uint8_t kasme[32]; derive_kasme (ck, ik, sn_id, sqn, ak, kasme); if (compare_buffer (kasme, 32, kasme_exp, 32) != 0) { fail ("Fail: derive_kasme\n"); } }