a
    kÄ#dþ  ã                   @   s˜   d dl Z d dlmZ d dlmZ d dlmZ d dlmZm	Z	 dd„ Z
dd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ ZG dd„ deƒZG dd„ deƒZdS )é    N)Úconf)Úlog_automotive)ÚStrLenField)ÚRandBinÚRandNumc                  C   s,   t jd d } | r| S t d¡ tdƒ‚d S )NÚXCPZMAX_CTOz'Define conf.contribs['XCP']['MAX_CTO'].z+conf.contribs['XCP']['MAX_CTO'] not defined©r   Úcontribsr   ÚwarningÚKeyError)Zmax_cto© r   úY/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/automotive/xcp/utils.pyÚget_max_cto   s
    
r   c                  C   s,   t jd d } | r| S t d¡ tdƒ‚d S )Nr   ZMAX_DTOz'Define conf.contribs['XCP']['MAX_DTO'].z+conf.contribs['XCP']['MAX_DTO'] not definedr   )Zmax_dtor   r   r   Úget_max_dto   s
    
r   c                  C   s0   t jd d } | r| dv r| S t d¡ dS d S )Nr   ZAddress_Granularity_Byte)é   é   é   zODefine conf.contribs['XCP']['Address_Granularity_Byte'].Assign either 1, 2 or 4r   )r   r	   r   r
   )Zaddress_granularityr   r   r   Úget_ag"   s    ÿr   c                   C   s   t jd d S )Nr   Ztimestamp_size)r   r	   r   r   r   r   Úget_timestamp_length3   s    r   c                  C   sR   z8t jd d } t jd d }|dkr4| dkr4W dS W dS  tyL   Y dS 0 d S )Nr   Úidentification_field_type_0Úidentification_field_type_1r   TF©r   r	   r   ©r   r   r   r   r   Ú$identification_field_needs_alignment7   s    ÿÿÿr   c                  C   sh   zNt jd d } t jd d }|dkr4| dkr4W dS |dkrJ| dkrJW dS W dS  tyb   Y dS 0 d S )Nr   r   r   r   r   r   r   r   r   r   r   Úget_daq_lengthF   s$    ÿÿÿÿr   c                  C   sD   z
t ƒ } W n ty   Y dS 0 | d8 } tƒ r6| d8 } | tƒ 8 } | S )Nr   r   )r   r   r   r   )Zdata_lengthr   r   r   Úget_daq_data_field_length[   s    

r   c                   @   s>   e Zd ZdZdgZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dS )ÚXCPEndiannessFieldz1Field which changes the endianness of a sub-fieldÚfldc                 C   s
   || _ d S ©N)r   )Úselfr   r   r   r   Ú__init__m   s    zXCPEndiannessField.__init__c                 C   sL   t jd d }|dkrdnd}|| jjdd…  | j_t | jj¡| j_dS )z Add the endianness to the formatr   Z
byte_orderr   ú>ú<N)r   r	   r   ÚfmtÚstructÚStruct)r   Z	byte_oderZ
endiannessr   r   r   Úset_endiannessp   s    z!XCPEndiannessField.set_endiannessc                 C   s   |   ¡  | j ||¡S r   )r&   r   Úgetfield)r   ÚpktÚsr   r   r   r'   x   s    zXCPEndiannessField.getfieldc                 C   s   |   ¡  | j |||¡S r   )r&   r   Úaddfield)r   r(   r)   Úvalr   r   r   r*   }   s    zXCPEndiannessField.addfieldc                 C   s   t | j|ƒS r   )Úgetattrr   )r   Úattrr   r   r   Ú__getattr__�   s    zXCPEndiannessField.__getattr__N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r    r&   r'   r*   r.   r   r   r   r   r   i   s   r   c                   @   s   e Zd Zdd„ ZdS )ÚStrVarLenFieldc                 C   s   t td|  ¡ pdƒƒS )Nr   i°  )r   r   Ú
max_length)r   r   r   r   Úrandval†   s    zStrVarLenField.randvalN)r/   r0   r1   r6   r   r   r   r   r4   …   s   r4   )r$   Zscapy.configr   Zscapy.contrib.automotiver   Zscapy.fieldsr   Zscapy.volatiler   r   r   r   r   r   r   r   r   Úobjectr   r4   r   r   r   r   Ú<module>   s   		