o
    àý°j L  ã                   @   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/d°d,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@d°dLdM„ƒZAe@d°dNdO„ƒZBe@dPdQ„ ƒZCe@d°dRdS„ƒZDe@d°dTdU„ƒZEe@d°dVdW„ƒZFe@d°dXdY„ƒZGe@dZd[„ ƒZHe@d\d]„ ƒZIe@d^d_„ ƒZJe@d`da„ ƒZKdbdc„ ZLddde„ ZMdfdg„ ZNdhdi„ ZOdjdk„ ZPdldm„ ZQdndo„ ZRdpdq„ ZSdrds„ ZTdtdu„ ZUe@d°dvdw„ƒZVe@d°dxdy„ƒZWe@d°dzd{„ƒZXd|d}„ ZYd~d„ ZZd€d�„ Z[d‚dƒ„ Z\d„d…„ Z]d†d‡„ Z^dˆd‰„ Z_dŠd‹„ Z`dŒd�„ ZadŽd�„ Zbd�d‘„ Zcd’d“„ Zdd”d•„ Zed–d—„ Zfd˜d™„ Zgdšd›„ Zhdœd�„ ZidždŸ„ Zjd d¡„ Zkd¢d£„ Zld¤d¥„ Zmd¦d§„ Znd¨d©„ Zodªd«„ Zpd¬d­„ Zqd®d¯„ 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°   i¿ÿÿÿrª   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´   ißÿÿÿrª   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Á   i÷ÿÿÿrÔ   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Þ   iïÿÿÿrÔ   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
   