a
    kÄ#d\@  ã                   @   sp  d dl Z d dlZ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! G dd	„ d	eƒZ"d
d„ Z#e#ƒ  G dd„ deƒZ$d Z%dZ&e%e&fZ'dZ(dZ)e(e)fZ*dZ+dd„ Z,G dd„ de$ƒZ-G dd„ de$ƒZ.dd„ Z/dd„ Z0dZ1dZ2dZ3dZ4dZ5d Z6dZ7d!Z8dZ9dZ:d"Z;d#Z<d"Z=d$Z>d"Z?d=d%d&„Z@d'd(„ ZAG d)d*„ d*e$ƒZBG d+d,„ d,e$ƒZCG d-d.„ d.e$ƒZDG d/d0„ d0e$ƒZEG d1d2„ d2e$ƒZFG d3d4„ d4e$ƒZGG d5d6„ d6e$ƒZHG d7d8„ d8e$ƒZIG d9d:„ d:e$ƒZJee"eJeJjKeJjLeJjMeJjNeJjOeJjPeJjQeJjReJjSd;� ee"eJeJjKeJjLeJjOeJjPeJjQeJjReJjSd<�	 dS )>é    N)ÚTCPÚUDP)ÚIP6Field)ÚrawÚorb)Úconf)ÚPacketÚRawÚbind_top_downÚbind_bottom_up)ÚXShortFieldÚBitEnumFieldÚConditionalFieldÚBitFieldÚ	XBitFieldÚIntFieldÚ
XByteFieldÚByteEnumFieldÚ
ShortFieldÚX3BytesFieldÚStrLenFieldÚIPFieldÚFieldLenFieldÚPacketListFieldÚ	XIntFieldc                *   @   sÜ  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%dddddd œƒe&e'd!dd"ƒd#d$„ ƒe&e'd%dd"ƒ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
d0ed1ed2ed3ed4ed5ed6ed7ed8ed9ed:ed;ed<iƒe*d=ded>ed?ed@edAedBedCedDedEedFe dGe!dHiƒe&e+dIddJƒdKd$„ ƒe&e+dLddƒdMd$„ ƒe&e+dNddƒdOd$„ ƒgZ,dPdQ„ Z-dRdS„ Z.e/dTdU„ ƒZ0dYdWdX„Z1d(S )ZÚSOMEIPz SOME/IP Packet.é   é   é   r   é   é@   éA   éB   é€   é�   éÀ   éÁ   é    é!   é"   é    é¡   é   é   é   é   é   é	   é
   é   zSOME/IPÚsrv_idÚsub_idZ	METHOD_IDZEVENT_ID)r   r   Z	method_idé   c                 C   s
   | j dkS ©Nr   ©r5   ©Úpkt© r;   úV/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/automotive/someip.pyÚ<lambda>C   ó    zSOMEIP.<lambda>Úevent_idc                 C   s
   | j dkS ©Nr   r8   r9   r;   r;   r<   r=   E   r>   ÚlenNÚ	client_idÚ
session_idÚ	proto_verÚ	iface_verÚmsg_typeZREQUESTZREQUEST_NO_RETURNZNOTIFICATIONZREQUEST_ACKZREQUEST_NO_RETURN_ACKZNOTIFICATION_ACKZRESPONSEÚERRORZRESPONSE_ACKZ	ERROR_ACKZ
TP_REQUESTZTP_REQUEST_NO_RETURNZTP_NOTIFICATIONZTP_RESPONSEZTP_ERRORÚretcodeZE_OKZE_NOT_OKZE_UNKNOWN_SERVICEZE_UNKNOWN_METHODZE_NOT_READYZE_NOT_REACHABLEZ	E_TIMEOUTZE_WRONG_PROTOCOL_VERSIONZE_WRONG_INTERFACE_VERSIONZE_MALFORMED_MESSAGEZE_WRONG_MESSAGE_TYPEÚoffseté   c                 C   s
   t  | ¡S ©N©r   Ú_is_tpr9   r;   r;   r<   r=   j   r>   Úresc                 C   s
   t  | ¡S rK   rL   r9   r;   r;   r<   r=   l   r>   Úmore_segc                 C   s
   t  | ¡S rK   rL   r9   r;   r;   r<   r=   n   r>   c                 C   sb   | j }|d u rZt | ¡r(tjt |ƒ }ntjt |ƒ }|d d… t d|¡ |dd …  }|| S )Nr-   ú!Ir   )rA   r   rM   ÚLEN_OFFSET_TPÚ
LEN_OFFSETÚstructÚpack©Úselfr:   ZpayÚlengthr;   r;   r<   Ú
post_buildq   s    
$zSOMEIP.post_buildc                 C   sB   t |t| ƒƒr>| jtjtjtjtjtjfv r0dS | j	 
|j	¡S dS r7   )Ú
isinstanceÚtyperF   r   ÚTYPE_REQUEST_NO_RETÚTYPE_REQUEST_NORET_ACKÚTYPE_NOTIFICATIONÚTYPE_TP_REQUEST_NO_RETÚTYPE_TP_NOTIFICATIONÚpayloadÚanswers)rV   Úotherr;   r;   r<   ra   |   s    üzSOMEIP.answersc                 C   s<   t jt jt jt jt jg}t| tƒr,| j|v S | d |v S dS )z;Returns true if pkt is using SOMEIP-TP, else returns false.r6   N)	r   ÚTYPE_TP_REQUESTr^   r_   ÚTYPE_TP_RESPONSEÚTYPE_TP_ERRORrY   r   rF   )r:   Útpr;   r;   r<   rM   ‡   s    þ

zSOMEIP._is_tpép  c                 C   s  d}| }t ƒ }|jdur(|d7 }|j}q|D ]è}t|| jƒ}t|ƒ| | }t|ƒD ]¼}| ¡ }	|	| `tjt||| |d | … ƒ |	| _d|	| _	||d kr²d|	| _	|	|  j
|| d 7  _
tj||| |d | … d�}
|| jj ¡ |
_|	 |
¡ | |	¡ qVq,|S )zFragment SOME/IP-TPr   Nr   r3   )Úload)ÚlistZ
underlayerr   r`   rA   ÚrangeÚcopyr   rQ   rO   rI   r   Z	raw_layerZoverload_fieldsZadd_payloadÚappend)rV   ZfragsizeZfnbÚflÚlstÚpÚsÚnbÚiÚqÚrr;   r;   r<   Úfragment“   s0    
ÿ


 
zSOMEIP.fragment)rg   )2Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚPROTOCOL_VERSIONZINTERFACE_VERSIONrR   rQ   ZTYPE_REQUESTr[   r]   ZTYPE_REQUEST_ACKr\   ZTYPE_NOTIFICATION_ACKZTYPE_RESPONSEZ
TYPE_ERRORZTYPE_RESPONSE_ACKZTYPE_ERROR_ACKrc   r^   r_   rd   re   ÚRET_E_OKZRET_E_NOT_OKZRET_E_UNKNOWN_SERVICEZRET_E_UNKNOWN_METHODZRET_E_NOT_READYZRET_E_NOT_REACHABLEZRET_E_TIMEOUTZRET_E_WRONG_PROTOCOL_VZRET_E_WRONG_INTERFACE_VZRET_E_MALFORMED_MSGZRET_E_WRONG_MESSAGE_TYPEZ_OVERALL_LEN_NOPAYLOADÚnamer   r   r   r   r   r   r   r   Úfields_descrX   ra   ÚstaticmethodrM   ru   r;   r;   r;   r<   r      s¶   ÿÿñõÿÿÿÒ2
r   c                  C   sj   t ttddd� tdƒD ]L} tttd|  d� tttd|  d� tttd|  d� tttd|  d� qd S )Niw  )ÚsportÚdportr6   )r   )r€   )r
   r   r   rj   r   r   )rr   r;   r;   r<   Ú_bind_someip_layers°   s    r�   c                   @   s   e Zd ZdZdd„ ZdS )Ú_SDPacketBasez7 base class to be used among all SD Packet definitions.c                 C   s   d|fS )NÚ r;   )rV   rp   r;   r;   r<   Úextract_padding¿   s    z_SDPacketBase.extract_paddingN)rv   rw   rx   ry   r„   r;   r;   r;   r<   r‚   ½   s   r‚   r   r/   r0   r3   c                 C   sP   t 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 )NrZ   Zindex_1r   Zindex_2Zn_opt_1r-   Zn_opt_2r4   Zinst_idZ	major_verÚttl)r   r   r   r   )rZ   r;   r;   r<   Ú _MAKE_SDENTRY_COMMON_FIELDS_DESCÎ   s    

÷r†   c                   @   s(   e Zd ZdZeeƒZeeddƒg7 ZdS )ÚSDEntry_ServicezService EntryZ	minor_verr   N)rv   rw   rx   r|   r†   ÚSDENTRY_TYPE_SRV_FINDSERVICEr}   r   r;   r;   r;   r<   r‡   Ü   s   ÿÿr‡   c                   @   s<   e Zd ZdZeeƒZeedddƒedddƒeddƒg7 ZdS )	ÚSDEntry_EventGroupzEventgroup EntryrN   r   r   Zcntr-   Zeventgroup_idN)	rv   rw   rx   r|   r†   ÚSDENTRY_TYPE_EVTGRP_SUBSCRIBEr}   r   r   r;   r;   r;   r<   r‰   å   s   ÿ

ýr‰   c                 K   s>   d}t | | ƒ}d }|tv r"t}n|tv r.t}|| fi |¤ŽS r7   )r   ÚSDENTRY_TYPE_SRVr‡   ÚSDENTRY_TYPE_EVTGRPr‰   )r`   ÚkargsZTYPE_PAYLOAD_IÚpl_typeÚclsr;   r;   r<   Ú_sdentry_classð   s    r�   c                 K   sH   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_EndPointÚgetr	   )r`   r�   rŽ   r�   r;   r;   r<   Ú_sdoption_classý   s    ø	÷r¢   r   r.   r-   r1   é   é$   é   é   é&   c                 C   s   t d|ƒtd| ƒtddƒgS )NrA   rZ   Zres_hdrr   )r   r   )rZ   rW   r;   r;   r<   Ú!_MAKE_COMMON_SDOPTION_FIELDS_DESC   s    ýr¨   c                   C   s$   t ddƒtdddddœƒtddƒgS )	NZres_tailr   Zl4_protoé   r   r   )r/   r©   Úport)r   r   r   r;   r;   r;   r<   Ú$_MAKE_COMMON_IP_SDOPTION_FIELDS_DESC(  s    ýr«   c                   @   s@   e Zd ZdZeeƒedddd„ d�g Zdd„ Ze	d	d
„ ƒZ
dS )r’   zConfig OptionÚcfg_strú c                 C   s
   | j d S r@   )rA   r9   r;   r;   r<   r=   3  r>   zSDOption_Config.<lambda>©Zlength_fromc                 C   s8   | j d u r0t | jƒd }t d|¡|dd …  }|| S )Nr   z!Hr   )rA   r¬   rS   rT   rU   r;   r;   r<   rX   6  s    
zSDOption_Config.post_buildc                 C   sJ   t | tƒr|  ¡ } dd„ | D ƒ} dd„ | D ƒ} d | ¡} | d7 } |  d¡S )Nc                 s   s   | ]\}}d   ||¡V  qdS )z{}={}N)Úformat)Ú.0ÚkÚvr;   r;   r<   Ú	<genexpr>P  r>   z.SDOption_Config.make_string.<locals>.<genexpr>c                 s   s"   | ]}d   tt|ƒƒ|¡V  qdS )z{}{}N)r¯   ÚchrrA   )r°   r²   r;   r;   r<   r³   R  r>   rƒ   r­   Úutf8)rY   ÚdictÚitemsÚjoinÚencode)Údatar;   r;   r<   Úmake_string<  s    

zSDOption_Config.make_stringN)rv   rw   rx   r|   r¨   r‘   r   r}   rX   r~   r»   r;   r;   r;   r<   r’   0  s   ÿr’   c                   @   s2   e Zd ZdZeeeƒZeeddƒeddƒg7 ZdS )r”   zLoadBalance OptionÚpriorityr   ÚweightN)	rv   rw   rx   r|   r¨   r“   ÚSDOPTION_LOADBALANCE_LENr}   r   r;   r;   r;   r<   r”   Z  s   ÿþr”   c                   @   s0   e Zd ZdZeeeƒZeeddƒge	ƒ  7 ZdS )r–   zIP4 EndPoint OptionÚaddrú0.0.0.0N)
rv   rw   rx   r|   r¨   r•   ÚSDOPTION_IP4_ENDPOINT_LENr}   r   r«   r;   r;   r;   r<   r–   d  s   ÿÿþr–   c                   @   s0   e Zd ZdZeeeƒZeeddƒge	ƒ  7 ZdS )r˜   zIP4 Multicast Optionr¿   rÀ   N)
rv   rw   rx   r|   r¨   r—   ÚSDOPTION_IP4_MCAST_LENr}   r   r«   r;   r;   r;   r<   r˜   m  s   ÿÿþr˜   c                   @   s0   e Zd ZdZeeeƒZeeddƒge	ƒ  7 ZdS )rš   zIP4 SDEndPoint Optionr¿   rÀ   N)
rv   rw   rx   r|   r¨   r™   ÚSDOPTION_IP4_SDENDPOINT_LENr}   r   r«   r;   r;   r;   r<   rš   v  s   ÿÿþrš   c                   @   s0   e Zd ZdZeeeƒZeeddƒge	ƒ  7 ZdS )rœ   zIP6 EndPoint Optionr¿   ú::N)
rv   rw   rx   r|   r¨   r›   ÚSDOPTION_IP6_ENDPOINT_LENr}   r   r«   r;   r;   r;   r<   rœ     s   ÿÿþrœ   c                   @   s0   e Zd ZdZeeeƒZeeddƒge	ƒ  7 ZdS )rž   zIP6 Multicast Optionr¿   rÄ   N)
rv   rw   rx   r|   r¨   r�   ÚSDOPTION_IP6_MCAST_LENr}   r   r«   r;   r;   r;   r<   rž   ˆ  s   ÿÿþrž   c                   @   s0   e Zd ZdZeeeƒZeeddƒge	ƒ  7 ZdS )r    zIP6 SDEndPoint Optionr¿   rÄ   N)
rv   rw   rx   r|   r¨   rŸ   ÚSDOPTION_IP6_SDENDPOINT_LENr}   r   r«   r;   r;   r;   r<   r    ‘  s   ÿÿþr    c                   @   sÖ   e Zd ZdZdZdZdZdZdZdZ	dZ
ejZejZe dd¡Zedd	d
�eddd
�dœZd Zeddƒeddƒeddddd�eddedd„ d�eddddd�eddedd„ d�gZdd„ Zdd„ Zdd „ Zd!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()]
    iÿÿ  r   é   r   ÚFlagzmask offsetr#   r0   )ÚmaskrI   r    r/   )ZREBOOTZUNICASTÚflagsrN   Úlen_entry_arrayNÚentry_arrayrP   )Z	length_ofÚfmtc                 C   s   | j S rK   )rÍ   r9   r;   r;   r<   r=   ½  r>   zSD.<lambda>r®   Úlen_option_arrayÚoption_arrayc                 C   s   | j S rK   )rÐ   r9   r;   r;   r<   r=   Á  r>   c                 C   s8   |  ¡ }|| jv r0| j| j| j@ | j| j? S d S d S rK   )ÚupperÚFLAGSDEFrÌ   rË   rI   )rV   r|   r;   r;   r<   Úget_flagÄ  s    

ÿzSD.get_flagc                 C   sH   |  ¡ }|| jv rD| jt | j| j ¡j@ |d@ | j| j> B | _d S r@   )rÒ   rÓ   rÌ   ÚctypesZc_ubyterË   ÚvaluerI   )rV   r|   rÖ   r;   r;   r<   Úset_flagÌ  s    
ÿþzSD.set_flagc                 C   s   t |tƒr|| _n|g| _d S rK   )rY   ri   rÎ   )rV   Z
entry_listr;   r;   r<   Úset_entryArrayÓ  s    
zSD.set_entryArrayc                 C   s   t |tƒr|| _n|g| _d S rK   )rY   ri   rÑ   )rV   Úoption_listr;   r;   r<   Úset_optionArrayÙ  s    
zSD.set_optionArray) rv   rw   rx   ry   ÚSOMEIP_MSGID_SRVIDÚSOMEIP_MSGID_SUBIDÚSOMEIP_MSGID_EVENTIDÚSOMEIP_CLIENT_IDÚSOMEIP_MINIMUM_SESSION_IDÚSOMEIP_PROTO_VERÚSOMEIP_IFACE_VERr   r]   ÚSOMEIP_MSG_TYPEr{   ÚSOMEIP_RETCODEÚcollectionsÚ
namedtupleZ_sdFlagrÓ   r|   r   r   r   r   r�   r¢   r}   rÔ   r×   rØ   rÚ   r;   r;   r;   r<   rÈ   �  sD   

þÿÿÿÿ÷rÈ   )	r4   r5   rB   rC   r?   rD   rE   rF   rH   )r4   r5   r?   rD   rE   rF   rH   )N)TrÕ   rä   rS   Zscapy.layers.inetr   r   Zscapy.layers.inet6r   Zscapy.compatr   r   Zscapy.configr   Zscapy.packetr   r	   r
   r   Zscapy.fieldsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r�   r‚   rˆ   ZSDENTRY_TYPE_SRV_OFFERSERVICEr‹   rŠ   Z!SDENTRY_TYPE_EVTGRP_SUBSCRIBE_ACKrŒ   ZSDENTRY_OVERALL_LENr†   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Û   rÜ   rÞ   rß   rÝ   rà   rá   râ   rã   r;   r;   r;   r<   Ú<module>
   s–   D 
ÿÿ	
*
					C÷ù