
    h"                        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
 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! ej"        rddl#m$Z$ ddl%m&Z&m'Z'm(Z( n e!j)        d           dZ*dZ+dZ, G d de-          Z. G d de          Z/ ee/ee            ee/ee            eee/e            eee/e            eee/e           dS )z#
Classes and functions for MACsec.
    N)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                   v    e Zd ZdZddZd Zedd            Zd Zd	 Z	ed
             Z
d Zd ZddZddZdS )MACsecSAzRepresentation of a MACsec Secure Association

    Provides encapsulation, decapsulation, encryption, and decryption
    of MACsec frames
    FNc                 @   t          |t                    rt          j        d|          | _        n,t          |t
                    r|| _        nt          d          || _        || _        || _	        || _
        || _        || _        || _        | j        rt          |	t                    rt          j        d|	          | _        n,t          |	t
                    r|	| _        nt          d          t          |
t
                    r	|
| _        d S 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int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   s              X/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/macsec.py__init__zMACsecSA.__init__3   s   c3 	?{4--DHHU## 	?DHH=>>>! ; 	6$$$ D"Kd33		D%(( D 		 BCCC$&& 6 			 4555	6 	6    c                    | j         r| j        dz  |t                   j        dz  z  }| j        t          j        d|          z   }t          t          d t          t          |          t          | j
                            D                                 S | j        t          j        d|t                   j                  z   S )zgenerate an IV for the packetl            r#   c                     g | ]
\  }}||z  S  r<   ).0abs      r6   
<listcomp>z$MACsecSA.make_iv.<locals>.<listcomp>T   s     #c#c#cdaAE#c#c#cr8   z!I)r1   r,   MACsecPNr2   r&   r'   r)   	bytearrayzipr3   r(   )r4   pkttmp_pntmp_ivs       r6   make_ivzMACsecSA.make_ivO   s    ; 	@g 22s6{~
7RSFYT6!:!::F#c#cc)F:K:KYW[W`MaMa6b6b#c#c#cddeee8fk$F????r8   r   c                     t          |           }|d|         }|r|| d         }|||          }nd}||d         }|||fS )zj
        split the packet into associated data, plaintext or ciphertext, and
        optional ICV
        Nr8   r   )rE   assoclenr.   dataassocicvencs          r6   	split_pktzMACsecSA.split_pktX   sd     3xxYhY 	"wxx.Cx'(CCCxyy/Cc3r8   c                     | j         S )z?returns the value of the E bit for packets sent through this SA)r/   r4   s    r6   e_bitzMACsecSA.e_bith   s
    r8   c                 0    | j         p| j        t          k    S )z?returns the value of the C bit for packets sent through this SA)r/   r.   DEFAULT_ICV_LENrQ   s    r6   c_bitzMACsecSA.c_bitl   s    @$+"@@r8   c                 :    t          |           dz
  }|dk     r|S dS )z:determine shortlen for a raw packet (not encapsulated yet)   0   r   )len)rE   datalens     r6   shortlenzMACsecSA.shortlenp   s'     c((U"R<<Nqr8   c           
         |j         t                      j         k    rt          d          t          j        |          }|j        }|`t          | j        | j        | j	        | 
                                |                                 t                              |          | j        dz  |j                  }t           |_        ||z  |z  S )z1encapsulate a frame using this Secure Associationz5cannot encapsulate packet in MACsec, must be Ethernetr:   )SCIANSCECSLrB   type)namer   r*   copydeepcopypayloadrA   r(   r+   r0   rR   rU   r!   r[   r,   rc   r   )r4   rE   hdrrg   tags        r6   encapzMACsecSA.encapx   s    8uww|##STTTmC  +Kdgzz||tzz|| ))#..:-SX	? ? ?
  Sy7""r8   c                    t          |t                    rt          |j        t                    st	          d          t          j        |          }|t                   j        }|t                   j        |_        |t                   j        }|`|j	        t                      j	        k    rt          t          ||z                      S ||z  S )zdecapsulate a MACsec framez9cannot decapsulate MACsec packet, must be Ethernet/MACsec)r$   r   rg   rA   r*   re   rf   
underlayerrc   rd   r   )r4   orig_pktpacket
prev_layer
next_layers        r6   decapzMACsecSA.decap   s    (E** 	x/88	K   x((F^.
 .-
F^+
?eggl**Z*455666J&&r8   c                    t          j        |          }|t                   `|t                   `t          |          }| j        rt          t          z   }nt          }|| j	        s| j	        r|}n|}| 
                    |          }t                              ||          \  }}}	t          t          j        | j                  t#          j        |          t'                                                                }
|
                    |           |
                    |          |
                                z   }t1          |||         |z   |
j        z             |t                   _        |S )z2encrypt a MACsec frame for this Secure AssociationNbackend)re   rf   rA   rg   rc   rY   r0   	NOSCI_LENSCI_LENr/   rH   r!   rO   r   r   AESr-   r   GCMr   	encryptorauthenticate_additional_dataupdatefinalizer
   ri   )r4   rm   rJ   rh   pktlenhdrlenivrL   pt_ry   cts               r6   r5   zMACsecSA.encrypt   sG   mH%%KKX= 	(FFF4? "!!\\(##))(H==r1N48$$IbMM#%%
 
 
 )++	 	
 	..u555b!!I$6$6$8$88!%x"82"=	"MNNF
r8   c                 T   t          j        |          }|t                   `t	          |          }| j        rt          t          z   }nt          }|| j        s| j        r|}n
|| j	        z
  }| 
                    |          }t                              ||| j	                  \  }}}	t          t          j        | j                  t#          j        ||	          t'                                                                }
|
                    |           |||         }||
                    |          z  }||
                                z  }t1          j        d|dd                   d         |t                   _        t7          |dd                   |t                   _        |S )z2decrypt a MACsec frame for this Secure AssociationNrs   z!Hr      )re   rf   rA   rg   rY   r0   ru   rv   r/   r.   rH   r!   rO   r   r   rw   r-   r   rx   r   	decryptorrz   r{   r|   r&   unpackrc   r
   )r4   rm   rJ   rh   r}   r~   r   rL   r   rM   r   r   s               r6   decryptzMACsecSA.decrypt   sz   mH%%KX= 	(FFF4? 0!!DK/\\#!++HhLLr3N48$$Ib##%%
 
 
 )++	 	
 	..u5556(?#
ir"""
i  """!=r!A#w77:F!"QRR&kkF
r8   )FNN)r   N)__name__
__module____qualname____doc__r7   rH   staticmethodrO   rR   rU   r[   rj   rq   r5   r   r<   r8   r6   r!   r!   -   s         
6 6 6 68@ @ @    \  A A A   \# # #"' ' '    6     r8   r!   c                   x   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            e edde          d           gZd ZdS )rA   z"representation of one MACsec framez802.1AE)r^   2.4.4)rB   r   )r]   r   )rb   r   )r+   r,   r(   r[   Verr      ESr_   SCBr`   ra   r^   r   reservedrb      rB   r]   Nc                     | j         S r   )r_   rE   s    r6   <lambda>zMACsec.<lambda>   s     r8   rc   c                     d| j         v S )Nrc   )fieldsr   s    r6   r   zMACsec.<lambda>   s    Vsz%9 r8   c                     |                      d          }| j        r||                      d          z  }| j        ||                      d          z  }|S )NzAN=%MACsec.AN%, PN=%MACsec.PN%z, SCI=%MACsec.SCI%z, %MACsec.type%)sprintfr_   rc   )r4   summarys     r6   	mysummaryzMACsec.mysummary   sY    ,,?@@7 	:t||$8999G9 t||$5666Gr8   )r   r   r   r   rd   deprecated_fieldsr   r   r   r   r   r   r   fields_descr   r<   r8   r6   rA   rA      sG       ,,D#	  	1q!q!1aaq!Q""q!qKtY//	
 	

 	{CC99	; 	;)<K.    r8   rA   )rc   )0r   r&   re   scapy.configr   scapy.fieldsr   r   r   r   r   scapy.packetr	   r
   r   scapy.layers.l2r   r   r   scapy.layers.eapr   scapy.layers.inetr   scapy.layers.inet6r   scapy.compatr   
scapy.datar   r   r   r   scapy.errorr   crypto_validcryptography.hazmat.backendsr   &cryptography.hazmat.primitives.ciphersr   r   r   inforu   rv   rT   objectr!   rA   r<   r8   r6   <module>r      s                         1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 & & & & & &             # # # # # #       F F F F F F F F F F F F # # # # # # 	C<<<<<<           K B C C C 	
b b b b bv b b bJ' ' ' ' 'V ' ' 'T FBX & & & & FDz * * * * FF . . . . E6 - - - - E6 - - - - - -r8   