o
    j5                     @   s  d dl mZ d dlZd dlmZmZ d dlmZ dZG dd dZ	G dd	 d	eZ
d
d Zdd Zdd Zdd Zdd ZG dd deZG dd deZG dd deZG dd d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G d,d- d-eZG d.d/ d/eZG d0d1 d1eZG d2d3 d3eZG d4d5 d5eZ G d6d7 d7eZ!G d8d9 d9eZ"G d:d; d;eZ#G d<d= d=eZ$G d>d? d?Z%dS )@    unpackN)Headerarray_tobytes)LOG   c                   @   s<   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S )CDPTypes         r                           N)__name__
__module____qualname__DeviceID_TypeAddress_TypePortID_TypeCapabilities_TypeSoftVersion_TypePlatform_TypeIPPrefix_TypeProtocolHello_TypeMTU_TypeSystemName_TypeSystemObjectId_TypeSnmpLocation r#   r#   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/cdp.pyr      s    r   c                   @   sf   e Zd ZdZdZd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 )CDPi       Nc                 C   s.   t | d |r| | | || _d S d S Nr   )r   __init__load_header_getElements	_elementsselfaBufferr#   r#   r$   r(   .   s
   
zCDP.__init__c                 C   s@   |dd  }g }|rt |}|| || d  }|s
|S Nr   )CDPElementFactorycreateappend
get_length)r-   r.   bufflelemr#   r#   r$   r*   4   s   

zCDP._getElementsc                 C   s   dS r'   r#   r-   r#   r#   r$   get_header_size>   s   zCDP.get_header_sizec                 C   
   |  dS )Nr   get_byter7   r#   r#   r$   get_versionA      
zCDP.get_versionc                 C   r9   Nr	   r:   r7   r#   r#   r$   get_ttlD   r=   zCDP.get_ttlc                 C   r9   Nr
   get_wordr7   r#   r#   r$   get_checksumG   r=   zCDP.get_checksumc                 C   r9   r/   rA   r7   r#   r#   r$   get_typeJ   r=   zCDP.get_typec                 C   r9   )Nr   rA   r7   r#   r#   r$   
get_lenghtM   r=   zCDP.get_lenghtc                 C      | j S N)r+   r7   r#   r#   r$   getElementsP      zCDP.getElementsc                 C   s8   d}| j D ]}|dt|  d t| d 7 }q|S )NzCDP Details:
z** Type: 
)r+   strrD   )r-   tmp_strelementr#   r#   r$   __str__T   s   
&zCDP.__str__rG   )r   r   r   TypeOUIr(   r*   r8   r<   r?   rC   rD   rE   rH   rO   r#   r#   r#   r$   r%   )   s    

r%   c                 C      t d| ||d  d S )Nz!Br	   r   r   bufferoffsetr#   r#   r$   r;   [      r;   c                 C   rR   )N!hr
   r   r   rS   r#   r#   r$   rB   ^   rV   rB   c                 C   rR   )Nz!Ir   r   r   rS   r#   r#   r$   get_longa   rV   rX   c                 C   s   | |||  S rG   r#   )rT   rU   bytesr#   r#   r$   	get_bytesd   s   rZ   c                 C   s0   t d| }d}|D ]}|d| 7 }q	|dd S )Nz!BBBBBB z%02x:r   r   )	mac_bytesrY   sbyter#   r#   r$   mac_to_stringg   s
   
r`   c                   @   sD   e Zd ZdddZedd Zdd Zdd	 Zd
d ZdddZ	dS )
CDPElementNc                 C   s8   t | d |rt|| _| |d | j  d S d S r'   )r   r(   ra   
Get_length_lengthr)   r,   r#   r#   r$   r(   r   s
   zCDPElement.__init__c                 C   s   t d|dd d S )NrW   r
   r   r   r   )clsr.   r#   r#   r$   rb   x   s   zCDPElement.Get_lengthc                 C   s
   | j  d S rG   )rc   r7   r#   r#   r$   r8   |   r=   zCDPElement.get_header_sizec                 C   r9   r@   rA   r7   r#   r#   r$   r3      r=   zCDPElement.get_lengthc                 C   s   t |  d|   S r/   )r   rZ   r3   r7   r#   r#   r$   get_data   s   zCDPElement.get_datar   c                 C   s&   |st |  ||t  }t|S rG   )r   rZ   IP_ADDRESS_LENGTHsocket	inet_ntoa)r-   rU   ipr#   r#   r$   get_ip_address   s   
zCDPElement.get_ip_addressrG   )r   N)
r   r   r   r(   classmethodrb   r8   r3   re   rj   r#   r#   r#   r$   ra   p   s    

ra   c                   @   (   e Zd ZdZdd Zdd Zdd ZdS )		CDPDevicer	   c                 C      t jS rG   )rm   rP   r7   r#   r#   r$   rD      rI   zCDPDevice.get_typec                 C   
   t | S rG   ra   re   r7   r#   r#   r$   get_device_id   r=   zCDPDevice.get_device_idc                 C      d|    S )NzDevice:)rq   r7   r#   r#   r$   rO         zCDPDevice.__str__N)r   r   r   rP   rD   rq   rO   r#   r#   r#   r$   rm      
    rm   c                   @   sB   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dS )Addressr
   Nc                 C   s6   t | | |rt|  dd  }| | d S d S r'   )ra   r(   r   rZ   _generateAddressDetails)r-   r.   datar#   r#   r$   r(      s
   zAddress.__init__c                 C   s<   g | _ |rt|}| j | || d  }|sd S d S rG   )address_detailsAddressDetailsr1   r2   get_total_length)r-   r4   addressr#   r#   r$   rv      s   
zAddress._generateAddressDetailsc                 C   rn   rG   )ru   rP   r7   r#   r#   r$   rD      rI   zAddress.get_typec                 C   r9   r/   )rX   r7   r#   r#   r$   
get_number   r=   zAddress.get_numberc                 C   rF   rG   )rx   r7   r#   r#   r$   get_address_details   rI   zAddress.get_address_detailsc                 C   s$   d}| j D ]
}|dt| 7 }q|S )Nz
Addresses:rK   )rx   rL   )r-   rM   address_detailr#   r#   r$   rO      s   
zAddress.__str__rG   )
r   r   r   rP   r(   rv   rD   r|   r}   rO   r#   r#   r#   r$   ru      s    
ru   c                   @   sf   e Zd ZdZedd Zd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 )ry      c                 C   s   t |}|S rG   )ry   )rd   r4   ar#   r#   r$   r1      s   zAddressDetails.createNc                 C   s<   |rt d|dd d }|d | _|d | j | _d S d S )NrW   r   r   r   )r   total_lengthrT   )r-   r.   addr_lengthr#   r#   r$   r(      s
   
zAddressDetails.__init__c                 C   rF   rG   )r   r7   r#   r#   r$   rz      rI   zAddressDetails.get_total_lengthc                 C   s   | j dd S )Nr   r	   )rT   r7   r#   r#   r$   get_protocol_type      z AddressDetails.get_protocol_typec                 C      t | jdS r>   r;   rT   r7   r#   r#   r$   get_protocol_length   rs   z"AddressDetails.get_protocol_lengthc                 C   r   r@   r   r7   r#   r#   r$   get_protocol   rs   zAddressDetails.get_protocolc                 C   r   )Nr   )rB   rT   r7   r#   r#   r$   get_address_length   rs   z!AddressDetails.get_address_lengthc                 C   s8   t | jd|  }|  tjkrt|S t	d |S )Nr   zAddress not IP)
rZ   rT   r   r   ry   PROTOCOL_IPrg   rh   r   error)r-   r{   r#   r#   r$   get_address   s
   

zAddressDetails.get_addressc                 C   s   |   tjkS rG   )r   ry   r   r7   r#   r#   r$   is_protocol_IP   r   zAddressDetails.is_protocol_IPc                 C   s    d|   |  |  |  f S )Nz9Protocol Type:%r Protocol:%r Address Length:%r Address:%s)r   r   r   r   r7   r#   r#   r$   rO      s    zAddressDetails.__str__rG   )r   r   r   r   rk   r1   r(   rz   r   r   r   r   r   r   rO   r#   r#   r#   r$   ry      s    

ry   c                   @   rl   )	Portr   c                 C   rn   rG   )r   rP   r7   r#   r#   r$   rD      rI   zPort.get_typec                 C   ro   rG   rp   r7   r#   r#   r$   get_port   r=   zPort.get_portc                 C   rr   )NzPort:)r   r7   r#   r#   r$   rO      rs   zPort.__str__N)r   r   r   rP   rD   r   rO   r#   r#   r#   r$   r      rt   r   c                   @   sr   e Zd ZdZd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 )Capabilitiesr   Nc                 C   sH   t | | d| _d| _d| _d| _d| _d| _d| _d| _	| 
  d S )NF)ra   r(   _capabilities_processed_router_transparent_bridge_source_route_bridge_switch_host_igmp_capable	_repeater_init_capabilitiesr,   r#   r#   r$   r(      s   zCapabilities.__init__c                 C   rn   rG   )r   rP   r7   r#   r#   r$   rD      rI   zCapabilities.get_typec                 C   ro   rG   rp   r7   r#   r#   r$   get_capabilities  r=   zCapabilities.get_capabilitiesc                 C   s   | j rd S td|  d }|d@ dk| _|d@ dk| _|d@ dk| _|d@ dk| _|d@ dk| _|d@ dk| _|d	@ dk| _	d S )
Nz!Lr   r	   r
   r   r          @   )
r   r   r   r   r   r   r   r   r   r   )r-   capabilitiesr#   r#   r$   r     s   zCapabilities._init_capabilitiesc                 C   rF   rG   )r   r7   r#   r#   r$   	is_router  rI   zCapabilities.is_routerc                 C   rF   rG   )r   r7   r#   r#   r$   is_transparent_bridge  rI   z"Capabilities.is_transparent_bridgec                 C   rF   rG   )r   r7   r#   r#   r$   is_source_route_bridge  rI   z#Capabilities.is_source_route_bridgec                 C   rF   rG   )r   r7   r#   r#   r$   	is_switch  rI   zCapabilities.is_switchc                 C   rF   rG   )is_hostr7   r#   r#   r$   r     rI   zCapabilities.is_hostc                 C   rF   rG   )r   r7   r#   r#   r$   is_igmp_capable!  rI   zCapabilities.is_igmp_capablec                 C   rF   rG   )r   r7   r#   r#   r$   is_repeater$  rI   zCapabilities.is_repeaterc                 C   rr   )NzCapabilities:)r   r7   r#   r#   r$   rO   (  rs   zCapabilities.__str__rG   )r   r   r   rP   r(   rD   r   r   r   r   r   r   r   r   r   rO   r#   r#   r#   r$   r      s    
r   c                   @   rl   )	SoftVersionr   c                 C   rn   rG   )r   rP   r7   r#   r#   r$   rD   /  rI   zSoftVersion.get_typec                 C   ro   rG   rp   r7   r#   r#   r$   r<   2  r=   zSoftVersion.get_versionc                 C   rr   )NzVersion:)r<   r7   r#   r#   r$   rO   5  rs   zSoftVersion.__str__N)r   r   r   rP   rD   r<   rO   r#   r#   r#   r$   r   ,  rt   r   c                   @   rl   )	Platformr   c                 C   rn   rG   )r   rP   r7   r#   r#   r$   rD   <  rI   zPlatform.get_typec                 C   ro   rG   rp   r7   r#   r#   r$   get_platform?  r=   zPlatform.get_platformc                 C      d|    S )NzPlatform:%r)r   r7   r#   r#   r$   rO   B  rs   zPlatform.__str__N)r   r   r   rP   rD   r   rO   r#   r#   r#   r$   r   9  rt   r   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )IpPrefixr   c                 C   rn   rG   )r   rP   r7   r#   r#   r$   rD   I  rI   zIpPrefix.get_typec                 C   s   t | dS r/   )ra   rj   r7   r#   r#   r$   get_ip_prefixL  rs   zIpPrefix.get_ip_prefixc                 C   r9   r'   r:   r7   r#   r#   r$   get_bitsO  r=   zIpPrefix.get_bitsc                 C   s   d|   |  f S )NzIP Prefix/Gateway: %r/%d)r   r   r7   r#   r#   r$   rO   R     zIpPrefix.__str__N)r   r   r   rP   rD   r   r   rO   r#   r#   r#   r$   r   F  s    r   c                   @   sX   e 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d ZdS )ProtocolHellor   c                 C   rn   rG   )r   rP   r7   r#   r#   r$   rD   X  rI   zProtocolHello.get_typec                 C   r9   )N	   )rj   r7   r#   r#   r$   get_master_ip[  r=   zProtocolHello.get_master_ipc                 C   r9   )Nr   r:   r7   r#   r#   r$   r<   ^  r=   zProtocolHello.get_versionc                 C   r9   )N   r:   r7   r#   r#   r$   get_sub_versiona  r=   zProtocolHello.get_sub_versionc                 C   r9   )N   r:   r7   r#   r#   r$   
get_statusd  r=   zProtocolHello.get_statusc                 C      t |  dd S )Nr      r   rZ   r7   r#   r#   r$   get_cluster_command_macg  r   z%ProtocolHello.get_cluster_command_macc                 C   r   )N   "   r   r7   r#   r#   r$   get_switch_macj  r   zProtocolHello.get_switch_macc                 C   r9   )N$   rA   r7   r#   r#   r$   get_management_vlanm  r=   z!ProtocolHello.get_management_vlanc                 C   s0   d|   |  |  |  t|  |  f S )Nzb


ProcolHello: Master IP:%s version:%r subversion:%r status:%r Switch's Mac:%r Management VLAN:%r)r   r<   r   r   r`   r   r   r7   r#   r#   r$   rO   p  s   *zProtocolHello.__str__N)r   r   r   rP   rD   r   r<   r   r   r   r   r   rO   r#   r#   r#   r$   r   U  s    r   c                   @       e Zd ZdZdd Zdd ZdS )VTPManagementDomainr   c                 C   rn   rG   )r   rP   r7   r#   r#   r$   rD   w  rI   zVTPManagementDomain.get_typec                 C   ro   rG   rp   r7   r#   r#   r$   
get_domainz  r=   zVTPManagementDomain.get_domainN)r   r   r   rP   rD   r   r#   r#   r#   r$   r   t      r   c                   @   rl   )	Duplex   c                 C   rn   rG   )r   rP   r7   r#   r#   r$   rD     rI   zDuplex.get_typec                 C   ro   rG   rp   r7   r#   r#   r$   
get_duplex  r=   zDuplex.get_duplexc                 C   s   |   dkS r>   )r   r7   r#   r#   r$   is_full_duplex  rs   zDuplex.is_full_duplexN)r   r   r   rP   rD   r   r   r#   r#   r#   r$   r   ~  rt   r   c                   @   r   )VLAN
   c                 C   rn   rG   )r   rP   r7   r#   r#   r$   rD     rI   zVLAN.get_typec                 C   ro   rG   rp   r7   r#   r#   r$   get_vlan_number  r=   zVLAN.get_vlan_numberN)r   r   r   rP   rD   r   r#   r#   r#   r$   r     r   r   c                   @   rl   )	TrustBitmapr   c                 C   rn   rG   )r   rP   r7   r#   r#   r$   rD     rI   zTrustBitmap.get_typec                 C      |   S rG   re   r7   r#   r#   r$   get_trust_bitmap     zTrustBitmap.get_trust_bitmapc                 C   r   )NzTrustBitmap Trust Bitmap:%r)r   r7   r#   r#   r$   rO     rs   zTrustBitmap.__str__N)r   r   r   rP   rD   r   rO   r#   r#   r#   r$   r     rt   r   c                   @   rl   )	UntrustedPortCoSr   c                 C   rn   rG   )r   rP   r7   r#   r#   r$   rD     rI   zUntrustedPortCoS.get_typec                 C   r   rG   r   r7   r#   r#   r$   get_port_CoS  r   zUntrustedPortCoS.get_port_CoSc                 C   r   )NzUntrustedPortCoS port CoS %r)r   r7   r#   r#   r$   rO     rs   zUntrustedPortCoS.__str__N)r   r   r   rP   rD   r   rO   r#   r#   r#   r$   r     rt   r   c                   @      e Zd ZdZdd ZdS )ManagementAddresses   c                 C   rn   rG   )r   rP   r7   r#   r#   r$   rD     rI   zManagementAddresses.get_typeNr   r   r   rP   rD   r#   r#   r#   r$   r         r   c                   @   r   )MTUr   c                 C   rn   rG   )r   rP   r7   r#   r#   r$   rD     rI   zMTU.get_typeNr   r#   r#   r#   r$   r     r   r   c                   @   r   )
SystemNamer   c                 C   rn   rG   )r   rP   r7   r#   r#   r$   rD     rI   zSystemName.get_typeNr   r#   r#   r#   r$   r     r   r   c                   @   r   )SystemObjectIdr   c                 C   rn   rG   )r   rP   r7   r#   r#   r$   rD     rI   zSystemObjectId.get_typeNr   r#   r#   r#   r$   r     r   r   c                   @   r   )r"   r   c                 C   rn   rG   )r"   rP   r7   r#   r#   r$   rD     rI   zSnmpLocation.get_typeNr   r#   r#   r#   r$   r"     r   r"   c                   @   r   )DummyCdpElement   c                 C   rn   rG   )r   rP   r7   r#   r#   r$   rD     rI   zDummyCdpElement.get_typeNr   r#   r#   r#   r$   r     r   r   c                   @   s   e Zd Zi ejeejeejeejeejee	je	e
je
ejeejeejeejeejeejeejeejeejeejeejeiZedd ZdS )r0   c                 C   sH   t d|dd d }z
| j| }W ||S  ty#   t}Y ||S w )NrW   r   r
   )r   elementTypeMapKeyErrorr   )rd   r.   _type
class_typer#   r#   r$   r1     s   zCDPElementFactory.createN)r   r   r   rm   rP   r   r   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   r   rk   r1   r#   r#   r#   r$   r0     sP    	
r0   )&structr   rg   impacket.ImpactPacketr   r   impacketr   rf   r   r%   r;   rB   rX   rZ   r`   ra   rm   ru   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   r   r0   r#   r#   r#   r$   <module>   sD   2	-=
