a
    kÄ#d[  ã                   @   s(  d dl Z d dlZd dlZd dlZd dlmZmZmZmZm	Z	m
Z
 d dlmZ d dlmZmZmZ d dlmZmZmZ d dlmZ d dlmZ d dlmZmZ d d	lmZ G d
d„ deƒZeeedd� eeedd� eeeddd� eeeƒ G dd„ deƒZG dd„ deƒZ e!dƒdddfdd„Z"dS )é    N)ÚOptionalÚTupleÚTypeÚIterableÚListÚUnion)Úlog_automotive)ÚPacketÚbind_layersÚbind_bottom_up)ÚIntFieldÚShortEnumFieldÚ
XByteField)ÚTCP)ÚStreamSocket)ÚUDSÚUDS_TP)ÚMTUc                   @   sT   e Zd Zd Zeddƒedddddœƒedd	ƒed
d	ƒgZdd„ Zdd„ Z	dd„ Z
dS )ÚHSFZÚlengthNÚtypeé   ÚmessageZecho)r   é   Úsrcr   Údstc                 C   s&   t  d| j| jA ¡}| j ¡ }|| S )NÚB)ÚstructÚpackr   r   ÚpayloadÚhashret)ÚselfZhdr_hashZpay_hash© r"   úX/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/automotive/bmw/hsfz.pyr    *   s    
zHSFZ.hashretc                 C   s$   |d | j d … || j d d … fS )Nr   )r   )r!   Úsr"   r"   r#   Úextract_padding0   s    zHSFZ.extract_paddingc                 C   s2   | j du r*t dt|ƒd ¡|dd…  }|| S )zK
        This will set the LenField 'length' to the correct value.
        Nz!Ir   é   )r   r   r   Úlen)r!   ÚpktZpayr"   r"   r#   Ú
post_build4   s    
 zHSFZ.post_build)Ú__name__Ú
__module__Ú__qualname__Únamer   r   r   Zfields_descr    r%   r)   r"   r"   r"   r#   r       s   ÿûr   é‘  )Úsport)Údport)r/   r0   c                   @   s   e Zd Zddd„ZdS )Ú
HSFZSocketú	127.0.0.1r.   c                 C   sd   || _ || _t tjtj¡}| tjtjd¡ | tjtj	d¡ | 
| j | jf¡ t | |t¡ d S )Nr   )ÚipÚportÚsocketÚAF_INETÚSOCK_STREAMÚ
setsockoptÚIPPROTO_TCPÚTCP_NODELAYÚ
SOL_SOCKETÚSO_REUSEADDRÚconnectr   Ú__init__r   )r!   r3   r4   r$   r"   r"   r#   r>   H   s    zHSFZSocket.__init__N)r2   r.   )r*   r+   r,   r>   r"   r"   r"   r#   r1   G   s   r1   c                       s@   e Zd Zddef‡ fdd„	Z‡ fdd„Zef‡ fdd„	Z‡  ZS )	ÚUDS_HSFZSocketr2   r.   c                    s.   t t| ƒ ||¡ || _|| _t| _|| _d S ©N)Úsuperr?   r>   r   r   r   ÚbaseclsÚ	outputcls)r!   r   r   r3   r4   rB   ©Ú	__class__r"   r#   r>   T   s
    zUDS_HSFZSocket.__init__c              
      s„   zt   ¡ |_W n ty    Y n0 z"tt| ƒ t| j| jd�| ¡W S  t	y~ } z"t
 d|¡ |  ¡  W Y d }~dS d }~0 0 d S )N)r   r   zException: %sr   )ÚtimeZ	sent_timeÚAttributeErrorrA   r?   Úsendr   r   r   Ú	Exceptionr   Ú	exceptionÚclose)r!   ÚxÚerD   r"   r#   rH   \   s    
ÿ	zUDS_HSFZSocket.sendc                    s,   t t| ƒ |¡}|r$|  t|jƒ¡S |S d S r@   )rA   r?   ÚrecvrC   Úbytesr   )r!   rL   r(   rD   r"   r#   rN   s   s    zUDS_HSFZSocket.recv)	r*   r+   r,   r   r>   rH   r   rN   Ú__classcell__r"   r"   rD   r#   r?   S   s   r?   é   éô   gš™™™™™¹?Tc           
         sÜ   |rt  tj¡ tƒ }|D ]®}t||ˆ ƒ�Ž}zF|jtƒ tƒ  |dd�}|rX| 	||f¡ |rpt  
dˆ ||f ¡ W n6 ty¨ }	 zt  d|	|f ¡ W Y d}	~	n
d}	~	0 0 W d  ƒ q1 s¾0    Y  q‡ fdd„|D ƒS )a©  
    Helper function to scan for HSFZ endpoints.

    Example:
        >>> sockets = hsfz_scan("192.168.0.42")

    :param ip: IPv4 address of target to scan
    :param scan_range: Range for HSFZ destination address
    :param src: HSFZ source address, used during the scan
    :param timeout: Timeout for each request
    :param verbose: Show information during scan, if True
    :return: A list of open UDS_HSFZSockets
    F)ÚtimeoutÚverbosez%Found endpoint %s, src=0x%x, dst=0x%xz$Error %s at destination address 0x%xNc                    s   g | ]\}}t d |ˆ ƒ‘qS )rR   )r?   )Ú.0r   Ú_©r3   r"   r#   Ú
<listcomp>¡   ó    zhsfz_scan.<locals>.<listcomp>)r   ÚsetLevelÚloggingÚDEBUGÚlistr?   Zsr1r   r   ÚappendÚdebugrI   rJ   )
r3   Z
scan_ranger   rS   rT   ÚresultsÚiÚsockÚresprM   r"   rW   r#   Ú	hsfz_scan|   s*    þÿ
ÿ:rd   )#r[   r   r5   rF   Zscapy.compatr   r   r   r   r   r   Zscapy.contrib.automotiver   Zscapy.packetr	   r
   r   Zscapy.fieldsr   r   r   Zscapy.layers.inetr   Zscapy.supersocketr   Zscapy.contrib.automotive.udsr   r   Z
scapy.datar   r   r1   r?   Úrangerd   r"   r"   r"   r#   Ú<module>   s.    
*ü