
    h~#                       d 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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+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 ddl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z> ddl?m@Z@mAZAmBZB ddlCmDZD ddlEmFZFmGZGmHZHmIZImJZJ ddlKmLZLmMZMmNZNmOZO ddlPmQZQ ejR        rddlSmTZT ddlUmVZV i ddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7iZW G d8 d9e@          ZX G d: d;eX          ZY G d< d=e          ZZ G d> d?e          Z[ G d@ dAe          Z\ G dB dCe          Z] G dD dEe]          Z^ G dF dGeX          Z_ G dH dIeX          Z` G dJ dKeX          Za edLdeW           edMd           e)dNdOe(           e[dPddQ           edRddSdTU           e\dSdVdW X           edYdeL           e^dZdgeFdTd[ \           e,d]dd^_           e-d^dd` X          g
Zb G da dbea          Zc G dc ddeX          Zd G de dfeX          Ze G dg dhe          Zf G di dje          Zg G dk dle          Zh G dm dneX          Zi G do dpe@          Zj G dq dre          Zk G ds dteX          Zl G du dveX          Zmdwdxdydzd{d|d}d~ddd
Zn G d de]          Zo G d de          Zp G d deX          Zq G d deX          Zr G d deX          Zs G d deX          Zt G d de          Zu G d deX          Zv G d de          Zw G d deX          Zx G d deX          ZydddZz G d de          Z{ G d deX          Z| G d de          Z}de$iZ~ G d de          Z G d deX          Z G d de          Z G d de          Z G d de          Z G d deX          Z G d deX          Z G d deX          Z G d deX          ZdddZ G d deX          Zi deYde_deadeyded eed"eid$emd&eqd(esd*etd,evd.exd0e|d2ed4eZe`eceeeeeleretexed
Zd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.
    N)log_runtimewarning)ByteEnumField	ByteFieldFieldFieldLenFieldIntFieldPacketFieldPacketLenFieldPacketListFieldShortEnumField
ShortFieldStrFixedLenFieldStrLenFieldThreeBytesFieldUTCTimeField)	hex_bytesorbraw)conf)PacketRawPadding)
randstringrepr_hex)OCSP_Response)Cert)_tls_version_TLSVersionField_TLSClientVersionField)_ExtensionsLenField_ExtensionsField_cert_status_typeTLS_Ext_PostHandshakeAuth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)hasheshello_request   client_hello   server_hello   hello_verify_request   session_ticket   hello_retry_request   encrypted_extensions   certificate   server_key_exchange   certificate_request   server_hello_done   certificate_verify   client_key_exchange   finished   certificate_url   certificate_status   supplemental_data   
key_updatec                   v    e Zd ZdZdZ edde           edd           eddd 	          gZ	d
 Z
d Z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                     | j         S Nri   pkts    ^/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/layers/tls/handshake.py<lambda>z_TLSHandshake.<lambda>e       sz     length_fromc                     t          |          }| j        >|dz
  }t          j        dt	          |d                   dz  |z            |dd          z   }||z   S )NrJ   !Ir   rd   )lenri   structpackr   )selfppaytmp_lenl2s        rq   
post_buildz_TLSHandshake.post_buildg   sX    a&&;1BD3qt99?b"899AabbEAA3wrt   c                     t           j        S rm   )r   padding_layerr|   r}   s     rq   guess_payload_classz!_TLSHandshake.guess_payload_classn   s    !!rt   c                     | j         j        r!| j         j                            |           dS | j         j                            |           | j         j                            |            dS )zO
        Covers both post_build- and post_dissection- context updates.
        N)tls_sessionpost_handshakepost_handshake_messagesappendhandshake_messageshandshake_messages_parsedr|   msg_strs     rq   tls_session_updatez _TLSHandshake.tls_session_updateq   sm     * 	D4;;GDDDDD/66w???6==dCCCCCrt   )__name__
__module____qualname____doc__namer   _tls_handshake_typer   r   fields_descr   r   r    rt   rq   rg   rg   \   s          +D =D2EFF"?8T22;ub+A+AC C CDK
  " " "D D D D Drt   rg   c                   J    e Zd ZdZ edde           edd          gZd ZdS )TLSHelloRequestzTLS Handshake - Hello Requestrh   r   ri   Nc                     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   r   s     rq   r   z"TLSHelloRequest.tls_session_update   s	    
 	rt   )	r   r   r   r   r   r   r   r   r   r   rt   rq   r   r      sP        *D =A/BCC"?8T224K    rt   r   c                       e Zd ZdZd Z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                     ||S dS Nr   r   r|   rp   xs      rq   i2hz_GMTUnixTimeField.i2h   s    =Hqrt   c                 (    |t          |          ndS r   )intr   s      rq   i2mz_GMTUnixTimeField.i2m   s    s1vvvA-rt   N)r   r   r   r   r   r   r   rt   rq   r   r      s<         
  
. . . . .rt   r   c                       e Zd Zd ZdS )_TLSRandomBytesFieldc                 j    |t          |          S t          |                     ||                    S rm   )reprr   r   r   s      rq   i2reprz_TLSRandomBytesField.i2repr   s.    977Na(()))rt   N)r   r   r   r   r   rt   rq   r   r      s#        * * * * *rt   r   c                       e Zd ZdZdS )_SessionIDFieldz>
    opaque SessionID<0..32>; section 7.4.1.2 of RFC 4346
    N)r   r   r   r   r   rt   rq   r   r      s          	Drt   r   c                   L    e Zd Zg dZdZddZd Zd Zd Zd	 Z	d
 Z
d Zd ZdS )_CipherSuitesField)itemfmtitemsizei2ss2irD   N!Hc                     t          j        | |||           || _        t          j        |          | _        i x}| _        i x}| _        |                                D ]}||         ||<   ||||         <   d S )Nru   )	r   __init__r   rz   calcsizer   r   r   keys)	r|   r   defaultdicorv   r   r   r   ks	            rq   r   z_CipherSuitesField.__init__   s    T4kJJJJ00dhdh 	 	A!WCFCQLL	 	rt   c                     t          |t          t          f          r|j        }t          |t                    r| j        |         }|S rm   )
isinstancer>   r?   valbytesr   r   s      rq   	any2i_onez_CipherSuitesField.any2i_one   sD    a-/KLMM 	Aa 	Art   c                 R    d| j         z  }| j                            |||z            S )Nz0x%%0%dx)r   r   get)r|   rp   r   fmts       rq   
i2repr_onez_CipherSuitesField.i2repr_one   s(    4=(x||AsQw'''rt   c                 \     |d S t          |t                    s|g} fd|D             S )Nc                 <    g | ]}                     |          S r   )r   .0zrp   r|   s     rq   
<listcomp>z,_CipherSuitesField.any2i.<locals>.<listcomp>   s'    2221sA&&222rt   )r   listr   s   `` rq   any2iz_CipherSuitesField.any2i   sD    94!T"" 	A222222222rt   c                      |dS  fd|D             }t          |          dk    r	|d         }ndd                    |          z  }|S )NNonec                 <    g | ]}                     |          S r   )r   r   s     rq   r   z-_CipherSuitesField.i2repr.<locals>.<listcomp>   s'    666q4??3**666rt   rD   r   z[%s]z, )ry   join)r|   rp   r   r   s   ``  rq   r   z_CipherSuitesField.i2repr   sa    9666666A666w<<1ajGGtyy111Grt   c                 N     |g }d                      fd|D                       S )Nrt   c              3   L   K   | ]}t          j        j        |          V  d S rm   )rz   r{   r   )r   r   r|   s     rq   	<genexpr>z)_CipherSuitesField.i2m.<locals>.<genexpr>   s1      BBDL!44BBBBBBrt   )r   r|   rp   r   s   `  rq   r   z_CipherSuitesField.i2m   s4    ;CxxBBBBcBBBBBBrt   c                     g }t          j        | j                  }|rG|                    t          j        | j        |d |                   d                    ||d          }|G|S r   )rz   r   r   r   unpack)r|   rp   mresitemlens        rq   m2iz_CipherSuitesField.m2i   sk    /$,// 	JJv}T\1XgX;??BCCC'((A  	 
rt   c                 8    |dS t          |          | j        z  S r   )ry   r   r|   rp   is      rq   i2lenz_CipherSuitesField.i2len   s    911vv%%rt   )Nr   )r   r   r   	__slots__islistr   r   r   r   r   r   r   r   r   rt   rq   r   r      s        555IF     ( ( (3 3 3  C C C
  & & & & &rt   r   c                       e Zd Zd ZdS )_CompressionMethodsFieldc                     t          |t          t          f          r|j        }t          |t                    r| j        |         }|S rm   )r   r:   r;   r   strr   r   s      rq   r   z"_CompressionMethodsField.any2i_one   sC    a,(=>?? 	Aa 	Art   N)r   r   r   r   r   rt   rq   r   r      s#            rt   r   c                       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           eddd            edddd           eddedd            edddd           eddgedd            eddd           eddd           gZ fdZ fd Z x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 Hellorh   rD   ri   Nversiongmt_unix_timerandom_bytes   sidlenBsidr   	length_ofrk   c                     | j         S rm   r   ro   s    rq   rr   zTLSClientHello.<lambda>      3: rt   ru   
cipherslenr   ciphersc                     | j         S rm   r   ro   s    rq   rr   zTLSClientHello.<lambda>      cn rt   r   rv   complencompr   c                     | j         S rm   r   ro   s    rq   rr   zTLSClientHello.<lambda>      CK rt   extlenextr   c                 R    | j         | j        pdz
  | j        pdz
  | j        pdz
  dz
  S Nr   (   ri   r   r   r   ro   s    rq   rr   zTLSClientHello.<lambda>"  G    SZ>AjoA>O>An>QPQ>S ?Bk>NQ>P >@	>@ rt   c                 l   | j         %|d d         t          d          z   |dd          z   }| j        Xd| j        pdz   }d}|d |         t	          |          z   ||dz   d          z   }| j        d}d	}d
}d}d}	|||z   |z   |z   |	z   z  }t          t          |                               ||          S )N
   r   &   '   r   s8   001ac02bc023c02fc027009e0067009c003cc009c0130033002f000arF   s    ,s     s         
secdev.orgs      s    
   )	r   r   r   r   r   r   superr   r   )r|   r}   r~   cipherstartsext_len	ext_renegext_sn
ext_sigalgext_supgroups	__class__s             rq   r   zTLSClientHello.post_build(  s    $#2#B'!GHH+5A < 0q1KKA,;,)A,,.;?3C3C1DDAx%3	FN
 AWy(61J>NN^T**55a===rt   c                 b   t          t          |                               |           | j        }| j        |_        | j        r| j        dk    r| j        |_        |dd         | _        t          j
        d| j                  | j        z   |_        | j        r| j        D ]}t          |t                    r9t!          |j        d          D ]}|t$          v r	||_         n|j        rd|_        t          |t(                    r|j        |_        t          |t.                    rd|_        dS dS )
        Either for parsing or building, we store the client_random
        along with the raw string representing this handshake message.
        r   r  r  rx   TreverseN)r  r   r   r   r   advertised_tls_versionr   r   r   rz   r{   r   client_randomr   r   r%   sortedversionsr   middlebox_compatibilityr&   sig_algsadvertised_sig_algsr$   post_handshake_authr|   r   r
  everr  s        rq   r   z!TLSClientHello.tls_session_update<  sS   
 	nd##66w???#'<  ; 	4;??HAE#BrEN!;tT-?@@,- 8 	1X 1 1a!<== 9%aj$??? " " ,..7:A4!E / u 9481a!<== 7,-JA)a!:;; 1,0A)	1 	11 1rt   )r   r   r   r   r   r   r   r   r    r   r   r   r   r   r   r<   r   r7   r!   r"   r   r   r   __classcell__r  s   @rq   r   r      s         *D =A/BCC"?8T22)))T<HH %$_d;;''bAA =4SEJJJ"?5"/E/EG G G !=t+46 6 6%%i&8$2L2LN N N !=DcVLLL++FQC,A478O8OQ Q Q
 '&xGGG##E41A 1AB B B3CK@> > > > >(!1 !1 !1 !1 !1 !1 !1 !1 !1rt   r   c                   v    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           eddd            edddd           eddedd            edddd           eddgedd            eddd           eddd           gZd Z fdZ x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 Hellorh   rD   ri   Nr   r       r   r   r   r   rk   c                     | j         S rm   r   ro   s    rq   rr   zTLS13ClientHello.<lambda>o  r   rt   ru   r   r   r   c                     | j         S rm   r   ro   s    rq   rr   zTLS13ClientHello.<lambda>u  r   rt   r   r   r   r   c                     | j         S rm   r   ro   s    rq   rr   zTLS13ClientHello.<lambda>{  r   rt   r   r   r   c                 R    | j         | j        pdz
  | j        pdz
  | j        pdz
  dz
  S r   r  ro   s    rq   rr   zTLS13ClientHello.<lambda>  r  rt   c                 T   | j         %|d d         t          d          z   |dd          z   }t          |          }| j        >|dz
  }t	          j        dt          |d                   dz  |z            |dd          z   }| j        }| j        r| j        D ]}t          |t                    r|j        rb|j        }t          |         }t          |j        j                                                  }	|	j        j        }
|                    d	           n1t          d
          }	|	j        j        }
|                    d	           d}|j        r|j        D ]}||z  }||d |
 dz
           z  }|j        d         }|	                    ||          }|d |
          |z   }||z   S )NrL   r$  r  rJ   rx   r   rd   F)externalsha256Trt   rH   
binder_key)r   r   ry   ri   rz   r{   r   r   r   r   r6   client_session_tickettls13_ticket_ciphersuiter=   r@   hash_algr   lowerhashdigest_sizecompute_tls13_early_secretstls13_retryr   tls13_derived_secretscompute_verify_data)r|   r}   r~   r   szr
  r  	res_suitecs_clshkdfhash_lenhandshake_contextr   r,  
psk_binders                  rq   r   zTLS13ClientHello.post_build  s   $"1"
2&6773A a&&;1BD3qt99?b"899AabbEAA8 1	3X 03 03a!899 /3. E %&$>	!7	!B)&/*>*D*D*F*FGG#'9#855u5EEEE  *(33#'9#855t5DDD ),%} 3!"!5 3 3A-2--%>XIM>)::%!"!8!FJ!%!9!9*:K"M "MJ *H9*
2A3wrt   c                    t          t          |                               |           | j        }| j        r| j        dk    r| j        |_        d|_        |dd         | _        | j        |_        | j	        r| j	        D ]}t          |t                    r+t          |j        d          D ]}|t          v r	||_         nt          |t                     r|j        |_        t          |t&                    rd|_        dS dS )r  r   TrL   r  r  N)r  r#  r   r   r   r   r  r   r  r   r   r%   r  r  r   r  r&   r  r  r$   r  r  s        rq   r   z#TLS13ClientHello.tls_session_update  s%   
 	%%88AAA; 	-4;??HAE(,A%#AbDM+8 	1X 1 1a!<== "%aj$??? " " ,..7:A4!E / a!<== 7,-JA)a!:;; 1,0A)	1 	11 1rt   )r   r   r   r   r   r   r   r   r    r   r   r   r   r   r<   r   r7   r!   r"   r   r   r   r   r!  s   @rq   r#  r#  `  s        
 .D =A/BCC"?8T22)))T<HH''bAA =4SEJJJ"?5"/E/EG G G !=t+46 6 6%%i&8$2L2LN N N !=DcVLLL++FQC,A478O8OQ Q Q
 '&xGGG##E41A 1AB B B/CK<> > >@1 1 1 1 1 1 1 1 1rt   r#  c                   r    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           eddd            edde           eddgedd            eddd           eddd           gZedd            Z fdZ fdZ fdZ x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 Hellorh   rF   ri   Nr   r   r   r   r   r   r   r   r   rk   c                     | j         S rm   r   ro   s    rq   rr   zTLSServerHello.<lambda>  r   rt   ru   cipherr   r   c                     dS NrD   r   ro   s    rq   rr   zTLSServerHello.<lambda>  s    A rt   r   r   r   r   c                 *    | j         | j        pdz
  dz
  S r   )ri   r   ro   s    rq   rr   zTLSServerHello.<lambda>  s    (+
cjoA(F(K rt   c                     |rIt          |          dk    r6t          j        d|dd                   d         }|dk    s|dk    rt          S t          S )NrL   r   rJ   r     i   )ry   rz   r   TLS13ServerHellor@  )cls_pktargskargsr   s        rq   dispatch_hookzTLSServerHello.dispatch_hook
  sW     	(CIINNmD$qs)44Q7G&  Gf$4$4''rt   c                     |                      d          dk    r| j        r| j        j        | _         t          t          |           j        |i |S )Nr   rt   )getfieldvalr   r   r  r@  build)r|   rL  rM  r  s      rq   rQ  zTLSServerHello.build  sS    E""c))d.>)'+DH0u^T**0$@%@@@rt   c                     | j         %|d d         t          d          z   |dd          z   }t          t          |                               ||          S )Nr  r   r  )r   r   r  r@  r   r|   r}   r~   r  s      rq   r   zTLSServerHello.post_build  sQ    $#2#B'!GHH+5A^T**55a===rt   c                 \   t          t          |                               |           | j        }| j        |_        t          | d          r7|dd         | _        t          j	        d| j
                  | j        z   |_        n| j        |_        | j        |_        | j        rL| j        D ]D}t          |t                    rd| j        _        t          |t"                    rd| j        _        Ed}| j        r.| j        }|t(          vrt+          d|           nt(          |         }t,          }| j        r7| j        d         }|t0          vrd	}t+          ||           d}t0          |         }|j        }	t5          |||	| j        
          |_        t9          |||	| 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 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  rx   TN(Unknown cipher suite %d from ServerHellor   z+Unknown compression alg %d from ServerHello)ciphersuitecompression_algconnection_endtls_version)r  r@  r   r   r   rY  hasattrr   rz   r{   r   server_randomr   r   r   r*   extmsr+   encrypt_then_macrC  r=   r   r9   r   r8   rX  r5   pwcsr4   prcs)r|   r   r
  r  r9  cs_valcomp_clscomp_valerrrX  r  s             rq   r   z!TLSServerHello.tls_session_update  s    	nd##66w???4)) 	0 '2D%{41CDD#0 1AOO #/AO8 	=X = =a!=>> 2-1D$*a!788 =8<D$5; 	8[F333BFKKKK 079 	;y|H888CX&&&0:H)F08/=,0L: : : 6/7.<+/<9 9 9rt   rm   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r<   r   r7   r!   r"   r   classmethodrN  rQ  r   r   r   r!  s   @rq   r@  r@    s         *D =A/BCC"?8T22##It\BB %$_d;;''bAA =45cJJJ"?5"/E/EG G G ">(D2DEE++FQC,A478EG G G
 '&xGGG##E41& 1&' ' ''(K0    [A A A A A
> > > > >
79 79 79 79 79 79 79 79 79rt   r@  rh   ri   r     r   r$  r   r   r   rA  rk   c                     | j         S rm   r   ro   s    rq   rr   rr   ]  s    CJ rt   ru   rC  r   c                     dS rE  r   ro   s    rq   rr   rr   b  s    Q rt   r   r   r   r   c                     | j         dz
  S )Nr  rn   ro   s    rq   rr   rr   e  s    cj.0/1 rt   c                   H     e Zd ZdZdZeZedd            Z fdZ	d Z
 xZS )rI  z TLS 1.3 ServerHello z TLS 1.3 Handshake - Server HelloNc                 r    |r/t          |          dk    r|dd         }|t          k    rt          S t          S )Nr  rL   )ry   r)   TLS13HelloRetryRequestrI  )rJ  rK  rL  rM  r   s        rq   rN  zTLS13ServerHello.dispatch_hookq  s?     	.CIIOO  ":L555--rt   c                     | j         %|d d         t          d          z   |dd          z   }t          t          |                               ||          S )NrL   r$  r  )r   r   r  rI  r   rS  s      rq   r   zTLS13ServerHello.post_build{  sR    $"1"
2&6773A%t,,773???rt   c                    | j         }| j        |_        | j        |_        | j        |_        | j        r-| j        D ]%}t          |t                    r|j        |_         n&|j        dk     rt                              | |          S t                              | |           d}| j        r.| j        }|t          vrt          d|           nt          |         }|j        }|dk    r+t!          |||j                  |_        |j        sd|_        n0|dk    r*t)          |||j                  |_        |j        sd|_        |j        |                                 |                                 |dk    r)|j        d         }|j                            |           dS |dk    r)|j        d         }|j                            |           dS 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.
        rH  NrU  serverrV  rX  rY  Tclientserver_handshake_traffic_secret)r   r   r[  rC  rV  r   rY  r   r   r'   r@  r   rg   r=   r   rX  r5   r^  r  triggered_pwcs_commitr4   r_  triggered_prcs_committls13_early_secretr3  compute_tls13_handshake_secretsr5  tls13_derive_keys)r|   r   r
  r  r9  r`  rX  shtss           rq   r   z#TLS13ServerHello.tls_session_update  s    +8 	X  a!<== $%IAME =5   "44T7CCC,,T7;;;; 	8[F333BFKKKK 07)X%%#3A01? ? ?AF , /*.'x''"v2@/0}> > >AF , /*.'' ))+++	))+++X%%*+LMDF$$T*****x''*+LMDF$$T***** ('rt   rm   )r   r   r   r   r   _tls_13_server_hello_fieldsr   rd  rN  r   r   r   r!  s   @rq   rI  rI  j  s|        -D-K       [ @ @ @ @ @
;+ ;+ ;+ ;+ ;+ ;+ ;+rt   rI  c                   ,     e Zd ZdZeZd Z fdZ xZS )rk  z'TLS 1.3 Handshake - Hello Retry Requestc                     |                      d          }|t          | _        |                      d          dk    r| j        r| j        j        | _        t
                              |           S )Nr   r   rt   )rP  r)   r   r   r   rg   rQ  r|   fvals     rq   rQ  zTLS13HelloRetryRequest.build  sd    //< 6DE""c))d.>)'+DH""4(((rt   c                 @   | j         }d|_        i |_        |j        rJt          |j                 }t          |j        j        	                                          }|j
        j        }nIt          | j                 }t          |j        j        	                                          }|j
        j        }t          j        dd          }|t          j        dd          z  }|t          j        dd          z  }|t          j        d|          z  }t          j        |j
        t#                                }|                    |j        d                    ||                                z  }||j        d<   t+          t,          |                               |           d S )NTr      r   )backend)r   r4  tls13_client_pubsharesr-  r=   r.  r@   r/  r   r0  r1  r2  rC  rz   r{   rB   HashrA   updater   finalizer  rk  r   )	r|   r   r
  r9  r:  r;  r<  digestr  s	           rq   r   z)TLS13HelloRetryRequest.tls_session_update  sf   #%  " 	-+A,FGFfo288::;;Dy,HH+DK8Ffo288::;;Dy,H"KS11V[a000V[a000V[h777TY0A0ABBBa*1-...V__..."3Q$d++>>wGGGGGrt   )	r   r   r   r   rx  r   rQ  r   r   r!  s   @rq   rk  rk    sZ        4D-K) ) )H H H H H H H H Hrt   rk  c                       e Zd ZdZ edde           edd           eddd           eddd	 
          gZ	d Z
d ZdS )TLSEncryptedExtensionsz(TLS 1.3 Handshake - Encrypted Extensionsrh   rN   ri   Nr   r   r   c                     | j         dz
  S NrF   rn   ro   s    rq   rr   zTLSEncryptedExtensions.<lambda>  s    CJN rt   ru   c                    |                      |           | j        }|j        }d}| j        r!| j        D ]}t	          |t
                    rd}|dk    r|st          t          |j        j	                  ||j
                  |_        |j        d         }|j                            |           |j        s| j        j        |_        d|_        d S d|_        d S d S d S )NFTrn  ro  client_handshake_traffic_secret)r   r   rX  r   r   r(   r4   typewcsrV  rY  r_  r5  rv  r  rcsrs  r|   r   r
  rX  early_data_acceptedr  chtss          rq   post_build_tls_session_updatez4TLSEncryptedExtensions.post_build_tls_session_update  s   ((()
 $8 	/X / /a!<== /*.'
 X%%& 3&48I3J3J6D34=B B B ./PQ((...0 3 ,1AE.3A+++.2A+++ &%3 3rt   c                    |                      |           | j        }|j        }d}| j        r!| j        D ]}t	          |t
                    rd}|dk    r|st          t          |j        j	                  ||j
                  |_        |j        d         }|j                            |           |j        s| j        j        |_        d|_        d S d|_        d S d S d S )NFTrp  ro  r  )r   r   rX  r   r   r(   r5   r  r  rV  rY  r^  r5  rv  r  r  rr  r  s          rq   "post_dissection_tls_session_updatez9TLSEncryptedExtensions.post_dissection_tls_session_update  s   ((()
 $8 	/X / /a!<== /*.'
 X%%& 
3'D9J4K4K7E45MC C C ./PQ((...0 3 ,1AE.3A+++.2A+++ &%
3 
3rt   )r   r   r   r   r   r   r   r!   r"   r   r  r  r   rt   rq   r  r    s        5D =A/BCC"?8T22&&xGGG##E40J0JL L LMK3 3 3B3 3 3 3 3rt   r  c                   2    e Zd ZdZdd fdZd Zd Zd ZdS )_ASN1CertLenFieldz0
    This is mostly a 3-byte FieldLenField.
    Nc                     |S rm   r   rp   r   s     rq   rr   z_ASN1CertLenField.<lambda>A      A rt   c                 R    || _         || _        t          j        | ||d           d S )Nrx   )r   )r   adjustr   r   r|   r   r   r   r  s        rq   r   z_ASN1CertLenField.__init__A  s/    "tT7555555rt   c                     |P| j         I|                    | j                   \  }}|                    ||          }|                     ||          }|S rm   )r   getfield_and_valr   r  )r|   rp   r   fldr|  fs         rq   r   z_ASN1CertLenField.i2mF  sS    9~)00@@	TIIc4((KKQ''rt   c                 t    |t          j        | j        |                     ||                    dd         z   S NrD   rJ   rz   r{   r   r   r|   rp   r
  r   s       rq   addfieldz_ASN1CertLenField.addfieldN  2    6;tx#s););<<QqSAAArt   c                     |dd          |                      |t          j        | j        d|d d         z             d                   fS NrH       r   r   rz   r   r   r|   rp   r
  s      rq   getfieldz_ASN1CertLenField.getfieldQ  B    udhhsFM$(GaeO$L$LQ$OPPPPrt   )r   r   r   r   r   r   r  r  r   rt   rq   r  r  =  sr          15=M=M 6 6 6 6
  B B BQ Q Q Q Qrt   r  c                   *    e Zd ZdZd Zd Zd Zd ZdS )_ASN1CertListFieldrD   c                 P    |dS t          |                     ||                    S r   ry   r   r   s      rq   r   z_ASN1CertListField.i2lenX  (    91488C##$$$rt   c           	      P   d}| j         |                      |          }g }d}|}||d|         ||d         }}|rdt          j        dd|dd         z             d         }|                    |t	          |dd|z                      f           |d|z   d         }|d||z   |fS )zp
        Extract Certs in a loop.
        XXX We should provide safeguards when trying to parse a Cert.
        Nrt   rx   r  rH   r   )rv   rz   r   r   r   )r|   rp   r
  r   lstretr   c_lens           rq   r  z_ASN1CertListField.getfield]  s    
 '&&s++Gxx[!GHH+sA 	M$!BQB%88;EJJtAaE	kN334555!e)**A  	 3w|rt   c                     d |dS t          |t                    r|S t          |t                    r|g}d                    fd|D                       S )Nc                 H   t          | t                    r| S t          | t                    r6| j        }t	          j        dt          |                    dd         }||z   S | \  }}t          |t                    r|j        }t	          j        d|          dd         |z   S Nrx   rD   rJ   r   r   r   derrz   r{   ry   r   r
  r   s      rq   i2m_onez'_ASN1CertListField.i2m.<locals>.i2m_oner      !S!! !T"" #E +dCFF33AaC8{"LWa!T"" E;tW--ac2Q66rt   rt   c              3   .   K   | ]} |          V  d S rm   r   )r   r   r  s     rq   r   z)_ASN1CertListField.i2m.<locals>.<genexpr>  s+      ..q

......rt   )r   r   r   r   r|   rp   r   r  s      @rq   r   z_ASN1CertListField.i2mq  su    	7 	7 	7 93a 	Ha 	Axx....A......rt   c                     |S rm   r   r   s      rq   r   z_ASN1CertListField.any2i      rt   N)r   r   r   r   r   r  r   r   r   rt   rq   r  r  U  sU        F% % %
  (/ / /,    rt   r  c                   &    e Zd Zd Zd Zd Zd ZdS )_ASN1CertFieldc                 P    |dS t          |                     ||                    S r   r  r   s      rq   r   z_ASN1CertField.i2len  r  rt   c                    d }| j         |                      |          }d}|}||d |         ||d          }}t          j        dd|d d         z             d         }|t          |dd|z                      f}|d|z   d          }||z   |fS )Nrt   rx   r  rH   r   )rv   rz   r   r   )r|   rp   r
  r   r  r   r  len_certs           rq   r  z_ASN1CertField.getfield  s    '&&s++Gxx[!GHH+sAdGaeO44Q74!AI+//0a%ijjM3w  rt   c                 &    d }|dS  ||          S )Nc                 H   t          | t                    r| S t          | t                    r6| j        }t	          j        dt          |                    dd         }||z   S | \  }}t          |t                    r|j        }t	          j        d|          dd         |z   S r  r  r  s      rq   r  z#_ASN1CertField.i2m.<locals>.i2m_one  r  rt   rt   r   r  s       rq   r   z_ASN1CertField.i2m  s+    	7 	7 	7 93wqzzrt   c                     |S rm   r   r   s      rq   r   z_ASN1CertField.any2i  r  rt   N)r   r   r   r   r  r   r   r   rt   rq   r  r    sP        % % %
! ! !  $    rt   r  c                       e Zd ZdZdZ edde           edd           eddd	           e	dg d
           gZ
edd            Zd ZdS )TLSCertificatezD
    XXX We do not support RFC 5081, i.e. OpenPGP certificates.
    zTLS Handshake - Certificaterh   rP   ri   Ncertslencertsr   c                     | j         S rm   r  ro   s    rq   rr   zTLSCertificate.<lambda>  s    cl rt   ru   c                 l    |r,|                     dd           }|r|j        pddk    rt          S t          S )Nr   r   rH  )r   rY  TLS13Certificater  )rJ  rK  rL  rM  r   s        rq   rN  zTLSCertificate.dispatch_hook  sC     	())M488K ( 7 <1GG''rt   c                     |                      |           | j        j        }|dk    rd | j        D             | j        _        d S d | j        D             | j        _        d S )Nrp  c                     g | ]
}|d          S rD   r   r   r   s     rq   r   zETLSCertificate.post_dissection_tls_session_update.<locals>.<listcomp>      ,F,F,FaQqT,F,F,Frt   c                     g | ]
}|d          S r  r   r  s     rq   r   zETLSCertificate.post_dissection_tls_session_update.<locals>.<listcomp>  r  rt   r   r   rX  r  server_certsclient_certs)r|   r   rX  s      rq   r  z1TLSCertificate.post_dissection_tls_session_update  sn    ((()8X%%,F,F4:,F,F,FD))),F,F4:,F,F,FD)))rt   rm   )r   r   r   r   r   r   r   r   r  r  r   rd  rN  r  r   rt   rq   r  r    s          )D =B0CDD"?8T22$$ZIII%%gr2J2JL L LMK    [G G G G Grt   r  c                   h    e Zd ZdZ edd           eddd           edg d 	          gZd
 ZdS )_ASN1CertAndExtzCertificate and Extensionscertrk   r   Nr   r   c                     | j         S rm   )r   ro   s    rq   rr   z_ASN1CertAndExt.<lambda>  s    CJ rt   ru   c                 
    d|fS )Nrt   r   )r|   r
  s     rq   extract_paddingz_ASN1CertAndExt.extract_padding  s    Avrt   )	r   r   r   r   r  r   r"   r   r  r   rt   rq   r  r    su        'D!>&"-- =45AAA##E20F0FH H HIK
    rt   r  c                       e Zd Zd ZdS )_ASN1CertAndExtListFieldc                 :    |                      ||j                  S )Nr   )rJ  r   )r|   rp   r   s      rq   r   z_ASN1CertAndExtListField.m2i  s    xxsx777rt   Nr   r   r   r   r   rt   rq   r  r    s#        8 8 8 8 8rt   r  c                       e Zd ZdZ edde           edd           edddd	           edd
d            e	ddd           e
dg ed           gZd ZdS )r  zTLS 1.3 Handshake - Certificaterh   rP   ri   Ncert_req_ctxt_lenr   cert_req_ctxtr   rk   c                     | j         S rm   r  ro   s    rq   rr   zTLS13Certificate.<lambda>  	    s7L rt   ru   r  r  r   c                     | j         S rm   r  ro   s    rq   rr   zTLS13Certificate.<lambda>  s    CL rt   c                     |                      |           | j        j        }|dk    r(| j        rd | j        D             }|| j        _        d S d S | j        rd | j        D             }|| j        _        d S d S )Nrp  c                 H    g | ]}t          |d           |j        d          S r  rD   rZ  r  r  s     rq   r   zGTLS13Certificate.post_dissection_tls_session_update.<locals>.<listcomp>  -    JJJAwq&7I7IJafQiJJJrt   c                 H    g | ]}t          |d           |j        d          S r  r  r  s     rq   r   zGTLS13Certificate.post_dissection_tls_session_update.<locals>.<listcomp>  r  rt   r  )r|   r   rX  scccs        rq   r  z3TLS13Certificate.post_dissection_tls_session_update  s    ((()8X%%z 3JJJJJ02 ---3 3 z 3JJJJJ02 ---3 3rt   )r   r   r   r   r   r   r   r   r   r  r  r  r   r  r   rt   rq   r  r    s        ,D =B0CDD"?8T22 =!4d+:< < <;+L+LN N N$$ZIII++GR8P8PR R RSK
3 
3 
3 
3 
3rt   r  c                       e Zd ZdZ edde           edd           eddd            ed	dd
           gZ	d Z
d ZdS )TLSServerKeyExchangez#TLS Handshake - Server Key Exchangerh   rR   ri   Nparamsc                     | j         S rm   rn   ro   s    rq   rr   zTLSServerKeyExchange.<lambda>  s     rt   ru   sigc                 :    | j         t          | j                  z
  S rm   )ri   ry   r  ro   s    rq   rr   zTLSServerKeyExchange.<lambda>  s    cj3sz??>Z rt   c                    |                      d          }|| j        }|j        r|j        j        j        rt          |          }n+|j        j                            d          } ||          }	 |                                 n+# t          $ r t          j
        r Y nw xY wt                      }|| _        |                      d          }|| j        }|j        r}|j        rv|j        j        j        sV| j        }|d}|j        |j        z   t!          |          z   }t#          |          }|                    ||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.
        r  Nr     r  rt   )rP  r   r^  key_exchangeexportr/   server_kx_msg_clsfill_missing	Exceptionr   debug_dissectorr   r  r  	anonymousr[  r   r,   _update_sig
server_keyr  rg   rQ  )r|   rL  rM  r|  r
  rJ  r}   r   s           rq   rQ  zTLSServerKeyExchange.build  s   , ))< Av 6&- -)a888CC&-??HHC#!,,,C$$&&&&    +   eeDK&&< Av !/ v*4  Ay!/9CFFBA'A666COOAq|4444%%CCeeDH"48$888%888s   4B	 	B#"B#c                 n   | j         }|j        rL|j        j        j        r;|                                                                }t          j        d|           |j        r|j        j        j        s|j	        r|j
        r|j        rt          |j                  dk    r|j	        |j
        z   t          | j                  z   }| j                            ||j        d                   }|sI|                                                                }t          j        d|           dS dS dS dS dS dS dS 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)r   r_  r  no_ske
firstlayersummaryr   infor  r  r[  r  ry   r   r  r  _verify_sig)r|   rp   r
  pkt_infor   sig_tests         rq   post_dissectionz$TLSServerKeyExchange.post_dissectionA  sv    6 	Naf)0 	N~~''//11HBHMMMF 	\#-	\O	\ !	\ 	\ $'q~#6#6#:#:!/1C4D4DDAx++Aq~a/@AAH \>>++3355 !PRZ[[[[[	\ 	\ 	\ 	\ 	\ 	\ 	\ 	\ 	\ 	\ $;#:\ \rt   )r   r   r   r   r   r   r   r-   r.   r   rQ  r  r   rt   rq   r  r    s        0D =B0CDD"?8T22((45K5KM M M%%eT2Z2Z\ \ \	]K99 99 99v\ \ \ \ \rt   r  rsa_signdss_signrsa_fixed_dhdss_fixed_dhrsa_ephemeral_dh_RESERVEDdss_ephemeral_dh_RESERVEDfortezza_dms_RESERVED
ecdsa_signrsa_fixed_ecdhecdsa_fixed_ecdh)
rD   rF   rH   rJ      rL   r\   @   A   B   c                       e Zd ZdS )_CertTypesFieldN)r   r   r   r   rt   rq   r  r  g  s        Drt   r  c                   4    e Zd ZdZdZd Zd Zd Zd Zd Z	dS )	_CertAuthoritiesFieldz4
    XXX Rework this with proper ASN.1 parsing.
    rD   c                 |    |                      |          }||d          |                     ||d |                   fS rm   )rv   r   )r|   rp   r
  r   s       rq   r  z_CertAuthoritiesField.getfieldq  s>    ""3''{DHHS!HWH+6666rt   c                 j   g }t          |          dk    rt          j        d|d d                   d         }t          |          |dz   k     r |                    ||dd          f           nD|dd|z            }|                    ||f           |d|z   d          }t          |          dk    |S )NrD   r   rF   r   )ry   rz   r   r   )r|   rp   r   r   r   dns         rq   r   z_CertAuthoritiesField.m2iu  s    !ffqjjmD!BQB%003G1vv!##

GQqrrU+,,,1Q[=!BJJ}%%%!g+,,A !ffqjj 
rt   c                 J    d                     t          d |                    S )Nrt   c                 J    t          j        d| d                   | d         z   S )Nr   r   rD   )rz   r{   )x_ys    rq   rr   z+_CertAuthoritiesField.i2m.<locals>.<lambda>  s    D#a&(A(ACF(J rt   )r   mapr   s      rq   r   z_CertAuthoritiesField.i2m  s"    xxJJANNOOOrt   c                 4    ||                      ||          z   S rm   )r   r  s       rq   r  z_CertAuthoritiesField.addfield  s    488C%%%%rt   c                 P    |dS t          |                     ||                    S r   r  r   s      rq   r   z_CertAuthoritiesField.i2len  s(    ;1txxS))***rt   N)
r   r   r   r   r   r  r   r   r  r   r   rt   rq   r   r   k  ss          F7 7 7
 
 
P P P& & &+ + + + +rt   r   c                      e Zd ZdZ edde           edd           edddd	           edd
dge	dd            e
ddd           edg d edde          d            edddd	           edg d           gZdS )TLSCertificateRequestz#TLS Handshake - Certificate Requestrh   rT   ri   N	ctypeslenr   ctypesr   rD   r  z!Bc                     | j         S rm   )r,  ro   s    rq   rr   zTLSCertificateRequest.<lambda>  s    3= rt   r   sig_algs_lenr  r   )i  i  i  hash_sigc                     | j         S rm   )r/  ro   s    rq   rr   zTLSCertificateRequest.<lambda>  s	    s?O rt   ru   certauthlenr   certauthc                     | j         S rm   )r2  ro   s    rq   rr   zTLSCertificateRequest.<lambda>  s     rt   )r   r   r   r   r   r   r   r   r  _tls_client_certificate_typesr2   r0   r   r1   r   r   r   rt   rq   r+  r+    s        0D =B0CDD"?8T22 =d+35 5 5"?8aW#@+//H/HJ J J *).$4>@ @ @&&z3K3K3K'5~j$'V'V3O3OQ Q Q !=$+57 7 7((R5P5PR R RSKKKrt   r+  c            
            e Zd ZdZ edde           edd           edddd	           edd
d            e	ddd           e
ddd           gZ fdZ xZS )TLS13CertificateRequestz'TLS 1.3 Handshake - Certificate Requestrh   rT   ri   Nr  r   r  r   rk   c                     | j         S rm   r  ro   s    rq   rr   z TLS13CertificateRequest.<lambda>  r  rt   ru   r   r   r   c                 &    | j         | j        z
  dz
  S )NrH   )ri   r  ro   s    rq   rr   z TLS13CertificateRequest.<lambda>  s    CJ$'$9=:<==> rt   c                 z    t          t          |                               |           | j        | j        _        d S rm   )r  r7  r   r  r   tls13_cert_req_ctxt)r|   r   r  s     rq   r   z*TLS13CertificateRequest.tls_session_update  s6    %t,,??HHH/3/A,,,rt   )r   r   r   r   r   r   r   r   r   r!   r"   r   r   r   r!  s   @rq   r7  r7    s        4D =B0CDD"?8T22 =!4d+:< < <;+L+LN N N&&xGGG##E41> 1>? ? ?	@KB B B B B B B B Brt   r7  c                   D    e Zd ZdZ edde           edd          gZdS )TLSServerHelloDonez!TLS Handshake - Server Hello Donerh   rV   ri   Nr   r   r   r   r   r   r   r   r   rt   rq   r=  r=    s;        .D =B0CDD"?8T224KKKrt   r=  c                   l    e Zd ZdZ edde           edd           eddd           gZd	 Z	d
 Z
dS )TLSCertificateVerifyz"TLS Handshake - Certificate Verifyrh   rX   ri   Nr  c                     | j         S rm   rn   ro   s    rq   rr   zTLSCertificateVerify.<lambda>  s    cj rt   ru   c                 p   |                      d          }|
| j        }d                    |j                  }|j        r|d                    |j                  z  }|j        }||j        }|dk    rC|j        dk    rd}n|j        dk    rd}d|z   d	z   |j	        j
                            |          z   }t          |
          | _        |j        dk    r!| j                            ||j                   n+|j        dk    r | j                            ||j                   t#          j        | g|R i |S )Nr  rt   rH  rp  !   TLS 1.3, client CertificateVerifyrn  !   TLS 1.3, server CertificateVerify@                                                                   r  r  )rP  r   r   r   r   r   rY  r  rX  r  r1  r  r,   r  r  
client_keyr  rg   rQ  )r|   rL  rM  r  r
  r   rY  context_strings           rq   rQ  zTLSCertificateVerify.build  sO   u%%; A-..A 9SXXa7888-K"6f$$#x//%INN%11%IN >1G;aej>O>OPQ>R>RR$333DH8++$$Q5555!X--$$Q555"48$888%888rt   c                    | j         }d                    |j                  }|j        r|d                    |j                  z  }|j        }||j        }|dk    rC|j        dk    rd}n|j        dk    rd}d|z   dz   |j        j	        
                    |          z   }|j        dk    r|j        r}t          |j                  d	k    rg| j                            ||j        d	                   }|sA|                                                                }t#          j        d
|           d S d S d S d S |j        dk    r|j        rt          |j                  d	k    ri| j                            ||j        d	                   }|sC|                                                                }t#          j        d
|           d S d S d S d S d S )Nrt   rH  rp  rD  rn  rC  rE  r  r   z-TLS: invalid CertificateVerify signature [%s])r   r   r   r   r   rY  r  rX  r  r1  r  r  ry   r  r  r  r	  r   r
  r  )r|   rp   r
  r   rY  rG  r  r  s           rq   r  z$TLSCertificateVerify.post_dissection  s
   HHQ)** 	5!3444Am2K&  8++!E!X--!E~-7!%*:K:KA:N:NNAx''~ `#an"5"5"9"98//1>!3DEE `"~~//7799H$%TV^_____	` `"9"9` ` ))~ `#an"5"5"9"98//1>!3DEE `"~~//7799H$%TV^_____ *)` `"9"9` `rt   )r   r   r   r   r   r   r   r.   r   rQ  r  r   rt   rq   r@  r@    s        /D =B0CDD"?8T22%%eT2H2HJ J JKK9 9 90` ` ` ` `rt   r@  c                   &    e Zd ZdgZdZddZd ZdS )_TLSCKExchKeysFieldrv   rD   Nc                 B    || _         t          j        | |d d            d S rm   )rv   r
   r   )r|   r   rv   s      rq   r   z_TLSCKExchKeysField.__init__  s'    &T4t44444rt   c                 *   |                      |          }|d|         ||d         }}|j        }d}|j        r|j        j        r|j        j        j        }|t          |          t          |          z  S  |||          t          |          z  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.
        Nr  )rv   r   r_  r  client_kx_msg_clsr   r   )r|   rp   r   r   tbdremr
  rJ  s           rq   r   z_TLSCKExchKeysField.m2i  s     ""3''XgX;'((SO6 	8af) 	8&%7C;s88gcll**s3A&&&55rt   rm   )r   r   r   r   holds_packetr   r   r   rt   rq   rJ  rJ    sC        IL5 5 5 56 6 6 6 6rt   rJ  c                   x     e Zd ZdZdZ edde           edd           edd 	          gZ	d
 Z
 fdZ xZS )TLSClientKeyExchangezS
    This class mostly works like TLSServerKeyExchange and its 'params' field.
    z#TLS Handshake - Client Key Exchangerh   rZ   ri   Nexchkeysc                     | j         S rm   rn   ro   s    rq   rr   zTLSClientKeyExchange.<lambda>.  s    sz rt   ru   c                     |                      d          }|A| j        }|j        r|j        j        j        } ||          }nt                      }|| _        t          j        | g|R i |S )NrS  r  )	rP  r   r_  r  rM  r   rS  rg   rQ  )r|   rL  rM  r|  r
  rJ  s         rq   rQ  zTLSClientKeyExchange.build0  s~    
++< Av f);ca(((eeDM"48$888%888rt   c                    t          t          |                               |           | j        j        rd                    | j        j                  }| j        j        dk    rWddlm	}  |
                    | j        j        j        j                              }|                    |          | j        _        nMddlm}m}  |                                |           |                                |          z   | j        _        | j        j        r| j                                         | j        j        s4| j                                        r| j                                         dS dS dS )zB
        Finalize the EXTMS messages and compute the hash
        rt   re  r   )_tls_hash_algs)Hash_MD5Hash_SHAN)r  rR  r   r   r\  r   r   rY  scapy.layers.tls.crypto.hashrW  r   r_  prf	hash_namer  session_hashrX  rY  pre_master_secretcompute_ms_and_derive_keysmaster_secret use_nss_master_secret_if_present)r|   r   to_hashrW  hash_objectrX  rY  r  s          rq   r   z'TLSClientKeyExchange.tls_session_update<  s    	"D))<<WEEE! 	>hht/BCCG+u44GGGGGGn00$)-7    1<0B0B70K0K -- LKKKKKKKHJJ%%g..1B1B71K1KK  - 1 > ;;===- 	>@@BB > ;;=====		> 	>> >rt   )r   r   r   r   r   r   r   r   rJ  r   rQ  r   r   r!  s   @rq   rR  rR  &  s          1D =B0CDD"?8T22&&z3I3IK K KLK

9 
9 
9> > > > > > > > >rt   rR  c                       e Zd Zd ZdS )_VerifyDataFieldc                     |j         j        dk    rd}n5|j         j        r'|j         j        dk    r|j         j        j        j        }nd}||d          |d |         fS )Ni   $   rH  rR   )r   rY  r  r1  r;  )r|   rp   r
  seps       rq   r  z_VerifyDataField.getfielda  sg    ?&&00CC_( 	S_-HF-R-R/%*3CCCw$3$rt   N)r   r   r   r  r   rt   rq   re  re  `  s#                 rt   re  c                   r    e Zd ZdZ edde           edd           edd          gZd Z	d Z
d	 Zd
 ZdS )TLSFinishedzTLS Handshake - Finishedrh   r\   ri   Nvdatac                    |                      d          }|| j        }d                    |j                  }|j        r|d                    |j                  z  }|j        }|j        }||j        }|dk     r/|j	        }|j
        j                            |d||          | _        n|                    |d|          | _        t          j        | g|R i |S )Nrk  rt   rH  write)rP  r   r   r   r   r   rX  rY  r  r`  r  r[  r6  rk  compute_tls13_verify_datarg   rQ  )	r|   rL  rM  r|  r
  handshake_msgcon_endrY  mss	            rq   rQ  zTLSFinished.buildq  s    ((< AHHQ%9::M E!*C!D!DD&G-K"6V##_UY::7G;H"N N

 88'9FH H
"48$888%888rt   c                    | j         }|j        sAd                    |j                  }|j        r|d                    |j                  z  }|j        }||j        }|dk     r|j        z|j        }|j	        }|j
        j                            |d||          }| j        |k    r=|                                                                }t!          j        d|           d S d S |dk    rh|j	        }|                    |d|          }| j        |k    rA|                                                                }t!          j        d|           d S d S d S d S )Nrt   rH  readz#TLS: invalid Finished received [%s])r   frozenr   r   r   r   rY  r  r`  rX  r  r[  r6  rk  r  r	  r   r
  rn  )	r|   rp   r
  ro  rY  rq  rp  verify_datar  s	            rq   r  zTLSFinished.post_dissection  s   x 	VHHQ%9::M E!*C!D!DD-K"6V##(C_*ei;;GV<I2O O:,,"~~//7799H$%JHUUUUU -, &&*99'6:GI I:,,"~~//7799H$%JHUUUUU+	V 	V '& -,rt   c                    |                      |           | j        }|j        }||j        }|dk    r|j        st          t          |j        j                  |j	        |j                  |_
        d|_        |j	        dk    r|                                 n3|j	        dk    r(|                                 |                                 |j	        dk    rd|_        g |_        d S d S )NrH  ro  Trn  rp  )r   r   rY  r  r   r5   r  r  rV  rX  r^  rr  compute_tls13_traffic_secrets!compute_tls13_traffic_secrets_endcompute_tls13_resumption_secretr   r|   r   r
  rY  s       rq   r  z)TLSFinished.post_build_tls_session_update  s   (((m2K&  )9 #QU5F0G0G343C01? ? ?AF '+A#8++//1111!X--3355511333x''#A(*A%%% ('rt   c                    |                      |           | j        }|j        }||j        }|dk    r|j        st          t          |j        j                  |j	        |j                  |_
        d|_        |j	        dk    r|                                 n3|j	        dk    r(|                                 |                                 |j	        dk    rd|_        g |_        d S d S )NrH  ro  Trp  rn  )r   r   rY  r  r   r4   r  r  rV  rX  r_  rs  rw  rx  ry  r   rz  s       rq   r  z.TLSFinished.post_dissection_tls_session_update  s   (((m2K&  )9 "tAE4E/F/F232B/0}> > >AF '+A#8++//1111!X--3355511333x''#A(*A%%% ('rt   )r   r   r   r   r   r   r   re  r   rQ  r  r  r  r   rt   rq   rj  rj  k  s        %D =B0CDD"?8T22##GT224K9 9 9(V V V2+ + +(+ + + + +rt   rj  c                       e Zd ZdZdZ edde           edd           edddd	
           e	d	dd           gZ
dS )TLSHelloVerifyRequestz)
    Defined for DTLS, see RFC 6347.
    z$TLS Handshake - Hello Verify Requestrh   r^   ri   N	cookielenr   cookier   rk   c                     | j         S rm   )r~  ro   s    rq   rr   zTLSHelloVerifyRequest.<lambda>      s} rt   ru   )r   r   r   r   r   r   r   r   r   r   r   r   rt   rq   r}  r}    s          2D =B0CDD"?8T22 =d%(H> > >;x+D+DF F F	GKKKrt   r}  individual_certspkipath)r   rD   c            	           e Zd ZdZ eddd           eddd            ed	dd
dd            eddd           gZd ZdS )URLAndOptionalHashz0URLAndOptionHash structure for TLSCertificateURLurllenNurlr   rk   c                     | j         S rm   )r  ro   s    rq   rr   zURLAndOptionalHash.<lambda>  rs   rt   ru   hash_presentr   r1  c                 J    t          t          j        |dz                      S )Ng      4@)r   mathceilr  s     rq   rr   zURLAndOptionalHash.<lambda>  s    s49QW;M;M7N7N rt   )r   r   r  c                     d| j         z  S )Nr\   )r  ro   s    rq   rr   zURLAndOptionalHash.<lambda>  s    rC<L7L rt   c                     t           S rm   r   r   s     rq   r   z&URLAndOptionalHash.guess_payload_class      rt   )r   r   r   r   r   r   r   r   r   rt   rq   r  r    s        =D =45AAA;ub+A+AC C C =%(F(N(NP P P ;vr+L+LN N NOK    rt   r  c            
           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	g ed           gZdS )TLSCertificateURLzU
    Defined in RFC 4366. PkiPath structure of section 8 is not implemented yet.
    zTLS Handshake - Certificate URLrh   r^   ri   Ncertchaintypeuahlenuahr   c                     | j         S rm   )r  ro   s    rq   rr   zTLSCertificateURL.<lambda>  r   rt   ru   )r   r   r   r   r   r   r   r   _tls_cert_chain_typesr   r   r  r   r   rt   rq   r  r    s          -D =B0CDD"?8T22 =$8MNN =45AAA"?5".@/E/EG G G	HKKKrt   r  c                   .    e Zd Zdd fdZd Zd Zd ZdS )ThreeBytesLenFieldNc                     |S rm   r   r  s     rq   rr   zThreeBytesLenField.<lambda>  r  rt   c                 :    t          j        | |||d|           d S )Nrx   )r   r   r  )r   r   r  s        rq   r   zThreeBytesLenField.__init__  s3    tT7i#'	8 	8 	8 	8 	8 	8rt   c                 P    |dS t          |                     ||                    S r   )r   r   r   s      rq   r   zThreeBytesLenField.i2repr  s(    91DHHS!$$%%%rt   c                 t    |t          j        | j        |                     ||                    dd         z   S r  r  r  s       rq   r  zThreeBytesLenField.addfield  r  rt   c                     |dd          |                      |t          j        | j        d|d d         z             d                   fS r  r  r  s      rq   r  zThreeBytesLenField.getfield  r  rt   )r   r   r   r   r   r  r  r   rt   rq   r  r    sf        04=M=M 8 8 8 8& & &
B B BQ Q Q Q Qrt   r  c                       e Zd Zd ZdS )_StatusFieldc                 `    |j         }| j        }|t          v rt          |         } ||          S rm   )status_typerJ  _cert_status_cls)r|   rp   r   idtyperJ  s        rq   r   z_StatusField.m2i  s3    h%%%"6*Cs1vvrt   Nr  r   rt   rq   r  r    s#            rt   r  c            
           e Zd ZdZ edde           edd           edde           eddd	
           e	d	de
d           gZdS )TLSCertificateStatusz"TLS Handshake - Certificate Statusrh   r`   ri   Nr  rD   responselenresponser   c                     | j         S rm   )r  ro   s    rq   rr   zTLSCertificateStatus.<lambda>'  s     rt   ru   )r   r   r   r   r   r   r   r#   r  r  r   r   r   rt   rq   r  r    s        /D =B0CDD"?8T22 =3DEE%%mT0:< < <<
D#,G,GI I IJKKKrt   r  c                   h    e Zd ZdZ edd           eddd           eddd 	          gZd
 ZdS )SupDataEntryz!Supplemental Data Entry - GenericsdtypeNry   datar   rk   c                     | j         S rm   ry   ro   s    rq   rr   zSupDataEntry.<lambda>3  s    cg rt   ru   c                     t           S rm   r  r   s     rq   r   z SupDataEntry.guess_payload_class5  r  rt   )	r   r   r   r   r   r   r   r   r   r   rt   rq   r  r  .  sq        .D:h-- =???;vr+=+=? ? ?@K
    rt   r  c                   h    e Zd ZdZ edd           eddd           eddd 	          gZd
 ZdS )UserMappingDatazUser Mapping Datar   Nry   r  r   rk   c                     | j         S rm   r  ro   s    rq   rr   zUserMappingData.<lambda>>  s    sw rt   ru   c                     t           S rm   r  r   s     rq   r   z#UserMappingData.guess_payload_class@  r  rt   )	r   r   r   r   r   r   r   r   r   r   rt   rq   r  r  9  st        D9Y-- =???;vr+>+>@ @ @AK
    rt   r  c            	           e Zd ZdZ edd           edddd            eddd	           edg ed
           gZd Z	dS )SupDataEntryUMz&Supplemental Data Entry - User Mappingr  Nry   r  c                     |dz   S r  r   r  s     rq   rr   zSupDataEntryUM.<lambda>H  s
    q1u rt   )r   r  dlenr   c                     | j         S rm   )r  ro   s    rq   rr   zSupDataEntryUM.<lambda>K  s    #( rt   ru   c                     t           S rm   r  r   s     rq   r   z"SupDataEntryUM.guess_payload_classM  r  rt   )
r   r   r   r   r   r   r   r  r   r   r   rt   rq   r  r  D  s        3D:h-- =(<(<> > > =@@@"?62/B/BD D D	EK    rt   r  c            	       |    e Zd ZdZ edde           edd           eddd           edg e	d	 
          gZ
dS )TLSSupplementalDataz!TLS Handshake - Supplemental Datarh   rb   ri   Nsdatalensdatar   c                     | j         S rm   )r  ro   s    rq   rr   zTLSSupplementalData.<lambda>W  s    3< rt   ru   )r   r   r   r   r   r   r   r  r   r  r   r   rt   rq   r  r  Q  st        .D =B0CDD"?8T22%%j$'JJJ"?7B/G/GI I IJKKKrt   r  c            	           e Zd ZdZdZ edde           edd           edd           e	d	dd
           e
d
dd           gZedd            Zd ZdS )TLSNewSessionTicketzR
    XXX When knowing the right secret, we should be able to read the ticket.
    z"TLS Handshake - New Session Ticketrh   rJ   ri   Nlifetime    	ticketlenticketr   rk   c                     | j         S rm   r  ro   s    rq   rr   zTLSNewSessionTicket.<lambda>h  r  rt   ru   c                 r    |                     dd           }|r|j        r|j        dk    rt          S t          S )Nr   rH  )r   rY  TLS13NewSessionTicketr  )rJ  rK  rL  rM  r
  s        rq   rN  z!TLSNewSessionTicket.dispatch_hookj  s>    IImT** 	) 	)1=F#:#:((""rt   c                 v    |                      |           | j        j        dk    r| j        | j        _        d S d S Nrp  )r   r   rX  r  r-  r   s     rq   r  z6TLSNewSessionTicket.post_dissection_tls_session_updateq  sB    (((*h6659[D222 76rt   rm   )r   r   r   r   r   r   r   r   r	   r   r   r   rd  rN  r  r   rt   rq   r  r  ^  s          0D =A/BCC"?8T228J
33 =dhGGG;x+D+DF F F	GK # # # [#A A A A Art   r  c                   $   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           e
ddd            e	ddd           e
ddd            eddd           eddd           g
Zd Zd ZdS )r  zG
    Uncomment the TicketField line for parsing a RFC 5077 ticket.
    z&TLS 1.3 Handshake - New Session Ticketrh   rJ   ri   Nticket_lifetimer  ticket_age_addr   noncelenr   ticket_noncer   rk   c                     | j         S rm   )r  ro   s    rq   rr   zTLS13NewSessionTicket.<lambda>  s    s| rt   ru   r  r  r   c                     | j         S rm   r  ro   s    rq   rr   zTLS13NewSessionTicket.<lambda>  r  rt   r   r   c                 >    | j         | j        pdz
  | j        z
  pddz
  S )Nr   rT   )ri   r  r  ro   s    rq   rr   zTLS13NewSessionTicket.<lambda>  s5    SZ>Am>Pq>R=@\>J >OMNRT=U rt   c                    |                      d          }|dk    rt          j        d          | _        |                      d          }|dk    rt          j        d          | _        |                      d          }|dk    rd| _        |                      d	          }|d
k    r2t          j        dt          j        d                    d
         | _        t          
                    |           S )Nr  rt   0   r  r$  r  r  i  r  r   rx   rJ   )rP  osurandomr  r  r  rz   r   r  rg   rQ  r{  s     rq   rQ  zTLS13NewSessionTicket.build  s    ))3;; *R..DK//3;; "
2D 122:#(D  011199"(-bjmm"D"DQ"GD""4(((rt   c                 L    | j         j        dk    r| j        | j         _        d S d S r  )r   rX  r  r-  r   s     rq   r  z8TLS13NewSessionTicket.post_dissection_tls_session_update  s.    *h6659[D222 76rt   )r   r   r   r   r   r   r   r   r	   r   r   r!   r"   r   rQ  r  r   rt   rq   r  r  w  sA         4D =A/BCC"?8T228-z::8,a00 =Ts+9; ; ;;~r+C+CE E E =dhGGG;x+D+DF F F&&xGGG##E41U 1UV V VWK$) ) )2A A A A Art   r  c                   D    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 Datarh   r  ri   Nr>  r   rt   rq   r  r    s;        2D =A/BCC"?8T224KKKrt   r  update_not_requestedupdate_requestedc                   h    e Zd ZdZ edde           edd           edde          gZd Z	d	 Z
dS )
TLS13KeyUpdatezTLS 1.3 Handshake - Key Updaterh   rd   ri   Nrequest_updater   c                     | j         }t          t          |j        j                  |j        |j                  |_        d|_        |	                    |j        d           d S )Nro  Trm  )
r   r5   r  r  rV  rX  rY  r^  rr  "compute_tls13_next_traffic_secretsr|   r   r
  s      rq   r  z,TLS13KeyUpdate.post_build_tls_session_update  sc    D1B,C,C/0/?,-M; ; ; #'	,,Q-=wGGGGGrt   c                    | j         }t          t          |j        j                  |j        |j                  |_        d|_        |j        dk    r|	                    dd           d S |j        dk    r|	                    dd           d S d S )Nro  Trn  rp  rs  )
r   r5   r  r  rV  rX  rY  r_  rs  r  r  s      rq   r  z1TLS13KeyUpdate.post_dissection_tls_session_update  s    D1B,C,C/0/?,-M; ; ; #'x''006BBBBB))006BBBBB *)rt   )r   r   r   r   r   r   r   _key_update_requestr   r  r  r   rt   rq   r  r    s{        +D =B0CDD"?8T22 =!116IJJLKH H H	C 	C 	C 	C 	Crt   r  )
rD   rF   rJ   r  rN   rP   rT   rX   r\   rd   )r   r  r  rz   scapy.errorr   r   scapy.fieldsr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   scapy.compatr   r   r   scapy.configr   scapy.packetr   r   r   scapy.utilsr   r   scapy.layers.x509r   scapy.layers.tls.certr   scapy.layers.tls.basefieldsr   r   r    scapy.layers.tls.extensionsr!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   scapy.layers.tls.keyexchanger,   r-   r.   r/   r0   r1   r2   scapy.layers.tls.sessionr3   r4   r5   "scapy.layers.tls.keyexchange_tls13r6   #scapy.layers.tls.crypto.compressionr7   r8   r9   r:   r;   scapy.layers.tls.crypto.suitesr<   r=   r>   r?   scapy.layers.tls.crypto.hkdfr@   crypto_validcryptography.hazmat.backendsrA   cryptography.hazmat.primitivesrB   r   rg   r   r   r   r   r   r   r   r#  r@  rx  rI  rk  r  r  r  r  r  r  r  r  r  r5  r  r   r+  r7  r=  r@  rJ  rR  re  rj  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  _tls_handshake_cls_tls13_handshake_clsr   rt   rq   <module>r     sU     				  , , , , , , , ,                               " - , , , , , , , , ,       - - - - - - - - - - , , , , , , , , + + + + + + & & & & & &A A A A A A A A A A	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	AB B B B B B B B B B B B B B B B B BE E E E E E E E E E F F F F F FH H H H H H H H H H H H H HJ J J J J J J J J J J J 4 3 3 3 3 3 6<<<<<<555555Bq/ B1n B.B*+-CB*B,-/DB 0B 35mB 0	B 356K	B
 .B
 134HB 0B 35jB ,B /12FB .B 13LB B !D !D !D !D !D1 !D !D !DP
 
 
 
 
m 
 
 
". . . . . . . .* * * * *+ * * *	 	 	 	 	k 	 	 	:& :& :& :& :& :& :& :&z    1   `1 `1 `1 `1 `1] `1 `1 `1F1 1 1 1 1} 1 1 1Nl9 l9 l9 l9 l9] l9 l9 l9` M)Q 344OHd##Y55r22M(DEs;;;OE2 6 68 8 8N8T#566VaS2%()68 8 8 $%888UD"2 "23 3 3 (Q+ Q+ Q+ Q+ Q+~ Q+ Q+ Q+p%H %H %H %H %H] %H %H %HZE3 E3 E3 E3 E3] E3 E3 E3\Q Q Q Q Q Q Q Q03 3 3 3 3 3 3 3l& & & & &[ & & &RG G G G G] G G G8    3   8 8 8 8 8 8 8 8
3 3 3 3 3} 3 3 3:W\ W\ W\ W\ W\= W\ W\ W\| %/$.$2$2$?$?%<%1%5%7	!9 	!9 	 	 	 	 	( 	 	 	 +  +  +  +  +K  +  +  +FS S S S SM S S S*B B B B Bm B B B.4 4 4 4 4 4 4 4=` =` =` =` =`= =` =` =`H6 6 6 6 6+ 6 6 6<3> 3> 3> 3> 3>= 3> 3> 3>t         {      Y+ Y+ Y+ Y+ Y+- Y+ Y+ Y+D
G 
G 
G 
G 
GM 
G 
G 
G" /%' '        
H 
H 
H 
H 
H 
H 
H 
H"Q Q Q Q Q Q Q Q" }%     >   J J J J J= J J J    6       f   
 
 
 
 
V 
 
 
J J J J J- J J JA A A A A- A A A22A 2A 2A 2A 2AM 2A 2A 2Ar4 4 4 4 4- 4 4 4 15GHH C C C C C] C C C</a /!^ //)*,A/,/ // 24^/ .	/ 134I	/
 ,/
 /12F/ ./ 13K/ +/ .01E/ -/  ,0@05H17G39M'^	= =   rt   