a
    kÄ#dL(  ã                   @   sx  d dl 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 d dlmZ d dlmZ d dl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" G dd„ deƒZ#G dd„ de#ƒZ$G dd„ de#ƒZ%G dd„ de%ƒZ&G dd„ de%ƒZ'G dd„ de%ƒZ(G dd„ de$ƒZ)G dd„ de$ƒZ*G dd„ de$ƒZ+G dd„ de$ƒZ,G dd „ d e$ƒZ-G d!d"„ d"eƒZ.dS )#é    N)ÚListÚTypeÚAnyÚIterable)ÚOBDÚOBD_S03ÚOBD_S07ÚOBD_S0AÚOBD_S01ÚOBD_S06ÚOBD_S08ÚOBD_S09ÚOBD_NRÚOBD_S02ÚOBD_S02_Record)Úconf)ÚPacket)ÚBlackAndWhite)ÚServiceEnumeratorÚ_AutomotiveTestCaseScanResultÚ%_AutomotiveTestCaseFilteredScanResult)ÚAutomotiveTestCaseExecutor)ÚEcuState)ÚAutomotiveTestCaseABCÚ_SocketUnionc                   @   sd   e Zd Ze ej¡Ze dedfi¡ ejd Ze	dd„ ƒZ
e	dd„ ƒZe	dd	„ ƒZed
d„ ƒZdS )ÚOBD_EnumeratorÚ	full_scanNa  
        :param bool full_scan: Specifies if the entire scan range is tested, or
                               if the bitmask with supported identifiers is
                               queried and only supported identifiers
                               are scanned.c                 C   s   | j S ©N©Zresponse_code)Úresp© r    ú[/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/automotive/obd/scanner.pyÚ_get_negative_response_code)   s    z*OBD_Enumerator._get_negative_response_codec                 C   s   t | d� d¡S )Nr   z%OBD_NR.response_code%)r   Úsprintf)Znrcr    r    r!   Ú_get_negative_response_desc.   s    z*OBD_Enumerator._get_negative_response_descc                 C   s
   |   d¡S )NzNR: %OBD_NR.response_code%)r#   )Úresponser    r    r!   Ú_get_negative_response_label3   s    z+OBD_Enumerator._get_negative_response_labelc                 C   s   | j S r   )Úresults_with_positive_response©Úselfr    r    r!   Úfiltered_results8   s    zOBD_Enumerator.filtered_results)Ú__name__Ú
__module__Ú__qualname__Úcopyr   Z_supported_kwargsÚupdateÚboolÚ_supported_kwargs_docÚstaticmethodr"   r$   r&   Úpropertyr*   r    r    r    r!   r      s   ÿ



r   c                       sH   e Zd ZdZ‡ fdd„Z‡ fdd„Zeje_edd„ ƒZ	dd	„ Z
‡  ZS )
ÚOBD_Service_Enumeratorz0
    Base class for OBD_Service_Enumerators
    c           	   	      s®   t t| ƒj||ftdddƒddœ|¤Ž tƒ }| jD ]b\}}}}}|jd }tt| 	¡ j
 ¡ ƒƒ}z |dd„ t||dgƒD ƒ7 }W q4 ty”   Y q40 q4ttd	d„ |D ƒƒƒS )
Nr   éÿ   é    T)Ú
scan_rangeZ$exit_scan_on_first_negative_responsec                 S   s   g | ]}t |d d… dƒ‘qS )éþÿÿÿNé   )Úint©Ú.0Úir    r    r!   Ú
<listcomp>N   ó    z8OBD_Service_Enumerator.get_supported.<locals>.<listcomp>Zxxx00c                 S   s   g | ]}|d  r|‘qS )r6   r    r;   r    r    r!   r>   R   r?   )Úsuperr4   ÚexecuteÚrangeÚlistr'   Údata_recordsÚnextÚiterÚ	lastlayerÚfieldsÚkeysÚgetattrÚ	TypeErrorÚset)	r)   ÚsocketÚstateÚkwargsÚ	supportedÚ_ÚrZdrÚkey©Ú	__class__r    r!   Úget_supportedC   s&    
ÿ
þþ
ÿz$OBD_Service_Enumerator.get_supportedc                    sj   |  dd¡}|r,tt| ƒj||fi |¤Ž n:| j||fi |¤Ž}| j|= tt| ƒj||fd|i|¤Ž d S )Nr   Fr7   )Úpopr@   r4   rA   rV   Z_request_iterators)r)   rM   rN   rO   r   Zsupported_pidsrT   r    r!   rA   T   s    
ÿÿÿzOBD_Service_Enumerator.executec                 C   s*   t j}tƒ t _t| jd  ¡ ƒ}|t _|S )Nr   )r   Úcolor_themer   ÚreprrD   rG   ©r   Z	backup_ctÚloadr    r    r!   Úprint_payloada   s
    z$OBD_Service_Enumerator.print_payloadc                 C   s   |   |d | j¡S )Né   )Z
_get_labelr\   ©r)   Útupr    r    r!   Ú_get_table_entry_zj   s    z)OBD_Service_Enumerator._get_table_entry_z)r+   r,   r-   Ú__doc__rV   rA   r   r1   r2   r\   r`   Ú__classcell__r    r    rT   r!   r4   >   s   
r4   c                   @   s   e Zd Zedd„ ƒZdS )ÚOBD_DTC_Enumeratorc                 C   s"   t j}tƒ t _t| jƒ}|t _|S r   )r   rX   r   rY   ZdtcsrZ   r    r    r!   r\   p   s
    
z OBD_DTC_Enumerator.print_payloadN)r+   r,   r-   r2   r\   r    r    r    r!   rc   o   s   rc   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚOBD_S03_Enumeratorz Available DTCs in OBD service 03c                 K   s   t ƒ tƒ  gS r   )r   r   ©r)   rO   r    r    r!   Ú_get_initial_requests}   s    z(OBD_S03_Enumerator._get_initial_requestsc                 C   s   dS )Nz
Service 03r    r^   r    r    r!   Ú_get_table_entry_x�   s    z%OBD_S03_Enumerator._get_table_entry_xc                 C   s0   |d }|d u rdS |j dkr"dS d|j S d S )Nr]   ÚTimeouté   ÚNRz%d DTCs)ÚserviceÚcount©r)   r_   r   r    r    r!   Ú_get_table_entry_y…   s    z%OBD_S03_Enumerator._get_table_entry_yN©r+   r,   r-   Ú_descriptionrf   rg   rn   r    r    r    r!   rd   z   s   rd   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚOBD_S07_Enumeratorz Available DTCs in OBD service 07c                 K   s   t ƒ tƒ  gS r   )r   r   re   r    r    r!   rf   ‘   s    z(OBD_S07_Enumerator._get_initial_requestsc                 C   s   dS )Nz
Service 07r    r^   r    r    r!   rg   •   s    z%OBD_S07_Enumerator._get_table_entry_xN©r+   r,   r-   rp   rf   rg   r    r    r    r!   rq   Ž   s   rq   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚOBD_S0A_Enumeratorz Available DTCs in OBD service 10c                 K   s   t ƒ tƒ  gS r   )r   r	   re   r    r    r!   rf   �   s    z(OBD_S0A_Enumerator._get_initial_requestsc                 C   s   dS )Nz
Service 0Ar    r^   r    r    r!   rg   ¡   s    z%OBD_S0A_Enumerator._get_table_entry_xNrr   r    r    r    r!   rs   š   s   rs   c                   @   s,   e Zd Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚOBD_S01_Enumeratorz Available data in OBD service 01c                 K   s   |  dtdƒ¡}dd„ |D ƒS )Nr7   é   c                 s   s    | ]}t ƒ t|gd � V  qdS )©ÚpidN)r   r
   ©r<   Úxr    r    r!   Ú	<genexpr>®   r?   z;OBD_S01_Enumerator._get_initial_requests.<locals>.<genexpr>©rW   rB   ©r)   rO   r7   r    r    r!   rf   «   s    z(OBD_S01_Enumerator._get_initial_requestsc                 C   s   dS )Nz
Service 01r    r^   r    r    r!   rg   °   s    z%OBD_S01_Enumerator._get_table_entry_xc                 C   s:   |d }|d u rdS |j dkr"dS d|jd  ¡ j S d S ©Nr]   rh   ri   rj   z%sr   ©rk   rD   rG   Únamerm   r    r    r!   rn   ´   s    ÿz%OBD_S01_Enumerator._get_table_entry_yN)r+   r,   r-   ra   rp   rf   rg   rn   r    r    r    r!   rt   ¦   s
   rt   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚOBD_S02_Enumeratorz Available data in OBD service 02c                 K   s   |  dtdƒ¡}dd„ |D ƒS )Nr7   ru   c                 s   s(   | ] }t ƒ tt|gd �gd� V  qdS )rv   )ÚrequestsN)r   r   r   rx   r    r    r!   rz   Ä   s   ÿz;OBD_S02_Enumerator._get_initial_requests.<locals>.<genexpr>r{   r|   r    r    r!   rf   Á   s    ÿz(OBD_S02_Enumerator._get_initial_requestsc                 C   s   dS )Nz
Service 02r    r^   r    r    r!   rg   Ç   s    z%OBD_S02_Enumerator._get_table_entry_xc                 C   s:   |d }|d u rdS |j dkr"dS d|jd  ¡ j S d S r}   r~   rm   r    r    r!   rn   Ë   s    ÿz%OBD_S02_Enumerator._get_table_entry_yNro   r    r    r    r!   r€   ¾   s   r€   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚOBD_S06_Enumeratorz Available data in OBD service 06c                 K   s   |  dtdƒ¡}dd„ |D ƒS )Nr7   ru   c                 s   s    | ]}t ƒ t|gd � V  qdS ))ÚmidN)r   r   rx   r    r    r!   rz   Û   r?   z;OBD_S06_Enumerator._get_initial_requests.<locals>.<genexpr>r{   r|   r    r    r!   rf   Ø   s    z(OBD_S06_Enumerator._get_initial_requestsc                 C   s   dS )Nz
Service 06r    r^   r    r    r!   rg   Ý   s    z%OBD_S06_Enumerator._get_table_entry_xc                 C   sL   |d }|d }|d u rdS |j dkr*dS d|jd |jd  d¡f S d S )	Né   r]   rh   ri   rj   ú	0x%02x %sr   z%OBD_S06_PR_Record.mid%)rk   rƒ   rD   r#   )r)   r_   Úreqr   r    r    r!   rn   á   s    þÿz%OBD_S06_Enumerator._get_table_entry_yNro   r    r    r    r!   r‚   Õ   s   r‚   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚOBD_S08_Enumeratorz Available data in OBD service 08c                 K   s   |  dtdƒ¡}dd„ |D ƒS )Nr7   ru   c                 s   s    | ]}t ƒ t|gd � V  qdS ))ÚtidN)r   r   rx   r    r    r!   rz   ô   r?   z;OBD_S08_Enumerator._get_initial_requests.<locals>.<genexpr>r{   r|   r    r    r!   rf   ñ   s    z(OBD_S08_Enumerator._get_initial_requestsc                 C   s   dS )Nz
Service 08r    r^   r    r    r!   rg   ö   s    z%OBD_S08_Enumerator._get_table_entry_xc                 C   sH   |d }|d u rdS |j dkr"dS d|d jd |jd  ¡ jf S d S ©Nr]   rh   ri   rj   r…   r„   r   )rk   rˆ   rD   rG   r   rm   r    r    r!   rn   ú   s    ÿz%OBD_S08_Enumerator._get_table_entry_yNro   r    r    r    r!   r‡   î   s   r‡   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚOBD_S09_Enumeratorz Available data in OBD service 09c                 K   s   |  dtdƒ¡}dd„ |D ƒS )Nr7   ru   c                 s   s    | ]}t ƒ t|gd � V  qdS ))ÚiidN)r   r   rx   r    r    r!   rz   
  r?   z;OBD_S09_Enumerator._get_initial_requests.<locals>.<genexpr>r{   r|   r    r    r!   rf     s    z(OBD_S09_Enumerator._get_initial_requestsc                 C   s   dS )Nz
Service 09r    r^   r    r    r!   rg     s    z%OBD_S09_Enumerator._get_table_entry_xc                 C   sH   |d }|d u rdS |j dkr"dS d|d jd |jd  ¡ jf S d S r‰   )rk   r‹   rD   rG   r   rm   r    r    r!   rn     s    ÿÿz%OBD_S09_Enumerator._get_table_entry_yNro   r    r    r    r!   rŠ     s   rŠ   c                   @   s$   e Zd Zedd„ ƒZedd„ ƒZdS )ÚOBD_Scannerc                 C   s   | j jS r   )ÚconfigurationZ
test_casesr(   r    r    r!   Úenumerators  s    zOBD_Scanner.enumeratorsc                 C   s   t tttttttgS r   )rt   r€   r‚   r‡   rŠ   rd   rq   rs   r(   r    r    r!   Údefault_test_case_clss!  s    þz"OBD_Scanner.default_test_case_clssN)r+   r,   r-   r3   rŽ   r�   r    r    r    r!   rŒ     s   
rŒ   )/r.   Zscapy.compatr   r   r   r   Z scapy.contrib.automotive.obd.obdr   r   r   r	   r
   r   r   r   r   r   r   Zscapy.configr   Zscapy.packetr   Zscapy.themesr   Z+scapy.contrib.automotive.scanner.enumeratorr   r   r   Z)scapy.contrib.automotive.scanner.executorr   Zscapy.contrib.automotive.ecur   Z*scapy.contrib.automotive.scanner.test_caser   r   r   r4   rc   rd   rq   rs   rt   r€   r‚   r‡   rŠ   rŒ   r    r    r    r!   Ú<module>   s*   4!1