
    h
8                        d dl Z d dl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 d dlmZ  G d de          Z G d de          Z G d	 d
e          Z eeed            G d de          Z eeed            G d de          Z eeed            G d de          Z eeed            G d de          Z eeed            G d de          Z eeed            G d de          Z eeed            G d d e          Z eeed!            G d" d#e          Z eeed$            G d% d&e          Z eeed'            G d( d)e          Z  eee d*            G d+ d,e          Z! eee!d-            G d. d/e          Z" eee"d0            G d1 d2e          Z# eee#d3            G d4 d5e          Z$ eee$d6            G d7 d8e          Z% eee%d9            G d: d;e          Z& eee&d<            G d= d>e          Z' eee'd?            G d@ dAe          Z( eee(dB            G dC dDe          Z) eee)dE            G dF dGe          Z* eee*dH            G dI dJe          Z+ eee+dK            G dL dMe          Z, eee,dN            G dO dPe          Z- eee-dQ            G dR dSe          Z. eee.dT            G dU dVe          Z/ eee/dW            G dX dYe          Z0 eee0dZ            G d[ d\e          Z1 eee1d]            G d^ d_e          Z2 G d` dae          Z3 G db dce          Z4 G dd dee          Z5 G df dge          Z6 G dh die          Z7 G dj dke          Z8 G dl dme          Z9 G dn doe          Z: G dp dqe          Z; G dr dse          Z< G dt due          Z= G dv dwe          Z> G dx dye          Z? G dz d{e          Z@ G d| d}e          ZA G d~ de          ZB G d de          ZC eeeC           dS )    N)Packetbind_layersbind_bottom_up)	XIntField
FlagsFieldByteEnumFieldThreeBytesField	XBitField
ShortFieldIntFieldXShortField	ByteField
XByteFieldStrFixedLenFieldLEShortField)CANc                   ~    e Zd ZdZ edddg d           eddd           edd	           ed
d          gZd Z	dS )CCPzCAN Calibration Protocolflagsr      )errorremote_transmission_requestextended
identifier   length   reservedc                 
    |d fS N )selfps     `/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/automotive/ccp.pyextract_paddingzCCP.extract_padding   s    $w    N)
__name__
__module____qualname__namer   r
   r   r	   fields_descr%   r!   r&   r$   r   r      s        %D
7Aq #/ #/ #/ 	0 	0 		,2&&	(A
A&&K    r&   r   c                       e Zd Zi ddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.Zd/Z ed0de           ed1d2          gZd3 Zd4S )5CRO   CONNECT   GET_CCP_VERSION   EXCHANGE_ID   GET_SEED   UNLOCK   SET_MTAr   DNLOAD#   DNLOAD_6   UPLOAD   SHORT_UP   SELECT_CAL_PAGE   GET_DAQ_SIZE   SET_DAQ_PTR   	WRITE_DAQ   
START_STOP   
DISCONNECT   SET_S_STATUSGET_S_STATUSBUILD_CHKSUMCLEAR_MEMORYPROGRAM	PROGRAM_6MOVETESTGET_ACTIVE_CAL_PAGESTART_STOP_ALLDIAG_SERVICEACTION_SERVICE)            "         	   r       !   zCommand Receive Objectcmdctrr   c                 6    t          j        d| j                  S NBstructpackre   r"   s    r$   hashretzCRO.hashretF       {3)))r&   N)	r'   r(   r)   commandsr*   r   r   r+   rm   r!   r&   r$   r-   r-   !   sT       i 	m 	j	
 	h 	i 	h 	j 	h 	j 	 	n 	m 	k 	l  	l!" 	n#$ #9  H< $DeT8,,	%K
* * * * *r&   r-   c                   B    e Zd Z edd           eddd          gZdS )r/   station_addressr   ccp_reserved   r=   r   Nr'   r(   r)   r   r   r+   r!   r&   r$   r/   r/   L   :        &**Q???KKKr&   r/   r.   rd   c                   X    e Zd Z edd           edd           eddd          gZdS )	r1   main_protocol_versionr   release_versionrr   rs   r=   rt   Nr'   r(   r)   r   r   r+   r!   r&   r$   r1   r1   V   J        
*A..
$a((Q???KKKr&   r1   r0   c                   ,    e Zd Z eddd          gZdS )r3   ccp_master_device_id         rI   rt   Nr'   r(   r)   r   r+   r!   r&   r$   r3   r3   a   s+        /QGGGKKKr&   r3   r2   c                   B    e Zd Z edd           eddd          gZdS )r5   resourcer   rr      r`   rt   Nr{   r!   r&   r$   r5   r5   j   s9        
:q!!Q???KKKr&   r5   r4   c                   ,    e Zd Z eddd          gZdS )r7   keyr   rI   rt   Nr   r!   r&   r$   r7   r7   t   s*        A666KKKr&   r7   r6   c                   T    e Zd Z edd           edd           edd          gZdS )r9   mta_numr   address_extensionaddressNr'   r(   r)   r   r   r+   r!   r&   r$   r9   r9   }   sC        
9a  
&**	)QKKKr&   r9   r8   c                   B    e Zd Z edd           eddd          gZdS )r:   sizer   data        r`   rt   Nr{   r!   r&   r$   r:   r:      s9        
61Q777KKKr&   r:   r   c                   ,    e Zd Z eddd          gZdS )r<   r   r   rI   rt   Nr   r!   r&   r$   r<   r<      *        Q777KKKr&   r<   r;   c                   B    e Zd Z edd           eddd          gZdS )r>   r   r   rr   r   r`   rt   Nr{   r!   r&   r$   r>   r>      s9        
61Q???KKKr&   r>   r=   c                   T    e Zd Z edd           edd           edd          gZdS )r@   r   r   r   r   Nr   r!   r&   r$   r@   r@      sC        
61
&**	)QKKKr&   r@   r?   c                   ,    e Zd Z eddd          gZdS )rB   rr      rI   rt   Nr   r!   r&   r$   rB   rB      *        Q???KKKr&   rB   rA   c                   T    e Zd Z edd           edd           edd          gZdS )rD   DAQ_numr   rr   DTO_identifierNr   r!   r&   r$   rD   rD      sC        
9a  
>1%%	"A&&KKKr&   rD   rC   c                   n    e Zd Z edd           edd           edd           eddd          gZd	S )
rF   r   r   ODT_numODT_elementrr      r   rt   Nr{   r!   r&   r$   rF   rF      sW        
9a  
9a  
=!$$Q???	KKKr&   rF   rE   c                   T    e Zd Z edd           edd           edd          gZdS )rH   DAQ_sizer   r   r   Nr   r!   r&   r$   rH   rH      sC        
:q!!
&**	)QKKKr&   rH   rG   c                       e Zd Z edd           edd           edd           edd           edd          gZdS )rJ   moder   r   r   event_channeltransmission_rateN)r'   r(   r)   r   r   r+   r!   r&   r$   rJ   rJ      sa        
61
9a  
9a  
?A&&'++KKKr&   rJ   rI   c                   z    e Zd Z eddddd           eddd	           ed
d           eddd	          gZdS )rL   typer   	temporaryend_of_sessionr   r.   ccp_reserved0   r.   rt   rq   rr      r8   N)r'   r(   r)   r   r   r   r+   r!   r&   r$   rL   rL      si        fa[5E!F!FGG+a@@@&**Q???	KKKr&   rL   rK   c                   N    e Zd ZdZ edddg d           eddd	          gZd
S )rN   zSet Session Statussession_statusr   r   CALDAQRESUMERES0RES1RES2STORERUNrr   r   r`   rt   N)r'   r(   r)   r*   r   r   r+   r!   r&   r$   rN   rN      sY        D
#Q ,L ,L ,L 	M 	MQ???KKKr&   rN   rM   c                   ,    e Zd Z eddd          gZdS )rO   rr   r   rI   rt   Nr   r!   r&   r$   rO   rO      r   r&   rO   rZ   c                   B    e Zd Z edd           eddd          gZdS )rP   r   r   rr   r   r8   rt   Nr'   r(   r)   r   r   r+   r!   r&   r$   rP   rP   	  9        Q???KKKr&   rP   r[   c                   B    e Zd Z edd           eddd          gZdS )rQ   r   r   rr   r   r8   rt   Nr   r!   r&   r$   rQ   rQ     r   r&   rQ   r\   c                   `    e Zd Z edd           eddd            eddd	           gZd
S )rR   r   r   r   r&   c                     | j         S r    r   pkts    r$   <lambda>zPROGRAM.<lambda>!  s     r&   length_fromrr   r   c                     d| j         z
  S )Nr`   r   r   s    r$   r   zPROGRAM.<lambda>#  s    SX r&   Nr{   r!   r&   r$   rR   rR     sb        
61%9%9	; 	; 	;%=%=	? 	? 	?	KKKr&   rR   r]   c                   ,    e Zd Z eddd          gZdS )rS   r   r   rI   rt   Nr   r!   r&   r$   rS   rS   *  r   r&   rS   r^   c                   B    e Zd Z edd           eddd          gZdS )rT   r   r   rr   r   r8   rt   Nr   r!   r&   r$   rT   rT   3  r   r&   rT   r_   c                   B    e Zd Z edd           eddd          gZdS )rU   rq   r   rr   rs   r=   rt   Nru   r!   r&   r$   rU   rU   =  rv   r&   rU   r`   c                   ,    e Zd Z eddd          gZdS )rV   rr   r   rI   rt   Nr   r!   r&   r$   rV   rV   G  r   r&   rV   ra   c                   J    e Zd Z eddddd           eddd	          gZd
S )rW   r   r   stopstartr   rr   r   r`   rt   N)r'   r(   r)   r   r   r+   r!   r&   r$   rW   rW   P  sC        faV!8!899Q???KKKr&   rW   r   c                   B    e Zd Z edd           eddd          gZdS )rX   diag_servicer   rr   rs   r=   rt   Nr'   r(   r)   r   r   r+   r!   r&   r$   rX   rX   [  s9        
>1%%Q???KKKr&   rX   rb   c                   B    e Zd Z edd           eddd          gZdS )rY   action_servicer   rr   rs   r=   rt   Nr   r!   r&   r$   rY   rY   e  s:        
#Q''Q???KKKr&   rY   rc   c                   ,    e Zd Z eddd          gZdS )DEFAULT_DTOloadr   r`   rt   Nr   r!   r&   r$   r   r   q  r   r&   r   c                   X    e Zd Z edd           edd           eddd          gZdS )	GET_CCP_VERSION_DTOry   r   rz   rr         r   rt   Nr{   r!   r&   r$   r   r   w  r|   r&   r   c            	           e Zd Z edd           edd           edd           edd           eddd	          gZd
S )EXCHANGE_ID_DTOslave_device_ID_lengthr   data_type_qualifierresource_availability_maskresource_protection_maskrr   r   r.   rt   Nr'   r(   r)   r   r   r+   r!   r&   r$   r   r     sj        	*A..	'++	.22	,a00Q???KKKr&   r   c                   B    e Zd Z edd           eddd          gZdS )GET_SEED_DTOprotection_statusr   seed       r=   rt   Nr{   r!   r&   r$   r   r     s:        
&**Q777KKKr&   r   c                   B    e Zd Z edd           eddd          gZdS )
UNLOCK_DTOprivilege_statusr   rr   rs   r=   rt   Nr   r!   r&   r$   r   r     s:        	$a((Q???KKKr&   r   c                   >    e Zd Z edd           edd          gZdS )
DNLOAD_DTOMTA0_extensionr   MTA0_addressNr   r!   r&   r$   r   r     4        
#Q''	.!$$KKKr&   r   c                   >    e Zd Z edd           edd          gZdS )DNLOAD_6_DTOr   r   r   Nr   r!   r&   r$   r   r     r   r&   r   c                   ,    e Zd Z eddd          gZdS )
UPLOAD_DTOr   r   r`   rt   Nr   r!   r&   r$   r   r     r   r&   r   c                   ,    e Zd Z eddd          gZdS )SHORT_UP_DTOr   r   r`   rt   Nr   r!   r&   r$   r   r     r   r&   r   c                   X    e Zd Z edd           edd           eddd          gZdS )	GET_DAQ_SIZE_DTODAQ_list_sizer   	first_pidrr   r   r   rt   Nr{   r!   r&   r$   r   r     sH        
?A&&
;""Q???KKKr&   r   c                   `    e Zd Z edddg d           edd           eddd	          gZd
S )GET_S_STATUS_DTOr   r   r   r   information_qualifierinformationr   r   rt   N)r'   r(   r)   r   r   r   r+   r!   r&   r$   r   r     sd        
#Q ,L ,L ,L 	M 	M	)1--A>>>	KKKr&   r   c                   `    e Zd Z edd           eddd            eddd	           gZd
S )BUILD_CHKSUM_DTOchecksum_sizer   checksum_datar   c                     | j         S r    r   r   s    r$   r   zBUILD_CHKSUM_DTO.<lambda>  s	    1B r&   r   rr   r&   c                     d| j         z
  S )Nr=   r   r   s    r$   r   zBUILD_CHKSUM_DTO.<lambda>  s    S5F1F r&   Nr   r!   r&   r$   r   r     sh        	/1%%+%B%B	D 	D 	D%F%F	H 	H 	H	KKKr&   r   c                   >    e Zd Z edd           edd          gZdS )PROGRAM_DTOr   r   r   Nr'   r(   r)   r   r   r+   r!   r&   r$   r   r     4        	"A&&	.!$$KKKr&   r   c                   >    e Zd Z edd           edd          gZdS )PROGRAM_6_DTOr   r   r   Nr  r!   r&   r$   r  r    r  r&   r  c                   >    e Zd Z edd           edd          gZdS )GET_ACTIVE_CAL_PAGE_DTOr   r   r   Nr   r!   r&   r$   r  r    s4        
&**	)QKKKr&   r  c                   X    e Zd Z edd           edd           eddd          gZdS )	DIAG_SERVICE_DTOdata_lengthr   	data_typerr   r   r   rt   Nr   r!   r&   r$   r  r    H        	-##	+q!!Q???KKKr&   r  c                   X    e Zd Z edd           edd           eddd          gZdS )	ACTION_SERVICE_DTOr	  r   r
  rr   r   r   rt   Nr   r!   r&   r$   r  r    r  r&   r  c                       e Zd Zej        dgz   Zi dddddddd	d
dddddddddddddddddddddd d!d"d#d$d%iZ ed&d'           ed(de           ed)d          gZ	d* Z
 fd+Zd, Zed-             Zd. Zd/ Z xZS )0DTOpayload_clsr   zacknowledge / no errorr.   zDAQ processor overloadr\   zcommand processor busyrA   zDAQ processor busyr4   zinternal timeoutr]   zkey requestr_   zsession status requestrb   zcold start requestrc   zcal. data init. requestr^   zDAQ list init. requestr;   zcode update request0   zunknown command1   zcommand syntax2   zparameter(s) out of range3   zaccess denied4   overload5   zaccess locked6   zresource/function not available	packet_id   return_codere   c                 p    t           | _        d|v r|d         | _        |d= t          j        | g|R i | d S )Nr  )r   r  r   __init__)r"   argskwargss      r$   r  zDTO.__init__  sP    &F""%m4D}%.t...v.....r&   c                 t    t          t          |                               |          o| j        |j        k    S r    )superr  __eq__r  )r"   other	__class__s     r$   r"  z
DTO.__eq__  s6    S$&&u-- 2 11	2r&   c                     | j         S r    )r  )r"   payloads     r$   guess_payload_classzDTO.guess_payload_class  s    r&   c                 B   	 i dt           dt          dt          dt          dt          dt
          dt          dt          d	t          d
t          dt          dt          dt          dt          dt          dt          |          S # t           $ r
 t"          cY S w xY w)Nr   r=   ra   rZ   r[   r?   r4   r6   rC   r2   r]   r0   rb   rc   r^   r;   )r   r   r  r   r   r   r   r   r   r   r   r   r  r  r  r   KeyErrorr   rw   s    r$   get_dto_clszDTO.get_dto_cls  s   	jj - &	
 & l l j & o k ) & ( m  l!" # $  	 	 		s   BB
 
BBc                 v   t          |d          sdS | j        |j        k    rdS t          |d          sdS |                     |j                  }| j        |k    r]| j        t
          k    rMt          | j                  }|                                  | 	                     ||                     || _        dS )a  In CCP, the payload of a DTO packet is dependent on the cmd field
        of a corresponding CRO packet. Two packets correspond, if there
        ctr field is equal. If answers detect the corresponding CRO, it will
        interpret the payload of a DTO with the correct class. In CCP, there is
        no other way, to determine the class of a DTO payload. Since answers is
        called on sr and sr1, this modification of the original answers
        implementation will give a better user experience. re   r   rd   r.   )
hasattrre   r*  rd   r  r   bytesr   remove_payloadadd_payload)r"   r#  
new_pl_clsr   s       r$   answerszDTO.answers4  s     ue$$ 	18uy  1ue$$ 	1%%ei00
z)) K//##D!!!ZZ--...)Dqr&   c                 6    t          j        d| j                  S rg   ri   rl   s    r$   rm   zDTO.hashretL  rn   r&   )r'   r(   r)   r   	__slots__return_codesr   r   r   r+   r  r"  r'  staticmethodr*  r1  rm   __classcell__)r$  s   @r$   r  r    s        M?2I&& 	& 	"	
 	  	m 	& 	" 	' 	& 	# 	 	 	) 	o  	j!" 	o#$ 	/% L* 	
;%%mT<88	%K/ / /2 2 2 2 2        \.  0* * * * * * *r&   r  )Drj   scapy.packetr   r   r   scapy.fieldsr   r   r   r	   r
   r   r   r   r   r   r   r   scapy.layers.canr   r   r-   r/   r1   r3   r5   r7   r9   r:   r<   r>   r@   rB   rD   rF   rH   rJ   rL   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r!   r&   r$   <module>r:     s    < < < < < < < < < <: : : : : : : : : : : : : : : : : : : : : : : : : : : : !              #   &* &* &* &* &*& &* &* &*V    f    Cd # # # #    f    Cd + + + +    &    C$ ' ' ' '    v    Ct $ $ $ $    V    CT " " " "    f    Cd # # # #    V    CT " " " "    v    Ct $ $ $ $    V    CT " " " "    v    Ct $ $ $ $    f    Cd + + + +    6    C4 ( ( ( (    &    C$ ' ' ' '        C % % % %        C & & & &        C & & & &    6    C4 ( ( ( (    6    C4 ( ( ( (    6    C4 ( ( ( (    6    C4 ( ( ( (    f    Cd # # # #        C % % % %    6    C4            6    C4            &    C$$ / / / /    V    CT * * * *    6    C4 ( ( ( (    V    CT * * * *
    &       &       f       6                     6              6       v       v       v       &       F       f       v          \* \* \* \* \*& \* \* \*~ sC     r&   