
    ei.                        d Z ddlmZ ddlmZmZ ddlmZmZm	Z	m
Z
mZmZmZ ddlmZmZmZmZmZmZmZ ddlmZ ddlmZmZ ddlmZmZ dd	lmZmZmZm Z   G d
 de          Z! G d d          Z" G d de          Z# G d d          Z$dS )z
This is an encoder/decoder implementation for the Osmocom GSUP
protocol, built upon the osmocom.tlv and osmocom.construct
infrastructure.
    )IntEnum)TupleUnion)Int8ubInt32ubByteBytesGreedyBytesBitsIntegerGreedyString)thisStruct	BitStructEnumGreedyRangeDefaultSwitch)Optional)TLV_IETLV_IE_Collection)TonNpiOsmoRatType)PaddedBcdAdapter
DnsAdapterIpv4AdapterIpv6Adapterc                       e Zd ZdZededeeef         fd            Zededeeef         fd            Z	defdZ
dedefdZd	S )
GSUP_TLV_IEzxClass representing the TLV format as used in Osmocom GSUP. It's a simple
    '8-bit tag / 8-bit length / value' variant.doreturnc                 &    |d         |dd          fS Nr       clsr   s     d/home/jenkins/workspace/simtester-sanitize/venv/lib/python3.11/site-packages/osmocom/gsup/message.py_parse_tag_rawzGSUP_TLV_IE._parse_tag_raw(       !ubf}    c                 &    |d         |dd          fS r"   r$   r%   s     r'   
_parse_lenzGSUP_TLV_IE._parse_len,   r)   r*   c                 ,    t          | j        g          S N)bytestagselfs    r'   _encode_tagzGSUP_TLV_IE._encode_tag0   s    dhZ   r*   valc                 <    t          t          |          g          S r.   )r/   len)r2   r4   s     r'   _encode_lenzGSUP_TLV_IE._encode_len3   s    c#hhZ   r*   N)__name__
__module____qualname____doc__classmethodr/   r   intr(   r,   r3   r7   r$   r*   r'   r   r   $   s        3 3  %U
*;    [ E eCJ&7    [!U ! ! ! !!u ! ! ! ! ! ! !r*   r   c                      e Zd ZdZ G d d          Z G d d          Z G d ded	          Z G d
 ded	          Z G d dedej	        ej
        ej        ej        ej        ej        ej        g          Z G d ded	          Z G d dedej        ej        ej        ej        ej        g          Z G d ded	          Z G d ded	          Z G d ded	          Z G d  d!ed"	          Z G d# d$ed%	          Z G d& d'ed(	          Z G d) d*ed+	          Z G d, d-ed.	          Z G d/ d0ed1	          Z  G d2 d3ed4	          Z! G d5 d6ed7	          Z" G d8 d9ed:	          Z# G d; d<ed=	          Z$ G d> d?ed@	          Z% G dA dBedC	          Z& G dD dEedF	          Z' G dG dHedI	          Z( G dJ dKedL	          Z) G dM dNedO	          Z* G dP dQedR	          Z+ G dS dTedU	          Z, G dV dWedX	          Z- G dY dZed[	          Z. G d\ d]ed^	          Z/ G d_ d`eda	          Z0 G db dcedd	          Z1 G de dfedg	          Z2 G dh diedj	          Z3 G dk dle4g eeeeeeeeeeeeee e!e"e#e$e&e'e(e)e*e+e,e-e.e/e0e1e2e3ej	        ej5        m          Z6dnS )otlvzTLV definitions for the GSUP IEs, utilizing the osmocom.tlv code. Keep this in sync with
    https://gitea.osmocom.org/osmocom/libosmocore/src/branch/master/include/osmocom/gsm/gsup.hc                      e Zd ZdZ G d ded          Z G d ded          Z G d	 d
ed          Z G d ded          Z G d ded          Z	 G d ded          Z
 G d ded          Z G d ded          ZdS )tlv.authz$Nested TLV IEs within the AuthTuple.c                       e Zd ZeZdS )tlv.auth.RANDNr8   r9   r:   r
   
_constructr$   r*   r'   RANDrC   <           $JJJr*   rF       r0   c                       e Zd ZeZdS )tlv.auth.SRESNrD   r$   r*   r'   SRESrK   ?   rG   r*   rL   !   c                       e Zd ZeZdS )tlv.auth.KcNrD   r$   r*   r'   KcrO   B   rG   r*   rP   "   c                       e Zd ZeZdS )tlv.auth.IKNrD   r$   r*   r'   IKrS   E   rG   r*   rT   #   c                       e Zd ZeZdS )tlv.auth.CKNrD   r$   r*   r'   CKrW   H   rG   r*   rX   $   c                       e Zd ZeZdS )tlv.auth.AUTNNrD   r$   r*   r'   AUTNr[   K   rG   r*   r\   %   c                       e Zd ZeZdS )tlv.auth.AUTSNrD   r$   r*   r'   AUTSr_   N   rG   r*   r`   &   c                       e Zd ZeZdS )tlv.auth.RESNrD   r$   r*   r'   RESrc   Q   rG   r*   rd   '   N)r8   r9   r:   r;   r   rF   rL   rP   rT   rX   r\   r`   rd   r$   r*   r'   authrA   :   s       22	% 	% 	% 	% 	%;D 	% 	% 	% 	%	% 	% 	% 	% 	%;D 	% 	% 	% 	%	% 	% 	% 	% 	%$ 	% 	% 	% 	%	% 	% 	% 	% 	%$ 	% 	% 	% 	%	% 	% 	% 	% 	%$ 	% 	% 	% 	%	% 	% 	% 	% 	%;D 	% 	% 	% 	%	% 	% 	% 	% 	%;D 	% 	% 	% 	%	% 	% 	% 	% 	%+4 	% 	% 	% 	% 	% 	%r*   rf   c                       e Zd ZdZ G d ded          Z G d ded          Z G d	 d
ed          Z G d ded          Z G d ded          Z	dS )tlv.pdpz"Nested TLV IEs within the PdpInfo.c                       e Zd ZeZdS )tlv.pdp.PdpContextIdNr8   r9   r:   r   rE   r$   r*   r'   PdpContextIdrj   V   s        JJJr*   rl      rI   c                      e Zd Z ed ed e ed          d          z  d e ed          d          z  d e ed	          d
dd          z            z  d e e	e
j        j         e ed                     e ed                     ed e ed                    z  d e ed                    z            d                    z            ZdS )tlv.pdp.PdpAddresshdr_spare      pdp_type_orgr#   )ietfpdp_type_nr   rM   W      )ipv4ipv6ipv4v6addressrm   rz   r{   N)r8   r9   r:   r   r   r   r   r   	COptionalr   r   rp   rv   r   r	   r   rE   r$   r*   r'   
PdpAddressro   Y   s^       iiQQT9U9U0U0>ttKKPQNNYZ?[?[?[0[0=dd;;q>>X\cgJN?P ?P ?P 1P'Q 'Q !Q !*))FF48;O:E+eeAhh:O:O:E+eeBii:P:P<BF6++V[V[\]V^V^J_J_C_CI++V[V[\^V_V_J`J`C`=b =b2c 2c5d 5d +e +e !e	f fJJJr*   r      c                   $    e Zd Z ee          ZdS )tlv.pdp.AccessPointNameN)r8   r9   r:   r   r
   rE   r$   r*   r'   AccessPointNamer   e   s        #K00JJJr*   r      c                       e Zd ZeZdS )tlv.pdp.QosNrD   r$   r*   r'   Qosr   h   rG   r*   r      c                   V    e Zd Z ed ed          z  d ed          z            ZdS )"tlv.pdp.PdpChargingCharacteristicsprofile_indexrr   	behaviour   N)r8   r9   r:   r   r   rE   r$   r*   r'   PdpChargingCharacteristicsr   k   s:        "?;;q>>#A;{{[]C^__JJJr*   r      N)
r8   r9   r:   r;   r   rl   r   r   r   r   r$   r*   r'   pdprh   T   s#       00	  	  	  	  	 ;D 	  	  	  	 		f 		f 		f 		f 		f$ 		f 		f 		f 		f	1 	1 	1 	1 	1kt 	1 	1 	1 	1	% 	% 	% 	% 	%+4 	% 	% 	% 	%	` 	` 	` 	` 	`$ 	` 	` 	` 	` 	` 	`r*   r   c                   $    e Zd Z ee          ZdS )tlv.IMSIN)r8   r9   r:   r   r
   rE   r$   r*   r'   IMSIr   n   s        %%k22


r*   r   r#   rI   c                       e Zd ZeZdS )	tlv.CauseNrk   r$   r*   r'   Causer   q           


r*   r      c                       e Zd ZdS )tlv.AuthTupleNr8   r9   r:   r$   r*   r'   	AuthTupler   v           r*   r      )r0   nestedc                       e Zd ZdZdS )tlv.PdpInfoComplNr8   r9   r:   rE   r$   r*   r'   PdpInfoComplr   z           


r*   r   rr   c                       e Zd ZdS )tlv.PdpInfoNr   r$   r*   r'   PdpInfor   }   r   r*   r      c                   *    e Zd Z eedd          ZdS )tlv.CancelTyper   r#   )updatewithdrawNr8   r9   r:   r   r   rE   r$   r*   r'   
CancelTyper      s$        T&Q777


r*   r      c                       e Zd ZdZdS )tlv.FreezePTMSINr   r$   r*   r'   FreezePTMSIr      r   r*   r      c            	       `    e Zd Z edez  d e eej                            z            Z	dS )
tlv.MSISDNbcd_lendigitsN
r8   r9   r:   r   r   r   r	   r   r   rE   r$   r*   r'   MSISDNr      @        VIdNH5E5EeeDLFYFY5Z5Z,Z[[


r*   r   rw   c                   D    e Zd Z edez  d ee          z            ZdS )tlv.HlrNumberton_npir   Nr8   r9   r:   r   r   r   r
   rE   r$   r*   r'   	HlrNumberr      5        VIf,h7G7G7T7T.TUU


r*   r   	   c                   0    e Zd Z eeddddd          ZdS )tlv.MessageClassr#   r   r   rr   r   )subscriber_managementsmsussd	inter_msc
ipsec_epdgNr   r$   r*   r'   MessageClassr      s,        T&qqTUbcddd


r*   r   
   c                       e Zd ZeZdS )tlv.PCONrD   r$   r*   r'   PCOr               


r*   r      c                   *    e Zd Z eedd          ZdS )tlv.CnDomainr#   r   )pscsN)r8   r9   r:   r   r   rE   r$   r*   r'   CnDomainr      s$        T$1+++


r*   r   (   c                       e Zd ZeZdS )tlv.SupportedRatTypesN)r8   r9   r:   r   rE   r$   r*   r'   SupportedRatTypesr      r   r*   r   )   c                   $    e Zd Z ee          ZdS )tlv.CurrentRatTypeN)r8   r9   r:   r   r   rE   r$   r*   r'   CurrentRatTyper      s         [--


r*   r   *   c                       e Zd ZeZdS )tlv.SessionIdN)r8   r9   r:   r   rE   r$   r*   r'   	SessionIdr      s        


r*   r   0   c                   .    e Zd Z eedddd          ZdS )tlv.SessionStater   r#   r   r   )	undefinedbeginContinueendNr   r$   r*   r'   SessionStater      s(        T&AQJJJ


r*   r   1   c                       e Zd ZeZdS )tlv.SupplementaryServiceInfoNrD   r$   r*   r'   SupplementaryServiceInfor      r   r*   r   5   c                       e Zd ZeZdS )
tlv.SmRpMrNrk   r$   r*   r'   SmRpMrr      r   r*   r   @   c                   D    e Zd Z edez  d ee          z            ZdS )
tlv.SmRpDar   r   Nr   r$   r*   r'   SmRpDar      r   r*   r   A   c                   D    e Zd Z edez  d ee          z            ZdS )
tlv.SmRpOar   r   Nr   r$   r*   r'   SmRpOar      r   r*   r   B   c                       e Zd ZeZdS )
tlv.SmRpUiNrD   r$   r*   r'   SmRpUir      r   r*   r   C   c                       e Zd ZeZdS )tlv.SmRpCauseNrk   r$   r*   r'   	SmRpCauser      r   r*   r   D   c                       e Zd ZdZdS )tlv.SmRpMmsNr   r$   r*   r'   SmRpMmsr     r   r*   r  E   c                   *    e Zd Z eedd          ZdS )tlv.SmAlertr#   r   )
ms_presentmemory_availableNr   r$   r*   r'   SmAlertr     s$        T&QCCC


r*   r
  F   c            	       `    e Zd Z edez  d e eej                            z            Z	dS )tlv.IMEIr   r   Nr   r$   r*   r'   IMEIr     r   r*   r  P   c                   *    e Zd Z eedd          ZdS )tlv.ImeiCheckResultr   r#   )acknackNr   r$   r*   r'   ImeiCheckResultr     s$        T&aa000


r*   r  Q   c                       e Zd ZeZdS )tlv.NumVectorsReqNrk   r$   r*   r'   NumVectorsReqr     r   r*   r  R   c                   $    e Zd Z ed          ZdS )tlv.SourceNameasciiNr8   r9   r:   r   rE   r$   r*   r'   
SourceNamer             !\'**


r*   r  `   c                   $    e Zd Z ed          ZdS )tlv.DestinationNamer  Nr  r$   r*   r'   DestinationNamer"     r  r*   r#  a   c                   J    e Zd Z ed eedd          z  dez            ZdS )
tlv.AnApduprotocolr#   r   )bssapranapdataN)r8   r9   r:   r   r   r   r
   rE   r$   r*   r'   AnApdur&     s?        VJttF!1'E'E'EE";.0 0


r*   r+  b   c                       e Zd ZeZdS )tlv.CauseRrNrk   r$   r*   r'   CauseRrr.     r   r*   r/  c   c                       e Zd ZeZdS )tlv.CauseBssapNrk   r$   r*   r'   
CauseBssapr2     r   r*   r3  d   c                       e Zd ZeZdS )tlv.CauseSmNrk   r$   r*   r'   CauseSmr6     r   r*   r7  e   c                       e Zd ZdS )tlv.IeCollectionNr   r$   r*   r'   IeCollectionr:     s         	r*   r;  )r   N)7r8   r9   r:   r;   rf   r   r   r   r   rF   rL   rP   rT   rX   r\   rd   r   r   rl   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r
  r  r  r  r  r#  r+  r/  r3  r7  r   r`   r;  r$   r*   r'   r?   r?   7   s       b b% % % % % % % %4` ` ` ` ` ` ` `43 3 3 3 3{ 3 3 3 3        
    KT49diRVRY377DItx3Q        {        +41A3>SVSf14#:X1Z    8 8 8 8 8[d 8 8 8 8    kt    \ \ \ \ \$ \ \ \ \V V V V VKT V V V Ve e e e e{ e e e e! ! ! ! !kt ! ! ! !, , , , ,;D , , , ,! ! ! ! !KT ! ! ! !. . . . .$ . . . .    KT    K K K K K{ K K K K! ! ! ! !;D ! ! ! !    $    V V V V V$ V V V VV V V V V$ V V V V! ! ! ! !$ ! ! ! !    KT        +4    D D D D D+4 D D D D\ \ \ \ \{ \ \ \ \1 1 1 1 1+4 1 1 1 1        + + + + +[d + + + ++ + + + ++4 + + + +0 0 0 0 0$ 0 0 0 0    +4        [d        +4        ( 2Q$ 2Q 2Qy 2Q, 2QX_ 2Qak 2Q2=2Q?E2QGP2QR^2Q`c2Qem2Q2C2QES2QU^2Q`l2Q 3K2Q MS2Q U[2Q ]c2Q en2Q 3:	2Q <C	2Q EI	2Q KZ	2Q \i	2Q
 3=2Q
 ?N2Q
 PV2Q
 X_2Q
 ak2Q 3:2Q <@92Q GKi2Q      r*   r?   c                       e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)d(Z*d)Z+d*Z,d+Z-d,Z.d-Z/d.Z0d/Z1d0Z2d1Z3d2Z4d3Z5d4Z6d5S )6MsgTypezGSUP protocol message type. Keep this in sync with
    https://gitea.osmocom.org/osmocom/libosmocore/src/branch/master/include/osmocom/gsm/gsup.hrr   r   r   rw   r   r      r         rm   r   r   r   r               rH   rM   rQ   rY   r]   ra   r   r   r   ,   -   .   r   r   2   4   r   6   8   9   :   <   =   >   r   r  G   K   N   r  r  r  N)7r8   r9   r:   r;   UPDATE_LOCATION_REQUESTUPDATE_LOCATION_ERRORUPDATE_LOCATION_RESULTSEND_AUTH_INFO_REQUESTSEND_AUTH_INFO_ERRORSEND_AUTH_INFO_RESULTAUTH_FAIL_REPORTPURGE_MS_REQUESTPURGE_MS_ERRORPURGE_MS_RESULTINSERT_DATA_REQUESTINSERT_DATA_ERRORINSERT_DATA_RESULTDELETE_DATA_REQUESTDELETE_DATA_ERRORDELETE_DATA_RESULTLOCATION_CANCEL_REQUESTLOCATION_CANCEL_ERRORLOCATION_CANCEL_RESULTPROC_SS_REQUESTPROC_SS_ERRORPROC_SS_RESULTMO_FORWARD_SM_REQUESTMO_FORWARD_SM_ERRORMO_FORWARD_SM_RESULTMT_FORWARD_SM_REQUESTMT_FORWARD_SM_ERRORMT_FORWARD_SM_RESULTREADY_FOR_SM_REQUESTREADY_FOR_SM_ERRORREADY_FOR_SM_RESULTCHECK_IMEI_REQUESTCHECK_IMEI_ERRORCHECK_IMEI_RESULTE_PREPARE_HANDOVER_REQUESTE_PREPARE_HANDOVER_ERRORE_PREPARE_HANDOVER_RESULT%E_PREPARE_SUBSEQUENT_HANDOVER_REQUEST#E_PREPARE_SUBSEQUENT_HANDOVER_ERROR$E_PREPARE_SUBSEQUENT_HANDOVER_RESULTE_SEND_END_SIGNAL_REQUESTE_SEND_END_SIGNAL_ERRORE_SEND_END_SIGNAL_RESULT#E_PROCESS_ACCESS_SIGNALLING_REQUEST#E_FORWARD_ACCESS_SIGNALLING_REQUESTE_CLOSEE_ABORTROUTING_ERROREPDG_TUNNEL_REQUESTEPDG_TUNNEL_ERROREPDG_TUNNEL_RESULTr$   r*   r'   r=  r=     sH       b b #""""""""N"O""""""""""O"M"N""""""""""""&*&*&*.2).2'.2(&*&*&*-1'-1'"G"G"M"""r*   r=  c                       e Zd ZdZdeeef         fdZdefdZ	defdZ
ededd fd            Zed	edd fd
            Zd Zd ZdS )GsupMessagez5Represents a single message within the GSUP protocol.msg_typec                     t          |t                    r|| _        nt          |          | _        t                                          | _        d S r.   )
isinstancer=  r  r?   r;  ies)r2   r  s     r'   __init__zGsupMessage.__init__,  sC    h(( 	.$DMM#H--DM##%%r*   r    c                 Z    | j         j        d| j        dt          | j                  dS N(z, )	__class__r8   r  strr  r1   s    r'   __str__zGsupMessage.__str__3  ,    #~666s48}}}}UUr*   c                 Z    | j         j        d| j        dt          | j                  dS r  r  r1   s    r'   __repr__zGsupMessage.__repr__6  r  r*   encodedc                 t    t          |d                   }|j                            |dd                    |S )zACreate a GsupMessage instance from the decode of the given bytes.r   r#   N)r  r  
from_bytes)r&   r  msgs      r'   r  zGsupMessage.from_bytes9  s8     '!*%%7122;'''
r*   decodedc                     t          t          |d                            }|j                            |d                    |S )z4Create a GsupMessage instance from the decoded dict.r  r  )r  r=  r  	from_dict)r&   r  r  s      r'   r  zGsupMessage.from_dict@  s:     ''*"5677'%.)))
r*   c                 j    t          | j        j        g          | j                                        z   S )z)Encode a GsupMessage instance into bytes.)r/   r  valuer  to_bytesr1   s    r'   r  zGsupMessage.to_bytesG  s+    dm)*++dh.?.?.A.AAAr*   c                 N    | j         j        | j                                        dS )z<Encode a GsupMessage instance into a json-serializable dict.)r  r  )r  namer  to_dictr1   s    r'   r  zGsupMessage.to_dictK  s*     M.x''))+ + 	+r*   N)r8   r9   r:   r;   r   r=  r=   r  r  r  r  r<   r/   r  dictr  r  r  r$   r*   r'   r  r  )  s        ??&w|!4 & & & &V V V V VV# V V V V  =    [      [B B B+ + + + +r*   r  N)%r;   enumr   typingr   r   	constructr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r~   osmocom.tlvr   r   osmocom.constructr   r   r   r   r   r   r   r?   r=  r  r$   r*   r'   <module>r     s  (                Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q + + + + + + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 T T T T T T T T T T T T! ! ! ! !& ! ! !&f f f f f f f fPH# H# H# H# H#g H# H# H#T%+ %+ %+ %+ %+ %+ %+ %+ %+ %+r*   