pycrate/pycrate_mobile/TS23041_CBS.py

195 lines
9.1 KiB
Python

# -*- coding: UTF-8 -*-
#/**
# * Software Name : pycrate
# * Version : 0.4
# *
# * Copyright 2017. Benoit Michau. ANSSI.
# *
# * This library is free software; you can redistribute it and/or
# * modify it under the terms of the GNU Lesser General Public
# * License as published by the Free Software Foundation; either
# * version 2.1 of the License, or (at your option) any later version.
# *
# * This library 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
# * Lesser General Public License for more details.
# *
# * You should have received a copy of the GNU Lesser General Public
# * License along with this library; if not, write to the Free Software
# * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# * MA 02110-1301 USA
# *
# *--------------------------------------------------------
# * File Name : pycrate_mobile/TS23041_CBS.py
# * Created : 2018-02-22
# * Authors : Benoit Michau
# *--------------------------------------------------------
#*/
__all__ = [
'CBSWarningType_dict',
'CBSWarningType',
'CBSWarningSecurityInfo',
'CBS_MessageId_dict',
'encode_cbs_pages'
]
#------------------------------------------------------------------------------#
# 3GPP TS 23.041: Cell Broadcast Service
# release 13 (d30)
#------------------------------------------------------------------------------#
from struct import pack, unpack
from pycrate_core.elt import *
from pycrate_core.base import *
from .TS23038 import *
from .TS23040_SMS import TP_SCTS
#------------------------------------------------------------------------------#
# Warning Type
# TS 23.041, section 9.3.24
#------------------------------------------------------------------------------#
CBSWarningType_dict = {
0 : 'Earthquake',
1 : 'Tsunami',
2 : 'Earthquake and Tsunami',
3 : 'Test',
4 : 'Other'
#5-0x7f: future use
}
class CBSWarningType(Envelope):
_GEN = (
Uint('Value', bl=7, dic=CBSWarningType_dict),
Uint('EmergencyUserAlert', bl=1),
Uint('Popup', bl=1),
Uint('pad', bl=7, rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# Warning-Security-Information
# TS 23.041, section 9.3.25
#------------------------------------------------------------------------------#
class CBSWarningSecurityInfo(Envelope):
_GEN = (
TP_SCTS(),
Buf('DigitalSignature', bl=344, rep=REPR_HEX)
)
#------------------------------------------------------------------------------#
# Message Identifier
# TS 23.041, section 9.4.1.2.2
#------------------------------------------------------------------------------#
CBS_MessageId_dict = {
#0-999: GSMA reserved
1000 : 'LCS CBS for E-OTD Assistance Data',
1001 : 'LCS CBS for GPS Ephemeris and Clock Correction Data',
1002 : 'LCS CBS for GPS Ephemeris and Clock Correction Data',
1003 : 'LCS CBS for GPS Almanac and Other Data',
#1004-4095: future use
#4096-4223: reserved for unsecure SIM download (!)
#4224-4351: reserved for secured SIM download
4352: 'ETWS CBS for earthquake warning',
4353: 'ETWS CBS for tsunami warning',
4354: 'ETWS CBS for earthquake and tsunami combined warning',
4355: 'ETWS CBS for test', # silently discarded by the UE
4356: 'ETWS CBS related to other emergency types',
#4357-4369: future use
4370: 'CMAS CBS for CMAS Presidential Level Alerts',
# also EU-Alert Level 1 / Korean Public Alert System (KPAS) Class 0, not settable by MMI
4371: 'CMAS CBS for CMAS Extreme Alerts with Severity of Extreme, Urgency of Immediate, and Certainty of Observed',
# also EU-Alert Level 2 / Korean Public Alert System (KPAS) Class 1
4372: 'CMAS CBS for CMAS Extreme Alerts with Severity of Extreme, Urgency of Immediate, and Certainty of Likely',
# also EU-Alert Level 2 / Korean Public Alert System (KPAS) Class 1
4373: 'CMAS CBS for CMAS Severe Alerts with Severity of Extreme, Urgency of Expected, and Certainty of Observed',
# also EU-Alert Level 3 / Korean Public Alert System (KPAS) Class 1
4374: 'CMAS CBS for CMAS Severe Alerts with Severity of Extreme, Urgency of Expected, and Certainty of Likely',
# also EU-Alert Level 3 / Korean Public Alert System (KPAS) Class 1
4375: 'CMAS CBS for CMAS Severe Alerts with Severity of Severe, Urgency of Immediate, and Certainty of Observed',
# also EU-Alert Level 3 / Korean Public Alert System (KPAS) Class 1
4376: 'CMAS CBS for CMAS Severe Alerts with Severity of Severe, Urgency of Immediate, and Certainty of Likely',
# also EU-Alert Level 3 / Korean Public Alert System (KPAS) Class 1
4377: 'CMAS CBS for CMAS Severe Alerts with Severity of Severe, Urgency of Expected, and Certainty of Observed',
# also EU-Alert Level 3 / Korean Public Alert System (KPAS) Class 1
4378: 'CMAS CBS for CMAS Severe Alerts with Severity of Severe, Urgency of Expected, and Certainty of Likely',
# also EU-Alert Level 3 / Korean Public Alert System (KPAS) Class 1
4379: 'CMAS CBS for Child Abduction Emergency (Amber Alert)',
# also EU-Amber / Korean Public Alert System (KPAS) Class 1
4380: 'CMAS CBS for the Required Monthly Test',
4381: 'CMAS CBS for CMAS Exercise',
4382: 'CMAS CBS for operator defined use',
4383: 'CMAS CBS for CMAS Presidential Level Alerts for additional languages',
# also EU-Alert Level 1 / Korean Public Alert System (KPAS) Class 0, not settable by MMI
4384: 'CMAS CBS for CMAS Extreme Alerts with Severity of Extreme, Urgency of Immediate, and Certainty of Observed for additional languages',
# also EU-Alert Level 2 / Korean Public Alert System (KPAS) Class 1
4385: 'CMAS CBS for CMAS Extreme Alerts with Severity of Extreme, Urgency of Immediate, and Certainty of Likely for additional languages',
# also EU-Alert Level 2 / Korean Public Alert System (KPAS) Class 1
4386: 'CMAS CBS for CMAS Severe Alerts with Severity of Extreme, Urgency of Expected, and Certainty of Observed for additional languages',
# also EU-Alert Level 3 / Korean Public Alert System (KPAS) Class 1
4387: 'CMAS CBS for CMAS Severe Alerts with Severity of Extreme, Urgency of Expected, and Certainty of Likely for additional languages',
# also EU-Alert Level 3 / Korean Public Alert System (KPAS) Class 1
4388: 'CMAS CBS for CMAS Severe Alerts with Severity of Severe, Urgency of Immediate, and Certainty of Observed for additional languages',
# also EU-Alert Level 3 / Korean Public Alert System (KPAS) Class 1
4389: 'CMAS CBS for CMAS Severe Alerts with Severity of Severe, Urgency of Immediate, and Certainty of Likely for additional languages',
# also EU-Alert Level 3 / Korean Public Alert System (KPAS) Class 1
4390: 'CMAS CBS for CMAS Severe Alerts with Severity of Severe, Urgency of Expected, and Certainty of Observed for additional languages',
# also EU-Alert Level 3 / Korean Public Alert System (KPAS) Class 1
4391: 'CMAS CBS for CMAS Severe Alerts with Severity of Severe, Urgency of Expected, and Certainty of Likely for additional languages',
# also EU-Alert Level 3 / Korean Public Alert System (KPAS) Class 1
4392: 'CMAS CBS for Child Abduction Emergency (Amber Alert) for additional languages',
# also EU-Amber / Korean Public Alert System (KPAS) Class 1
4393: 'CMAS CBS for the Required Monthly Test for additional languages',
4394: 'CMAS CBS for CMAS Exercise for additional languages',
4395: 'CMAS CBS for operator defined use for additional languages',
#4396-4399: future CMA / EU-Alert
#4400-6399: future PWS
6400: 'EU-Info for the local language',
#6401-40959: future use
#40960-45055: operator specific
#45056-65534: future operator specific
65535: 'reserved', # used with SIM, not settable by MMI
}
#------------------------------------------------------------------------------#
# Warning Message Content E-UTRAN
# TS 23.041, section 9.3.35
#------------------------------------------------------------------------------#
def encode_cbs_pages(msg, dcs7b=True, char_preamb=''):
"""translates the unicode string `msg' into a buffer containing page(s)
ready for broadcast
dcs7b: True, encode in GSM 7 bit characters
False, encode in UCS-2
char_preamb: to add a potential prefix for specifying the language of the
message (e.g. "EN", "FR" or "DE")
"""
if dcs7b:
# char_preamb should be 2 chars (e.g. EN) followed by a CR
pages = encode_7b_cbs(char_preamb + '\r' + msg)
else:
# char_preamb should be 2 chars, encoded in GSM 7 bits and padded
txt = encode_7b(char_preamb)[0] + msg.encode('utf-16')
# check number of pages needed
num = len(txt) // 82
if len(txt) % 82:
num += 1
pages = [txt[i*82:(i+1)*82] for i in range(0, num)]
buf = [pack('>B', len(pages))]
for page, page_len in pages:
buf.append(page)
buf.append(pack('>B', page_len))
return b''.join(buf)