???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................U
    e5dH                  
   @   s  d dl Z d dlZd dlmZ d dlmZmZm	Z
 d dl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mZmZmZmZ d dlmZmZ d dlmZmZmZm Z  zd d	lm!Z! W n e"k
r   Y nX d d
lm#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z, d dlm-Z-m.Z. ej/de0dd ed e
j/de0dd ed ej/de0dd ed ej/de0dd ed e
j/de0dd ed ej/de0dd ed e1j2 Z3e1_3dd e1j45 D Z6e7e1ddZ8G dd deZ9G dd  d eZ:G d!d" d"eZ;G d#d$ d$eZ<e j=d%krd d&lm>Z>m?Z? d d'l@m@Z@mAZAmBZBmCZC d d(l@mDZDmEZE d dl@ZFd dlGZGd dlHZHd dlIZIeJZKd)gZLeMed*ZNe-ZOeZPd+d, ZQd-d. ZRd/d0 ZSd1d2 ZTed3d4ZUd5d6 ZVG d7d8 d8ed8d9ZWG d:d; d;eWeZXG d<d= d=eZYeXjZfdddd>d?d@Z[e2fe\dAeXjZddddddBdCdDZ]e[Z^e]Z_G dEdF dFZ`dGdH ZaG dIdJ dJe@ZbebeY_ce`eY_ddddAe\e2ddKdKdf	dLdMZedNdO ZfdPZgdQZhdRdS ZidTdU Zje2dfdVdWZkdXdY ZldS )Z    N)
namedtuple)EnumIntEnumIntFlag)OPENSSL_VERSION_NUMBEROPENSSL_VERSION_INFOOPENSSL_VERSION)_SSLContext	MemoryBIO
SSLSession)SSLErrorSSLZeroReturnErrorSSLWantReadErrorSSLWantWriteErrorSSLSyscallErrorSSLEOFErrorSSLCertVerificationError)txt2objnid2obj)RAND_statusRAND_add
RAND_bytesRAND_pseudo_bytes)RAND_egd)
HAS_SNIHAS_ECDHHAS_NPNHAS_ALPN	HAS_SSLv2	HAS_SSLv3	HAS_TLSv1HAS_TLSv1_1HAS_TLSv1_2HAS_TLSv1_3)_DEFAULT_CIPHERS_OPENSSL_API_VERSION
_SSLMethodc                 C   s   |  do| dkS )NZ	PROTOCOL_PROTOCOL_SSLv23
startswithname r,   /usr/lib64/python3.8/ssl.py<lambda>|       r.   )sourceOptionsc                 C   s
   |  dS )NZOP_r(   r*   r,   r,   r-   r.      r/   ZAlertDescriptionc                 C   s
   |  dS )NZALERT_DESCRIPTION_r(   r*   r,   r,   r-   r.      r/   ZSSLErrorNumberc                 C   s
   |  dS )NZ
SSL_ERROR_r(   r*   r,   r,   r-   r.      r/   VerifyFlagsc                 C   s
   |  dS )NZVERIFY_r(   r*   r,   r,   r-   r.      r/   
VerifyModec                 C   s
   |  dS )NZCERT_r(   r*   r,   r,   r-   r.      r/   c                 C   s   i | ]\}}||qS r,   r,   ).0r+   valuer,   r,   r-   
<dictcomp>   s      r6   ZPROTOCOL_SSLv2c                   @   s6   e Zd ZejZejZejZ	ej
ZejZejZejZdS )
TLSVersionN)__name__
__module____qualname___sslZPROTO_MINIMUM_SUPPORTEDZMINIMUM_SUPPORTEDZPROTO_SSLv3SSLv3ZPROTO_TLSv1ZTLSv1ZPROTO_TLSv1_1ZTLSv1_1ZPROTO_TLSv1_2ZTLSv1_2ZPROTO_TLSv1_3ZTLSv1_3ZPROTO_MAXIMUM_SUPPORTEDZMAXIMUM_SUPPORTEDr,   r,   r,   r-   r7      s   r7   c                   @   s$   e Zd ZdZdZdZdZdZdZdS )_TLSContentType                 N)	r8   r9   r:   CHANGE_CIPHER_SPECALERTZ	HANDSHAKEZAPPLICATION_DATAHEADERZINNER_CONTENT_TYPEr,   r,   r,   r-   r=      s   r=   c                   @   s   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#S )$_TLSAlertTyper   
   r>   r?   r@      (   )   *   +   ,   -   .   /   0   1   2   3   <   F   G   P   V   Z   d   m   n   o   p   q   r   s   t   x   N)%r8   r9   r:   ZCLOSE_NOTIFYZUNEXPECTED_MESSAGEZBAD_RECORD_MACZDECRYPTION_FAILEDZRECORD_OVERFLOWZDECOMPRESSION_FAILUREZHANDSHAKE_FAILUREZNO_CERTIFICATEZBAD_CERTIFICATEZUNSUPPORTED_CERTIFICATEZCERTIFICATE_REVOKEDZCERTIFICATE_EXPIREDZCERTIFICATE_UNKNOWNZILLEGAL_PARAMETERZ
UNKNOWN_CAZACCESS_DENIEDZDECODE_ERRORZDECRYPT_ERRORZEXPORT_RESTRICTIONZPROTOCOL_VERSIONZINSUFFICIENT_SECURITYZINTERNAL_ERRORZINAPPROPRIATE_FALLBACKZUSER_CANCELEDZNO_RENEGOTIATIONZMISSING_EXTENSIONZUNSUPPORTED_EXTENSIONZCERTIFICATE_UNOBTAINABLEZUNRECOGNIZED_NAMEZBAD_CERTIFICATE_STATUS_RESPONSEZBAD_CERTIFICATE_HASH_VALUEZUNKNOWN_PSK_IDENTITYZCERTIFICATE_REQUIREDZNO_APPLICATION_PROTOCOLr,   r,   r,   r-   rG      sD   rG   c                   @   sd   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdS )_TLSMessageTyper                                          r>   r?   r@   rA      C      rC   N)r8   r9   r:   ZHELLO_REQUESTZCLIENT_HELLOZSERVER_HELLOZHELLO_VERIFY_REQUESTZNEWSESSION_TICKETZEND_OF_EARLY_DATAZHELLO_RETRY_REQUESTZENCRYPTED_EXTENSIONSZCERTIFICATEZSERVER_KEY_EXCHANGEZCERTIFICATE_REQUESTZSERVER_DONEZCERTIFICATE_VERIFYZCLIENT_KEY_EXCHANGEZFINISHEDZCERTIFICATE_URLZCERTIFICATE_STATUSZSUPPLEMENTAL_DATAZ
KEY_UPDATEZ
NEXT_PROTOZMESSAGE_HASHrD   r,   r,   r,   r-   rf      s,   rf   win32)enum_certificates	enum_crls)socketAF_INETSOCK_STREAMcreate_connection)
SOL_SOCKETSO_TYPE
tls-uniqueHOSTFLAG_NEVER_CHECK_SUBJECTc                 C   s   | sdS |  d}|s&|  | kS |dkr<td| | d\}}}d|krbtd| |sttd| |dkrtd| |d\}}}|r|sdS | | kS )	NF*rg   z1too many wildcards in certificate DNS name: {!r}..z9wildcard can only be present in the leftmost label: {!r}.z>sole wildcard without additional labels are not support: {!r}.z<partial wildcards in leftmost label are not supported: {!r}.)countlowerCertificateErrorformat	partition)ZdnhostnameZ	wildcardsZdn_leftmostsepZdn_remainderZhostname_leftmostZhostname_remainderr,   r,   r-   _dnsname_match  s@    

r   c                 C   s   zt | }W n tk
r"   Y n"X t || kr6|S td| zt t j| W S  tk
rv   td| Y n tk
r   Y nX td| d S )Nz'{!r} is not a quad-dotted IPv4 address.z+{!r} is neither an IPv4 nor an IP6 address.z{!r} is not an IPv4 address.)	_socketZ	inet_atonOSErrorZ	inet_ntoa
ValueErrorr   Z	inet_ptonZAF_INET6AttributeError)Zipnameaddrr,   r,   r-   _inet_patonD  s$    
r   c                 C   s   t |  }||kS N)r   rstrip)Zcert_ipaddresshost_ipZipr,   r,   r-   _ipaddress_matchg  s    r   c                 C   sJ  | st dzt|}W n t k
r0   d }Y nX g }| dd}|D ]^\}}|dkrz|d krnt||rn d S || qF|dkrF|d k	rt||r d S || qF|s| ddD ]6}|D ],\}}|dkrt||r  d S || qqt|dkrtd	|d
t	t
|f n,t|dkr>td||d f ntdd S )Nztempty or no certificate, match_hostname needs a SSL socket or SSL context with either CERT_OPTIONAL or CERT_REQUIREDZsubjectAltNamer,   ZDNSz
IP AddressZsubjectZ
commonNamerg   z&hostname %r doesn't match either of %sz, zhostname %r doesn't match %rr   z=no appropriate commonName or subjectAltName fields were found)r   r   getr   appendr   lenr   joinmaprepr)certr   r   ZdnsnamesZsankeyr5   subr,   r,   r-   match_hostnames  sB    


r   DefaultVerifyPathszQcafile capath openssl_cafile_env openssl_cafile openssl_capath_env openssl_capathc                  C   sd   t  } tj| d | d }tj| d | d }ttj|rF|nd tj|rX|nd f|  S )Nr   rg   rh   ri   )	r;   get_default_verify_pathsosenvironr   r   pathisfileisdir)partscafilecapathr,   r,   r-   r     s    r   c                       s@   e Zd ZdZ fddZe fddZe fddZ  ZS )_ASN1Objectr,   c                    s   t  j| ft|dd S )NFr*   super__new___txt2obj)clsoid	__class__r,   r-   r     s    z_ASN1Object.__new__c                    s   t  j| ft| S r   )r   r   _nid2obj)r   Znidr   r,   r-   fromnid  s    z_ASN1Object.fromnidc                    s   t  j| ft|dd S )NTr*   r   )r   r+   r   r,   r-   fromname  s    z_ASN1Object.fromname)	r8   r9   r:   	__slots__r   classmethodr   r   __classcell__r,   r,   r   r-   r     s   r   znid shortname longname oidc                   @   s   e Zd ZdZdZdS )Purposez1.3.6.1.5.5.7.3.1z1.3.6.1.5.5.7.3.2N)r8   r9   r:   SERVER_AUTHZCLIENT_AUTHr,   r,   r,   r-   r     s   r   c                       s  e Zd ZdZdZdZefddZdd Zd1d	d
Z	d2ddZ
dd Zdd Zdd Zdd ZejfddZeedre fddZej fddZe fddZej fddZe fddZej fd dZeed!red"d# Zejd$d# Zned%d# Ze fd&d'Zej fd(d'Ze fd)d*Ze fd+d,Zej fd-d,Ze fd.d/Zej fd0d/Z  ZS )3
SSLContext)ZCAZROOTNc                 O   s   t | |}|S r   )r	   r   )r   protocolargskwargsselfr,   r,   r-   r     s    zSSLContext.__new__c                 C   s4   |d krd S t |tr&|ddS |dS d S )NZidnaascii)
isinstancestrencodedecode)r   r   r,   r,   r-   _encode_hostname  s
    
zSSLContext._encode_hostnameFTc              	   C   s   | j j|||||| |dS )N)sockserver_sidedo_handshake_on_connectsuppress_ragged_eofsserver_hostnamecontextsession)sslsocket_class_create)r   r   r   r   r   r   r   r,   r,   r-   wrap_socket  s    zSSLContext.wrap_socketc                 C   s   | j j|||| ||| dS )N)r   r   r   r   )sslobject_classr   r   )r   incomingoutgoingr   r   r   r,   r,   r-   wrap_bio  s       zSSLContext.wrap_bioc                 C   s`   t  }|D ]F}t|d}t|dks0t|dkr8td|t| || q
| | d S )Nr   r      z(NPN protocols must be 1 to 255 in length)	bytearraybytesr   r   r   extendZ_set_npn_protocols)r   Znpn_protocolsprotosr   br,   r,   r-   set_npn_protocols  s    
zSSLContext.set_npn_protocolsc                    s8   d krd  _ n$ts td fdd}| _ d S )Nznot a callable objectc                    s     |}| ||S r   )r   )sslobjZ
servernameZsslctxr   server_name_callbackr,   r-   shim_cb  s    
z3SSLContext.set_servername_callback.<locals>.shim_cb)Zsni_callbackcallable	TypeError)r   r   r   r,   r   r-   set_servername_callback  s    z"SSLContext.set_servername_callbackc                 C   s`   t  }|D ]F}t|d}t|dks0t|dkr8td|t| || q
| | d S )Nr   r   r   z)ALPN protocols must be 1 to 255 in length)r   r   r   r   r   r   Z_set_alpn_protocols)r   Zalpn_protocolsr   r   r   r,   r,   r-   set_alpn_protocols   s    
zSSLContext.set_alpn_protocolsc                 C   sv   t  }z<t|D ].\}}}|dkr|dks4|j|kr|| qW n tk
r`   td Y nX |rr| j|d |S )NZx509_asnTz-unable to enumerate Windows certificate store)cadata)r   rx   r   r   PermissionErrorwarningswarnload_verify_locations)r   	storenamepurposeZcertsr   encodingZtrustr,   r,   r-   _load_windows_store_certs+  s    z$SSLContext._load_windows_store_certsc                 C   s@   t |tst|tjdkr4| jD ]}| || q"|   d S )Nrw   )r   r   r   sysplatform_windows_cert_storesr   Zset_default_verify_paths)r   r   r   r,   r,   r-   load_default_certs9  s    


zSSLContext.load_default_certsminimum_versionc                    s   t t jS r   )r7   r   r   r   r   r,   r-   r   B  s    zSSLContext.minimum_versionc                    s4   |t jkr|  jtj M  _tttj| | d S r   )	r7   r<   optionsr1   ZOP_NO_SSLv3r   r   r   __set__r   r5   r   r,   r-   r   F  s    
c                    s   t t jS r   )r7   r   maximum_versionr   r   r,   r-   r   L  s    zSSLContext.maximum_versionc                    s   t ttj| | d S r   )r   r   r   r   r   r   r,   r-   r   P  s    c                    s   t t jS r   )r1   r   r   r   r   r,   r-   r   T  s    zSSLContext.optionsc                    s   t ttj| | d S r   )r   r   r   r   r   r   r,   r-   r   X  s    r   c                 C   s   | j tj@ }|tjkS r   Z_host_flagsr;   r   )r   Zncsr,   r,   r-   hostname_checks_common_name]  s    z&SSLContext.hostname_checks_common_namec                 C   s,   |r|  j tj M  _ n|  j tjO  _ d S r   r   r   r,   r,   r-   r   b  s    c                 C   s   dS NTr,   r   r,   r,   r-   r   i  s    c                    s   t  j}|d k	r|jS d S d S r   )r   _msg_callbackuser_function)r   innerr   r,   r-   r   m  s    !zSSLContext._msg_callbackc                    sb    d kr t ttj| d  d S t ds8t  d fdd} |_t ttj| | d S )N__call__z is not callable.c                    s   zt |}W n tk
r    Y nX zt|}W n tk
rB   Y nX |tjkrTt}n|tjkrdt}nt}z||}W n tk
r   Y nX  | |||||S r   )r7   r   r=   rF   rE   rG   rf   )Zconn	directionversionZcontent_typeZmsg_typedataZmsg_enumcallbackr,   r-   r     s,    

  z'SSLContext._msg_callback.<locals>.inner)r   r   r   r   hasattrr   r   )r   r  r   r   r   r-   r     s    
c                    s   t t jS r   )r&   r   r   r   r   r,   r-   r     s    zSSLContext.protocolc                    s   t t jS r   )r2   r   verify_flagsr   r   r,   r-   r    s    zSSLContext.verify_flagsc                    s   t ttj| | d S r   )r   r   r  r   r   r   r,   r-   r    s    c                    s0   t  j}z
t|W S  tk
r*   | Y S X d S r   )r   verify_moder3   r   r   r   r,   r-   r    s
    
zSSLContext.verify_modec                    s   t ttj| | d S r   )r   r   r  r   r   r   r,   r-   r    s    )FTTNN)FNN) r8   r9   r:   r   r   r   PROTOCOL_TLSr   r   r   r   r   r   r   r   r   r   r   r  r	   propertyr   setterr   r   r;   r   r   r   r  r  r   r,   r,   r   r-   r     sl         
    




&%r   )r   r   r   c                C   s   t | tst| tt}| tjkr0t|_d|_	|s<|s<|rL|
||| n|jtkr`||  t|drtjd}|rtjjs||_|S )NTkeylog_filenameSSLKEYLOGFILE)r   r   r   r   r  r   r   CERT_REQUIREDr  check_hostnamer   	CERT_NONEr   r  r   r   r   r   flagsignore_environmentr  )r   r   r   r   r   
keylogfiler,   r,   r-   create_default_context  s    




r  F)	cert_reqsr  r   certfilekeyfiler   r   r   c                C   s   t |tst|t| }	|s$d|	_|d k	r2||	_|r<d|	_|rL|sLtd|sT|r`|	|| |sl|sl|r||	||| n|	jt	kr|	
| t|	drtjd}
|
rtjjs|
|	_|	S )NFTcertfile must be specifiedr  r	  )r   r   r   r   r  r  r   load_cert_chainr   r  r   r  r   r   r   r   r  r  r  )r   r  r  r   r  r  r   r   r   r   r  r,   r,   r-   _create_unverified_context  s,    



r  c                   @   s   e Zd Zdd Zed1ddZedd Zejd	d Zed
d Z	e	jdd Z	edd Z
edd Zedd Zd2ddZdd Zd3ddZdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd4d+d,Zd-d. Zd/d0 ZdS )5	SSLObjectc                 O   s   t | jj dd S )NzU does not have a public constructor. Instances are returned by SSLContext.wrap_bio().r   r   r8   r   r   r   r,   r,   r-   __init__;  s    zSSLObject.__init__FNc           	      C   s*   |  | }|j||||||d}||_|S )N)r   r   ownerr   )r   Z	_wrap_bio_sslobj)	r   r   r   r   r   r   r   r   r   r,   r,   r-   r   A  s    
   zSSLObject._createc                 C   s   | j jS r   r  r   r   r,   r,   r-   r   M  s    zSSLObject.contextc                 C   s   || j _d S r   r  r   Zctxr,   r,   r-   r   R  s    c                 C   s   | j jS r   r  r   r   r,   r,   r-   r   V  s    zSSLObject.sessionc                 C   s   || j _d S r   r  r   r   r,   r,   r-   r   [  s    c                 C   s   | j jS r   r  session_reusedr   r,   r,   r-   r"  _  s    zSSLObject.session_reusedc                 C   s   | j jS r   )r  r   r   r,   r,   r-   r   d  s    zSSLObject.server_sidec                 C   s   | j jS r   )r  r   r   r,   r,   r-   r   i  s    zSSLObject.server_hostname   c                 C   s(   |d k	r| j ||}n| j |}|S r   )r  read)r   r   buffervr,   r,   r-   r$  o  s    zSSLObject.readc                 C   s   | j |S r   )r  writer   r   r,   r,   r-   r'  {  s    zSSLObject.writec                 C   s   | j |S r   )r  getpeercertr   Zbinary_formr,   r,   r-   r)    s    zSSLObject.getpeercertc                 C   s   t jr| j S d S r   )r;   r   r  selected_npn_protocolr   r,   r,   r-   r+    s    zSSLObject.selected_npn_protocolc                 C   s   t jr| j S d S r   )r;   r   r  selected_alpn_protocolr   r,   r,   r-   r,    s    z SSLObject.selected_alpn_protocolc                 C   s
   | j  S r   )r  cipherr   r,   r,   r-   r-    s    zSSLObject.cipherc                 C   s
   | j  S r   )r  shared_ciphersr   r,   r,   r-   r.    s    zSSLObject.shared_ciphersc                 C   s
   | j  S r   )r  compressionr   r,   r,   r-   r/    s    zSSLObject.compressionc                 C   s
   | j  S r   )r  pendingr   r,   r,   r-   r0    s    zSSLObject.pendingc                 C   s   | j   d S r   )r  do_handshaker   r,   r,   r-   r1    s    zSSLObject.do_handshakec                 C   s
   | j  S r   )r  shutdownr   r,   r,   r-   unwrap  s    zSSLObject.unwrapr   c                 C   s   | j |S r   )r  get_channel_bindingr   Zcb_typer,   r,   r-   r4    s    zSSLObject.get_channel_bindingc                 C   s
   | j  S r   r  r   r   r,   r,   r-   r     s    zSSLObject.versionc                 C   s
   | j  S r   )r  verify_client_post_handshaker   r,   r,   r-   r7    s    z&SSLObject.verify_client_post_handshake)FNNN)r#  N)F)r   )r8   r9   r:   r  r   r   r  r   r  r   r"  r   r   r$  r'  r)  r+  r,  r-  r.  r/  r0  r1  r3  r4  r   r7  r,   r,   r,   r-   r  ,  sF         








	
r  c                 C   s   t t| jj| _| S r   )getattrr  r8   __doc__)funcr,   r,   r-   _sslcopydoc  s    r;  c                       s   e Zd Zdd ZedW fdd	Zeedd	 Zej	d
d	 Zeedd Z
e
j	dd Z
eedd Zdd ZdXddZdd ZdYddZdd ZedZddZedd Zedd  Zed!d" Zed#d$ Zed%d& Zd[ fd(d)	Zd\ fd*d+	Zd,d- Zd] fd.d/	Zd^ fd0d1	Zd_ fd2d3	Zd` fd4d5	Zda fd6d7	Zdb fd8d9	Zd:d; Z d<d= Z!ed>d? Z" fd@dAZ#edBdC Z$edDdE Z% fdFdGZ&edcdHdIZ' fdJdKZ(dLdM Z)dNdO Z* fdPdQZ+edddSdTZ,edUdV Z-  Z.S )e	SSLSocketc                 O   s   t | jj dd S )NzX does not have a public constructor. Instances are returned by SSLContext.wrap_socket().r  r  r,   r,   r-   r    s    zSSLSocket.__init__FTNc              
      s  | tttkrtd|r8|r(td|d k	r8td|jrJ|sJtdt|j|j	|j
| d}| j| f|}	tt|	jf | |	|  |  ||	_||	_d|	_d |	_||	_|||	_||	_||	_z|	  W n6 tk
r }
 z|
jtjkr d}W 5 d }
~
X Y nX d}||	_ |rzH|	jj!|	||	j|	|	jd|	_|rj|	 }|d	krbtd
|	"  W n$ ttfk
r   |	#   Y nX |	S )Nz!only stream sockets are supportedz4server_hostname can only be specified in client modez,session can only be specified in client modez'check_hostname requires server_hostname)familytypeprotofilenoFTr  r           zHdo_handshake_on_connect should not be specified for non-blocking sockets)$Z
getsockoptr~   r   r|   NotImplementedErrorr   r  dictr=  r>  r?  r@  r   r   r<  r  
settimeout
gettimeoutdetach_context_sessionZ_closedr  r   r   r   r   r   getpeernamer   errnoZENOTCONN
_connected_wrap_socketr1  close)r   r   r   r   r   r   r   r   r   r   eZ	connectedtimeoutr   r,   r-   r     sj    
     
zSSLSocket._createc                 C   s   | j S r   )rH  r   r,   r,   r-   r     s    zSSLSocket.contextc                 C   s   || _ || j_d S r   )rH  r  r   r  r,   r,   r-   r     s    c                 C   s   | j d k	r| j jS d S r   r  r   r,   r,   r-   r      s    
zSSLSocket.sessionc                 C   s   || _ | jd k	r|| j_d S r   )rI  r  r   r   r,   r,   r-   r   &  s    
c                 C   s   | j d k	r| j jS d S r   r!  r   r,   r,   r-   r"  ,  s    
zSSLSocket.session_reusedc                 C   s   t d| jj d S )NzCan't dup() %s instances)rC  r   r8   r   r,   r,   r-   dup2  s    zSSLSocket.dupc                 C   s   d S r   r,   )r   msgr,   r,   r-   _checkClosed6  s    zSSLSocket._checkClosedc                 C   s   | j s|   d S r   )rL  rJ  r   r,   r,   r-   _check_connected:  s    zSSLSocket._check_connectedr#  c              
   C   s   |    | jd krtdz*|d k	r4| j||W S | j|W S W nV tk
r } z8|jd tkr| jr|d k	r|W Y dS W Y dS n W 5 d }~X Y nX d S )Nz'Read on closed or unwrapped SSL socket.r   r/   )rS  r  r   r$  r   r   ZSSL_ERROR_EOFr   )r   r   r%  xr,   r,   r-   r$  B  s    

zSSLSocket.readc                 C   s&   |    | jd krtd| j|S )Nz(Write on closed or unwrapped SSL socket.)rS  r  r   r'  r(  r,   r,   r-   r'  W  s    
zSSLSocket.writec                 C   s   |    |   | j|S r   )rS  rT  r  r)  r*  r,   r,   r-   r)  `  s    zSSLSocket.getpeercertc                 C   s*   |    | jd kstjsd S | j S d S r   )rS  r  r;   r   r+  r   r,   r,   r-   r+  f  s    zSSLSocket.selected_npn_protocolc                 C   s*   |    | jd kstjsd S | j S d S r   )rS  r  r;   r   r,  r   r,   r,   r-   r,  n  s    z SSLSocket.selected_alpn_protocolc                 C   s$   |    | jd krd S | j S d S r   )rS  r  r-  r   r,   r,   r-   r-  v  s    
zSSLSocket.cipherc                 C   s$   |    | jd krd S | j S d S r   )rS  r  r.  r   r,   r,   r-   r.  ~  s    
zSSLSocket.shared_ciphersc                 C   s$   |    | jd krd S | j S d S r   )rS  r  r/  r   r,   r,   r-   r/    s    
zSSLSocket.compressionr   c                    sF   |    | jd k	r4|dkr(td| j | j|S t ||S d S )Nr   z3non-zero flags not allowed in calls to send() on %s)rS  r  r   r   r'  r   send)r   r   r  r   r,   r-   rV    s    
zSSLSocket.sendc                    sL   |    | jd k	r"td| j n&|d kr8t ||S t |||S d S )Nz%sendto not allowed on instances of %s)rS  r  r   r   r   sendto)r   r   Zflags_or_addrr   r   r,   r-   rW    s    
zSSLSocket.sendtoc                 O   s   t d| j d S )Nz&sendmsg not allowed on instances of %srC  r   r  r,   r,   r-   sendmsg  s    zSSLSocket.sendmsgc              
      s   |    | jd k	r|dkr(td| j d}t|H}|d2}t|}||k rn| ||d  }||7 }qJW 5 Q R X W 5 Q R X nt 	||S d S )Nr   z6non-zero flags not allowed in calls to sendall() on %sB)
rS  r  r   r   
memoryviewcastr   rV  r   sendall)r   r   r  r   ZviewZ	byte_viewZamountr&  r   r,   r-   r]    s    
 zSSLSocket.sendallc                    s,   | j d k	r| |||S t |||S d S r   )r  Z_sendfile_use_sendr   sendfile)r   fileoffsetr   r   r,   r-   r^    s    
zSSLSocket.sendfilec                    sD   |    | jd k	r2|dkr(td| j | |S t ||S d S )Nr   z3non-zero flags not allowed in calls to recv() on %s)rS  r  r   r   r$  r   recvr   Zbuflenr  r   r,   r-   ra    s    

zSSLSocket.recvc                    sj   |    |r|d krt|}n|d kr*d}| jd k	rV|dkrJtd| j | ||S t |||S d S )Nr#  r   z8non-zero flags not allowed in calls to recv_into() on %s)rS  r   r  r   r   r$  r   	recv_intor   r%  nbytesr  r   r,   r-   rc    s    

zSSLSocket.recv_intoc                    s4   |    | jd k	r"td| j nt ||S d S )Nz'recvfrom not allowed on instances of %s)rS  r  r   r   r   recvfromrb  r   r,   r-   rf    s    
zSSLSocket.recvfromc                    s6   |    | jd k	r"td| j nt |||S d S )Nz,recvfrom_into not allowed on instances of %s)rS  r  r   r   r   recvfrom_intord  r   r,   r-   rg    s    
zSSLSocket.recvfrom_intoc                 O   s   t d| j d S )Nz&recvmsg not allowed on instances of %srX  r  r,   r,   r-   recvmsg  s    zSSLSocket.recvmsgc                 O   s   t d| j d S )Nz+recvmsg_into not allowed on instances of %srX  r  r,   r,   r-   recvmsg_into  s    zSSLSocket.recvmsg_intoc                 C   s$   |    | jd k	r| j S dS d S )Nr   )rS  r  r0  r   r,   r,   r-   r0    s    

zSSLSocket.pendingc                    s   |    d | _t | d S r   )rS  r  r   r2  )r   Zhowr   r,   r-   r2    s    zSSLSocket.shutdownc                 C   s.   | j r| j  }d | _ |S tdt|  d S NzNo SSL wrapper around )r  r2  r   r   )r   sr,   r,   r-   r3    s
    
zSSLSocket.unwrapc                 C   s$   | j r| j  S tdt|  d S rj  )r  r7  r   r   r   r,   r,   r-   r7    s    
z&SSLSocket.verify_client_post_handshakec                    s   d | _ t   d S r   )r  r   _real_closer   r   r,   r-   rl    s    zSSLSocket._real_closec              	   C   sF   |    |  }z$|dkr(|r(| d  | j  W 5 | | X d S )NrB  )rT  rF  rE  r  r1  )r   blockrP  r,   r,   r-   r1    s    
zSSLSocket.do_handshakec              	      s   | j rtd| js| jd k	r&td| jj| d| j| | jd| _z@|rVt 	|}nd }t 
| |s~d| _| jr~|   |W S  ttfk
r   d | _ Y nX d S )Nz!can't connect in server-side modez/attempt to connect already-connected SSLSocket!FrA  T)r   r   rL  r  r   rM  r   rI  r   
connect_exconnectr   r1  r   )r   r   rn  Zrcr   r,   r-   _real_connect!  s0       zSSLSocket._real_connectc                 C   s   |  |d d S )NFrp  r   r   r,   r,   r-   ro  ;  s    zSSLSocket.connectc                 C   s   |  |dS r   rq  rr  r,   r,   r-   rn  @  s    zSSLSocket.connect_exc                    s.   t   \}}| jj|| j| jdd}||fS )NT)r   r   r   )r   acceptr   r   r   r   )r   Znewsockr   r   r,   r-   rs  E  s    zSSLSocket.acceptr   c                 C   s4   | j d k	r| j |S |tkr,td|d S d S )Nz({0} channel binding type not implemented)r  r4  CHANNEL_BINDING_TYPESr   r   r5  r,   r,   r-   r4  Q  s    
zSSLSocket.get_channel_bindingc                 C   s   | j d k	r| j  S d S d S r   r6  r   r,   r,   r-   r   \  s    

zSSLSocket.version)FTTNNN)N)r#  N)F)r   )N)r   )r   N)r#  r   )Nr   )r#  r   )Nr   )F)r   )/r8   r9   r:   r  r   r   r  r;  r   r  r   r"  rQ  rS  rT  r$  r'  r)  r+  r,  r-  r.  r/  rV  rW  rY  r]  r^  ra  rc  rf  rg  rh  ri  r0  r2  r3  r7  rl  r1  rp  ro  rn  rs  r4  r   r   r,   r,   r   r-   r<    s          >



	











r<  Tc
                 C   sl   |r|st d|r |s t dt|}
||
_|r<|
| |rL|
|| |	rZ|
|	 |
j| |||dS )Nz5certfile must be specified for server-side operationsr  )r   r   r   r   )r   r   r  r   r  Zset_ciphersr   )r   r  r  r   r  ssl_versionca_certsr   r   Zciphersr   r,   r,   r-   r   i  s$    

 r   c                 C   s   ddl m} ddlm} d}d}z|| d d  d }W n$ tk
rb   td| |f Y n0X || dd  |}||d |f|d	d
  S d S )Nr   )strptime)timegm)ZJanZFebZMarZAprZMayZJunZJulZAugZSepZOctZNovZDecz %d %H:%M:%S %Y GMTri   rg   z*time data %r does not match format "%%b%s"rh   rl   )timerw  Zcalendarrx  indextitler   )Z	cert_timerw  rx  ZmonthsZtime_formatZmonth_numberZttr,   r,   r-   cert_time_to_seconds  s    
r|  z-----BEGIN CERTIFICATE-----z-----END CERTIFICATE-----c                    sR   t t| dd tg}| fddtdt dD 7 }|td  d|S )NASCIIstrictc                    s   g | ]} ||d   qS )@   r,   )r4   ifr,   r-   
<listcomp>  s     z(DER_cert_to_PEM_cert.<locals>.<listcomp>r   r  
)	r   base64Zstandard_b64encode
PEM_HEADERranger   r   
PEM_FOOTERr   )Zder_cert_bytesZssr,   r  r-   DER_cert_to_PEM_cert  s
    "r  c                 C   s\   |  tstdt |  ts0tdt |  tttt  }t|	ddS )Nz(Invalid PEM encoding; must start with %sz&Invalid PEM encoding; must end with %sr}  r~  )
r)   r  r   stripendswithr  r   r  Zdecodebytesr   )Zpem_cert_stringdr,   r,   r-   PEM_cert_to_DER_cert  s    
r  c           
   
   C   sd   | \}}|d k	rt }nt}t|||d}t| &}||}|d}	W 5 Q R X W 5 Q R X t|	S )N)r  r   T)r
  r  _create_stdlib_contextr}   r   r)  r  )
r   ru  rv  ZhostZportr  r   r   ZsslsockZdercertr,   r,   r-   get_server_certificate  s    
r  c                 C   s   t | dS )Nz	<unknown>)_PROTOCOL_NAMESr   )Zprotocol_coder,   r,   r-   get_protocol_name  s    r  )mr   r   collectionsr   enumr   Z_Enumr   Z_IntEnumr   Z_IntFlagr;   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ImportErrorr   r   r   r   r   r   r    r!   r"   r#   r$   r%   	_convert_r8   r&   r  r'   __members__itemsr  r8  Z_SSLv2_IF_EXISTSr7   r=   rG   rf   r   rx   ry   rz   r{   r|   r}   r~   r   r   r  rK  r   r   Zsocket_errorrt  r  ZHAS_NEVER_CHECK_COMMON_NAMEZ_RESTRICTED_SERVER_CIPHERSr   r   r   r   r   r   r   r   r   r   r   r  r  r  Z_create_default_https_contextr  r  r;  r<  r   r   r   r|  r  r  r  r  r  r  r,   r,   r,   r-   <module>]   s   $0      
)
1#9 z #    /      

