Ë
    oj)2  ã            
       óX  — d Z ddlmZmZmZ ddlmZmZ ddlm	Z	m
Z
 ddlmZmZmZ ddlmZ ddlmZmZmZ ddlmZmZmZ dd	lmZmZmZ dd
lmZ ddlm Z 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.m/Z/m0Z0  G d„ d«      Z2 G d„ d«      Z3 ee«       G d„ d«      «       Z4 G d„ dee3«      Z5 G d„ d«      Z6 G d„ de2ee«      Z7 G d„ d ee3«      Z8 G d!„ d"e2ee3ee6«      Z9 G d#„ d$e2e3e6e!e"e«      Z: e;«       jy                  e9j{                  «       «        e;«       jy                  e7j{                  «       «        e;«       jy                   e:«       j{                  «       «        G d%„ d&ee e3«      Z> e;«       jy                  e>j{                  «       «       y# e1$ r dZ,Y �Œ$w xY w)'z0
Tests for implementations of L{ITLSTransport}.
é    )ÚOptionalÚSequenceÚType)Ú	InterfaceÚimplementer)ÚDeferredÚDeferredList)ÚSSL4ClientEndpointÚSSL4ServerEndpointÚTCP4ClientEndpoint)ÚConnectionClosed)ÚIReactorSSLÚIStreamClientEndpointÚITLSTransport)ÚClientFactoryÚProtocolÚServerFactory)ÚBrokenContextFactoryÚConnectionTestsMixinÚEndpointCreator)ÚReactorBuilder)ÚAbortConnectionMixinÚConnectToTCPListenerMixinÚStreamTransportTestsMixin)ÚnetworkString)ÚFilePath)Úplatform)ÚSkipTest)ÚFILETYPE_PEM)ÚClientContextFactoryÚKeyPairÚPrivateCertificateNc                   ób   — e Zd ZU egZeeee         e	d<    e
j                  «       rdZeedœZyy)ÚTLSMixinÚrequiredInterfaceszcFor some reason, these reactors don't deal with SSL disconnection correctly on Windows.  See #3371.)z*twisted.internet.glib2reactor.Glib2Reactorz(twisted.internet.gtk2reactor.Gtk2ReactorN)Ú__name__Ú
__module__Ú__qualname__r   r%   r   r   r   r   Ú__annotations__r   Ú	isWindowsÚmsgÚskippedReactors© ó    ú@/usr/lib/python3/dist-packages/twisted/internet/test/test_tls.pyr$   r$   2   sI   … Ø?J¸mÐ˜ ¨$¨y©/Ñ!:Ñ;ÓKà€x×ÑÔð>ð 	ð
 ;>Ø8;ñ
‰ð r.   r$   c                   óŽ   — e Zd ZddlZ e eej                  «      «      j                  d«      j                  d«      Z	[d„ Z
d„ Zy)ÚContextGeneratingMixinr   Ns   tests
   server.pemc                 ó¼   — | j                   j                  «       }t        j                  |t	        j                  |t
        «      t
        «      }|j                  «       S )zM
        Return a new SSL context suitable for use in a test server.
        )Ú_pemÚ
getContentr"   Úloadr!   r   Úoptions)ÚselfÚpemÚcerts      r/   ÚgetServerContextz'ContextGeneratingMixin.getServerContextH   sF   € ð �i‰i×"Ñ"Ó$ˆÜ!×&Ñ&Ø”—‘˜c¤<Ó0´,ó
ˆð �|‰|‹~Ðr.   c                 ó   — t        «       S ©N)r    ©r7   s    r/   ÚgetClientContextz'ContextGeneratingMixin.getClientContextR   s   € Ü#Ó%Ð%r.   )r&   r'   r(   Útwistedr   r   Ú__file__ÚsiblingÚchildr3   r:   r>   r-   r.   r/   r1   r1   @   sD   „ Ûñ 	‘˜w×/Ñ/Ó0Ó1×9Ñ9¸'ÓB×HÑHÈÓWð 	ð 	òó&r.   r1   c                   ó   — e Zd ZdZd„ Zd„ Zy)ÚStartTLSClientEndpointa!  
    An endpoint which wraps another one and adds a TLS layer immediately when
    connections are set up.

    @ivar wrapped: A L{IStreamClientEndpoint} provider which will be used to
        really set up connections.

    @ivar contextFactory: A L{ContextFactory} to use to do TLS.
    c                 ó    — || _         || _        y r<   )ÚwrappedÚcontextFactory)r7   rF   rG   s      r/   Ú__init__zStartTLSClientEndpoint.__init__b   s   € ØˆŒØ,ˆÕr.   c                 ój   ‡ ‡—  G ˆˆ fd„dt         «      }‰ j                  j                   |«       «      S )z¼
        Establish a connection using a protocol build by C{factory} and
        immediately start TLS on it.  Return a L{Deferred} which fires with the
        protocol instance.
        c                   ó   •— e Zd Zˆ ˆfd„Zy)ú6StartTLSClientEndpoint.connect.<locals>.WrapperFactoryc                 ó^   •‡— ‰j                  |«      Š‰j                  fˆˆfd„	}|‰_        ‰S )Nc                 ó^   •— ‰j                   j                  ‰j                  «        | «        y r<   )Ú	transportÚstartTLSrG   )ÚorigÚprotocolr7   s    €€r/   ÚconnectionMadez\StartTLSClientEndpoint.connect.<locals>.WrapperFactory.buildProtocol.<locals>.connectionMades   s"   ø€ Ø×&Ñ&×/Ñ/°×0CÑ0CÔDÙ•Fr.   )ÚbuildProtocolrR   )ÚwrapperSelfÚaddrrR   rQ   Úfactoryr7   s      @€€r/   rS   zDStartTLSClientEndpoint.connect.<locals>.WrapperFactory.buildProtocolp   s0   ù€ Ø"×0Ñ0°Ó6�à(0×(?Ñ(?ö ð +9�Ô'Ø�r.   N)r&   r'   r(   rS   )rV   r7   s   €€r/   ÚWrapperFactoryrK   o   s   ø„ ö r.   rW   )r   rF   Úconnect)r7   rV   rW   s   `` r/   rX   zStartTLSClientEndpoint.connectf   s)   ù€ ÷		 œ]ô 		 ð �|‰|×#Ñ#¡NÓ$4Ó5Ð5r.   N)r&   r'   r(   Ú__doc__rH   rX   r-   r.   r/   rD   rD   V   s   „ ñò-ó6r.   rD   c                   ó   — e Zd ZdZd„ Zd„ Zy)ÚStartTLSClientCreatorz{
    Create L{ITLSTransport.startTLS} endpoint for the client, and normal SSL
    for server just because it's easier.
    c                 ó8   — t        |d| j                  «       «      S )zµ
        Construct an SSL server endpoint.  This should be constructing a TCP
        server endpoint which immediately calls C{startTLS} instead, but that
        is hard.
        r   ©r   r:   ©r7   Úreactors     r/   ÚserverzStartTLSClientCreator.serverƒ   s   € ô " '¨1¨d×.CÑ.CÓ.EÓFÐFr.   c                 óT   — t        t        |d|j                  «      t        «       «      S )zS
        Construct a TCP client endpoint wrapped to immediately start TLS.
        ú	127.0.0.1)rD   r   Úportr    ©r7   r_   ÚserverAddresss      r/   ÚclientzStartTLSClientCreator.client‹   s)   € ô &Ü˜w¨°]×5GÑ5GÓHÜ Ó"ó
ð 	
r.   N©r&   r'   r(   rY   r`   rf   r-   r.   r/   r[   r[   }   s   „ ñò
Gó
r.   r[   c                   ó   — e Zd ZdZd„ Zy)ÚBadContextTestsMixinz�
    Mixin for L{ReactorBuilder} subclasses which defines a helper for testing
    the handling of broken context factories.
    c                 ó¶   — | j                  «       }| j                  t        ||t        «       «      }| j	                  t        j
                  t        |«      «       y)aÐ  
        Assert that the exception raised by a broken context factory's
        C{getContext} method is raised by some reactor method.  If it is not, an
        exception will be raised to fail the test.

        @param useIt: A two-argument callable which will be called with a
            reactor and a broken context factory and which is expected to raise
            the same exception as the broken context factory's C{getContext}
            method.
        N)ÚbuildReactorÚassertRaisesÚ
ValueErrorr   ÚassertEqualÚmessageÚstr)r7   ÚuseItr_   Úexcs       r/   Ú_testBadContextz$BadContextTestsMixin._testBadContext›   sG   € ð ×#Ñ#Ó%ˆØ×Ñ¤
¨E°7Ô<PÓ<RÓSˆØ×ÑÔ-×5Ñ5´s¸3³xÕ@r.   N)r&   r'   r(   rY   rs   r-   r.   r/   ri   ri   •   s   „ ñó
Ar.   ri   c                   ó   — e Zd ZdZ e«       Zy)ÚStartTLSClientTestsMixinzš
    Tests for TLS connections established using L{ITLSTransport.startTLS} (as
    opposed to L{IReactorSSL.connectSSL} or L{IReactorSSL.listenSSL}).
    N)r&   r'   r(   rY   r[   Ú	endpointsr-   r.   r/   ru   ru   «   s   „ ññ
 &Ó'�Ir.   ru   c                   ó   — e Zd ZdZd„ Zd„ Zy)Ú
SSLCreatorz
    Create SSL endpoints.
    c                 ó8   — t        |d| j                  «       «      S )zQ
        Create an SSL server endpoint on a TCP/IP-stack allocated port.
        r   r]   r^   s     r/   r`   zSSLCreator.server¹   s   € ô " '¨1¨d×.CÑ.CÓ.EÓFÐFr.   c                 óB   — t        |d|j                  t        «       «      S )z¨
        Create an SSL client endpoint which will connect localhost on
        the port given by C{serverAddress}.

        @type serverAddress: L{IPv4Address}
        rb   )r
   rc   r    rd   s      r/   rf   zSSLCreator.client¿   s$   € ô "Ø�[ -×"4Ñ"4Ô6JÓ6Ló
ð 	
r.   Nrg   r-   r.   r/   rx   rx   ´   s   „ ñòGó	
r.   rx   c                   ó*   — e Zd ZdZ e«       Zd„ Zd„ Zy)ÚSSLClientTestsMixinz<
    Mixin defining tests relating to L{ITLSTransport}.
    c                 ó,   — d„ }| j                  |«       y)zÆ
        If the context factory passed to L{IReactorSSL.connectSSL} raises an
        exception from its C{getContext} method, that exception is raised by
        L{IReactorSSL.connectSSL}.
        c                 ó:   — | j                  ddt        «       |«      S )Nrb   iÒ  )Ú
connectSSLr   ©r_   rG   s     r/   rq   z2SSLClientTestsMixin.test_badContext.<locals>.useItß   s    € Ø×%Ñ%Ø˜T¤=£?°Nóð r.   N©rs   ©r7   rq   s     r/   Útest_badContextz#SSLClientTestsMixin.test_badContextØ   s   € ò	ð
 	×Ñ˜UÕ#r.   c                 óž  ‡‡	—  G d„ dt         «      }| j                  «       Š	t        «       }t        «       |_        ||_        | j                  «       |_        t        «       }t        «       |_        ||_        | j                  «       |_        |j                  j                  |j                  _
        g Št        |j                  |j                  gd¬«      }ˆfd„}|j                  |«       ‰	j                  d|d¬«      }| j                  |j                  «       ‰	j!                  |j#                  «       j$                  |j#                  «       j&                  |«      }| j                  |j(                  «       |j                  ˆ	fd	„«       | j+                  ‰	«       ‰d   j-                  t.        «       ‰d
   j-                  t.        «       y)aO  
        L{ITCPTransport.loseConnection} ends a connection which was set up with
        L{ITLSTransport.startTLS} and which has recently been written to.  This
        is intended to verify that a socket send error masked by the TLS
        implementation doesn't prevent the connection from being reported as
        closed.
        c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)úQSSLClientTestsMixin.test_disconnectAfterWriteAfterStartTLS.<locals>.ShortProtocolc                 óZ  — t        j                  | j                  «      sB| j                  j                  }d | j                  _        |j                  t        d«      «       y | j                  j                  | j                  j                  «       | j                  j                  d«       y )NzNo ITLSTransport supportó   x)
r   Ú
providedByrN   rV   ÚfinishedÚerrbackr   rO   ÚcontextÚwrite)r7   rŠ   s     r/   rR   z`SSLClientTestsMixin.test_disconnectAfterWriteAfterStartTLS.<locals>.ShortProtocol.connectionMadeð   sx   € Ü$×/Ñ/°·±Ô?à#Ÿ|™|×4Ñ4�HØ,0�D—L‘LÔ)Ø×$Ñ$¤XÐ.HÓ%IÔJØð —‘×'Ñ'¨¯©×(<Ñ(<Ô=ð —‘×$Ñ$ TÕ*r.   c                 ón   — | j                   j                  d«       | j                   j                  «        y )Nó   y)rN   r�   ÚloseConnection)r7   Údatas     r/   ÚdataReceivedz^SSLClientTestsMixin.test_disconnectAfterWriteAfterStartTLS.<locals>.ShortProtocol.dataReceivedþ   s(   € ð
 —‘×$Ñ$ TÔ*ð —‘×-Ñ-Õ/r.   c                 óz   — | j                   j                  }|�#d | j                   _        |j                  |«       y y r<   )rV   rŠ   Úcallback)r7   ÚreasonrŠ   s      r/   ÚconnectionLostz`SSLClientTestsMixin.test_disconnectAfterWriteAfterStartTLS.<locals>.ShortProtocol.connectionLost  s8   € ð  Ÿ<™<×0Ñ0�ØÐ'Ø,0�D—L‘LÔ)Ø×%Ñ% fÕ-ð (r.   N)r&   r'   r(   rR   r’   r–   r-   r.   r/   ÚShortProtocolr†   ï   s   „ ò+ò0ó.r.   r—   T)ÚconsumeErrorsc                 óD   •— ‰j                  | d   d   | d   d   g«       y )Nr   é   )Úextend)ÚresultsÚlostConnectionResultss    €r/   Ú
cbFinishedzNSSLClientTestsMixin.test_disconnectAfterWriteAfterStartTLS.<locals>.cbFinished"  s&   ø€ Ø!×(Ñ(¨'°!©*°Q©-¸À¹ÀA¹Ð)GÕHr.   r   rb   )Ú	interfacec                 ó$   •— ‰j                  «       S r<   )Ústop)Úignr_   s    €r/   ú<lambda>zLSSLClientTestsMixin.test_disconnectAfterWriteAfterStartTLS.<locals>.<lambda>/  s   ø€ ¨¯©«€ r.   rš   N)r   rk   r   r   rŠ   rQ   r:   rŒ   r   r>   Úmethodr	   ÚaddCallbackÚ	listenTCPÚ
addCleanupÚstopListeningÚ
connectTCPÚgetHostÚhostrc   Ú
disconnectÚ
runReactorÚtrapr   )
r7   r—   ÚserverFactoryÚclientFactoryrŠ   rž   rc   Ú	connectorr�   r_   s
           @@r/   Ú&test_disconnectAfterWriteAfterStartTLSz:SSLClientTestsMixin.test_disconnectAfterWriteAfterStartTLSæ   sy  ù€ ô	.œHô 	.ðB ×#Ñ#Ó%ˆä%›ˆÜ!)£ˆÔØ!.ˆÔØ $× 5Ñ 5Ó 7ˆÔä%›ˆÜ!)£ˆÔØ!.ˆÔØ $× 5Ñ 5Ó 7ˆÔØ'4×'<Ñ'<×'CÑ'Cˆ×ÑÔ$à "ÐÜØ×#Ñ# ]×%;Ñ%;Ð<ÈDô
ˆô	Ið 	×Ñ˜ZÔ(à× Ñ   M¸[Ð ÓIˆØ�‰˜×*Ñ*Ô+à×&Ñ&Ø�L‰L‹N×Ñ §¡£×!4Ñ!4°mó
ˆ	ð 	�‰˜	×,Ñ,Ô-à×ÑÓ7Ô8Ø�‰˜Ô Ø˜aÑ ×%Ñ%Ô&6Ô7Ø˜aÑ ×%Ñ%Ô&6Õ7r.   N)r&   r'   r(   rY   rx   rv   rƒ   r²   r-   r.   r/   r|   r|   Ë   s   „ ññ “€Iò$óL8r.   r|   c                   ó.   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚTLSPortTestsBuilderz,
    Tests for L{IReactorSSL.listenSSL}
    c                 óD   — |j                  d|| j                  «       «      S )z0
        Get a TLS port from a reactor.
        r   )Ú	listenSSLr:   )r7   r_   rV   s      r/   ÚgetListeningPortz$TLSPortTestsBuilder.getListeningPortA  s"   € ð × Ñ   G¨T×-BÑ-BÓ-DÓEÐEr.   c                 ó@   — d||j                  «       j                  fz  S )zY
        Get the message expected to be logged when a TLS port starts listening.
        z%s (TLS) starting on %d©rª   rc   )r7   rc   rV   s      r/   Ú#getExpectedStartListeningLogMessagez7TLSPortTestsBuilder.getExpectedStartListeningLogMessageG  s    € ð )¨G°T·\±\³^×5HÑ5HÐ+IÑIÐIr.   c                 ó>   — d|j                  «       j                  › d�S )zJ
        Get the expected connection lost message for a TLS port.
        z
(TLS Port z Closed)r¹   )r7   rc   s     r/   ÚgetExpectedConnectionLostLogMsgz3TLSPortTestsBuilder.getExpectedConnectionLostLogMsgM  s    € ð ˜DŸL™L›N×/Ñ/Ð0°Ð9Ð9r.   c                 ó,   — d„ }| j                  |«       y)zÄ
        If the context factory passed to L{IReactorSSL.listenSSL} raises an
        exception from its C{getContext} method, that exception is raised by
        L{IReactorSSL.listenSSL}.
        c                 ó8   — | j                  dt        «       |«      S )Nr   )r¶   r   r€   s     r/   rq   z2TLSPortTestsBuilder.test_badContext.<locals>.useItZ  s   € Ø×$Ñ$ Q¬«¸ÓHÐHr.   Nr�   r‚   s     r/   rƒ   z#TLSPortTestsBuilder.test_badContextS  s   € ò	Ið 	×Ñ˜UÕ#r.   c                 ón   — |j                  | j                  |j                  || j                  «       «      S )a  
        Connect to the given listening TLS port, assuming the
        underlying transport is TCP.

        @param reactor: The reactor under test.
        @type reactor: L{IReactorSSL}

        @param address: The listening's address.  Only the C{port}
            component is used; see
            L{ConnectToTCPListenerMixin.LISTENER_HOST}.
        @type address: L{IPv4Address} or L{IPv6Address}

        @param factory: The client factory.
        @type factory: L{ClientFactory}

        @return: The connector
        )r   ÚLISTENER_HOSTrc   r>   )r7   r_   ÚaddressrV   s       r/   ÚconnectToListenerz%TLSPortTestsBuilder.connectToListener_  s6   € ð$ ×!Ñ!Ø×ÑØ�L‰LØØ×!Ñ!Ó#ó	
ð 	
r.   N)	r&   r'   r(   rY   r·   rº   r¼   rƒ   rÂ   r-   r.   r/   r´   r´   5  s"   „ ñòFòJò:ò
$ó
r.   r´   c                   ó*   — e Zd ZdZefZ e«       Zd„ Zy)ÚAbortSSLConnectionTestsz-
    C{abortConnection} tests using SSL.
    c                 ó&   — t         €t        d«      ‚y )NzOpenSSL not available.)r   r   r=   s    r/   ÚsetUpzAbortSSLConnectionTests.setUpˆ  s   € ÜÐÜÐ3Ó4Ð4ð  r.   N)	r&   r'   r(   rY   r   r%   rx   rv   rÆ   r-   r.   r/   rÄ   rÄ   ~  s   „ ñð &˜ÐÙ“€Ió5r.   rÄ   )?rY   Útypingr   r   r   Úzope.interfacer   r   Útwisted.internet.deferr   r	   Útwisted.internet.endpointsr
   r   r   Útwisted.internet.errorr   Útwisted.internet.interfacesr   r   r   Útwisted.internet.protocolr   r   r   Ú&twisted.internet.test.connectionmixinsr   r   r   Ú#twisted.internet.test.reactormixinsr   Útwisted.internet.test.test_tcpr   r   r   Útwisted.python.compatr   Útwisted.python.filepathr   Útwisted.python.runtimer   Útwisted.trial.unittestr   ÚOpenSSL.cryptor   Útwisted.internet.sslr    r!   r"   ÚImportErrorr$   r1   rD   r[   ri   ru   rx   r|   r´   ÚglobalsÚupdateÚmakeTestCaseClassesrÄ   r-   r.   r/   ú<module>rÛ      s¶  ðñ÷
 ,Ñ +ç 1ç 9÷ñ õ
 4÷ñ ÷
 MÑ L÷ñ õ
 ?÷ñ õ
 0Ý ,Ý +Ý +ðWÝ+÷ WÑV÷
ñ 
÷&ñ &ñ, Ð"Ó#÷#6ð #6ó $ð#6ôL
˜OÐ-Cô 
÷0Añ Aô,(˜x¨Ð9Mô (ô
�Ð"8ô 
ô.g8ØØØØØôg8ôTA
ØØØØØØôA
ñH ƒ	× Ñ Ð$×8Ñ8Ó:Ô ;Ù ƒ	× Ñ Ð)×=Ñ=Ó?Ô @Ù ƒ	× Ñ Ñ$Ó&×:Ñ:Ó<Ô =ô5ØÐ(Ð*@ô5ñ ƒ	× Ñ Ð(×<Ñ<Ó>Õ ?øðC ò ØƒLðús   Á4F ÆF)Æ(F)