o
    àý°j+  ã                   @   s    d dl Z d dlmZ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dS )é    N)ÚHeaderÚImpactPacketExceptionÚPacketBufferc                   @   s¾   e Zd ZdZdZdZd*dd„Zdd„ Zdd	„ Zd
d„ Z	e
dd„ ƒZe
dd„ ƒZe
dd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ ZdS )+ÚIP6_Extension_Headeréÿÿÿÿé   Nc                 C   s4   t  | |  ¡ ¡ g | _|r|  |¡ d S |  ¡  d S ©N)r   Ú__init__Úget_headers_field_sizeÚ_option_listÚload_headerÚreset©ÚselfÚbuffer© r   ú‘/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/IP6_Extension_Headers.pyr	      s
   zIP6_Extension_Header.__init__c                 C   s®   |   ¡ }|  ¡ }|  ¡ }d| jj d }|dt|ƒ d 7 }|dt|ƒ d 7 }|dt|ƒ d 7 }|d7 }| jD ]}t|ƒ}| d¡}dd„ |D ƒ}|d |¡d 7 }q9|S )	NúHeader Extension Name: Ú
úHeader Type Value: úNext Header: úHeader Extension Length: z	Options:
c                 S   s   g | ]}d | ‘qS )z    r   )Ú.0Úsr   r   r   Ú
<listcomp>0   s    z0IP6_Extension_Header.__str__.<locals>.<listcomp>)	Úget_header_typeÚget_next_headerÚget_header_extension_lengthÚ	__class__ÚHEADER_EXTENSION_DESCRIPTIONÚstrr   ÚsplitÚjoin)r   Úheader_typeÚnext_header_valueÚheader_ext_lengthr   ÚoptionÚ
option_strr   r   r   Ú__str__"   s   

zIP6_Extension_Header.__str__c                 C   sà   |   |d |  ¡ … ¡ |  ¡ d d }||  ¡ 8 }t d||  ¡ d … ¡}|t|ƒkr/tdƒ‚|dkrn|d }|tjkrN| j 	tƒ ¡ |d8 }|dd … }n|d }|d7 }| j 	t
|ƒ¡ ||8 }||d … }|dks3d S d S )Né   é   ÚBz)Cannot load options from truncated packetr   r   )Úset_bytes_from_stringr
   r   ÚarrayÚlenr   ÚOption_PAD1ÚOPTION_TYPE_VALUEr   ÚappendÚOption_PADN)r   r   Úremaining_bytesÚoption_typeÚoption_lengthr   r   r   r   5   s$   
íz IP6_Extension_Header.load_headerc                 C   s   d S r   r   ©r   r   r   r   r   T   ó   zIP6_Extension_Header.resetc                 C   ó   | j S r   )ÚHEADER_TYPE_VALUE©Úclsr   r   r   Úget_header_type_valueW   s   z*IP6_Extension_Header.get_header_type_valuec                 C   s:   i }|   ¡ D ]}| ¡ }|s||| ¡ < q| |¡ q|S r   )Ú__subclasses__Úget_extension_headersr<   Úupdate)r;   Úheader_typesÚsubclassÚsubclass_header_typesr   r   r   r>   [   s   z*IP6_Extension_Header.get_extension_headersc                 C   s   t d|  ƒ‚)Nz/Class method %s.get_decoder must be overridden.)ÚRuntimeErrorr:   r   r   r   Úget_decoderj   s   z IP6_Extension_Header.get_decoderc                 C   s
   | j  ¡ S r   )r   r<   r6   r   r   r   r   n   ó   
z$IP6_Extension_Header.get_header_typec                 C   ó   t jS r   )r   ÚEXTENSION_HEADER_FIELDS_SIZEr6   r   r   r   r
   q   ó   z+IP6_Extension_Header.get_headers_field_sizec                 C   s$   |   ¡ }| jD ]}|| ¡ 7 }q|S r   )r
   r   Úget_len)r   Úheader_sizer&   r   r   r   Úget_header_sizet   s   
z$IP6_Extension_Header.get_header_sizec                 C   ó
   |   d¡S ©Nr   ©Úget_byter6   r   r   r   r   z   rE   z$IP6_Extension_Header.get_next_headerc                 C   rL   ©Nr)   rN   r6   r   r   r   r   }   rE   z0IP6_Extension_Header.get_header_extension_lengthc                 C   ó   |   d|d@ ¡ d S )Nr   éÿ   ©Úset_byte)r   Únext_headerr   r   r   Úset_next_header€   ó   z$IP6_Extension_Header.set_next_headerc                 C   rQ   )Nr)   rR   rS   )r   Úheader_extension_lengthr   r   r   Úset_header_extension_lengthƒ   rW   z0IP6_Extension_Header.set_header_extension_lengthc                 C   s   | j  |¡ d S r   )r   r1   ©r   r&   r   r   r   Ú
add_option†   ó   zIP6_Extension_Header.add_optionc                 C   r8   r   )r   r6   r   r   r   Úget_options‰   rH   z IP6_Extension_Header.get_optionsc                 C   sN   |   ¡ }|  |  ¡ d d ¡ |  ¡ }| jD ]}|| ¡ 7 }q|r%|| S |S )Nr*   r)   )Úget_data_as_stringrY   rK   Úget_buffer_as_stringr   )r   ÚdataÚheader_bytesr&   r   r   r   Ú
get_packetŒ   s   
zIP6_Extension_Header.get_packetc                 C   s,   t  | |¡ t|tƒr|  | ¡ ¡ d S d S r   )r   ÚcontainsÚ
isinstancer   rV   r   )r   ÚaHeaderr   r   r   rc   œ   s   
ÿzIP6_Extension_Header.containsc                 C   s   |   ¡  ¡ S r   )ÚparentÚget_pseudo_headerr6   r   r   r   rg   ¡   s   z&IP6_Extension_Header.get_pseudo_headerr   )Ú__name__Ú
__module__Ú__qualname__r9   rG   ÚEXTENSION_HEADER_DECODERr	   r(   r   r   Úclassmethodr<   r>   rD   r   r
   rK   r   r   rV   rY   r[   r]   rb   rc   rg   r   r   r   r   r      s4    



r   c                   @   sT   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚExtension_Optioné   r   c                 C   s6   |t jkrtd|t jf ƒ‚t | |¡ |  |¡ d S )Nz2Option size of % is greater than the maximum of %d)rm   ÚMAX_OPTION_LENr   r   r	   Úset_option_type)r   r4   Úsizer   r   r   r	   ª   s   
zExtension_Option.__init__c                 C   sP   |   ¡ }|  ¡ }dt| jjƒ d }|dt|ƒ d 7 }|dt|ƒ d 7 }|S )NzOption Name: r   zOption Type: zOption Length: )Úget_option_typeÚget_option_lengthr    r   ÚOPTION_DESCRIPTION)r   r4   r5   r   r   r   r   r(   °   s   zExtension_Option.__str__c                 C   ó   |   d|¡ d S rM   rS   )r   r4   r   r   r   rp   º   r\   z Extension_Option.set_option_typec                 C   rL   rM   rN   r6   r   r   r   rr   ½   rE   z Extension_Option.get_option_typec                 C   ru   rP   rS   )r   Úlengthr   r   r   Úset_option_lengthÀ   r\   z"Extension_Option.set_option_lengthc                 C   rL   rP   rN   r6   r   r   r   rs   Ã   rE   z"Extension_Option.get_option_lengthc                 C   sH   |   t|ƒ¡ |  ¡ }|  ¡ }t d|¡|ddt|ƒ …< |  |¡ d S )Nr+   r   )rw   r.   Ú	get_bytesr-   Ú	set_bytes)r   r`   Úoption_bytesr   r   r   Úset_dataÆ   s
   zExtension_Option.set_datac                 C   s   t |  ¡ ƒS r   )r.   rx   r6   r   r   r   rI   Î   s   zExtension_Option.get_lenN)rh   ri   rj   ro   r0   r	   r(   rp   rr   rw   rs   r{   rI   r   r   r   r   rm   ¦   s    
rm   c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )r/   r   zPad1 Optionc                 C   s   t  | tjd¡ d S rP   )rm   r	   r/   r0   r6   r   r   r   r	   Õ   rW   zOption_PAD1.__init__c                 C   s   dS rP   r   r6   r   r   r   rI   Ø   r7   zOption_PAD1.get_lenN)rh   ri   rj   r0   rt   r	   rI   r   r   r   r   r/   Ñ   s
    r/   c                   @   s   e Zd ZdZdZdd„ ZdS )r2   r)   zPadN Optionc                 C   s6   |dk rt dƒ‚t | tj|¡ |  d|d  ¡ d S )Nr   z2PadN Extension Option must be greater than 2 bytesó    )r   rm   r	   r2   r0   r{   )r   Úpadding_sizer   r   r   r	   ß   s   zOption_PADN.__init__N)rh   ri   rj   r0   rt   r	   r   r   r   r   r2   Û   s    r2   c                   @   s>   e Zd ZdZdZee Zddd„Zdd„ Zdd	„ Zd
d„ Z	dS )ÚBasic_Extension_Headeri   r*   Nc                 C   s   d| _ t | |¡ d S ©NF)Úpaddedr   r	   r   r   r   r   r	   ë   s   zBasic_Extension_Header.__init__c                 C   s    |   d¡ |  d¡ |  ¡  d S rM   )rV   rY   Úadd_paddingr6   r   r   r   r   ï   s   

zBasic_Extension_Header.resetc                 C   s.   | j r| j ¡  d| _ t | |¡ |  ¡  d S r   )r€   r   Úpopr   r[   r�   rZ   r   r   r   r[   ô   s
   
z!Basic_Extension_Header.add_optionc                 C   sz   d|   ¡ d  }|   ¡ | tjkrtdƒ‚d|  k rdk r8n n|dkr,|  tƒ ¡ n|  t|ƒ¡ d| _d S d| _d S )Nr*   z Not enough space for the paddingr   r)   TF)rK   r~   ÚMAX_HEADER_LENÚ	Exceptionr[   r/   r2   r€   )r   Úrequired_octetsr   r   r   r�   ý   s   

z"Basic_Extension_Header.add_paddingr   )
rh   ri   rj   ÚMAX_OPTIONS_LENÚMIN_HEADER_LENrƒ   r	   r   r[   r�   r   r   r   r   r~   æ   s    
	r~   c                   @   ó    e Zd ZdZdZedd„ ƒZdS )Ú
Hop_By_Hopr   zHop By Hop Optionsc                 C   ó   ddl m} |jS ©Nr   ©ÚImpactDecoder)Úimpacketr�   ÚHopByHopDecoder©r   r�   r   r   r   rD     ó   zHop_By_Hop.get_decoderN©rh   ri   rj   r9   r   rl   rD   r   r   r   r   r‰     ó
    r‰   c                   @   rˆ   )ÚDestination_Optionsé<   zDestination Optionsc                 C   rŠ   r‹   )rŽ   r�   ÚDestinationOptionsDecoderr�   r   r   r   rD     r‘   zDestination_Options.get_decoderNr’   r   r   r   r   r”     r“   r”   c                   @   s\   e Zd ZdZdZdZdd„ Zdd„ Zedd	„ ƒZ	d
d„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚRouting_Optionsé+   zRouting Optionsr*   c                 C   s,   |   d¡ |  d¡ |  d¡ |  d¡ d S rM   )rV   rY   Úset_routing_typeÚset_segments_leftr6   r   r   r   r   #  s   


zRouting_Options.resetc                 C   s    |   ¡ }|  ¡ }|  ¡ }|  ¡ }|  ¡ }d| jj d }|dt|ƒ d 7 }|dt|ƒ d 7 }|dt|ƒ d 7 }|dt|ƒ d 7 }|dt|ƒ d 7 }|S )Nr   r   r   r   r   zRouting Type: zSegments Left: )r   r   r   Úget_routing_typeÚget_segments_leftr   r   r    )r   r#   r$   r%   Úrouting_typeÚsegments_leftr   r   r   r   r(   )  s   zRouting_Options.__str__c                 C   rŠ   )Nr)   rŒ   )Ú r�   ÚRoutingOptionsDecoderr�   r   r   r   rD   9  r‘   zRouting_Options.get_decoderc                 C   rF   r   )r—   Ú"ROUTING_OPTIONS_HEADER_FIELDS_SIZEr6   r   r   r   r
   >  rH   z&Routing_Options.get_headers_field_sizec                 C   ru   ©Nr   rS   )r   r�   r   r   r   r™   A  r\   z Routing_Options.set_routing_typec                 C   rL   r¢   rN   r6   r   r   r   r›   D  rE   z Routing_Options.get_routing_typec                 C   ru   ©Né   rS   )r   rž   r   r   r   rš   G  r\   z!Routing_Options.set_segments_leftc                 C   rL   r£   rN   r6   r   r   r   rœ   J  rE   z!Routing_Options.get_segments_leftN)rh   ri   rj   r9   r   r¡   r   r(   rl   rD   r
   r™   r›   rš   rœ   r   r   r   r   r—     s    
r—   )r-   Úimpacket.ImpactPacketr   r   r   r   rm   r/   r2   r~   r‰   r”   r—   r   r   r   r   Ú<module>   s    +
&		