a
    kÄ#dãÏ  ã                   @   sä  d Z ddlmZ ddlZddlZddlZddlZddl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mZ ddlmZ ddlmZ ddlmZ ddl m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& ddl'm(Z(m)Z)m*Z*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z? ddl@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZH ddlImJZJmKZKmLZL ddlMmNZN ddlOmPZP ddlQmRZRmSZS ejT�rÐddlUmVZV ddlWmXZX G dd„ deƒZYdS )aB  
TLS server automaton. This makes for a primitive TLS stack.
Obviously you need rights for network access.

We support versions SSLv2 to TLS 1.3, along with many features.

In order to run a server listening on tcp/4433:
> from scapy.all import *
> t = TLSServerAutomaton(mycert='<cert.pem>', mykey='<key.pem>')
> t.run()
é    )Úprint_functionN)Úconf)ÚRaw)Ú	inet_pton)Úget_temp_fileÚ
randstringÚrepr_hex)ÚATMT)Úwarning)Ú_TLSAutomaton)Ú
PrivKeyRSAÚPrivKeyECDSA)Ú_tls_version)Ú
tlsSession)Ú_tls_named_groups)ÚTLS_Ext_SupportedVersion_SHÚTLS_Ext_SupportedGroupsÚTLS_Ext_CookieÚTLS_Ext_SignatureAlgorithmsÚTLS_Ext_PSKKeyExchangeModesÚ!TLS_Ext_EarlyDataIndicationTicket)ÚTLS_Ext_KeyShare_SHÚKeyShareEntryÚTLS_Ext_KeyShare_HRRÚTLS_Ext_PreSharedKey_CHÚTLS_Ext_PreSharedKey_SH)ÚTLSCertificateÚTLSCertificateRequestÚTLSCertificateVerifyÚTLSClientHelloÚTLSClientKeyExchangeÚTLSFinishedÚTLSServerHelloÚTLSServerHelloDoneÚTLSServerKeyExchangeÚ_ASN1CertAndExtÚTLS13ServerHelloÚTLS13CertificateÚTLS13ClientHelloÚTLSEncryptedExtensionsÚTLS13HelloRetryRequestÚTLS13CertificateRequestÚTLS13KeyUpdateÚTLS13NewSessionTicket)ÚSSLv2ClientCertificateÚSSLv2ClientFinishedÚSSLv2ClientHelloÚSSLv2ClientMasterKeyÚSSLv2RequestCertificateÚSSLv2ServerFinishedÚSSLv2ServerHelloÚSSLv2ServerVerify)ÚTLSAlertÚTLSChangeCipherSpecÚTLSApplicationData)ÚTLS13)Ú
TLS13_HKDF)Ú_tls_cipher_suites_clsÚget_usable_ciphersuites)Údefault_backend)Úhashesc                       sh  e Zd ZdZ�dJ‡ fdd	„	Zd
d„ Zdd„ Zejdd�dd„ ƒZ	e ¡ dd„ ƒZ
e ¡ dd„ ƒZe ¡ dd„ ƒZe ¡ dd„ ƒZe ¡ dd„ ƒZe ¡ dd„ ƒZejedd�dd „ ƒZejed!d�d"d#„ ƒZe ¡ d$d%„ ƒZe ¡ d&d'„ ƒZejed(d�d)d*„ ƒZejdd+�d,d-„ ƒZe ¡ d.d/„ ƒZe e¡d0d1„ ƒZe ¡ d2d3„ ƒZe e¡d4d5„ ƒZe ¡ d6d7„ ƒZe e¡d8d9„ ƒZe ¡ d:d;„ ƒZe e¡d<d=„ ƒZe ¡ d>d?„ ƒZe e¡d@dA„ ƒZ e ¡ dBdC„ ƒZ!e e!¡dDdE„ ƒZ"e ¡ dFdG„ ƒZ#e ¡ dHdI„ ƒZ$eje$dd�dJdK„ ƒZ%eje$d!d�dLdM„ ƒZ&e ¡ dNdO„ ƒZ'e ¡ dPdQ„ ƒZ(eje(dd�dRdS„ ƒZ)e ¡ dTdU„ ƒZ*eje(d!d�dVdW„ ƒZ+e ¡ dXdY„ ƒZ,eje(d(d�dZd[„ ƒZ-e ¡ d\d]„ ƒZ.eje*dd�d^d_„ ƒZ/eje*d!d�d`da„ ƒZ0e ¡ dbdc„ ƒZ1e ¡ ddde„ ƒZ2eje2dd�dfdg„ ƒZ3e ¡ dhdi„ ƒZ4eje2d!d�djdk„ ƒZ5e ¡ dldm„ ƒZ6eje2d(d�dndo„ ƒZ7e ¡ dpdq„ ƒZ8eje4dd�drds„ ƒZ9e ¡ dtdu„ ƒZ:eje4d!d�dvdw„ ƒZ;e ¡ dxdy„ ƒZ<eje4d(d�dzd{„ ƒZ=e ¡ d|d}„ ƒZ>e ¡ d~d„ ƒZ?e e?¡d€d�„ ƒZ@e ¡ d‚dƒ„ ƒZAe eA¡d„d…„ ƒZBe ¡ d†d‡„ ƒZCe eC¡dˆd‰„ ƒZDe ¡ dŠd‹„ ƒZEe ¡ dŒd�„ ƒZFe ¡ dŽd�„ ƒZGe eG¡d�d‘„ ƒZHe ¡ d’d“„ ƒZIe eI¡d”d•„ ƒZJe ¡ d–d—„ ƒZKd˜d™„ ZLe eK¡dšd›„ ƒZMe ¡ dœd�„ ƒZNe eN¡dždŸ„ ƒZOe ¡ d d¡„ ƒZPe eP¡d¢d£„ ƒZQe ¡ d¤d¥„ ƒZRe eR¡d¦d§„ ƒZSe ¡ d¨d©„ ƒZTe eT¡dªd«„ ƒZUe ¡ d¬d­„ ƒZVe eV¡d®d¯„ ƒZWe ¡ d°d±„ ƒZXe eX¡d²d³„ ƒZYe ¡ d´dµ„ ƒZZe ¡ d¶d·„ ƒZ[eje[dd�d¸d¹„ ƒZ\eje[d!d�dºd»„ ƒZ]e ¡ d¼d½„ ƒZ^eje[d(d�d¾d¿„ ƒZ_eje[dÀd�dÁdÂ„ ƒZ`e ¡ dÃdÄ„ ƒZae ea¡dÅdÆ„ ƒZbejead!d�dÇdÈ„ ƒZce ¡ dÉdÊ„ ƒZde ed¡dËdÌ„ ƒZee ¡ dÍdÎ„ ƒZfe ¡ dÏdÐ„ ƒZge ¡ dÑdÒ„ ƒZhe ¡ dÓdÔ„ ƒZidÕdÖ„ Zje ei¡d×dØ„ ƒZke ¡ dÙdÚ„ ƒZle ¡ dÛdÜ„ ƒZme em¡dÝdÞ„ ƒZne ¡ dßdà„ ƒZoe ¡ dádâ„ ƒZpe ep¡dãdä„ ƒZqe ¡ dådæ„ ƒZre er¡dçdè„ ƒZsejed!d�dédê„ ƒZte ¡ dëdì„ ƒZue eu¡dídî„ ƒZve ¡ dïdð„ ƒZwe ew¡dñdò„ ƒZxe ¡ dódô„ ƒZye ¡ dõdö„ ƒZze ¡ d÷dø„ ƒZ{eje{dd�dùdú„ ƒZ|eje{d!d�dûdü„ ƒZ}e ¡ dýdþ„ ƒZ~e ¡ dÿ�d „ ƒZe ¡ �d�d„ ƒZ€eje€dd��d�d„ ƒZ�e ¡ �d�d„ ƒZ‚eje‚dd��d�d„ ƒZƒeje€d!d��d	�d
„ ƒZ„eje€d(d��d�d„ ƒZ…e ¡ �d�d„ ƒZ†e ¡ �d�d„ ƒZ‡e e‡¡�d�d„ ƒZˆe ¡ �d�d„ ƒZ‰eje‚d!d��d�d„ ƒZŠe ¡ �d�d„ ƒZ‹e e‹¡�d�d„ ƒZŒe ¡ �d�d„ ƒZ�e ¡ �d�d„ ƒZŽe ¡ �d�d „ ƒZ�eje�dd��d!�d"„ ƒZ�eje�d!d��d#�d$„ ƒZ‘e ¡ �d%�d&„ ƒZ’e ¡ �d'�d(„ ƒZ“eje‚d(d��d)�d*„ ƒZ”e ¡ �d+�d,„ ƒZ•e e•¡�d-�d.„ ƒZ–e ¡ �d/�d0„ ƒZ—e ¡ �d1�d2„ ƒZ˜e ¡ �d3�d4„ ƒZ™e e™¡�d5�d6„ ƒZše ¡ �d7�d8„ ƒZ›e ¡ �d9�d:„ ƒZœe eœ¡�d;�d<„ ƒZ�e ¡ �d=�d>„ ƒZže ¡ �d?�d@„ ƒZŸe eŸ¡�dA�dB„ ƒZ e ¡ �dC�dD„ ƒZ¡e e¡¡�dE�dF„ ƒZ¢ejdd�dG��dH�dI„ ƒZ£‡  Z¤S (K  ÚTLSServerAutomatonaš  
    A simple TLS test server automaton. Try to overload some states or
    conditions and see what happens on the other side.

    Because of socket and automaton limitations, for now, the best way to
    interrupt the server is by sending him 'stop_server'. Interruptions with
    Ctrl-Z should work, but this might leave a loose listening socket behind.

    In case the server receives a TLSAlert (whatever its type), or a 'goodbye'
    message in a SSLv2 version, he will close the client session with a
    similar message, and start waiting for new client connections.

    _'mycert' and 'mykey' may be provided as filenames. They are needed for any
    server authenticated handshake.
    _'preferred_ciphersuite' allows the automaton to choose a cipher suite when
    offered in the ClientHello. If absent, another one will be chosen.
    _'client_auth' means the client has to provide a certificate.
    _'is_echo_server' means that everything received will be sent back.
    _'max_client_idle_time' is the maximum silence duration from the client.
    Once this limit has been reached, the client (if still here) is dropped,
    and we wait for a new connection.
    ú	127.0.0.1éQ  NFTé<   c                    s.  t t| ƒjf ||dœ|¤Ž z2d|v r4ttj|ƒ nttj|ƒ t ||¡}W n$ tyr   t t 	|¡|¡}Y n0 d | _
|d d | _|d d d | _|| _d | _d | _|| _|| _|| _|| _d | _|| _|| _|| _|	d u rì|
d u}	|	rú|
pøtƒ }
|	| _|
| _t ¡ D ]\}}||k�r|| _�qd S )N)ÚmycertÚmykeyú:r   é   )Úsuperr?   Ú
parse_argsr   ÚsocketÚAF_INET6ÚAF_INETÚgetaddrinfoÚ	ExceptionÚgetfqdnÚserversocketÚ	ip_familyÚlocal_ipÚ
local_portÚ	remote_ipÚremote_portÚpreferred_ciphersuiteÚclient_authÚis_echo_serverÚmax_client_idle_timeÚcurveÚcookieÚ
psk_secretÚpsk_moder   Úhandle_session_ticketÚsession_ticket_filer   Úitems)ÚselfÚserverZsportrC   rD   rU   rV   rW   rX   r]   r^   rY   rZ   Zpskr\   ZkargsÚtmpZgroup_idÚng©Ú	__class__© úU/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/tls/automaton_srv.pyrH   Z   sF    ÿþ

zTLSServerAutomaton.parse_argsc                 C   s®   | j rª| j}t|j }|  d| ¡ |jjj}|  d| ¡ |jdk rN|j}n|j	}|  dt
|ƒ ¡ |jr||  d|j ¡ |jdkr¢|jd }|  dt
|ƒ ¡ |  ¡  d S )NzVersion       : %szCipher suite  : %sé  zMaster secret : %szClient certificate chain: %rÚresumption_secretzResumption master secret : %s)ÚverboseÚcur_sessionr   Útls_versionÚvprintÚwcsÚciphersuiteÚnameÚmaster_secretÚtls13_master_secretr   Zclient_certsÚtls13_derived_secrets)r`   ÚsÚvÚcsÚmsZ
res_secretrf   rf   rg   Úvprint_sessioninfo�   s$    




ÿz%TLSServerAutomaton.vprint_sessioninfoc                 C   sÊ   d}|d7 }|d7 }|d7 }d}|d7 }|d| j | jf 7 }|d| j| jf 7 }t| jj }|d	| 7 }| jjjj	}|d
| 7 }| jjdk r–| jj
}n| jj}|dt|ƒ 7 }d| }|| t|ƒ }|S )NzHTTP/1.1 200 OK
zServer: Scapy TLS Extension
zContent-type: text/html
zContent-length: %d

z(----- Scapy TLS Server Automaton -----

z%Information on current TLS session:

zLocal end     : %s:%d
zRemote end    : %s:%d
zVersion       : %s
zCipher suite  : %s
rh   zMaster secret : %s
z+<html><body><pre>%s</pre></body></html>

)rQ   rR   rS   rT   r   rk   rl   rn   ro   rp   rq   rr   r   Úlen)r`   Úheaderrt   ru   rv   rw   ÚbodyZanswerrf   rf   rg   Úhttp_sessioninfo¢   s&    
z#TLSServerAutomaton.http_sessioninfo)Úinitialc                 C   s*   |   d¡ |   d¡ |   d¡ |  ¡ ‚d S )NzStarting TLS server automaton.z3Receiving 'stop_server' will cause a graceful exit.z<Interrupting with Ctrl-Z might leave a loose socket hanging.)rm   ÚBIND©r`   rf   rf   rg   ÚINITIAL¹   s    


zTLSServerAutomaton.INITIALc              
   C   s¸   t   | jt j¡}|| _| t jt jd¡ z | | j| j	f¡ | 
d¡ W nb tyª } zJd| j| j	|f }|  ¡  |  |¡ |  d¡ |  ¡  |  ¡ ‚W Y d }~n
d }~0 0 |  ¡ ‚d S )Né   zUnable to bind on %s:%d! (%s)z-Maybe some server is already listening there?)rI   rP   ÚSOCK_STREAMrO   Ú
setsockoptÚ
SOL_SOCKETÚSO_REUSEADDRÚbindrQ   rR   ÚlistenrM   rm   ÚFINALÚWAITING_CLIENT)r`   rt   ÚeÚmrf   rf   rg   r~   À   s$    ý

zTLSServerAutomaton.BINDc                 C   s   |   ¡ ‚d S ©N)r‰   r   rf   rf   rg   ÚSOCKET_CLOSEDÕ   s    z TLSServerAutomaton.SOCKET_CLOSEDc                 C   s    g | _ g | _|  ¡  |  d| j| jf ¡ | j ¡ \| _}t|t	ƒsN| j 
¡ }t|ƒdkrj|d |d f}|\| _| _|  d| j| jf ¡ |  ¡  |  ¡ ‚d S )Nz!Waiting for a new client on %s:%dé   r   r�   zAccepted connection from %s:%d)Ú
buffer_outÚ	buffer_inrm   rQ   rR   rO   ÚacceptrI   Ú
isinstanceÚtupleÚgetpeernamery   rS   rT   ÚINIT_TLS_SESSION)r`   Úaddrrf   rf   rg   r‰   Ù   s"    
ÿ


ÿz!TLSServerAutomaton.WAITING_CLIENTc                 C   sD   t dd�| _| jg| j_| j| j_t| jtƒr8| j| j_|  	¡ ‚dS )zñ
        XXX We should offer the right key according to the client's suites. For
        now server_rsa_key is only used for RSAkx, but we should try to replace
        every server_key with both server_rsa_key and server_ecdsa_key.
        ra   )Zconnection_endN)
r   rk   rC   Úserver_certsrD   Z
server_keyr’   r   Zserver_rsa_keyÚWAITING_CLIENTFLIGHT1r   rf   rf   rg   r•   ë   s    

z#TLSServerAutomaton.INIT_TLS_SESSIONc                 C   s   |   ¡  |  ¡ ‚d S rŒ   )Úget_next_msgÚRECEIVED_CLIENTFLIGHT1r   rf   rf   rg   r˜   û   s    z(TLSServerAutomaton.WAITING_CLIENTFLIGHT1c                 C   s   d S rŒ   rf   r   rf   rf   rg   rš      s    z)TLSServerAutomaton.RECEIVED_CLIENTFLIGHT1r�   )Úprioc                 C   s   |   t| j¡ d S rŒ   )Úraise_on_packetr(   Útls13_HANDLED_CLIENTHELLOr   rf   rf   rg   Útls13_should_handle_ClientHello  s    ÿz2TLSServerAutomaton.tls13_should_handle_ClientHellorŽ   c                 C   s   |   t| j¡ d S rŒ   )rœ   r   ÚHANDLED_CLIENTHELLOr   rf   rf   rg   Úshould_handle_ClientHello  s    ÿz,TLSServerAutomaton.should_handle_ClientHelloc                 C   sD   t | jtƒrd}nt | jtƒr"d}t| jj|ƒr8|  ¡ ‚|  ¡ ‚dS )zT
        We extract cipher suites candidates from the client's proposition.
        ÚRSAÚECDSAN)	r’   rD   r   r   r<   Úcur_pktÚciphersÚPREPARE_SERVERFLIGHT1ÚNO_USABLE_CIPHERSUITE)r`   Úkxrf   rf   rg   rŸ     s    z&TLSServerAutomaton.HANDLED_CLIENTHELLOc                 C   s   |   d¡ |  ¡ ‚d S )NzNo usable cipher suite!©rm   ÚCLOSE_NOTIFYr   rf   rf   rg   r¦     s    
z(TLSServerAutomaton.NO_USABLE_CIPHERSUITEé   c                 C   s   |   ¡ ‚d S rŒ   )ÚMISSING_CLIENTHELLOr   rf   rf   rg   Úmissing_ClientHello"  s    z&TLSServerAutomaton.missing_ClientHello)Úfinalc                 C   s   |   d¡ |  ¡ ‚d S )NzMissing ClientHello message!r¨   r   rf   rf   rg   r«   &  s    
z&TLSServerAutomaton.MISSING_CLIENTHELLOc                 C   s   |   ¡  d S rŒ   ©Ú
add_recordr   rf   rf   rg   r¥   +  s    z(TLSServerAutomaton.PREPARE_SERVERFLIGHT1c                 C   sd   t | jtƒrd}nt | jtƒr"d}t| jj|ƒ}|d }| j|v rH| j}|  t	|d�¡ |  
¡ ‚dS )z©
        Selecting a cipher suite should be no trouble as we already caught
        the None case previously.

        Also, we do not manage extensions at all.
        r¡   r¢   r   )ÚcipherN)r’   rD   r   r   r<   r£   r¤   rU   Úadd_msgr"   ÚADDED_SERVERHELLO)r`   r§   Úusable_suitesÚcrf   rf   rg   Úshould_add_ServerHello/  s    
z)TLSServerAutomaton.should_add_ServerHelloc                 C   s   d S rŒ   rf   r   rf   rf   rg   r²   B  s    z$TLSServerAutomaton.ADDED_SERVERHELLOc                 C   s>   | j d jd j}t| jjs2|  t| jj	d�¡ |  
¡ ‚d S )Néÿÿÿÿr   ©Úcerts)r�   Úmsgr°   r;   Úkx_algZ	anonymousr±   r   rk   r—   ÚADDED_CERTIFICATE©r`   r´   rf   rf   rg   Úshould_add_CertificateF  s    z)TLSServerAutomaton.should_add_Certificatec                 C   s   d S rŒ   rf   r   rf   rf   rg   r»   M  s    z$TLSServerAutomaton.ADDED_CERTIFICATEc                 C   s6   | j d jd j}t| jjs*|  tƒ ¡ |  ¡ ‚d S )Nr¶   r   )	r�   r¹   r°   r;   rº   Zno_sker±   r$   ÚADDED_SERVERKEYEXCHANGEr¼   rf   rf   rg   Úshould_add_ServerKeyExchangeQ  s    z/TLSServerAutomaton.should_add_ServerKeyExchangec                 C   s   d S rŒ   rf   r   rf   rf   rg   r¾   X  s    z*TLSServerAutomaton.ADDED_SERVERKEYEXCHANGEc                 C   s   | j r|  tƒ ¡ |  ¡ ‚d S rŒ   )rV   r±   r   ÚADDED_CERTIFICATEREQUESTr   rf   rf   rg   Úshould_add_CertificateRequest\  s    z0TLSServerAutomaton.should_add_CertificateRequestc                 C   s   d S rŒ   rf   r   rf   rf   rg   rÀ   b  s    z+TLSServerAutomaton.ADDED_CERTIFICATEREQUESTc                 C   s   |   tƒ ¡ |  ¡ ‚d S rŒ   )r±   r#   ÚADDED_SERVERHELLODONEr   rf   rf   rg   Úshould_add_ServerHelloDonef  s    z-TLSServerAutomaton.should_add_ServerHelloDonec                 C   s   d S rŒ   rf   r   rf   rf   rg   rÂ   k  s    z(TLSServerAutomaton.ADDED_SERVERHELLODONEc                 C   s   |   ¡  |  ¡ ‚d S rŒ   )Úflush_recordsÚWAITING_CLIENTFLIGHT2r   rf   rf   rg   Úshould_send_ServerFlight1o  s    z,TLSServerAutomaton.should_send_ServerFlight1c                 C   s   |   ¡  |  ¡ ‚d S rŒ   )r™   ÚRECEIVED_CLIENTFLIGHT2r   rf   rf   rg   rÅ   t  s    z(TLSServerAutomaton.WAITING_CLIENTFLIGHT2c                 C   s   d S rŒ   rf   r   rf   rf   rg   rÇ   y  s    z)TLSServerAutomaton.RECEIVED_CLIENTFLIGHT2c                 C   s   |   t| j¡ d S rŒ   )rœ   r   ÚHANDLED_CLIENTCERTIFICATEr   rf   rf   rg   Úshould_handle_ClientCertificate}  s    ÿz2TLSServerAutomaton.should_handle_ClientCertificatec                 C   s   | j r|  ¡ ‚|  ¡ ‚d S rŒ   )rV   ÚMISSING_CLIENTCERTIFICATErÈ   r   rf   rf   rg   Úno_ClientCertificate‚  s    z'TLSServerAutomaton.no_ClientCertificatec                 C   s   |   d¡ |  ¡ ‚d S )NúMissing ClientCertificate!r¨   r   rf   rf   rg   rÊ   ˆ  s    
z,TLSServerAutomaton.MISSING_CLIENTCERTIFICATEc                 C   s   | j r|  d¡ d S )Nú$Received client certificate chain...)rV   rm   r   rf   rf   rg   rÈ   �  s    z,TLSServerAutomaton.HANDLED_CLIENTCERTIFICATEc                 C   s   |   t| j¡ d S rŒ   )rœ   r    ÚHANDLED_CLIENTKEYEXCHANGEr   rf   rf   rg   Úshould_handle_ClientKeyExchange’  s    ÿz2TLSServerAutomaton.should_handle_ClientKeyExchangec                 C   s   d S rŒ   rf   r   rf   rf   rg   rÎ   —  s    z,TLSServerAutomaton.HANDLED_CLIENTKEYEXCHANGEc                 C   s   |   t| j¡ d S rŒ   )rœ   r6   Ú$HANDLED_ALERT_FROM_CLIENTCERTIFICATEr   rf   rf   rg   Ú*should_handle_Alert_from_ClientCertificate›  s    ÿz=TLSServerAutomaton.should_handle_Alert_from_ClientCertificatec                 C   s&   |   d¡ |   | j ¡ ¡ |  ¡ ‚d S ©Nz4Received Alert message instead of ClientKeyExchange!©rm   r£   Z	mysummaryr©   r   rf   rf   rg   rÐ      s    
z7TLSServerAutomaton.HANDLED_ALERT_FROM_CLIENTCERTIFICATEc                 C   s   |   ¡ ‚d S rŒ   )ÚMISSING_CLIENTKEYEXCHANGEr   rf   rf   rg   Úmissing_ClientKeyExchange¦  s    z,TLSServerAutomaton.missing_ClientKeyExchangec                 C   s   |   d¡ |  ¡ ‚d S )NzMissing ClientKeyExchange!r¨   r   rf   rf   rg   rÔ   ª  s    
z,TLSServerAutomaton.MISSING_CLIENTKEYEXCHANGEc                 C   s   |   t| j¡ d S rŒ   )rœ   r   ÚHANDLED_CERTIFICATEVERIFYr   rf   rf   rg   Úshould_handle_CertificateVerify¯  s    ÿz2TLSServerAutomaton.should_handle_CertificateVerifyc                 C   s   | j r|  ¡ ‚|  ¡ ‚d S rŒ   )rV   ÚMISSING_CERTIFICATEVERIFYrÖ   r   rf   rf   rg   Úno_CertificateVerify´  s    z'TLSServerAutomaton.no_CertificateVerifyc                 C   s   |   d¡ |  ¡ ‚d S )NzMissing CertificateVerify!r¨   r   rf   rf   rg   rØ   º  s    
z,TLSServerAutomaton.MISSING_CERTIFICATEVERIFYc                 C   s   d S rŒ   rf   r   rf   rf   rg   rÖ   ¿  s    z,TLSServerAutomaton.HANDLED_CERTIFICATEVERIFYc                 C   s   |   t| j¡ d S rŒ   )rœ   r7   ÚHANDLED_CHANGECIPHERSPECr   rf   rf   rg   Úshould_handle_ChangeCipherSpecÃ  s    ÿz1TLSServerAutomaton.should_handle_ChangeCipherSpecc                 C   s   d S rŒ   rf   r   rf   rf   rg   rÚ   È  s    z+TLSServerAutomaton.HANDLED_CHANGECIPHERSPECc                 C   s   |   t| j¡ d S rŒ   )rœ   r6   Ú$HANDLED_ALERT_FROM_CLIENTKEYEXCHANGEr   rf   rf   rg   Ú*should_handle_Alert_from_ClientKeyExchangeÌ  s    ÿz=TLSServerAutomaton.should_handle_Alert_from_ClientKeyExchangec                 C   s&   |   d¡ |   | j ¡ ¡ |  ¡ ‚d S )Nz3Received Alert message instead of ChangeCipherSpec!rÓ   r   rf   rf   rg   rÜ   Ñ  s    
z7TLSServerAutomaton.HANDLED_ALERT_FROM_CLIENTKEYEXCHANGEc                 C   s   |   ¡ ‚d S rŒ   )ÚMISSING_CHANGECIPHERSPECr   rf   rf   rg   Úmissing_ChangeCipherSpec×  s    z+TLSServerAutomaton.missing_ChangeCipherSpecc                 C   s   |   d¡ |  ¡ ‚d S )NzMissing ChangeCipherSpec!r¨   r   rf   rf   rg   rÞ   Û  s    
z+TLSServerAutomaton.MISSING_CHANGECIPHERSPECc                 C   s   |   t| j¡ d S rŒ   )rœ   r!   ÚHANDLED_CLIENTFINISHEDr   rf   rf   rg   Úshould_handle_ClientFinishedà  s    ÿz/TLSServerAutomaton.should_handle_ClientFinishedc                 C   s   |   ¡ ‚d S rŒ   )ÚPREPARE_SERVERFLIGHT2r   rf   rf   rg   rà   å  s    z)TLSServerAutomaton.HANDLED_CLIENTFINISHEDc                 C   s   |   t| j¡ d S rŒ   )rœ   r6   Ú#HANDLED_ALERT_FROM_CHANGECIPHERSPECr   rf   rf   rg   Ú'should_handle_Alert_from_ClientFinishedé  s    ÿz:TLSServerAutomaton.should_handle_Alert_from_ClientFinishedc                 C   s   |   d¡ |  ¡ ‚d S )Nz+Received Alert message instead of Finished!r¨   r   rf   rf   rg   rã   î  s    
z6TLSServerAutomaton.HANDLED_ALERT_FROM_CHANGECIPHERSPECc                 C   s   |   ¡ ‚d S rŒ   )ÚMISSING_CLIENTFINISHEDr   rf   rf   rg   Úmissing_ClientFinishedó  s    z)TLSServerAutomaton.missing_ClientFinishedc                 C   s   |   d¡ |  ¡ ‚d S )NzMissing Finished!r¨   r   rf   rf   rg   rå   ÷  s    
z)TLSServerAutomaton.MISSING_CLIENTFINISHEDc                 C   s   |   ¡  d S rŒ   r®   r   rf   rf   rg   râ   ü  s    z(TLSServerAutomaton.PREPARE_SERVERFLIGHT2c                 C   s   |   tƒ ¡ |  ¡ ‚d S rŒ   )r±   r7   ÚADDED_CHANGECIPHERSPECr   rf   rf   rg   Úshould_add_ChangeCipherSpec   s    z.TLSServerAutomaton.should_add_ChangeCipherSpecc                 C   s   d S rŒ   rf   r   rf   rf   rg   rç     s    z)TLSServerAutomaton.ADDED_CHANGECIPHERSPECc                 C   s    |   ¡  |  tƒ ¡ |  ¡ ‚d S rŒ   )r¯   r±   r!   ÚADDED_SERVERFINISHEDr   rf   rf   rg   Úshould_add_ServerFinished	  s    z,TLSServerAutomaton.should_add_ServerFinishedc                 C   s   d S rŒ   rf   r   rf   rf   rg   ré     s    z'TLSServerAutomaton.ADDED_SERVERFINISHEDc                 C   s   |   ¡  |  ¡ ‚d S rŒ   )rÄ   ÚSENT_SERVERFLIGHT2r   rf   rf   rg   Úshould_send_ServerFlight2  s    z,TLSServerAutomaton.should_send_ServerFlight2c                 C   s.   |   d¡ |  ¡  | jr"|   d¡ |  ¡ ‚d S ©NzTLS handshake completed!ú%Will now act as a simple echo server.©rm   rx   rW   ÚWAITING_CLIENTDATAr   rf   rf   rg   rë     s
    

z%TLSServerAutomaton.SENT_SERVERFLIGHT2c                 C   s\   | j }|jd }| jrPt| j |jvrP|jD ]"}t|tƒr,| j|jv r,|  	¡ ‚q,|  
¡ ‚dS )zn
          Check if we have to send an HelloRetryRequest
          XXX check also with non ECC groups
        r¶   N)rk   Úhandshake_messages_parsedrY   r   Útls13_client_pubsharesÚextr’   r   ÚgroupsÚtls13_PREPARE_HELLORETRYREQUESTÚtls13_PREPARE_SERVERFLIGHT1)r`   rt   r‹   rŠ   rf   rf   rg   r�   #  s    



z,TLSServerAutomaton.tls13_HANDLED_CLIENTHELLOc                 C   s   d S rŒ   rf   r   rf   rf   rg   rõ   9  s    z2TLSServerAutomaton.tls13_PREPARE_HELLORETRYREQUESTc                 C   s˜   | j dd� t| jtƒrd}nt| jtƒr.d}t| jj|ƒ}|d }tdd�t	t
| j d�g}| jrn|tƒ 7 }t||d	�}|  |¡ |  ¡  |  ¡ ‚d S )
NF©Zis_tls13r¡   r¢   r   úTLS 1.3©Úversion)Zselected_group©r°   ró   )r¯   r’   rD   r   r   r<   r£   r¤   r   r   r   rY   rZ   r   r*   r±   rÄ   Útls13_HANDLED_HELLORETRYREQUEST)r`   r§   r³   r´   ró   Úprf   rf   rg   Ú"tls13_should_add_HelloRetryRequest=  s     ÿ

z5TLSServerAutomaton.tls13_should_add_HelloRetryRequestc                 C   s   d S rŒ   rf   r   rf   rf   rg   rü   O  s    z2TLSServerAutomaton.tls13_HANDLED_HELLORETRYREQUESTc                 C   s   |   ¡ ‚d S rŒ   )r˜   r   rf   rf   rg   Ú%tls13_should_add_ServerHello_from_HRRS  s    z8TLSServerAutomaton.tls13_should_add_ServerHello_from_HRRc                 C   s   | j dd� d S )NFr÷   r®   r   rf   rf   rg   rö   W  s    z.TLSServerAutomaton.tls13_PREPARE_SERVERFLIGHT1c                 C   sÜ  t | jdƒ��®}|D �]–}| ¡  d¡}t|ƒdk r6qt |d ¡}t |d ¡}t |d ¡}	t d|	¡d }
t |d ¡}	t d|	¡d }t |d	 ¡}	t d|	¡d }t |d
 ¡}t |d ¡}	t d|	¡d }t |d ¡}	t d|	¡d }| 	¡ |kr|  
d¡ |tv�r"td|ƒ nt| }t|jj ¡ ƒ}|jj}| |d||¡}tt ¡ | ƒ}|| d }| j}|j�r2t dd¡}|t dd¡7 }|t dd¡7 }|t d|¡7 }tj|jtƒ d�}| |jd ¡ || ¡ 7 }|jdd… D ]:}tt ƒ�stt!ƒ�r$||d| d … 7 }n||7 }�qôn|jd d| d … }| "d|¡}| #|dd¡}| $||¡}||
k r||kr|  
d¡ || _%|| _&|  W  d  ƒ S qW d  ƒ n1 �sÄ0    Y  |  
d¡ dS )a%  
        This function verifies the binder received in the 'pre_shared_key'
        extension and return the resumption PSK associated with those
        values.

        The arguments psk_identity, obfuscated_age and binder are taken
        from 'pre_shared_key' in the ClientHello.
        Úrbó   ;é   r   r�   rŽ   ú!Irª   rF   é   é   ú!Hé   zTicket found in database !zUnknown cipher suite %ds
   resumptionl   ÿÿ ÚBéþ   )ÚbackendNs
   res binderó    zTicket has been accepted ! z?Ticket has not been accepted ! Fallback to a complete handshake)'Úopenr^   ÚstripÚsplitry   ÚbinasciiÚ	unhexlifyÚstructÚunpackÚ	__bytes__rm   r;   r
   r:   Zhash_algrp   ÚlowerÚhashÚdigest_sizeZexpand_labelÚintÚtimerk   Ztls13_retryÚpackr>   ZHashr=   ÚupdateZhandshake_messagesÚfinalizer’   r(   r   ÚextractZderive_secretZcompute_verify_dataÚmax_early_data_sizeZresumed_ciphersuite)r`   Úpsk_identityÚobfuscated_ageÚbinderÚfÚlinert   Zticket_labelÚticket_noncerb   Úticket_lifetimeÚticket_age_addZticket_start_timeri   Zres_ciphersuiter  Zcs_clsZhkdfZhash_lenÚtls13_psk_secretZagesecZ
ticket_ageZhandshake_contextÚdigestr‹   Ztls13_early_secretZ
binder_keyZcomputed_binderrf   rf   rg   Úverify_psk_binder[  s‚    	


ý
ÿþÿÿ
8
z$TLSServerAutomaton.verify_psk_binderc                 C   sþ  d }d }d }t | jjƒD ]h}t|ttfƒr|jD ]N}t|tƒrj|jd j	}|jd j
}|jd j}|dk}t|tƒr0|jd }q0qt| jtƒr”d}nt| jtƒr¤d}t| jj|ƒ}	|	d }
tt| jjƒƒ}tdd�g}|�r¦|�r¦|�r¦| j}|�r4t | j¡|_|dk�r$t|d�}|t|d�7 }|tdd	�7 }np|   |||¡}|d u �rht|d�}|t|d�g7 }n<|dk�rŒt|d�}|t|d�g7 }|tdd	�g7 }|| j_n|tt|d�d�7 }| jj!d u�rÜt"|
| jj!|d
�}nt"|
|d�}|  #|¡ |  $¡ ‚d S )Nr   r¡   r¢   rø   rù   r�   )Úgroup)Zserver_share)Zselected_identity)r°   Úsidró   rû   )%Úreversedrk   rñ   r’   r(   r   ró   r   Z
identitiesÚidentityZobfuscated_ticket_ageZbindersr   r   ZkxmodesrD   r   r   r<   r£   r¤   ÚnextÚiterrò   r   r  r  r[   r&  r   r   r   r(  r*  r&   r±   Útls13_ADDED_SERVERHELLO)r`   r  Zpsk_key_exchange_moder  r‹   rŠ   r   Zis_out_of_band_pskr§   r³   r´   r)  ró   rt   Z
server_kseZresumption_pskrý   rf   rf   rg   Útls13_should_add_ServerHelloµ  s^    




þ





z/TLSServerAutomaton.tls13_should_add_ServerHelloc                 C   s(   | j jd ur$| jdd� |  tƒ ¡ d S )NT)Zis_tls12)rk   r*  r¯   r±   r7   r   rf   rf   rg   r/  ý  s    z*TLSServerAutomaton.tls13_ADDED_SERVERHELLOc                 C   s(   | j dd� |  tdd�¡ |  ¡ ‚d S )NTr÷   r   )Úextlen)r¯   r±   r)   Útls13_ADDED_ENCRYPTEDEXTENSIONSr   rf   rf   rg   Ú$tls13_should_add_EncryptedExtensions  s    z7TLSServerAutomaton.tls13_should_add_EncryptedExtensionsc                 C   s   d S rŒ   rf   r   rf   rf   rg   r2    s    z2TLSServerAutomaton.tls13_ADDED_ENCRYPTEDEXTENSIONSc                 C   s4   | j r(tdgd�g}t|d�}|  |¡ |  ¡ ‚d S )Nzsha256+rsaepss)Zsig_algs©ró   )rV   r   r+   r±   Útls13_ADDED_CERTIFICATEREQUEST)r`   ró   rý   rf   rf   rg   Ú#tls13_should_add_CertificateRequest  s
    

z6TLSServerAutomaton.tls13_should_add_CertificateRequestc                 C   s   d S rŒ   rf   r   rf   rf   rg   r5    s    z1TLSServerAutomaton.tls13_ADDED_CERTIFICATEREQUESTc                 C   sD   | j js8g }| j jD ]}|t|d�7 }q|  t|d�¡ |  ¡ ‚d S )N)Úcertr·   )rk   r&  r—   r%   r±   r'   Útls13_ADDED_CERTIFICATE)r`   r¸   r´   rf   rf   rg   Útls13_should_add_Certificate  s    z/TLSServerAutomaton.tls13_should_add_Certificatec                 C   s   d S rŒ   rf   r   rf   rf   rg   r8  *  s    z*TLSServerAutomaton.tls13_ADDED_CERTIFICATEc                 C   s    | j js|  tƒ ¡ |  ¡ ‚d S rŒ   )rk   r&  r±   r   Útls13_ADDED_CERTIFICATEVERIFYr   rf   rf   rg   Ú#tls13_should_add_CertificateVerifiy.  s    z6TLSServerAutomaton.tls13_should_add_CertificateVerifiyc                 C   s   d S rŒ   rf   r   rf   rf   rg   r:  4  s    z0TLSServerAutomaton.tls13_ADDED_CERTIFICATEVERIFYc                 C   s   |   tƒ ¡ |  ¡ ‚d S rŒ   )r±   r!   Útls13_ADDED_SERVERFINISHEDr   rf   rf   rg   Útls13_should_add_Finished8  s    z,TLSServerAutomaton.tls13_should_add_Finishedc                 C   s   d S rŒ   rf   r   rf   rf   rg   r<  =  s    z-TLSServerAutomaton.tls13_ADDED_SERVERFINISHEDc                 C   s   |   ¡  |  ¡ ‚d S rŒ   )rÄ   Útls13_WAITING_CLIENTFLIGHT2r   rf   rf   rg   Útls13_should_send_ServerFlight1A  s    z2TLSServerAutomaton.tls13_should_send_ServerFlight1c                 C   s   |   ¡  |  ¡ ‚d S rŒ   )r™   Útls13_RECEIVED_CLIENTFLIGHT2r   rf   rf   rg   r>  F  s    z.TLSServerAutomaton.tls13_WAITING_CLIENTFLIGHT2c                 C   s   d S rŒ   rf   r   rf   rf   rg   r@  K  s    z/TLSServerAutomaton.tls13_RECEIVED_CLIENTFLIGHT2c                 C   s   |   t| j¡ d S rŒ   )rœ   r'   ÚTLS13_HANDLED_CLIENTCERTIFICATEr   rf   rf   rg   Ú!tls13_should_handle_ClientFlight2O  s    ÿz4TLSServerAutomaton.tls13_should_handle_ClientFlight2c                 C   s   |   t| j¡ d S rŒ   )rœ   r6   Ú*TLS13_HANDLED_ALERT_FROM_CLIENTCERTIFICATEr   rf   rf   rg   Ú0tls13_should_handle_Alert_from_ClientCertificateT  s    ÿzCTLSServerAutomaton.tls13_should_handle_Alert_from_ClientCertificatec                 C   s&   |   d¡ |   | j ¡ ¡ |  ¡ ‚d S rÒ   rÓ   r   rf   rf   rg   rC  Y  s    
z=TLSServerAutomaton.TLS13_HANDLED_ALERT_FROM_CLIENTCERTIFICATEc                 C   s   |   t| j¡ d S rŒ   )rœ   r7   r@  r   rf   rf   rg   Útls13_should_handle_ClientCCSd  s    ÿz0TLSServerAutomaton.tls13_should_handle_ClientCCSrF   c                 C   s    | j r|  ¡ ‚|  t| j¡ d S rŒ   )rV   ÚTLS13_MISSING_CLIENTCERTIFICATErœ   r!   ÚTLS13_HANDLED_CLIENTFINISHEDr   rf   rf   rg   Útls13_no_ClientCertificatei  s
    ÿz-TLSServerAutomaton.tls13_no_ClientCertificatec                 C   s>   | j r:|  d¡ t| jtƒr:| jjdkr:|  d¡ |  ¡ ‚d S )NrÍ   r   zbut it's empty !)rV   rm   r’   r£   r'   ZcertslenrF  r   rf   rf   rg   rA  v  s    

z2TLSServerAutomaton.TLS13_HANDLED_CLIENTCERTIFICATEc                 C   s   |   t| j¡ d S rŒ   )rœ   r   Ú&TLS13_HANDLED_CLIENT_CERTIFICATEVERIFYr   rf   rf   rg   Ú+tls13_should_handle_ClientCertificateVerify  s    ÿz>TLSServerAutomaton.tls13_should_handle_ClientCertificateVerifyc                 C   s   | j r|  ¡ ‚|  ¡ ‚d S rŒ   )rV   rF  rI  r   rf   rf   rg   Ú!tls13_no_Client_CertificateVerify„  s    z4TLSServerAutomaton.tls13_no_Client_CertificateVerifyc                 C   s   d S rŒ   rf   r   rf   rf   rg   rI  Š  s    z9TLSServerAutomaton.TLS13_HANDLED_CLIENT_CERTIFICATEVERIFYc                 C   s   |   t| j¡ d S rŒ   )rœ   r!   rG  r   rf   rf   rg   Ú"tls13_should_handle_ClientFinishedŽ  s    ÿz5TLSServerAutomaton.tls13_should_handle_ClientFinishedc                 C   sL   |   d¡ |  ¡  |  tddd�¡ |  ¡  |   d¡ | j ¡  |  ¡ ‚d S )NrÌ   rŽ   ét   ©ÚlevelÚdescrzSending TLSAlert 116)rm   r¯   r±   r6   rÄ   rI   Úcloser‰   r   rf   rf   rg   rF  “  s    


z2TLSServerAutomaton.TLS13_MISSING_CLIENTCERTIFICATEc                 C   s.   |   d¡ |  ¡  | jr"|   d¡ |  ¡ ‚d S rí   rï   r   rf   rf   rg   rG  �  s
    

z/TLSServerAutomaton.TLS13_HANDLED_CLIENTFINISHEDc                 C   s   |   | jd¡ |  ¡ ‚d S ©Nr�   )r™   rX   ÚRECEIVED_CLIENTDATAr   rf   rf   rg   rð   §  s    z%TLSServerAutomaton.WAITING_CLIENTDATAc                 C   s   d S rŒ   rf   r   rf   rf   rg   rS  ¬  s    z&TLSServerAutomaton.RECEIVED_CLIENTDATAc              
   C   s¨  t |tƒr| jdu rdS | j}t| jdƒ��f}t |j¡}|d7 }|t |j¡7 }|d7 }|t t	 
d|j¡¡7 }|d7 }|t t	 
d|j¡¡7 }|d7 }|t t	 
dtt ¡ ƒ¡¡7 }|d7 }|t |jd ¡7 }|d7 }|t t	 
d|jjj¡¡7 }|d7 }|jdu �s$|jdu �s$|jdk�r<|t t	 
dd¡¡7 }n6|jD ].}t |tƒ�rBt	 
d|j¡}|t |¡7 }�qB|d7 }| |¡ W d  ƒ n1 �sš0    Y  dS )	zþ
        This function save a ticket and others parameters in the
        file given as argument to the automaton
        Warning : The file is not protected and contains sensitive
        information. It should be used only for testing purpose.
        NÚabr  r  ri   r  r   ó   
)r’   r-   r^   rk   r  r  ÚhexlifyÚticketr#  r  r  r$  r%  r  r  rs   rn   ro   Úvalró   r1  r   r  Úwrite)r`   rW  rt   r!  r"  rŠ   Úmax_sizerf   rf   rg   Úsave_ticket°  s<    
ÿÿ
zTLSServerAutomaton.save_ticketc                 C   sZ  | j s|  d¡ |  ¡ ‚| j d }| j dd … | _ d}t|tƒr|td|j ƒ |j}| d¡}|D ]}| d¡rb|  	¡ ‚qbnht|t
ƒrœtd| ƒ |  ¡ ‚nHt|tƒrØtd| ƒ tdd�}|  ¡  |  |¡ |  ¡ ‚ntd| ƒ | d	¡rüt|  ¡ d
�}| j�s| d	¡�rN|  ¡  |  |¡ | j�rF|  ¡  tg d�}|  |¡ |  ¡ ‚|  ¡ ‚d S )NúClient idle time maxed out.r   r�   r  ú> Received: %rrU  ó   stop_server)Zrequest_updateó   GET / HTTP/1.1)Údatar4  )r�   rm   r©   r’   r8   Úprintr`  r  Ú
startswithÚCLOSE_NOTIFY_FINALr6   r,   r¯   r±   ÚADDED_SERVERDATAr|   rW   r]   r-   ÚHANDLED_CLIENTDATA)r`   rý   Z	recv_dataÚlinesr"  rW  rf   rf   rg   Úshould_handle_ClientData×  sD    














z+TLSServerAutomaton.should_handle_ClientDatac                 C   s   |   ¡ ‚d S rŒ   ©rð   r   rf   rf   rg   re    s    z%TLSServerAutomaton.HANDLED_CLIENTDATAc                 C   s   d S rŒ   rf   r   rf   rf   rg   rd    s    z#TLSServerAutomaton.ADDED_SERVERDATAc                 C   s†   | j r>d}| jD ],}t|tƒrttdd„ |jjƒƒ}|r q>q|  ¡  | j rz|rzt	| j
jƒD ]}t|tƒr\|  |¡  qzq\|  ¡ ‚d S )NFc                 S   s
   t | tƒS rŒ   )r’   r-   )Úxrf   rf   rg   Ú<lambda>  r  z;TLSServerAutomaton.should_send_ServerData.<locals>.<lambda>)r^   r�   r’   r9   ÚallÚmapÚinnerr¹   rÄ   r+  rk   rñ   r-   r[  ÚSENT_SERVERDATA)r`   r[  rý   rf   rf   rg   Úshould_send_ServerData	  s     


ÿ


z)TLSServerAutomaton.should_send_ServerDatac                 C   s   |   ¡ ‚d S rŒ   rh  r   rf   rf   rg   rn    s    z"TLSServerAutomaton.SENT_SERVERDATAc                 C   s   |   ¡  |   d¡ d S ©Nz#Sending a TLSAlert to the client...©rm   r   rf   rf   rg   r©   #  s    zTLSServerAutomaton.CLOSE_NOTIFYc                 C   s`   |   ¡  |  tddd�¡ z|  ¡  W n" tyH   |  d¡ g | _Y n0 | j ¡  |  	¡ ‚d S ©Nr�   r   rN  z8Could not send termination Alert, maybe the client left?)
r¯   r±   r6   rÄ   rM   rm   r�   rI   rQ  r‰   r   rf   rf   rg   Úclose_session(  s    

z TLSServerAutomaton.close_sessionc                 C   s   |   ¡  |   d¡ d S rp  rq  r   rf   rf   rg   rc  4  s    z%TLSServerAutomaton.CLOSE_NOTIFY_FINALc                 C   sZ   |   ¡  |  tddd�¡ z|  ¡  W n tyB   |  d¡ Y n0 | j ¡  |  ¡ ‚d S rr  )	r¯   r±   r6   rÄ   rM   rm   rI   rQ  rˆ   r   rf   rf   rg   Úclose_session_final9  s    
z&TLSServerAutomaton.close_session_finalc                 C   s   |   t| j¡ d S rŒ   )rœ   r0   ÚSSLv2_HANDLED_CLIENTHELLOr   rf   rf   rg   Ússlv2_should_handle_ClientHelloH  s    ÿz2TLSServerAutomaton.sslv2_should_handle_ClientHelloc                 C   s   d S rŒ   rf   r   rf   rf   rg   ru  M  s    z,TLSServerAutomaton.SSLv2_HANDLED_CLIENTHELLOc                 C   sF   | j dd� | j}g d¢}tdƒ}t|||d�}|  |¡ |  ¡ ‚d S )NT©Zis_sslv2)i€  i€  i€  i€  i€  i@  iÀ  é   )r7  r¤   Úconnection_id)r¯   rC   r   r4   r±   ÚSSLv2_ADDED_SERVERHELLO)r`   r7  r¤   ry  rý   rf   rf   rg   Ússlv2_should_add_ServerHelloQ  s    þ
z/TLSServerAutomaton.sslv2_should_add_ServerHelloc                 C   s   d S rŒ   rf   r   rf   rf   rg   rz  ^  s    z*TLSServerAutomaton.SSLv2_ADDED_SERVERHELLOc                 C   s   |   ¡  |  ¡ ‚d S rŒ   )rÄ   ÚSSLv2_SENT_SERVERHELLOr   rf   rf   rg   Ússlv2_should_send_ServerHellob  s    z0TLSServerAutomaton.sslv2_should_send_ServerHelloc                 C   s   |   ¡ ‚d S rŒ   )ÚSSLv2_WAITING_CLIENTMASTERKEYr   rf   rf   rg   r|  g  s    z)TLSServerAutomaton.SSLv2_SENT_SERVERHELLOc                 C   s   |   ¡  |  ¡ ‚d S rŒ   )r™   ÚSSLv2_RECEIVED_CLIENTMASTERKEYr   rf   rf   rg   r~  k  s    z0TLSServerAutomaton.SSLv2_WAITING_CLIENTMASTERKEYc                 C   s   d S rŒ   rf   r   rf   rf   rg   r  p  s    z1TLSServerAutomaton.SSLv2_RECEIVED_CLIENTMASTERKEYc                 C   s   |   t| j¡ d S rŒ   )rœ   r1   ÚSSLv2_HANDLED_CLIENTMASTERKEYr   rf   rf   rg   Ú#sslv2_should_handle_ClientMasterKeyt  s    ÿz6TLSServerAutomaton.sslv2_should_handle_ClientMasterKeyc                 C   s   |   ¡ ‚d S rŒ   )ÚSSLv2_MISSING_CLIENTMASTERKEYr   rf   rf   rg   Úmissing_ClientMasterKeyy  s    z*TLSServerAutomaton.missing_ClientMasterKeyc                 C   s   |   d¡ |  ¡ ‚d S )NzMissing SSLv2 ClientMasterKey!©rm   ÚSSLv2_CLOSE_NOTIFYr   rf   rf   rg   r‚  }  s    
z0TLSServerAutomaton.SSLv2_MISSING_CLIENTMASTERKEYc                 C   s   |   ¡ ‚d S rŒ   )ÚSSLv2_RECEIVED_CLIENTFINISHEDr   rf   rf   rg   r€  ‚  s    z0TLSServerAutomaton.SSLv2_HANDLED_CLIENTMASTERKEYc                 C   s   d S rŒ   rf   r   rf   rf   rg   r†  †  s    z0TLSServerAutomaton.SSLv2_RECEIVED_CLIENTFINISHEDc                 C   s   |   t| j¡ d S rŒ   )rœ   r/   ÚSSLv2_HANDLED_CLIENTFINISHEDr   rf   rf   rg   Ú"sslv2_should_handle_ClientFinishedŠ  s    ÿz5TLSServerAutomaton.sslv2_should_handle_ClientFinishedc                 C   s   d S rŒ   rf   r   rf   rf   rg   r‡  �  s    z/TLSServerAutomaton.SSLv2_HANDLED_CLIENTFINISHEDc                 C   sN   dd„ | j jD ƒ}t|v rd S | jdd� t| j jd�}|  |¡ |  ¡ ‚d S )Nc                 S   s   g | ]}t |ƒ‘qS rf   ©Útype©Ú.0r‹   rf   rf   rg   Ú
<listcomp>•  r  zXTLSServerAutomaton.sslv2_should_add_ServerVerify_from_ClientFinished.<locals>.<listcomp>Trw  ©Ú	challenge©rk   rñ   r5   r¯   Zsslv2_challenger±   ÚSSLv2_ADDED_SERVERVERIFY©r`   Úhs_msgrý   rf   rf   rg   Ú1sslv2_should_add_ServerVerify_from_ClientFinished“  s    
zDTLSServerAutomaton.sslv2_should_add_ServerVerify_from_ClientFinishedc                 C   sN   dd„ | j jD ƒ}t|v rd S | jdd� t| j jd�}|  |¡ |  ¡ ‚d S )Nc                 S   s   g | ]}t |ƒ‘qS rf   r‰  r‹  rf   rf   rg   r�  Ÿ  r  zZTLSServerAutomaton.sslv2_should_add_ServerVerify_from_NoClientFinished.<locals>.<listcomp>Trw  rŽ  r�  r’  rf   rf   rg   Ú3sslv2_should_add_ServerVerify_from_NoClientFinished�  s    
zFTLSServerAutomaton.sslv2_should_add_ServerVerify_from_NoClientFinishedc                 C   s   |   ¡ ‚d S rŒ   )ÚSSLv2_MISSING_CLIENTFINISHEDr   rf   rf   rg   Ússlv2_missing_ClientFinished§  s    z/TLSServerAutomaton.sslv2_missing_ClientFinishedc                 C   s   |   d¡ |  ¡ ‚d S )NzMissing SSLv2 ClientFinished!r„  r   rf   rf   rg   r–  «  s    
z/TLSServerAutomaton.SSLv2_MISSING_CLIENTFINISHEDc                 C   s   d S rŒ   rf   r   rf   rf   rg   r‘  °  s    z+TLSServerAutomaton.SSLv2_ADDED_SERVERVERIFYc                 C   s   |   ¡  |  ¡ ‚d S rŒ   )rÄ   ÚSSLv2_SENT_SERVERVERIFYr   rf   rf   rg   Ússlv2_should_send_ServerVerify´  s    z1TLSServerAutomaton.sslv2_should_send_ServerVerifyc                 C   s0   dd„ | j jD ƒ}t|v r$|  ¡ ‚n|  ¡ ‚d S )Nc                 S   s   g | ]}t |ƒ‘qS rf   r‰  r‹  rf   rf   rg   r�  »  r  z>TLSServerAutomaton.SSLv2_SENT_SERVERVERIFY.<locals>.<listcomp>)rk   rñ   r/   r‡  r†  ©r`   r“  rf   rf   rg   r˜  ¹  s    
z*TLSServerAutomaton.SSLv2_SENT_SERVERVERIFYc                 C   sP   dd„ | j jD ƒ}| jr t|v r$d S | jdd� |  ttdƒd�¡ |  ¡ ‚d S )Nc                 S   s   g | ]}t |ƒ‘qS rf   r‰  r‹  rf   rf   rg   r�  Å  r  zJTLSServerAutomaton.sslv2_should_add_RequestCertificate.<locals>.<listcomp>Trw  rx  rŽ  )rk   rñ   rV   r2   r¯   r±   r   ÚSSLv2_ADDED_REQUESTCERTIFICATErš  rf   rf   rg   Ú#sslv2_should_add_RequestCertificateÃ  s    z6TLSServerAutomaton.sslv2_should_add_RequestCertificatec                 C   s   d S rŒ   rf   r   rf   rf   rg   r›  Ì  s    z1TLSServerAutomaton.SSLv2_ADDED_REQUESTCERTIFICATEc                 C   s   |   ¡  |  ¡ ‚d S rŒ   )rÄ   ÚSSLv2_SENT_REQUESTCERTIFICATEr   rf   rf   rg   Ú$sslv2_should_send_RequestCertificateÐ  s    z7TLSServerAutomaton.sslv2_should_send_RequestCertificatec                 C   s   |   ¡ ‚d S rŒ   )ÚSSLv2_WAITING_CLIENTCERTIFICATEr   rf   rf   rg   r�  Õ  s    z0TLSServerAutomaton.SSLv2_SENT_REQUESTCERTIFICATEc                 C   s   |   ¡  |  ¡ ‚d S rŒ   )r™   Ú SSLv2_RECEIVED_CLIENTCERTIFICATEr   rf   rf   rg   rŸ  Ù  s    z2TLSServerAutomaton.SSLv2_WAITING_CLIENTCERTIFICATEc                 C   s   d S rŒ   rf   r   rf   rf   rg   r   Þ  s    z3TLSServerAutomaton.SSLv2_RECEIVED_CLIENTCERTIFICATEc                 C   s   |   t| j¡ d S rŒ   )rœ   r.   ÚSSLv2_HANDLED_CLIENTCERTIFICATEr   rf   rf   rg   Ú%sslv2_should_handle_ClientCertificateâ  s    ÿz8TLSServerAutomaton.sslv2_should_handle_ClientCertificatec                 C   s   |   ¡ ‚d S rŒ   )ÚSSLv2_MISSING_CLIENTCERTIFICATEr   rf   rf   rg   Ússlv2_missing_ClientCertificateç  s    z2TLSServerAutomaton.sslv2_missing_ClientCertificatec                 C   s   |   d¡ |  ¡ ‚d S )Nz Missing SSLv2 ClientCertificate!r„  r   rf   rf   rg   r£  ë  s    
z2TLSServerAutomaton.SSLv2_MISSING_CLIENTCERTIFICATEc                 C   s   |   d¡ |  ¡ ‚d S )NzReceived client certificate...)rm   r‡  r   rf   rf   rg   r¡  ð  s    
z2TLSServerAutomaton.SSLv2_HANDLED_CLIENTCERTIFICATEc                 C   s,   | j dd� |  ttdƒd�¡ |  ¡ ‚d S )NTrw  rx  )r*  )r¯   r±   r3   r   ÚSSLv2_ADDED_SERVERFINISHEDr   rf   rf   rg   Ússlv2_should_add_ServerFinishedø  s    z2TLSServerAutomaton.sslv2_should_add_ServerFinishedc                 C   s   d S rŒ   rf   r   rf   rf   rg   r¥  þ  s    z-TLSServerAutomaton.SSLv2_ADDED_SERVERFINISHEDc                 C   s   |   ¡  |  ¡ ‚d S rŒ   )rÄ   ÚSSLv2_SENT_SERVERFINISHEDr   rf   rf   rg   Ú sslv2_should_send_ServerFinished  s    z3TLSServerAutomaton.sslv2_should_send_ServerFinishedc                 C   s.   |   d¡ |  ¡  | jr"|   d¡ |  ¡ ‚d S )NzSSLv2 handshake completed!rî   )rm   rx   rW   ÚSSLv2_WAITING_CLIENTDATAr   rf   rf   rg   r§    s
    

z,TLSServerAutomaton.SSLv2_SENT_SERVERFINISHEDc                 C   s   |   | jd¡ |  ¡ ‚d S rR  )r™   rX   ÚSSLv2_RECEIVED_CLIENTDATAr   rf   rf   rg   r©    s    z+TLSServerAutomaton.SSLv2_WAITING_CLIENTDATAc                 C   s   d S rŒ   rf   r   rf   rf   rg   rª    s    z,TLSServerAutomaton.SSLv2_RECEIVED_CLIENTDATAc                 C   sþ   | j s|  d¡ |  ¡ ‚| j d }| j dd … | _ t|dƒrt|j}td| ƒ | d¡rˆ|  ¡  |  d¡ |  ¡ ‚nt|ƒ}td| ƒ | 	d¡}|D ]}| d	¡r–|  
¡ ‚q–| d
¡rÄt|  ¡ ƒ}| jsÔ| d
¡rò| jdd� |  |¡ |  ¡ ‚|  ¡ ‚d S )Nr\  r   r�   Úloadr]  s   goodbyezSeems like the client left...rU  r^  r_  Trw  )r�   rm   r…  Úhasattrr«  ra  rb  r‰   Ústrr  ÚSSLv2_CLOSE_NOTIFY_FINALr   r|   rW   r¯   r±   ÚSSLv2_ADDED_SERVERDATAÚSSLv2_HANDLED_CLIENTDATA)r`   rý   Zcli_datarf  r"  rf   rf   rg   Ússlv2_should_handle_ClientData  s2    










z1TLSServerAutomaton.sslv2_should_handle_ClientDatac                 C   s   |   ¡ ‚d S rŒ   ©r©  r   rf   rf   rg   r°  ;  s    z+TLSServerAutomaton.SSLv2_HANDLED_CLIENTDATAc                 C   s   d S rŒ   rf   r   rf   rf   rg   r¯  ?  s    z)TLSServerAutomaton.SSLv2_ADDED_SERVERDATAc                 C   s   |   ¡  |  ¡ ‚d S rŒ   )rÄ   ÚSSLv2_SENT_SERVERDATAr   rf   rf   rg   Ússlv2_should_send_ServerDataC  s    z/TLSServerAutomaton.sslv2_should_send_ServerDatac                 C   s   |   ¡ ‚d S rŒ   r²  r   rf   rf   rg   r³  H  s    z(TLSServerAutomaton.SSLv2_SENT_SERVERDATAc                 C   s   |   ¡  |   d¡ dS ©z~
        There is no proper way to end an SSLv2 session.
        We try and send a 'goodbye' message as a substitute.
        z)Trying to send 'goodbye' to the client...Nrq  r   rf   rf   rg   r…  L  s    z%TLSServerAutomaton.SSLv2_CLOSE_NOTIFYc                 C   s\   |   ¡  |  tdƒ¡ z|  ¡  W n" tyD   |  d¡ g | _Y n0 | j ¡  |  	¡ ‚d S ©NZgoodbyez5Could not send our goodbye. The client probably left.)
r¯   r±   r   rÄ   rM   rm   r�   rI   rQ  r‰   r   rf   rf   rg   Ússlv2_close_sessionU  s    

z&TLSServerAutomaton.sslv2_close_sessionc                 C   s   |   ¡  |   d¡ dS rµ  rq  r   rf   rf   rg   r®  a  s    z+TLSServerAutomaton.SSLv2_CLOSE_NOTIFY_FINALc                 C   sV   |   ¡  |  tdƒ¡ z|  ¡  W n ty>   |  d¡ Y n0 | j ¡  |  ¡ ‚d S r¶  )	r¯   r±   r   rÄ   rM   rm   rI   rQ  rˆ   r   rf   rf   rg   Ússlv2_close_session_finalj  s    
z,TLSServerAutomaton.sslv2_close_session_final)Ústopr­   c                 C   s"   |   d¡ | j ¡  |   d¡ d S )NzClosing server socket...zEnding TLS server automaton.)rm   rO   rQ  r   rf   rf   rg   rˆ   u  s    

zTLSServerAutomaton.FINAL)r@   rA   NNNFTrB   NNNFNN)¥Ú__name__Ú
__module__Ú__qualname__Ú__doc__rH   rx   r|   r	   Ústater€   r~   r�   r‰   r•   r˜   rš   Ú	conditionrž   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(  r0  r/  r3  r2  r6  r5  r9  r8  r;  r:  r=  r<  r?  r>  r@  rB  rD  rC  rE  rH  rA  rJ  rK  rI  rL  rF  rG  rð   rS  r[  rg  re  rd  ro  rn  r©   rs  rc  rt  rv  ru  r{  rz  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ˆ   Ú__classcell__rf   rf   rd   rg   r?   B   s„             õ3




































































Z
G
	
























	
	

'
)


















				 
r?   )Zr½  Ú
__future__r   rI   r  r  r  Zscapy.configr   Zscapy.packetr   Zscapy.pton_ntopr   Zscapy.utilsr   r   r   Zscapy.automatonr	   Zscapy.errorr
   Zscapy.layers.tls.automatonr   Zscapy.layers.tls.certr   r   Zscapy.layers.tls.basefieldsr   Zscapy.layers.tls.sessionr   Zscapy.layers.tls.crypto.groupsr   Zscapy.layers.tls.extensionsr   r   r   r   r   r   Z"scapy.layers.tls.keyexchange_tls13r   r   r   r   r   Zscapy.layers.tls.handshaker   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   Z scapy.layers.tls.handshake_sslv2r.   r/   r0   r1   r2   r3   r4   r5   Zscapy.layers.tls.recordr6   r7   r8   Zscapy.layers.tls.record_tls13r9   Zscapy.layers.tls.crypto.hkdfr:   Zscapy.layers.tls.crypto.suitesr;   r<   Zcrypto_validZcryptography.hazmat.backendsr=   Zcryptography.hazmat.primitivesr>   r?   rf   rf   rf   rg   Ú<module>   s8    P(