blob: 8d3750c41f828f17c97bcdf8cfc172a1afaf88dc [file] [log] [blame]
Harald Weltef44256c2021-10-14 15:53:39 +02001# coding=utf-8
Harald Welte0489ae62023-05-24 10:28:34 +02002"""Utilities / Functions related to sysmocom SJA2/SJA5 cards
Harald Weltef44256c2021-10-14 15:53:39 +02003
Harald Welte0489ae62023-05-24 10:28:34 +02004(C) 2021-2023 by Harald Welte <laforge@osmocom.org>
Harald Weltef44256c2021-10-14 15:53:39 +02005
6This program is free software: you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation, either version 2 of the License, or
9(at your option) any later version.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with this program. If not, see <http://www.gnu.org/licenses/>.
18"""
19
20from pytlv.TLV import *
21from struct import pack, unpack
22from pySim.utils import *
23from pySim.filesystem import *
Harald Welte531894d2023-07-11 19:11:11 +020024from pySim.runtime import RuntimeState
Harald Weltef44256c2021-10-14 15:53:39 +020025from pySim.ts_102_221 import CardProfileUICC
26from pySim.construct import *
27from construct import *
28import pySim
29
30key_type2str = {
31 0: 'kic',
32 1: 'kid',
33 2: 'kik',
34 3: 'any',
35}
36
37key_algo2str = {
38 0: 'des',
39 1: 'aes'
40}
41
42mac_length = {
43 0: 8,
44 1: 4
45}
46
Harald Weltec91085e2022-02-10 18:05:45 +010047
Harald Weltef44256c2021-10-14 15:53:39 +020048class EF_PIN(TransparentEF):
49 def __init__(self, fid, name):
50 super().__init__(fid, name=name, desc='%s PIN file' % name)
Harald Weltec91085e2022-02-10 18:05:45 +010051
Harald Weltef44256c2021-10-14 15:53:39 +020052 def _decode_bin(self, raw_bin_data):
53 u = unpack('!BBB8s', raw_bin_data[:11])
Harald Weltec91085e2022-02-10 18:05:45 +010054 res = {'enabled': (True, False)[u[0] & 0x01],
55 'initialized': (True, False)[u[0] & 0x02],
56 'disable_able': (False, True)[u[0] & 0x10],
57 'unblock_able': (False, True)[u[0] & 0x20],
58 'change_able': (False, True)[u[0] & 0x40],
59 'valid': (False, True)[u[0] & 0x80],
60 'attempts_remaining': u[1],
61 'maximum_attempts': u[2],
62 'pin': u[3].hex(),
63 }
Harald Weltef44256c2021-10-14 15:53:39 +020064 if len(raw_bin_data) == 21:
65 u2 = unpack('!BB8s', raw_bin_data[11:10])
66 res['attempts_remaining_puk'] = u2[0]
67 res['maximum_attempts_puk'] = u2[1]
68 res['puk'] = u2[2].hex()
69 return res
70
Harald Weltec91085e2022-02-10 18:05:45 +010071
Harald Weltef44256c2021-10-14 15:53:39 +020072class EF_MILENAGE_CFG(TransparentEF):
Harald Welte7be68b22023-11-02 00:19:53 +010073 _test_de_encode = [
74 ( '40002040600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000020000000000000000000000000000000400000000000000000000000000000008',
75 {"r1": 64, "r2": 0, "r3": 32, "r4": 64, "r5": 96, "c1": "00000000000000000000000000000000", "c2":
76 "00000000000000000000000000000001", "c3": "00000000000000000000000000000002", "c4":
77 "00000000000000000000000000000004", "c5": "00000000000000000000000000000008"} ),
78 ]
Harald Weltef44256c2021-10-14 15:53:39 +020079 def __init__(self, fid='6f21', name='EF.MILENAGE_CFG', desc='Milenage connfiguration'):
80 super().__init__(fid, name=name, desc=desc)
Harald Welte7be68b22023-11-02 00:19:53 +010081 self._construct = Struct('r1'/Int8ub, 'r2'/Int8ub, 'r3'/Int8ub, 'r4'/Int8ub, 'r5'/Int8ub,
82 'c1'/HexAdapter(Bytes(16)),
83 'c2'/HexAdapter(Bytes(16)),
84 'c3'/HexAdapter(Bytes(16)),
85 'c4'/HexAdapter(Bytes(16)),
86 'c5'/HexAdapter(Bytes(16)))
Harald Weltec91085e2022-02-10 18:05:45 +010087
Harald Weltef44256c2021-10-14 15:53:39 +020088
89class EF_0348_KEY(LinFixedEF):
90 def __init__(self, fid='6f22', name='EF.0348_KEY', desc='TS 03.48 OTA Keys'):
Harald Welte99e4cc02022-07-21 15:25:47 +020091 super().__init__(fid, name=name, desc=desc, rec_len=(27, 35))
Harald Welte954ce952023-05-27 20:08:09 +020092 KeyLenAndType = BitStruct('mac_length'/Mapping(Bit, {8:0, 4:1}),
93 'algorithm'/Enum(Bit, des=0, aes=1),
94 'key_length'/MultiplyAdapter(BitsInteger(3), 8),
95 '_rfu'/BitsRFU(1),
96 'key_type'/Enum(BitsInteger(2), kic=0, kid=1, kik=2, any=3))
97 self._construct = Struct('security_domain'/Int8ub,
98 'key_set_version'/Int8ub,
99 'key_len_and_type'/KeyLenAndType,
100 'key'/HexAdapter(Bytes(this.key_len_and_type.key_length)))
Harald Weltec91085e2022-02-10 18:05:45 +0100101
Harald Weltef44256c2021-10-14 15:53:39 +0200102
103class EF_0348_COUNT(LinFixedEF):
Harald Welte7be68b22023-11-02 00:19:53 +0100104 _test_de_encode = [
105 ( 'fe010000000000', {"sec_domain": 254, "key_set_version": 1, "counter": "0000000000"} ),
106 ]
Harald Weltef44256c2021-10-14 15:53:39 +0200107 def __init__(self, fid='6f23', name='EF.0348_COUNT', desc='TS 03.48 OTA Counters'):
Harald Welte99e4cc02022-07-21 15:25:47 +0200108 super().__init__(fid, name=name, desc=desc, rec_len=(7, 7))
Harald Welte7be68b22023-11-02 00:19:53 +0100109 self._construct = Struct('sec_domain'/Int8ub,
110 'key_set_version'/Int8ub,
111 'counter'/HexAdapter(Bytes(5)))
Harald Weltef44256c2021-10-14 15:53:39 +0200112
Harald Weltec91085e2022-02-10 18:05:45 +0100113
Harald Weltef44256c2021-10-14 15:53:39 +0200114class EF_SIM_AUTH_COUNTER(TransparentEF):
115 def __init__(self, fid='af24', name='EF.SIM_AUTH_COUNTER'):
116 super().__init__(fid, name=name, desc='Number of remaining RUN GSM ALGORITHM executions')
117 self._construct = Struct('num_run_gsm_algo_remain'/Int32ub)
118
Harald Weltec91085e2022-02-10 18:05:45 +0100119
Harald Weltef44256c2021-10-14 15:53:39 +0200120class EF_GP_COUNT(LinFixedEF):
Harald Welte7be68b22023-11-02 00:19:53 +0100121 _test_de_encode = [
122 ( '0070000000', {"sec_domain": 0, "key_set_version": 112, "counter": 0, "rfu": 0} ),
123 ]
Harald Weltef44256c2021-10-14 15:53:39 +0200124 def __init__(self, fid='6f26', name='EF.GP_COUNT', desc='GP SCP02 Counters'):
Harald Welte99e4cc02022-07-21 15:25:47 +0200125 super().__init__(fid, name=name, desc=desc, rec_len=(5, 5))
Harald Welte7be68b22023-11-02 00:19:53 +0100126 self._construct = Struct('sec_domain'/Int8ub,
127 'key_set_version'/Int8ub,
128 'counter'/Int16ub,
129 'rfu'/Int8ub)
Harald Weltec91085e2022-02-10 18:05:45 +0100130
Harald Weltef44256c2021-10-14 15:53:39 +0200131class EF_GP_DIV_DATA(LinFixedEF):
132 def __init__(self, fid='6f27', name='EF.GP_DIV_DATA', desc='GP SCP02 key diversification data'):
Harald Welte99e4cc02022-07-21 15:25:47 +0200133 super().__init__(fid, name=name, desc=desc, rec_len=(12, 12))
Harald Weltec91085e2022-02-10 18:05:45 +0100134
Harald Weltef6b37af2023-01-24 15:42:26 +0100135 def _decode_record_bin(self, raw_bin_data, **kwargs):
Harald Weltef44256c2021-10-14 15:53:39 +0200136 u = unpack('!BB8s', raw_bin_data)
137 return {'sec_domain': u[0], 'key_set_version': u[1], 'key_div_data': u[2].hex()}
138
Harald Weltec91085e2022-02-10 18:05:45 +0100139
Harald Weltef44256c2021-10-14 15:53:39 +0200140class EF_SIM_AUTH_KEY(TransparentEF):
Harald Welte7be68b22023-11-02 00:19:53 +0100141 _test_de_encode = [
142 ( '14000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f',
Harald Welte45477a72023-11-03 01:33:06 +0100143 {"cfg": {"sres_deriv_func": 1, "use_opc_instead_of_op": True, "algorithm": "milenage"}, "key":
Harald Welte7be68b22023-11-02 00:19:53 +0100144 "000102030405060708090a0b0c0d0e0f", "op_opc": "101112131415161718191a1b1c1d1e1f"} ),
145 ]
Harald Weltef44256c2021-10-14 15:53:39 +0200146 def __init__(self, fid='6f20', name='EF.SIM_AUTH_KEY'):
147 super().__init__(fid, name=name, desc='USIM authentication key')
Harald Weltecfa30152022-07-22 17:12:27 +0200148 CfgByte = BitStruct(Padding(2),
Harald Welte45477a72023-11-03 01:33:06 +0100149 'sres_deriv_func'/Mapping(Bit, {1:0, 2:1}),
150 'use_opc_instead_of_op'/Flag,
Harald Weltef44256c2021-10-14 15:53:39 +0200151 'algorithm'/Enum(Nibble, milenage=4, comp128v1=1, comp128v2=2, comp128v3=3))
152 self._construct = Struct('cfg'/CfgByte,
Harald Welte3c98d5e2022-07-20 07:40:05 +0200153 'key'/HexAdapter(Bytes(16)),
Philipp Maier4f888a02022-12-02 12:30:12 +0100154 'op_opc' /HexAdapter(Bytes(16)))
Harald Weltef44256c2021-10-14 15:53:39 +0200155
Harald Weltec91085e2022-02-10 18:05:45 +0100156
Harald Weltef44256c2021-10-14 15:53:39 +0200157class DF_SYSTEM(CardDF):
158 def __init__(self):
159 super().__init__(fid='a515', name='DF.SYSTEM', desc='CardOS specifics')
160 files = [
161 EF_PIN('6f01', 'EF.CHV1'),
162 EF_PIN('6f81', 'EF.CHV2'),
163 EF_PIN('6f0a', 'EF.ADM1'),
164 EF_PIN('6f0b', 'EF.ADM2'),
165 EF_PIN('6f0c', 'EF.ADM3'),
166 EF_PIN('6f0d', 'EF.ADM4'),
167 EF_MILENAGE_CFG(),
168 EF_0348_KEY(),
169 EF_SIM_AUTH_COUNTER(),
170 EF_SIM_AUTH_KEY(),
171 EF_0348_COUNT(),
172 EF_GP_COUNT(),
173 EF_GP_DIV_DATA(),
Harald Weltec91085e2022-02-10 18:05:45 +0100174 ]
Harald Weltef44256c2021-10-14 15:53:39 +0200175 self.add_files(files)
176
177 def decode_select_response(self, resp_hex):
Philipp Maier5998a3a2021-11-16 15:16:39 +0100178 return pySim.ts_102_221.CardProfileUICC.decode_select_response(resp_hex)
Harald Weltef44256c2021-10-14 15:53:39 +0200179
Harald Weltec91085e2022-02-10 18:05:45 +0100180
Harald Weltef44256c2021-10-14 15:53:39 +0200181class EF_USIM_SQN(TransparentEF):
Harald Welte7be68b22023-11-02 00:19:53 +0100182 _test_de_encode = [
183 ( 'd503000200000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
Harald Welte45477a72023-11-03 01:33:06 +0100184 {"flag1": {"skip_next_sqn_check": True, "delta_max_check": True, "age_limit_check": False, "sqn_check": True,
185 "ind_len": 5}, "flag2": {"rfu": 0, "dont_clear_amf_for_macs": False, "aus_concealed": True,
186 "autn_concealed": True}, "delta_max": 8589934592, "age_limit":
Harald Welte7be68b22023-11-02 00:19:53 +0100187 8589934592, "freshness": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
188 0, 0, 0, 0, 0, 0, 0, 0]} ),
189 ]
Harald Weltef44256c2021-10-14 15:53:39 +0200190 def __init__(self, fid='af30', name='EF.USIM_SQN'):
191 super().__init__(fid, name=name, desc='SQN parameters for AKA')
Harald Welte45477a72023-11-03 01:33:06 +0100192 Flag1 = BitStruct('skip_next_sqn_check'/Flag, 'delta_max_check'/Flag,
193 'age_limit_check'/Flag, 'sqn_check'/Flag,
Harald Weltef44256c2021-10-14 15:53:39 +0200194 'ind_len'/BitsInteger(4))
Harald Welte45477a72023-11-03 01:33:06 +0100195 Flag2 = BitStruct('rfu'/BitsRFU(5), 'dont_clear_amf_for_macs'/Flag,
196 'aus_concealed'/Flag, 'autn_concealed'/Flag)
Harald Weltef44256c2021-10-14 15:53:39 +0200197 self._construct = Struct('flag1'/Flag1, 'flag2'/Flag2,
Harald Weltec91085e2022-02-10 18:05:45 +0100198 'delta_max' /
199 BytesInteger(6), 'age_limit'/BytesInteger(6),
Harald Welteeb458382021-10-16 10:44:23 +0200200 'freshness'/GreedyRange(BytesInteger(6)))
Harald Weltef44256c2021-10-14 15:53:39 +0200201
Harald Weltec91085e2022-02-10 18:05:45 +0100202
Harald Weltef44256c2021-10-14 15:53:39 +0200203class EF_USIM_AUTH_KEY(TransparentEF):
204 def __init__(self, fid='af20', name='EF.USIM_AUTH_KEY'):
205 super().__init__(fid, name=name, desc='USIM authentication key')
Harald Welte03650582023-05-29 21:07:24 +0200206 Algorithm = Enum(Nibble, milenage=4, sha1_aka=5, tuak=6, xor=15)
Harald Welte45477a72023-11-03 01:33:06 +0100207 CfgByte = BitStruct(Padding(1), 'only_4bytes_res_in_3g'/Flag,
208 'sres_deriv_func_in_2g'/Mapping(Bit, {1:0, 2:1}),
Harald Welte03650582023-05-29 21:07:24 +0200209 'use_opc_instead_of_op'/Mapping(Bit, {False:0, True:1}),
210 'algorithm'/Algorithm)
Harald Weltef44256c2021-10-14 15:53:39 +0200211 self._construct = Struct('cfg'/CfgByte,
Harald Welte3c98d5e2022-07-20 07:40:05 +0200212 'key'/HexAdapter(Bytes(16)),
Philipp Maier4f888a02022-12-02 12:30:12 +0100213 'op_opc' /HexAdapter(Bytes(16)))
Harald Welte03650582023-05-29 21:07:24 +0200214 # TUAK has a rather different layout for the data, so we define a different
215 # construct below and use explicit _{decode,encode}_bin() methods for separating
216 # the TUAK and non-TUAK situation
217 CfgByteTuak = BitStruct(Padding(1),
218 'key_length'/Mapping(Bit, {128:0, 256:1}),
Harald Welte45477a72023-11-03 01:33:06 +0100219 'sres_deriv_func_in_2g'/Mapping(Bit, {1:0, 2:1}),
Harald Welte03650582023-05-29 21:07:24 +0200220 'use_opc_instead_of_op'/Mapping(Bit, {False:0, True:1}),
221 'algorithm'/Algorithm)
222 TuakCfgByte = BitStruct(Padding(1),
223 'ck_and_ik_size'/Mapping(Bit, {128:0, 256:1}),
224 'mac_size'/Mapping(BitsInteger(3), {64:0, 128:1, 256:2}),
225 'res_size'/Mapping(BitsInteger(3), {32:0, 64:1, 128:2, 256:3}))
226 self._constr_tuak = Struct('cfg'/CfgByteTuak,
227 'tuak_cfg'/TuakCfgByte,
228 'num_of_keccak_iterations'/Int8ub,
229 'op_opc'/HexAdapter(Bytes(32)),
Harald Welte19b4a972023-06-08 17:18:31 +0200230 'k'/HexAdapter(Bytes(this.cfg.key_length//8)))
Harald Welte03650582023-05-29 21:07:24 +0200231
232 def _decode_bin(self, raw_bin_data: bytearray) -> dict:
233 if raw_bin_data[0] & 0x0F == 0x06:
234 return parse_construct(self._constr_tuak, raw_bin_data)
235 else:
236 return parse_construct(self._construct, raw_bin_data)
237
238 def _encode_bin(self, abstract_data: dict) -> bytearray:
239 if abstract_data['cfg']['algorithm'] == 'tuak':
240 return self._constr_tuak.build(abstract_data)
241 else:
242 return self._construct.build(abstract_data)
Harald Weltec91085e2022-02-10 18:05:45 +0100243
244
Harald Weltef44256c2021-10-14 15:53:39 +0200245class EF_USIM_AUTH_KEY_2G(TransparentEF):
Harald Welte7be68b22023-11-02 00:19:53 +0100246 _test_de_encode = [
247 ( '14000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f',
Harald Welte45477a72023-11-03 01:33:06 +0100248 {"cfg": {"only_4bytes_res_in_3g": False, "sres_deriv_func_in_2g": 1, "use_opc_instead_of_op": True,
Harald Welte7be68b22023-11-02 00:19:53 +0100249 "algorithm": "milenage"}, "key": "000102030405060708090a0b0c0d0e0f", "op_opc":
250 "101112131415161718191a1b1c1d1e1f"} ),
251 ]
Harald Weltef44256c2021-10-14 15:53:39 +0200252 def __init__(self, fid='af22', name='EF.USIM_AUTH_KEY_2G'):
253 super().__init__(fid, name=name, desc='USIM authentication key in 2G context')
Harald Welte45477a72023-11-03 01:33:06 +0100254 CfgByte = BitStruct(Padding(1), 'only_4bytes_res_in_3g'/Flag,
255 'sres_deriv_func_in_2g'/Mapping(Bit, {1:0, 2:1}),
256 'use_opc_instead_of_op'/Flag,
Harald Welte557c1362023-05-29 15:26:22 +0200257 'algorithm'/Enum(Nibble, milenage=4, comp128v1=1, comp128v2=2, comp128v3=3, xor=14))
Harald Weltef44256c2021-10-14 15:53:39 +0200258 self._construct = Struct('cfg'/CfgByte,
Harald Welte3c98d5e2022-07-20 07:40:05 +0200259 'key'/HexAdapter(Bytes(16)),
Philipp Maier4f888a02022-12-02 12:30:12 +0100260 'op_opc' /HexAdapter(Bytes(16)))
Harald Weltec91085e2022-02-10 18:05:45 +0100261
262
Harald Weltef44256c2021-10-14 15:53:39 +0200263class EF_GBA_SK(TransparentEF):
264 def __init__(self, fid='af31', name='EF.GBA_SK'):
265 super().__init__(fid, name=name, desc='Secret key for GBA key derivation')
266 self._construct = GreedyBytes
267
Harald Weltec91085e2022-02-10 18:05:45 +0100268
Harald Weltef44256c2021-10-14 15:53:39 +0200269class EF_GBA_REC_LIST(TransparentEF):
270 def __init__(self, fid='af32', name='EF.GBA_REC_LIST'):
271 super().__init__(fid, name=name, desc='Secret key for GBA key derivation')
272 # integers representing record numbers in EF-GBANL
273 self._construct = GreedyRange(Int8ub)
274
Harald Weltec91085e2022-02-10 18:05:45 +0100275
Harald Weltef44256c2021-10-14 15:53:39 +0200276class EF_GBA_INT_KEY(LinFixedEF):
277 def __init__(self, fid='af33', name='EF.GBA_INT_KEY'):
Harald Weltec91085e2022-02-10 18:05:45 +0100278 super().__init__(fid, name=name,
Harald Welte99e4cc02022-07-21 15:25:47 +0200279 desc='Secret key for GBA key derivation', rec_len=(32, 32))
Harald Weltef44256c2021-10-14 15:53:39 +0200280 self._construct = GreedyBytes
281
282
Harald Weltef44256c2021-10-14 15:53:39 +0200283class SysmocomSJA2(CardModel):
Harald Weltec91085e2022-02-10 18:05:45 +0100284 _atrs = ["3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 75 30 34 05 4B A9",
285 "3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 75 31 33 02 51 B2",
286 "3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 4C 52 75 31 04 51 D5"]
287
Harald Weltef44256c2021-10-14 15:53:39 +0200288 @classmethod
Harald Weltec91085e2022-02-10 18:05:45 +0100289 def add_files(cls, rs: RuntimeState):
Harald Weltef44256c2021-10-14 15:53:39 +0200290 """Add sysmocom SJA2 specific files to given RuntimeState."""
291 rs.mf.add_file(DF_SYSTEM())
292 # optional USIM application
293 if 'a0000000871002' in rs.mf.applications:
294 usim_adf = rs.mf.applications['a0000000871002']
295 files_adf_usim = [
296 EF_USIM_AUTH_KEY(),
297 EF_USIM_AUTH_KEY_2G(),
298 EF_GBA_SK(),
299 EF_GBA_REC_LIST(),
300 EF_GBA_INT_KEY(),
301 EF_USIM_SQN(),
Harald Weltec91085e2022-02-10 18:05:45 +0100302 ]
Harald Weltef44256c2021-10-14 15:53:39 +0200303 usim_adf.add_files(files_adf_usim)
304 # optional ISIM application
305 if 'a0000000871004' in rs.mf.applications:
306 isim_adf = rs.mf.applications['a0000000871004']
307 files_adf_isim = [
308 EF_USIM_AUTH_KEY(name='EF.ISIM_AUTH_KEY'),
309 EF_USIM_AUTH_KEY_2G(name='EF.ISIM_AUTH_KEY_2G'),
310 EF_USIM_SQN(name='EF.ISIM_SQN'),
Harald Weltec91085e2022-02-10 18:05:45 +0100311 ]
Harald Weltef44256c2021-10-14 15:53:39 +0200312 isim_adf.add_files(files_adf_isim)
Harald Welte0489ae62023-05-24 10:28:34 +0200313
314class SysmocomSJA5(CardModel):
315 _atrs = ["3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 51 CC",
316 "3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 65 F8",
317 "3B 9F 96 80 1F 87 80 31 E0 73 FE 21 1B 67 4A 35 75 30 35 02 59 C4"]
318
319 @classmethod
320 def add_files(cls, rs: RuntimeState):
321 """Add sysmocom SJA2 specific files to given RuntimeState."""
322 rs.mf.add_file(DF_SYSTEM())
323 # optional USIM application
324 if 'a0000000871002' in rs.mf.applications:
325 usim_adf = rs.mf.applications['a0000000871002']
326 files_adf_usim = [
327 EF_USIM_AUTH_KEY(),
328 EF_USIM_AUTH_KEY_2G(),
329 EF_GBA_SK(),
330 EF_GBA_REC_LIST(),
331 EF_GBA_INT_KEY(),
332 EF_USIM_SQN(),
333 ]
334 usim_adf.add_files(files_adf_usim)
335 # optional ISIM application
336 if 'a0000000871004' in rs.mf.applications:
337 isim_adf = rs.mf.applications['a0000000871004']
338 files_adf_isim = [
339 EF_USIM_AUTH_KEY(name='EF.ISIM_AUTH_KEY'),
340 EF_USIM_AUTH_KEY_2G(name='EF.ISIM_AUTH_KEY_2G'),
341 EF_USIM_SQN(name='EF.ISIM_SQN'),
342 ]
343 isim_adf.add_files(files_adf_isim)