"""Code related to the Card Application Toolkit (CAT) as described in mainly) ETSI TS 102 223, ETSI TS 101 220 and 3GPP TS 31.111.""" # (C) 2021 by Harald Welte # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . from pySim.tlv import * from pySim.construct import * from construct import * # Tag values as per TS 101 220 Table 7.23 # TS 102 223 Section 8.1 class Address(COMPR_TLV_IE, tag=0x06): _construct = Struct('ton_npi'/Int8ub, 'call_number'/BcdAdapter(Bytes(this._.total_len-1))) # TS 102 223 Section 8.2 class AlphaIdentifier(COMPR_TLV_IE, tag=0x05): # FIXME: like EF.ADN pass # TS 102 223 Section 8.3 class Subaddress(COMPR_TLV_IE, tag=0x08): pass # TS 102 223 Section 8.4 class CapabilityConfigParams(COMPR_TLV_IE, tag=0x07): pass # TS 31.111 Section 8.5 class CBSPage(COMPR_TLV_IE, tag=0x0C): pass # TS 102 223 Section 8.6 class CommandDetails(COMPR_TLV_IE, tag=0x01): _construct = Struct('command_number'/Int8ub, 'type_of_command'/Int8ub, 'command_qualifier'/Int8ub) # TS 102 223 Section 8.7 class DeviceIdentities(COMPR_TLV_IE, tag=0x82): DEV_IDS = bidict({ 0x01: 'keypad', 0x02: 'display', 0x03: 'earpiece', 0x10: 'addl_card_reader_0', 0x11: 'addl_card_reader_1', 0x12: 'addl_card_reader_2', 0x13: 'addl_card_reader_3', 0x14: 'addl_card_reader_4', 0x15: 'addl_card_reader_5', 0x16: 'addl_card_reader_6', 0x17: 'addl_card_reader_7', 0x21: 'channel_1', 0x22: 'channel_2', 0x23: 'channel_3', 0x24: 'channel_4', 0x25: 'channel_5', 0x26: 'channel_6', 0x27: 'channel_7', 0x31: 'ecat_client_1', 0x32: 'ecat_client_2', 0x33: 'ecat_client_3', 0x34: 'ecat_client_4', 0x35: 'ecat_client_5', 0x36: 'ecat_client_6', 0x37: 'ecat_client_7', 0x38: 'ecat_client_8', 0x39: 'ecat_client_9', 0x3a: 'ecat_client_a', 0x3b: 'ecat_client_b', 0x3c: 'ecat_client_c', 0x3d: 'ecat_client_d', 0x3e: 'ecat_client_e', 0x3f: 'ecat_client_f', 0x81: 'uicc', 0x82: 'terminal', 0x83: 'network', }) def _from_bytes(self, do: bytes): return {'source_dev_id': self.DEV_IDS[do[0]], 'dest_dev_id': self.DEV_IDS[do[1]]} def _to_bytes(self): src = self.DEV_IDS.inverse[self.decoded['source_dev_id']] dst = self.DEV_IDS.inverse[self.decoded['dest_dev_id']] return bytes([src, dst]) # TS 102 223 Section 8.8 class Duration(COMPR_TLV_IE, tag=0x04): _construct = Struct('time_unit'/Int8ub, 'time_interval'/Int8ub) # TS 102 223 Section 8.9 class Item(COMPR_TLV_IE, tag=0x0f): _construct = Struct('identifier'/Int8ub, 'text_string'/GsmStringAdapter(GreedyBytes)) # TS 102 223 Section 8.10 class ItemIdentifier(COMPR_TLV_IE, tag=0x10): _construct = Struct('identifier'/Int8ub) # TS 102 223 Section 8.11 class ResponseLength(COMPR_TLV_IE, tag=0x11): _construct = Struct('minimum_length'/Int8ub, 'maximum_length'/Int8ub) # TS 102 223 Section 8.12 class Result(COMPR_TLV_IE, tag=0x03): _construct = Struct('general_result'/Int8ub, 'additional_information'/HexAdapter(GreedyBytes)) # TS 102 223 Section 8.13 + TS 31.111 Section 8.13 class SMS_TPDU(COMPR_TLV_IE, tag=0x8B): _construct = Struct('tpdu'/HexAdapter(GreedyBytes)) # TS 102 223 Section 8.15 class TextString(COMPR_TLV_IE, tag=0x0d): _construct = Struct('dcs'/Int8ub, 'text_string'/HexAdapter(GreedyBytes)) # TS 102 223 Section 8.16 class Tone(COMPR_TLV_IE, tag=0x0e): _construct = Struct('tone'/Int8ub) # TS 31 111 Section 8.17 class USSDString(COMPR_TLV_IE, tag=0x0a): _construct = Struct('dcs'/Int8ub, 'ussd_string'/HexAdapter(GreedyBytes)) # TS 101 220 Table 7.17 class ProactiveCommand(BER_TLV_IE, tag=0xD0): pass # TS 101 220 Table 7.17 + 31.111 7.1.1.2 class SMSPPDownload(BER_TLV_IE, tag=0xD1, nested=[DeviceIdentities, Address, SMS_TPDU]): pass # TS 101 220 Table 7.17 + 31.111 7.1.1.3 class SMSCBDownload(BER_TLV_IE, tag=0xD2, nested=[DeviceIdentities, CBSPage]): pass class USSDDownload(BER_TLV_IE, tag=0xD9, nested=[DeviceIdentities, USSDString]): pass # reasonable default for playing with OTA # 010203040506070809101112131415161718192021222324252627282930313233 # '7fe1e10e000000000000001f43000000ff00000000000000000000000000000000' # TS 102 223 Section 5.2 term_prof_bits = { # first byte 1: 'Profile download', 2: 'SMS-PP data download', 3: 'Cell Broadcast data download', 4: 'Menu selection', 5: 'SMS-PP data download', 6: 'Timer expiration', 7: 'USSD string DO support in CC by USIM', 8: 'Call Control by NAA', # first byte 9: 'Command result', 10: 'Call Control by NAA', 11: 'Call Control by NAA', 12: 'MO short message control support', 13: 'Call Control by NAA', 14: 'UCS2 Entry supported', 15: 'UCS2 Display supported', 16: 'Display Text', # third byte 17: 'Proactive UICC: DISPLAY TEXT', 18: 'Proactive UICC: GET INKEY', 19: 'Proactive UICC: GET INPUT', 20: 'Proactive UICC: MORE TIME', 21: 'Proactive UICC: PLAY TONE', 22: 'Proactive UICC: POLL INTERVAL', 23: 'Proactive UICC: POLLING OFF', 24: 'Proactive UICC: REFRESH', # fourth byte 25: 'Proactive UICC: SELECT ITEM', 26: 'Proactive UICC: SEND SHORT MESSAGE with 3GPP-SMS-TPDU', 27: 'Proactive UICC: SEND SS', 28: 'Proactive UICC: SEND USSD', 29: 'Proactive UICC: SET UP CALL', 30: 'Proactive UICC: SET UP MENU', 31: 'Proactive UICC: PROVIDE LOCAL INFORMATION (MCC, MNC, LAC, Cell ID & IMEI)', 32: 'Proactive UICC: PROVIDE LOCAL INFORMATION (NMR)', # fifth byte 33: 'Proactive UICC: SET UP EVENT LIST', 34: 'Event: MT call', 35: 'Event: Call connected', 36: 'Event: Call disconnected', 37: 'Event: Location status', 38: 'Event: User activity', 39: 'Event: Idle screen available', 40: 'Event: Card reader status', # sixth byte 41: 'Event: Language selection', 42: 'Event: Browser Termination', 43: 'Event: Data aailable', 44: 'Event: Channel status', 45: 'Event: Access Technology Change', 46: 'Event: Display parameters changed', 47: 'Event: Local Connection', 48: 'Event: Network Search Mode Change', # seventh byte 49: 'Proactive UICC: POWER ON CARD', 50: 'Proactive UICC: POWER OFF CARD', 51: 'Proactive UICC: PERFORM CARD RESET', 52: 'Proactive UICC: GET READER STATUS (Card reader status)', 53: 'Proactive UICC: GET READER STATUS (Card reader identifier)', # RFU: 3 bit (54,55,56) # eighth byte 57: 'Proactive UICC: TIMER MANAGEMENT (start, stop)', 58: 'Proactive UICC: TIMER MANAGEMENT (get current value)', 59: 'Proactive UICC: PROVIDE LOCAL INFORMATION (date, time and time zone)', 60: 'GET INKEY', 61: 'SET UP IDLE MODE TEXT', 62: 'RUN AT COMMAND', 63: 'SETUP CALL', 64: 'Call Control by NAA', # ninth byte 65: 'DISPLAY TEXT', 66: 'SEND DTMF command', 67: 'Proactive UICC: PROVIDE LOCAL INFORMATION (NMR)', 68: 'Proactive UICC: PROVIDE LOCAL INFORMATION (language)', 69: 'Proactive UICC: PROVIDE LOCAL INFORMATION (Timing Advance)', 70: 'Proactive UICC: LANGUAGE NOTIFICATION', 71: 'Proactive UICC: LAUNCH BROWSER', 72: 'Proactive UICC: PROVIDE LOCAL INFORMATION (Access Technology)', # tenth byte 73: 'Soft keys support for SELECT ITEM', 74: 'Soft keys support for SET UP MENU ITEM', # RFU: 6 bit (75-80) # eleventh byte: max number of soft keys as 8bit value (81..88) # twelfth byte 89: 'Proactive UICC: OPEN CHANNEL', 90: 'Proactive UICC: CLOSE CHANNEL', 91: 'Proactive UICC: RECEIVE DATA', 92: 'Proactive UICC: SEND DATA', 93: 'Proactive UICC: GET CHANNEL STATUS', 94: 'Proactive UICC: SERVICE SEARCH', 95: 'Proactive UICC: GET SERVICE INFORMATION', 96: 'Proactive UICC: DECLARE SERVICE', # thirteenth byte 97: 'BIP supported Bearer: CSD', 98: 'BIP supported Bearer: GPRS', 99: 'BIP supported Bearer: Bluetooth', 100: 'BIP supported Bearer: IrDA', 101: 'BIP supported Bearer: RS232', # 3 bits: number of channels supported (102..104) # fourtheenth byte (screen height) # fifteenth byte (screen width) # sixeenth byte (screen effects) # seventeenth byte (BIP supported bearers) 129: 'BIP: TCP, UICC in client mode, remote connection', 130: 'BIP: UDP, UICC in client mode, remote connection', 131: 'BIP: TCP, UICC in server mode', 132: 'BIP: TCP, UICC in client mode, local connection', 133: 'BIP: UDP, UICC in client mode, local connection', 134: 'BIP: direct communication channel', # 2 bits reserved: 135, 136 # FIXME: remainder }