blob: 8d5d8a4010fe53b4a125b31541c2047d9c67a9ea [file] [log] [blame]
Harald Weltec918e4e2019-07-12 18:53:55 +08001#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
8void 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
28void 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
43void 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
61void 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}
Pau Espin Pedrol3be4d922024-01-15 15:21:57 +010083
84/* TS33.401 Annex A.9: NAS token derivation for inter-RAT mobility */
85void mme_kdf_nas_token(const uint8_t *kasme, uint32_t ul_count, uint8_t *nas_token)
86{
87 uint8_t s[7];
88
89 s[0] = 0x17; /* FC Value */
90
91 ul_count = htonl(ul_count);
92 memcpy(s+1, &ul_count, 4);
93
94 s[5] = 0x00;
95 s[6] = 0x04;
96
97 gnutls_hmac_fast(GNUTLS_MAC_SHA256, kasme, 32, s, 7, nas_token);
98}