a
    kÄ#d¨  ã                   @   s  d Z ddlZddlmZmZ ddlmZmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ ddlZddlZe e¡Zd	d
„ Zdd„ ZG dd„ dƒZG dd„ deƒZG dd„ deƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd&dd„Zd d!„ Zd'd"d#„Z d(d$d%„Z!dS ))z<Packet-processing utilities implementing RFC5925 and RFC5926é    N)ÚorbÚUnion)ÚIPÚTCP)Útcp_pseudoheader)ÚIPv6)ÚPacket)Ú	inet_ptonc                 C   s$   dd l }dd l}| | ||j¡ ¡ S )Nr   )ÚhmacÚhashlibÚnewÚsha1Údigest)ÚkeyÚmsgr
   r   © r   úJ/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/tcpao.pyÚ_hmac_sha1_digest   s    r   c                 C   sT   ddl m} ddlm} ddlm} |ƒ }|j| | ¡|d�}| t	|ƒ¡ | 
¡ S )Nr   )Úcmac)Ú
algorithms)Údefault_backend)Úbackend)Zcryptography.hazmat.primitivesr   Z&cryptography.hazmat.primitives.ciphersr   Zcryptography.hazmat.backendsr   ZCMACZAESÚupdateÚbytesÚfinalize)r   r   r   r   r   r   Úcr   r   r   Ú_cmac_aes_digest    s    r   c                   @   s(   e Zd Zedd„ ƒZedd„ ƒZdZdS )ÚTCPAOAlgc                 C   s
   t ƒ ‚d S ©N©ÚNotImplementedError)ÚclsÚ
master_keyÚcontextr   r   r   Úkdf-   s    zTCPAOAlg.kdfc                 C   s
   t ƒ ‚d S r   r   )r!   Útraffic_keyr#   r   r   r   Úmac2   s    zTCPAOAlg.macéÿÿÿÿN©Ú__name__Ú
__module__Ú__qualname__Úclassmethodr$   r&   Úmaclenr   r   r   r   r   ,   s
   

r   c                   @   s(   e Zd Zedd„ ƒZedd„ ƒZdZdS )ÚTCPAOAlg_HMAC_SHA1c                 C   s   d| d }t ||ƒS )Nó   TCP-AOs     ©r   )r!   r"   r#   Úinputr   r   r   r$   ;   s    zTCPAOAlg_HMAC_SHA1.kdfc                 C   s   t ||ƒd d… S ©Né   r0   )r!   r%   Úmessager   r   r   r&   A   s    zTCPAOAlg_HMAC_SHA1.macr3   Nr(   r   r   r   r   r.   :   s
   

r.   c                   @   s(   e Zd Zedd„ ƒZedd„ ƒZdZdS )ÚTCPAOAlg_CMAC_AESc                 C   s.   t |ƒdkr|}n
td|ƒ}t|d| d ƒS )Né   s                   r/   s    €)Úlenr   )Úselfr"   r#   r   r   r   r   r$   J   s    
zTCPAOAlg_CMAC_AES.kdfc                 C   s   t ||ƒd d… S r2   )r   )r8   r%   r4   r   r   r   r&   S   s    zTCPAOAlg_CMAC_AES.macr3   Nr(   r   r   r   r   r5   I   s
   

r5   c                 C   s6   |   ¡ dkrtƒ S |   ¡ dkr$tƒ S td | ¡ƒ‚d S )NzHMAC-SHA-1-96zAES-128-CMAC-96zBad TCP AuthOpt algorithms {})Úupperr.   r5   Ú
ValueErrorÚformat)Únamer   r   r   Úget_alg[   s
    r=   c                 C   s<   t | tƒrttj| jƒS t | tƒr0ttj| jƒS tdƒ‚d S ©Nz#Neither IP nor IPv6 found on packet)	Ú
isinstancer   r	   ÚsocketÚAF_INETÚsrcr   ÚAF_INET6Ú	Exception©Úur   r   r   Ú_get_ipvx_srce   s
    

rG   c                 C   s<   t | tƒrttj| jƒS t | tƒr0ttj| jƒS tdƒ‚d S r>   )	r?   r   r	   r@   rA   Údstr   rC   rD   rE   r   r   r   Ú_get_ipvx_dsto   s
    

rI   c                 C   sJ   t | ƒt |ƒks(t | ƒdkr0t | ƒdkr0tdƒ‚| | t d||||¡ S )ú7Build context bytes as specified by RFC5925 section 5.2é   r6   z3saddr and daddr must be 4-byte or 16-byte addressesz!HHII)r7   r:   ÚstructÚpack)ZsaddrZdaddrÚsportÚdportÚsrc_isnÚdst_isnr   r   r   Úbuild_contexty   s    
(ÿûþÿrR   c                 C   s*   | t  }tt|jƒt|jƒ|j|j||ƒS )rJ   )r   rR   rG   Z
underlayerrI   rN   rO   )ÚprP   rQ   Ztcpr   r   r   Úbuild_context_from_packet’   s    úrT   Tc                 C   sÐ  t ƒ }|t d|¡7 }|t| t ƒ7 }t| t ƒ}||dd… 7 }|d7 }||dd… 7 }d}| t }|j}|du rœt| d¡ 	||j
¡ƒ}d|d	 d
  }|d
 }	||	k �rºt|| ƒ}
|d7 }|
dksÒ|
dkræ|r¤|t |
gƒ7 }q¤t|| ƒ}|d7 }|| d |	k�rt d|
|¡ �qº|dk �r:t d|
|¡ �qº|
dk�rŠ|d
k �r`t d|
|¡ �qº|||d |d … 7 }||d
 d 7 }n"|�r¬|||d || d … 7 }||d 7 }q¤|t| t jƒ7 }|S )z7Build message bytes as described by RFC5925 section 5.1z!INr6   s     é   é   Úoptionsé   é   rK   é   r   é   z0bad tcp option %d optlen %d beyond end-of-headerz)bad tcp option %d optlen %d less than twoé   zbad tcp option %d optlen %dó    )Ú	bytearrayrL   rM   r   r   r   Zdataofsr7   Ú	get_fieldZi2mrW   r   ÚloggerÚinfoÚpayload)rS   Úinclude_optionsÚsneÚresultZth_bytesÚposÚthZdoffZopt_lenZtcphdr_optendZoptnumZoptlenr   r   r   Úbuild_message_from_packet¤   sX    
ÿ
ÿ

rh   c                 C   s   |  |t| ||ƒ¡S )zCalculate TCP-AO traffic-key from packet and initial sequence numbers

    This is constant for an established connection.
    )r$   rT   )rS   Úalgr"   ZsisnZdisnr   r   r   Úcalc_tcpao_traffic_keyÙ   s    rj   c                 C   s   |  |t| ||d�¡S )z0Calculate TCP-AO MAC from packet and traffic key©rc   rd   )r&   rh   )rS   ri   r%   rc   rd   r   r   r   Úcalc_tcpao_macâ   s    ÿrl   c                 C   sf   | t  }t d||¡}|jd||jd  fg |_t| ||||d�}	| ||	¡}
d||
 f|jd< dS )z4Calculate TCP-AO option value and insert into packetÚBBZAOr]   rk   r'   N)r   rL   rM   rW   r-   rl   r&   )rS   ri   r%   ZkeyidZ
rnextkeyidrc   rd   rg   ZkeyidsZmessage_bytesr&   r   r   r   Ú
sign_tcpaoê   s    
ÿrn   )Tr   )Tr   )r   r   Tr   )"Ú__doc__ÚloggingZscapy.compatr   r   Zscapy.layers.inetr   r   r   Zscapy.layers.inet6r   Zscapy.packetr   Zscapy.pton_ntopr	   r@   rL   Ú	getLoggerr)   r`   r   r   r   r.   r5   r=   rG   rI   rR   rT   rh   rj   rl   rn   r   r   r   r   Ú<module>	   s8   




5	
    ù