86 lines
3.0 KiB
Python
86 lines
3.0 KiB
Python
# -*- coding: UTF-8 -*-
|
|
#/**
|
|
# * Software Name : pycrate
|
|
# * Version : 0.4
|
|
# *
|
|
# * Copyright 2019. Benoit Michau. P1Sec.
|
|
# *
|
|
# * 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/TS31115.py
|
|
# * Created : 2019-07-19
|
|
# * Authors : Benoit Michau
|
|
# *--------------------------------------------------------
|
|
#*/
|
|
#
|
|
# Implement parts of 3GPP TS 31.115
|
|
# Secured packet structure for (Universal) Subscriber Identity Module (U)SIM Toolkit applications
|
|
|
|
from pycrate_mobile.TS102225 import *
|
|
|
|
|
|
# 4.2 Structure of the Command Packet contained in a Single Short Message Point to Point
|
|
|
|
class PacketCmdSMSPP(Envelope):
|
|
_GEN = (
|
|
Uint16('CmdPacketLen'),
|
|
Uint8('CmdHeaderLen'),
|
|
SPI(),
|
|
KIc(),
|
|
Alt('KID', GEN={
|
|
0 : Uint8('NoIntegrity', val=0),
|
|
1 : KID_RC(),
|
|
2 : KID_CC(),
|
|
3 : KID_DS()
|
|
},
|
|
DEFAULT=Uint8('NoIntegrity', val=0, bl=0),
|
|
sel=lambda self: self.get_env()['SPI']['IntegrityType']()),
|
|
Uint24('TAR', rep=REPR_HEX, dic=TAR_dict),
|
|
Uint('CNTR', bl=40),
|
|
Uint8('PCNTR'),
|
|
Buf('IntegrityCheck', rep=REPR_HEX),
|
|
Buf('Data', rep=REPR_HEX),
|
|
)
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
Envelope.__init__(self, *args, **kwargs)
|
|
self[0].set_valauto(lambda: 1 + self[1]() + self[-1].get_len())
|
|
self[1].set_valauto(lambda: 13 + self[-2].get_len())
|
|
self[-2].set_blauto(lambda: 8 * max(0, self[1]() - 13))
|
|
self[-1].set_blauto(lambda: 8 * max(0, self[0]() - self[1]() - 1))
|
|
|
|
|
|
class PacketRespSMSPP(Envelope):
|
|
_GEN = (
|
|
Uint16('RespPacketLen'),
|
|
Uint8('RespHeaderLen'),
|
|
Uint24('TAR', rep=REPR_HEX, dic=TAR_dict),
|
|
Uint('CNTR', bl=40),
|
|
Uint8('PCNTR'),
|
|
Uint8('Status', dic=RespStatus_dict),
|
|
Buf('IntegrityCheck', rep=REPR_HEX),
|
|
Buf('Data', rep=REPR_HEX),
|
|
)
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
Envelope.__init__(self, *args, **kwargs)
|
|
self[0].set_valauto(lambda: 1 + self[1]() + self[-1].get_len())
|
|
self[1].set_valauto(lambda: 10 + self[-2].get_len())
|
|
self[-2].set_blauto(lambda: 8 * max(0, self[1]() - 10))
|
|
self[-1].set_blauto(lambda: 8 * max(0, self[0]() - self[1]() - 1))
|
|
|