o
     JAf                  
   @   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"yh   Y nw 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@mCZCmDZDmEZE 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[dZe\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 ZjekdeEfdVdWZldXdY ZmdS )[    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.10/ssl.py<lambda>}   s    r.   )sourceOptionsc                 C   
   |  dS )NZOP_r(   r*   r,   r,   r-   r.         
 ZAlertDescriptionc                 C   r1   )NZALERT_DESCRIPTION_r(   r*   r,   r,   r-   r.      r2   ZSSLErrorNumberc                 C   r1   )NZ
SSL_ERROR_r(   r*   r,   r,   r-   r.      r2   VerifyFlagsc                 C   r1   )NZVERIFY_r(   r*   r,   r,   r-   r.      r2   
VerifyModec                 C   r1   )NZCERT_r(   r*   r,   r,   r-   r.      r2   c                 C   s   i | ]\}}||qS r,   r,   ).0r+   valuer,   r,   r-   
<dictcomp>   s    r7   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-   r8      s    
r8   c                   @   s&   e Zd Z	 dZdZdZdZdZdZdS )_TLSContentType                 N)	r9   r:   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@   rA      (   )   *   +   ,   -   .   /   0   1   2   3   <   F   G   P   V   Z   d   m   n   o   p   q   r   s   t   x   N)%r9   r:   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-   rH      sH    rH   c                   @   sf   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@   rA   rB      C      rD   N)r9   r:   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_HASHrE   r,   r,   r,   r-   rg      s0    rg   win32)enum_certificates	enum_crls)socketSOCK_STREAMcreate_connection)
SOL_SOCKETSO_TYPE_GLOBAL_DEFAULT_TIMEOUT
tls-uniqueHOSTFLAG_NEVER_CHECK_SUBJECTc                 C   s   	 | sdS |  d}|s|  | kS |dkrtd| | d\}}}d|v r2td| |s;td| |dkrFtd| |d\}}}|rR|sTdS | | kS )	NF*rh   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w t || kr|S td| zt t j| W S  ty8   td|  ty@   Y nw td| )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   sN  	 t jdtdd | stdzt|}W n ty    d }Y nw g }| dd}|D ]/\}}|dkrE|d u r?t||r? d S || q+|dkrZ|d urUt||rU d S || q+|s| d	dD ]}|D ]\}}|d
kr}t||rx  d S || qgqct	|dkrt
d|dtt|f t	|dkrt
d||d f t
d)Nz"ssl.match_hostname() is deprecatedri   category
stacklevelztempty or no certificate, match_hostname needs a SSL socket or SSL context with either CERT_OPTIONAL or CERT_REQUIREDZsubjectAltNamer,   ZDNSz
IP AddresssubjectZ
commonNamerh   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)warningswarnDeprecationWarningr   r   getr   appendr   lenr   joinmaprepr)certr   r   ZdnsnamesZsankeyr6   subr,   r,   r-   match_hostnamet  sV   



r   DefaultVerifyPathszQcafile capath openssl_cafile_env openssl_cafile openssl_capath_env openssl_capathc                  C   sh   	 t  } tj| d | d }tj| d | d }ttj|r$|nd tj|r-|nd g| R  S )Nr   rh   ri   rj   )	r<   get_default_verify_pathsosenvironr   r   pathisfileisdir)partscafilecapathr,   r,   r-   r     s   r   c                       sB   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)	r9   r:   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)r9   r:   r;   SERVER_AUTHCLIENT_AUTHr,   r,   r,   r-   r     s    r   c                       s  e Zd Z	 dZdZdZd1ddZdd Z				d2d	d
Z		d3ddZ	dd Z
dd Zdd Zdd ZejfddZeedrbe 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!re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 )4
SSLContext)ZCAZROOTNc                 O   s,   |d u rt jdtdd t}t| |}|S )Nz9ssl.SSLContext() without protocol argument is deprecated.ri   r   )r   r   r   PROTOCOL_TLSr	   r   )r   protocolargskwargsselfr,   r,   r-   r     s   zSSLContext.__new__c                 C   s0   |d u rd S t |tr|d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   sp   t jdtdd t }|D ]#}t|d}t|dks t|dkr$td|t| || q| 	| d S )N'ssl NPN is deprecated, use ALPN insteadri   r   r   r      z(NPN protocols must be 1 to 255 in length)
r   r   r   	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                    s:   d u r	d  _ d S 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 ]#}t|d}t|dkst|dkrt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_protocols2  s   
zSSLContext.set_alpn_protocolsc                 C   st   t  }zt|D ]\}}}|dkr|du s|j|v r|| qW n ty/   td Y nw |r8| j|d |S )NZx509_asnTz-unable to enumerate Windows certificate store)cadata)r   rz   r   r   PermissionErrorr   r   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r| jD ]}| || q|   d S )Nry   )r   r   r   sysplatform_windows_cert_storesr   Zset_default_verify_paths)r   r   r   r,   r,   r-   load_default_certsK  s   


zSSLContext.load_default_certsminimum_versionc                       t t jS r   )r8   r   r   r   r   r,   r-   r   T     zSSLContext.minimum_versionc                    s4   |t jkr|  jtj M  _tttj| | d S r   )	r8   r=   optionsr0   ZOP_NO_SSLv3r   r   r   __set__r   r6   r   r,   r-   r   X  s   
c                    r   r   )r8   r   maximum_versionr  r   r,   r-   r  ^  r  zSSLContext.maximum_versionc                       t ttj| | d S r   )r   r   r  r  r  r   r,   r-   r  b     c                    r   r   )r0   r   r  r  r   r,   r-   r  f  r  zSSLContext.optionsc                    r  r   )r   r   r  r  r  r   r,   r-   r  j  r  r   c                 C   s   | j tj@ }|tjkS r   Z_host_flagsr<   r   )r   Zncsr,   r,   r-   hostname_checks_common_nameo  s   
z&SSLContext.hostname_checks_common_namec                 C   s.   |r|  j tj M  _ d S |  j tjO  _ d S r   r	  r  r,   r,   r-   r
  t  s   c                 C   s   dS NTr,   r  r,   r,   r-   r
  {     c                    s   	 t  j}|d ur|jS d S r   )r   _msg_callbackuser_function)r   innerr   r,   r-   r    s
   zSSLContext._msg_callbackc                    sb    d u rt ttj| d  d S t dst  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w zt|}W n	 ty   Y nw |tjkr(t}n
|tjkr0t}nt}z||}W n	 tyA   Y nw  | |||||S r   )r8   r   r>   rG   rF   rH   rg   )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                    r   r   )r&   r   r   r  r   r,   r-   r     r  zSSLContext.protocolc                    r   r   )r3   r   verify_flagsr  r   r,   r-   r    r  zSSLContext.verify_flagsc                    r  r   )r   r   r  r  r  r   r,   r-   r    r  c                    s*   t  j}zt|W S  ty   | Y S w r   )r   verify_moder4   r   r  r   r,   r-   r    s   
zSSLContext.verify_modec                    r  r   )r   r   r  r  r  r   r,   r-   r    r  r   )FTTNN)FNN)r9   r:   r;   r   r   r   r   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jkrtt}t|_d|_	n| tj
kr$tt}nt| |s.|s.|r6|||| n
|jtkr@||  t|drTtjd}|rTtjjsT||_|S )NTkeylog_filenameSSLKEYLOGFILE)r   r   r   r   r   r   PROTOCOL_TLS_CLIENTCERT_REQUIREDr  check_hostnamer   PROTOCOL_TLS_SERVERr   r   	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jkr| d u rt} n|tjkr"| d u r!t} nt|t	| }	||	_
|d ur4||	_|r9d|	_
|rA|sAtd|sE|rK|	|| |sQ|sQ|rY|	||| n
|	jtkrc|	| t|	drwtjd}
|
rwtjjsw|
|	_|	S )NTcertfile must be specifiedr  r  )r   r   r   r   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      t | jj d)NzU does not have a public constructor. Instances are returned by SSLContext.wrap_bio().r   r   r9   r   r   r   r,   r,   r-   __init__X     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   ^  s   
zSSLObject._createc                 C   
   	 | j jS r   r4  r   r  r,   r,   r-   r   j     zSSLObject.contextc                 C      || j _d S r   r6  r   ctxr,   r,   r-   r   o  r  c                 C   r5  r   r4  r   r  r,   r,   r-   r   s  r7  zSSLObject.sessionc                 C   r8  r   r;  r   r   r,   r,   r-   r   x  r  c                 C   r5  r   r4  session_reusedr  r,   r,   r-   r>  |  r7  zSSLObject.session_reusedc                 C   r5  r   )r4  r   r  r,   r,   r-   r     r7  zSSLObject.server_sidec                 C   r5  r   )r4  r   r  r,   r,   r-   r     s   zSSLObject.server_hostname   c                 C   s,   	 |d ur| j ||}|S | j |}|S r   )r4  read)r   r   buffervr,   r,   r-   r@    s   zSSLObject.readc                 C      	 | j |S r   )r4  writer   r  r,   r,   r-   rD    s   zSSLObject.writec                 C   rC  r   )r4  getpeercertr   Zbinary_formr,   r,   r-   rF    s   zSSLObject.getpeercertc                 C   s   	 t jdtdd d S Nr   ri   r   )r   r   r   r  r,   r,   r-   selected_npn_protocol  s   
zSSLObject.selected_npn_protocolc                 C      	 | j  S r   )r4  selected_alpn_protocolr  r,   r,   r-   rK       
z SSLObject.selected_alpn_protocolc                 C   rJ  r   )r4  cipherr  r,   r,   r-   rM       
zSSLObject.cipherc                 C   rJ  r   )r4  shared_ciphersr  r,   r,   r-   rO    rL  zSSLObject.shared_ciphersc                 C   rJ  r   )r4  compressionr  r,   r,   r-   rP    rN  zSSLObject.compressionc                 C   rJ  r   )r4  pendingr  r,   r,   r-   rQ       
zSSLObject.pendingc                 C   s   	 | j   d S r   )r4  do_handshaker  r,   r,   r-   rS    s   zSSLObject.do_handshakec                 C   rJ  r   )r4  shutdownr  r,   r,   r-   unwrap  rR  zSSLObject.unwrapr   c                 C   rC  r   )r4  get_channel_bindingr   Zcb_typer,   r,   r-   rV    s   zSSLObject.get_channel_bindingc                 C   rJ  r   r4  r  r  r,   r,   r-   r    rN  zSSLObject.versionc                 C   s
   | j  S r   )r4  verify_client_post_handshaker  r,   r,   r-   rY    s   
z&SSLObject.verify_client_post_handshake)FNNNr?  NFr   )r9   r:   r;   r1  r   r   r  r   r  r   r>  r   r   r@  rD  rF  rI  rK  rM  rO  rP  rQ  rS  rU  rV  r  rY  r,   r,   r,   r-   r-  I  sF    








	

r-  c                 C   s   	 t t| jj| _| S r   )getattrr-  r9   __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dX fd*d+	Zd,d- Zd[ fd.d/	Zd\ fd0d1	Zd] fd2d3	Zd^ fd4d5	Zd] fd6d7	Zd^ 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dZdHdIZ' fdJdKZ(dLdM Z)dNdO Z* fdPdQZ+ed_dSdTZ,edUdV Z-  Z.S )`	SSLSocketc                 O   r.  )NzX does not have a public constructor. Instances are returned by SSLContext.wrap_socket().r/  r0  r,   r,   r-   r1    r2  zSSLSocket.__init__FTNc              
      s  | tttkrtd|r|rtd|d urtd|jr%|s%tdt|j|j	|j
| d}| j| fi |}	tt|	jdi | |	|  |  ||	_||	_d|	_d |	_||	_|||	_||	_||	_z|	  W n ty }
 z|
jtjkr d}W Y d }
~
nd }
~
ww d}||	_ |rz&|	jj!|	||	j|	|	jd|	_|r|	 }|d	krtd
|	"  W |	S W |	S  ttfy   |	#   w |	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r3  r           zHdo_handshake_on_connect should not be specified for non-blocking socketsr,   )$
getsockoptr   r   r}   NotImplementedErrorr   r   dictrb  rc  rd  re  r   r   ra  r1  
settimeout
gettimeoutdetach_context_session_closedr4  r   r   r   r   r   getpeernamer   errnoZENOTCONN
_connected_wrap_socketrS  close)r   r   r   r   r   r   r   r   r   r   eZ	connectedtimeoutr   r,   r-   r     sl   

	zSSLSocket._createc                 C   s   | j S r   )rn  r  r,   r,   r-   r   5  s   zSSLSocket.contextc                 C   s   || _ || j_d S r   )rn  r4  r   r9  r,   r,   r-   r   :  s   c                 C      | j d ur	| j jS d S r   r;  r  r,   r,   r-   r   ?     
zSSLSocket.sessionc                 C   s    || _ | jd ur|| j_d S d S r   )ro  r4  r   r<  r,   r,   r-   r   E  s   
c                 C   rx  r   r=  r  r,   r,   r-   r>  K  ry  zSSLSocket.session_reusedc                 C   s   t d| jj )NzCan't dup() %s instances)ri  r   r9   r  r,   r,   r-   dupQ  s   zSSLSocket.dupc                 C   s   d S r   r,   )r   msgr,   r,   r-   _checkClosedU  r  zSSLSocket._checkClosedc                 C   s   | j s	|   d S d S r   )rs  rq  r  r,   r,   r-   _check_connectedY  s   zSSLSocket._check_connectedr?  c              
   C   s   	 |    | jd u rtdz|d ur| j||W S | j|W S  tyJ } z|jd tkrE| jrE|d ur>W Y d }~dS W Y d }~dS  d }~ww )Nz'Read on closed or unwrapped SSL socket.r       )r|  r4  r   r@  r   r   ZSSL_ERROR_EOFr   )r   r   rA  xr,   r,   r-   r@  a  s    
zSSLSocket.readc                 C   s(   	 |    | jd u rtd| j|S )Nz(Write on closed or unwrapped SSL socket.)r|  r4  r   rD  rE  r,   r,   r-   rD  v  s
   
zSSLSocket.writec                 C   s   |    |   | j|S r   )r|  r}  r4  rF  rG  r,   r,   r-   rF    s   zSSLSocket.getpeercertc                 C   s   |    tjdtdd d S rH  )r|  r   r   r   r  r,   r,   r-   rI    s   zSSLSocket.selected_npn_protocolc                 C   s&   |    | jd u stjsd S | j S r   )r|  r4  r<   r   rK  r  r,   r,   r-   rK    s   
z SSLSocket.selected_alpn_protocolc                 C       |    | jd u rd S | j S r   )r|  r4  rM  r  r,   r,   r-   rM       

zSSLSocket.cipherc                 C   r  r   )r|  r4  rO  r  r,   r,   r-   rO    r  zSSLSocket.shared_ciphersc                 C   r  r   )r|  r4  rP  r  r,   r,   r-   rP    r  zSSLSocket.compressionr   c                    sB   |    | jd ur|dkrtd| j | j|S t ||S )Nr   z3non-zero flags not allowed in calls to send() on %s)r|  r4  r   r   rD  r   send)r   r  r#  r   r,   r-   r    s   
zSSLSocket.sendc                    sF   |    | jd urtd| j |d u rt ||S t |||S )Nz%sendto not allowed on instances of %s)r|  r4  r   r   r   sendto)r   r  Zflags_or_addrr   r   r,   r-   r    s   
zSSLSocket.sendtoc                 O      t d| j )Nz&sendmsg not allowed on instances of %sri  r   r0  r,   r,   r-   sendmsg  s   zSSLSocket.sendmsgc              	      s   |    | jd urc|dkrtd| j d}t|?}|d!}t|}||k r:| ||d  }||7 }||k s)W d    n1 sDw   Y  W d    d S W d    d S 1 s\w   Y  d S t 	||S )Nr   z6non-zero flags not allowed in calls to sendall() on %sB)
r|  r4  r   r   
memoryviewcastr   r  r   sendall)r   r  r#  r   view	byte_viewamountrB  r   r,   r-   r    s$   
PzSSLSocket.sendallc                    s*   	 | j d ur| |||S t |||S r   )r4  _sendfile_use_sendr   sendfile)r   fileoffsetr   r   r,   r-   r    s   
zSSLSocket.sendfilec                    s@   |    | jd ur|dkrtd| j | |S t ||S )Nr   z3non-zero flags not allowed in calls to recv() on %s)r|  r4  r   r   r@  r   recvr   buflenr#  r   r,   r-   r    s   

zSSLSocket.recvc                    sf   |    |r|d u rt|}n|d u rd}| jd ur+|dkr%td| j | ||S t |||S )Nr?  r   z8non-zero flags not allowed in calls to recv_into() on %s)r|  r   r4  r   r   r@  r   	recv_intor   rA  nbytesr#  r   r,   r-   r    s   

zSSLSocket.recv_intoc                    s.   |    | jd urtd| j t ||S )Nz'recvfrom not allowed on instances of %s)r|  r4  r   r   r   recvfromr  r   r,   r-   r    s   
zSSLSocket.recvfromc                    s0   |    | jd urtd| j t |||S )Nz,recvfrom_into not allowed on instances of %s)r|  r4  r   r   r   recvfrom_intor  r   r,   r-   r    s   
zSSLSocket.recvfrom_intoc                 O   r  )Nz&recvmsg not allowed on instances of %sr  r0  r,   r,   r-   recvmsg     zSSLSocket.recvmsgc                 O   r  )Nz+recvmsg_into not allowed on instances of %sr  r0  r,   r,   r-   recvmsg_into  r  zSSLSocket.recvmsg_intoc                 C   s    |    | jd ur| j S dS Nr   )r|  r4  rQ  r  r,   r,   r-   rQ    s   

zSSLSocket.pendingc                    s   |    d | _t | d S r   )r|  r4  r   rT  )r   howr   r,   r-   rT    s   zSSLSocket.shutdownc                 C   s*   | j r| j  }d | _ |S tdt|  NzNo SSL wrapper around )r4  rT  r   r   )r   sr,   r,   r-   rU  #  s
   
zSSLSocket.unwrapc                 C   s    | j r| j  S tdt|  r  )r4  rY  r   r   r  r,   r,   r-   rY  ,  s   
z&SSLSocket.verify_client_post_handshakec                    s   d | _ t   d S r   )r4  r   _real_closer  r   r,   r-   r  3  s   zSSLSocket._real_closec              	   C   sN   |    |  }z|dkr|r| d  | j  W | | d S | | w )Nrg  )r}  rl  rk  r4  rS  )r   blockrw  r,   r,   r-   rS  7  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 |r+t 	|}nd }t 
| |s?d| _| jr?|   |W S  ttfyN   d | _ w )Nz!can't connect in server-side modez/attempt to connect already-connected SSLSocket!Frf  T)r   r   rs  r4  r   rt  r   ro  r   
connect_exconnectr   rS  r   )r   r   r  rcr   r,   r-   _real_connectB  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  a  s   zSSLSocket.connect_exc                    s0   	 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  f  s   zSSLSocket.acceptr   c                 C   s0   | j d ur| j |S |tvrtd|d S )Nz({0} channel binding type not implemented)r4  rV  CHANNEL_BINDING_TYPESr   r   rW  r,   r,   r-   rV  r  s   
zSSLSocket.get_channel_bindingc                 C   s   | j d ur
| j  S d S r   rX  r  r,   r,   r-   r  }  s   

zSSLSocket.version)FTTNNNr   rZ  r[  )r   )r   N)r?  r   r  r\  )/r9   r:   r;   r1  r   r   r  r`  r   r  r   r>  rz  r|  r}  r@  rD  rF  rI  rK  rM  rO  rP  r  r  r  r  r  r  r  r  r  r  r  rQ  rT  rU  rY  r  rS  r  r  r  r  rV  r  r   r,   r,   r   r-   ra    s    >



	
	










ra  Tc
                 C   s|   t jdtdd |r|std|r|stdt|}
||
_|r&|
| |r.|
|| |	r5|
|	 |
j	| |||dS )Nz=ssl.wrap_socket() is deprecated, use SSLContext.wrap_socket()ri   r   z5certfile must be specified for server-side operationsr*  )r   r   r   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 w || dd  |}||d |f|d	d
  S )Nr   )strptime)timegm)ZJanZFebZMarZAprZMayZJunZJulZAugZSepZOctZNovZDecz %d %H:%M:%S %Y GMTrj   rh   z*time data %r does not match format "%%b%s"ri   rm   )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                    sT   	 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,   )r5   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_bytesssr,   r  r-   DER_cert_to_PEM_cert  s   "
r  c                 C   s^   	 |  tstdt |  tst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1}|j||d}	|	d}
W d    n1 s3w   Y  W d    t|
S W d    t|
S 1 sOw   Y  t|
S )N)r'  r   )rw  )r   T)r  r"  _create_stdlib_contextr~   r   rF  r  )r   r  r  rw  host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  r   )nr   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_r9   r&   r   r'   __members__itemsr  r]  Z_SSLv2_IF_EXISTSr8   r>   rH   rg   r   rz   r{   r|   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-  r`  ra  r   r   r   r  r  r  r  r  r  r  r  r,   r,   r,   r-   <module>   s   Z$0
)
1#>  &7    
 

