a
    kÄ#d„#  ã                   @   sŒ  d Z ddlmZ ddlm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 ddl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 ddlmZm Z m!Z!m"Z" ddl#m$Z$ ddl%m&  m'Z' ej(�rddl)m*Z* ddl+m,Z,m-Z-m.Z. n
e$ /d¡ dZ0dZ1dZ2G dd„ de3ƒZ4G dd„ deƒZ5ee5ee!d� ee5ee"d� eee5ed� eee5ed� eee5ed� dS )z#
Classes and functions for MACsec.
é    )Úabsolute_import)Úprint_functionN)Úconf)ÚBitFieldÚConditionalFieldÚIntFieldÚPacketFieldÚXShortEnumField)ÚPacketÚRawÚbind_layers)ÚEtherÚDot1ADÚDot1Q)Ú	MACsecSCI)ÚIP)ÚIPv6©Úraw)ÚETH_P_MACSECÚETHER_TYPESÚETH_P_IPÚ
ETH_P_IPV6)Úlog_loading)Údefault_backend)ÚCipherÚ
algorithmsÚmodeszRCan't import python-cryptography v1.7+. Disabled MACsec encryption/authentication.é   é   é   c                   @   sp   e Zd ZdZddd„Zdd„ Zedd	d
„ƒZdd„ Zdd„ Z	edd„ ƒZ
dd„ Zdd„ Zddd„Zddd„ZdS )ÚMACsecSAzŽRepresentation of a MACsec Secure Association

    Provides encapsulation, decapsulation, encryption, and decryption
    of MACsec frames
    FNc                 C   sº   t |tjƒrt d|¡| _nt |tƒr.|| _ntdƒ‚|| _|| _	|| _
|| _|| _|| _|| _| jr¶t |	tjƒr‚t d|	¡| _nt |	tƒr”|	| _ntdƒ‚t |
tƒr®|
| _ntdƒ‚d S )Nú!QzSCI must be either bytes or intz!Lz SSCI must be either bytes or intzSalt must be bytes)Ú
isinstanceÚsixÚinteger_typesÚstructÚpackÚsciÚbytesÚ	TypeErrorÚanÚpnÚkeyÚicvlenÚ
do_encryptÚsend_sciÚxpn_enÚssciÚsalt)Úselfr(   r+   r,   r-   r.   Úencryptr0   r1   r2   r3   © r6   úK/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/macsec.pyÚ__init__6   s*    


zMACsecSA.__init__c                 C   sr   | j rV| jd@ |t jd@ B }| jt d|¡ }ttdd„ tt|ƒt| j	ƒƒD ƒƒƒS | j
t d|t j¡ S dS )zgenerate an IV for the packetl       üÿ ì   ÿÿ r"   c                 S   s   g | ]\}}||A ‘qS r6   r6   )Ú.0ÚaÚbr6   r6   r7   Ú
<listcomp>W   ó    z$MACsecSA.make_iv.<locals>.<listcomp>z!IN)r1   r,   ÚMACsecr2   r&   r'   r)   Ú	bytearrayÚzipr3   r(   )r4   ÚpktZtmp_pnZtmp_ivr6   r6   r7   Úmake_ivR   s
    &zMACsecSA.make_ivr   c                 C   sP   t | ƒ}|d|… }|r6|| d… }||| … }nd}||d… }|||fS )zj
        split the packet into associated data, plaintext or ciphertext, and
        optional ICV
        Nr>   r   )rB   Úassoclenr.   ÚdataÚassocÚicvÚencr6   r6   r7   Ú	split_pkt[   s    zMACsecSA.split_pktc                 C   s   | j S )z?returns the value of the E bit for packets sent through this SA)r/   ©r4   r6   r6   r7   Úe_bitk   s    zMACsecSA.e_bitc                 C   s   | j p| jtkS )z?returns the value of the C bit for packets sent through this SA)r/   r.   ÚDEFAULT_ICV_LENrJ   r6   r6   r7   Úc_bito   s    zMACsecSA.c_bitc                 C   s   t | ƒd }|dk r|S dS )z:determine shortlen for a raw packet (not encapsulated yet)é   é0   r   )Úlen)rB   Zdatalenr6   r6   r7   Úshortlens   s    zMACsecSA.shortlenc              
   C   sp   |j tƒ j krtdƒ‚t |¡}|j}|`t| j| j| j	|  
¡ |  ¡ t |¡| jd@ |jd�}t|_|| | S )z1encapsulate a frame using this Secure Associationz5cannot encapsulate packet in MACsec, must be Ethernetr9   )r(   r+   ÚSCÚEÚCrQ   r,   Útype)Únamer   r*   ÚcopyÚdeepcopyÚpayloadr?   r(   r+   r0   rK   rM   r!   rQ   r,   rU   r   )r4   rB   ÚhdrrY   Útagr6   r6   r7   Úencap{   s    

üzMACsecSA.encapc                 C   sr   t |tƒrt |jtƒstdƒ‚t |¡}|t j}|t j|_|t j}|`|j	tƒ j	krjtt
|| ƒƒS || S )zdecapsulate a MACsec framez9cannot decapsulate MACsec packet, must be Ethernet/MACsec)r#   r   rY   r?   r*   rW   rX   Z
underlayerrU   rV   r   )r4   Úorig_pktÚpacketZ
prev_layerZ
next_layerr6   r6   r7   ÚdecapŒ   s    

ÿÿ


zMACsecSA.decapc                 C   sÒ   t  |¡}|t `|t `t|ƒ}| jr2tt }nt}|du sD| j	sT| j	rP|}n|}|  
|¡}t ||¡\}}}	tt | j¡t |¡tƒ d� ¡ }
|
 |¡ |
 |¡|
 ¡  }t|||… | |
j ƒ|t _|S )z2encrypt a MACsec frame for this Secure AssociationN©Úbackend)rW   rX   r?   rY   rU   rP   r0   Ú	NOSCI_LENÚSCI_LENr/   rC   r!   rI   r   r   ÚAESr-   r   ÚGCMr   Ú	encryptorÚauthenticate_additional_dataÚupdateÚfinalizer   r[   )r4   r]   rD   rZ   ÚpktlenÚhdrlenÚivrF   ÚptÚ_rf   Úctr6   r6   r7   r5   œ   s,    



ý

 zMACsecSA.encryptc                 C   sþ   t  |¡}|t `t|ƒ}| jr*tt }nt}|du s<| jsR| jrH|}n
|| j	 }|  
|¡}t ||| j	¡\}}}	tt | j¡t ||	¡tƒ d� ¡ }
|
 |¡ |||… }||
 |¡7 }||
 ¡ 7 }t d|dd… ¡d |t _t|dd… ƒ|t _|S )z2decrypt a MACsec frame for this Secure AssociationNr`   z!Hr   é   )rW   rX   r?   rY   rP   r0   rb   rc   r/   r.   rC   r!   rI   r   r   rd   r-   r   re   r   Ú	decryptorrg   rh   ri   r&   ÚunpackrU   r   )r4   r]   rD   rZ   rj   rk   rl   rF   ro   rG   rq   rm   r6   r6   r7   Údecrypt·   s0    





ý

zMACsecSA.decrypt)FNN)r   )N)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r8   rC   ÚstaticmethodrI   rK   rM   rQ   r\   r_   r5   rs   r6   r6   r6   r7   r!   0   s   
	

r!   c                   @   s¸   e Zd ZdZdZdddddœZedd	d
ƒedd	d
ƒedd	d
ƒedd	d
ƒedd	d
ƒedd	d
ƒedd	dƒedd	dƒedd	dƒedd
ƒee	dde
ƒdd„ ƒeeddeƒdd„ ƒgZdd„ ZdS )r?   z"representation of one MACsec framez802.1AE)ÚANú2.4.4)ÚPNrz   )ÚSCIrz   )ÚSLrz   )r+   r,   r(   rQ   ZVerr   é   ÚESrR   ZSCBrS   rT   ry   rp   Úreservedr}   é   r{   r|   Nc                 C   s   | j S )N)rR   ©rB   r6   r6   r7   Ú<lambda>ð   r>   zMACsec.<lambda>rU   c                 C   s
   d| j v S )NrU   )Úfieldsr‚   r6   r6   r7   rƒ   ô   r>   c                 C   s:   |   d¡}| jr||   d¡7 }| jd ur6||   d¡7 }|S )Nzan=%MACsec.an%, pn=%MACsec.pn%z, sci=%MACsec.sci%z, %MACsec.type%)ZsprintfrR   rU   )r4   Úsummaryr6   r6   r7   Ú	mysummaryö   s    

zMACsec.mysummary)rt   ru   rv   rw   rV   Zdeprecated_fieldsr   r   r   r   r   r	   r   Zfields_descr†   r6   r6   r6   r7   r?   Õ   s4   ü	









þÿìr?   )rU   )6rw   Ú
__future__r   r   r&   rW   Zscapy.configr   Zscapy.fieldsr   r   r   r   r	   Zscapy.packetr
   r   r   Zscapy.layers.l2r   r   r   Zscapy.layers.eapr   Zscapy.layers.inetr   Zscapy.layers.inet6r   Zscapy.compatr   Z
scapy.datar   r   r   r   Zscapy.errorr   Zscapy.libs.sixZlibsr$   Zcrypto_validZcryptography.hazmat.backendsr   Z&cryptography.hazmat.primitives.ciphersr   r   r   Úinforb   rc   rL   Úobjectr!   r?   r6   r6   r6   r7   Ú<module>	   s<   
 &*