最近在實做 LTE 網路 Attach 流程 Non-access Stratum (NAS) 層加密及 MAC 值計算時,重新看了一次 \(K_{NASint}\) 與 \(K_{NASenc}\) 的計算方式,因此寫一篇文章紀錄以供日後參考。
計算 \(K_{NASint}\) 與 \(K_{NASenc}\) 需要 \(K_{asme}\) 及 Key derivation function (\(KDF\))。 \(K_{asme}\) 可以透過 LTE 鑒權的流程取得。
Generic KDF
\(KDF\)[1] 的定義如下: \[ KDF = HMAC-SHA256(K_{asme}, S) \]
可以看到它需要的兩個參數為 \(K_{asme}\) 及字串 \(S\)[1],其中 \(S\) 的定義如下: \[ S = FC || P_{0} || L_{0} || P_{1} || L_{1} ... P_{n} || L_{n} \]
\(FC\) 用於區別演算法的使用時機,\(P_{n}\) 代表輸入的參數,在此會用到的有兩個參數 \(P_{0}\) 與 \(P_{1}\),分別為演算法的類別及演算法的編號,\(L_{n}\) 代表著參數的長度,以兩個 byte 來表示,採用 big-endian 格式。
參數 \(P_{0}\)
參數 \(P_{0}\) 為演算法的類別,長度為 1 byte,具體參數參閱下表[3]:
Algorithm distinguisher | Value |
---|---|
NAS-enc-alg | 0x01 |
NAS-int-alg | 0x02 |
RRC-enc-alg | 0x03 |
RRC-enc-alg | 0x04 |
UP-enc-alg | 0x05 |
UP-enc-alg | 0x06 |
參數 \(P_{1}\)
參數 \(P_{1}\) 為演算法的編號,長度為 1 byte,具體參數請參閱下表[4]:
Algorithm identifier | Value |
---|---|
EEA0 | 0x0 |
128-EEA1 | 0x1 |
128-EEA2 | 0x2 |
128-EEA3 | 0x3 |
EIA0 | 0x0 |
128-EIA1 | 0x1 |
128-EIA2 | 0x2 |
128-EIA3 | 0x3 |
\(K_{NASint}\) 與 \(K_{NASenc}\)
計算 \(K_{NASint}\) 於 \(K_{NASenc}\) 時要將 \(FC\) 設為 \(0x15\),因此兩個 \(S\) 值分別為:
\(EIA1\) 的 \(K_{NASint}\):\(S = 0x15 || NAS-int-alg || 0x0001 || EIA1 || 0x0001\)
\(EEA1\) 的 \(K_{NASenc}\):\(S = 0x15 || NAS-enc-alg || 0x0001 || EEA1 || 0x0001\)
得到 \(S\) 值後再用 \(KDF\) 算出 256-bit 長度的 HMAC,注意因為 LTE 使用的金鑰長度為 128-bit,故最後只取尾巴的 128-bit 作為 Key