
    zf#                     l    d dl Z d dlZd Z G d d          Z G d de          Z G d d          ZdS )	    Nc                 4   d}t          dt          |           dz
  d          D ]}|| |         dz  | |dz            z   z  }t          |           dz  r|| t          |           dz
           dz  z  }|dz	  r|dz  |dz	  z   }|dz	  | }|dz  dz  |dz	  dz  z  S )	zCreates the ICMP checksum as in RFC 1071

    :param data: Data to calculate the checksum ofs
    :type data: bytes
    :return: Calculated checksum
    :rtype: int

    Divides the data in 16-bits chunks, then make their 1's complement sumr                 i      )rangelen)datasubtotalichecks       Q/var/www/ffwdstore.be/apps/py-env/lib/python3.11/site-packages/pythonping/icmp.pychecksumr      s     H1c$iik1%% 1 1d1gld1Q3i/0
4yy1} -T#d))A+&!+,
b. :v%(b.9 b. :IEaZ6!uzV&;<<    c                       e Zd ZdZd ZdS )ICMPTypezRepresents an ICMP type, as combination of type and code

    ICMP Types should inherit from this class so that the code can identify them easily.
    This is a static class, not meant to be instantiatedc                      t          d          )Nz ICMPType may not be instantiated)	TypeErrorselfs    r   __init__zICMPType.__init__   s    :;;;r   N)__name__
__module____qualname____doc__r    r   r   r   r      s-        < << < < < <r   r   c                      e Zd Z G d de          Z G d de          Z G d de          Z G d de          Z G d	 d
e          Z G d de          Z	 G d de          Z
 G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d d e          Zd!S )"Typesc                       e Zd ZdZedfZdS )Types.EchoReplyr   N)r   r   r   type_id
ECHO_REPLYr   r   r   	EchoReplyr"   "   s        q]


r   r%   c                       e Zd ZdZedfZedfZedfZedfZedfZedfZ	edfZ
edfZed	fZed
fZedfZedfZedfZedfZedfZedfZdS )Types.DestinationUnreachable   r   r   r               r   	   
                  N)r   r   r   r#   NETWORK_UNREACHABLEHOST_UNREACHABLEPROTOCOL_UNREACHABLEPORT_UNREACHABLEFRAGMENTATION_REQUIREDSOURCE_ROUTE_FAILEDNETWORK_UNKNOWNHOST_UNKNOWNSOURCE_HOST_ISOLATED#NETWORK_ADMINISTRATIVELY_PROHIBITED HOST_ADMINISTRATIVELY_PROHIBITEDNETWORK_UNREACHABLE_TOSHOST_UNREACHABLE_TOS)COMMUNICATION_ADMINISTRATIVELY_PROHIBITEDHOST_PRECEDENCE_VIOLATIONPRECEDENCE_CUTOFFr   r   r   DestinationUnreachabler'   &   s        &m#Q= '}#Q=")1&m"A-} '}/6m+,3R>(#*B. '~5<bN1%,bN!$bNr   rD   c                       e Zd ZdZedfZdS )Types.SourceQuenchr)   r   N)r   r   r   r#   SOURCE_QUENCHr   r   r   SourceQuenchrF   9   s         !r   rH   c                   2    e Zd ZdZedfZedfZedfZedfZdS )Types.Redirectr*   r   r   r   r(   N)r   r   r   r#   FOR_NETWORKFOR_HOSTFOR_TOS_AND_NETWORKFOR_TOS_AND_HOSTr   r   r   RedirectrJ   =   s;        mQ=&m#Q=r   rO   c                       e Zd ZdZedfZdS )Types.EchoRequestr   r   N)r   r   r   r#   ECHO_REQUESTr   r   r   EchoRequestrQ   D   s        }r   rS   c                       e Zd ZdZedfZdS )Types.RouterAdvertisementr-   r   N)r   r   r   r#   ROUTER_ADVERTISEMENTr   r   r   RouterAdvertisementrU   H   s         '}r   rW   c                   "    e Zd ZdZedfZeZeZdS )Types.RouterSolicitationr.   r   N)r   r   r   r#   ROUTER_SOLICITATIONROUTER_DISCOVERYROUTER_SELECTIONr   r   r   RouterSolicitationrY   L   s+        &l..r   r]   c                   "    e Zd ZdZedfZedfZdS )Types.TimeExceededr/   r   r   N)r   r   r   r#   TTL_EXPIRED_IN_TRANSIT!FRAGMENT_REASSEMBLY_TIME_EXCEEDEDr   r   r   TimeExceededr_   S   s)        ")1-4aL)))r   rb   c                   *    e Zd ZdZedfZedfZedfZdS )Types.BadIPHeaderr0   r   r   r   N)r   r   r   r#   POINTER_INDICATES_ERRORMISSING_REQUIRED_OPTION
BAD_LENGTHr   r   r   BadIPHeaderrd   X   s0        #*A,#*A,q\


r   rh   c                       e Zd ZdZedfZdS )Types.Timestampr1   r   N)r   r   r   r#   	TIMESTAMPr   r   r   	Timestamprj   ^   s        aL			r   rl   c                       e Zd ZdZedfZdS )Types.TimestampReplyr2   r   N)r   r   r   r#   TIMESTAMP_REPLYr   r   r   TimestampReplyrn   b   s        "A,r   rp   c                       e Zd ZdZedfZdS )Types.InformationRequestr3   r   Nr   r   r   r#   INFORMATION_REQUESTr   r   r   InformationRequestrr   f   s        &lr   ru   c                       e Zd ZdZedfZdS )Types.InformationReplyr   r   N)r   r   r   r#   INFORMATION_REPLYr   r   r   InformationReplyrw   j   s        $aLr   ry   c                       e Zd ZdZedfZdS )Types.AddressMaskRequest   r   N)r   r   r   r#   ADDRESS_MASK_REQUESTr   r   r   AddressMaskRequestr{   n   s         '|r   r~   c                       e Zd ZdZedfZdS )Types.AddressMaskReply   r   N)r   r   r   r#   ADDRESS_MASK_REPLYr   r   r   AddressMaskReplyr   r   s        %q\r   r   c                       e Zd ZdZedfZdS )Types.Traceroute   Nrs   r   r   r   
Tracerouter   v   s        &mr   r   N)r   r   r   r   r%   rD   rH   rO   rS   rW   r]   rb   rh   rl   rp   ru   ry   r~   r   r   r   r   r   r    r    !   s       # # # # #H # # #+ + + + + + + +&& & & & &x & & &) ) ) ) )8 ) ) )% % % % %h % % %- - - - -h - - -/ / / / /X / / /9 9 9 9 9x 9 9 9
" " " " "h " " "! ! ! ! !H ! ! !' ' ' ' ' ' ' '+ + + + +X + + +) ) ) ) )8 ) ) ), , , , ,X , , ,* * * * *8 * * *, , , , ,X , , , , ,r   r    c                       e Zd ZdZej        dddfdZed             ZddZ	d Z
ed	             Zed
             Zed             Zed             Zd ZdS )ICMP)   Nr   c                    d| _         t          |t                    r|j        | _        nLt          |t                    r|d         | _        |d         | _         nt          |t                    r|| _        |t          dd          }n%t          |t                    rt          |d          }|| _
        |t          j                    }|dz  | _        || _        d| _        d| _        dS )a<  Creates an ICMP packet

        :param message_type: Type of ICMP message to send
        :type message_type: Union[ICMPType, (int, int), int]
        :param payload: utf8 string or bytes payload
        :type payload: Union[str, bytes]
        :param identifier: ID of this ICMP packet
        :type identifier: intr   r   N1utf8r   )message_code
issubclassr   r#   message_type
isinstancetupleintbytesstrpayloadosgetpididsequence_numberreceived_checksumraw)r   r   r   
identifierr   s        r   r   zICMP.__init__~   s     lH-- 	- , 4De,, 	- ,QD ,QDc** 	- ,D?C((GG%% 	-GV,,GJv%.!%r   c                 h    |                      | j                  | j        z   }| j        || _        |S )z:The raw packet with header, ready to be sent from a socket)r   )_headerexpected_checksumr   r   )r   ps     r   packetzICMP.packet   s5     LLt5L66E8DHr   r   c                 \    t          j        d| j        | j        || j        | j                  S )zThe raw ICMP header

        :param check: Checksum value
        :type check: int
        :return: The packed header
        :rtype: bytesBBHHH)structpackr   r   r   r   )r   r   s     r   r   zICMP._header   s4     {7,, 7/1 1 	1r   c                 J    d                     d | j        D                       S )N c              3   @   K   | ]}d                      |          V  dS )z{:02x}N)format).0bs     r   	<genexpr>z ICMP.__repr__.<locals>.<genexpr>   s.      ==q**======r   )joinr   r   s    r   __repr__zICMP.__repr__   s%    xx==DH======r   c                 4    | j         dS | j        | j         k    S )z7True if the received checksum is valid, otherwise FalseNT)r   r   r   s    r   is_validzICMP.is_valid   s#     !)4%)???r   c                 T    t          |                                 | j        z             S )zNThe checksum expected for this packet, calculated with checksum field set to 0)r   r   r   r   s    r   r   zICMP.expected_checksum   s!     5666r   c                 D    t          |                                           S )zLength of the ICMP header)r   r   r   s    r   header_lengthzICMP.header_length   s     4<<>>"""r   c                 L    t                      }|                    |            |S )zCreates a new ICMP representation from the raw bytes

        :param raw: The raw packet including payload
        :type raw: bytes
        :return: An ICMP instance representing the packet
        :rtype: ICMP)r   unpack)r   r   s     r   generate_from_rawzICMP.generate_from_raw   s$     cr   c                     || _         t          j        d|dd                   \  | _        | _        | _        | _        | _        |dd         | _        dS )zUnpacks a raw packet and stores it in this object

        :param raw: The raw packet, including payload
        :type raw: bytesr         N)	r   r   r   r   r   r   r   r   r   )r   r   s     r   r   zICMP.unpack   sX    
 
 $*=#be*#E#E		!"G 233xr   )r   )r   r   r   LEN_TO_PAYLOADr    r%   r   propertyr   r   r   r   r   r   staticmethodr   r   r   r   r   r   r   {   s        N$)OTdde    :   X1 1 1 1> > > @ @ X@ 7 7 X7 # # X# 	 	 \	         r   r   )r   r   r   r   r    r   r   r   r   <module>r      s    				 = = =(< < < < < < < <W, W, W, W, W,H W, W, W,tb  b  b  b  b  b  b  b  b  b r   