blob: bf7818affa80793280c5135958c0fd58217112d3 [file] [log] [blame]
Harald Welte158a7ca2018-02-16 18:11:31 +01001module L3_Common {
2
3import from Osmocom_Types all;
4import from General_Types all;
Harald Welte5a4fa042018-02-16 20:59:21 +01005import from MobileL3_GMM_SM_Types all;
Harald Welte158a7ca2018-02-16 18:11:31 +01006
7type record AuthVector {
8 OCT16 rand,
9 OCT4 sres,
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +020010 OCT8 kc,
11 OCT16 ik,
12 OCT16 ck,
13 OCT16 autn,
14 OCT8 res
Harald Welte158a7ca2018-02-16 18:11:31 +010015}
16
17private function f_rnd_oct(integer len) return octetstring {
18 var integer i;
19 var octetstring res;
20 for (i := 0; i < len; i := i + 1) {
21 res[i] := int2oct(float2int(rnd()*256.0), 1);
22 }
23 return res;
24}
25
26function f_gen_auth_vec_2g() return AuthVector {
27 var AuthVector vec;
28 vec.rand := f_rnd_oct(16);
29 vec.sres := f_rnd_oct(4);
30 vec.kc := f_rnd_oct(8);
31 return vec;
32}
33
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +020034function f_gen_auth_vec_3g() return AuthVector {
35 var AuthVector vec := f_gen_auth_vec_2g();
36 vec.ik := f_rnd_oct(16);
37 vec.ck := f_rnd_oct(16);
38 vec.autn := f_rnd_oct(16);
39 vec.res := f_rnd_oct(8);
40 return vec;
41}
42
Harald Welte14a0f942018-02-16 20:42:23 +010043/* 3GPP TS 23.003 2.6 */
44type enumerated TlliType {
45 TLLI_LOCAL,
46 TLLI_FOREIGN,
47 TLLI_RANDOM,
48 TLLI_AUXILIARY,
49 TLLI_RESERVED,
50 TLLI_G_RNTI,
51 TLLI_RAND_G_RNTI
52}
53
54/* 3GPP TS 23.003 2.6 */
55function f_gprs_tlli_type(OCT4 tlli) return TlliType {
56 var bitstring tllib := oct2bit(tlli);
57 if (substr(tllib, 0, 2) == '11'B) {
58 return TLLI_LOCAL;
59 } else if (substr(tllib, 0, 2) == '10'B) {
60 return TLLI_FOREIGN;
61 } else if (substr(tllib, 0, 5) == '01111'B) {
62 return TLLI_RANDOM;
63 } else if (substr(tllib, 0, 4) == '0110'B) {
64 return TLLI_RESERVED;
65 } else if (substr(tllib, 0, 3) == '010'B) {
66 return TLLI_RESERVED;
67 } else if (substr(tllib, 0, 4) == '0000'B) {
68 return TLLI_G_RNTI;
69 } else if (substr(tllib, 0, 4) == '0001'B) {
70 return TLLI_RAND_G_RNTI;
71 } else {
72 setverdict(fail, "Unknonw TLLI Type ", tllib);
Daniel Willmanne4ff5372018-07-05 17:35:03 +020073 mtc.stop;
Harald Welte14a0f942018-02-16 20:42:23 +010074 }
75}
76
77function f_gprs_tlli_random() return OCT4 {
78 var OCT4 tlli := f_rnd_octstring(4);
79 return tlli or4b 'c0000000'O;
80}
81
Harald Welte5a4fa042018-02-16 20:59:21 +010082function f_RAI(HEX0_3n mcc, HEX0_3n mnc, OCT2 lac, OCT1 rac) return RoutingAreaIdentificationV {
83 if (lengthof(mnc) == 2) {
84 mnc := mnc & 'F'H;
85 }
86 var RoutingAreaIdentificationV ret := {
87 mccDigit1 := mcc[0],
88 mccDigit2 := mcc[1],
89 mccDigit3 := mcc[2],
90 mncDigit3 := mnc[2],
91 mncDigit1 := mnc[0],
92 mncDigit2 := mnc[1],
93 lac := lac,
94 rac := rac
95 }
96 return ret;
97}
Harald Welte158a7ca2018-02-16 18:11:31 +010098
Neels Hofmeyr8df7d152018-03-14 19:03:28 +010099function f_RAI_to_plmn_hexstr(RoutingAreaIdentificationV rai) return hexstring {
100 var hexstring plmn :=
101 rai.mccDigit1
102 & rai.mccDigit2
103 & rai.mccDigit3
104 & rai.mncDigit1
105 & rai.mncDigit2
106 & rai.mncDigit3;
107 return plmn;
108}
Harald Welte158a7ca2018-02-16 18:11:31 +0100109
110}