a
    kÄ#d›,  ã                   @   sx  d Z ddlZddlmZmZ ddlmZ ddl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 ddlmZmZ ddlmZmZmZmZmZmZ ddlm  m Z  ej!r¸dd	l"m#Z# G d
d„ deƒZ$G dd„ deƒZ%G dd„ deƒZ&G dd„ deƒZ'e%e'dœZ(de&iZ)G dd„ deƒZ*G dd„ de
ƒZ+G dd„ deƒZ,G dd„ deƒZ-G dd„ deƒZ.G dd„ deƒZ/e.e/dœZ0dS ) z
TLS 1.3 key exchange logic.
é    N)ÚconfÚcrypto_validator)Úlog_runtime)	ÚFieldLenFieldÚIntFieldÚPacketFieldÚPacketListFieldÚShortEnumFieldÚ
ShortFieldÚStrFixedLenFieldÚStrLenFieldÚXStrLenField)ÚPacketÚPadding)ÚTLS_Ext_UnknownÚ_tls_ext)Ú_tls_named_curvesÚ_tls_named_ffdh_groupsÚ_tls_named_groupsÚ_tls_named_groups_generateÚ_tls_named_groups_importÚ_tls_named_groups_pubbytes)Úecc                       s’   e Zd ZdZddgZdZeddeƒedddd	�e	dd
dd„ d�gZ
‡ fdd„Z‡ fdd„Zedd„ ƒZdd„ Zedd„ ƒZdd„ Zdd„ Z‡  ZS )ÚKeyShareEntryz‘
    When building from scratch, we create a DH private key, and when
    dissecting, we create a DH public key. Default group is secp256r1.
    ÚprivkeyÚpubkeyzKey Share EntryÚgroupNÚkxlenÚkey_exchange©Ú	length_ofÚ c                 C   s   | j S ©N)r   ©Úpkt© r%   úY/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/tls/keyexchange_tls13.pyÚ<lambda>4   ó    zKeyShareEntry.<lambda>©Úlength_fromc                    s&   d | _ d | _tt| ƒj|i |¤Ž d S r"   )r   r   Úsuperr   Ú__init__)ÚselfÚargsÚkargs©Ú	__class__r%   r&   r,   6   s    zKeyShareEntry.__init__c                    s$   | j }d| _ tt| ƒ ¡ }|| _ |S )zV
        We need this hack, else 'self' would be replaced by __iter__.next().
        T)Úexplicitr+   r   Údo_build)r-   ÚtmpÚbr0   r%   r&   r3   ;   s
    zKeyShareEntry.do_buildc                 C   s   t | jƒ| _t| jƒ| _dS )zB
        This is called by post_build() for key creation.
        N)r   r   r   r   r   ©r-   r%   r%   r&   Úcreate_privkeyE   s    zKeyShareEntry.create_privkeyc                 C   sz   | j d u rd| _ | js6z|  ¡  W n ty4   Y n0 | jd u rLt| jƒ| _t d| j ¡}t d| j¡}|| | j | S )Né   z!H)r   r   r7   ÚImportErrorr   ÚlenÚstructÚpack)r-   r$   Úpayr   r   r%   r%   r&   Ú
post_buildM   s    

zKeyShareEntry.post_buildc                 C   s   t | j| jƒ| _d S r"   )r   r   r   r   r6   r%   r%   r&   Úregister_pubkey^   s    þzKeyShareEntry.register_pubkeyc                 C   s$   z|   ¡  W n ty   Y n0 d S r"   )r?   r9   )r-   Úrr%   r%   r&   Úpost_dissectione   s    zKeyShareEntry.post_dissectionc                 C   s   d|fS )Nr!   r%   )r-   Úsr%   r%   r&   Úextract_paddingk   s    zKeyShareEntry.extract_padding)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__Únamer	   r   r   r   Úfields_descr,   r3   r   r7   r>   r?   rA   rC   Ú__classcell__r%   r%   r0   r&   r   *   s$   
ÿþ


r   c                	       s`   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
‡ fdd„Z‡ fdd„Z‡  ZS )ÚTLS_Ext_KeyShare_CHz+TLS Extension - Key Share (for ClientHello)Útypeé3   r:   NÚclient_shares_lenÚclient_sharesr   c                 C   s   | j S r"   )rO   r#   r%   r%   r&   r'   v   r(   zTLS_Ext_KeyShare_CH.<lambda>r)   c                    sr   | j js`| j j}| jD ]H}|jrt|j |v rN| ¡  ¡ }t	 
d|j|¡  q`|j|t|j < qtt| ƒ ||¡S ©Nz5TLS: group %s used twice in the same ClientHello [%s])Útls_sessionÚfrozenÚtls13_client_privsharesrP   r   r   r   Ú
firstlayerÚsummaryr   Úinfor+   rL   r>   )r-   r$   r=   Z
privsharesÚkseÚpkt_infor0   r%   r&   r>   x   s    
zTLS_Ext_KeyShare_CH.post_buildc                    sp   | j js`| jD ]P}|jr| j j}t|j |v rN| ¡  ¡ }t	 
d|j|¡  q`|j|t|j < qtt| ƒ |¡S rQ   )rR   rS   rP   r   Útls13_client_pubsharesr   r   rU   rV   r   rW   r+   rL   rA   )r-   r@   rX   Z	pubsharesrY   r0   r%   r&   rA   „   s    
z#TLS_Ext_KeyShare_CH.post_dissection)rD   rE   rF   rI   r	   r   r
   r   r   r   rJ   r>   rA   rK   r%   r%   r0   r&   rL   o   s   
ÿÿürL   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_KeyShare_HRRz1TLS Extension - Key Share (for HelloRetryRequest)rM   rN   r:   NZselected_group)	rD   rE   rF   rI   r	   r   r
   r   rJ   r%   r%   r%   r&   r[   ‘   s
   

þr[   c                       sL   e Zd ZdZeddeƒeddƒeddeƒgZ	‡ fdd„Z
‡ fd	d
„Z‡  ZS )ÚTLS_Ext_KeyShare_SHz+TLS Extension - Key Share (for ServerHello)rM   rN   r:   NÚserver_sharec           	         sÚ   | j jsÈ| jjrÈ| j j}t|ƒdkr<| ¡  ¡ }t 	d|¡ t
| jj }| jj||< || j jv rÈ| jj}| j j| }|t t¡v rŽ| |¡}n2|t t¡v rÀ|dv r°| |¡}n| t ¡ |¡}|| j _tt| ƒ ||¡S )Nr   ú/TLS: overwriting previous server key share [%s]©Zx25519Zx448)rR   rS   r]   r   Útls13_server_privsharer:   rU   rV   r   rW   r   r   rZ   ÚsixÚ
itervaluesr   Úexchanger   r   ÚECDHÚtls13_dhe_secretr+   r\   r>   )	r-   r$   r=   Z	privsharerY   Ú
group_namer   r   Úpmsr0   r%   r&   r>   ž   s$    zTLS_Ext_KeyShare_SH.post_buildc                    sV  | j j�sF| jj�rF| j j}|r8| ¡  ¡ }t d|¡ t	| jj
 }| jj||< || j jv rÆ| jj}| j j| }|t t¡v rŠ| |¡}n2|t t¡v r¼|dv r¬| |¡}n| t ¡ |¡}|| j _n€|| j jv �rF| j j| }| j j| }|t t¡v �r| |¡}n6|t t¡v �r>|dv �r.| |¡}n| t ¡ |¡}|| j _tt| ƒ |¡S )Nr^   r_   )rR   rS   r]   r   Ztls13_server_pubsharerU   rV   r   rW   r   r   rT   ra   rb   r   rc   r   r   rd   re   r`   rZ   r+   r\   rA   )r-   r@   ZpubsharerY   rf   r   r   rg   r0   r%   r&   rA   µ   s8    

z#TLS_Ext_KeyShare_SH.post_dissection)rD   rE   rF   rI   r	   r   r
   r   r   rJ   r>   rA   rK   r%   r%   r0   r&   r\   ˜   s   

þr\   )é   é   ri   c                   @   sN   e Zd ZdZedddƒedddƒedddd�edd	d
d„ d�edddƒgZdS )ÚTicketz/Recommended Ticket Construction (from RFC 5077)Zkey_nameNé   ZivÚencstatelenZencstater   r!   c                 C   s   | j S r"   )rl   r#   r%   r%   r&   r'   ä   r(   zTicket.<lambda>r)   Úmacé    )rD   rE   rF   rI   r   r   r   rJ   r%   r%   r%   r&   rj   Þ   s   

ÿ
ûrj   c                   @   s$   e Zd ZdgZddd„Zdd„ ZdS )ÚTicketFieldr*   Nc                 K   s"   || _ tj| ||tfi |¤Ž d S r"   )r*   r   r,   rj   )r-   rI   Údefaultr*   r/   r%   r%   r&   r,   ë   s    zTicketField.__init__c                 C   s6   |   |¡}|d |… ||d …  }}|  |¡t|ƒ S r"   )r*   Úclsr   )r-   r$   ÚmZtmp_lenZtbdÚremr%   r%   r&   Úm2iï   s    
zTicketField.m2i)N)rD   rE   rF   rH   r,   rt   r%   r%   r%   r&   ro   è   s   
ro   c                   @   s8   e Zd ZdZedddd�edddd„ d	�ed
dƒgZdS )ÚPSKIdentityzPSK IdentityÚidentity_lenNÚidentityr   r!   c                 C   s   | j S r"   )rv   r#   r%   r%   r&   r'   ú   r(   zPSKIdentity.<lambda>r)   Zobfuscated_ticket_ager   )rD   rE   rF   rI   r   ro   r   rJ   r%   r%   r%   r&   ru   õ   s   ÿÿüru   c                   @   s2   e Zd ZdZeddddd�edddd	„ d
�gZdS )ÚPSKBinderEntryzPSK Binder EntryÚ
binder_lenNÚBZbinder)Úfmtr    r!   c                 C   s   | j S r"   )ry   r#   r%   r%   r&   r'     r(   zPSKBinderEntry.<lambda>r)   )rD   rE   rF   rI   r   r   rJ   r%   r%   r%   r&   rx   þ   s   ÿÿþrx   c                   @   sb   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�edddd�edg e
dd
„ d�gZdS )ÚTLS_Ext_PreSharedKey_CHz0TLS Extension - Pre Shared Key (for ClientHello)rM   é)   r:   NÚidentities_lenZ
identitiesr   c                 C   s   | j S r"   )r~   r#   r%   r%   r&   r'     r(   z TLS_Ext_PreSharedKey_CH.<lambda>r)   Úbinders_lenZbindersc                 C   s   | j S r"   )r   r#   r%   r%   r&   r'     r(   )rD   rE   rF   rI   r	   r   r
   r   r   ru   rx   rJ   r%   r%   r%   r&   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_PreSharedKey_SHz0TLS Extension - Pre Shared Key (for ServerHello)rM   r}   r:   NZselected_identity)rD   rE   rF   rI   r	   r   r
   rJ   r%   r%   r%   r&   r€     s
   
þr€   )1rG   r;   Zscapy.configr   r   Zscapy.errorr   Zscapy.fieldsr   r   r   r   r	   r
   r   r   r   Zscapy.packetr   r   Zscapy.layers.tls.extensionsr   r   Zscapy.layers.tls.crypto.groupsr   r   r   r   r   r   Zscapy.libs.sixZlibsra   Zcrypto_validZ)cryptography.hazmat.primitives.asymmetricr   r   rL   r[   r\   Z_tls_ext_keyshare_clsZ_tls_ext_keyshare_hrr_clsrj   ro   ru   rx   r|   r€   Z_tls_ext_presharedkey_clsr%   r%   r%   r&   Ú<module>   s6   , E"@ÿ
	ÿ