a
    kÄ#d¥W  ã                
   @   sâ  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 ddlmZ ddlmZ ddlmZmZ dd	lmZ dd
lmZmZ ddlmZmZmZ ddl m!Z!m"Z"m#Z#m$Z$ ddddddddddœ	Z%G dd„ deƒZ&dddddœZ'G dd„ de&ƒZ(G d d!„ d!eƒZ)G d"d#„ d#e&ƒZ*G d$d%„ d%eƒZ+G d&d'„ d'e&ƒZ,G d(d)„ d)e
ƒZ-G d*d+„ d+eƒZ.G d,d-„ d-e&ƒZ/G d.d/„ d/e&ƒZ0G d0d1„ d1e&ƒZ1G d2d3„ d3e&ƒZ2G d4d5„ d5e&ƒZ3G d6d7„ d7e&ƒZ4e(e*e/e3e,e0e4e1e2dœ	Z5dS )8z!
SSLv2 handshake fields & logic.
é    N)Úlog_runtimeÚwarning)Ú
randstring)ÚByteEnumFieldÚ	ByteFieldÚ	EnumFieldÚFieldLenFieldÚShortEnumFieldÚStrLenFieldÚ	XStrFieldÚXStrLenField©ÚPadding)ÚCert)Ú_tls_versionÚ_TLSVersionField)Ú_CipherSuitesField)Ú_TLSSignatureFieldÚ_TLSSignature)Ú_GenericTLSSessionInheritanceÚreadConnStateÚwriteConnState)Ú_tls_cipher_suitesÚ_tls_cipher_suites_clsÚget_usable_ciphersuitesÚ SSL_CK_DES_192_EDE3_CBC_WITH_MD5ÚerrorZclient_helloZclient_master_keyZclient_finishedZserver_helloZserver_verifyZserver_finishedZrequest_certificateZclient_certificate)	r   é   é   é   é   é   é   é   é   c                   @   s2   e Zd ZdZdZeddeƒgZdd„ Zdd„ Z	dS )	Ú_SSLv2Handshakez‚
    Inherited by other Handshake classes to get post_build().
    Also used as a fallback for unknown TLS Handshake packets.
    zSSLv2 Handshake Generic messageÚmsgtypeNc                 C   s   t S ©Nr   )ÚselfÚp© r*   úW/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/tls/handshake_sslv2.pyÚguess_payload_class1   s    z#_SSLv2Handshake.guess_payload_classc                 C   s    | j j |¡ | j j | ¡ dS )zO
        Covers both post_build- and post_dissection- context updates.
        N)Útls_sessionZhandshake_messagesÚappendZhandshake_messages_parsed©r(   Úmsg_strr*   r*   r+   Útls_session_update4   s    z"_SSLv2Handshake.tls_session_update)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Únamer   Ú_sslv2_handshake_typeÚfields_descr,   r1   r*   r*   r*   r+   r%   )   s
   r%   Z	no_cipherZno_certificateZbad_certificateZunsupported_certificate_type)r   r   r    r"   c                   @   s,   e Zd ZdZdZeddeƒeddeƒgZ	dS )Ú
SSLv2Errorz
    SSLv2 Error.
    zSSLv2 Handshake - Errorr&   r   ÚcodeN)
r2   r3   r4   r5   r6   r   r7   r	   Ú_tls_error_coder8   r*   r*   r*   r+   r9   D   s
   

ÿr9   c                   @   s&   e Zd Zddd„Zdd„ Zdd„ ZdS )	Ú_SSLv2CipherSuitesFieldNc                 C   s$   t j| ||||d� d| _d| _d S )N©Úlength_fromó    r   )r   Ú__init__ZitemfmtÚitemsize)r(   r6   ÚdefaultÚdicor>   r*   r*   r+   r@   R   s
    ÿz _SSLv2CipherSuitesField.__init__c                 C   s.   |d u rg }dd„ |D ƒ}d  dd„ |D ƒ¡S )Nc                 S   s   g | ]}|d ? |d@ f‘qS )é   éÿÿ  r*   ©Ú.0Úxr*   r*   r+   Ú
<listcomp>[   r?   z/_SSLv2CipherSuitesField.i2m.<locals>.<listcomp>r?   c                 S   s"   g | ]}t  d |d |d ¡‘qS )ú>BHr   r   ©ÚstructÚpackrF   r*   r*   r+   rI   \   r?   )Újoin©r(   ÚpktÚvalZval2r*   r*   r+   Úi2mX   s    z_SSLv2CipherSuitesField.i2mc              	   C   s<   g }|r8|  t dd|d d…  ¡d ¡ |dd … }q|S ©Nú!Ió    r   r   )r.   rL   Úunpack)r(   rP   ÚmÚresr*   r*   r+   Úm2i^   s
    "z_SSLv2CipherSuitesField.m2i)N)r2   r3   r4   r@   rR   rY   r*   r*   r*   r+   r<   Q   s   
r<   c                       sš   e Zd ZdZdZ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d�e
dddd„ d�ed
egedd„ d�e
dddd„ d�gZ‡ fdd„Z‡  ZS )ÚSSLv2ClientHelloz
    SSLv2 ClientHello.
    zSSLv2 Handshake - Client Hellor&   r   Úversionr   Ú
cipherslenNú!HÚciphers©ÚfmtZ	length_ofÚsidlenÚsidÚchallengelenÚ	challenger?   c                 C   s   | j S r'   )ra   ©rP   r*   r*   r+   Ú<lambda>v   r?   zSSLv2ClientHello.<lambda>r=   c                 C   s   | j S r'   ©r\   re   r*   r*   r+   rf   z   r?   c                 C   s   | j S r'   )rc   re   r*   r*   r+   rf   |   r?   c                    s2   t t| ƒ |¡ | j| j_| j| j_| j| j_	d S r'   )
ÚsuperrZ   r1   r[   r-   Zadvertised_tls_versionr^   Ússlv2_common_csrd   Ússlv2_challenger/   ©Ú	__class__r*   r+   r1   ~   s    

z#SSLv2ClientHello.tls_session_update)r2   r3   r4   r5   r6   r   r7   r   r   r   r   r<   r   r   r8   r1   Ú__classcell__r*   r*   rk   r+   rZ   f   s4   

ÿÿÿÿýÿðrZ   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Ú_SSLv2CertDataFieldc                 C   s\   d}| j d ur|   |¡}zt|d |… ƒ}W n tyJ   |d |… }Y n0 ||d … |fS )Nr   )r>   r   Ú	Exception)r(   rP   ÚsZtmp_lenÚcertdatar*   r*   r+   ÚgetfieldŠ   s    

z_SSLv2CertDataField.getfieldc                 C   s   t |tƒrt|jƒS t|ƒS r'   )Ú
isinstancer   ÚlenÚder©r(   rP   Úir*   r*   r+   Úi2len–   s    

z_SSLv2CertDataField.i2lenc                 C   s   t |tƒr|jS |S r'   )rs   r   ru   rv   r*   r*   r+   rR   ›   s    
z_SSLv2CertDataField.i2mN)r2   r3   r4   rr   rx   rR   r*   r*   r*   r+   rn   ‰   s   rn   c                       s®   e Zd ZdZdZeddeƒeddƒedddd	iƒed
de	ƒe
ddddd�e
ddddd�e
ddddd�edddd„ d�edg edd„ d�edddd„ d�g
Z‡ fdd„Z‡  ZS )ÚSSLv2ServerHelloz
    SSLv2 ServerHello.
    zSSLv2 Handshake - Server Hellor&   r    Zsid_hitr   Úcerttyper   Ú	x509_certr[   r   ÚcertlenNr]   Úcertr_   r\   r^   Úconnection_idlenÚconnection_idr?   c                 C   s   | j S r'   ©r|   re   r*   r*   r+   rf   ´   r?   zSSLv2ServerHello.<lambda>r=   c                 C   s   | j S r'   rg   re   r*   r*   r+   rf   ¶   r?   c                 C   s   | j S r'   )r~   re   r*   r*   r+   rf   ¸   r?   c                    s\   t tˆ ƒ |¡ ˆ j}|j}‡ fdd„|D ƒ}||_ˆ j|_ˆ j|_ˆ j	durXˆ j	g|_
dS )zI
        XXX Something should be done about the session ID here.
        c                    s   g | ]}|ˆ j v r|‘qS r*   )r^   )rG   Úcs©r(   r*   r+   rI   Â   r?   z7SSLv2ServerHello.tls_session_update.<locals>.<listcomp>N)rh   ry   r1   r-   ri   r   Ússlv2_connection_idr[   Útls_versionr}   Úserver_certs)r(   r0   rp   Z	client_csÚcssrk   r‚   r+   r1   º   s    
z#SSLv2ServerHello.tls_session_update)r2   r3   r4   r5   r6   r   r7   r   r   r   r   rn   r<   r   r   r8   r1   rm   r*   r*   rk   r+   ry   ¡   s4   

ÿÿÿÿÿÿïry   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )Ú_SSLv2CipherSuiteFieldc                 C   s   t  | |||¡ d S r'   )r   r@   )r(   r6   rB   rC   r*   r*   r+   r@   Ï   s    z_SSLv2CipherSuiteField.__init__c                 C   s2   |d u rdS |d? |d@ f}t  d|d |d ¡S )Nr?   rD   rE   rJ   r   r   rK   rO   r*   r*   r+   rR   Ò   s    z_SSLv2CipherSuiteField.i2mc                 C   s   ||   ||¡ S r'   )rR   )r(   rP   rp   rQ   r*   r*   r+   ÚaddfieldØ   s    z_SSLv2CipherSuiteField.addfieldc                 C   s   t  dd|d d…  ¡d S rS   )rL   rV   )r(   rP   rW   r*   r*   r+   rY   Û   s    z_SSLv2CipherSuiteField.m2ic                 C   s   |dd … |   ||¡fS )Nr   )rY   )r(   rP   rp   r*   r*   r+   rr   Þ   s    z_SSLv2CipherSuiteField.getfieldN)r2   r3   r4   r@   rR   rˆ   rY   rr   r*   r*   r*   r+   r‡   Î   s
   r‡   c                       s   e Zd Z‡ fdd„Z‡  ZS )Ú_SSLv2EncryptedKeyFieldc                    sD   t t| ƒ ||¡}|jd ur@|j}t t| ƒ ||¡}|d| 7 }|S )Nz    [decryptedkey= %s])rh   r‰   Úi2reprÚdecryptedkey)r(   rP   rH   rp   ZdxZdsrk   r*   r+   rŠ   ã   s    
z_SSLv2EncryptedKeyField.i2repr)r2   r3   r4   rŠ   rm   r*   r*   rk   r+   r‰   â   s   r‰   c                       s¸   e Zd ZdZdgZdZ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d�ed
ddd„ d�edddd„ d�edddd„ d�gZ‡ fdd„Zdd„ Zdd„ Z‡ fdd„Z‡  ZS )ÚSSLv2ClientMasterKeyz 
    SSLv2 ClientMasterKey.
    r‹   z#SSLv2 Handshake - Client Master Keyr&   r   ÚcipherNÚclearkeylenr]   Úclearkeyr_   ÚencryptedkeylenÚencryptedkeyÚ	keyarglenÚkeyargÚ c                 C   s   | j S r'   )rŽ   re   r*   r*   r+   rf   ý   r?   zSSLv2ClientMasterKey.<lambda>r=   c                 C   s   | j S r'   )r�   re   r*   r*   r+   rf   ÿ   r?   c                 C   s   | j S r'   )r’   re   r*   r*   r+   rf     r?   c                    s.   |  dd¡| _tt| ƒj|i |¤Ž d| _dS )ah  
        When post_building, the packets fields are updated (this is somewhat
        non-standard). We might need these fields later, but calling __str__
        on a new packet (i.e. not dissected from a raw string) applies
        post_build to an object different from the original one... unless
        we hackishly always set self.explicit to 1.
        r‹   r?   r   N)Úpopr‹   rh   rŒ   r@   Úexplicit)r(   ÚargsÚkargsrk   r*   r+   r@     s    zSSLv2ClientMasterKey.__init__c                 C   sl   t  d|dd… ¡d }t  d|dd… ¡d }d| }|||| … }| jjrb| jj |¡| _nd | _|S )Nr]   r    r"   r   r$   é
   )rL   rV   r-   Zserver_rsa_keyZdecryptr‹   )r(   rp   rŽ   r�   Zencryptedkeystartr‘   r*   r*   r+   Úpre_dissect  s    ÿz SSLv2ClientMasterKey.pre_dissectc                 C   s,  d }| j d u rl| jj}t|dƒ}t|ƒdkr>tdƒ d}d}n|d }t d|d? |d@ ¡}t| }|| _ n@|d	d
… }t 	dd| ¡d }|tvr¤td|ƒ d }nt| }|�rl| j
dk�rDt| jjƒdk�rDt|jjƒ}| jdkrü|jjrü|d d… | _| jdk�r(|jj�r"|dd … | _n|| _| jjd j}	|	 | j¡| _
| jdk�rl|jjdk�rlt|jjƒ| _| j�pvd}
| jd u �rŽt|
ƒ| _t d| j¡}| j
�p¦d}| jd u �r¾t|ƒ| _t d| j¡}| j�pÖd}| jd u �rît|ƒ| _t d| j¡}|d d	… | | | | |
 | | }|| S )NZSSLv2r   z2No known common cipher suite between SSLv2 Hellos.iÀ  s    ÀrJ   rD   rE   r   r    rT   rU   ú,Unknown cipher suite %d from ClientMasterKeyr?   éûÿÿÿÚblockr]   )r�   r-   ri   r   rt   r   rL   rM   r   rV   r‘   r…   r   Z
cipher_algZkey_lenr�   Zkx_algZexportr‹   ZpubKeyZencryptr“   ÚtypeÚ
block_sizerŽ   r�   r’   )r(   rP   ZpayÚcs_valZ	common_csZcs_valsr�   Úcs_clsÚkeyZpubkeyr�   rŽ   r‘   r�   r“   r’   rp   r*   r*   r+   Ú
post_build  sv    


ÿ



ÿÿÿþþþzSSLv2ClientMasterKey.post_buildc           	         sä   t t| ƒ |¡ | j}| j}|tvr4td|ƒ d }nt| }|jpDd}|j}|j	j
}t||||d�|_|jj
}t||||d�|_| jd urà| j| j |_| ¡  |jjjdkrº| j|jj_|jjjdkrÔ| j|jj_d|_d|_d S )Nr›   r   )ZciphersuiteÚconnection_endÚseq_numr„   r�   T)rh   rŒ   r1   r-   r�   r   r   r„   r¤   Zwcsr¥   r   ZpwcsÚrcsr   Zprcsr‹   r�   Zmaster_secretZ compute_sslv2_km_and_derive_keysrž   r“   ZivZtriggered_prcs_commitZtriggered_pwcs_commit)	r(   r0   rp   r    r¡   r„   r¤   Zwcs_seq_numZrcs_seq_numrk   r*   r+   r1   [  s<    

ýý
z'SSLv2ClientMasterKey.tls_session_update)r2   r3   r4   r5   Ú	__slots__r6   r   r7   r‡   r   r   r   r‰   r8   r@   rš   r£   r1   rm   r*   r*   rk   r+   rŒ   ì   s8   

ÿÿÿÿÿÿò@rŒ   c                       sB   e Zd ZdZdZeddeƒeddƒgZ‡ fdd„Z	d	d
„ Z
‡  ZS )ÚSSLv2ServerVerifyz–
    In order to parse a ServerVerify, the exact message string should be
    fed to the class. This is how SSLv2 defines the challenge length...
    zSSLv2 Handshake - Server Verifyr&   r!   rd   r”   c                    s2   |   d¡}|d u r| jj| _tt| ƒj|i |¤ŽS )Nrd   )Úgetfieldvalr-   rj   rd   rh   r¨   Úbuild©r(   r—   r˜   Zfvalrk   r*   r+   rª   �  s    

zSSLv2ServerVerify.buildc                 C   s8   | j }|jd ur4| j|jkr4| ¡  ¡ }t d|¡ d S )Nz'TLS: invalid ServerVerify received [%s])r-   rj   rd   Ú
firstlayerÚsummaryr   Úinfo©r(   rP   rp   Úpkt_infor*   r*   r+   Úpost_dissection“  s
    
z!SSLv2ServerVerify.post_dissection©r2   r3   r4   r5   r6   r   r7   r   r8   rª   r±   rm   r*   r*   rk   r+   r¨   „  s   
ÿr¨   c                       sH   e Zd ZdZdZeddeƒeddddiƒedd	ƒgZ‡ fd
d„Z	‡  Z
S )ÚSSLv2RequestCertificatezœ
    In order to parse a RequestCertificate, the exact message string should be
    fed to the class. This is how SSLv2 defines the challenge length...
    z%SSLv2 Handshake - Request Certificater&   r#   Zauthtyper   Zmd5_with_rsard   r”   c                    s   t t| ƒ |¡ | j| j_d S r'   )rh   r³   r1   rd   r-   Ússlv2_challenge_clientcertr/   rk   r*   r+   r1   ©  s    z*SSLv2RequestCertificate.tls_session_update)r2   r3   r4   r5   r6   r   r7   r   r8   r1   rm   r*   r*   rk   r+   r³   Ÿ  s   
þr³   c                
       s�   e Zd ZdZdZeddeƒeddddiƒedd	d
dd�edd	d
dd�edddd„ d�e	dd	dd„ d�gZ
‡ fdd„Zdd„ Z‡ fdd„Z‡  ZS )ÚSSLv2ClientCertificatez"
    SSLv2 ClientCertificate.
    z$SSLv2 Handshake - Client Certificater&   r$   rz   r   r{   r|   Nr]   rq   r_   ÚresponselenÚresponsedatar?   c                 C   s   | j S r'   r€   re   r*   r*   r+   rf   À  r?   zSSLv2ClientCertificate.<lambda>r=   c                 C   s   | j S r'   )r¶   re   r*   r*   r+   rf   Â  r?   c                    s–   | j }|  d¡}|d u o8|jd uo8|jd uo8t|jƒdk}|rz| j }|j|j |jd j }t|d�| _| j 	||j
¡ nd| _tt| ƒj|i |¤ŽS )Nr·   r   )r-   r?   )r-   r©   Ússlv2_key_materialr´   rt   r…   ru   r   r·   Z_update_sigZ
client_keyrh   rµ   rª   )r(   r—   r˜   rp   ÚsigÚtestrW   rk   r*   r+   rª   Ä  s(    
ÿþýÿ
þzSSLv2ClientCertificate.buildc                 C   s�   |   |¡ | j}t|jƒdko>|jd uo>|jd uo>t|jƒdk}|rŒ|j|j |jd j }| j 	||jd ¡}|sŒ|  
¡  ¡ }t d|¡ d S )Nr   z4TLS: invalid client CertificateVerify signature [%s])r1   r-   rt   Úclient_certsr¸   r´   r…   ru   r·   Z_verify_sigr¬   r­   r   r®   )r(   r0   rp   rº   rW   Zsig_testr°   r*   r*   r+   Ú"post_dissection_tls_session_updateÖ  s&    
ÿþýÿ
þz9SSLv2ClientCertificate.post_dissection_tls_session_updatec                    s&   t t| ƒ |¡ | jr"| jg| j_d S r'   )rh   rµ   r1   rq   r-   r»   r/   rk   r*   r+   r1   ç  s    z)SSLv2ClientCertificate.tls_session_update)r2   r3   r4   r5   r6   r   r7   r   rn   r   r8   rª   r¼   r1   rm   r*   r*   rk   r+   rµ   ²  s(   
ÿÿÿÿörµ   c                       sB   e Zd ZdZdZeddeƒeddƒgZ‡ fdd„Z	d	d
„ Z
‡  ZS )ÚSSLv2ClientFinishedz¢
    In order to parse a ClientFinished, the exact message string should be fed
    to the class. SSLv2 does not offer any other way to know the c_id length.
    z!SSLv2 Handshake - Client Finishedr&   r   r   r”   c                    s2   |   d¡}|dkr| jj| _tt| ƒj|i |¤ŽS )Nr   r?   )r©   r-   rƒ   r   rh   r½   rª   r«   rk   r*   r+   rª   ú  s    

zSSLv2ClientFinished.buildc                 C   s8   | j }|jd ur4| j|jkr4| ¡  ¡ }t d|¡ d S )Nz*TLS: invalid client Finished received [%s])r-   rƒ   r   r¬   r­   r   r®   r¯   r*   r*   r+   r±      s
    
z#SSLv2ClientFinished.post_dissectionr²   r*   r*   rk   r+   r½   ñ  s   
ÿr½   c                       sB   e Zd ZdZdZeddeƒeddƒgZ‡ fdd„Z	d	d
„ Z
‡  ZS )ÚSSLv2ServerFinishedz¡
    In order to parse a ServerFinished, the exact message string should be fed
    to the class. SSLv2 does not offer any other way to know the sid length.
    z!SSLv2 Handshake - Server Finishedr&   r"   rb   r”   c                    s2   |   d¡}|dkr| jj| _tt| ƒj|i |¤ŽS )Nrb   r?   )r©   r-   rb   rh   r¾   rª   r«   rk   r*   r+   rª     s    

zSSLv2ServerFinished.buildc                 C   s   |   |¡ | j| j_d S r'   )r1   rb   r-   r/   r*   r*   r+   r¼     s    
z6SSLv2ServerFinished.post_dissection_tls_session_update)r2   r3   r4   r5   r6   r   r7   r   r8   rª   r¼   rm   r*   r*   rk   r+   r¾     s   
ÿr¾   )6r5   rL   Zscapy.errorr   r   Zscapy.utilsr   Zscapy.fieldsr   r   r   r   r	   r
   r   r   Zscapy.packetr   Zscapy.layers.tls.certr   Zscapy.layers.tls.basefieldsr   r   Zscapy.layers.tls.handshaker   Zscapy.layers.tls.keyexchanger   r   Zscapy.layers.tls.sessionr   r   r   Zscapy.layers.tls.crypto.suitesr   r   r   r   r7   r%   r;   r9   r<   rZ   rn   ry   r‡   r‰   rŒ   r¨   r³   rµ   r½   r¾   Z_sslv2_handshake_clsr*   r*   r*   r+   Ú<module>   sR   (
üÿ#-
 ?ü