
    h                     <   d Z ddlZddl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dd	lmZ  ej        e          Zd
 Zd Z G d d          Z G d de          Z G d de          Zd Zd Zd Zd Zd ZddZd Z ddZ!	 	 	 	 ddZ"dS )z<Packet-processing utilities implementing RFC5925 and RFC5926    N)orb)IPTCP)tcp_pseudoheader)IPv6)Packet)	inet_pton)Unionc                 n    dd l }dd l}|                    | ||j                                                  S )Nr   )hmachashlibnewsha1digest)keymsgr   r   s       W/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/tcpao.py_hmac_sha1_digestr      s8    KKKNNN88Cgl++22444    c                     ddl m} ddlm} ddlm}  |            }|                    |                    |           |          }|                    t          |                     |
                                S )Nr   )cmac)
algorithms)default_backend)backend)cryptography.hazmat.primitivesr   &cryptography.hazmat.primitives.ciphersr   cryptography.hazmat.backendsr   CMACAESupdatebytesfinalize)r   r   r   r   r   r   cs          r   _cmac_aes_digestr$   $   s    333333AAAAAA<<<<<<oG		*..%%w	77AHHU3ZZ::<<r   c                   >    e Zd Zed             Zed             ZdZdS )TCPAOAlgc                     t                      NNotImplementedError)cls
master_keycontexts      r   kdfzTCPAOAlg.kdf1        "###r   c                     t                      r(   r)   )r+   traffic_keyr-   s      r   maczTCPAOAlg.mac6   r/   r   N__name__
__module____qualname__classmethodr.   r2   maclen r   r   r&   r&   0   sI        $ $ [$ $ $ [$ FFFr   r&   c                   >    e Zd Zed             Zed             ZdZdS )TCPAOAlg_HMAC_SHA1c                 2    d|z   dz   }t          ||          S )N   TCP-AOs    r   )r+   r,   r-   inputs       r   r.   zTCPAOAlg_HMAC_SHA1.kdf?   s#     $g-; U333r   c                 2    t          ||          d d         S N   r?   )r+   r1   messages      r   r2   zTCPAOAlg_HMAC_SHA1.macE   s     !g66ss;;r   rC   Nr4   r:   r   r   r<   r<   >   sI        4 4 [4
 < < [< FFFr   r<   c                   >    e Zd Zed             Zed             ZdZdS )TCPAOAlg_CMAC_AESc                 z    t          |          dk    r|}nt          d|          }t          |d|z   dz             S )N   s                   r>   s    )lenr$   )selfr,   r-   r   s       r   r.   zTCPAOAlg_CMAC_AES.kdfN   sE     z??b  CC"<<<C]W%<{%JKKKr   c                 2    t          ||          d d         S rB   )r$   )rJ   r1   rD   s      r   r2   zTCPAOAlg_CMAC_AES.macW   s      W55crc::r   rC   Nr4   r:   r   r   rF   rF   M   sL        L L [L ; ; [; FFFr   rF   c                     |                                  dk    rt                      S |                                  dk    rt                      S t          d                    |                     )NzHMAC-SHA-1-96zAES-128-CMAC-96zBad TCP AuthOpt algorithms {})upperr<   rF   
ValueErrorformat)names    r   get_algrQ   _   s^    zz||&&!###	*	*	* """8??EEFFFr   c                     t          | t                    rt          t          j        | j                  S t          | t                    rt          t          j        | j                  S t          d          Nz#Neither IP nor IPv6 found on packet)	
isinstancer   r	   socketAF_INETsrcr   AF_INET6	Exceptionus    r   _get_ipvx_srcr\   i   ]    !R ?///	At		 ?!%000=>>>r   c                     t          | t                    rt          t          j        | j                  S t          | t                    rt          t          j        | j                  S t          d          rS   )	rT   r   r	   rU   rV   dstr   rX   rY   rZ   s    r   _get_ipvx_dstr`   s   r]   r   c                     t          |           t          |          k    s&t          |           dk    r"t          |           dk    rt          d          | |z   t          j        d||||          z   S )7Build context bytes as specified by RFC5925 section 5.2   rH   z3saddr and daddr must be 4-byte or 16-byte addressesz!HHII)rI   rN   structpack)saddrdaddrsportdportsrc_isndst_isns         r   build_contextrl   }   s{     5zzSZZCJJ!OOE

b8H8HNOOO		
 	
	

r   c                     | t                    }t          t          |j                  t	          |j                  |j        |j        ||          S )rb   )r   rl   r\   
underlayerr`   rh   ri   )prj   rk   tcps       r   build_context_from_packetrq      sI     C&Ccn%%cn%%		  r   Tc                 8   t                      }|t          j        d|          z  }|t          | t                             z  }t          | t                             }||dd         z  }|dz  }||dd         z  }d}| t                   }|j        }|Ft          |                    d          	                    ||j
                            }d|d	z   d
z  z   }|d
z  }	||	k     rt          ||                   }
|dz  }|
dk    s|
dk    r|r|t          |
g          z  }Ct          ||                   }|dz  }||z   dz
  |	k    rt                              d|
|           n|dk     rt                              d|
|           no|
dk    rB|d
k     rt                              d|
|           nF|||dz
  |dz            z  }||d
z
  dz  z  }n|r|||dz
  ||z   dz
           z  }||dz
  z  }||	k     |t          | t                   j                  z  }|S )z7Build message bytes as described by RFC5925 section 5.1z!INrH   s           options      rc      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    )	bytearrayrd   re   r   r   r!   dataofsrI   	get_fieldi2mru   r   loggerinfopayload)ro   include_optionssneresultth_bytesposthdoffopt_lentcphdr_optendoptnumoptlens               r   build_message_from_packetr      sj    [[F
fk$$$$F
qv&&&F QsV}}H
hssmF
kF
hr"uoF C	
3B:D|bll9--11"bjAABBWq[Q&'1HM


Xc]##qQ;;&A++ .)VH---Xc]##q<!m++KKJ( ( (A::KKC( ( (R<<zz966JJJhsQwa/00FvzW,,FF 	:hsQwfq(8899Fvz5 

6 eAcFN###FMr   c                 L    |                     |t          | ||                    S )zCalculate TCP-AO traffic-key from packet and initial sequence numbers

    This is constant for an established connection.
    )r.   rq   )ro   algr,   sisndisns        r   calc_tcpao_traffic_keyr      s%     77:8D$GGHHHr   c                 N    |                     |t          | ||                    S )z0Calculate TCP-AO MAC from packet and traffic keyr   r   )r2   r   )ro   r   r1   r   r   s        r   calc_tcpao_macr      s5     77; 9	?! ! !   r   c                     | t                    }t          j        d||          }|j        d||j        dz  z   fgz   |_        t          | ||||          }	|                    ||	          }
d||
z   f|j        d<   dS )z4Calculate TCP-AO option value and insert into packetBBAOr{   r   r3   N)r   rd   re   ru   r9   r   r2   )ro   r   r1   keyid
rnextkeyidr   r   r   keyidsmessage_bytesr2   s              r   
sign_tcpaor      s     
3B[uj11FfszG/C&CDEEBJ"	3_#G G GM
''+}
-
-CFSL)BJrNNNr   )Tr   )r   r   Tr   )#__doc__loggingscapy.compatr   scapy.layers.inetr   r   r   scapy.layers.inet6r   scapy.packetr   scapy.pton_ntopr	   rU   rd   typingr
   	getLoggerr5   r   r   r$   r&   r<   rF   rQ   r\   r`   rl   rq   r   r   r   r   r:   r   r   <module>r      s   C B        % % % % % % % % . . . . . . # # # # # #       % % % % % %        
	8	$	$5 5 5	 	 	                     $G G G? ? ?? ? ?  2  $2 2 2 2jI I I    	* * * * * *r   