<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
3
2a                 @   sd  d dl Z d dlZd dlZ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 d dlmZmZ d dlmZm Z m!Z!m"Z" y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) d dlm*Z* ej+de,dd ed ej+de,dd ed ej+de,dd ed ej+de,dd ed ej+de,dd ed ej+de,dd ed e-j. Z/e-_/dd e-j0j1 D Z2e3e-ddZ4ej5dkrd dlm6Z6m7Z7 d dl8m8Z8m9Z9m:Z:m;Z; d d l8m<Z<m=Z= d dl>Z>d dl?Z?d dl@Z@eAZBejCr.d!gZDng ZDd"ZEd#ZFG d$d% d%eGZHdRd'd(ZId)d* ZJd+d, ZKed-d.ZLd/d0 ZMG d1d2 d2ed2d3ZNG d4d5 d5eNe	ZOG d6d7 d7eZPeOjQfdddd8d9d:ZRe.fdd;eOjQdddddd<d=d>ZSeRZTeSZUG d?d@ d@ZVG dAdB dBe8ZWddd;eXe.ddCdCdf	dDdEZYdFdG ZZdHZ[dIZ\dJdK Z]dLdM Z^e.dfdNdOZ_dPdQ Z`dS )S    N)
namedtuple)EnumIntEnumIntFlag)OPENSSL_VERSION_NUMBEROPENSSL_VERSION_INFOOPENSSL_VERSION)_SSLContext	MemoryBIO
SSLSession)SSLErrorSSLZeroReturnErrorSSLWantReadErrorSSLWantWriteErrorSSLSyscallErrorSSLEOFError)txt2objnid2obj)RAND_statusRAND_add
RAND_bytesRAND_pseudo_bytes)RAND_egd)HAS_SNIHAS_ECDHHAS_NPNHAS_ALPNHAS_TLSv1_3)_OPENSSL_API_VERSION
_SSLMethodc             C   s   | j do| dkS )NZ	PROTOCOL_PROTOCOL_SSLv23)
startswith)name r#   (/opt/alt/python36/lib64/python3.6/ssl.py<lambda>|   s    r%   )sourceOptionsc             C   s
   | j dS )NZOP_)r!   )r"   r#   r#   r$   r%      s    ZAlertDescriptionc             C   s
   | j dS )NZALERT_DESCRIPTION_)r!   )r"   r#   r#   r$   r%      s    ZSSLErrorNumberc             C   s
   | j dS )NZ
SSL_ERROR_)r!   )r"   r#   r#   r$   r%      s    VerifyFlagsc             C   s
   | j dS )NZVERIFY_)r!   )r"   r#   r#   r$   r%      s    
VerifyModec             C   s
   | j dS )NZCERT_)r!   )r"   r#   r#   r$   r%      s    c             C   s   i | ]\}}||qS r#   r#   ).0r"   valuer#   r#   r$   
<dictcomp>   s    r,   ZPROTOCOL_SSLv2win32)enum_certificates	enum_crls)socketAF_INETSOCK_STREAMcreate_connection)
SOL_SOCKETSO_TYPEz
tls-uniquezTLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:ECDH+AESGCM:ECDH+CHACHA20:DH+AESGCM:DH+CHACHA20:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:DH+HIGH:RSA+AESGCM:RSA+AES:RSA+HIGH:!aNULL:!eNULL:!MD5:!3DESzTLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:ECDH+AESGCM:ECDH+CHACHA20:DH+AESGCM:DH+CHACHA20:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:DH+HIGH:RSA+AESGCM:RSA+AES:RSA+HIGH:!aNULL:!eNULL:!MD5:!DSS:!RC4:!3DESc               @   s   e Zd ZdS )CertificateErrorN)__name__
__module____qualname__r#   r#   r#   r$   r6      s   r6      c       	      C   s   g }| sdS | j d^}}|jd}||kr<tdt|  |sP| j |j kS |dkrd|jd n>|jdsx|jdr|jtj| n|jtj|j	dd x|D ]}|jtj| qW tj
d	d
j| d tj}|j|S )NF.*z,too many wildcards in certificate DNS name: z[^.]+zxn--z\*z[^.]*z\Az\.z\Z)splitcountr6   reprlowerappendr!   reescapereplacecompilejoin
IGNORECASEmatch)	ZdnhostnameZmax_wildcardsZpatsZleftmostZ	remainderZ	wildcardsZfragZpatr#   r#   r$   _dnsname_match   s&    

rJ   c             C   s   t j| j }||kS )N)	ipaddress
ip_addressrstrip)Zipnamehost_ipZipr#   r#   r$   _ipaddress_match  s    rO   c             C   sP  | st dytj|}W n t k
r2   d }Y nX g }| jdf }xb|D ]Z\}}|dkr||d krpt||rpd S |j| qJ|dkrJ|d k	rt||rd S |j| qJW |sxF| jdf D ]6}x0|D ](\}}|dkrt||rd S |j| qW qW t|dkr td|d	j	t
t|f n,t|dkrDt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subjectAltNameZDNSz
IP AddressZsubjectZ
commonNamer:   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)
ValueErrorrK   rL   getrJ   rA   rO   lenr6   rF   mapr?   )certrI   rN   ZdnsnamesZsankeyr+   subr#   r#   r$   match_hostname  s>    

rW   DefaultVerifyPathszQcafile capath openssl_cafile_env openssl_cafile openssl_capath_env openssl_capathc              C   sd   t j } tjj| d | d }tjj| d | d }ttjj|rF|nd tjj|rX|nd f|  S )Nr   r:         )	_sslget_default_verify_pathsosenvironrQ   rX   pathisfileisdir)partscafilecapathr#   r#   r$   r\   U  s    r\   c                   s@   e Zd Zf Z fddZe fddZe fddZ  ZS )_ASN1Objectc                s   t  j| ft|dd S )NF)r"   )super__new___txt2obj)clsoid)	__class__r#   r$   rg   h  s    z_ASN1Object.__new__c                s   t  j| ft| S )N)rf   rg   _nid2obj)ri   Znid)rk   r#   r$   fromnidk  s    z_ASN1Object.fromnidc                s   t  j| ft|dd S )NT)r"   )rf   rg   rh   )ri   r"   )rk   r#   r$   fromnameq  s    z_ASN1Object.fromname)	r7   r8   r9   	__slots__rg   classmethodrm   rn   __classcell__r#   r#   )rk   r$   re   c  s   re   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)r7   r8   r9   SERVER_AUTHCLIENT_AUTHr#   r#   r#   r$   rr   x  s   rr   c                   s   e Zd Zd!Zd"ZefddZefddZd#ddZd$ddZ	dd Z
dd Z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 fddZej fd dZ  ZS )%
SSLContextprotocol__weakref__CAROOTc             O   s"   t j| |}|tkr|jt |S )N)r	   rg   _SSLv2_IF_EXISTSset_ciphers_DEFAULT_CIPHERS)ri   rv   argskwargsselfr#   r#   r$   rg     s    
zSSLContext.__new__c             C   s
   || _ d S )N)rv   )r   rv   r#   r#   r$   __init__  s    zSSLContext.__init__FTNc          	   C   s   t |||||| |dS )N)sockserver_sidedo_handshake_on_connectsuppress_ragged_eofsserver_hostname_context_session)	SSLSocket)r   r   r   r   r   r   sessionr#   r#   r$   wrap_socket  s
    zSSLContext.wrap_socketc             C   s   | j ||||d}t||dS )N)r   r   )r   )Z	_wrap_bio	SSLObject)r   ZincomingZoutgoingr   r   r   sslobjr#   r#   r$   wrap_bio  s    
zSSLContext.wrap_bioc             C   sd   t  }xN|D ]F}t|d}t|dks2t|dkr:td|jt| |j| qW | j| d S )Nasciir      z(NPN protocols must be 1 to 255 in length)	bytearraybytesrR   r   rA   extendZ_set_npn_protocols)r   npn_protocolsprotosrv   br#   r#   r$   set_npn_protocols  s    

zSSLContext.set_npn_protocolsc             C   sd   t  }xN|D ]F}t|d}t|dks2t|dkr:td|jt| |j| qW | j| d S )Nr   r   r   z)ALPN protocols must be 1 to 255 in length)r   r   rR   r   rA   r   Z_set_alpn_protocols)r   Zalpn_protocolsr   rv   r   r#   r#   r$   set_alpn_protocols  s    

zSSLContext.set_alpn_protocolsc             C   sz   t  }y@x:t|D ].\}}}|dkr|dks6|j|kr|j| qW W n tk
rd   tjd Y nX |rv| j|d |S )NZx509_asnTz-unable to enumerate Windows certificate store)cadata)r   r.   rj   r   PermissionErrorwarningswarnload_verify_locations)r   	storenamepurposeZcertsrT   encodingZtrustr#   r#   r$   _load_windows_store_certs  s    z$SSLContext._load_windows_store_certsc             C   sD   t |tst|tjdkr8x| jD ]}| j|| q$W | j  d S )Nr-   )
isinstancere   	TypeErrorsysplatform_windows_cert_storesr   Zset_default_verify_paths)r   r   r   r#   r#   r$   load_default_certs  s    

zSSLContext.load_default_certsc                s   t t jS )N)r'   rf   options)r   )rk   r#   r$   r     s    zSSLContext.optionsc                s   t ttjj| | d S )N)rf   ru   r   __set__)r   r+   )rk   r#   r$   r     s    c                s   t t jS )N)r(   rf   verify_flags)r   )rk   r#   r$   r     s    zSSLContext.verify_flagsc                s   t ttjj| | d S )N)rf   ru   r   r   )r   r+   )rk   r#   r$   r     s    c                s*   t  j}yt|S  tk
r$   |S X d S )N)rf   verify_moder)   rP   )r   r+   )rk   r#   r$   r     s
    zSSLContext.verify_modec                s   t ttjj| | d S )N)rf   ru   r   r   )r   r+   )rk   r#   r$   r     s    )rv   rw   )rx   ry   )FTTNN)FNN)r7   r8   r9   ro   r   PROTOCOL_TLSrg   r   r   r   r   r   r   rr   rs   r   propertyr   setterr   r   rq   r#   r#   )rk   r$   ru     s(      
 
ru   )rc   rd   r   c            C   sz   t | tst| tt}| tjkr2t|_d|_	n| tj
krF|jt |sR|sR|rb|j||| n|jtkrv|j|  |S )NT)r   re   r   ru   r   rr   rs   CERT_REQUIREDr   check_hostnamert   r{   _RESTRICTED_SERVER_CIPHERSr   	CERT_NONEr   )r   rc   rd   r   contextr#   r#   r$   create_default_context  s    





r   F)	cert_reqsr   r   certfilekeyfilerc   rd   r   c      
      C   s   t |tst|t| }	|d k	r(||	_||	_|r@| r@td|sH|rT|	j|| |s`|s`|rp|	j||| n|	jt	kr|	j
| |	S )Nzcertfile must be specified)r   re   r   ru   r   r   rP   load_cert_chainr   r   r   )
rv   r   r   r   r   r   rc   rd   r   r   r#   r#   r$   _create_unverified_context  s    



r   c               @   s   e Zd Zd/d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
d0ddZdd Zd1d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d2d)d*Zd+d, Zd-d. ZdS )3r   Nc             C   s&   || _ |p| | j _|d k	r"|| j _d S )N)_sslobjownerr   )r   r   r   r   r#   r#   r$   r   G  s    zSSLObject.__init__c             C   s   | j jS )N)r   r   )r   r#   r#   r$   r   N  s    zSSLObject.contextc             C   s   || j _d S )N)r   r   )r   ctxr#   r#   r$   r   S  s    c             C   s   | j jS )N)r   r   )r   r#   r#   r$   r   W  s    zSSLObject.sessionc             C   s   || j _d S )N)r   r   )r   r   r#   r#   r$   r   \  s    c             C   s   | j jS )N)r   session_reused)r   r#   r#   r$   r   `  s    zSSLObject.session_reusedc             C   s   | j jS )N)r   r   )r   r#   r#   r$   r   e  s    zSSLObject.server_sidec             C   s   | j jS )N)r   r   )r   r#   r#   r$   r   j  s    zSSLObject.server_hostname   c             C   s(   |d k	r| j j||}n| j j|}|S )N)r   read)r   rR   buffervr#   r#   r$   r   p  s    zSSLObject.readc             C   s   | j j|S )N)r   write)r   datar#   r#   r$   r   |  s    zSSLObject.writeFc             C   s   | j j|S )N)r   Zpeer_certificate)r   binary_formr#   r#   r$   getpeercert  s    zSSLObject.getpeercertc             C   s   t jr| jj S d S )N)r[   r   r   selected_npn_protocol)r   r#   r#   r$   r     s    zSSLObject.selected_npn_protocolc             C   s   t jr| jj S d S )N)r[   r   r   selected_alpn_protocol)r   r#   r#   r$   r     s    z SSLObject.selected_alpn_protocolc             C   s
   | j j S )N)r   cipher)r   r#   r#   r$   r     s    zSSLObject.cipherc             C   s
   | j j S )N)r   shared_ciphers)r   r#   r#   r$   r     s    zSSLObject.shared_ciphersc             C   s
   | j j S )N)r   compression)r   r#   r#   r$   r     s    zSSLObject.compressionc             C   s
   | j j S )N)r   pending)r   r#   r#   r$   r     s    zSSLObject.pendingc             C   s4   | j j  | jjr0| js tdt| j | j d S )Nz-check_hostname needs server_hostname argument)r   do_handshaker   r   r   rP   rW   r   )r   r#   r#   r$   r     s
    
zSSLObject.do_handshakec             C   s
   | j j S )N)r   shutdown)r   r#   r#   r$   unwrap  s    zSSLObject.unwrap
tls-uniquec             C   s0   |t krtd|dkr&tdj|| jj S )Nz Unsupported channel binding typez
tls-uniquez({0} channel binding type not implemented)CHANNEL_BINDING_TYPESrP   NotImplementedErrorformatr   Ztls_unique_cb)r   cb_typer#   r#   r$   get_channel_binding  s    zSSLObject.get_channel_bindingc             C   s
   | j j S )N)r   version)r   r#   r#   r$   r     s    zSSLObject.versionc             C   s
   | j j S )N)r   verify_client_post_handshake)r   r#   r#   r$   r     s    z&SSLObject.verify_client_post_handshake)NN)r   N)F)r   )r7   r8   r9   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r#   r#   r#   r$   r   7  s,   


		
r   c                   s  e Zd ZddddeeddeeddddddddfddZedd Z	e	j
d	d Z	ed
d Zej
dd Zedd Zdd ZdUddZdd ZdVddZdd ZdWddZdd Zdd Zd d! Zd"d# Zd$d% ZdXd&d'ZdYd(d)Zd*d+ ZdZd,d-Zd[ fd.d/	Zd\d0d1Zd]d2d3Zd^d4d5Zd_d6d7Z d8d9 Z!d:d; Z"d<d= Z#d>d? Z$d@dA Z%dBdC Z&dDdE Z'd`dFdGZ(dHdI Z)dJdK Z*dLdM Z+dNdO Z,dadQdRZ-dSdT Z.  Z/S )br   NFTr   c             C   sj  |r|| _ n|r| rtd|r0| r0td|r>| r>|}t|| _ || j _|r`| j j| |rr| j j|| |r| j j| |r| j j| || _|| _	|| _
|| _|| _|| _|jtttkrtd|r|rtd|d k	rtd| j jo| rtd|| _|| _|| _|| _|| _|d k	rdtj| |j|j|j|j d | j|j   |j!  n,|d k	r~tj| |d ntj| |	|
|d	 y| j"  W n8 t#k
r } z|j$t$j%kr d
}W Y d d }~X nX d}d
| _&d | _'|| _(|rfyN| j j)| ||}t*|| | jd| _'|r>| j  }|dkr6td| j+  W n$ t#tfk
rd   | j,   Y nX d S )Nz5certfile must be specified for server-side operationszcertfile must be specifiedz!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fileno)r   )r   r   r   FT)r   r   g        zHdo_handshake_on_connect should not be specified for non-blocking sockets)-r   rP   ru   r   r   r   r   r{   r   r   r   ssl_versionca_certsciphersZ
getsockoptr4   r5   r2   r   r   r   r   r   r   r   r0   r   r   r   r   r   
settimeout
gettimeoutdetachgetpeernameOSErrorerrnoZENOTCONNZ_closedr   
_connected_wrap_socketr   r   close)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   eZ	connectedr   timeoutr#   r#   r$   r     s    	








zSSLSocket.__init__c             C   s   | j S )N)r   )r   r#   r#   r$   r   7  s    zSSLSocket.contextc             C   s   || _ || j_d S )N)r   r   r   )r   r   r#   r#   r$   r   ;  s    c             C   s   | j d k	r| j jS d S )N)r   r   )r   r#   r#   r$   r   @  s    
zSSLSocket.sessionc             C   s   || _ | jd k	r|| j_d S )N)r   r   r   )r   r   r#   r#   r$   r   F  s    
c             C   s   | j d k	r| j jS d S )N)r   r   )r   r#   r#   r$   r   L  s    
zSSLSocket.session_reusedc             C   s   t d| jj d S )NzCan't dup() %s instances)r   rk   r7   )r   r#   r#   r$   dupR  s    zSSLSocket.dupc             C   s   d S )Nr#   )r   msgr#   r#   r$   _checkClosedV  s    zSSLSocket._checkClosedc             C   s   | j s| j  d S )N)r   r   )r   r#   r#   r$   _check_connectedZ  s    zSSLSocket._check_connected   c             C   st   | j   | jstdy| jj||S  tk
rn } z.|jd tkr\| jr\|d k	rVdS dS n W Y d d }~X nX d S )Nz'Read on closed or unwrapped SSL socket.r       )r   r   rP   r   r   r}   ZSSL_ERROR_EOFr   )r   rR   r   xr#   r#   r$   r   b  s    zSSLSocket.readc             C   s"   | j   | jstd| jj|S )Nz(Write on closed or unwrapped SSL socket.)r   r   rP   r   )r   r   r#   r#   r$   r   t  s    zSSLSocket.writec             C   s   | j   | j  | jj|S )N)r   r   r   r   )r   r   r#   r#   r$   r   }  s    zSSLSocket.getpeercertc             C   s*   | j   | j stj rd S | jj S d S )N)r   r   r[   r   r   )r   r#   r#   r$   r     s    zSSLSocket.selected_npn_protocolc             C   s*   | j   | j stj rd S | jj S d S )N)r   r   r[   r   r   )r   r#   r#   r$   r     s    z SSLSocket.selected_alpn_protocolc             C   s    | j   | jsd S | jj S d S )N)r   r   r   )r   r#   r#   r$   r     s    zSSLSocket.cipherc             C   s   | j   | jsd S | jj S )N)r   r   r   )r   r#   r#   r$   r     s    zSSLSocket.shared_ciphersc             C   s    | j   | jsd S | jj S d S )N)r   r   r   )r   r#   r#   r$   r     s    zSSLSocket.compressionc             C   sB   | j   | jr0|dkr$td| j | jj|S tj| ||S d S )Nr   z3non-zero flags not allowed in calls to send() on %s)r   r   rP   rk   r   r0   send)r   r   flagsr#   r#   r$   r     s    
zSSLSocket.sendc             C   sH   | j   | jrtd| j n&|d kr4tj| ||S tj| |||S d S )Nz%sendto not allowed on instances of %s)r   r   rP   rk   r0   sendto)r   r   Zflags_or_addraddrr#   r#   r$   r     s    zSSLSocket.sendtoc             O   s   t d| j d S )Nz&sendmsg not allowed on instances of %s)r   rk   )r   r}   r~   r#   r#   r$   sendmsg  s    zSSLSocket.sendmsgc             C   s   | j   | jr|dkr$td| j d}t|L}|jd6}t|}x&||k rl| j||d  }||7 }qHW W d Q R X W d Q R X ntj	| ||S d S )Nr   z6non-zero flags not allowed in calls to sendall() on %sB)
r   r   rP   rk   
memoryviewcastrR   r   r0   sendall)r   r   r   r>   ZviewZ	byte_viewamountr   r#   r#   r$   r     s    

"zSSLSocket.sendallc                s,   | j d krt j|||S | j|||S d S )N)r   rf   sendfileZ_sendfile_use_send)r   fileoffsetr>   )rk   r#   r$   r     s    
zSSLSocket.sendfilec             C   s@   | j   | jr.|dkr$td| j | j|S tj| ||S d S )Nr   z3non-zero flags not allowed in calls to recv() on %s)r   r   rP   rk   r   r0   recv)r   buflenr   r#   r#   r$   r     s    

zSSLSocket.recvc             C   sf   | j   |r|d krt|}n|d kr*d}| jrR|dkrFtd| j | j||S tj| |||S d S )Ni   r   z8non-zero flags not allowed in calls to recv_into() on %s)r   rR   r   rP   rk   r   r0   	recv_into)r   r   nbytesr   r#   r#   r$   r     s    

zSSLSocket.recv_intoc             C   s0   | j   | jrtd| j ntj| ||S d S )Nz'recvfrom not allowed on instances of %s)r   r   rP   rk   r0   recvfrom)r   r   r   r#   r#   r$   r     s
    zSSLSocket.recvfromc             C   s2   | j   | jrtd| j ntj| |||S d S )Nz,recvfrom_into not allowed on instances of %s)r   r   rP   rk   r0   recvfrom_into)r   r   r   r   r#   r#   r$   r     s
    zSSLSocket.recvfrom_intoc             O   s   t d| j d S )Nz&recvmsg not allowed on instances of %s)r   rk   )r   r}   r~   r#   r#   r$   recvmsg  s    zSSLSocket.recvmsgc             O   s   t d| j d S )Nz+recvmsg_into not allowed on instances of %s)r   rk   )r   r}   r~   r#   r#   r$   recvmsg_into  s    zSSLSocket.recvmsg_intoc             C   s    | j   | jr| jj S dS d S )Nr   )r   r   r   )r   r#   r#   r$   r     s    
zSSLSocket.pendingc             C   s   | j   d | _tj| | d S )N)r   r   r0   r   )r   Zhowr#   r#   r$   r     s    zSSLSocket.shutdownc             C   s.   | j r| j j }d | _ |S tdt|  d S )NzNo SSL wrapper around )r   r   rP   str)r   sr#   r#   r$   r     s
    
zSSLSocket.unwrapc             C   s$   | j r| j j S tdt|  d S )NzNo SSL wrapper around )r   r   rP   r  )r   r#   r#   r$   r   $  s    
z&SSLSocket.verify_client_post_handshakec             C   s   d | _ tj|  d S )N)r   r0   _real_close)r   r#   r#   r$   r  *  s    zSSLSocket._real_closec             C   sF   | j   | j }z$|dkr(|r(| jd  | jj  W d | j| X d S )Ng        )r   r   r   r   r   )r   blockr   r#   r#   r$   r   .  s    
zSSLSocket.do_handshakec             C   s   | j rtd| jrtd| jj| d| j}t|| | jd| _y>|rTt	j
| |}nd }t	j| | |s|d| _| jr|| j  |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!F)r   r   T)r   rP   r   r   r   r   r   r   r   r0   
connect_exconnectr   r   r   )r   r   r  r   Zrcr#   r#   r$   _real_connect9  s(    zSSLSocket._real_connectc             C   s   | j |d d S )NF)r
  )r   r   r#   r#   r$   r	  R  s    zSSLSocket.connectc             C   s   | j |dS )NT)r
  )r   r   r#   r#   r$   r  W  s    zSSLSocket.connect_exc             C   s.   t j| \}}| jj|| j| jdd}||fS )NT)r   r   r   )r0   acceptr   r   r   r   )r   Znewsockr   r#   r#   r$   r  \  s    zSSLSocket.accept
tls-uniquec             C   s   | j d krd S | j j|S )N)r   r   )r   r   r#   r#   r$   r   h  s    
zSSLSocket.get_channel_bindingc             C   s   | j d krd S | j j S )N)r   r   )r   r#   r#   r$   r   q  s    
zSSLSocket.version)N)r   N)F)r   )N)r   )r   N)r   r   )Nr   )r   r   )Nr   )F)r  )0r7   r8   r9   r   r   r1   r2   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r   r   r   r  r   r
  r	  r  r  r   r   rq   r#   r#   )rk   r$   r     s^   Z

	












	r   Tc
       
      C   s   t | |||||||||	d
S )N)
r   r   r   r   r   r   r   r   r   r   )r   )
r   r   r   r   r   r   r   r   r   r   r#   r#   r$   r   {  s    r   c             C   s   ddl m} ddlm} d}d}y|j| d d j d }W n$ tk
rb   td| |f Y n0X || dd  |}||d |f|dd  S d S )Nr   )strptime)timegmJanFebMarAprMayJunJulAugSepOctNovDecz %d %H:%M:%S %Y GMTrZ   r:   z*time data %r does not match format "%%b%s"rY      )r  r  r  r  r  r  r  r  r  r  r  r  )Ztimer  Zcalendarr  indextitlerP   )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             C   s2   t tj| dd}td tj|d d t d S )NASCIIstrict
@   )r  base64Zstandard_b64encode
PEM_HEADERtextwrapfill
PEM_FOOTER)Zder_cert_bytesfr#   r#   r$   DER_cert_to_PEM_cert  s    r*  c             C   s\   | j tstdt | j jts0tdt | j tttt  }tj|j	ddS )Nz(Invalid PEM encoding; must start with %sz&Invalid PEM encoding; must end with %sr   r!  )
r!   r%  rP   stripendswithr(  rR   r$  Zdecodebytesencode)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| &}|j|}|jd}	W d Q R X W d Q R X t|	S )N)r   rc   T)r   r   _create_stdlib_contextr3   r   r   r*  )
r   r   r   hostZportr   r   r   ZsslsockZdercertr#   r#   r$   get_server_certificate  s    
r2  c             C   s   t j| dS )Nz	<unknown>)_PROTOCOL_NAMESrQ   )Zprotocol_coder#   r#   r$   get_protocol_name  s    r4  )r:   )arK   r&  rB   r   r]   collectionsr   enumr   Z_Enumr   Z_IntEnumr   Z_IntFlagr[   r   r   r   r	   r
   r   r   r   r   r   r   r   r   rh   r   rl   r   r   r   r   r   ImportErrorr   r   r   r   r   r   _convertr7   r   r   r    __members__itemsr3  getattrrz   r   r.   r/   r0   r1   r2   r3   r4   r5   r$  r   r   r   Zsocket_errorZHAS_TLS_UNIQUEr   r|   r   rP   r6   rJ   rO   rW   rX   r\   re   rr   ru   rs   r   r   Z_create_default_https_contextr0  r   r   r   r   r  r%  r(  r*  r/  r2  r4  r#   r#   r#   r$   <module>]   s    
14i%    -
	