blob: 57db6b316d8579e204591866dfbdc74ad164fc26 [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,
Alexander Couzens387f7f32018-09-04 18:10:59 +020014 OCT8 res,
15 /* auts is usally calculated from autn + rand on the MS.
16 * To simplify the test case, auts is generated instead calculated here.
17 */
18 OCT14 auts
Harald Welte158a7ca2018-02-16 18:11:31 +010019}
20
21private function f_rnd_oct(integer len) return octetstring {
22 var integer i;
23 var octetstring res;
24 for (i := 0; i < len; i := i + 1) {
25 res[i] := int2oct(float2int(rnd()*256.0), 1);
26 }
27 return res;
28}
29
30function f_gen_auth_vec_2g() return AuthVector {
31 var AuthVector vec;
32 vec.rand := f_rnd_oct(16);
33 vec.sres := f_rnd_oct(4);
34 vec.kc := f_rnd_oct(8);
35 return vec;
36}
37
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +020038function f_gen_auth_vec_3g() return AuthVector {
39 var AuthVector vec := f_gen_auth_vec_2g();
40 vec.ik := f_rnd_oct(16);
41 vec.ck := f_rnd_oct(16);
42 vec.autn := f_rnd_oct(16);
43 vec.res := f_rnd_oct(8);
Alexander Couzens387f7f32018-09-04 18:10:59 +020044 vec.auts := f_rnd_oct(14);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +020045 return vec;
46}
47
Harald Welte14a0f942018-02-16 20:42:23 +010048/* 3GPP TS 23.003 2.6 */
49type enumerated TlliType {
50 TLLI_LOCAL,
51 TLLI_FOREIGN,
52 TLLI_RANDOM,
53 TLLI_AUXILIARY,
54 TLLI_RESERVED,
55 TLLI_G_RNTI,
56 TLLI_RAND_G_RNTI
57}
58
59/* 3GPP TS 23.003 2.6 */
60function f_gprs_tlli_type(OCT4 tlli) return TlliType {
61 var bitstring tllib := oct2bit(tlli);
62 if (substr(tllib, 0, 2) == '11'B) {
63 return TLLI_LOCAL;
64 } else if (substr(tllib, 0, 2) == '10'B) {
65 return TLLI_FOREIGN;
66 } else if (substr(tllib, 0, 5) == '01111'B) {
67 return TLLI_RANDOM;
68 } else if (substr(tllib, 0, 4) == '0110'B) {
69 return TLLI_RESERVED;
70 } else if (substr(tllib, 0, 3) == '010'B) {
71 return TLLI_RESERVED;
72 } else if (substr(tllib, 0, 4) == '0000'B) {
73 return TLLI_G_RNTI;
74 } else if (substr(tllib, 0, 4) == '0001'B) {
75 return TLLI_RAND_G_RNTI;
76 } else {
77 setverdict(fail, "Unknonw TLLI Type ", tllib);
Daniel Willmanne4ff5372018-07-05 17:35:03 +020078 mtc.stop;
Harald Welte14a0f942018-02-16 20:42:23 +010079 }
80}
81
82function f_gprs_tlli_random() return OCT4 {
83 var OCT4 tlli := f_rnd_octstring(4);
84 return tlli or4b 'c0000000'O;
85}
86
Harald Welte5a4fa042018-02-16 20:59:21 +010087function f_RAI(HEX0_3n mcc, HEX0_3n mnc, OCT2 lac, OCT1 rac) return RoutingAreaIdentificationV {
88 if (lengthof(mnc) == 2) {
89 mnc := mnc & 'F'H;
90 }
91 var RoutingAreaIdentificationV ret := {
92 mccDigit1 := mcc[0],
93 mccDigit2 := mcc[1],
94 mccDigit3 := mcc[2],
95 mncDigit3 := mnc[2],
96 mncDigit1 := mnc[0],
97 mncDigit2 := mnc[1],
98 lac := lac,
99 rac := rac
100 }
101 return ret;
102}
Harald Welte158a7ca2018-02-16 18:11:31 +0100103
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100104function f_RAI_to_plmn_hexstr(RoutingAreaIdentificationV rai) return hexstring {
105 var hexstring plmn :=
106 rai.mccDigit1
107 & rai.mccDigit2
108 & rai.mccDigit3
109 & rai.mncDigit1
110 & rai.mncDigit2
111 & rai.mncDigit3;
112 return plmn;
113}
Harald Welte158a7ca2018-02-16 18:11:31 +0100114
115}