a
    kÄ#dA…  ã                %   @   sP  d Z ddlmZ ddlZddl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 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  dd
l!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z* dZ+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+d,d-d.d/d0d1d2d3d4œ$Z,G d5d6„ d6e ƒZ-G d7d8„ d8e-ƒZ.dd9iZ/G d:d;„ d;eƒZ0G d<d=„ d=eƒZ1G d>d?„ d?e	ƒZ2G d@dA„ dAe.ƒZ3G dBdC„ dCe.ƒZ4G dDdE„ dEe-ƒZ5G dFdG„ dGe-ƒZ6dHdIdJdKdLœZ7G dMdN„ dNeƒZ8G dOdP„ dPeƒZ9G dQdR„ dReƒZ:G dSdT„ dTeƒZ;e8e9e:e;dLœZ<G dUdV„ dVeƒZ=G dWdX„ dXe-ƒZ>G dYdZ„ dZe-ƒZ?G d[d\„ d\eƒZ@G d]d^„ d^eƒZAd_d`iZBd_eAiZCG dadb„ dbeƒZDG dcdd„ dde-ƒZEG dedf„ dfe-ƒZFG dgdh„ dhe-ƒZGG didj„ dje-ƒZHdkdldmœZIG dndo„ doe-ƒZJG dpdq„ dqe-ƒZKdrds„ ZLG dtdu„ due-ƒZMG dvdw„ dweMƒZNdxdydzd{œZOG d|d}„ d}e-ƒZPG d~d„ de-ƒZQG d€d�„ d�e-ƒZRG d‚dƒ„ dƒeƒZSG d„d…„ 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\G d–d—„ d—e-ƒZ]e\e]e\d˜œZ^G d™dš„ dše-ƒZ_G d›dœ„ dœe-ƒZ`G d�dž„ dže-ƒZae`eadŸœZbG d d¡„ d¡e-ƒZcd¢d£dmœZdG d¤d¥„ d¥e-ƒZeG d¦d§„ d§e-ƒZfG d¨d©„ d©e.ƒZgG dªd«„ d«e-ƒZhG d¬d­„ d­e-ƒZiG d®d¯„ d¯e-ƒZjG d°d±„ d±e-ƒZke3e5e6e>e?eEeFeGeHeLeMePeQeReUeVeWeXekeYe[e\e_eceeeheieZegeje4d²œZlG d³d´„ d´e	ƒZmG dµd¶„ d¶eƒZndS )·z
TLS handshake extensions.
é    )Úprint_functionN)ÚByteEnumFieldÚ	ByteFieldÚ	EnumFieldÚFieldLenFieldÚFieldListFieldÚIntFieldÚPacketFieldÚPacketListFieldÚShortEnumFieldÚ
ShortFieldÚStrFixedLenFieldÚStrLenFieldÚXStrLenField)ÚPacketÚRawÚPadding)ÚX509_Extensions)Ú_tls_version)ÚSigAndHashAlgsLenFieldÚSigAndHashAlgsFieldÚ_tls_hash_sig)Ú_GenericTLSSessionInheritance)Ú_tls_named_groups)Ú_tls_cipher_suites)ÚAnsiColorTheme)Úraw)Úconfs    Ï!­tåša¾Œe¸‘Â¢z»Œ^ž	âÈ¨3œZserver_nameZmax_fragment_lengthZclient_certificate_urlZtrusted_ca_keysZtruncated_hmacZstatus_requestZuser_mappingZclient_authzZserver_authzZ	cert_typeZsupported_groupsZec_point_formatsZsignature_algorithmsÚ	heartbeatZalpnZsigned_certificate_timestampZclient_certificate_typeZserver_certificate_typeÚpaddingZencrypt_then_macZextended_master_secretÚrecord_size_limitZsession_ticketZpre_shared_keyZearly_data_indicationZsupported_versionsÚcookieZpsk_key_exchange_modesZcertificate_authoritiesZoid_filtersÚpost_handshake_authZsignature_algorithms_certZ	key_shareZnext_protocol_negotiationZrenegotiation_infoZencrypted_server_name)$r   é   é   é   é   é   é   é   é   é	   é
   é   é   é   é   é   é   é   é   é   é   é   é#   é)   é*   é+   é,   é-   é/   é0   é1   é2   é3   ét3  éÿ  éÎÿ  c                   @   sH   e Zd ZdZdZeddeƒeddddd�edd	d
d„ d�gZ	dd„ Z
dS )ÚTLS_Ext_Unknownza
    We put this here rather than in extensions.py in order to avoid
    circular imports...
    zTLS Extension - Scapy UnknownÚtypeNÚlenú!HÚval©ÚfmtÚ	length_ofÚ c                 C   s   | j S ©N©rH   ©Úpkt© rS   úR/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/tls/extensions.pyÚ<lambda>d   ó    zTLS_Ext_Unknown.<lambda>©Úlength_fromc                 C   sB   | j d u r:t |ƒd }|d d… t d|¡ |dd …  }|| S )Nr&   r$   rI   )rH   ÚstructÚpack)ÚselfÚpZpayÚtmp_lenrS   rS   rT   Ú
post_buildf   s    
$zTLS_Ext_Unknown.post_build)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Únamer   Ú_tls_extr   r   Úfields_descr^   rS   rS   rS   rT   rF   [   s   
ÿþrF   c                   @   s   e Zd ZdZd	dd„ZdS )
ÚTLS_Ext_PrettyPacketListzí
    Dummy extension used for server_name/ALPN/NPN for a lighter representation:
    the final field is showed as a 1-line list rather than as lots of packets.
    XXX Define a new condition for packet lists in Packet._show_or_dump?
    Fr%   rN   Tc              	   C   s¾  |r
t ƒ ntj}d|| d¡| | j¡| d¡f }| jdd… D ]’}|j}	|j}
|  	|j¡}d|| |	|jƒ| d¡f }| 
| |¡}t|tƒrÀ| ddd	t|ƒt|ƒ t|jƒ d
   ¡}|d||
|ƒf 7 }qB| jd }|j}	|j}
|  	|j¡}d|| |	|jƒ| d¡f }| 
| |¡}t|tƒ�r\| ddd	t|ƒt|ƒ t|jƒ d
   ¡}|d||
|ƒf 7 }| j�r || jj|||d	| | j  |dd�7 }|�r¶|�s¶t|ƒ n|S dS )z Reproduced from packet.py z%s%s %s %s 
z###[z]###Néÿÿÿÿz%s  %-10s%s ú=Ú
ú r&   z%s%s
F)ÚdumpÚindentÚlvlÚ	label_lvlÚ
first_call)r   r   Zcolor_themeÚpunctZ
layer_namerc   re   Ú
field_nameZfield_valueÚgetfieldvalÚi2reprÚ
isinstanceÚstrÚreplacerH   ÚpayloadÚ_show_or_dumpZshow_indentÚprint)r[   rk   rl   rm   rn   ro   ÚctÚsÚfZncolZvcolZfvalueZbegnZreprvalrS   rS   rT   rx   {   sX    ÿÿ
ÿþý

ÿþý
þ
z&TLS_Ext_PrettyPacketList._show_or_dumpN)Fr%   rN   rN   T)r_   r`   ra   rb   rx   rS   rS   rS   rT   rf   t   s     ÿrf   Z	host_namec                   @   sB   e Zd ZdZeddeƒedddd�eddd	d
„ d�gZdd„ Z	dS )Ú
ServerNameZHostNameZnametyper   ÚnamelenNÚ
servername©rM   rN   c                 C   s   | j S rO   )r~   rQ   rS   rS   rT   rU   ­   rV   zServerName.<lambda>rW   c                 C   s   t S rO   ©r   ©r[   r\   rS   rS   rT   Úguess_payload_class¯   s    zServerName.guess_payload_class)
r_   r`   ra   rc   r   Ú_tls_server_name_typesr   r   re   rƒ   rS   rS   rS   rT   r}   ¨   s   
ÿþr}   c                   @   s   e Zd Zdd„ ZdS )ÚServerListFieldc                 C   s&   dd„ |D ƒ}dd  dd„ |D ƒ¡ S )Nc                 S   s   g | ]
}|j ‘qS rS   )r   ©Ú.0r\   rS   rS   rT   Ú
<listcomp>µ   rV   z*ServerListField.i2repr.<locals>.<listcomp>ú[%s]ú, c                 s   s   | ]}t |ƒV  qd S rO   ©Úrepr©r‡   ÚxrS   rS   rT   Ú	<genexpr>¶   rV   z)ServerListField.i2repr.<locals>.<genexpr>©Újoin©r[   rR   rŽ   ÚresrS   rS   rT   rs   ´   s    zServerListField.i2reprN©r_   r`   ra   rs   rS   rS   rS   rT   r…   ³   s   r…   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚServerLenFieldzQ
    There is no length when there are no servernames (as in a ServerHello).
    c                    s"   |s|j s|S tt| ƒ |||¡S rO   )ÚservernamesÚsuperr•   Úaddfield)r[   rR   r{   rJ   ©Ú	__class__rS   rT   r˜   ¾   s    zServerLenField.addfield)r_   r`   ra   rb   r˜   Ú__classcell__rS   rS   r™   rT   r•   ¹   s   r•   c                	   @   sN   e Zd ZdZeddeƒeddddd„ d	�ed
ddd�edg e	dd„ d�gZ
dS )ÚTLS_Ext_ServerNamezTLS Extension - Server NamerG   r   rH   Nr–   c                 C   s   |d S )Nr$   rS   )rR   rŽ   rS   rS   rT   rU   É   rV   zTLS_Ext_ServerName.<lambda>)rM   ÚadjustÚservernameslenr€   c                 C   s   | j S rO   )rž   rQ   rS   rS   rT   rU   Í   rV   rW   )r_   r`   ra   rc   r   rd   r   r•   r…   r}   re   rS   rS   rS   rT   rœ   Å   s   
ÿÿÿûrœ   c                   @   s’   e Zd ZdZeddeƒeddƒeddeƒedde	ƒ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
d�edddd„ d�g
ZdS )ÚTLS_Ext_EncryptedServerNamez%TLS Extension - Encrypted Server NamerG   rE   rH   NÚcipherZkey_exchange_groupÚkey_exchange_lenZkey_exchangeÚH)rM   rL   rN   c                 C   s   | j S rO   )r¡   rQ   rS   rS   rT   rU   Ú   rV   z$TLS_Ext_EncryptedServerName.<lambda>rW   Úrecord_digest_lenZrecord_digestr€   c                 C   s   | j S rO   )r£   rQ   rS   rS   rT   rU   Þ   rV   Úencrypted_sni_lenZencrypted_snic                 C   s   | j S rO   )r¤   rQ   rS   rS   rT   rU   â   rV   )r_   r`   ra   rc   r   rd   r   r   r   r   r   r   re   rS   rS   rS   rT   rŸ   Ð   s4   

ÿÿÿÿÿÿÿñrŸ   c                
   @   s:   e Zd ZdZeddeƒeddƒedddd	d
ddœƒgZdS )ÚTLS_Ext_MaxFragLenz#TLS Extension - Max Fragment LengthrG   r#   rH   NZ
maxfraglenr&   z2^9z2^10z2^11z2^12)r#   r$   r%   r&   ©	r_   r`   ra   rc   r   rd   r   r   re   rS   rS   rS   rT   r¥   å   s   
ýþr¥   c                   @   s&   e Zd ZdZeddeƒeddƒgZdS )ÚTLS_Ext_ClientCertURLz&TLS Extension - Client Certificate URLrG   r$   rH   N©r_   r`   ra   rc   r   rd   r   re   rS   rS   rS   rT   r§   ï   s   
ÿr§   Z
pre_agreedZkey_sha1_hashZ	x509_nameZcert_sha1_hash)r   r#   r$   r%   c                   @   s&   e Zd ZdZeddeƒgZdd„ ZdS )ÚTAPreAgreedzTrusted authority - pre_agreedÚidtyper   c                 C   s   t S rO   r�   r‚   rS   rS   rT   rƒ   ÿ   s    zTAPreAgreed.guess_payload_classN)r_   r`   ra   rc   r   Ú_tls_trusted_authority_typesre   rƒ   rS   rS   rS   rT   r©   û   s   r©   c                   @   s0   e Zd ZdZeddeƒedddƒgZdd„ ZdS )	ÚTAKeySHA1Hashz!Trusted authority - key_sha1_hashrª   r#   ÚidNr3   c                 C   s   t S rO   r�   r‚   rS   rS   rT   rƒ     s    z!TAKeySHA1Hash.guess_payload_class©	r_   r`   ra   rc   r   r«   r   re   rƒ   rS   rS   rS   rT   r¬     s
   

ÿr¬   c                   @   sF   e Zd ZdZdZeddeƒedddd�edd	d
d„ d�gZ	dd„ Z
dS )Ú
TAX509Namezm
    XXX Section 3.4 of RFC 4366. Implement a more specific DNField
    rather than current StrLenField.
    zTrusted authority - x509_namerª   r$   ÚdnlenNÚdnr€   rN   c                 C   s   | j S rO   )r°   rQ   rS   rS   rT   rU     rV   zTAX509Name.<lambda>rW   c                 C   s   t S rO   r�   r‚   rS   rS   rT   rƒ     s    zTAX509Name.guess_payload_class)r_   r`   ra   rb   rc   r   r«   r   r   re   rƒ   rS   rS   rS   rT   r¯     s   
þr¯   c                   @   s0   e Zd ZdZeddeƒedddƒgZdd„ ZdS )	ÚTACertSHA1Hashz"Trusted authority - cert_sha1_hashrª   r%   r­   Nr3   c                 C   s   t S rO   r�   r‚   rS   rS   rT   rƒ     s    z"TACertSHA1Hash.guess_payload_classr®   rS   rS   rS   rT   r²     s
   

ÿr²   c                   @   s   e Zd ZdZdd„ ZdS )Ú_TAListFieldz‡
    Specific version that selects the right Trusted Authority (previous TA*)
    class to be used for dissection based on idtype.
    c                 C   s*   t |d ƒ}| j}|tv r"t| }||ƒS ©Nr   )ÚordÚclsÚ_tls_trusted_authority_cls©r[   rR   Úmrª   r¶   rS   rS   rT   Úm2i/  s
    z_TAListField.m2iN)r_   r`   ra   rb   rº   rS   rS   rS   rT   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 )ÚTLS_Ext_TrustedCAIndz%TLS Extension - Trusted CA IndicationrG   r%   rH   NÚtalenÚtar€   c                 C   s   | j S rO   )r¼   rQ   rS   rS   rT   rU   =  rV   zTLS_Ext_TrustedCAInd.<lambda>rW   )r_   r`   ra   rc   r   rd   r   r   r³   r   re   rS   rS   rS   rT   r»   7  s   
ÿýr»   c                   @   s&   e Zd ZdZeddeƒeddƒgZdS )ÚTLS_Ext_TruncatedHMACzTLS Extension - Truncated HMACrG   r&   rH   Nr¨   rS   rS   rS   rT   r¾   @  s   
ÿr¾   c                   @   s8   e Zd ZdZedddd�edddd„ d	�gZd
d„ ZdS )ÚResponderIDzResponder ID structureÚ	respidlenNÚrespidr€   rN   c                 C   s   | j S rO   ©rÀ   rQ   rS   rS   rT   rU   J  rV   zResponderID.<lambda>rW   c                 C   s   t S rO   r�   r‚   rS   rS   rT   rƒ   L  s    zResponderID.guess_payload_class©r_   r`   ra   rc   r   r   re   rƒ   rS   rS   rS   rT   r¿   F  s   ÿÿr¿   c                   @   sT   e Zd ZdZdZedddd�edg edd„ d	�ed
ddd�edde	ƒgZ
dd„ ZdS )ÚOCSPStatusRequestzE
    This is the structure defined in RFC 6066, not in RFC 6960!
    zOCSPStatusRequest structurerÀ   NrÁ   r€   c                 C   s   | j S rO   rÂ   rQ   rS   rS   rT   rU   W  rV   zOCSPStatusRequest.<lambda>rW   Z	reqextlenZreqextrN   c                 C   s   t S rO   r�   r‚   rS   rS   rT   rƒ   [  s    z%OCSPStatusRequest.guess_payload_class)r_   r`   ra   rb   rc   r   r
   r¿   r	   r   re   rƒ   rS   rS   rS   rT   rÄ   P  s   ÿ
ürÄ   r#   Zocspc                   @   s   e Zd Zdd„ ZdS )Ú_StatusReqFieldc                 C   s$   |j }| j}|tv rt| }||ƒS rO   )Ústyper¶   Ú_cert_status_req_clsr¸   rS   rS   rT   rº   d  s
    z_StatusReqField.m2iN)r_   r`   ra   rº   rS   rS   rS   rT   rÅ   c  s   rÅ   c                	   @   sB   e Zd ZdZeddeƒeddƒeddeƒe	dg e
dd	„ d
�gZdS )ÚTLS_Ext_CSRz*TLS Extension - Certificate Status RequestrG   r'   rH   NrÆ   Úreqc                 C   s
   | j d S )Nr#   rP   rQ   rS   rS   rT   rU   r  rV   zTLS_Ext_CSR.<lambda>rW   )r_   r`   ra   rc   r   rd   r   r   Ú_cert_status_typerÅ   r   re   rS   rS   rS   rT   rÈ   l  s   

ÿýrÈ   c                	   @   sL   e Zd ZdZeddeƒeddƒeddddd	�edg e	d
dƒdd„ d�gZ
dS )ÚTLS_Ext_UserMappingzTLS Extension - User MappingrG   r(   rH   NÚumlenÚBZumrK   Zumtyper   c                 C   s   | j S rO   )rÌ   rQ   rS   rS   rT   rU   |  rV   zTLS_Ext_UserMapping.<lambda>rW   )r_   r`   ra   rc   r   rd   r   r   r   r   re   rS   rS   rS   rT   rË   u  s   
þýrË   c                   @   s*   e Zd ZdZdZeddeƒeddƒgZdS )ÚTLS_Ext_ClientAuthzú XXX Unsupported zTLS Extension - Client AuthzrG   r)   rH   N©	r_   r`   ra   rb   rc   r   rd   r   re   rS   rS   rS   rT   rÎ     s
   
ÿrÎ   c                   @   s*   e Zd ZdZdZeddeƒeddƒgZdS )ÚTLS_Ext_ServerAuthzrÏ   zTLS Extension - Server AuthzrG   r*   rH   NrÐ   rS   rS   rS   rT   rÑ   ‡  s
   
ÿrÑ   zX.509ZOpenPGP)r   r#   c                
   @   sP   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�gZdS )ÚTLS_Ext_ClientCertTypez1TLS Extension - Certificate Type (client version)rG   r+   rH   NÚ	ctypeslenÚctypesr€   r   r#   Z	certtypesc                 C   s   | j S rO   )rÓ   rQ   rS   rS   rT   rU   š  rV   zTLS_Ext_ClientCertType.<lambda>rW   )r_   r`   ra   rc   r   rd   r   r   r   r   Ú_tls_cert_typesre   rS   rS   rS   rT   rÒ   ’  s   

ÿýýrÒ   c                   @   s0   e Zd ZdZeddeƒeddƒeddeƒgZ	dS )ÚTLS_Ext_ServerCertTypez1TLS Extension - Certificate Type (server version)rG   r+   rH   NÚctype)
r_   r`   ra   rc   r   rd   r   r   rÕ   re   rS   rS   rS   rT   rÖ   �  s
   

þrÖ   c                 O   s@   t  d| dd… ¡d }|dkr&t}nt}|| g|¢R i |¤ŽS )z�
    We need to select the correct one on dissection. We use the length for
    that, as 1 for client version would imply an empty list.
    rI   r$   r&   r   r#   )rY   ÚunpackrÖ   rÒ   )r¹   ÚargsZkargsr]   r¶   rS   rS   rT   Ú_TLS_Ext_CertTypeDispatcher¤  s
    rÚ   c                
   @   sP   e Zd ZdZdZeddeƒeddƒedddd	�e	dg ed
de
ƒdd„ d�gZdS )ÚTLS_Ext_SupportedGroupszŽ
    This extension was known as 'Supported Elliptic Curves' before TLS 1.3
    merged both group selection mechanisms for ECDH and FFDH.
    z TLS Extension - Supported GroupsrG   r,   rH   NÚ	groupslenÚgroupsr€   Úngc                 C   s   | j S rO   )rÜ   rQ   rS   rS   rT   rU   ½  rV   z TLS_Ext_SupportedGroups.<lambda>rW   )r_   r`   ra   rb   rc   r   rd   r   r   r   r   re   rS   rS   rS   rT   rÛ   ±  s   
ÿýýrÛ   c                   @   s   e Zd ZdS )ÚTLS_Ext_SupportedEllipticCurvesN)r_   r`   ra   rS   rS   rS   rT   rß   À  s   rß   ZuncompressedZansiX962_compressed_primeZansiX962_compressed_char2)r   r#   r$   c                
   @   sP   e Zd ZdZeddeƒeddƒeddddd	�edd
ge	dde
ƒdd„ d�gZdS )ÚTLS_Ext_SupportedPointFormatz&TLS Extension - Supported Point FormatrG   r-   rH   NÚecpllenrÍ   ZecplrK   r   Úncc                 C   s   | j S rO   )rá   rQ   rS   rS   rT   rU   Ñ  rV   z%TLS_Ext_SupportedPointFormat.<lambda>rW   )r_   r`   ra   rc   r   rd   r   r   r   r   Ú_tls_ecpoint_formatre   rS   rS   rS   rT   rà   É  s   
ÿýýrà   c                
   @   sL   e Zd ZdZeddeƒeddƒedddd�edg e	d	de
ƒd
d„ d�gZdS )ÚTLS_Ext_SignatureAlgorithmsz$TLS Extension - Signature AlgorithmsrG   r.   rH   NÚsig_algs_lenÚsig_algsr€   Úhash_sigc                 C   s   | j S rO   ©rå   rQ   rS   rS   rT   rU   Ý  rV   z$TLS_Ext_SignatureAlgorithms.<lambda>rW   ©r_   r`   ra   rc   r   rd   r   r   r   r   r   re   rS   rS   rS   rT   rä   Ô  s   
ÿÿýürä   c                   @   s6   e Zd ZdZeddeƒeddƒedddd	d
œƒgZdS )ÚTLS_Ext_HeartbeatzTLS Extension - HeartbeatrG   r/   rH   NZheartbeat_moder$   Zpeer_allowed_to_sendZpeer_not_allowed_to_send©r#   r$   r¦   rS   rS   rS   rT   rê   à  s   
ÿÿþrê   c                   @   s:   e Zd ZdZeddddd�edddd	„ d
�gZdd„ ZdS )ÚProtocolNamezProtocol NamerH   NrÍ   ÚprotocolrK   rN   c                 C   s   | j S rO   rP   rQ   rS   rS   rT   rU   í  rV   zProtocolName.<lambda>rW   c                 C   s   t S rO   r�   r‚   rS   rS   rT   rƒ   ï  s    z ProtocolName.guess_payload_classrÃ   rS   rS   rS   rT   rì   é  s   ÿÿrì   c                   @   s   e Zd Zdd„ ZdS )ÚProtocolListFieldc                 C   s&   dd„ |D ƒ}dd  dd„ |D ƒ¡ S )Nc                 S   s   g | ]
}|j ‘qS rS   )rí   r†   rS   rS   rT   rˆ   õ  rV   z,ProtocolListField.i2repr.<locals>.<listcomp>r‰   rŠ   c                 s   s   | ]}t |ƒV  qd S rO   r‹   r�   rS   rS   rT   r�   ö  rV   z+ProtocolListField.i2repr.<locals>.<genexpr>r�   r’   rS   rS   rT   rs   ô  s    zProtocolListField.i2reprNr”   rS   rS   rS   rT   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 )ÚTLS_Ext_ALPNz6TLS Extension - Application Layer Protocol NegotiationrG   r0   rH   NÚprotocolslenÚ	protocolsr€   c                 C   s   | j S rO   )rð   rQ   rS   rS   rT   rU   ÿ  rV   zTLS_Ext_ALPN.<lambda>rW   )r_   r`   ra   rc   r   rd   r   r   rî   rì   re   rS   rS   rS   rT   rï   ù  s   
ÿýrï   c                   @   s:   e Zd ZdZeddeƒedddd�eddd	d
„ d�gZdS )ÚTLS_Ext_PaddingzTLS Extension - PaddingrG   r4   rH   Nr   r€   rN   c                 C   s   | j S rO   rP   rQ   rS   rS   rT   rU     rV   zTLS_Ext_Padding.<lambda>rW   )	r_   r`   ra   rc   r   rd   r   r   re   rS   rS   rS   rT   rò     s   
ÿþrò   c                   @   s&   e Zd ZdZeddeƒeddƒgZdS )ÚTLS_Ext_EncryptThenMACz TLS Extension - Encrypt-then-MACrG   r5   rH   Nr¨   rS   rS   rS   rT   ró   
  s   
ÿró   c                   @   s&   e Zd ZdZeddeƒeddƒgZdS )ÚTLS_Ext_ExtendedMasterSecretz&TLS Extension - Extended Master SecretrG   r6   rH   Nr¨   rS   rS   rS   rT   rô     s   
ÿrô   c                   @   s>   e Zd ZdZdZeddeƒedddd�edd	d
d„ d�gZ	dS )ÚTLS_Ext_SessionTicketz�
    RFC 5077 updates RFC 4507 according to most implementations, which do not
    use another (useless) 'ticketlen' field after the global 'len' field.
    zTLS Extension - Session TicketrG   r8   rH   NÚticketr€   rN   c                 C   s   | j S rO   rP   rQ   rS   rS   rT   rU     rV   zTLS_Ext_SessionTicket.<lambda>rW   )
r_   r`   ra   rb   rc   r   rd   r   r   re   rS   rS   rS   rT   rõ     s   
ÿþrõ   c                   @   s&   e Zd ZdZeddeƒeddƒgZdS )ÚTLS_Ext_KeySharez'TLS Extension - Key Share (dummy class)rG   rB   rH   Nr¨   rS   rS   rS   rT   r÷   "  s   
ÿr÷   c                   @   s&   e Zd ZdZeddeƒeddƒgZdS )ÚTLS_Ext_PreSharedKeyz,TLS Extension - Pre Shared Key (dummy class)rG   r9   rH   Nr¨   rS   rS   rS   rT   rø   (  s   
ÿrø   c                   @   s&   e Zd ZdZeddeƒeddƒgZdS )ÚTLS_Ext_EarlyDataIndicationzTLS Extension - Early DatarG   r:   rH   Nr¨   rS   rS   rS   rT   rù   .  s   
ÿrù   c                   @   s.   e Zd ZdZeddeƒeddƒeddƒgZdS )Ú!TLS_Ext_EarlyDataIndicationTicketú&TLS Extension - Ticket Early Data InforG   r:   rH   NÚmax_early_data_sizer   ©	r_   r`   ra   rc   r   rd   r   r   re   rS   rS   rS   rT   rú   4  s
   
þrú   )r#   r&   r*   c                   @   s&   e Zd ZdZeddeƒeddƒgZdS )ÚTLS_Ext_SupportedVersionsz0TLS Extension - Supported Versions (dummy class)rG   r;   rH   Nr¨   rS   rS   rS   rT   rþ   @  s   
ÿrþ   c                
   @   sN   e Zd ZdZeddeƒeddƒeddddd	�edg ed
de	ƒdd„ d�gZ
dS )ÚTLS_Ext_SupportedVersion_CHz4TLS Extension - Supported Versions (for ClientHello)rG   r;   rH   NÚversionslenrÍ   ÚversionsrK   Úversionc                 C   s   | j S rO   )r   rQ   rS   rS   rT   rU   O  rV   z$TLS_Ext_SupportedVersion_CH.<lambda>rW   )r_   r`   ra   rc   r   rd   r   r   r   r   re   rS   rS   rS   rT   rÿ   F  s   
ÿÿýürÿ   c                   @   s0   e Zd ZdZeddeƒeddƒeddeƒgZdS )ÚTLS_Ext_SupportedVersion_SHz4TLS Extension - Supported Versions (for ServerHello)rG   r;   rH   Nr  )	r_   r`   ra   rc   r   rd   r   r   re   rS   rS   rS   rT   r  R  s
   

þr  rë   c                   @   sJ   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S )ÚTLS_Ext_CookiezTLS Extension - CookierG   r<   rH   NÚ	cookielenr!   r€   rN   c                 C   s   | j S rO   )r  rQ   rS   rS   rT   rU   c  rV   zTLS_Ext_Cookie.<lambda>rW   c                 C   s0   |   d¡}|d u s|dkr&t d¡| _t | ¡S )Nr!   rV   é    )rr   ÚosÚurandomr!   rF   Úbuild)r[   ÚfvalrS   rS   rT   r	  e  s    
zTLS_Ext_Cookie.build)r_   r`   ra   rc   r   rd   r   r   r   re   r	  rS   rS   rS   rT   r  ]  s   
ÿýr  Zpsk_keZ
psk_dhe_kec                
   @   sN   e Zd ZdZeddeƒeddƒeddddd	�edg e	d
de
ƒdd„ d�gZdS )ÚTLS_Ext_PSKKeyExchangeModesz&TLS Extension - PSK Key Exchange ModesrG   r=   rH   NÚ
kxmodeslenrÍ   ZkxmodesrK   Zkxmodec                 C   s   | j S rO   )r  rQ   rS   rS   rT   rU   x  rV   z$TLS_Ext_PSKKeyExchangeModes.<lambda>rW   )r_   r`   ra   rc   r   rd   r   r   r   r   Ú_tls_psk_kx_modesre   rS   rS   rS   rT   r  o  s   
ÿÿýür  c                   @   s.   e Zd ZdZeddeƒeddƒeddƒgZdS )ÚTLS_Ext_TicketEarlyDataInforû   rG   é.   rH   Nrü   r   rý   rS   rS   rS   rT   r  {  s
   
þr  c                   @   s@   e Zd ZdZdZeddeƒedddd�edg e	d	d
„ d�gZ
dS )ÚTLS_Ext_NPNzU
    Defined in RFC-draft-agl-tls-nextprotoneg-03. Deprecated in favour of ALPN.
    z)TLS Extension - Next Protocol NegotiationrG   rC   rH   Nrñ   r€   c                 C   s   | j S rO   rP   rQ   rS   rS   rT   rU   Š  rV   zTLS_Ext_NPN.<lambda>rW   )r_   r`   ra   rb   rc   r   rd   r   rî   rì   re   rS   rS   rS   rT   r  ‚  s   
ÿþr  c                   @   s&   e Zd ZdZeddeƒeddƒgZdS )ÚTLS_Ext_PostHandshakeAuthz#TLS Extension - Post Handshake AuthrG   r@   rH   Nr¨   rS   rS   rS   rT   r  �  s   
ÿr  c                
   @   sL   e Zd ZdZeddeƒeddƒedddd�edg e	d	de
ƒd
d„ d�gZdS )ÚTLS_Ext_SignatureAlgorithmsCertz)TLS Extension - Signature Algorithms CertrG   rA   rH   Nrå   ræ   r€   rç   c                 C   s   | j S rO   rè   rQ   rS   rS   rT   rU   œ  rV   z(TLS_Ext_SignatureAlgorithmsCert.<lambda>rW   ré   rS   rS   rS   rT   r  “  s   
ÿÿýür  c                   @   sD   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S )ÚTLS_Ext_RenegotiationInfoz(TLS Extension - Renegotiation IndicationrG   rD   rH   NÚreneg_conn_lenrÍ   Zrenegotiated_connectionrK   rN   c                 C   s   | j S rO   )r  rQ   rS   rS   rT   rU   ¦  rV   z"TLS_Ext_RenegotiationInfo.<lambda>rW   )
r_   r`   ra   rc   r   rd   r   r   r   re   rS   rS   rS   rT   r  Ÿ  s   
ÿÿür  c                   @   s.   e Zd ZdZeddeƒeddƒeddƒgZdS )ÚTLS_Ext_RecordSizeLimitz!TLS Extension - Record Size LimitrG   r7   rH   Nr    r¨   rS   rS   rS   rT   r  ©  s
   
þr  )r   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r@   rA   rB   rC   rD   rE   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )Ú_ExtensionsLenFieldc                    sX   |  | j¡}| |¡}|du s&|dk rF|jj}|du s>|dk rF|dfS tt| ƒ ||¡S )zÀ
        We try to compute a length, usually from a msglen parsed earlier.
        If we can not find any length, we consider 'extensions_present'
        (from RFC 5246) to be False.
        Nr   é  )Ú	get_fieldrM   rX   Útls_sessionÚtls_versionr—   r  Úgetfield)r[   rR   r{   Úextr]   Úvr™   rS   rT   r  Ø  s    
z_ExtensionsLenField.getfieldc           	      C   sš   |du rˆ| j durˆ| | j ¡\}}|jj}d|j_| ||¡}||j_|  ||¡}|dkrˆ|jj}|du sr|dk rv|S |t | j	|¡ S |t | j	|¡ S )aÇ  
        There is a hack with the _ExtensionsField.i2len. It works only because
        we expect _ExtensionsField.i2m to return a string of the same size (if
        not of the same value) upon successive calls (e.g. through i2len here,
        then i2m when directly building the _ExtensionsField).

        XXX A proper way to do this would be to keep the extensions built from
        the i2len call here, instead of rebuilding them later on.
        NTr   r  )
rM   Zgetfield_and_valr  ÚfrozenÚi2lenr�   r  rY   rZ   rL   )	r[   rR   r{   ÚiZfldr
  Útmpr|   r  rS   rS   rT   r˜   æ  s    

z_ExtensionsLenField.addfield)r_   r`   ra   r  r˜   r›   rS   rS   r™   rT   r  ×  s   r  c                   @   s4   e Zd ZdZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )Ú_ExtensionsFieldr#   c                 C   s   |d u rdS t |  ||¡ƒS r´   )rH   Úi2m)r[   rR   r   rS   rS   rT   r    s    z_ExtensionsField.i2lenc                 C   s>   |   |¡pd}|dkr|g fS ||d … |  ||d |… ¡fS r´   )rX   rº   )r[   rR   r{   r]   rS   rS   rT   r    s    z_ExtensionsField.getfieldc                 C   sl   |d u rdS t |tƒr\|jjs\d}|D ]0}t |tƒrJ|j|_|| ¡ 7 }q&|t|ƒ7 }q&|S d tt|ƒ¡S )NrV   )rt   r   r  r  Zraw_statefulr   r‘   Úmap)r[   rR   r   r{   r  rS   rS   rT   r#    s    

z_ExtensionsField.i2mc           
      C   s  g }t |ƒdk�rt d|d d… ¡d }t d|dd… ¡d }t |t¡}|tu r–ddlm}m	} |j
r†|j
tkr†| |jt¡}qè| |jt¡}nR|tu rºddlm}	 |	 |jt¡}n.|tu rÒt |jt¡}n|tu rèt |jt¡}| ||d |d … |jd�¡ ||d d … }q|S )Nr&   rI   r$   r   )Ú_tls_ext_keyshare_clsÚ_tls_ext_keyshare_hrr_cls)Ú_tls_ext_presharedkey_cls)r  )rH   rY   rØ   Ú_tls_ext_clsÚgetrF   r÷   Z"scapy.layers.tls.keyexchange_tls13r%  r&  Zrandom_bytesÚ_tls_hello_retry_magicZmsgtyperø   r'  rþ   Ú_tls_ext_supported_version_clsrù   Ú_tls_ext_early_data_clsÚappendr  )
r[   rR   r¹   r“   Útr]   r¶   r%  r&  r'  rS   rS   rT   rº   "  s,    ÿ z_ExtensionsField.m2iN)	r_   r`   ra   ZislistZholds_packetsr  r  r#  rº   rS   rS   rS   rT   r"    s   r"  )orb   Ú
__future__r   r  rY   Zscapy.fieldsr   r   r   r   r   r   r	   r
   r   r   r   r   r   Zscapy.packetr   r   r   Zscapy.layers.x509r   Zscapy.layers.tls.basefieldsr   Zscapy.layers.tls.keyexchanger   r   r   Zscapy.layers.tls.sessionr   Zscapy.layers.tls.crypto.groupsr   Zscapy.layers.tls.crypto.suitesr   Zscapy.themesr   Zscapy.compatr   Zscapy.configr   r*  rd   rF   rf   r„   r}   r…   r•   rœ   rŸ   r¥   r§   r«   r©   r¬   r¯   r²   r·   r³   r»   r¾   r¿   rÄ   rÊ   rÇ   rÅ   rÈ   rË   rÎ   rÑ   rÕ   rÒ   rÖ   rÚ   rÛ   rß   rã   rà   rä   rê   rì   rî   rï   rò   ró   rô   rõ   r÷   rø   rù   rú   r,  rþ   rÿ   r  r+  r  r  r  r  r  r  r  r  r  r(  r  r"  rS   rS   rS   rT   Ú<module>   sL  <ÿÛ)1
ý		ý	
		

þ	
	þÿ

Ý'-