Harald Welte | c918e4e | 2019-07-12 18:53:55 +0800 | [diff] [blame] | 1 | #include <stdint.h> |
| 2 | #include <string.h> |
| 3 | #include <arpa/inet.h> |
| 4 | #include <gnutls/crypto.h> |
| 5 | |
| 6 | /* From nextepc/src/mme/mme-kdf.c under AGPLv3+ */ |
| 7 | |
| 8 | void mme_kdf_nas(uint8_t algorithm_type_distinguishers, |
| 9 | uint8_t algorithm_identity, const uint8_t *kasme, uint8_t *knas) |
| 10 | { |
| 11 | uint8_t s[7]; |
| 12 | uint8_t out[32]; |
| 13 | |
| 14 | s[0] = 0x15; /* FC Value */ |
| 15 | |
| 16 | s[1] = algorithm_type_distinguishers; |
| 17 | s[2] = 0x00; |
| 18 | s[3] = 0x01; |
| 19 | |
| 20 | s[4] = algorithm_identity; |
| 21 | s[5] = 0x00; |
| 22 | s[6] = 0x01; |
| 23 | |
| 24 | gnutls_hmac_fast(GNUTLS_MAC_SHA256, kasme, 32, s, 7, out); |
| 25 | memcpy(knas, out+16, 16); |
| 26 | } |
| 27 | |
| 28 | void mme_kdf_enb(const uint8_t *kasme, uint32_t ul_count, uint8_t *kenb) |
| 29 | { |
| 30 | uint8_t s[7]; |
| 31 | |
| 32 | s[0] = 0x11; /* FC Value */ |
| 33 | |
| 34 | ul_count = htonl(ul_count); |
| 35 | memcpy(s+1, &ul_count, 4); |
| 36 | |
| 37 | s[5] = 0x00; |
| 38 | s[6] = 0x04; |
| 39 | |
| 40 | gnutls_hmac_fast(GNUTLS_MAC_SHA256, kasme, 32, s, 7, kenb); |
| 41 | } |
| 42 | |
| 43 | void mme_kdf_nh(const uint8_t *kasme, const uint8_t *sync_input, uint8_t *kenb) |
| 44 | { |
| 45 | uint8_t s[35]; |
| 46 | |
| 47 | s[0] = 0x12; /* FC Value */ |
| 48 | |
| 49 | memcpy(s+1, sync_input, 32); |
| 50 | |
| 51 | s[33] = 0x00; |
| 52 | s[34] = 0x20; |
| 53 | |
| 54 | gnutls_hmac_fast(GNUTLS_MAC_SHA256, kasme, 32, s, 35, kenb); |
| 55 | } |
| 56 | |
| 57 | /* From nextepc/src/hss/hss-auc.c under AGPLv3+ */ |
| 58 | |
| 59 | #define FC_VALUE 0x10 |
| 60 | |
| 61 | void hss_auc_kasme(const uint8_t *ck, const uint8_t *ik, const uint8_t plmn_id[3], |
| 62 | const uint8_t *sqn, const uint8_t *ak, uint8_t *kasme) |
| 63 | { |
| 64 | uint8_t s[14]; |
| 65 | uint8_t k[32]; |
| 66 | int i; |
| 67 | |
| 68 | memcpy(&k[0], ck, 16); |
| 69 | memcpy(&k[16], ik, 16); |
| 70 | |
| 71 | s[0] = FC_VALUE; |
| 72 | memcpy(&s[1], plmn_id, 3); |
| 73 | s[4] = 0x00; |
| 74 | s[5] = 0x03; |
| 75 | |
| 76 | for (i = 0; i < 6; i++) |
| 77 | s[6+i] = sqn[i] ^ ak[i]; |
| 78 | s[12] = 0x00; |
| 79 | s[13] = 0x06; |
| 80 | |
| 81 | gnutls_hmac_fast(GNUTLS_MAC_SHA256, k, 32, s, 14, kasme); |
| 82 | } |