a
    ze2                  
   @   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"y   Y n0 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@mAZAmBZB d d(l@mCZCmDZD d dl@ZEd dlFZFd dlGZGd dlHZHeIZJd)gZKeLed*ZMe-ZNeZOd+d, ZPd-d. ZQd/d0 ZRd1d2 ZSed3d4ZTd5d6 ZUG d7d8 d8ed8d9ZVG d:d; d;eVeZWG d<d= d=eZXeWjYfdddd>d?d@ZZe2fe[dAeWjYddddddBdCdDZ\eZZ]e\Z^G dEdF dFZ_dGdH Z`G dIdJ dJe@ZaeaeX_be_eX_cdddAe[e2ddKdKdf	dLdMZddNdO ZedPZfdQZgdRdS ZhdTdU Zie2dfdVdWZjdXdY Zkd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/lib/python3.9/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>   r/   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_EXCHANGE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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|v 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y    Y n"0 t || kr4|S td| zt t j| W S  tyr   td| Y n ty   Y n0 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.)	_socket	inet_atonOSError	inet_ntoa
ValueErrorr   	inet_ptonAF_INET6AttributeError)Zipnameaddrr,   r,   r-   _inet_patonE  s$    
r   c                 C   s   t |  }||kS N)r   rstrip)Zcert_ipaddresshost_ipZipr,   r,   r-   _ipaddress_matchh  s    r   c                 C   sH  | st dzt|}W n t y.   d }Y n0 g }| dd}|D ]^\}}|dkrx|d u rlt||rl d S || qD|dkrD|d urt||r d S || qD|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_hostnamet  sB    


r   DefaultVerifyPathszQcafile capath openssl_cafile_env openssl_cafile openssl_capath_env openssl_capathc                  C   sf   t  } tj| d | d }tj| d | d }ttj|rF|nd tj|rX|nd g| R  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| gt|ddR  S )NFr*   super__new___txt2obj)clsoid	__class__r,   r-   r     s    z_ASN1Object.__new__c                    s   t  j| gt|R  S r   )r   r   _nid2obj)r   Znidr   r,   r-   fromnid  s    z_ASN1Object.fromnidc                    s   t  j| gt|ddR  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 u 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 u 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   st   t  }z<t|D ].\}}}|dkr|du s4|j|v r|| qW n ty^   td Y n0 |rp| j|d |S )NZx509_asnTz-unable to enumerate Windows certificate store)cadata)r   ry   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 )Nrx   )r   r   r   sysplatform_windows_cert_storesr   Zset_default_verify_paths)r   r   r   r,   r,   r-   load_default_certs:  s    


zSSLContext.load_default_certsminimum_versionc                    s   t t jS r   )r7   r   r   r   r   r,   r-   r   C  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   G  s    
c                    s   t t jS r   )r7   r   maximum_versionr   r   r,   r-   r   M  s    zSSLContext.maximum_versionc                    s   t ttj| | d S r   )r   r   r   r   r   r   r,   r-   r   Q  s    c                    s   t t jS r   )r1   r   r   r   r   r,   r-   r   U  s    zSSLContext.optionsc                    s   t ttj| | d S r   )r   r   r   r   r   r   r,   r-   r   Y  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   c  s    c                 C   s   dS NTr,   r   r,   r,   r-   r   j  s    c                    s   t  j}|d ur|jS d S d S r   )r   _msg_callbackuser_function)r   innerr   r,   r-   r   n  s    !zSSLContext._msg_callbackc                    sb    d u 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y   Y n0 zt|}W n ty>   Y n0 |tjkrPt}n|tjkr`t}nt}z||}W n ty   Y n0  | |||||S r   )r7   r   r=   rF   rE   rG   rf   )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                    s.   t  j}z
t|W S  ty(   | Y S 0 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     sh       
  




&%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 u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   B  s    
zSSLObject._createc                 C   s   | j jS r   r!  r   r   r,   r,   r-   r   N  s    zSSLObject.contextc                 C   s   || j _d S r   r"  r   ctxr,   r,   r-   r   S  s    c                 C   s   | j jS r   r!  r   r   r,   r,   r-   r   W  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   e  s    zSSLObject.server_sidec                 C   s   | j jS r   )r!  r   r   r,   r,   r-   r   j  s    zSSLObject.server_hostname   c                 C   s(   |d ur| j ||}n| j |}|S r   )r!  read)r   r   buffervr,   r,   r-   r*  p  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-   r1    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-   r2    s    z SSLObject.selected_alpn_protocolc                 C   s
   | j  S r   )r!  cipherr   r,   r,   r-   r3    s    zSSLObject.cipherc                 C   s
   | j  S r   )r!  shared_ciphersr   r,   r,   r-   r4    s    zSSLObject.shared_ciphersc                 C   s
   | j  S r   )r!  compressionr   r,   r,   r-   r5    s    zSSLObject.compressionc                 C   s
   | j  S r   )r!  pendingr   r,   r,   r-   r6    s    zSSLObject.pendingc                 C   s   | j   d S r   )r!  do_handshaker   r,   r,   r-   r7    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-   r:    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-   r=    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/  r1  r2  r3  r4  r5  r6  r7  r9  r:  r  r=  r,   r,   r,   r-   r  -  sB     








	
r  c                 C   s   t t| jj| _| S r   )getattrr  r8   __doc__)funcr,   r,   r-   _sslcopydoc  s    rA  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                    sf  | tttkrtd|r8|r(td|d ur8td|jrJ|sJtdt|j|j	|j
| d}| j| fi |}	tt|	jf i | | }
|  ||	_||	_d|	_d |	_||	_|||	_||	_||	_z|	  W n ty } z|jtjkr d}|	 }|	 d z|	!d}W n@ tyb } z&|jtjtj"fvrJ d}W Y d }~n
d }~0 0 |	 | |rd	}t#|j|}||_$d |_%z|	&  W n ty   Y n0 z|W d }nd }0 W Y d }~nd }~0 0 d
}|	'|
 ||	_(|rbzH|	jj)|	||	j|	|	jd|	_|r<|	 }|dkr4td|	*  W n" ttfy`   |	&   Y n0 |	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filenoFrg   r/   z5Closed before TLS handshake with data in recv buffer.Tr   r           zHdo_handshake_on_connect should not be specified for non-blocking sockets)+
getsockoptr~   r   r|   NotImplementedErrorr   r  dictrC  rD  rE  rF  r   r   rB  r  
gettimeoutdetach_context_session_closedr!  r   r   r   r   r   getpeernamer   errnoZENOTCONNgetblockingsetblockingrecvEINVALr   reasonZlibraryclose
settimeout
_connected_wrap_socketr7  )r   r   r   r   r   r   r   r   r   r   Zsock_timeouteZ	connectedblockingZnotconn_pre_handshake_datarW  Z notconn_pre_handshake_data_errortimeoutr   r,   r-   r     s    


"

zSSLSocket._createc                 C   s   | j S r   )rN  r   r,   r,   r-   r   8  s    zSSLSocket.contextc                 C   s   || _ || j_d S r   )rN  r!  r   r#  r,   r,   r-   r   =  s    c                 C   s   | j d ur| j jS d S r   r%  r   r,   r,   r-   r   B  s    
zSSLSocket.sessionc                 C   s   || _ | jd ur|| j_d S r   )rO  r!  r   r&  r,   r,   r-   r   H  s    
c                 C   s   | j d ur| j jS d S r   r'  r   r,   r,   r-   r(  N  s    
zSSLSocket.session_reusedc                 C   s   t d| jj d S )NzCan't dup() %s instances)rJ  r   r8   r   r,   r,   r-   dupT  s    zSSLSocket.dupc                 C   s   d S r   r,   )r   msgr,   r,   r-   _checkClosedX  s    zSSLSocket._checkClosedc                 C   s   | j s|   d S r   )rZ  rQ  r   r,   r,   r-   _check_connected\  s    zSSLSocket._check_connectedr)  c              
   C   s   |    | jd u rtdz*|d ur4| j||W S | j|W S W n` ty } zH|jd tkr| jr|d ur~W Y d }~dS W Y d }~dS n W Y d }~n
d }~0 0 d S )Nz'Read on closed or unwrapped SSL socket.r   r/   )ra  r!  r   r*  r   r   ZSSL_ERROR_EOFr   )r   r   r+  xr,   r,   r-   r*  d  s    
zSSLSocket.readc                 C   s&   |    | jd u rtd| j|S )Nz(Write on closed or unwrapped SSL socket.)ra  r!  r   r-  r.  r,   r,   r-   r-  y  s    
zSSLSocket.writec                 C   s   |    |   | j|S r   )ra  rb  r!  r/  r0  r,   r,   r-   r/    s    zSSLSocket.getpeercertc                 C   s*   |    | jd u stjsd S | j S d S r   )ra  r!  r;   r   r1  r   r,   r,   r-   r1    s    zSSLSocket.selected_npn_protocolc                 C   s*   |    | jd u stjsd S | j S d S r   )ra  r!  r;   r   r2  r   r,   r,   r-   r2    s    z SSLSocket.selected_alpn_protocolc                 C   s$   |    | jd u rd S | j S d S r   )ra  r!  r3  r   r,   r,   r-   r3    s    
zSSLSocket.cipherc                 C   s$   |    | jd u rd S | j S d S r   )ra  r!  r4  r   r,   r,   r-   r4    s    
zSSLSocket.shared_ciphersc                 C   s$   |    | jd u rd S | j S d S r   )ra  r!  r5  r   r,   r,   r-   r5    s    
zSSLSocket.compressionr   c                    sF   |    | jd u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)ra  r!  r   r   r-  r   send)r   r  r  r   r,   r-   rd    s    
zSSLSocket.sendc                    sL   |    | jd ur"td| j n&|d u r8t ||S t |||S d S )Nz%sendto not allowed on instances of %s)ra  r!  r   r   r   sendto)r   r  Zflags_or_addrr   r   r,   r-   re    s    
zSSLSocket.sendtoc                 O   s   t d| j d S )Nz&sendmsg not allowed on instances of %srJ  r   r  r,   r,   r-   sendmsg  s    zSSLSocket.sendmsgc              	      s   |    | jd ur|dkr(td| j d}t|f}|d<}t|}||k rn| ||d  }||7 }qJW d    n1 s0    Y  W d    q1 s0    Y  nt 	||S d S )Nr   z6non-zero flags not allowed in calls to sendall() on %sB)
ra  r!  r   r   
memoryviewcastr   rd  r   sendall)r   r  r  r   view	byte_viewamountr,  r   r,   r-   rk    s    
HzSSLSocket.sendallc                    s,   | j d ur| |||S t |||S d S r   )r!  _sendfile_use_sendr   sendfile)r   fileoffsetr   r   r,   r-   rp    s    
zSSLSocket.sendfilec                    sD   |    | jd ur2|dkr(td| j | |S t ||S d S )Nr   z3non-zero flags not allowed in calls to recv() on %s)ra  r!  r   r   r*  r   rU  r   buflenr  r   r,   r-   rU    s    

zSSLSocket.recvc                    sj   |    |r|d u rt|}n|d u r*d}| jd u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)ra  r   r!  r   r   r*  r   	recv_intor   r+  nbytesr  r   r,   r-   ru    s    

zSSLSocket.recv_intoc                    s4   |    | jd ur"td| j nt ||S d S )Nz'recvfrom not allowed on instances of %s)ra  r!  r   r   r   recvfromrs  r   r,   r-   rx    s    
zSSLSocket.recvfromc                    s6   |    | jd ur"td| j nt |||S d S )Nz,recvfrom_into not allowed on instances of %s)ra  r!  r   r   r   recvfrom_intorv  r   r,   r-   ry    s    
zSSLSocket.recvfrom_intoc                 O   s   t d| j d S )Nz&recvmsg not allowed on instances of %srf  r  r,   r,   r-   recvmsg  s    zSSLSocket.recvmsgc                 O   s   t d| j d S )Nz+recvmsg_into not allowed on instances of %srf  r  r,   r,   r-   recvmsg_into  s    zSSLSocket.recvmsg_intoc                 C   s$   |    | jd ur| j S dS d S )Nr   )ra  r!  r6  r   r,   r,   r-   r6    s    

zSSLSocket.pendingc                    s   |    d | _t | d S r   )ra  r!  r   r8  )r   howr   r,   r-   r8    s    zSSLSocket.shutdownc                 C   s.   | j r| j  }d | _ |S tdt|  d S NzNo SSL wrapper around )r!  r8  r   r   )r   sr,   r,   r-   r9  $  s
    
zSSLSocket.unwrapc                 C   s$   | j r| j  S tdt|  d S r}  )r!  r=  r   r   r   r,   r,   r-   r=  -  s    
z&SSLSocket.verify_client_post_handshakec                    s   d | _ t   d S r   )r!  r   _real_closer   r   r,   r-   r  4  s    zSSLSocket._real_closec              	   C   sP   |    |  }z.|dkr(|r(| d  | j  W | | n| | 0 d S )NrH  )rb  rL  rY  r!  r7  )r   blockr^  r,   r,   r-   r7  8  s    
zSSLSocket.do_handshakec              	      s   | j rtd| js| jd ur&td| jj| d| j| | jd| _z@|rVt 	|}nd }t 
| |s~d| _| jr~|   |W S  ttfy   d | _ Y n0 d S )Nz!can't connect in server-side modez/attempt to connect already-connected SSLSocket!FrG  T)r   r   rZ  r!  r   r[  r   rO  r   
connect_exconnectr   r7  r   )r   r   r  rcr   r,   r-   _real_connectC  s*    zSSLSocket._real_connectc                 C   s   |  |d d S )NFr  r   r   r,   r,   r-   r  ]  s    zSSLSocket.connectc                 C   s   |  |dS r   r  r  r,   r,   r-   r  b  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-   r  g  s    zSSLSocket.acceptr   c                 C   s4   | j d ur| j |S |tvr,td|d S d S )Nz({0} channel binding type not implemented)r!  r:  CHANNEL_BINDING_TYPESr   r   r;  r,   r,   r-   r:  s  s    
zSSLSocket.get_channel_bindingc                 C   s   | j d ur| j  S d S d S r   r<  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  rA  r   r  r   r(  r_  ra  rb  r*  r-  r/  r1  r2  r3  r4  r5  rd  re  rg  rk  rp  rU  ru  rx  ry  rz  r{  r6  r8  r9  r=  r  r7  r  r  r  r  r:  r  r   r,   r,   r   r-   rB    s      _



	











rB  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     s"    

r   c                 C   s   ddl m} ddlm} d}d}z|| d d  d }W n" ty`   td| |f Y n00 || 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   )timer  Zcalendarr  indextitler   )Z	cert_timer  r  ZmonthsZtime_formatZmonth_number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>  r/   z(DER_cert_to_PEM_cert.<locals>.<listcomp>r   r  
)	r   base64Zstandard_b64encode
PEM_HEADERranger   r   
PEM_FOOTERr   )Zder_cert_bytes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   s   | \}}|d urt }nt}t|||d}t| D}||}|d}	W d    n1 s\0    Y  W d    n1 sz0    Y  t|	S )N)r  r   T)r  r  _create_stdlib_contextr}   r   r/  r  )
r   r  r  hostportr  r   r   ZsslsockZdercertr,   r,   r-   get_server_certificate  s    
Fr  c                 C   s   t | dS )Nz	<unknown>)_PROTOCOL_NAMESr   )Zprotocol_coder,   r,   r-   get_protocol_name  s    r  )lr   r   collectionsr   enumr   Z_Enumr   _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  r>  Z_SSLv2_IF_EXISTSr7   r=   rG   rf   r   ry   rz   r{   r|   r}   r~   r   r   r  rR  r   r   Zsocket_errorr  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  rA  rB  r   r   r   r  r  r  r  r  r  r  r,   r,   r,   r-   <module>^   s   $0
)
1#9 z#/    >

