
    hD                        d dl Z d dlmZmZ d dlmZ d dlmZmZ d dl	m
Z
 d dl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mZmZmZmZmZmZmZmZm Z m!Z!m"Z"  G d d	e          Z#d
 Z$ e$              G d de          Z%d Z&dZ'e&e'fZ(dZ)dZ*e)e*fZ+dZ,d Z- G d de%          Z. G d de%          Z/d Z0d Z1dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;dZ<dZ=dZ>d Z?dZ@d7d!ZAd" ZB G d# d$e%          ZC G d% d&e%          ZD G d' d(e%          ZE G d) d*e%          ZF G d+ d,e%          ZG G d- d.e%          ZH G d/ d0e%          ZI G d1 d2e%          ZJ G d3 d4e%          ZK ee#eKeKjL        eKjM        eKjN        eKjO        eKjP        eKjQ        eKjR        eKjS        5
  
          ee#eKeKjL        eKjM        eKjP        eKjQ        eKjR        eKjS        6           dS )8    N)TCPUDP)IP6Field)raworb)conf)PacketRawbind_top_downbind_bottom_up)XShortFieldConditionalFieldBitField	XBitField
XByteFieldByteEnumField
ShortFieldX3BytesFieldStrLenFieldIPFieldFieldLenFieldPacketListField	XIntFieldMultipleTypeField
FlagsFieldIntFieldXByteEnumFieldBitScalingFieldc            )       h   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# e$dd           e% e$dd          d d fd f e$dd          d! d" fd#fg e$dd                     e&d$d%           e$d&d           e$d'd           e'd(e           e'd)e           e(d*eed+e	d,e
d-ed.ed/ed0ed1ed2ed3ed4ed5ed6ed7ed8ed9i           e(d:ded;ed<ed=ed>ed?ed@edAedBedCe dDe!dEi           e) e*dFddGddHI          dJ            e) e+dKdd          dL            e) e+dMdd          dN            e) e,dO e-            ge-dP dQ R          dS           gZ. e/            Z0e1dT             Z2dU Z3dV Z4e1dW             Z5e1dX             Z6d[dZZ7d%S )\SOMEIPz SOME/IP Packet.         r      @   A   B                   !   "                        	   
      zSOME/IPsrv_idsub_idc                     dS NF pkts    c/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/automotive/someip.py<lambda>zSOMEIP.<lambda>D       e     c                     |dk     S Ni   r=   r?   vals     r@   rA   zSOMEIP.<lambda>E   s
    3< rC   	method_idc                     dS r<   r=   r>   s    r@   rA   zSOMEIP.<lambda>G   rB   rC   c                     |dk    S rE   r=   rF   s     r@   rA   zSOMEIP.<lambda>H   s
    3&= rC   event_idlenN	client_id
session_id	proto_ver	iface_vermsg_typeREQUESTREQUEST_NO_RETURNNOTIFICATIONREQUEST_ACKREQUEST_NO_RETURN_ACKNOTIFICATION_ACKRESPONSEERRORRESPONSE_ACK	ERROR_ACK
TP_REQUESTTP_REQUEST_NO_RETURNTP_NOTIFICATIONTP_RESPONSETP_ERRORretcodeE_OKE_NOT_OKE_UNKNOWN_SERVICEE_UNKNOWN_METHODE_NOT_READYE_NOT_REACHABLE	E_TIMEOUTE_WRONG_PROTOCOL_VERSIONE_WRONG_INTERFACE_VERSIONE_MALFORMED_MESSAGEE_WRONG_MESSAGE_TYPEoffset   bytes)scalingunitc                 6    t                               |           S Nr    _is_tpr>   s    r@   rA   zSOMEIP.<lambda>q       c** rC   resc                 6    t                               |           S rs   rt   r>   s    r@   rA   zSOMEIP.<lambda>t   rv   rC   more_segc                 6    t                               |           S rs   rt   r>   s    r@   rA   zSOMEIP.<lambda>w   rv   rC   datac                     | j         t                              |           r(| j         | j         t          j        k    rt          j        nt          j        z
  S rs   )rL   r    ru   LEN_OFFSET_TP
LEN_OFFSETr>   s    r@   rA   zSOMEIP.<lambda>z   sd    CGVYHZHZ  0l`c`g`osvsz  E  S  tS  tSv/C/C  [a  [l  %m rC   c                 <    t                               | |||          S rs   )r    get_payload_cls_by_srv_idr?   lstcurremains       r@   rA   zSOMEIP.<lambda>{   s    00c3GG rC   )length_fromnext_cls_cbc                 6    t                               |           S rs   rt   r>   s    r@   rA   zSOMEIP.<lambda>}   rv   rC   c                 V    t           j                            | j        t                    S rs   )r    payload_cls_by_srv_idgetr9   r
   r   s       r@   r   z SOMEIP.get_payload_cls_by_srv_id   s    +//
C@@@rC   c                    | j         }|~t                              |           rt          j        t          |          z   }nt          j        t          |          z   }|d d         t          j        d|          z   |dd          z   }||z   S )Nr2   !Ir"   )rL   r    ru   r}   r~   structpackselfr?   paylengths       r@   
post_buildzSOMEIP.post_build   s    >}}T"" 6-C8*SXX5bqb'FKf555ABB?CSyrC   c                    t          |t          |                     ra| j        t          j        t          j        t          j        t          j        t          j        fv rdS | j	        
                    |j	                  S dS Nr   )
isinstancetyperQ   r    TYPE_REQUEST_NO_RETTYPE_REQUEST_NORET_ACKTYPE_NOTIFICATIONTYPE_TP_REQUEST_NO_RETTYPE_TP_NOTIFICATIONpayloadanswers)r   others     r@   r   zSOMEIP.answers   so    eT$ZZ(( 	7}!;!'!>!'!9!'!>!'!<	!> > >
 q<''666qrC   c                 V    t          | t                    r
| j        dz  S | d         dz  S )z;Returns true if pkt is using SOMEIP-TP, else returns false.r,      )r   r	   rQ   r>   s    r@   ru   zSOMEIP._is_tp   s1     c6"" 	"<$&&r7T>!rC   c                 t    t          | t                    r| j        dk    o
| j        dk    S | dd         dk    S )z;Returns true if pkt is using SOMEIP-SD, else returns false.     Nr2   s    )r   r	   r9   r:   r>   s    r@   _is_sdzSOMEIP._is_sd   sC     c6"" 	2:'@CJ&,@@rr7111rC   p  c           	      
   d}| }t                      }|j        |dz  }|j        }|j        |D ]R}t          ||         j                  }t	          |          |z   |z  }t          |          D ]}|                                }	|	|         `t          j        t	          |||z  |dz   |z                     z   |	|         _        d|	|         _	        ||dz
  k    rd|	|         _	        |	|         xj
        ||z  dz  z  c_
        t          j        |||z  |dz   |z                     }
||         j        j                                        |
_        |	                    |
           |                    |	           T|S )zFragment SOME/IP-TPr   Nr!   r8   )load)list
underlayerr   r   rL   rangecopyr    r}   ry   rm   r   	raw_layeroverload_fieldsadd_payloadappend)r   fragsizefnbflr   psnbiqrs              r@   fragmentzSOMEIP.fragment   s   ffm'1HCB m'  	 	AAcFN##Aa&&8#0B2YY  FFHHcFN#1!h,A'99:;;<#
"##Q;;&'AcFO#X!33N!h,A7I*I(JKKK$%cFN$B$G$G$I$I!a   

1 
rC   )r   )8__name__
__module____qualname____doc__PROTOCOL_VERSIONINTERFACE_VERSIONr~   r}   TYPE_REQUESTr   r   TYPE_REQUEST_ACKr   TYPE_NOTIFICATION_ACKTYPE_RESPONSE
TYPE_ERRORTYPE_RESPONSE_ACKTYPE_ERROR_ACKTYPE_TP_REQUESTr   r   TYPE_TP_RESPONSETYPE_TP_ERRORRET_E_OKRET_E_NOT_OKRET_E_UNKNOWN_SERVICERET_E_UNKNOWN_METHODRET_E_NOT_READYRET_E_NOT_REACHABLERET_E_TIMEOUTRET_E_WRONG_PROTOCOL_VRET_E_WRONG_INTERFACE_VRET_E_MALFORMED_MSGRET_E_WRONG_MESSAGE_TYPE_OVERALL_LEN_NOPAYLOADnamer   r   r   r   r   r   r   r   r   r
   fields_descdictr   staticmethodr   r   r   ru   r   r   r=   rC   r@   r    r       s       JML! MJNO!MHL OM!"#D 	Ha  Xq))##//12=? Xq))##0023=?	 K!$$
	
 
	
 	K##L!$$
; 011
; 122j,)!4~m"$;!#5:~K\"$: "3m:1
 	 	" 	if*!#6 "4]!2;"$>#%@!6$&<%
 	 	 	OHaRgFFF**	, 	, 	HUAq!!**	, 	, 	HZA&&**	, 	, 	SSUUGS m  mH HI I I
 +*	, 	,s?KB !DFFA A \A	 	 		 	 	 " " \" 2 2 \2     rC   r    c                  \   t          t          t          dd           t          d          D ]~} t	          t          t          d| z              t	          t
          t          d| z              t	          t          t          d| z              t	          t
          t          d| z              d S )Niw  )sportdportr   )r   )r   )r   r   r    r   r   r   )r   s    r@   _bind_someip_layersr      s    #vU%88882YY 5 5sF%!)4444sF%!)4444sF%!)4444sF%!)44444	5 5rC   c                       e Zd ZdZd ZdS )_SDPacketBasez7 base class to be used among all SD Packet definitions.c                 
    d|fS )N r=   )r   r   s     r@   extract_paddingz_SDPacketBase.extract_padding   s    1urC   N)r   r   r   r   r   r=   rC   r@   r   r      s)        AA    rC   r   r!   r4   r5   r8   c                 $   t          d| ddddd          t          dd          t          d	d          t          d
dd          t          ddd          t          dd          t          dd          t          dd          t	          dd          g	S )Nr   FindServiceOfferServiceSubscribeEventgroupSubscribeEventgroupACK)r   r!   r4   r5   index_1r   index_2n_opt_1r2   n_opt_2r9   inst_id	major_verttl)r   r   r   r   r   )r   s    r@    _MAKE_SDENTRY_COMMON_FIELDS_DESCr      s    vt$'	&) &) 	* 	*
 	9a  9a  )Q"")Q""Ha  Iq!!;""UA rC   c                   H    e Zd ZdZ ee          Ze edd          gz  ZdS )SDEntry_ServicezService Entry	minor_verr   N)r   r   r   r   r   SDENTRY_TYPE_SRV_FINDSERVICEr   r   r=   rC   r@   r   r      sF        D22$& &K	+q!! KKKrC   r   c                   x    e Zd ZdZ ee          Ze eddd           eddd           edd          gz  ZdS )	SDEntry_EventGroupzEventgroup Entryrw   r   r#   cntr2   eventgroup_idN)	r   r   r   r   r   SDENTRY_TYPE_EVTGRP_SUBSCRIBEr   r   r   r=   rC   r@   r   r     sh        D22%' 'K	%B	%AOQ'' KKKrC   r   c                     d}t          | |                   }d }|t          v rt          }n|t          v rt          } || fi |S r   )r   SDENTRY_TYPE_SRVr   SDENTRY_TYPE_EVTGRPr   )r   kargsTYPE_PAYLOAD_Ipl_typeclss        r@   _sdentry_classr    sZ    N'.)**G
C"""	'	'	' 3w  %   rC   c                 4   t          | d                   }t          t          t          t          t
          t          t          t          t          t          t          t          t          t          t          t           i                    |t$                    } || fi |S )Nr$   )r   SDOPTION_CFG_TYPESDOption_ConfigSDOPTION_LOADBALANCE_TYPESDOption_LoadBalanceSDOPTION_IP4_ENDPOINT_TYPESDOption_IP4_EndPointSDOPTION_IP4_MCAST_TYPESDOption_IP4_MulticastSDOPTION_IP4_SDENDPOINT_TYPESDOption_IP4_SD_EndPointSDOPTION_IP6_ENDPOINT_TYPESDOption_IP6_EndPointSDOPTION_IP6_MCAST_TYPESDOption_IP6_MulticastSDOPTION_IP6_SDENDPOINT_TYPESDOption_IP6_SD_EndPointr   r
   )r   r   r   r   s       r@   _sdoption_classr    sw    '!*ooG 	?!#7"$9!7$&>"$9!7$&>	 
c'3  3w  %   rC   r$   r3   r2   r6      $         &   c                     t          d|          t          d| t          dt          dt          dt
          dt          dt          dt          d	t          d
i          t          dd          gS )NrL   r   ConfigurationLoadBalancingIPv4EndpointIPv4MultiCastIPv4SDEndpointIPv6EndpointIPv6MultiCastIPv6SDEndpointres_hdrr   )r   r   r  r  r  r	  r  r  r  r  r   )r   r   s     r@   !_MAKE_COMMON_SDOPTION_FIELDS_DESCr#  >  sh    5&!!vt%&#_(*:&#_(*:&< 	= 	= 	9a   rC   c                  h    t          dd          t          ddddd          t          dd          gS )	Nres_tailr   l4_proto   r   r   )r4   r'  port)r   r   r   r=   rC   r@   $_MAKE_COMMON_IP_SDOPTION_FIELDS_DESCr)  N  s=    :q!!j$uE(B(BCC61 rC   c                   f    e Zd ZdZ ee           eddd           gz   Zd Ze	d             Z
dS )	r  zConfig Optioncfg_str    c                     | j         dz
  S )Nr!   )rL   r>   s    r@   rA   zSDOption_Config.<lambda>Y  s    ! rC   r   c                     | j         7t          | j                  dz   }t          j        d|          |dd          z   }||z   S )Nr!   z!Hr$   )rL   r+  r   r   r   s       r@   r   zSDOption_Config.post_build\  sF    8&&*F+dF++c!""g5CSyrC   c                     t          | t                    r|                                 } d | D             } d | D             } d                    |           } | dz  } |                     d          S )Nc              3   H   K   | ]\  }}d                      ||          V  dS )z{}={}N)format).0kvs      r@   	<genexpr>z.SDOption_Config.make_string.<locals>.<genexpr>v  s4      66Aq!$$666666rC   c              3   v   K   | ]4}d                      t          t          |                    |          V  5dS )z{}{}N)r2  chrrL   )r3  r5  s     r@   r6  z.SDOption_Config.make_string.<locals>.<genexpr>x  s<      <<!c#a&&kk1--<<<<<<rC   r    utf8)r   r   itemsjoinencode)r{   s    r@   make_stringzSDOption_Config.make_stringb  su      dD!! 	 ::<<D 76666<<t<<<wwt}}{{6"""rC   N)r   r   r   r   r#  r  r   r   r   r   r>  r=   rC   r@   r  r  V  sw        D334EFFIw4K4KLLLJ K   # # \# # #rC   r  c                   `    e Zd ZdZ eee          Ze edd           edd          gz  ZdS )r  zLoadBalance Optionpriorityr   weightN)	r   r   r   r   r#  r  SDOPTION_LOADBALANCE_LENr   r   r=   rC   r@   r  r    sX        D33!#;= =K
:q!!
8Q KKKrC   r  c                   `    e Zd ZdZ eee          Ze edd          g e	            z   z  ZdS )r  zIP4 EndPoint Optionaddr0.0.0.0N)
r   r   r   r   r#  r  SDOPTION_IP4_ENDPOINT_LENr   r   r)  r=   rC   r@   r  r    sZ         D33"$=? ?K	"",,../ /KKKrC   r  c                   `    e Zd ZdZ eee          Ze edd          g e	            z   z  ZdS )r
  zIP4 Multicast OptionrD  rE  N)
r   r   r   r   r#  r	  SDOPTION_IP4_MCAST_LENr   r   r)  r=   rC   r@   r
  r
    sZ        !D33!79 9K	"",,../ /KKKrC   r
  c                   `    e Zd ZdZ eee          Ze edd          g e	            z   z  ZdS )r  zIP4 SDEndPoint OptionrD  rE  N)
r   r   r   r   r#  r  SDOPTION_IP4_SDENDPOINT_LENr   r   r)  r=   rC   r@   r  r    s\        "D33$&AC CK	"",,../ /KKKrC   r  c                   `    e Zd ZdZ eee          Ze edd          g e	            z   z  ZdS )r  zIP6 EndPoint OptionrD  ::N)
r   r   r   r   r#  r  SDOPTION_IP6_ENDPOINT_LENr   r   r)  r=   rC   r@   r  r    sZ         D33"$=? ?K,,../ /KKKrC   r  c                   `    e Zd ZdZ eee          Ze edd          g e	            z   z  ZdS )r  zIP6 Multicast OptionrD  rL  N)
r   r   r   r   r#  r  SDOPTION_IP6_MCAST_LENr   r   r)  r=   rC   r@   r  r    sZ        !D33!79 9K,,../ /KKKrC   r  c                   `    e Zd ZdZ eee          Ze edd          g e	            z   z  ZdS )r  zIP6 SDEndPoint OptionrD  rL  N)
r   r   r   r   r#  r  SDOPTION_IP6_SDENDPOINT_LENr   r   r)  r=   rC   r@   r  r    s\        "D33$&AC CK,,../ /KKKrC   r  c                      e Zd ZdZdZdZdZdZdZdZ	e
j        Ze
j        Zd Z edddg d           ed	d           ed
ddd           edded            edddd           edded           gZd Zd ZdS )SDz
    SD Packet

    NOTE :   when adding 'entries' or 'options', do not use list.append()
        method but create a new list
    e.g. :  p = SD()
            p.option_array = [SDOption_Config(),SDOption_IP6_EndPoint()]
    r   r   r   r!   flagsr"   )res0res1res2res3res4EXPLICIT_INITIAL_DATA_CONTROLUNICASTREBOOTrw   len_entry_arrayNentry_arrayr   )	length_offmtc                     | j         S rs   )r]  r>   s    r@   rA   zSD.<lambda>  s	    0C rC   r.  len_option_arrayoption_arrayc                     | j         S rs   )rb  r>   s    r@   rA   zSD.<lambda>  s	    0D rC   c                 R    t          |t                    r	|| _        d S |g| _        d S rs   )r   r   r^  )r   
entry_lists     r@   set_entryArrayzSD.set_entryArray  s2    j$'' 	,)D *|DrC   c                 R    t          |t                    r	|| _        d S |g| _        d S rs   )r   r   rc  )r   option_lists     r@   set_optionArrayzSD.set_optionArray  s2    k4(( 	. +D!,DrC   )r   r   r   r   SOMEIP_MSGID_SRVIDSOMEIP_MSGID_SUBIDSOMEIP_CLIENT_IDSOMEIP_MINIMUM_SESSION_IDSOMEIP_PROTO_VERSOMEIP_IFACE_VERr    r   SOMEIP_MSG_TYPEr   SOMEIP_RETCODEr   r   r   r   r   r  r  r   rg  rj  r=   rC   r@   rS  rS    s9           &.O_ND
7Aq #B #B #B 	C 	C 	UA' -4	9 	9 	9t^$C$C	E 	E 	E($ .D	: 	: 	:o$D$D	F 	F 	FK, , ,. . . . .rC   rS  )r9   r:   rM   rN   rO   rP   rQ   ra   )r9   r:   rO   rP   rQ   ra   rs   )Tr   scapy.layers.inetr   r   scapy.layers.inet6r   scapy.compatr   r   scapy.configr   scapy.packetr	   r
   r   r   scapy.fieldsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r   r   SDENTRY_TYPE_SRV_OFFERSERVICEr   r   !SDENTRY_TYPE_EVTGRP_SUBSCRIBE_ACKr   SDENTRY_OVERALL_LENr   r   r   r  r  r  r  rB  r  rF  r	  rH  r  rJ  r  rM  r  rO  r  rQ  r#  r)  r  r  r  r
  r  r  r  r  rS  rk  rl  rm  rn  ro  rp  rq  rr  r=   rC   r@   <module>r|     s!    & & & & & & & & ' ' ' ' ' ' ! ! ! ! ! ! ! !       C C C C C C C C C C C C; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;m m m m mV m m m`5 5 5         F     $  $ 013  $ $( !48:    $    m          
! 
! 
!! ! !$     ! "   # $ ! "   # $       '# '# '# '# '#m '# '# '#T    =   / / / / /M / / // / / / /] / / // / / / /} / / // / / / /M / / // / / / /] / / // / / / /} / / /,. ,. ,. ,. ,. ,. ,. ,.^ fb**+5++)') ) ) ) vr++,,*(* * * * * *rC   