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    +
&		