a
    kÄ#dB ã                   @   sÀ  d Z ddlmZ ddlZddlZddlZddlmZmZ ddl	m
Z
mZmZmZmZmZmZmZmZmZmZ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!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,m-Z-m.Z. ddl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA ddlBmCZCmDZDmEZE ddlFmGZG ddlHmIZImJZJmKZKmLZLmMZM ddlNmOZOmPZPmQZQmRZR ddlSmTZT ejU�rÈddlVmWZW ddlXmYZY dddddddddd d!d"d#d$d%d&d'd(d)œZZG d*d+„ d+eCƒ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`ƒZaG d8d9„ d9e[ƒZbG d:d;„ d;e[ƒZcG d<d=„ d=e[ƒZde
d>d?eZƒed@dƒe-dAdBe,ƒe^dCddDƒedEddFdGdH�e_dFdIdJdK„ dL�edMdeOƒeadNdgeIdGdOdK„ dP�e0dQddRdS�e1dRddTdK„ dL�g
ZeG dUdV„ dVedƒZfG dWdX„ dXe[ƒZgG dYdZ„ dZe[ƒZhG d[d\„ d\eƒZiG d]d^„ d^eƒZjG d_d`„ d`eƒZkG dadb„ dbe[ƒZlG dcdd„ ddeCƒZmG dedf„ dfeƒZnG dgdh„ dhe[ƒZoG didj„ dje[ƒZpdkdldmdndodpdqdrdsdtduœ
ZqG dvdw„ dwe`ƒZrG dxdy„ dyeƒZsG dzd{„ d{e[ƒZtG d|d}„ d}e[ƒZuG d~d„ de[ƒZvG d€d�„ d�e[ƒZwG d‚dƒ„ dƒeƒZxG d„d…„ d…e[ƒZyG d†d‡„ d‡eƒZzG dˆd‰„ d‰e[ƒZ{G dŠd‹„ d‹e[ƒZ|dŒd�dŽœZ}G d�d�„ d�e!ƒZ~G d‘d’„ d’e[ƒZG d“d”„ d”eƒZ€d•e(i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Šd¨d©dŽœZ‹G dªd«„ d«e[ƒZŒe\ebede|eˆehelepeteveweye{eeƒe‡d¬œZ�ecefe‰eŠeheoeuewe{eŒd­œ
ZŽdS )®z¢
TLS handshake fields & logic.

This module covers the handshake TLS subprotocol, except for the key exchange
mechanisms which are addressed with keyexchange.py.
é    )Úabsolute_importN)Úlog_runtimeÚwarning)ÚByteEnumFieldÚ	ByteFieldÚFieldÚFieldLenFieldÚIntFieldÚPacketFieldÚPacketLenFieldÚPacketListFieldÚShortEnumFieldÚ
ShortFieldÚStrFixedLenFieldÚStrLenFieldÚThreeBytesFieldÚUTCTimeField)Ú	hex_bytesÚorbÚraw)Úconf)Úsix)ÚPacketÚRawÚPadding)Ú
randstringÚrepr_hex)ÚOCSP_Response)ÚCert)Ú_tls_versionÚ_TLSVersionFieldÚ_TLSClientVersionField)
Ú_ExtensionsLenFieldÚ_ExtensionsFieldÚ_cert_status_typeÚTLS_Ext_SupportedVersion_CHÚTLS_Ext_SignatureAlgorithmsÚTLS_Ext_SupportedVersion_SHÚTLS_Ext_EarlyDataIndicationÚ_tls_hello_retry_magicÚTLS_Ext_ExtendedMasterSecretÚTLS_Ext_EncryptThenMAC)Ú_TLSSignatureÚ_TLSServerParamsFieldÚ_TLSSignatureFieldÚServerRSAParamsÚSigAndHashAlgsFieldÚ_tls_hash_sigÚSigAndHashAlgsLenField)Ú_GenericTLSSessionInheritanceÚreadConnStateÚwriteConnState)ÚTLS_Ext_PreSharedKey_CH)Ú_tls_compression_algsÚ_tls_compression_algs_clsÚ	Comp_NULLÚ_GenericCompÚ_GenericCompMetaclass)Ú_tls_cipher_suitesÚ_tls_cipher_suites_clsÚ_GenericCipherSuiteÚ_GenericCipherSuiteMetaclass)Ú
TLS13_HKDF)Údefault_backend)ÚhashesZhello_requestZclient_helloZserver_helloZhello_verify_requestZsession_ticketZhello_retry_requestZencrypted_extensionsZcertificateZserver_key_exchangeZcertificate_requestZserver_hello_doneZcertificate_verifyZclient_key_exchangeÚfinishedZcertificate_urlZcertificate_statusZsupplemental_dataZ
key_update)r   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   c                   @   sR   e Zd ZdZdZeddeƒeddƒedddd	„ d
�gZ	dd„ Z
dd„ Zdd„ ZdS )Ú_TLSHandshakez‚
    Inherited by other Handshake classes to get post_build().
    Also used as a fallback for unknown TLS Handshake packets.
    zTLS Handshake Generic messageÚmsgtypeNÚmsglenÚmsgÚ c                 C   s   | j S ©N©rW   ©Úpkt© r^   úQ/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/tls/handshake.pyÚ<lambda>f   ó    z_TLSHandshake.<lambda>©Úlength_fromc                 C   sJ   t |ƒ}| jd u rB|d }t dt|d ƒd> |B ¡|dd …  }|| S )NrG   ú!Ir   rT   )ÚlenrW   ÚstructÚpackr   )ÚselfÚpÚpayÚtmp_lenÚl2r^   r^   r_   Ú
post_buildh   s
    
(z_TLSHandshake.post_buildc                 C   s   t jS rZ   )r   Zpadding_layer©rh   ri   r^   r^   r_   Úguess_payload_classo   s    z!_TLSHandshake.guess_payload_classc                 C   s    | j j |¡ | j j | ¡ dS )zO
        Covers both post_build- and post_dissection- context updates.
        N)Útls_sessionÚhandshake_messagesÚappendZhandshake_messages_parsed©rh   Úmsg_strr^   r^   r_   Útls_session_updater   s    z _TLSHandshake.tls_session_update)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Únamer   Ú_tls_handshake_typer   r   Úfields_descrm   ro   ru   r^   r^   r^   r_   rU   ]   s   
ÿþrU   c                   @   s.   e Zd ZdZeddeƒeddƒgZdd„ ZdS )ÚTLSHelloRequestzTLS Handshake - Hello RequestrV   r   rW   Nc                 C   s   dS )zœ
        Message should not be added to the list of handshake messages
        that will be hashed in the finished and certificate verify messages.
        Nr^   rs   r^   r^   r_   ru   „   s    z"TLSHelloRequest.tls_session_update)	rv   rw   rx   rz   r   r{   r   r|   ru   r^   r^   r^   r_   r}      s
   
ÿr}   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú_GMTUnixTimeFieldz˜
    "The current time and date in standard UNIX 32-bit format (seconds since
     the midnight starting Jan 1, 1970, GMT, ignoring leap seconds)."
    c                 C   s   |d ur|S dS ©Nr   r^   ©rh   r]   Úxr^   r^   r_   Úi2h–   s    z_GMTUnixTimeField.i2hc                 C   s   |d urt |ƒS dS r   )Úintr€   r^   r^   r_   Úi2m›   s    z_GMTUnixTimeField.i2mN)rv   rw   rx   ry   r‚   r„   r^   r^   r^   r_   r~   �   s   r~   c                   @   s   e Zd Zdd„ ZdS )Ú_TLSRandomBytesFieldc                 C   s    |d u rt |ƒS t|  ||¡ƒS rZ   )Úreprr   r‚   r€   r^   r^   r_   Úi2repr    s    z_TLSRandomBytesField.i2reprN)rv   rw   rx   r‡   r^   r^   r^   r_   r…   Ÿ   s   r…   c                   @   s   e Zd ZdZdS )Ú_SessionIDFieldz>
    opaque SessionID<0..32>; section 7.4.1.2 of RFC 4346
    N)rv   rw   rx   ry   r^   r^   r^   r_   rˆ   ¦   s   rˆ   c                   @   sZ   e Zd Zg 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S )Ú_CipherSuitesField)ÚitemfmtÚitemsizeÚi2sÚs2irD   Nú!Hc           	      C   sd   t j| |||d� || _t |¡| _i  }| _i  }| _t 	|¡D ]}|| ||< |||| < qBd S )Nrb   )
r   Ú__init__rŠ   rf   Úcalcsizer‹   rŒ   r�   r   Úiterkeys)	rh   rz   ÚdefaultZdicorc   rŠ   rŒ   r�   Úkr^   r^   r_   r�   ±   s    

z_CipherSuitesField.__init__c                 C   s,   t |ttfƒr|j}t |tƒr(| j| }|S rZ   )Ú
isinstancer>   r?   ÚvalÚbytesr�   r€   r^   r^   r_   Ú	any2i_one»   s
    

z_CipherSuitesField.any2i_onec                 C   s   d| j  }| j ||| ¡S )Nz0x%%0%dx)r‹   rŒ   Úget)rh   r]   r�   Úfmtr^   r^   r_   Ú
i2repr_oneÂ   s    
z_CipherSuitesField.i2repr_onec                    s0   |d u rd S t |tƒs|g}‡ ‡fdd„|D ƒS )Nc                    s   g | ]}ˆ  ˆ |¡‘qS r^   )r—   ©Ú.0Úz©r]   rh   r^   r_   Ú
<listcomp>Ë   ra   z,_CipherSuitesField.any2i.<locals>.<listcomp>)r”   Úlistr€   r^   rž   r_   Úany2iÆ   s
    
z_CipherSuitesField.any2ic                    sH   |d u rdS ‡ ‡fdd„|D ƒ}t |ƒdkr6|d }ndd |¡ }|S )NÚNonec                    s   g | ]}ˆ  ˆ |¡‘qS r^   )rš   r›   rž   r^   r_   rŸ   Ð   ra   z-_CipherSuitesField.i2repr.<locals>.<listcomp>rD   r   z[%s]z, )re   Újoin)rh   r]   r�   rk   r^   rž   r_   r‡   Í   s    
z_CipherSuitesField.i2reprc                    s$   |d u rg }d  ‡ fdd„|D ƒ¡S )Nra   c                 3   s   | ]}t  ˆ j|¡V  qd S rZ   )rf   rg   rŠ   ©rœ   r�   ©rh   r^   r_   Ú	<genexpr>Ú   ra   z)_CipherSuitesField.i2m.<locals>.<genexpr>)r£   ©rh   r]   r•   r^   r¥   r_   r„   ×   s    z_CipherSuitesField.i2mc                 C   sF   g }t  | j¡}|rB| t  | j|d |… ¡d ¡ ||d … }q|S r   )rf   r�   rŠ   rr   Úunpack)rh   r]   ÚmÚresZitemlenr^   r^   r_   Úm2iÜ   s     z_CipherSuitesField.m2ic                 C   s   |d u rdS t |ƒ| j S r   )re   r‹   ©rh   r]   Úir^   r^   r_   Úi2lenä   s    z_CipherSuitesField.i2len)NrŽ   )rv   rw   rx   Ú	__slots__Úislistr�   r—   rš   r¡   r‡   r„   r«   r®   r^   r^   r^   r_   r‰   ­   s   


r‰   c                   @   s   e Zd Zdd„ ZdS )Ú_CompressionMethodsFieldc                 C   s,   t |ttfƒr|j}t |tƒr(| j| }|S rZ   )r”   r:   r;   r•   Ústrr�   r€   r^   r^   r_   r—   ì   s
    

z"_CompressionMethodsField.any2i_oneN)rv   rw   rx   r—   r^   r^   r^   r_   r±   ê   s   r±   c                       sâ   e Zd ZdZdZeddeƒeddƒedde	ƒe
ddƒed	dd
ƒeddddd�edddd„ d�eddddd�eddeddd„ d�eddddd�eddgeddd„ d�edddd�edddd„ d�gZ‡ fd d!„Z‡ fd"d#„Z‡  ZS )$ÚTLSClientHelloa¼  
    TLS ClientHello, with abilities to handle extensions.

    The Random structure follows the RFC 5246: while it is 32-byte long,
    many implementations use the first 4 bytes as a gmt_unix_time, and then
    the remaining 28 byts should be completely random. This was designed in
    order to (sort of) mitigate broken RNGs. If you prefer to show the full
    32 random bytes without any GMT time, just comment in/out the lines below.
    zTLS Handshake - Client HellorV   rD   rW   NÚversionÚgmt_unix_timeÚrandom_bytesé   ÚsidlenÚBÚsid©r™   Ú	length_ofrY   c                 C   s   | j S rZ   ©r¸   r\   r^   r^   r_   r`     ra   zTLSClientHello.<lambda>rb   Ú
cipherslenrŽ   Úciphersc                 C   s   | j S rZ   ©r¾   r\   r^   r^   r_   r`     ra   ©rŠ   rc   ÚcomplenÚcompr   c                 C   s   | j S rZ   ©rÂ   r\   r^   r^   r_   r`     ra   ÚextlenÚext©r¼   c                 C   s(   | j | jpd | jpd | jp d d S ©Nr   é(   ©rW   r¸   r¾   rÂ   r\   r^   r^   r_   r`     s   ÿþýüc           
         s²   | j d u r*|d d… tdƒ |dd …  }| jd u r d| jp>d }d}|d |… t|ƒ ||d d …  }| jd u r d}d	}d
}d}d}	||| | | |	 7 }tt| ƒ ||¡S )Né
   r·   é&   é'   r   s8   001ac02bc023c02fc027009e0067009c003cc009c0130033002f000arE   s    ,s   ÿ  s         
secdev.orgs      s    
   )	r¶   r   r¿   r¸   r   rÆ   Úsuperr³   rm   )
rh   ri   rj   ZcipherstartÚsZext_lenZ	ext_renegZext_snZ
ext_sigalgZext_supgroups©Ú	__class__r^   r_   rm   #  s    
 
$
zTLSClientHello.post_buildc                    s¾   t t| ƒ |¡ | j}| j|_| jr6| jdkr6| j|_|dd… | _t	 
d| j¡| j |_| jrº| jD ]R}t|tƒr¦t|jdd�D ]}|tv r‚||_ qšq‚|jr¦d|_t|tƒrf|j|_qfdS )ú“
        Either for parsing or building, we store the client_random
        along with the raw string representing this handshake message.
        r   rË   rÌ   rd   T©ÚreverseN)rÎ   r³   ru   rp   r´   Úadvertised_tls_versionr¸   rº   r¶   rf   rg   rµ   Úclient_randomrÆ   r”   r%   ÚsortedÚversionsr   Úmiddlebox_compatibilityr&   Úsig_algsÚadvertised_sig_algs©rh   rt   rÏ   ÚeÚverrÐ   r^   r_   ru   7  s(    ÿ


z!TLSClientHello.tls_session_update)rv   rw   rx   ry   rz   r   r{   r   r!   r   r~   r…   r   rˆ   r‰   r<   r±   r7   r"   r#   r|   rm   ru   Ú__classcell__r^   r^   rÐ   r_   r³   ø   s>   	


ÿÿþýÿç r³   c                       sÖ   e Zd ZdZdZeddeƒeddƒedde	ƒe
ddd	ƒed
dddd�edddd„ d�eddddd�eddeddd„ d�eddddd�eddgeddd„ d�edddd�edddd„ d�gZdd „ Z‡ fd!d"„Z‡  ZS )#ÚTLS13ClientHelloz…
    TLS 1.3 ClientHello, with abilities to handle extensions.

    The Random structure is 32 random bytes without any GMT time
    z TLS 1.3 Handshake - Client HellorV   rD   rW   Nr´   r¶   é    r¸   r¹   rº   r»   rY   c                 C   s   | j S rZ   r½   r\   r^   r^   r_   r`   i  ra   zTLS13ClientHello.<lambda>rb   r¾   rŽ   r¿   c                 C   s   | j S rZ   rÀ   r\   r^   r^   r_   r`   o  ra   rÁ   rÂ   rÃ   r   c                 C   s   | j S rZ   rÄ   r\   r^   r^   r_   r`   u  ra   rÅ   rÆ   rÇ   c                 C   s(   | j | jpd | jpd | jp d d S rÈ   rÊ   r\   r^   r^   r_   r`   y  s   ÿþýüc                 C   sL  | j d u r*|d d… tdƒ |dd …  }t|ƒ}| jd u rl|d }t dt|d ƒd> |B ¡|dd …  }| j}| j�rD| jD ]Â}t	|t
ƒr€|jrÈ|j}t| }t|jj ¡ ƒ}	|	jj}
|jdd	� ntd
ƒ}	|	jj}
|jdd	� d}|j�r|jD ]}||7 }qö||d |
 d … 7 }|jd }|	 ||¡}|d |
 … | }q€|| S )NrH   rá   rÌ   rG   rd   r   rT   F)ZexternalÚsha256Tra   rF   Ú
binder_key)r¶   r   re   rW   rf   rg   r   rp   rÆ   r”   r6   Úclient_session_ticketÚtls13_ticket_ciphersuiter=   r@   Úhash_algrz   ÚlowerÚhashÚdigest_sizeÚcompute_tls13_early_secretsÚtls13_retryrq   Útls13_derived_secretsÚcompute_verify_data)rh   ri   rj   rk   ÚszrÏ   rÝ   Z	res_suiteÚcs_clsÚhkdfÚhash_lenÚhandshake_contextr©   rã   Z
psk_binderr^   r^   r_   rm     s<    
 
(

	


ÿzTLS13ClientHello.post_buildc                    s¤   t t| ƒ |¡ | j}| jr4| jdkr4| j|_d|_|dd… | _| j|_| j	r | j	D ]H}t
|tƒrŒt|jdd�D ]}|tv rr|| j_ qŒqrt
|tƒrV|j|_qVdS )rÒ   r   TrH   rÌ   rÓ   N)rÎ   rà   ru   rp   r¸   rº   rÙ   r¶   rÖ   rÆ   r”   r%   r×   rØ   r   rÕ   r&   rÚ   rÛ   rÜ   rÐ   r^   r_   ru   ¿  s     


z#TLS13ClientHello.tls_session_update)rv   rw   rx   ry   rz   r   r{   r   r!   r   r…   r   rˆ   r‰   r<   r±   r7   r"   r#   r|   rm   ru   rß   r^   r^   rÐ   r_   rà   Z  s<   


ÿÿþýÿé@rà   c                       sÊ   e Zd ZdZdZeddeƒeddƒedde	ƒe
ddƒed	dd
ƒeddddd�edddd„ d�eddeƒeddgeddd„ d�edddd�edddd„ d�gZed"dd„ƒZ‡ fdd„Z‡ fd d!„Z‡  ZS )#ÚTLSServerHelloa¼  
    TLS ServerHello, with abilities to handle extensions.

    The Random structure follows the RFC 5246: while it is 32-byte long,
    many implementations use the first 4 bytes as a gmt_unix_time, and then
    the remaining 28 byts should be completely random. This was designed in
    order to (sort of) mitigate broken RNGs. If you prefer to show the full
    32 random bytes without any GMT time, just comment in/out the lines below.
    zTLS Handshake - Server HellorV   rE   rW   Nr´   rµ   r¶   r·   r¸   rº   r¹   ©r¼   r™   rY   c                 C   s   | j S rZ   r½   r\   r^   r^   r_   r`   ô  ra   zTLSServerHello.<lambda>rb   ÚcipherrÃ   r   c                 C   s   dS ©NrD   r^   r\   r^   r^   r_   r`   ú  ra   rÁ   rÅ   rÆ   rÇ   c                 C   s   | j | jpd d S rÈ   )rW   r¸   r\   r^   r^   r_   r`   þ  s    c                 O   s@   |r<t |ƒdkr<t d|dd… ¡d }|dks8|dkr<tS tS )NrH   rŽ   rG   r   é  i   )re   rf   r¨   ÚTLS13ServerHelloró   )ÚclsÚ_pktÚargsÚkargsr´   r^   r^   r_   Údispatch_hook  s
    zTLSServerHello.dispatch_hookc                    s<   | j d u r*|d d… tdƒ |dd …  }tt| ƒ ||¡S )NrË   r·   rÌ   )r¶   r   rÎ   ró   rm   ©rh   ri   rj   rÐ   r^   r_   rm   
  s    
 zTLSServerHello.post_buildc           
         s(  t t| ƒ |¡ | j}| j|_t| dƒrN|dd… | _t 	d| j
¡| j |_n| j|_| j|_| jr”| jD ](}t|tƒr€d| j_t|tƒrjd| j_qjd}| jrÀ| j}|tvr¸td|ƒ nt| }t}| jrö| jd }|tvrîd	}t||ƒ d}t| }|j}	t|||	| jd
�|_t|||	| jd
�|_dS )a  
        Either for parsing or building, we store the server_random
        along with the raw string representing this handshake message.
        We also store the session_id, the cipher suite (if recognized),
        the compression method, and finally we instantiate the pending write
        and read connection states. Usually they get updated later on in the
        negotiation when we learn the session keys, and eventually they
        are committed once a ChangeCipherSpec has been sent/received.
        rµ   rË   rÌ   rd   TNú(Unknown cipher suite %d from ServerHellor   z+Unknown compression alg %d from ServerHello)ÚciphersuiteZcompression_algÚconnection_endÚtls_version)rÎ   ró   ru   rp   r´   r  Úhasattrr¶   rf   rg   rµ   Úserver_randomrº   rÆ   r”   r*   Úextmsr+   Zencrypt_then_macrõ   r=   r   r9   rÃ   r8   r  r5   Úpwcsr4   Úprcs)
rh   rt   rÏ   rÝ   rï   Úcs_valZcomp_clsZcomp_valÚerrr  rÐ   r^   r_   ru     sR    

ÿ





ýýz!TLSServerHello.tls_session_update)N)rv   rw   rx   ry   rz   r   r{   r   r    r   r~   r…   r   rˆ   r   r<   r±   r7   r"   r#   r|   Úclassmethodrý   rm   ru   rß   r^   r^   rÐ   r_   ró   ß  s4   	


ÿ
ýÿíró   rV   rE   rW   r´   é  r¶   rá   r¸   rº   r¹   rô   rY   c                 C   s   | j S rZ   r½   r\   r^   r^   r_   r`   P  ra   r`   rb   rõ   rÃ   c                 C   s   dS rö   r^   r\   r^   r^   r_   r`   U  ra   rÁ   rÅ   rÆ   rÇ   c                 C   s
   | j d S )NrÌ   r[   r\   r^   r^   r_   r`   X  s   ÿc                       s>   e Zd ZdZdZeZed
dd„ƒZ‡ fdd„Z	dd	„ Z
‡  ZS )rø   z TLS 1.3 ServerHello z TLS 1.3 Handshake - Server HelloNc                 O   s,   |r(t |ƒdkr(|dd… }|tkr(tS tS )NrÌ   rH   )re   r)   ÚTLS13HelloRetryRequestrø   )rù   rú   rû   rü   r¶   r^   r^   r_   rý   d  s
    zTLS13ServerHello.dispatch_hookc                    s<   | j d u r*|d d… tdƒ |dd …  }tt| ƒ ||¡S )NrH   rá   rÌ   )r¶   r   rÎ   rø   rm   rþ   rÐ   r^   r_   rm   n  s    
 zTLS13ServerHello.post_buildc                 C   sH  | j }| j|_| j|_| j|_| jrF| jD ]}t|t	ƒr*|j|_ qFq*|jdk r\t
 | |¡S t | |¡ d}| jr”| j}|tvrŒtd|ƒ nt| }|j}|dkrÂt|||jd�|_|jsèd|_n&|dkrèt|||jd�|_|jsèd|_|jdu rú| ¡  | ¡  |dk�r$|jd }|j |¡ n |dk�rD|jd }|j |¡ dS )	a  
        Either for parsing or building, we store the server_random along with
        the raw string representing this handshake message. We also store the
        cipher suite (if recognized), and finally we instantiate the write and
        read connection states.
        r÷   Nrÿ   Úserver©r   r  r  TÚclientZserver_handshake_traffic_secret)rp   r¶   r  rõ   r   r´   r  rÆ   r”   r'   ró   ru   rU   r=   r   r  r5   r  rÙ   Útriggered_pwcs_commitr4   r  Útriggered_prcs_commitZtls13_early_secretrê   Zcompute_tls13_handshake_secretsrì   Útls13_derive_keys)rh   rt   rÏ   rÝ   rï   r  r  Zshtsr^   r^   r_   ru   s  sT    


þþ




z#TLS13ServerHello.tls_session_update)N)rv   rw   rx   ry   rz   Ú_tls_13_server_hello_fieldsr|   r
  rý   rm   ru   rß   r^   r^   rÐ   r_   rø   ]  s   	rø   c                       s,   e Zd ZdZeZdd„ Z‡ fdd„Z‡  ZS )r  z'TLS 1.3 Handshake - Hello Retry Requestc                 C   s"   |   d¡}|d u rt| _t | ¡S )Nr¶   )Úgetfieldvalr)   r¶   rU   Úbuild©rh   Úfvalr^   r^   r_   r  »  s    
zTLS13HelloRetryRequest.buildc                    sæ   | j }d|_i |_|jr<t|j }t|jj 	¡ ƒ}|j
j}n"t| j }t|jj 	¡ ƒ}|j
j}t dd¡}|t dd¡7 }|t dd¡7 }|t d|¡7 }tj|j
tƒ d�}| |jd ¡ || ¡ 7 }||jd< tt| ƒ |¡ d S )NTr¹   éþ   r   )Úbackend)rp   rë   Ztls13_client_pubsharesrä   r=   rå   r@   ræ   rz   rç   rè   ré   rõ   rf   rg   rB   ZHashrA   Úupdaterq   ÚfinalizerÎ   r  ru   )rh   rt   rÏ   rï   rð   rñ   rò   ÚdigestrÐ   r^   r_   ru   Á  s&    



z)TLS13HelloRetryRequest.tls_session_update)	rv   rw   rx   rz   r  r|   r  ru   rß   r^   r^   rÐ   r_   r  ¶  s   r  c                   @   sR   e Zd ZdZeddeƒeddƒedddd�eddd	d
„ d�gZ	dd„ Z
dd„ ZdS )ÚTLSEncryptedExtensionsz(TLS 1.3 Handshake - Encrypted ExtensionsrV   rI   rW   NrÅ   rÆ   rÇ   c                 C   s
   | j d S ©NrE   r[   r\   r^   r^   r_   r`   æ  ra   zTLSEncryptedExtensions.<lambda>rb   c                 C   s˜   |   |¡ | j}|j}d}| jr:| jD ]}t|tƒr&d}q&|dkr”|s”tt|jj	ƒ||j
d�|_|jd }|j |¡ |jsŽ| jj|_d|_nd|_d S )NFTr  r  Úclient_handshake_traffic_secret)ru   rp   r  rÆ   r”   r(   r4   ÚtypeÚwcsr   r  r  rì   r  rÙ   Úrcsr  ©rh   rt   rÏ   r  Zearly_data_acceptedrÝ   Zchtsr^   r^   r_   Úpost_build_tls_session_updateè  s(    


þ

z4TLSEncryptedExtensions.post_build_tls_session_updatec                 C   s˜   |   |¡ | j}|j}d}| jr:| jD ]}t|tƒr&d}q&|dkr”|s”tt|jj	ƒ||j
d�|_|jd }|j |¡ |jsŽ| jj|_d|_nd|_d S )NFTr  r  r  )ru   rp   r  rÆ   r”   r(   r5   r   r"  r   r  r  rì   r  rÙ   r!  r  r  r#  r^   r^   r_   Ú"post_dissection_tls_session_update	  s(    


þ

z9TLSEncryptedExtensions.post_dissection_tls_session_update)rv   rw   rx   rz   r   r{   r   r"   r#   r|   r$  r%  r^   r^   r^   r_   r  à  s   
ÿý!r  c                   @   s:   e Zd ZdZddd„ fdd„Zdd„ Zd	d
„ Zdd„ ZdS )Ú_ASN1CertLenFieldz0
    This is mostly a 3-byte FieldLenField.
    Nc                 C   s   |S rZ   r^   ©r]   r�   r^   r^   r_   r`   1  ra   z_ASN1CertLenField.<lambda>c                 C   s"   || _ || _tj| ||dd� d S )Nrd   )r™   )r¼   Úadjustr   r�   ©rh   rz   r’   r¼   r(  r^   r^   r_   r�   1  s    z_ASN1CertLenField.__init__c                 C   s>   |d u r:| j d ur:| | j ¡\}}| ||¡}|  ||¡}|S rZ   )r¼   Zgetfield_and_valr®   r(  )rh   r]   r�   Zfldr  Úfr^   r^   r_   r„   6  s    
z_ASN1CertLenField.i2mc                 C   s"   |t  | j|  ||¡¡dd…  S ©NrD   rG   ©rf   rg   r™   r„   ©rh   r]   rÏ   r•   r^   r^   r_   Úaddfield>  s    z_ASN1CertLenField.addfieldc                 C   s2   |dd … |   |t | jd|d d…  ¡d ¡fS ©NrF   ó    r   ©r«   rf   r¨   r™   ©rh   r]   rÏ   r^   r^   r_   ÚgetfieldA  s    z_ASN1CertLenField.getfield)rv   rw   rx   ry   r�   r„   r.  r3  r^   r^   r^   r_   r&  -  s
   r&  c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )Ú_ASN1CertListFieldrD   c                 C   s   |d u rdS t |  ||¡ƒS r   ©re   r„   r¬   r^   r^   r_   r®   H  s    z_ASN1CertListField.i2lenc                 C   s¢   d}| j dur|   |¡}g }d}|}|durF|d|… ||d…  }}|r–t dd|dd…  ¡d }| |t|dd| … ƒf¡ |d| d… }qF|| |fS )zp
        Extract Certs in a loop.
        XXX We should provide safeguards when trying to parse a Cert.
        Nra   rd   r0  rF   r   )rc   rf   r¨   rr   r   )rh   r]   rÏ   rk   ÚlstÚretr©   Úc_lenr^   r^   r_   r3  M  s    

z_ASN1CertListField.getfieldc                    sJ   dd„ ‰ |d u rdS t |tƒr"|S t |tƒr2|g}d ‡ fdd„|D ƒ¡S )Nc                 S   sn   t | tƒr| S t | tƒr>| j}t dt|ƒ¡dd… }|| S | \}}t |tƒrV|j}t d|¡dd… | S ©Nrd   rD   rG   ©r”   r²   r   Zderrf   rg   re   ©r­   rÏ   rk   r^   r^   r_   Úi2m_oneb  s    


z'_ASN1CertListField.i2m.<locals>.i2m_onera   c                 3   s   | ]}ˆ |ƒV  qd S rZ   r^   r¤   ©r<  r^   r_   r¦   u  ra   z)_ASN1CertListField.i2m.<locals>.<genexpr>)r”   r²   r   r£   r¬   r^   r=  r_   r„   a  s    

z_ASN1CertListField.i2mc                 C   s   |S rZ   r^   r€   r^   r^   r_   r¡   w  s    z_ASN1CertListField.any2iN)rv   rw   rx   r°   r®   r3  r„   r¡   r^   r^   r^   r_   r4  E  s
   r4  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú_ASN1CertFieldc                 C   s   |d u rdS t |  ||¡ƒS r   r5  r¬   r^   r^   r_   r®   |  s    z_ASN1CertField.i2lenc                 C   s’   d }| j d ur|   |¡}d}|}|d urB|d |… ||d …  }}t dd|d d…  ¡d }|t|dd| … ƒf}|d| d … }|| |fS )Nra   rd   r0  rF   r   )rc   rf   r¨   r   )rh   r]   rÏ   rk   r7  r©   r8  Zlen_certr^   r^   r_   r3  �  s    

z_ASN1CertField.getfieldc                 C   s   dd„ }|d u rdS ||ƒS )Nc                 S   sn   t | tƒr| S t | tƒr>| j}t dt|ƒ¡dd… }|| S | \}}t |tƒrV|j}t d|¡dd… | S r9  r:  r;  r^   r^   r_   r<  �  s    


z#_ASN1CertField.i2m.<locals>.i2m_onera   r^   )rh   r]   r­   r<  r^   r^   r_   r„   Ž  s    z_ASN1CertField.i2mc                 C   s   |S rZ   r^   r€   r^   r^   r_   r¡      s    z_ASN1CertField.any2iN)rv   rw   rx   r®   r3  r„   r¡   r^   r^   r^   r_   r>  {  s   r>  c                   @   s\   e Zd ZdZdZeddeƒeddƒedddd	�e	dg d
d„ d�gZ
eddd„ƒZdd„ ZdS )ÚTLSCertificatezD
    XXX We do not support RFC 5081, i.e. OpenPGP certificates.
    zTLS Handshake - CertificaterV   rJ   rW   NÚcertslenÚcertsrÇ   c                 C   s   | j S rZ   ©r@  r\   r^   r^   r_   r`   ­  ra   zTLSCertificate.<lambda>rb   c                 O   s*   |r&|  dd ¡}|r&|jpddkr&tS tS )Nrp   r   r÷   )r˜   r  ÚTLS13Certificater?  )rù   rú   rû   rü   rp   r^   r^   r_   rý   ¯  s
    zTLSCertificate.dispatch_hookc                 C   sH   |   |¡ | jj}|dkr0dd„ | jD ƒ| j_ndd„ | jD ƒ| j_d S )Nr  c                 S   s   g | ]}|d  ‘qS ©rD   r^   r¤   r^   r^   r_   rŸ   »  ra   zETLSCertificate.post_dissection_tls_session_update.<locals>.<listcomp>c                 S   s   g | ]}|d  ‘qS rD  r^   r¤   r^   r^   r_   rŸ   ½  ra   ©ru   rp   r  rA  Úserver_certsÚclient_certs)rh   rt   r  r^   r^   r_   r%  ·  s
    
z1TLSCertificate.post_dissection_tls_session_update)N)rv   rw   rx   ry   rz   r   r{   r   r&  r4  r|   r
  rý   r%  r^   r^   r^   r_   r?  ¤  s   
ÿýr?  c                   @   s@   e Zd ZdZeddƒedddd�edg dd	„ d
�gZdd„ ZdS )Ú_ASN1CertAndExtzCertificate and ExtensionsÚcertrY   rÅ   NrÆ   rÇ   c                 C   s   | j S rZ   )rÅ   r\   r^   r^   r_   r`   Å  ra   z_ASN1CertAndExt.<lambda>rb   c                 C   s   d|fS )Nra   r^   )rh   rÏ   r^   r^   r_   Úextract_paddingÇ  s    z_ASN1CertAndExt.extract_padding)	rv   rw   rx   rz   r>  r   r#   r|   rJ  r^   r^   r^   r_   rH  À  s   ÿþrH  c                   @   s   e Zd Zdd„ ZdS )Ú_ASN1CertAndExtListFieldc                 C   s   | j ||jd�S )N©rp   )rù   rp   )rh   r]   r©   r^   r^   r_   r«   Ì  s    z_ASN1CertAndExtListField.m2iN©rv   rw   rx   r«   r^   r^   r^   r_   rK  Ë  s   rK  c                   @   sj   e Zd ZdZeddeƒeddƒeddddd	�edd
dd„ d�e	dddd�e
dg edd„ d�gZdd„ ZdS )rC  zTLS 1.3 Handshake - CertificaterV   rJ   rW   NÚcert_req_ctxt_lenr¹   Úcert_req_ctxtr»   rY   c                 C   s   | j S rZ   ©rN  r\   r^   r^   r_   r`   ×  ra   zTLS13Certificate.<lambda>rb   r@  rA  rÇ   c                 C   s   | j S rZ   rB  r\   r^   r^   r_   r`   Ú  ra   c                 C   s\   |   |¡ | jj}|dkr:| jrXdd„ | jD ƒ}|| j_n| jrXdd„ | jD ƒ}|| j_d S )Nr  c                 S   s   g | ]}|j d  ‘qS rD  ©rI  r¤   r^   r^   r_   rŸ   á  ra   zGTLS13Certificate.post_dissection_tls_session_update.<locals>.<listcomp>c                 S   s   g | ]}|j d  ‘qS rD  rQ  r¤   r^   r^   r_   rŸ   å  ra   rE  )rh   rt   r  ÚscÚccr^   r^   r_   r%  Ü  s    

z3TLS13Certificate.post_dissection_tls_session_update)rv   rw   rx   rz   r   r{   r   r   r   r&  rK  rH  r|   r%  r^   r^   r^   r_   rC  Ð  s   
ÿÿÿù
rC  c                   @   sV   e Zd ZdZeddeƒeddƒedddd„ d	�ed
ddd„ d	�gZ	dd„ Z
dd„ ZdS )ÚTLSServerKeyExchangez#TLS Handshake - Server Key ExchangerV   rK   rW   NÚparamsc                 C   s   | j S rZ   r[   r\   r^   r^   r_   r`   ò  ra   zTLSServerKeyExchange.<lambda>rb   Úsigc                 C   s   | j t| jƒ S rZ   )rW   re   rU  r\   r^   r^   r_   r`   ô  ra   c                 O   s  |   d¡}|du r‚| j}|jrv|jjjr4t|d�}n|jj d¡}||d�}z| ¡  W q| tyr   t	j
rn‚ Y q|0 ntƒ }|| _|   d¡}|du �r| j}|jrú|jrú|jjjsò| j}|du rÄd}|j|j t|ƒ }t|d�}| ||j¡ ntƒ }ntƒ }|| _tj| g|¢R i |¤ŽS )av  
        We overload build() method in order to provide a valid default value
        for params based on TLS session if not provided. This cannot be done by
        overriding i2m() because the method is called on a copy of the packet.

        The 'params' field is built according to key_exchange.server_kx_msg_cls
        which should have been set after receiving a cipher suite in a
        previous ServerHello. Usual cases are:

        - None: for RSA encryption or fixed FF/ECDH. This should never happen,
          as no ServerKeyExchange should be generated in the first place.
        - ServerDHParams: for ephemeral FFDH. In that case, the parameter to
          server_kx_msg_cls does not matter.
        - ServerECDH\*Params: for ephemeral ECDH. There are actually three
          classes, which are dispatched by _tls_server_ecdh_cls_guess on
          the first byte retrieved. The default here is b"\03", which
          corresponds to ServerECDHNamedCurveParams (implicit curves).

        When the Server\*DHParams are built via .fill_missing(), the session
        server_kx_privkey will be updated accordingly.
        rU  NrL  ó   rV  ra   )r  rp   r  Úkey_exchangeZexportr/   Zserver_kx_msg_clsZfill_missingÚ	Exceptionr   Zdebug_dissectorr   rU  rÖ   Ú	anonymousr  r   r,   Ú_update_sigÚ
server_keyrV  rU   r  )rh   rû   rü   r  rÏ   rù   ri   r©   r^   r^   r_   r  ö  s<    







zTLSServerKeyExchange.buildc                 C   s¨   | j }|jr.|jjjr.| ¡  ¡ }t d|¡ |jr¤|jjjs¤|j	r¤|j
r¤|jr¤t|jƒdkr¤|j	|j
 t| jƒ }| j ||jd ¡}|s¤| ¡  ¡ }t d|¡ dS )zÁ
        While previously dissecting Server*DHParams, the session
        server_kx_pubkey should have been updated.

        XXX Add a 'fixed_dh' OR condition to the 'anonymous' test.
        z#TLS: useless ServerKeyExchange [%s]r   z-TLS: invalid ServerKeyExchange signature [%s]N)rp   r  rX  Zno_skeÚ
firstlayerÚsummaryr   ÚinforZ  rÖ   r  rF  re   r   rU  rV  Ú_verify_sig)rh   r]   rÏ   Úpkt_infor©   Úsig_testr^   r^   r_   Úpost_dissection1  s(    ÿþþýýz$TLSServerKeyExchange.post_dissection)rv   rw   rx   rz   r   r{   r   r-   r.   r|   r  rc  r^   r^   r^   r_   rT  í  s   
ÿÿü;rT  Zrsa_signZdss_signZrsa_fixed_dhZdss_fixed_dhZrsa_ephemeral_dh_RESERVEDZdss_ephemeral_dh_RESERVEDZfortezza_dms_RESERVEDZ
ecdsa_signZrsa_fixed_ecdhZecdsa_fixed_ecdh)
rD   rE   rF   rG   é   rH   rP   é@   éA   éB   c                   @   s   e Zd ZdS )Ú_CertTypesFieldN)rv   rw   rx   r^   r^   r^   r_   rh  W  s   rh  c                   @   s<   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dS )Ú_CertAuthoritiesFieldz4
    XXX Rework this with proper ASN.1 parsing.
    rD   c                 C   s*   |   |¡}||d … |  ||d |… ¡fS rZ   )rc   r«   )rh   r]   rÏ   rk   r^   r^   r_   r3  a  s    
z_CertAuthoritiesField.getfieldc                 C   s„   g }t |ƒdkr€t d|d d… ¡d }t |ƒ|d k rP| ||dd … f¡ q€|dd| … }| ||f¡ |d| d … }q|S )NrD   rŽ   rE   r   )re   rf   r¨   rr   )rh   r]   r©   rª   rk   Údnr^   r^   r_   r«   e  s    z_CertAuthoritiesField.m2ic                 C   s   d  tdd„ |ƒ¡S )Nra   c                 S   s   t  d| d ¡| d  S )NrŽ   r   rD   )rf   rg   )Zx_yr^   r^   r_   r`   r  ra   z+_CertAuthoritiesField.i2m.<locals>.<lambda>)r£   Úmapr¬   r^   r^   r_   r„   q  s    z_CertAuthoritiesField.i2mc                 C   s   ||   ||¡ S rZ   )r„   r-  r^   r^   r_   r.  t  s    z_CertAuthoritiesField.addfieldc                 C   s    |d u rdS t |  ||¡ƒS d S r   r5  r§   r^   r^   r_   r®   w  s    z_CertAuthoritiesField.i2lenN)
rv   rw   rx   ry   r°   r3  r«   r„   r.  r®   r^   r^   r^   r_   ri  [  s   ri  c                   @   s”   e Zd ZdZeddeƒeddƒeddddd	�edd
dge	ddd„ d�e
dddd�edg d¢eddeƒdd„ d�eddddd	�edg dd„ d�gZdS )ÚTLSCertificateRequestz#TLS Handshake - Certificate RequestrV   rL   rW   NÚ	ctypeslenr¹   Úctypesr»   rD   re  z!Bc                 C   s   | j S rZ   )rm  r\   r^   r^   r_   r`   ‡  ra   zTLSCertificateRequest.<lambda>rÁ   Úsig_algs_lenrÚ   rÇ   )i  i  i  Zhash_sigc                 C   s   | j S rZ   )ro  r\   r^   r^   r_   r`   Œ  ra   rb   ÚcertauthlenrŽ   Zcertauthc                 C   s   | j S rZ   )rp  r\   r^   r^   r_   r`   �  ra   )rv   rw   rx   rz   r   r{   r   r   rh  Ú_tls_client_certificate_typesr2   r0   r   r1   ri  r|   r^   r^   r^   r_   rl  ~  s2   
ÿ
ýÿ

þÿÿñrl  c                
   @   s`   e Zd ZdZeddeƒeddƒeddddd	�edd
dd„ d�e	dddd�e
dddd„ d�gZdS )ÚTLS13CertificateRequestz'TLS 1.3 Handshake - Certificate RequestrV   rL   rW   NrN  r¹   rO  r»   rY   c                 C   s   | j S rZ   rP  r\   r^   r^   r_   r`   š  ra   z TLS13CertificateRequest.<lambda>rb   rÅ   rÆ   rÇ   c                 C   s   | j | j d S )NrF   )rW   rN  r\   r^   r^   r_   r`   �  s   ÿÿ)rv   rw   rx   rz   r   r{   r   r   r   r"   r#   r|   r^   r^   r^   r_   rr  “  s   
ÿÿÿùrr  c                   @   s&   e Zd ZdZeddeƒeddƒgZdS )ÚTLSServerHelloDonez!TLS Handshake - Server Hello DonerV   rM   rW   N©rv   rw   rx   rz   r   r{   r   r|   r^   r^   r^   r_   rs  ¥  s   
ÿrs  c                   @   sF   e Zd ZdZeddeƒeddƒedddd„ d	�gZd
d„ Z	dd„ Z
dS )ÚTLSCertificateVerifyz"TLS Handshake - Certificate VerifyrV   rN   rW   NrV  c                 C   s   | j S rZ   r[   r\   r^   r^   r_   r`   ´  ra   zTLSCertificateVerify.<lambda>rb   c                 O   sÒ   |   d¡}|d u rº| j}d |j¡}|j}|d u r8|j}|dkrx|jdkrPd}n|jdkr^d}d| d	 |jj 	|¡ }t
|d
�| _|jdkr | j ||j¡ n|jdkrº| j ||j¡ tj| g|¢R i |¤ŽS )NrV  ra   r÷   r  ó!   TLS 1.3, client CertificateVerifyr  ó!   TLS 1.3, server CertificateVerifyó@                                                                   r0  rL  )r  rp   r£   rq   r  rÕ   r  r!  rè   r  r,   rV  r[  Z
client_keyr\  rU   r  )rh   rû   rü   rV  rÏ   r©   r  Úcontext_stringr^   r^   r_   r  ¶  s&    




zTLSCertificateVerify.buildc                 C   s  | j }d |j¡}|j}|d u r&|j}|dkrf|jdkr>d}n|jdkrLd}d| d |jj |¡ }|jdkr¶|j	r´t
|j	ƒd	kr´| j ||j	d	 ¡}|s´| ¡  ¡ }t d
|¡ nV|jdk�r|j�rt
|jƒd	k�r| j ||jd	 ¡}|�s| ¡  ¡ }t d
|¡ d S )Nra   r÷   r  rw  r  rv  rx  r0  r   z-TLS: invalid CertificateVerify signature [%s])rp   r£   rq   r  rÕ   r  r"  rè   r  rG  re   rV  r`  r]  r^  r   r_  rF  )rh   r]   rÏ   r©   r  ry  rb  ra  r^   r^   r_   rc  Ì  s.    


z$TLSCertificateVerify.post_dissection)rv   rw   rx   rz   r   r{   r   r.   r|   r  rc  r^   r^   r^   r_   ru  ¯  s   
ÿþru  c                   @   s(   e Zd ZdgZdZddd„Zdd„ ZdS )	Ú_TLSCKExchKeysFieldrc   rD   Nc                 C   s   || _ t | |d d ¡ d S rZ   )rc   r
   r�   )rh   rz   rc   r^   r^   r_   r�   ð  s    z_TLSCKExchKeysField.__init__c                 C   sr   |   |¡}|d|… ||d…  }}|j}d}|jrF|jjrF|jjj}|du r^t|ƒt|ƒ S |||d�t|ƒ S )a  
        The client_kx_msg may be either None, EncryptedPreMasterSecret
        (for RSA encryption key exchange), ClientDiffieHellmanPublic,
        or ClientECDiffieHellmanPublic. When either one of them gets
        dissected, the session context is updated accordingly.
        NrL  )rc   rp   r  rX  Úclient_kx_msg_clsr   r   )rh   r]   r©   rk   ZtbdÚremrÏ   rù   r^   r^   r_   r«   ô  s    

z_TLSCKExchKeysField.m2i)N)rv   rw   rx   r¯   Zholds_packetr�   r«   r^   r^   r^   r_   rz  ì  s   
rz  c                       sP   e Zd ZdZdZeddeƒeddƒeddd	„ d
�gZ	dd„ Z
‡ fdd„Z‡  ZS )ÚTLSClientKeyExchangezS
    This class mostly works like TLSServerKeyExchange and its 'params' field.
    z#TLS Handshake - Client Key ExchangerV   rO   rW   NÚexchkeysc                 C   s   | j S rZ   r[   r\   r^   r^   r_   r`     ra   zTLSClientKeyExchange.<lambda>rb   c                 O   sX   |   d¡}|d u r@| j}|jr4|jjj}||d�}ntƒ }|| _tj| g|¢R i |¤ŽS )Nr~  rL  )	r  rp   r  rX  r{  r   r~  rU   r  )rh   rû   rü   r  rÏ   rù   r^   r^   r_   r    s    

zTLSClientKeyExchange.buildc                    sœ   t t| ƒ |¡ | jjr˜d | jj¡}| jjdkrbddlm	} | 
| jjjj¡ƒ }| |¡| j_n,ddlm}m} |ƒ  |¡|ƒ  |¡ | j_| j ¡  dS )zB
        Finalize the EXTMS messages and compute the hash
        ra   r  r   )Ú_tls_hash_algs)ÚHash_MD5ÚHash_SHAN)rÎ   r}  ru   rp   r  r£   rq   r  Zscapy.layers.tls.crypto.hashr  r˜   r  ÚprfÚ	hash_namer  Zsession_hashr€  r�  Zcompute_ms_and_derive_keys)rh   rt   Zto_hashr  Zhash_objectr€  r�  rÐ   r^   r_   ru      s    
ÿÿz'TLSClientKeyExchange.tls_session_update)rv   rw   rx   ry   rz   r   r{   r   rz  r|   r  ru   rß   r^   r^   rÐ   r_   r}  
  s   
ÿþr}  c                   @   s   e Zd Zdd„ ZdS )Ú_VerifyDataFieldc                 C   sH   |j jdkrd}n|j jdkr,|j jjj}nd}||d … |d |… fS )Ni   é$   r÷   rK   )rp   r  r"  rè   rñ   )rh   r]   rÏ   Úsepr^   r^   r_   r3  >  s    z_VerifyDataField.getfieldN)rv   rw   rx   r3  r^   r^   r^   r_   r„  =  s   r„  c                   @   sN   e Zd ZdZeddeƒeddƒeddƒgZdd„ Z	d	d
„ Z
dd„ Zdd„ ZdS )ÚTLSFinishedzTLS Handshake - FinishedrV   rP   rW   NÚvdatac           	      O   sŠ   |   d¡}|d u rr| j}d |j¡}|j}|j}|d u r>|j}|dk rd|j}|jj	 
|d||¡| _n| |d¡| _tj| g|¢R i |¤ŽS )Nrˆ  ra   r÷   Úwrite)r  rp   r£   rq   r  r  rÕ   Úmaster_secretr!  r‚  rí   rˆ  Úcompute_tls13_verify_datarU   r  )	rh   rû   rü   r  rÏ   Úhandshake_msgÚcon_endr  Úmsr^   r^   r_   r  N  s    
ÿzTLSFinished.buildc           	      C   sÂ   | j }|js¾d |j¡}|j}|d u r,|j}|dk r‚|jd ur‚|j}|j}|jj	 
|d||¡}| j|kr¾| ¡  ¡ }t d|¡ n<|dkr¾|j}| |d¡}| j|kr¾| ¡  ¡ }t d|¡ d S )Nra   r÷   Úreadz#TLS: invalid Finished received [%s])rp   Úfrozenr£   rq   r  rÕ   rŠ  r  r"  r‚  rí   rˆ  r]  r^  r   r_  r‹  )	rh   r]   rÏ   rŒ  r  rŽ  r�  Zverify_datara  r^   r^   r_   rc  _  s*    ÿ

zTLSFinished.post_dissectionc                 C   s€   |   |¡ | j}|j}|d u r$|j}|dkr|tt|jjƒ|j|jd�|_	d|_
|jdkrb| ¡  n|jdkr|| ¡  | ¡  d S )Nr÷   r  Tr  r  )ru   rp   r  rÕ   r5   r   r!  r   r  r  r  Úcompute_tls13_traffic_secretsÚ!compute_tls13_traffic_secrets_endÚcompute_tls13_resumption_secret©rh   rt   rÏ   r  r^   r^   r_   r$  u  s     
þ


z)TLSFinished.post_build_tls_session_updatec                 C   s€   |   |¡ | j}|j}|d u r$|j}|dkr|tt|jjƒ|j|jd�|_	d|_
|jdkrb| ¡  n|jdkr|| ¡  | ¡  d S )Nr÷   r  Tr  r  )ru   rp   r  rÕ   r4   r   r"  r   r  r  r  r‘  r’  r“  r”  r^   r^   r_   r%  †  s     
þ


z.TLSFinished.post_dissection_tls_session_update)rv   rw   rx   rz   r   r{   r   r„  r|   r  rc  r$  r%  r^   r^   r^   r_   r‡  H  s   
þr‡  c                   @   sH   e Zd ZdZdZeddeƒeddƒedddd	d
�e	d	ddd„ d�gZ
dS )ÚTLSHelloVerifyRequestz)
    Defined for DTLS, see RFC 6347.
    z$TLS Handshake - Hello Verify RequestrV   rQ   rW   NÚ	cookielenr¹   Úcookier»   rY   c                 C   s   | j S rZ   )r–  r\   r^   r^   r_   r`   ¨  ra   zTLSHelloVerifyRequest.<lambda>rb   )rv   rw   rx   ry   rz   r   r{   r   r   r   r|   r^   r^   r^   r_   r•  ž  s   
ÿÿür•  Zindividual_certsZpkipath)r   rD   c                	   @   s\   e Zd ZdZedddd�edddd„ d	�ed
ddddd„ d�edddd„ d	�gZdd„ ZdS )ÚURLAndOptionalHashz0URLAndOptionHash structure for TLSCertificateURLÚurllenNÚurlrÇ   rY   c                 C   s   | j S rZ   )r™  r\   r^   r^   r_   r`   ·  ra   zURLAndOptionalHash.<lambda>rb   Úhash_presentr¹   rè   c                 C   s   t t |d ¡ƒS )Ng      4@)rƒ   ÚmathÚceilr'  r^   r^   r_   r`   º  ra   )r™   r¼   r(  c                 C   s
   d| j  S )NrP   )r›  r\   r^   r^   r_   r`   ¼  ra   c                 C   s   t S rZ   ©r   rn   r^   r^   r_   ro   ¾  s    z&URLAndOptionalHash.guess_payload_class)rv   rw   rx   rz   r   r   r|   ro   r^   r^   r^   r_   r˜  ³  s   ÿþÿú	r˜  c                
   @   sR   e Zd ZdZdZeddeƒeddƒeddeƒe	ddd	d
�e
d	g edd„ d�gZdS )ÚTLSCertificateURLzU
    Defined in RFC 4366. PkiPath structure of section 8 is not implemented yet.
    zTLS Handshake - Certificate URLrV   rQ   rW   NZcertchaintypeÚuahlenZuahrÇ   c                 C   s   | j S rZ   )r   r\   r^   r^   r_   r`   Ì  ra   zTLSCertificateURL.<lambda>rb   )rv   rw   rx   ry   rz   r   r{   r   Ú_tls_cert_chain_typesr   r   r˜  r|   r^   r^   r^   r_   rŸ  Â  s   

ÿürŸ  c                   @   s6   e Zd Zddd„ fdd„Zdd„ Zdd	„ Zd
d„ ZdS )ÚThreeBytesLenFieldNc                 C   s   |S rZ   r^   r'  r^   r^   r_   r`   Ô  ra   zThreeBytesLenField.<lambda>c                 C   s   t j| |||d|d� d S )Nrd   )r¼   r™   r(  )r   r�   r)  r^   r^   r_   r�   Ô  s    ÿzThreeBytesLenField.__init__c                 C   s   |d u rdS t |  ||¡ƒS r   )r†   r‚   r€   r^   r^   r_   r‡   Ø  s    zThreeBytesLenField.i2reprc                 C   s"   |t  | j|  ||¡¡dd…  S r+  r,  r-  r^   r^   r_   r.  Ý  s    zThreeBytesLenField.addfieldc                 C   s2   |dd … |   |t | jd|d d…  ¡d ¡fS r/  r1  r2  r^   r^   r_   r3  à  s    zThreeBytesLenField.getfield)rv   rw   rx   r�   r‡   r.  r3  r^   r^   r^   r_   r¢  Ó  s   r¢  rD   c                   @   s   e Zd Zdd„ ZdS )Ú_StatusFieldc                 C   s$   |j }| j}|tv rt| }||ƒS rZ   )Ústatus_typerù   Ú_cert_status_cls)rh   r]   r©   Zidtyperù   r^   r^   r_   r«   è  s
    z_StatusField.m2iNrM  r^   r^   r^   r_   r£  ç  s   r£  c                
   @   sN   e Zd ZdZeddeƒeddƒeddeƒeddd	d
�e	d	de
dd„ d�gZdS )ÚTLSCertificateStatusz"TLS Handshake - Certificate StatusrV   rR   rW   Nr¤  rD   ÚresponselenÚresponserÇ   c                 C   s   | j S rZ   )r§  r\   r^   r^   r_   r`   ø  ra   zTLSCertificateStatus.<lambda>rb   )rv   rw   rx   rz   r   r{   r   r$   r¢  r£  r   r|   r^   r^   r^   r_   r¦  ð  s   

ÿÿûr¦  c                   @   s@   e Zd ZdZeddƒedddd�edddd	„ d
�gZdd„ ZdS )ÚSupDataEntryz!Supplemental Data Entry - GenericÚsdtypeNre   ÚdatarÇ   rY   c                 C   s   | j S rZ   ©re   r\   r^   r^   r_   r`     ra   zSupDataEntry.<lambda>rb   c                 C   s   t S rZ   rž  rn   r^   r^   r_   ro     s    z SupDataEntry.guess_payload_class)	rv   rw   rx   rz   r   r   r   r|   ro   r^   r^   r^   r_   r©  ÿ  s   ÿþr©  c                   @   s@   e Zd ZdZeddƒedddd�edddd	„ d
�gZdd„ ZdS )ÚUserMappingDatazUser Mapping Datar´   Nre   r«  rÇ   rY   c                 C   s   | j S rZ   r¬  r\   r^   r^   r_   r`     ra   zUserMappingData.<lambda>rb   c                 C   s   t S rZ   rž  rn   r^   r^   r_   ro     s    z#UserMappingData.guess_payload_class)	rv   rw   rx   rz   r   r   r   r|   ro   r^   r^   r^   r_   r­  
  s   ÿþr­  c                	   @   sT   e Zd ZdZeddƒeddddd„ d�ed	ddd
�edg edd„ d�gZdd„ Z	dS )ÚSupDataEntryUMz&Supplemental Data Entry - User Mappingrª  Nre   r«  c                 C   s   |d S r  r^   r'  r^   r^   r_   r`     ra   zSupDataEntryUM.<lambda>)r¼   r(  ÚdlenrÇ   c                 C   s   | j S rZ   )r¯  r\   r^   r^   r_   r`     ra   rb   c                 C   s   t S rZ   rž  rn   r^   r^   r_   ro     s    z"SupDataEntryUM.guess_payload_class)
rv   rw   rx   rz   r   r   r   r­  r|   ro   r^   r^   r^   r_   r®    s   ÿÿür®  c                	   @   sD   e Zd ZdZeddeƒeddƒedddd�edg e	d	d
„ d�gZ
dS )ÚTLSSupplementalDataz!TLS Handshake - Supplemental DatarV   rS   rW   NÚsdatalenZsdatarÇ   c                 C   s   | j S rZ   )r±  r\   r^   r^   r_   r`   (  ra   zTLSSupplementalData.<lambda>rb   )rv   rw   rx   rz   r   r{   r   r¢  r   r©  r|   r^   r^   r^   r_   r°  "  s   
ÿýr°  c                	   @   sd   e Zd ZdZdZeddeƒeddƒeddƒe	d	dd
d�e
d
ddd„ d�gZeddd„ƒZdd„ ZdS )ÚTLSNewSessionTicketzR
    XXX When knowing the right secret, we should be able to read the ticket.
    z"TLS Handshake - New Session TicketrV   rG   rW   NZlifetimeì   ÿÿ Ú	ticketlenÚticketrÇ   rY   c                 C   s   | j S rZ   ©r´  r\   r^   r^   r_   r`   9  ra   zTLSNewSessionTicket.<lambda>rb   c                 O   s(   |  dd ¡}|r$|jr$|jdkr$tS tS )Nrp   r÷   )r˜   r  ÚTLS13NewSessionTicketr²  )rù   rú   rû   rü   rÏ   r^   r^   r_   rý   ;  s    z!TLSNewSessionTicket.dispatch_hookc                 C   s$   |   |¡ | jjdkr | j| j_d S ©Nr  ©ru   rp   r  rµ  rä   rs   r^   r^   r_   r%  B  s    
z6TLSNewSessionTicket.post_dissection_tls_session_update)N)rv   rw   rx   ry   rz   r   r{   r   r	   r   r   r|   r
  rý   r%  r^   r^   r^   r_   r²  /  s   
ÿür²  c                   @   s    e Zd ZdZdZeddeƒeddƒeddƒed	d
ƒe	ddddd�e
dddd„ d�e	dddd�e
dddd„ d�edddd�edddd„ d�g
Zdd„ Zdd„ ZdS )r·  zG
    Uncomment the TicketField line for parsing a RFC 5077 ticket.
    z&TLS 1.3 Handshake - New Session TicketrV   rG   rW   NÚticket_lifetimer³  Úticket_age_addr   Únoncelenr¹   Úticket_noncer»   rY   c                 C   s   | j S rZ   )r¼  r\   r^   r^   r_   r`   T  ra   zTLS13NewSessionTicket.<lambda>rb   r´  rµ  rÇ   c                 C   s   | j S rZ   r¶  r\   r^   r^   r_   r`   X  ra   rÅ   rÆ   c                 C   s   | j | jpd | j pdd S )Nr   rL   )rW   r´  r¼  r\   r^   r^   r_   r`   [  s   ÿþþc                 C   sˆ   |   d¡}|dkrt d¡| _|   d¡}|dkr<t d¡| _|   d¡}|dkrTd| _|   d	¡}|d
kr~t dt d¡¡d
 | _t	 
| ¡S )Nrµ  ra   é0   r½  rá   rº  r³  iÀ¨  r»  r   rd   rG   )r  ÚosÚurandomrµ  r½  rº  rf   r¨   r»  rU   r  r  r^   r^   r_   r  _  s    



zTLS13NewSessionTicket.buildc                 C   s$   |   |¡ | jjdkr | j| j_d S r¸  r¹  rs   r^   r^   r_   r%  x  s    
z8TLS13NewSessionTicket.post_dissection_tls_session_update)rv   rw   rx   ry   rz   r   r{   r   r	   r   r   r"   r#   r|   r  r%  r^   r^   r^   r_   r·  H  s.   
ÿÿÿÿór·  c                   @   s&   e Zd ZdZeddeƒeddƒgZdS )ÚTLS13EndOfEarlyDataz%TLS 1.3 Handshake - End Of Early DatarV   rd  rW   Nrt  r^   r^   r^   r_   rÁ  ‚  s   
ÿrÁ  Zupdate_not_requestedZupdate_requestedc                   @   s@   e Zd ZdZeddeƒeddƒeddeƒgZdd	„ Z	d
d„ Z
dS )ÚTLS13KeyUpdatezTLS 1.3 Handshake - Key UpdaterV   rT   rW   NZrequest_updater   c                 C   s:   | j }tt|jjƒ|j|jd�|_d|_| 	|jd¡ d S )Nr  Tr‰  )
rp   r5   r   r!  r   r  r  r  r  Ú"compute_tls13_next_traffic_secrets©rh   rt   rÏ   r^   r^   r_   r$  •  s    þz,TLS13KeyUpdate.post_build_tls_session_updatec                 C   sZ   | j }tt|jjƒ|j|jd�|_d|_|jdkr@| 	dd¡ n|jdkrV| 	dd¡ d S )Nr  Tr  r  r�  )
rp   r5   r   r"  r   r  r  r  r  rÃ  rÄ  r^   r^   r_   r%  �  s    þ

z1TLS13KeyUpdate.post_dissection_tls_session_update)rv   rw   rx   rz   r   r{   r   Ú_key_update_requestr|   r$  r%  r^   r^   r^   r_   rÂ  �  s   

þrÂ  )r   rD   rE   rF   rG   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   )
rD   rE   rG   rd  rI   rJ   rL   rN   rP   rT   )�ry   Ú
__future__r   rœ  r¿  rf   Zscapy.errorr   r   Zscapy.fieldsr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   Zscapy.compatr   r   r   Zscapy.configr   Z
scapy.libsr   Zscapy.packetr   r   r   Zscapy.utilsr   r   Zscapy.layers.x509r   Zscapy.layers.tls.certr   Zscapy.layers.tls.basefieldsr   r    r!   Zscapy.layers.tls.extensionsr"   r#   r$   r%   r&   r'   r(   r)   r*   r+   Zscapy.layers.tls.keyexchanger,   r-   r.   r/   r0   r1   r2   Zscapy.layers.tls.sessionr3   r4   r5   Z"scapy.layers.tls.keyexchange_tls13r6   Z#scapy.layers.tls.crypto.compressionr7   r8   r9   r:   r;   Zscapy.layers.tls.crypto.suitesr<   r=   r>   r?   Zscapy.layers.tls.crypto.hkdfr@   Zcrypto_validZcryptography.hazmat.backendsrA   Zcryptography.hazmat.primitivesrB   r{   rU   r}   r~   r…   rˆ   r‰   r±   r³   rà   ró   r  rø   r  r  r&  r4  r>  r?  rH  rK  rC  rT  rq  rh  ri  rl  rr  rs  ru  rz  r}  r„  r‡  r•  r¡  r˜  rŸ  r¢  r¥  r£  r¦  r©  r­  r®  r°  r²  r·  rÁ  rÅ  rÂ  Z_tls_handshake_clsZ_tls13_handshake_clsr^   r^   r^   r_   Ú<module>   s  @0	$ø"=b k


ÿ
ýÿòY*M6)^÷#
=3Vÿ	:

ø
ü