Beispiel #1
0
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");
  }
}