o
    jL                     @   sD   d dl Z d dlZd dlmZmZmZ d dlmZ G dd deZdS )    N)HeaderDataarray_tobytes)IP6_Addressc                   @   s  e Zd ZdZeZdZdZdZdZdZ	dZ
dZdZd	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.ee*dedededededededifee*ddfee*dededife	e*ded ed!ed"ife
e+d#dfee+d$dfee+d%dfee+d&dfee+d'dfee+d(dfee+d)dfee+d*dfee+d+dfiZ/dd,d-Z0d.d/ Z1d0d1 Z2d2d3 Z3d4d5 Z4d6d7 Z5d8d9 Z6d:d; Z7d<d= Z8d>d? Z9d@dA Z:dBdC Z;dDdE Z<dFdG Z=dHdI Z>dJdK Z?e@ddLdMZAe@ddNdOZBe@dPdQ ZCe@ddRdSZDe@ddTdUZEe@ddVdWZFe@ddXdYZGe@dZd[ ZHe@d\d] ZIe@d^d_ ZJe@d`da ZKdbdc ZLddde ZMdfdg ZNdhdi ZOdjdk ZPdldm ZQdndo ZRdpdq ZSdrds ZTdtdu ZUe@ddvdwZVe@ddxdyZWe@ddzd{ZXd|d} ZYd~d ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd Zadd Zbdd Zcdd Zddd Zedd Zfdd Zgdd Zhdd Zidd Zjdd Zkdd Zldd Zmdd Zndd Zodd Zpdd Zqdd ZrdS )ICMP6:                                          r         zDestination unreachablezNo route to destinationzAdministratively prohibitedzBeyond scope of source addresszAddress unreachablezPort unreachablez+Source address failed ingress/egress policyzReject route to destinationzPacket too bigNzTime exceededzHop limit exceeded in transitz!Fragment reassembly time exceededzParameter problemz"Erroneous header field encounteredz)Unrecognized Next Header type encounteredz$Unrecognized IPv6 Option EncounteredzEcho requestz
Echo replyzRouter SolicitationzRouter AdvertisementzNeighbor SolicitationzNeighbor AdvertisementzRedirect MessagezNode Information QueryzNode Information Replyc                 C   s$   t | | j |r| | d S d S N)r   __init__HEADER_SIZEload_header)selfbuffer r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/ICMP6.pyr      s   zICMP6.__init__c                 C      | j S r   )r   r   r   r   r   get_header_size      zICMP6.get_header_sizec                 C   r   r   )IP_PROTOCOL_NUMBERr    r   r   r   get_ip_protocol_number   r"   zICMP6.get_ip_protocol_numberc                 C   s   |   }|  }|  }dt| d |   d }|dt| 7 }|  dkr0|d|   7 }|d7 }|dt| d 7 }|S )NzICMP6 - Type: z - 
zCode:  z
Checksum: )get_typeget_codeget_checksumstr_ICMP6__get_message_description_ICMP6__get_code_description)r   typecodechecksumsr   r   r   __str__   s   zICMP6.__str__c                 C   s   | j |   | j S r   )icmp_messagesr'   DESCRIPTION_INDEXr    r   r   r   __get_message_description      zICMP6.__get_message_descriptionc                 C   s,   | j |   | j }|d u rdS ||   S )Nr&   )r2   r'   CODES_INDEXr(   )r   code_dictionaryr   r   r   __get_code_description   s   zICMP6.__get_code_descriptionc                 C   
   |  dS Nr   get_byter    r   r   r   r'         
zICMP6.get_typec                 C   r9   Nr	   r;   r    r   r   r   r(      r=   zICMP6.get_codec                 C   r9   Nr
   )get_wordr    r   r   r   r)      r=   zICMP6.get_checksumc                 C      |  d| d S r:   set_byte)r   r-   r   r   r   set_type      zICMP6.set_typec                 C   rA   r>   rB   )r   r.   r   r   r   set_code   rE   zICMP6.set_codec                 C   rA   r?   )set_word)r   r/   r   r   r   set_checksum   rE   zICMP6.set_checksumc                 C   sj   |  d |   }|  }td}|| || |  r+||    |  | | d S )Nr   B)rH   parentget_pseudo_header	get_bytesarrayextendchildcompute_checksum)r   pseudo_headericmp_headerchecksum_arrayr   r   r   calculate_checksum   s   



zICMP6.calculate_checksumc                 C      | j |   | j | jkS r   )r2   r'   MSG_TYPE_INDEXINFORMATIONAL_MESSAGEr    r   r   r   is_informational_message      zICMP6.is_informational_messagec                 C   rU   r   )r2   r'   rV   ERROR_MESSAGEr    r   r   r   is_error_message   rY   zICMP6.is_error_messagec                 C   sb   d}||   | j v M }| j|    | j }|d u r%||  dkM }|S ||  | v M }|S )NTr   )r'   r2   keysr6   r(   )r   well_formedr7   r   r   r   is_well_formed   s   zICMP6.is_well_formedc                 C      |  tj|||S r   )_ICMP6__build_echo_messager   ECHO_REQUESTclass_objectidsequence_numberarbitrary_datar   r   r   Echo_Request      zICMP6.Echo_Requestc                 C   r_   r   )r`   r   
ECHO_REPLYrb   r   r   r   
Echo_Reply   rh   zICMP6.Echo_Replyc                 C   sp   t  }|| |d td|}|td|7 }|d ur)|ttd|7 }t }|| |	| |S )Nr   >HrI   
r   rD   rF   structpackr   rM   r   set_datacontains)rc   r-   rd   re   rf   icmp_packet
icmp_bytesicmp_payloadr   r   r   __build_echo_message   s   



zICMP6.__build_echo_messagec                 C      g d}|  tj|||S N)r   r   r   r   )_ICMP6__build_error_messager   DESTINATION_UNREACHABLErc   r.   originating_packet_dataunused_bytesr   r   r   Destination_Unreachable      zICMP6.Destination_Unreachablec                 C   s   t d|}| tjd||S )N!Lr   )rm   rn   rw   r   PACKET_TOO_BIG)rc   MTUrz   	MTU_bytesr   r   r   Packet_Too_Big     zICMP6.Packet_Too_Bigc                 C   ru   rv   )rw   r   TIME_EXCEEDEDry   r   r   r   Time_Exceeded  r}   zICMP6.Time_Exceededc                 C   s   t d|}| tj|||S )Nr~   )rm   rn   rw   r   PARAMETER_PROBLEM)rc   r.   pointerrz   pointer_bytesr   r   r   Parameter_Problem  r   zICMP6.Parameter_Problemc                 C   sd   t  }|| || ttd|}|d ur#|ttd|7 }t }|| || |S )NrI   )r   rD   rF   r   rM   r   ro   rp   )rc   r-   r.   datarz   rq   rr   rs   r   r   r   __build_error_message  s   



zICMP6.__build_error_messagec                 C      |  tj|S r   )_ICMP6__build_neighbor_messager   NEIGHBOR_SOLICITATIONrc   target_addressr   r   r   Neighbor_Solicitation%     zICMP6.Neighbor_Solicitationc                 C   r   r   )r   r   NEIGHBOR_ADVERTISEMENTr   r   r   r   Neighbor_Advertisement)  r   zICMP6.Neighbor_Advertisementc                 C   sj   t  }|| |d ttddgd }|ttdt| 7 }t }|| |	| |S )Nr   rI   r   )
r   rD   rF   r   rM   r   as_bytesr   ro   rp   )rc   msg_typer   rq   rr   rs   r   r   r   __build_neighbor_message-  s   



zICMP6.__build_neighbor_messagec                 C   s   t |   dd S Nr      )r   rO   rL   r    r   r   r   get_target_addressE  s   zICMP6.get_target_addressc                 C   s6   t |}|   }| |dd< |  | d S r   )r   rO   rL   	set_bytes)r   r   addresspayload_bytesr   r   r   set_target_addressH  s   zICMP6.set_target_addressc                 C      |   dS r:   )rO   r<   r    r   r   r    get_neighbor_advertisement_flagsS     z&ICMP6.get_neighbor_advertisement_flagsc                 C      |   d| d S r:   )rO   rC   r   flagsr   r   r    set_neighbor_advertisement_flagsV  r5   z&ICMP6.set_neighbor_advertisement_flagsc                 C      |   d@ dkS )Nr   r   r   r    r   r   r   get_router_flagY  rE   zICMP6.get_router_flagc                 C   ,   |   }|r|dO }n|dM }| | d S )Nr   ir   r   r   
flag_value
curr_flagsr   r   r   set_router_flag\  
   
zICMP6.set_router_flagc                 C   r   )N@   r   r   r    r   r   r   get_solicited_flagd  rE   zICMP6.get_solicited_flagc                 C   r   )Nr   ir   r   r   r   r   set_solicited_flagg  r   zICMP6.set_solicited_flagc                 C   r   N    r   r   r    r   r   r   get_override_flago  rE   zICMP6.get_override_flagc                 C   r   Nr   ir   r   r   r   r   set_override_flagr  r   zICMP6.set_override_flagc                 C      |  tj||S r   )&_ICMP6__build_node_information_messager   NODE_INFORMATION_QUERYrc   r.   payloadr   r   r   Node_Information_Query{     zICMP6.Node_Information_Queryc                 C   r   r   )r   r   NODE_INFORMATION_REPLYr   r   r   r   Node_Information_Reply  r   zICMP6.Node_Information_Replyc           
      C   s   t  }|| || d}d}dgd }td|}|td|7 }|ttd|7 }|d ur<|ttd|7 }t }	|	| |	|	 |S )Nr      rk   rI   rl   )
rc   r-   r.   r   rq   qtyper   noncerr   rs   r   r   r    __build_node_information_message  s   




z&ICMP6.__build_node_information_messagec                 C   r   r:   rO   r@   r    r   r   r   	get_qtype  r   zICMP6.get_qtypec                 C   r   r:   rO   rG   )r   r   r   r   r   	set_qtype  r5   zICMP6.set_qtypec                 C   s   |    dd S )Nr      rO   rL   r    r   r   r   	get_nonce  r5   zICMP6.get_noncec                 C   s2   |    }td||dd< |   | d S )NrI   r   r   rO   rL   rM   r   )r   r   r   r   r   r   	set_nonce     zICMP6.set_noncec                 C   r   r?   r   r    r   r   r   	get_flags  r   zICMP6.get_flagsc                 C   r   r?   r   r   r   r   r   	set_flags  r5   zICMP6.set_flagsc                 C   r   )Nr	   r   r   r    r   r   r   
get_flag_T  rE   zICMP6.get_flag_Tc                 C   r   )Nr	   r   r   r   r   r   r   
set_flag_T  r   zICMP6.set_flag_Tc                 C   r   )Nr
   r   r   r    r   r   r   
get_flag_A  rE   zICMP6.get_flag_Ac                 C   r   )Nr
   r   r   r   r   r   
set_flag_A  r   zICMP6.set_flag_Ac                 C   r   )Nr   r   r   r    r   r   r   
get_flag_C  rE   zICMP6.get_flag_Cc                 C   r   )Nr   r   r   r   r   r   
set_flag_C  r   zICMP6.set_flag_Cc                 C   r   )Nr   r   r   r    r   r   r   
get_flag_L  rE   zICMP6.get_flag_Lc                 C   r   )Nr   ir   r   r   r   r   
set_flag_L  r   zICMP6.set_flag_Lc                 C   r   )N   r   r   r    r   r   r   
get_flag_S  rE   zICMP6.get_flag_Sc                 C   r   )Nr   ir   r   r   r   r   
set_flag_S  r   zICMP6.set_flag_Sc                 C   r   r   r   r    r   r   r   
get_flag_G  rE   zICMP6.get_flag_Gc                 C   r   r   r   r   r   r   r   
set_flag_G  r   zICMP6.set_flag_Gc                 C   s2   |    }td||dd < |   | d S )NrI   r   r   )r   r   r   r   r   r   set_node_information_data  r   zICMP6.set_node_information_datac                 C      |    dd  S )Nr   r   r    r   r   r   get_note_information_data  r5   zICMP6.get_note_information_datac                 C   r   r:   r   r    r   r   r   get_echo_id  r   zICMP6.get_echo_idc                 C   r   r?   r   r    r   r   r   get_echo_sequence_number  r   zICMP6.get_echo_sequence_numberc                 C   r   Nr   r   r    r   r   r   get_echo_arbitrary_data  r5   zICMP6.get_echo_arbitrary_datac                 C   r   r:   rO   get_longr    r   r   r   get_mtu  r   zICMP6.get_mtuc                 C   r   r:   r   r    r   r   r   get_parm_problem_pointer  r   zICMP6.get_parm_problem_pointerc                 C   r   r   r   r    r   r   r   get_originating_packet_data  r5   z!ICMP6.get_originating_packet_datar   )s__name__
__module____qualname__r#   protocolr   rx   r   r   r   ra   ri   ROUTER_SOLICITATIONROUTER_ADVERTISEMENTr   r   REDIRECT_MESSAGEr   r   NO_ROUTE_TO_DESTINATIONADMINISTRATIVELY_PROHIBITEDBEYOND_SCOPE_OF_SOURCE_ADDRESSADDRESS_UNREACHABLEPORT_UNREACHABLE+SOURCE_ADDRESS_FAILED_INGRESS_EGRESS_POLICYREJECT_ROUTE_TO_DESTINATIONHOP_LIMIT_EXCEEDED_IN_TRANSIT!FRAGMENT_REASSEMBLY_TIME_EXCEEDED"ERRONEOUS_HEADER_FIELD_ENCOUNTERED)UNRECOGNIZED_NEXT_HEADER_TYPE_ENCOUNTERED$UNRECOGNIZED_IPV6_OPTION_ENCOUNTEREDNODE_INFORMATION_QUERY_IPV6$NODE_INFORMATION_QUERY_NAME_OR_EMPTYNODE_INFORMATION_QUERY_IPV4NODE_INFORMATION_REPLY_SUCCESSNODE_INFORMATION_REPLY_REFUSED$NODE_INFORMATION_REPLY_UNKNOWN_QTYPENODE_INFORMATION_QTYPE_NOOPNODE_INFORMATION_QTYPE_UNUSEDNODE_INFORMATION_QTYPE_NODENAME NODE_INFORMATION_QTYPE_NODEADDRS NODE_INFORMATION_QTYPE_IPv4ADDRSrZ   rW   rV   r3   r6   r2   r   r!   r$   r1   r+   r,   r'   r(   r)   rD   rF   rH   rT   rX   r[   r^   classmethodrg   rj   r`   r|   r   r   r   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s:   

	









$




	
r   )	rM   rm   impacket.ImpactPacketr   r   r   impacket.IP6_Addressr   r   r   r   r   r   <module>   s
   