mirror of https://gerrit.osmocom.org/pysim
Better decode of EF.UST, EF.EST and EF.IST
So far, we only returned an array of service numbers like [ 2, 4, 5, 9 ] which is not very friendly to the human reader. In EF.SST we already had more verbose decoding including a description of each service. Let's add the same principle to EF.UST, EST and IST The same output above now looks like this: { "1": { "description": "Local Phone Book", "activated": false }, "2": { "description": "Fixed Dialling Numbers (FDN)", "activated": true }, "3": { "description": "Extension 2", "activated": false }, "4": { "description": "Service Dialling Numbers (SDN)", "activated": true }, "5": { "description": "Extension3", "activated": true }, "6": { "description": "Barred Dialling Numbers (BDN)", "activated": false }, "7": { "description": "Extension4", "activated": false }, "9": { "description": "Incoming Call Information (ICI and ICT)", "activated": true } } Change-Id: I34f64d1043698dc385619b2fdda23cb541675f76
This commit is contained in:
parent
08b2499c35
commit
e8947493e6
|
@ -165,6 +165,13 @@ EF_UST_map = {
|
||||||
135: 'Support for Trusted non-3GPP access networks by USIM'
|
135: 'Support for Trusted non-3GPP access networks by USIM'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Mapping between USIM Enbled Service Number and its description
|
||||||
|
EF_EST_map = {
|
||||||
|
1: 'Fixed Dialling Numbers (FDN)',
|
||||||
|
2: 'Barred Dialling Numbers (BDN)',
|
||||||
|
3: 'APN Control List (ACL)'
|
||||||
|
}
|
||||||
|
|
||||||
LOCI_STATUS_map = {
|
LOCI_STATUS_map = {
|
||||||
0: 'updated',
|
0: 'updated',
|
||||||
1: 'not updated',
|
1: 'not updated',
|
||||||
|
@ -282,6 +289,7 @@ EF_USIM_ADF_map = {
|
||||||
|
|
||||||
import enum
|
import enum
|
||||||
from struct import unpack, pack
|
from struct import unpack, pack
|
||||||
|
from typing import Tuple
|
||||||
from construct import *
|
from construct import *
|
||||||
from construct import Optional as COptional
|
from construct import Optional as COptional
|
||||||
from pySim.construct import *
|
from pySim.construct import *
|
||||||
|
@ -519,30 +527,49 @@ class EF_HPPLMN(TransparentEF):
|
||||||
self._construct = Int8ub
|
self._construct = Int8ub
|
||||||
|
|
||||||
# TS 31.102 Section 4.2.8
|
# TS 31.102 Section 4.2.8
|
||||||
class EF_UST(TransparentEF):
|
class EF_UServiceTable(TransparentEF):
|
||||||
def __init__(self, fid='6f38', sfid=0x04, name='EF.UST', desc='USIM Service Table', size={1,17}):
|
def __init__(self, fid, sfid, name, desc, size, table):
|
||||||
super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, size=size)
|
super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, size=size)
|
||||||
|
self.table = table
|
||||||
# add those commands to the general commands of a TransparentEF
|
# add those commands to the general commands of a TransparentEF
|
||||||
self.shell_commands += [self.AddlShellCommands()]
|
self.shell_commands += [self.AddlShellCommands()]
|
||||||
|
@staticmethod
|
||||||
|
def _bit_byte_offset_for_service(service:int) -> Tuple[int, int]:
|
||||||
|
i = service - 1
|
||||||
|
byte_offset = i//8
|
||||||
|
bit_offset = (i % 8)
|
||||||
|
return (byte_offset, bit_offset)
|
||||||
def _decode_bin(self, in_bin):
|
def _decode_bin(self, in_bin):
|
||||||
ret = []
|
ret = {}
|
||||||
for i in range (0, len(in_bin)):
|
for i in range (0, len(in_bin)):
|
||||||
byte = in_bin[i]
|
byte = in_bin[i]
|
||||||
for bitno in range(0,7):
|
for bitno in range(0,7):
|
||||||
if byte & (1 << bitno):
|
service_nr = i * 8 + bitno + 1
|
||||||
ret.append(i * 8 + bitno + 1)
|
ret[service_nr] = {
|
||||||
|
'activated': True if byte & (1 << bitno) else False
|
||||||
|
}
|
||||||
|
if service_nr in self.table:
|
||||||
|
ret[service_nr]['description'] = self.table[service_nr]
|
||||||
return ret
|
return ret
|
||||||
def _encode_bin(self, in_json):
|
def _encode_bin(self, in_json):
|
||||||
# FIXME: size this to length of file
|
# compute the required binary size
|
||||||
ret = bytearray(20)
|
bin_len = 0
|
||||||
for srv in in_json:
|
for srv in in_json.keys():
|
||||||
print("srv=%d"%srv)
|
service_nr = int(srv)
|
||||||
srv = srv-1
|
(byte_offset, bit_offset) = EF_UServiceTable._bit_byte_offset_for_service(service_nr)
|
||||||
byte_nr = srv // 8
|
if byte_offset >= bin_len:
|
||||||
# FIXME: detect if service out of range was selected
|
bin_len = byte_offset+1
|
||||||
bit_nr = srv % 8
|
# encode the actual data
|
||||||
ret[byte_nr] |= (1 << bit_nr)
|
out = bytearray(b'\x00' * bin_len)
|
||||||
return ret
|
for srv in in_json.keys():
|
||||||
|
service_nr = int(srv)
|
||||||
|
(byte_offset, bit_offset) = EF_UServiceTable._bit_byte_offset_for_service(service_nr)
|
||||||
|
if in_json[srv]['activated'] == True:
|
||||||
|
bit = 1
|
||||||
|
else:
|
||||||
|
bit = 0
|
||||||
|
out[byte_offset] |= (bit) << bit_offset
|
||||||
|
return out
|
||||||
@with_default_category('File-Specific Commands')
|
@with_default_category('File-Specific Commands')
|
||||||
class AddlShellCommands(CommandSet):
|
class AddlShellCommands(CommandSet):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
@ -991,7 +1018,7 @@ class ADF_USIM(CardADF):
|
||||||
'User controlled PLMN Selector with Access Technology'),
|
'User controlled PLMN Selector with Access Technology'),
|
||||||
EF_HPPLMN(),
|
EF_HPPLMN(),
|
||||||
EF_ACMmax(),
|
EF_ACMmax(),
|
||||||
EF_UST(),
|
EF_UServiceTable('6f38', 0x04, 'EF.UST', 'USIM Service Table', size={1,17}, table=EF_UST_map),
|
||||||
CyclicEF('6f39', None, 'EF.ACM', 'Accumulated call meter', rec_len={3,3}),
|
CyclicEF('6f39', None, 'EF.ACM', 'Accumulated call meter', rec_len={3,3}),
|
||||||
TransparentEF('6f3e', None, 'EF.GID1', 'Group Identifier Level 1'),
|
TransparentEF('6f3e', None, 'EF.GID1', 'Group Identifier Level 1'),
|
||||||
TransparentEF('6f3f', None, 'EF.GID2', 'Group Identifier Level 2'),
|
TransparentEF('6f3f', None, 'EF.GID2', 'Group Identifier Level 2'),
|
||||||
|
@ -1027,7 +1054,7 @@ class ADF_USIM(CardADF):
|
||||||
EF_ADN('6f4d', None, 'EF.BDN', 'Barred Dialling Numbers'),
|
EF_ADN('6f4d', None, 'EF.BDN', 'Barred Dialling Numbers'),
|
||||||
EF_EXT('6f55', None, 'EF.EXT4', 'Extension4 (BDN/SSC)'),
|
EF_EXT('6f55', None, 'EF.EXT4', 'Extension4 (BDN/SSC)'),
|
||||||
EF_CMI(),
|
EF_CMI(),
|
||||||
EF_UST('6f56', 0x05, 'EF.EST', 'Enabled Services Table', size={1,None}),
|
EF_UServiceTable('6f56', 0x05, 'EF.EST', 'Enabled Services Table', size={1,None}, table=EF_EST_map),
|
||||||
EF_ACL(),
|
EF_ACL(),
|
||||||
EF_DCK(),
|
EF_DCK(),
|
||||||
EF_CNL(),
|
EF_CNL(),
|
||||||
|
|
|
@ -26,7 +26,7 @@ from pySim.filesystem import *
|
||||||
from pySim.utils import *
|
from pySim.utils import *
|
||||||
from pySim.tlv import *
|
from pySim.tlv import *
|
||||||
from pySim.ts_51_011 import EF_AD, EF_SMS, EF_SMSS, EF_SMSR, EF_SMSP
|
from pySim.ts_51_011 import EF_AD, EF_SMS, EF_SMSS, EF_SMSR, EF_SMSP
|
||||||
from pySim.ts_31_102 import ADF_USIM, EF_FromPreferred
|
from pySim.ts_31_102 import ADF_USIM, EF_FromPreferred, EF_UServiceTable
|
||||||
import pySim.ts_102_221
|
import pySim.ts_102_221
|
||||||
from pySim.ts_102_221 import EF_ARR
|
from pySim.ts_102_221 import EF_ARR
|
||||||
|
|
||||||
|
@ -101,26 +101,6 @@ class EF_IMPU(LinFixedEF):
|
||||||
super().__init__(fid=fid, sfid=sfid, name=name, desc=desc)
|
super().__init__(fid=fid, sfid=sfid, name=name, desc=desc)
|
||||||
self._tlv = EF_IMPU.impu
|
self._tlv = EF_IMPU.impu
|
||||||
|
|
||||||
# TS 31.103 Section 4.2.7
|
|
||||||
class EF_IST(TransparentEF):
|
|
||||||
def __init__(self, fid='6f07', sfid=0x07, name='EF.IST', desc='ISIM Service Table'):
|
|
||||||
super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, size={1,4})
|
|
||||||
# add those commands to the general commands of a TransparentEF
|
|
||||||
self.shell_commands += [self.AddlShellCommands()]
|
|
||||||
|
|
||||||
@with_default_category('File-Specific Commands')
|
|
||||||
class AddlShellCommands(CommandSet):
|
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
|
|
||||||
def do_ist_service_activate(self, arg):
|
|
||||||
"""Activate a service within EF.IST"""
|
|
||||||
self._cmd.card.update_ist(int(arg), 1)
|
|
||||||
|
|
||||||
def do_ist_service_deactivate(self, arg):
|
|
||||||
"""Deactivate a service within EF.IST"""
|
|
||||||
self._cmd.card.update_ist(int(arg), 0)
|
|
||||||
|
|
||||||
# TS 31.103 Section 4.2.8
|
# TS 31.103 Section 4.2.8
|
||||||
class EF_PCSCF(LinFixedEF):
|
class EF_PCSCF(LinFixedEF):
|
||||||
def __init__(self, fid='6f09', sfid=None, name='EF.P-CSCF', desc='P-CSCF Address'):
|
def __init__(self, fid='6f09', sfid=None, name='EF.P-CSCF', desc='P-CSCF Address'):
|
||||||
|
@ -192,7 +172,7 @@ class ADF_ISIM(CardADF):
|
||||||
EF_IMPU(),
|
EF_IMPU(),
|
||||||
EF_AD(),
|
EF_AD(),
|
||||||
EF_ARR('6f06', 0x06),
|
EF_ARR('6f06', 0x06),
|
||||||
EF_IST(),
|
EF_UServiceTable('6f07', 0x07, 'EF.IST', 'ISIM Service Table', {1,None}, EF_IST_map),
|
||||||
EF_PCSCF(),
|
EF_PCSCF(),
|
||||||
EF_GBABP(),
|
EF_GBABP(),
|
||||||
EF_GBANL(),
|
EF_GBANL(),
|
||||||
|
|
Loading…
Reference in New Issue