Ë
    ojèZ  ã                   óö  — d Z ddlZddlZddlmZ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d
lmZ 	 ddlmamZ ddlma ddlmZmZ ddlm Z   G d„ dejB                  «      Z" G d„ dejB                  «      Z# G d„ dejH                  «      Z% G d„ dejH                  «      Z& e ejN                  «       G d„ dejH                  «      «       Z(d„ Z)d„ Z* G d„ d«      Z+t.        � G d„ dt2        jX                  «      Z- G d „ d!ee«      Z. G d"„ d#e«      Z/ G d$„ d%e/«      Z0 G d&„ d'e«      Z1 G d(„ d)ee+«      Z2 G d*„ d+«      Z3 G d,„ d-e«      Z4 G d.„ d/e«      Z5y# e$ r d„ Z e«        Y �Œw xY w)0z 
Tests for twisted SSL support.
é    N)ÚdeferÚ
interfacesÚprotocolÚreactor)ÚConnectionDone)ÚwaitUntilAllDisconnected)Úbasic)ÚFilePath)Úplatform)ÚProperlyCloseFilesMixin)ÚTestCase)ÚSSLÚcrypto)Ússl)ÚClientTLSContextÚcertPathc                  ó   — d xa ay ©N)r   r   © ó    ú7/usr/lib/python3/dist-packages/twisted/test/test_ssl.pyÚ_noSSLr      s   € ð Ðˆ‰cr   )Úimplementerc                   ó8   — e Zd ZdZg d¢ZddgZd„ Zd„ Zd„ Zd„ Z	y	)
ÚUnintelligentProtocola  
    @ivar deferred: a deferred that will fire at connection lost.
    @type deferred: L{defer.Deferred}

    @cvar pretext: text sent before TLS is set up.
    @type pretext: C{bytes}

    @cvar posttext: text sent after TLS is set up.
    @type posttext: C{bytes}
    )s
   first lines   last thing before tls startsó   STARTTLSs   first thing after tls starteds   last thing everc                 ó6   — t        j                  «       | _        y r   ©r   ÚDeferredÚdeferred©Úselfs    r   Ú__init__zUnintelligentProtocol.__init__7   ó   € ÜŸ™Ó(ˆ�r   c                 óH   — | j                   D ]  }| j                  |«       Œ y r   )ÚpretextÚsendLine)r"   Úls     r   ÚconnectionMadez$UnintelligentProtocol.connectionMade:   s!   € Ø—‘ò 	ˆAØ�M‰M˜!Õñ	r   c                 óø   — |dk(  ru| j                   j                  t        «       | j                  j                  «       | j
                  D ]  }| j                  |«       Œ | j                   j                  «        y y )Nó   READY)Ú	transportÚstartTLSr   ÚfactoryÚclientÚposttextr'   ÚloseConnection)r"   Úliner(   s      r   ÚlineReceivedz"UnintelligentProtocol.lineReceived>   s`   € Ø�8ÒØ�N‰N×#Ñ#Ô$4Ó$6¸¿¹×8KÑ8KÔLØ—]‘]ò !�Ø—‘˜aÕ ð!à�N‰N×)Ñ)Õ+ð	 r   c                 ó:   — | j                   j                  d «       y r   ©r    Úcallback©r"   Úreasons     r   ÚconnectionLostz$UnintelligentProtocol.connectionLostE   ó   € Ø�‰×Ñ˜tÕ$r   N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r&   r0   r#   r)   r3   r9   r   r   r   r   r   '   s.   „ ñ	ò L€Gà0Ð2DÐE€Hò)òò,ó%r   r   c                   ó0   — e Zd ZdZdd„Zd„ Zd„ Zd„ Zd„ Zy)	ÚLineCollectoraJ  
    @ivar deferred: a deferred that will fire at connection lost.
    @type deferred: L{defer.Deferred}

    @ivar doTLS: whether the protocol is initiate TLS or not.
    @type doTLS: C{bool}

    @ivar fillBuffer: if set to True, it will send lots of data once
        C{STARTTLS} is received.
    @type fillBuffer: C{bool}
    c                 óR   — || _         || _        t        j                  «       | _        y r   )ÚdoTLSÚ
fillBufferr   r   r    )r"   rB   rC   s      r   r#   zLineCollector.__init__V   s   € ØˆŒ
Ø$ˆŒÜŸ™Ó(ˆ�r   c                 óH   — d| j                   _        g | j                   _        y )Nr   )r.   ÚrawdataÚlinesr!   s    r   r)   zLineCollector.connectionMade[   s   € Ø"ˆ�‰ÔØˆ�‰Õr   c                 óš  — | j                   j                  j                  |«       |dk(  r¡| j                  r!t	        d«      D ]  }| j                  d«       Œ | j                  d«       | j                  rFt        t        t        ¬«      }| j                  j                  || j                   j                  «       y | j                  «        y y )Nr   iô  sè  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXr+   )ÚprivateKeyFileNameÚcertificateFileName)r.   rF   ÚappendrC   Úranger'   rB   ÚServerTLSContextr   r,   r-   ÚserverÚ
setRawMode)r"   r2   ÚxÚctxs       r   r3   zLineCollector.lineReceived_   sš   € Ø�‰×Ñ×!Ñ! $Ô'Ø�;ÒØ�ŠÜ˜s›ò /�AØ—M‘M +Õ.ð/à�M‰M˜(Ô#Ø�zŠzÜ&Ü'/Ü(0ô�ð —‘×'Ñ'¨¨T¯\©\×-@Ñ-@ÕAà—‘Õ!ð r   c                 óv   — | j                   xj                  |z  c_        | j                  j                  «        y r   )r.   rE   r,   r1   ©r"   Údatas     r   ÚrawDataReceivedzLineCollector.rawDataReceivedo   s'   € Ø�‰×Ò Ñ$ÕØ�‰×%Ñ%Õ'r   c                 ó:   — | j                   j                  d «       y r   r5   r7   s     r   r9   zLineCollector.connectionLosts   r:   r   N©F)	r;   r<   r=   r>   r#   r)   r3   rT   r9   r   r   r   r@   r@   I   s    „ ñ
ó)ò
 ò"ò (ó%r   r@   c                   ó   — e Zd ZdZd„ Zy)ÚSingleLineServerProtocolzK
    A protocol that sends a single line of data at C{connectionMade}.
    c                 ón   — | j                   j                  d«       | j                   j                  «        y )Nó   +OK <some crap>
)r,   ÚwriteÚgetPeerCertificater!   s    r   r)   z'SingleLineServerProtocol.connectionMade|   s%   € Ø�‰×ÑÐ3Ô4Ø�‰×)Ñ)Õ+r   N)r;   r<   r=   r>   r)   r   r   r   rX   rX   w   s   „ ñó,r   rX   c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)ÚRecordingClientProtocolzv
    @ivar deferred: a deferred that will fire with first received content.
    @type deferred: L{defer.Deferred}
    c                 ó6   — t        j                  «       | _        y r   r   r!   s    r   r#   z RecordingClientProtocol.__init__‡   r$   r   c                 ó8   — | j                   j                  «        y r   )r,   r\   r!   s    r   r)   z&RecordingClientProtocol.connectionMadeŠ   s   € Ø�‰×)Ñ)Õ+r   c                 ó:   — | j                   j                  |«       y r   r5   rR   s     r   ÚdataReceivedz$RecordingClientProtocol.dataReceived�   r:   r   N)r;   r<   r=   r>   r#   r)   rb   r   r   r   r^   r^   �   s   „ ñò
)ò,ó%r   r^   c                   ó   — e Zd ZdZd„ Zd„ Zy)Ú ImmediatelyDisconnectingProtocolz•
    A protocol that disconnect immediately on connection. It fires the
    C{connectionDisconnected} deferred of its factory on connetion lost.
    c                 ó8   — | j                   j                  «        y r   ©r,   r1   r!   s    r   ÚhandshakeCompletedz3ImmediatelyDisconnectingProtocol.handshakeCompleted˜   s   € Ø�‰×%Ñ%Õ'r   c                 óN   — | j                   j                  j                  d «       y r   )r.   ÚconnectionDisconnectedr6   r7   s     r   r9   z/ImmediatelyDisconnectingProtocol.connectionLost›   s   € Ø�‰×+Ñ+×4Ñ4°TÕ:r   N)r;   r<   r=   r>   rg   r9   r   r   r   rd   rd   ‘   s   „ ñò
(ó;r   rd   c                 óŠ  — t        j                  «       }|j                  t         j                  d«       t        j                  «       }|j                  «       }| |_        ||_        |j                  |«       |j                  |d«       t        j                  «       }|j                  d«       |j                  d«       |j                  d«       |j                  |j                  «       «       |j                  |j                  «       «       |j                  |j!                  «       «       |j                  |d«       |||fS )z‘
    Create a certificate for given C{organization} and C{organizationalUnit}.

    @return: a tuple of (key, request, certificate) objects.
    i   Úmd5é   r   é<   )r   ÚPKeyÚgenerate_keyÚTYPE_RSAÚX509ReqÚget_subjectÚOÚOUÚ
set_pubkeyÚsignÚX509Úset_serial_numberÚgmtime_adj_notBeforeÚgmtime_adj_notAfterÚ
set_issuerÚset_subjectÚ
get_pubkey)ÚorganizationÚorganizationalUnitÚpkeyÚreqÚsubjectÚcerts         r   ÚgenerateCertificateObjectsr„   Ÿ   sï   € ô �;‰;‹=€DØ×Ñ”f—o‘o tÔ,Ü
�.‰.Ó
€CØ�o‰oÓ€GØ€G„IØ#€G„JØ‡N�N�4ÔØ‡H�HˆT�5Ôô �;‰;‹=€DØ×Ñ˜1ÔØ×Ñ˜aÔ Ø×Ñ˜RÔ Ø‡O�O�C—O‘OÓ%Ô&Ø×Ñ�S—_‘_Ó&Ô'Ø‡O�O�C—N‘NÓ$Ô%Ø‡I�Iˆd�EÔà��dˆ?Ðr   c                 ód  — t        ||«      \  }}}d|t        j                  fd|t        j                  fd|t        j                  ffD ]e  \  }}}t
        j                  j                  | |f«      j                  d«      }	t        |	«      j                   |t        j                  |«      «       Œg y)z…
    Create certificate files key, req and cert prefixed by C{basename} for
    given C{organization} and C{organizationalUnit}.
    Úkeyr�   rƒ   zutf-8N)r„   r   Údump_privatekeyÚdump_certificate_requestÚdump_certificateÚosÚextsepÚjoinÚencoder
   Ú
setContentÚFILETYPE_PEM)
Úbasenamer~   r   r€   r�   rƒ   ÚextÚobjÚdumpFuncÚfNames
             r   ÚgenerateCertificateFilesr•   »   s¥   € ô
 1°Ð?QÓR�O€Dˆ#ˆtð 
�”f×,Ñ,Ð-Ø	�”V×4Ñ4Ð5Ø	�”v×.Ñ.Ð/ðò GÑˆˆS�(ô
 —	‘	—‘ ¨#˜Ó/×6Ñ6°wÓ?ˆÜ�‹×"Ñ"¡8¬F×,?Ñ,?ÀÓ#EÕFñGr   c                   ó   — e Zd ZdZd„ Zd„ Zy)ÚContextGeneratingMixinah  
    Offer methods to create L{ssl.DefaultOpenSSLContextFactory} for both client
    and server.

    @ivar clientBase: prefix of client certificate files.
    @type clientBase: C{str}

    @ivar serverBase: prefix of server certificate files.
    @type serverBase: C{str}

    @ivar clientCtxFactory: a generated context factory to be used in
        L{IReactorSSL.connectSSL}.
    @type clientCtxFactory: L{ssl.DefaultOpenSSLContextFactory}

    @ivar serverCtxFactory: a generated context factory to be used in
        L{IReactorSSL.listenSSL}.
    @type serverCtxFactory: L{ssl.DefaultOpenSSLContextFactory}
    c                 óô   — | j                  «       }t        |||«       t        j                  t        j
                  j                  |df«      t        j
                  j                  |df«      g|¢­i |¤Ž}||fS )Nr†   rƒ   )Úmktempr•   r   ÚDefaultOpenSSLContextFactoryrŠ   r‹   rŒ   )r"   ÚorgÚorgUnitÚargsÚkwArgsÚbaseÚserverCtxFactorys          r   ÚmakeContextFactoryz)ContextGeneratingMixin.makeContextFactoryß   st   € Ø�{‰{‹}ˆÜ   s¨GÔ4Ü×;Ñ;Ü�I‰I�N‰N˜D %˜=Ó)Ü�I‰I�N‰N˜D &˜>Ó*ð
ð ò
ð ñ	
Ðð Ð%Ð%Ð%r   c                 ó€   —  | j                   |i |¤Ž\  | _        | _         | j                   |i |¤Ž\  | _        | _        y r   )r¡   Ú
clientBaseÚclientCtxFactoryÚ
serverBaser    )r"   Ú
clientArgsÚclientKwArgsÚ
serverArgsÚserverKwArgss        r   ÚsetupServerAndClientz+ContextGeneratingMixin.setupServerAndClientë   sS   € Ø1H°×1HÑ1HØð2
Ø'ñ2
Ñ.ˆŒ˜Ô.ð 2I°×1HÑ1HØð2
Ø'ñ2
Ñ.ˆŒ˜Õ.r   N)r;   r<   r=   r>   r¡   rª   r   r   r   r—   r—   Ë   s   „ ñò&
&ó
r   r—   c                   ó   — e Zd ZdZdZd„ Zy)rL   zf
        A context factory with a default method set to
        L{OpenSSL.SSL.SSLv23_METHOD}.
        Fc                 óp   — t         j                  |d<   t        j                  j                  | g|¢­i |¤Ž y )NÚ	sslmethod)r   ÚSSLv23_METHODr   rš   r#   )r"   r�   Úkws      r   r#   zServerTLSContext.__init__þ   s/   € Ü!×/Ñ/ˆBˆ{‰OÜ×,Ñ,×5Ñ5°dÐH¸TÒHÀRÓHr   N)r;   r<   r=   r>   ÚisClientr#   r   r   r   rL   rL   ö   s   „ ñ	ð
 ˆó	Ir   rL   c                   óR   — e Zd ZdZ ej
                  ed«      €dZd„ Zd„ Z	d„ Z
d„ Zy)ÚStolenTCPTestszc
    For SSL transports, test many of the same things which are tested for
    TCP transports.
    Nú2Reactor does not support SSL, cannot run SSL testsc                 óÈ   — t         j                  j                  t        t        «      j                  «       «      }|j                  «       }t        j                  ||||¬«      S )zY
        Create an SSL server with a certificate using L{IReactorSSL.listenSSL}.
        ©Ú	interface)	r   ÚPrivateCertificateÚloadPEMr
   r   Ú
getContentÚoptionsr   Ú	listenSSL)r"   ÚaddressÚ
portNumberr.   rƒ   ÚcontextFactorys         r   ÚcreateServerzStolenTCPTests.createServer  sK   € ô ×%Ñ%×-Ñ-¬h´xÓ.@×.KÑ.KÓ.MÓNˆØŸ™›ˆÜ× Ñ  ¨W°nÐPWÔXÐXr   c                 óP   — t        j                  «       }|j                  |||«      S )zG
        Create an SSL client using L{IReactorSSL.connectSSL}.
        )r   ÚCertificateOptionsÚ
connectSSL)r"   r¼   r½   ÚclientCreatorr¾   s        r   ÚconnectClientzStolenTCPTests.connectClient  s'   € ô ×/Ñ/Ó1ˆØ×'Ñ'¨°¸^ÓLÐLr   c                 ó"   — t         j                  S )zº
        Return L{OpenSSL.SSL.Error} as the expected error type which will be
        raised by a write to the L{OpenSSL.SSL.Connection} object after it has
        been closed.
        )r   ÚErrorr!   s    r   ÚgetHandleExceptionTypez%StolenTCPTests.getHandleExceptionType  s   € ô �y‰yÐr   c                 ó>  — t        j                  t        j                  t        j                  d«      t        j                  t        j                  d«      t        j                  d«      t        j                  d«      «      t        j                  d«      «      «      S )a4  
        Return a L{hamcrest.core.matcher.Matcher} for the argument
        L{OpenSSL.SSL.Error} will be constructed with for this case.
        This is basically just a random OpenSSL implementation detail.
        It would be better if this test worked in a way which did not
        require this.
        zSSL routinesÚ	SSL_writeÚssl_write_internalÚ zprotocol is shutdown)ÚhamcrestÚcontainsÚequal_toÚany_ofr!   s    r   ÚgetHandleErrorCodeMatcherz(StolenTCPTests.getHandleErrorCodeMatcher#  s{   € ô × Ñ Ü×ÑÜ×!Ñ! .Ó1Ü—‘Ü×%Ñ% kÓ2Ü×%Ñ%Ð&:Ó;Ü×%Ñ% bÓ)óô
 ×!Ñ!Ð"8Ó9óó

ð 
	
r   )r;   r<   r=   r>   r   ÚIReactorSSLr   Úskipr¿   rÄ   rÇ   rÐ   r   r   r   r²   r²     s9   „ ñð
 €z×Ñ˜g tÓ,Ð4ØCˆòYòMòó
r   r²   c                   óf   — e Zd ZdZ ej
                  ed«      €dZdZdZ	dZ
d„ Zd
d„Zd„ Zd„ Zd	„ Zy)ÚTLSTestszƒ
    Tests for startTLS support.

    @ivar fillBuffer: forwarded to L{LineCollector.fillBuffer}
    @type fillBuffer: C{bool}
    Nr³   Fc                 óî   — | j                   j                  �$| j                   j                  j                  «        | j                  j                  �%| j                  j                  j                  «        y y r   )ÚclientProtor,   r1   ÚserverProtor!   s    r   ÚtearDownzTLSTests.tearDownJ  s[   € Ø×Ñ×%Ñ%Ð1Ø×Ñ×&Ñ&×5Ñ5Ô7Ø×Ñ×%Ñ%Ð1Ø×Ñ×&Ñ&×5Ñ5Õ7ð 2r   c                 ó  ‡‡— ‰| _         t        j                  «       x}| _        ˆfd„|_        |rd|_        nd|_        ‰| _        t        j                  «       x}| _        ˆfd„|_        |rd|_        nd|_        t        j                  d|d¬«      }| j                  |j                  «       t        j                  d|j                  «       j                  |«       t!        j"                  ‰j$                  ‰j$                  g«      S )a½  
        Helper method to run TLS tests.

        @param clientProto: protocol instance attached to the client
            connection.
        @param serverProto: protocol instance attached to the server
            connection.
        @param clientIsServer: flag indicated if client should initiate
            startTLS instead of server.

        @return: a L{defer.Deferred} that will fire when both connections are
            lost.
        c                  ó   •— ‰ S r   r   ©rÖ   s   €r   ú<lambda>z#TLSTests._runTest.<locals>.<lambda>`  ó   ø€ ˜k€ r   FTc                  ó   •— ‰ S r   r   ©r×   s   €r   rÜ   z#TLSTests._runTest.<locals>.<lambda>h  rÝ   r   r   ú	127.0.0.1rµ   )rÖ   r   ÚClientFactoryÚclientFactoryrM   r/   r×   ÚServerFactoryÚserverFactoryr   Ú	listenTCPÚ
addCleanupÚstopListeningÚ
connectTCPÚgetHostÚportr   ÚgatherResultsr    )r"   rÖ   r×   ÚclientIsServerÚcfÚsfrê   s    ``    r   Ú_runTestzTLSTests._runTestP  s×   ù€ ð 'ˆÔÜ"*×"8Ñ"8Ó":Ð:ˆˆTÔÛ)ˆŒÙØˆB�IàˆBŒIà&ˆÔÜ"*×"8Ñ"8Ó":Ð:ˆˆTÔÛ)ˆŒÙØˆB�IàˆBŒIä× Ñ   B°+Ô>ˆØ�‰˜×*Ñ*Ô+ä×Ñ˜;¨¯©«×(;Ñ(;¸RÔ@ä×"Ñ" K×$8Ñ$8¸+×:NÑ:NÐ#OÓPÐPr   c                 óŒ   ‡ — ˆ fd„}‰ j                  t        «       t        d‰ j                  «      «      }|j	                  |«      S )z~
        Test for server and client startTLS: client should received data both
        before and after the startTLS.
        c                 ó�   •— ‰j                  ‰j                  j                  t        j                  t        j
                  z   «       y r   )ÚassertEqualrä   rF   r   r&   r0   )Úignorer"   s    €r   Úcheckz TLSTests.test_TLS.<locals>.check{  ó5   ø€ Ø×ÑØ×"Ñ"×(Ñ(Ü%×-Ñ-Ô0E×0NÑ0NÑNõr   T©rï   r   r@   rC   ÚaddCallback©r"   rô   Úds   `  r   Útest_TLSzTLSTests.test_TLSu  s8   ø€ ô	ð �M‰MÔ/Ó1´=ÀÀtÇÁÓ3WÓXˆØ�}‰}˜UÓ#Ð#r   c                 óŒ   ‡ — ˆ fd„}‰ j                  t        «       t        d‰ j                  «      «      }|j	                  |«      S )z›
        Test for server startTLS not followed by a startTLS in client: the data
        received after server startTLS should be received as raw.
        c                 óº   •— ‰j                  ‰j                  j                  t        j                  «       ‰j                  ‰j                  j                  d«       y )NzNo encrypted bytes received)rò   rä   rF   r   r&   Ú
assertTruerE   ©Úignoredr"   s    €r   rô   z"TLSTests.test_unTLS.<locals>.checkŠ  sA   ø€ Ø×Ñ˜T×/Ñ/×5Ñ5Ô7L×7TÑ7TÔUØ�O‰O˜D×.Ñ.×6Ñ6Ð8UÕVr   Frö   rø   s   `  r   Ú
test_unTLSzTLSTests.test_unTLS„  s=   ø€ ô	Wð �M‰MÜ!Ó#¤]°5¸$¿/¹/Ó%Jó
ˆð �}‰}˜UÓ#Ð#r   c                 óŽ   ‡ — ˆ fd„}‰ j                  t        d‰ j                  «      t        «       d«      }|j	                  |«      S )z:
        Test startTLS first initiated by client.
        c                 ó�   •— ‰j                  ‰j                  j                  t        j                  t        j
                  z   «       y r   )rò   râ   rF   r   r&   r0   rþ   s    €r   rô   z)TLSTests.test_backwardsTLS.<locals>.check˜  rõ   r   T)rï   r@   rC   r   r÷   rø   s   `  r   Útest_backwardsTLSzTLSTests.test_backwardsTLS“  s?   ø€ ô
	ð �M‰MÜ˜$ §¡Ó0Ô2GÓ2IÈ4ó
ˆð �}‰}˜UÓ#Ð#r   rV   )r;   r<   r=   r>   r   rÑ   r   rÒ   rC   rÖ   r×   rØ   rï   rú   r   r  r   r   r   rÔ   rÔ   :  sM   „ ñð €z×Ñ˜g tÓ,Ð4ØCˆà€Jà€KØ€Kò8ó#QòJ$ò$ó$r   rÔ   c                   ó>   — e Zd ZdZ ej
                  ed«      €dZdZy)ÚSpammyTLSTestszA
    Test TLS features with bytes sitting in the out buffer.
    Nr³   T)	r;   r<   r=   r>   r   rÑ   r   rÒ   rC   r   r   r   r  r  ¤  s(   „ ñð €z×Ñ˜g tÓ,Ð4ØCˆà�Jr   r  c                   óJ   — e Zd Z ej                  ed«      €dZdZdZd„ Z	d„ Z
y)ÚBufferingTestsNr³   c                 ó6  — | j                   j                  �$| j                   j                  j                  «        | j                  j                  �$| j                  j                  j                  «        t	        t
        | j                   | j                  g«      S r   )r×   r,   r1   rÖ   r   r   r!   s    r   rØ   zBufferingTests.tearDown¶  st   € Ø×Ñ×%Ñ%Ð1Ø×Ñ×&Ñ&×5Ñ5Ô7Ø×Ñ×%Ñ%Ð1Ø×Ñ×&Ñ&×5Ñ5Ô7ä'¬°$×2BÑ2BÀD×DTÑDTÐ1UÓVÐVr   c                 ó~  ‡‡— t        «       xŠ| _        t        «       xŠ| _        t	        j
                  «       }t	        j                  «       x}| _        ˆfd„|_        ˆfd„|_        t        j                  t        t        «      }t        j                  «       }t        j                  d||d¬«      }| j                  |j                  «       t        j                   d|j#                  «       j$                  ||«      }| j                  |j&                  «       ‰j(                  j+                  | j,                  d«      S )Nc                  ó   •— ‰ S r   r   rß   s   €r   rÜ   z6BufferingTests.test_openSSLBuffering.<locals>.<lambda>Å  ó   ø€  +€ r   c                  ó   •— ‰ S r   r   rÛ   s   €r   rÜ   z6BufferingTests.test_openSSLBuffering.<locals>.<lambda>Æ  r  r   r   rà   rµ   rZ   )rX   r×   r^   rÖ   r   rã   rá   r/   r   rš   r   ÚClientContextFactoryr   r»   ræ   rç   rÂ   ré   rê   Ú
disconnectr    r÷   rò   )	r"   rM   r/   ÚsCTXÚcCTXrê   ÚclientConnectorrÖ   r×   s	          @@r   Útest_openSSLBufferingz$BufferingTests.test_openSSLBuffering¾  sú   ù€ Ü)AÓ)CÐCˆ�dÔ&Ü)@Ó)BÐBˆ�dÔ&ä×'Ñ'Ó)ˆÜ'×5Ñ5Ó7Ð7ˆ�”ã-ˆŒÛ-ˆŒä×/Ñ/´¼(ÓCˆÜ×'Ñ'Ó)ˆä× Ñ   F¨D¸KÔHˆØ�‰˜×*Ñ*Ô+ä!×,Ñ,Ø˜Ÿ™›×,Ñ,¨f°dó
ˆð 	�‰˜×2Ñ2Ô3à×#Ñ#×/Ñ/Ø×ÑÐ4ó
ð 	
r   )r;   r<   r=   r   rÑ   r   rÒ   r×   rÖ   rØ   r  r   r   r   r  r  ¯  s1   „ Ø€z×Ñ˜g tÓ,Ð4ØCˆà€KØ€KòWó
r   r  c                   óR   — e Zd ZdZ ej
                  ed«      €dZd„ Zd„ Z	d„ Z
d„ Zy)ÚConnectionLostTestsz'
    SSL connection closing tests.
    Nr³   c                 ó  ‡ — d}‰ j                  ||dz   fi ||dz   fi «       t        j                  «       }t        j                  |_        t	        j
                  d|‰ j                  «      x‰ _        }t        j                  «       }t        |_        t        j                  «       |_        t	        j                  d|j                  «       j                  |‰ j                   «       |j                  j#                  ˆ fd„«      S )Nútwisted.test.test_sslú, clientú, serverr   rà   c                 ó8   •— ‰j                   j                  «       S r   )Ú
serverPortrç   )ÚignoredResultr"   s    €r   rÜ   z=ConnectionLostTests.testImmediateDisconnect.<locals>.<lambda>ù  s   ø€  $§/¡/×"?Ñ"?Ó"A€ r   )rª   r   rã   ÚProtocolr   r»   r    r  rá   rd   r   r   ri   rÂ   ré   rê   r¤   r÷   )r"   r›   ÚserverProtocolFactoryr  ÚclientProtocolFactorys   `    r   ÚtestImmediateDisconnectz+ConnectionLostTests.testImmediateDisconnectà  sñ   ø€ Ø%ˆØ×!Ñ!Ø�#˜
Ñ"Ð# R¨#¨s°ZÑ/?Ð)@À"ô	
ô !)× 6Ñ 6Ó 8ÐÜ)1×):Ñ):ÐÔ&Ü'.×'8Ñ'8ØÐ$ d×&;Ñ&;ó(
ð 	
ˆŒ˜*ô !)× 6Ñ 6Ó 8ÐÜ)IÐÔ&Ü7<·~±~Ó7GÐÔ4Ü×ÑØØ×ÑÓ ×%Ñ%Ø!Ø×!Ñ!ô		
ð %×;Ñ;×GÑGÛAó
ð 	
r   c                 óÈ  ‡‡— t        t        j                  «       G d„ dt        j                  «      «       }d}| j                  ||dz   fi ||dz   fi «        |«       Št        j                  «       }ˆfd„|_        t        j                  d|| j                  «      }| j                  |j                  «        |«       Št        j                  «       }ˆfd„|_        t        j                  d	|j                  «       j                  || j                   «       d
„ }t#        j$                  ‰j&                  j)                  |«      ‰j&                  j)                  |«      g«      S )zµ
        Both sides of SSL connection close connection; the connections should
        close cleanly, and only after the underlying TCP connection has
        disconnected.
        c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)úMConnectionLostTests.test_bothSidesLoseConnection.<locals>.CloseAfterHandshakeFc                 ó6   — t        j                  «       | _        y r   )r   r   Údoner!   s    r   r#   zVConnectionLostTests.test_bothSidesLoseConnection.<locals>.CloseAfterHandshake.__init__  s   € Ü!ŸN™NÓ,�•	r   c                 ó8   — | j                   j                  «        y r   rf   r!   s    r   rg   z`ConnectionLostTests.test_bothSidesLoseConnection.<locals>.CloseAfterHandshake.handshakeCompleted
  s   € Ø—‘×-Ñ-Õ/r   c                 ó>   — | j                   j                  |«       | ` y r   )r$  Úerrbackr7   s     r   r9   z\ConnectionLostTests.test_bothSidesLoseConnection.<locals>.CloseAfterHandshake.connectionLost  s   € Ø—	‘	×!Ñ! &Ô)Ø‘Ir   N)r;   r<   r=   ÚgotDatar#   rg   r9   r   r   r   ÚCloseAfterHandshaker"    s   „ àˆGò-ò0ór   r)  r  r  r  c                  ó   •— ‰ S r   r   ©ÚserverProtocols   €r   rÜ   zBConnectionLostTests.test_bothSidesLoseConnection.<locals>.<lambda>  ó   ø€ °€ r   r   c                  ó   •— ‰ S r   r   ©ÚclientProtocols   €r   rÜ   zBConnectionLostTests.test_bothSidesLoseConnection.<locals>.<lambda>  r-  r   rà   c                 ó.   — | j                  t        «       y r   )Útrapr   )Úfailures    r   ÚcheckResultzEConnectionLostTests.test_bothSidesLoseConnection.<locals>.checkResult&  s   € Ø�L‰LœÕ(r   )r   r   ÚIHandshakeListenerr   r  rª   rã   r   r»   r    ræ   rç   rá   rÂ   ré   rê   r¤   r   rë   r$  Ú
addErrback)	r"   r)  r›   r  r  r  r4  r0  r,  s	          @@r   Útest_bothSidesLoseConnectionz0ConnectionLostTests.test_bothSidesLoseConnectionü  sF  ù€ ô 
”Z×2Ñ2Ó	3ô	¤(×"3Ñ"3ó 	ó 
4ð	ð &ˆØ×!Ñ!Ø�#˜
Ñ"Ð# R¨#¨s°ZÑ/?Ð)@À"ô	
ñ -Ó.ˆÜ (× 6Ñ 6Ó 8ÐÛ)?ÐÔ&Ü×&Ñ& qÐ*?À×AVÑAVÓWˆ
Ø�‰˜
×0Ñ0Ô1á,Ó.ˆÜ (× 6Ñ 6Ó 8ÐÛ)?ÐÔ&Ü×ÑØØ×ÑÓ ×%Ñ%Ø!Ø×!Ñ!ô		
ò	)ô ×"Ñ"à×#Ñ#×.Ñ.¨{Ó;Ø×#Ñ#×.Ñ.¨{Ó;ðó
ð 	
r   c                 óD  ‡	‡
— d}| j                  ||dz   fi ||dz   fi «       d„ }| j                  j                  «       j                  t        j
                  |«       t        j                  «       }t        j                  «       Š
|j                  ‰
_        t        j                  «       }ˆ
fd„|_        t        j                  d|| j                  «      x| _        }t        j                  «       }t        j                  «       Š	|j                  ‰	_        t        j"                  «       }ˆ	fd„|_        t        j$                  d|j'                  «       j(                  || j                  «       t        j*                  ||gd	¬
«      }|j-                  | j.                  «      S )Nr  r  r  c                   ó   — y)NFr   )Úas    r   Úverifyz4ConnectionLostTests.testFailedVerify.<locals>.verify6  s   € Ør   c                  ó   •— ‰ S r   r   r+  s   €r   rÜ   z6ConnectionLostTests.testFailedVerify.<locals>.<lambda>?  r-  r   r   c                  ó   •— ‰ S r   r   r/  s   €r   rÜ   z6ConnectionLostTests.testFailedVerify.<locals>.<lambda>H  r-  r   rà   T)ÚconsumeErrors)rª   r¤   Ú
getContextÚ
set_verifyr   ÚVERIFY_PEERr   r   r   r  r6   r9   rã   r   r»   r    r  rá   rÂ   ré   rê   ÚDeferredListr÷   Ú_cbLostConns)r"   r›   r;  ÚserverConnLostr  r  ÚclientConnLostr  Údlr0  r,  s            @@r   ÚtestFailedVerifyz$ConnectionLostTests.testFailedVerify0  sd  ù€ Ø%ˆØ×!Ñ!Ø�#˜
Ñ"Ð# R¨#¨s°ZÑ/?Ð)@À"ô	
ò	ð 	×Ñ×(Ñ(Ó*×5Ñ5´c·o±oÀvÔNäŸ™Ó)ˆÜ!×*Ñ*Ó,ˆØ(6×(?Ñ(?ˆÔ%Ü (× 6Ñ 6Ó 8ÐÛ)?ÐÔ&Ü'.×'8Ñ'8ØÐ$ d×&;Ñ&;ó(
ð 	
ˆŒ˜*ô Ÿ™Ó)ˆÜ!×*Ñ*Ó,ˆØ(6×(?Ñ(?ˆÔ%Ü (× 6Ñ 6Ó 8ÐÛ)?ÐÔ&Ü×ÑØØ×ÑÓ ×%Ñ%Ø!Ø×!Ñ!ô		
ô ×Ñ °Ð @ÐPTÔUˆØ�~‰~˜d×/Ñ/Ó0Ð0r   c                 óD  — |\  \  }}\  }}| j                  |«       | j                  |«       t        j                  g}t        j                  «       rddlm} |j                  |«        |j                  |Ž   |j                  |Ž  | j                  j                  «       S )Nr   )ÚConnectionLost)ÚassertFalser   rÆ   r   Ú	isWindowsÚtwisted.internet.errorrI  rJ   r2  r  rç   )r"   ÚresultsÚsSuccessÚsResultÚcSuccessÚcResultÚacceptableErrorsrI  s           r   rC  z ConnectionLostTests._cbLostConnsS  sŽ   € Ø3:Ñ0Ñˆ�7Ñ0˜h¨à×Ñ˜Ô"Ø×Ñ˜Ô"äŸI™I˜;Ðô ×ÑÔÝ=à×#Ñ# NÔ3àˆ�‰Ð&Ñ'Øˆ�‰Ð&Ñ'à�‰×,Ñ,Ó.Ð.r   )r;   r<   r=   r>   r   rÑ   r   rÒ   r  r7  rG  rC  r   r   r   r  r  Ø  s9   „ ñð €z×Ñ˜g tÓ,Ð4ØCˆò
ò82
òh!1óF/r   r  c                   ó(   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zy)ÚFakeContextzK
    L{OpenSSL.SSL.Context} double which can more easily be inspected.
    c                 ó    — || _         d| _        y )Nr   )Ú_methodÚ_options)r"   Úmethods     r   r#   zFakeContext.__init__s  s   € ØˆŒØˆ�r   c                 ó.   — | xj                   |z  c_         y r   )rW  )r"   rº   s     r   Úset_optionszFakeContext.set_optionsw  s   € Ø�Š˜Ñ Žr   c                  ó   — y r   r   ©r"   ÚfileNames     r   Úuse_certificate_filez FakeContext.use_certificate_filez  ó   € Ør   c                  ó   — y r   r   r\  s     r   Úuse_privatekey_filezFakeContext.use_privatekey_file}  r_  r   N)r;   r<   r=   r>   r#   rZ  r^  ra  r   r   r   rT  rT  n  s   „ ñòò!òór   rT  c                   óR   — e Zd ZdZ ej
                  ed«      €dZd„ Zd„ Z	d„ Z
d„ Zy)Ú!DefaultOpenSSLContextFactoryTestsz8
    Tests for L{ssl.DefaultOpenSSLContextFactory}.
    Nr³   c                 ó”   — t        j                  t        t        t        ¬«      | _        | j                  j                  «       | _        y )N)Ú_contextFactory)r   rš   r   rT  r¾   r?  Úcontextr!   s    r   ÚsetUpz'DefaultOpenSSLContextFactoryTests.setUp‰  s6   € ô "×>Ñ>Ü”h´ô
ˆÔð ×*Ñ*×5Ñ5Ó7ˆ�r   c                 ób  — | j                  | j                  j                  t        j                  «       | j                  | j                  j
                  t        j                  z  t        j                  «       | j                  | j                  j
                  t        j                  z  «       y)z‹
        L{ssl.DefaultOpenSSLContextFactory.getContext} returns an SSL context
        which can use SSLv3 or TLSv1 but not SSLv2.
        N)	rò   rf  rV  r   Ú
TLS_METHODrW  ÚOP_NO_SSLv2rJ  ÚOP_NO_TLSv1_2r!   s    r   Útest_methodz-DefaultOpenSSLContextFactoryTests.test_method‘  sp   € ð 	×Ñ˜Ÿ™×-Ñ-¬s¯~©~Ô>ð 	×Ñ˜Ÿ™×.Ñ.´·±Ñ@Ä#Ç/Á/ÔRð 	×Ñ˜Ÿ™×.Ñ.´×1BÑ1BÑBÕCr   c                 óˆ   — | j                  t        j                  t        j                  t
        | j                  «       «       y)zÑ
        Instantiating L{ssl.DefaultOpenSSLContextFactory} with a certificate
        filename which does not identify an existing file results in the
        initializer raising L{OpenSSL.SSL.Error}.
        N)ÚassertRaisesr   rÆ   r   rš   r   r™   r!   s    r   Útest_missingCertificateFilez=DefaultOpenSSLContextFactoryTests.test_missingCertificateFileŸ  s+   € ð 	×ÑÜ�I‰I”s×7Ñ7¼À4Ç;Á;Ã=õ	
r   c                 óˆ   — | j                  t        j                  t        j                  | j                  «       t        «       y)zÑ
        Instantiating L{ssl.DefaultOpenSSLContextFactory} with a private key
        filename which does not identify an existing file results in the
        initializer raising L{OpenSSL.SSL.Error}.
        N)rn  r   rÆ   r   rš   r™   r   r!   s    r   Útest_missingPrivateKeyFilez<DefaultOpenSSLContextFactoryTests.test_missingPrivateKeyFile©  s+   € ð 	×ÑÜ�I‰I”s×7Ñ7¸¿¹»Ìõ	
r   )r;   r<   r=   r>   r   rÑ   r   rÒ   rg  rl  ro  rq  r   r   r   rc  rc  �  s8   „ ñð €z×Ñ˜g tÓ,Ð4ØCˆò8òDò
ó
r   rc  c                   óF   — e Zd ZdZ ej
                  ed«      €dZd„ Zd„ Z	y)ÚClientContextFactoryTestsz0
    Tests for L{ssl.ClientContextFactory}.
    Nr³   c                 óž   — t        j                  «       | _        t        | j                  _        | j                  j                  «       | _        y r   )r   r  r¾   rT  re  r?  rf  r!   s    r   rg  zClientContextFactoryTests.setUp¼  s7   € Ü!×6Ñ6Ó8ˆÔÜ.9ˆ×ÑÔ+Ø×*Ñ*×5Ñ5Ó7ˆ�r   c                 óÎ  — | j                  | j                  j                  t        j                  «       | j                  | j                  j
                  t        j                  z  t        j                  «       | j                  | j                  j
                  t        j                  z  «       | j                  | j                  j
                  t        j                  z  «       y)z„
        L{ssl.ClientContextFactory.getContext} returns a context which can use
        TLSv1.2 or 1.3 but nothing earlier.
        N)
rò   rf  rV  r   ri  rW  rj  rý   ÚOP_NO_SSLv3ÚOP_NO_TLSv1r!   s    r   rl  z%ClientContextFactoryTests.test_methodÁ  s‡   € ð
 	×Ñ˜Ÿ™×-Ñ-¬s¯~©~Ô>Ø×Ñ˜Ÿ™×.Ñ.´·±Ñ@Ä#Ç/Á/ÔRØ�‰˜Ÿ™×-Ñ-´·±Ñ?Ô@Ø�‰˜Ÿ™×-Ñ-´·±Ñ?Õ@r   )
r;   r<   r=   r>   r   rÑ   r   rÒ   rg  rl  r   r   r   rs  rs  ´  s.   „ ñð €z×Ñ˜g tÓ,Ð4ØCˆò8ó
Ar   rs  )6r>   rŠ   rÌ   Útwisted.internetr   r   r   r   rL  r   Útwisted.internet.testingr   Útwisted.protocolsr	   Útwisted.python.filepathr
   Útwisted.python.runtimer   Útwisted.test.test_tcpr   Útwisted.trial.unittestr   ÚOpenSSLr   r   r   Útwisted.test.ssl_helpersr   r   ÚImportErrorr   Úzope.interfacer   ÚLineReceiverr   r@   r  rX   r^   r5  rd   r„   r•   r—   rš   rL   r²   rÔ   r  r  r  rT  rc  rs  r   r   r   ú<module>r„     st  ðñó 
ã ç AÓ AÝ 1Ý =Ý #Ý ,Ý +Ý 9Ý +ðß#å$ßCõ 'ô%˜E×.Ñ.ô %ôD+%�E×&Ñ&ô +%ô\,˜x×0Ñ0ô ,ô%˜h×/Ñ/ô %ñ  ˆZ×*Ñ*Ó+ô
; x×'8Ñ'8ó 
;ó ,ð
;òò8G÷ &
ñ &
ôR €?ô
Iœ3×;Ñ;ô 
Iô4
Ð,¨hô 4
ông$ˆxô g$ôT�Xô ô&
�Xô &
ôRS/˜(Ð$:ô S/÷lñ ô&0
¨ô 0
ôfA õ Aøðu ò òñ ‡Hðús   ÁE% Å%E8Å7E8