
    h?                     0   d Z ddlZddlZddlmZ ddlmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZ ddlmZmZmZ ddlmZ ddlmZ ddlmZ dd	l m!Z!m"Z" dd
l#m$Z$m%Z% ddl&m'Z'm(Z( ddl)m*Z*m+Z+  G d dee          Z, G d dee          Z- G d de          Z. G d de.          Z/ G d de.          Z0 G d de.          Z1 G d de          Z2 G d de.          Z3 G d de.          Z4g dZ5 G d  d!e.          Z6 G d" d#e.          Z7d$d%d&d'd(d)d*d+d,d-d.d/Z8d0d1gZ9 G d2 d3e.          Z: G d4 d5e.          Z; G d6 d7e.          Z<dddddd!d#d3d5d7d8
Z=d9 Z>d:d;d<d=d(d>d?d@dAZ?g dBZ@ G dC d%e          ZA eeeAdDE            eeeAdDF           dS )Ga  
    EIGRP Scapy Extension
    ~~~~~~~~~~~~~~~~~~~~~

    :version:   2009-08-13
    :e-mail:    lobo@c3a.de / jochen.bartl@gmail.com

    :TODO

    - Replace TLV code with a more generic solution
        * http://trac.secdev.org/scapy/ticket/90
    - Write function for calculating authentication data

    :Thanks:

    - TLV code derived from the CDP implementation of scapy. (Thanks to Nicolas Bareil and Arnaud Ebalard)
        http://trac.secdev.org/scapy/ticket/18
    - IOS / EIGRP Version Representation FIX by Dirk Loss
    N)Packet)StrFieldIPFieldXShortFieldFieldLenFieldStrLenFieldIntFieldByteEnumField	ByteFieldConditionalField
FlagsFieldIP6FieldPacketListFieldShortEnumField
ShortFieldStrFixedLenFieldThreeBytesField)IPchecksumbind_layers)IPv6)chb)conf)	inet_aton	inet_ntoa)	inet_ntop	inet_pton)warningScapy_Exception)	RandShort
RandStringc                   J    e Zd ZdZdgZddZd Zd Zd Zd Z	d	 Z
d
 Zd ZdS )EigrpIPFieldz
    This is a special field type for handling ip addresses of destination networks in internal and
    external route updates.

    EIGRP removes zeros from the host portion of the ip address if the netmask is 8, 16 or 24 bits.
    length_fromNc                 \    t          j        | ||           || _        ||fd| _        d S d S )Nc                     |S N pktlengths     W/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/eigrp.py<lambda>z'EigrpIPField.__init__.<locals>.<lambda><       &     r   __init__r$   selfnamedefaultr+   r$   s        r,   r1   zEigrpIPField.__init__8   D    $g...&28@@@D r/   c                 .    t          j        | ||          S r'   )r   h2ir3   r*   xs      r,   r8   zEigrpIPField.h2i>   s    {4a(((r/   c                     t          |          }|                     |          }|dk    r
|d d         S |dk    r
|d d         S |dk    r
|d d         S |S )N                  )r   r$   r3   r*   r:   tmp_lens       r,   i2mzEigrpIPField.i2mA   sg    aLL""3''a<<RaR5L]]RaR5L]]RaR5LHr/   c                     |                      |          }|dk    r|dz  }n|dk    r|dz  }n|dk    r|dz  }t          |          S )Nr<   s      r>   s     r@       )r$   r   rB   s       r,   m2izEigrpIPField.m2iN   s]    ""3''a<< AA]]AA]]LA||r/   c                 @    |dk    rd}n|dk    rd}n|dk    rd}nd}|S )Nr<   r=   r>   r?   r@   rA      r(   )r3   rC   s     r,   prefixlen_to_bytelenz!EigrpIPField.prefixlen_to_bytelenZ   s<    a<<GG]]GG]]GGGr/   c                 Z    |                      |          }|                     |          }|S r'   r$   rJ   rB   s       r,   i2lenzEigrpIPField.i2lenf   -    ""3''++G44r/   c                     |                      |          }|                     |          }||d          |                     ||d |                   fS r'   r$   rJ   rG   r3   r*   srC   s       r,   getfieldzEigrpIPField.getfieldk   Q    ""3''++G44{DHHS!HWH+6666r/   c                 *    t          j        |           S r'   )r   randvalr3   s    r,   rV   zEigrpIPField.randvalp   s    t$$$r/   NN)__name__
__module____qualname____doc__	__slots__r1   r8   rD   rG   rJ   rM   rS   rV   r(   r/   r,   r#   r#   .   s          IA A A A) ) )  
 
 

 
 
  
7 7 7
% % % % %r/   r#   c                   V    e Zd ZdZdgZddZd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd ZdS )EigrpIP6Fieldz
    This is a special field type for handling ip addresses of destination networks in internal and
    external route updates.

    r$   Nc                 \    t          j        | ||           || _        ||fd| _        d S d S )Nc                     |S r'   r(   r)   s     r,   r-   z(EigrpIP6Field.__init__.<locals>.<lambda>   r.   r/   r0   r2   s        r,   r1   zEigrpIP6Field.__init__}   r6   r/   c                 .    t          j        | ||          S r'   )r   any2ir9   s      r,   rc   zEigrpIP6Field.any2i   s    ~dC+++r/   c                 .    t          j        | ||          S r'   )r   i2reprr9   s      r,   re   zEigrpIP6Field.i2repr   s    tS!,,,r/   c                 .    t          j        | ||          S r'   )r   r8   r9   s      r,   r8   zEigrpIP6Field.h2i   s    |D#q)))r/   c                     t          t          j        |          }|                     |          }|                     |          }|d |         S r'   )r   socketAF_INET6r$   rJ   rB   s       r,   rD   zEigrpIP6Field.i2m   sG    foq))""3''++G44'{r/   c                     |                      |          }|                     |          }|dk    rt          d           ndd|z
  z  }||z  }t          t          j        |          S )N   zJEigrpIP6Field: Prefix length is > 128. Dissection of this packet will failrF   r>   )r$   rJ   r   r   rh   ri   )r3   r*   r:   rC   	prefixlenpads         r,   rG   zEigrpIP6Field.m2i   sl    ""3''--g66	S==`aaaaR)^,CHA!,,,r/   c                 &    |dz  }|dk     r|dz  }|S )Nr<   r>   r=   r(   )r3   plens     r,   rJ   z"EigrpIP6Field.prefixlen_to_bytelen   s"    qy"99AIDr/   c                 Z    |                      |          }|                     |          }|S r'   rL   rB   s       r,   rM   zEigrpIP6Field.i2len   rN   r/   c                     |                      |          }|                     |          }||d          |                     ||d |                   fS r'   rP   rQ   s       r,   rS   zEigrpIP6Field.getfield   rT   r/   c                 *    t          j        |           S r'   )r   rV   rW   s    r,   rV   zEigrpIP6Field.randval   s    %%%r/   rX   )rY   rZ   r[   r\   r]   r1   rc   re   r8   rD   rG   rJ   rM   rS   rV   r(   r/   r,   r_   r_   t   s          IA A A A, , ,- - -* * *  
- 
- 
-    
7 7 7
& & & & &r/   r_   c                   n    e Zd ZdZ edd           eddddd 	           edd
d           gZd ZdS )EIGRPGenericzEIGRP Generic TLVtyper   lenNvalue!Hc                     |dz   S NrI   r(   r*   r:   s     r,   r-   zEIGRPGeneric.<lambda>   s    STWXSX r/   adjustrF   c                     | j         dz
  S rz   )rv   r*   s    r,   r-   zEIGRPGeneric.<lambda>   s    ST r/   r$   c                     t           j        S r'   )r   padding_layer)r3   ps     r,   guess_payload_classz EIGRPGeneric.guess_payload_class   s    !!r/   )	rY   rZ   r[   r4   r   r   r   fields_descr   r(   r/   r,   rt   rt      ss        D;vv.. =gtDXDXYYY;w=T=TUUUWK" " " " "r/   rt   c                       e Zd ZdZ edd           edd           edd           edd           ed	d           ed
d           edd           edd           edd          g	ZdS )
EIGRPParamzEIGRP Parametersru   r=   rv      k1k2r   k3k4k5reservedholdtime   N)rY   rZ   r[   r4   r   r   r   r   r(   r/   r,   r   r      s        D;vv..:eR((9T1%%9T1%%9T1%%9T1%%9T1%%9Z++:j"--KKKr/   r   c                       e Zd ZdZ edd           eddddd 	           ed
dddi           edd           edd           e	ddd           e
d ed          d           gZd ZdS )EIGRPAuthDatazEIGRP Authentication Dataru   r?   rv   Nauthdatarx   c                     |dz   S )Nr@   r(   r{   s     r,   r-   zEIGRPAuthData.<lambda>   s    VWZ\V\ r/   r|   authtypeMD5keysizekeyidr=   nullpads               r   r>   c                     | j         S r'   )r   r   s    r,   r-   zEIGRPAuthData.<lambda>   s
    SVS^ r/   r   c                     ||z  }| j         Rt          | j                  }|d d         t          |dz	  dz            z   t          |dz            z   |dd          z   }|S )N   r<      )r   rv   r   r   )r3   r   payr   s       r,   
post_buildzEIGRPAuthData.post_build   sh    	S<$-((G"1"W\T1222S45H5HH1QRR5PAr/   )rY   rZ   r[   r4   r   r   r   r   r	   r   r   r!   r   r   r(   r/   r,   r   r      s        &D;vv.. =j$G\G\]]]!>*a!U<<:i..8GQ''##I|R@@;z::b>>G^G^___K    r/   r   c            
           e Zd ZdZ edd           edd           edd           e edd	          d
            e e	dd          d           gZ
d ZdS )EIGRPSeqzEIGRP Sequenceru   rA   rv   NaddrlenrI   ipaddr192.168.0.1c                     | j         dk    S rz   r   r   s    r,   r-   zEIGRPSeq.<lambda>   s    s{a/? r/   ip6addr2001::c                     | j         dk    S )Nr>   r   r   s    r,   r-   zEIGRPSeq.<lambda>   s    s{b/@ r/   c                     ||z  }| j         Ot          |          }|d d         t          |dz	  dz            z   }|t          |dz            z   |dd          z   }|S Nr?   r<   r   rI   )rv   r   )r3   r   r   rC   tmp_ps        r,   r   zEIGRPSeq.post_build   si    	S8!ffGbqbECA 5666EGdN+++ae3Ar/   )rY   rZ   r[   r4   r   r   r   r   r   r   r   r   r(   r/   r,   r   r      s        D;vv..:eT**9Y**##GGHm$D$D$?$?A A##HHY$A$A$@$@B BK    r/   r   c                        e Zd Zd Zd Zd ZdS )ShortVersionFieldc                 P    	 |dz  }|dz	  dz  }d|d|S # t           $ r Y dS w xY w)Nr   r<   v.unknown)	TypeError)r3   r*   r:   minormajors        r,   re   zShortVersionField.i2repr   sV    	-HE!VtOEE
  %uuee,,	  	 	 	99	s    
%%c                    t          |t                    r|                    d          rst          |          dk    r`t	          |                    d          d         dd                   }t	          |                    d          d                   }|dz  |z  S t          |t                    rd|cxk    rdk    rn n|S t          | d          s|S | j        t          d	|           | j        S t          d
          )zThe field accepts string values like v12.1, v1.1 or integer values.
           String values have to start with a "v" followed by a
           floating point number. Valid numbers are between 0 and 255.

        r   r<   r   r   r=   Ni  r5   z-set value to default. Format of %r is invalidzFormat of value is invalid)

isinstancestr
startswithrv   intsplithasattrr5   r   r   )r3   r*   r:   r   r   s        r,   r8   zShortVersionField.h2i  s     a 	D!,,s"3"3 	DA!Q+,,EQ((EQJ%''3 		DAOOOOeOOOOOH4++ |'GKKK|#%&BCCCr/   c                     t                      S r'   )r    rW   s    r,   rV   zShortVersionField.randval   s    {{r/   N)rY   rZ   r[   re   r8   rV   r(   r/   r,   r   r      sD        - - -D D D0    r/   r   c                   n    e Zd ZdZ edd           edd           edd           edd	          gZd
S )
EIGRPSwVerzEIGRP Software Versionru   rI   rv   r<   ioszv12.0eigrpzv1.2N)rY   rZ   r[   r4   r   r   r   r   r(   r/   r,   r   r   $  sX        #D;vv..:eQ''$$UG44$$Wf55KKKr/   r   c                   X    e Zd ZdZ edd           edd           edd          gZdS )	EIGRPNmszEIGRP Next Multicast Sequenceru      rv   r<   nmsr?   N)rY   rZ   r[   r4   r   r   r	   r   r(   r/   r,   r   r   -  sG        *D;vv..:eQ''8E1%%KKKr/   r   )	connectedstaticsummaryzreceive-onlyredistributedzleak-mapc                   \    e Zd ZdZ edd           edd           eddde          gZdS )		EIGRPStubzEIGRP Stub Routerru   r   rv   flags   r>   N)	rY   rZ   r[   r4   r   r   r   _EIGRP_STUB_FLAGSr   r(   r/   r,   r   r   :  sM        D;vv..:eQ'':gvr3DEEGKKKr/   r   c                   .   e Zd ZdZ edd           eddddd 	           ed
d           edd           edd           edd           e	dd           e	dd           e	dd           edd           e	dd           e
ddd           gZdS )EIGRPIntRoutezEIGRP Internal Routeru     rv   Ndstrx   c                     |dz   S )N   r(   r{   s     r,   r-   zEIGRPIntRoute.<lambda>F      QRUWQW r/   r|   nexthop192.168.0.0delay  	bandwidth   mtu  hopcountr   reliabilityr   loadr   rl   r@   192.168.1.0c                     | j         S r'   rl   r   s    r,   r-   zEIGRPIntRoute.<lambda>P      cm r/   r   )rY   rZ   r[   r4   r   r   r   r	   r   r   r#   r   r(   r/   r,   r   r   C  s        !D;vv.. =eTBWBWXXX79m448GV,,8K--"?5$//9Z++9]C009VQ'';z1--9["--<}B[B[\\\KKKr/   r   IGRPEIGRPzStatic RouteRIPHelloOSPFzIS-ISEGPBGPIDRPzConnected Link)r=   r?   rA   rI   r   r      r<   	   
      externalzcandidate-defaultc                      e Zd ZdZ edd           eddddd 	           ed
d           edd           edd           edd           edd           edd           e	dde
           eddde           edd           edd           edd           edd           edd           edd           ed d           ed!d"           edd#d$ %          gZdS )&EIGRPExtRoutezEIGRP External Routeru     rv   Nr   rx   c                     |dz   S )N-   r(   r{   s     r,   r-   zEIGRPExtRoute.<lambda>h  r   r/   r|   r   r   originrouterr   	originasnr   tagexternalmetricr   extprotocolidrA   r   r<   r   r   r   r   r   r   r   r   r   	reserved2rl   r@   r   c                     | j         S r'   r   r   s    r,   r-   zEIGRPExtRoute.<lambda>y  r   r/   r   )rY   rZ   r[   r4   r   r   r   r	   r   r
   _EIGRP_EXTERNAL_PROTOCOL_IDr   _EIGRP_EXTROUTE_FLAGSr   r   r#   r   r(   r/   r,   r   r   e  sV       !D;vv.. =eTBWBWXXX79m447>=998K++8E1%%8,a00:j!,, =!5PQQ:gq!-BCC8GQ''8K--"?5$//9Z++9]C009VQ'';{A..9["--<}B[B[\\\%KKKr/   r   c                   .   e Zd ZdZ edd           eddddd 	           ed
d           edd           edd           edd           e	dd           e	dd           e	dd           edd           e	dd           e
ddd           gZdS )EIGRPv6IntRoutezEIGRP for IPv6 Internal Routeru     rv   Nr   rx   c                     |dz   S )N%   r(   r{   s     r,   r-   zEIGRPv6IntRoute.<lambda>  r   r/   r|   r   ::r   r   r     r   r   r   r=   r   r   r   r   r   rl   r>   r   c                     | j         S r'   r   r   s    r,   r-   zEIGRPv6IntRoute.<lambda>  s    #- r/   r   )rY   rZ   r[   r4   r   r   r   r	   r   r   r_   r   r(   r/   r,   r  r  }  s        *D;vv.. =eTBWBWXXX8It,,8GV,,8K00"?5$//9Z++9]C009VQ'';z1--9["-- =>W>WXXXKKKr/   r  c                      e Zd ZdZ edd           eddddd 	           ed
d           edd           edd           edd           edd           e	dd           e
dde           eddde           edd           edd           edd           edd           edd           edd           ed d           ed!d           eddd" #          gZdS )$EIGRPv6ExtRoutezEIGRP for IPv6 External Routeru     rv   Nr   rx   c                     |dz   S )N9   r(   r{   s     r,   r-   zEIGRPv6ExtRoute.<lambda>  r   r/   r|   r   r  r   r   r   r   r   r   r   r   rA   r   r<   r   r   r  r   r   r   r=   r   r   r   rl   c                     | j         S r'   r   r   s    r,   r-   zEIGRPv6ExtRoute.<lambda>  s    cm r/   r   )rY   rZ   r[   r4   r   r   r   r   r	   r   r
   r   r   r   r   r   r_   r   r(   r/   r,   r	  r	    sV       *D;vv.. =eTBWBWXXX8It,,7>=998K++8E1%%8,a00:j!,, =!5PQQ:gq!-BCC8GQ''8K00"?5$//9Z++9]A..9VQ'';{A..9[!,, =:S:STTT%KKKr/   r	  )
r=   r?   rA   rI   r   r   r   r   r  r
  c                     t           j        }t          |           dk    rRt          j        d| d d                   d         }t
                              |d          }t                      |         } || fi |S )Nr?   rx   r   rt   )r   	raw_layerrv   structunpack_eigrp_tlv_clsgetglobals)r   kargsclstclsnames        r,   _EIGRPGuessPayloadClassr    sm    
.C
1vv{{M$"1"&&q) $$Q77ii 3q??E??r/   UpdateRequestQueryReplayzIPX SAPz	SIA Queryz	SIA Reply)r=   r?   rA   rI   r   r   r   r   )initz	cond-recvr   updatec                       e Zd Zd Z edd           edde           edd           eddd	e	           e
d
d           e
dd           e
dd           edg e          gZd Zd ZdS )r   verr?   opcoder   chksumNr   r       seqackasnd   tlvlistc                     ||z  }| j         Mt          |          }|d d         t          |dz	  dz            z   t          |dz            z   |dd          z   }|S r   )r#  r   r   )r3   r   r   cs       r,   r   zEIGRP.post_build  sa    	S;A"1"Q!VtO,,,s1t8}}<quDAr/   c                     d}| j         dk    r| j        dk    r|dz  }| j        dk    r|dz  }|                     |dz             S )Nz+EIGRP (AS=%EIGRP.asn% Opcode=%EIGRP.opcode%r   r   z (ACK)z Flags=%EIGRP.flags%))r"  r&  r   sprintf)r3   
summarystrs     r,   	mysummaryzEIGRP.mysummary  sU    B
;!A("J:??00J||J,---r/   )rY   rZ   r[   r4   r   r
   _EIGRP_OPCODESr   r   _EIGRP_FLAGSr	   r   r  r   r   r0  r(   r/   r,   r   r     s        D9UA&& =1n==;x..:gq"l;;8E1%%8E1%%8E3''"?9b2IJJK  . . . . .r/   X   )proto)nh)Br\   rh   r  scapy.packetr   scapy.fieldsr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   scapy.layers.inetr   r   r   scapy.layers.inet6r   scapy.compatr   scapy.configr   scapy.utilsr   r   scapy.pton_ntopr   r   scapy.errorr   r   scapy.volatiler    r!   r#   r_   rt   r   r   r   r   r   r   r   r   r   r   r   r   r  r	  r  r  r1  r2  r   r(   r/   r,   <module>r@     s   &        2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 8 7 7 7 7 7 7 7 7 7 # # # # # #             , , , , , , , , 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0C% C% C% C% C%8W C% C% C%L>& >& >& >& >&Hh >& >& >&B" " " " "6 " " "       &    L   *    |   ,$ $ $ $ $
 $ $ $N           |    dcc G G G G G G G G    L   $ 









   $%89     L   0    l   "    l   2     !!# # :99. . . . .F . . .: BR         D%B      r/   