???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................3
iݭ                 @   sl  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* 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/ Z0e._0dd e.j1j2 D Z3e4e.ddZ5ej6dkrd dlm7Z7m8Z8 d d l9m9Z9m:Z:m;Z;m<Z< d d!l9m=Z=m>Z> d dl?Z?d dl@Z@d dlAZAeBZCejDr:d"gZEng ZEe*ZFG d#d$ d$eGZHdQd&d'ZId(d) ZJd*d+ ZKed,d-ZLd.d/ ZMG d0d1 d1ed1d2ZNG d3d4 d4eNe	ZOG d5d6 d6eZPeOjQfdddd7d8d9ZRe/feSd:eOjQdddddd;d<d=ZTeRZUeTZVG d>d? d?ZWG d@dA dAe9ZXddd:eSe/ddBdBdf	dCdDZYdEdF ZZdGZ[dHZ\dIdJ Z]dKdL Z^e/dfdMdNZ_dOdP Z`dS )R    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)_DEFAULT_CIPHERS)_OPENSSL_API_VERSION
_SSLMethodc             C   s   | j do| dkS )NZ	PROTOCOL_PROTOCOL_SSLv23)
startswith)name r$   /usr/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-uniquec               @   s   e Zd ZdS )CertificateErrorN)__name__
__module____qualname__r$   r$   r$   r%   r7      s   r7      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countr7   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&    

rK   c             C   s   t j| j }||kS )N)	ipaddress
ip_addressrstrip)Zipnamehost_ipZipr$   r$   r%   _ipaddress_match   s    rP   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)
ValueErrorrL   rM   getrK   rB   rP   lenr7   rG   mapr@   )certrJ   rO   ZdnsnamesZsankeyr,   subr$   r$   r%   match_hostname   s>    

rX   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environrR   rY   pathisfileisdir)partscafilecapathr$   r$   r%   r]   -  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%   rh   @  s    z_ASN1Object.__new__c                s   t  j| ft| S )N)rg   rh   _nid2obj)rj   Znid)rl   r$   r%   fromnidC  s    z_ASN1Object.fromnidc                s   t  j| ft|dd S )NT)r#   )rg   rh   ri   )rj   r#   )rl   r$   r%   fromnameI  s    z_ASN1Object.fromname)	r8   r9   r:   	__slots__rh   classmethodrn   ro   __classcell__r$   r$   )rl   r%   rf   ;  s   rf   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%   rs   P  s   rs   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| |}|S )N)r	   rh   )rj   rv   argskwargsselfr$   r$   r%   rh   ^  s    zSSLContext.__new__c             C   s
   || _ d S )N)rv   )r|   rv   r$   r$   r%   __init__b  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_sockete  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_bioo  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bytesrS   r   rB   extendZ_set_npn_protocols)r|   npn_protocolsprotosrv   br$   r$   r%   set_npn_protocolsu  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   rS   r   rB   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/   rk   r   PermissionErrorwarningswarnload_verify_locations)r|   	storenamepurposeZcertsrU   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.   )
isinstancerf   	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(   rg   options)r|   )rl   r$   r%   r     s    zSSLContext.optionsc                s   t ttjj| | d S )N)rg   ru   r   __set__)r|   r,   )rl   r$   r%   r     s    c                s   t t jS )N)r)   rg   verify_flags)r|   )rl   r$   r%   r     s    zSSLContext.verify_flagsc                s   t ttjj| | d S )N)rg   ru   r   r   )r|   r,   )rl   r$   r%   r     s    c                s*   t  j}yt|S  tk
r$   |S X d S )N)rg   verify_moder*   rQ   )r|   r,   )rl   r$   r%   r     s
    zSSLContext.verify_modec                s   t ttjj| | d S )N)rg   ru   r   r   )r|   r,   )rl   r$   r%   r     s    )rv   rw   )rx   ry   )FTTNN)FNN)r8   r9   r:   rp   r   PROTOCOL_TLSrh   r}   r   r   r   r   r   rs   rt   r   propertyr   setterr   r   rr   r$   r$   )rl   r%   ru   W  s(      
 
ru   )rd   re   r   c            C   sd   t | tst| tt}| tjkr0t|_d|_	|s<|s<|rL|j
||| n|jtkr`|j|  |S )NT)r   rf   r   ru   r   rs   rt   CERT_REQUIREDr   check_hostnamer   	CERT_NONEr   )r   rd   re   r   contextr$   r$   r%   create_default_context  s    



r   F)	cert_reqsr   r   certfilekeyfilerd   re   r   c      
      C   s   t |tst|t| }	|s$d|	_|d k	r2||	_|r<d|	_|rN| rNtd|sV|rb|	j|| |sn|sn|r~|	j||| n|	jt	kr|	j
| |	S )NFTzcertfile must be specified)r   rf   r   ru   r   r   rQ   load_cert_chainr   r   r   )
rv   r   r   r   r   r   rd   re   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}     s    zSSLObject.__init__c             C   s   | j jS )N)r   r   )r|   r$   r$   r%   r   %  s    zSSLObject.contextc             C   s   || j _d S )N)r   r   )r|   ctxr$   r$   r%   r   *  s    c             C   s   | j jS )N)r   r   )r|   r$   r$   r%   r   .  s    zSSLObject.sessionc             C   s   || j _d S )N)r   r   )r|   r   r$   r$   r%   r   3  s    c             C   s   | j jS )N)r   session_reused)r|   r$   r$   r%   r   7  s    zSSLObject.session_reusedc             C   s   | j jS )N)r   r   )r|   r$   r$   r%   r   <  s    zSSLObject.server_sidec             C   s   | j jS )N)r   r   )r|   r$   r$   r%   r   A  s    zSSLObject.server_hostname   c             C   s(   |d k	r| j j||}n| j j|}|S )N)r   read)r|   rS   buffervr$   r$   r%   r   G  s    zSSLObject.readc             C   s   | j j|S )N)r   write)r|   datar$   r$   r%   r   S  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   d  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   k  s    z SSLObject.selected_alpn_protocolc             C   s
   | j j S )N)r   cipher)r|   r$   r$   r%   r   r  s    zSSLObject.cipherc             C   s
   | j j S )N)r   shared_ciphers)r|   r$   r$   r%   r   w  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   rQ   rX   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_TYPESrQ   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   )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%   r     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          6   C   s:  d | _ |r|| _n|r$| r$td|r6| r6td|rD| rD|}t|| _|| j_|rf| jj| |rx| jj|| |r| jj| |r| jj| || _	|| _
|| _|| _|| _|| _|jtttkrtd|r|rtd|d k	rtd| jjr| rtd|| _|| _|| _|| _|| _|d k	rftj| |j|j|j|j d |j  }|j!  n,|d k	rtj| |d ntj| |	|
|d	 y| j"  W n t#k
r } z|j$t$j%kr d
}| j  dk}| j&d
 y| j'd}W n> t#k
r( } z |j$t$j%t$j(fkr d}W Y d d }~X nX | j&| |rd}t)|j$|}||_*d |_+y| j,  W n t#k
rx   Y nX z|W d d }X W Y d d }~X nX d}| j-| d
| _.d | _ || _/|r6yN| jj0| ||}t1|| | jd| _ |r| j  }|dkrtd| j2  W n$ t#tfk
r4   | 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   Fr   r;       z5Closed before TLS handshake with data in recv buffer.T)r   r   g        zHdo_handshake_on_connect should not be specified for non-blocking sockets)3r   r   rQ   ru   r   r   r   r   Zset_ciphersr   r   r   ssl_versionca_certsciphersZ
getsockoptr5   r6   r3   r   r   r   r   r   r   r   r1   r}   r   r   r   r   
gettimeoutdetachgetpeernameOSErrorerrnoZENOTCONNZsetblockingrecvZEINVALr   reasonZlibraryclose
settimeoutZ_closed
_connected_wrap_socketr   r   )r|   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zsock_timeouteZ	connectedZblockingZnotconn_pre_handshake_datar   Z notconn_pre_handshake_data_errorr   timeoutr$   r$   r%   r}     s    











zSSLSocket.__init__c             C   s   | j S )N)r   )r|   r$   r$   r%   r   0  s    zSSLSocket.contextc             C   s   || _ || j_d S )N)r   r   r   )r|   r   r$   r$   r%   r   4  s    c             C   s   | j d k	r| j jS d S )N)r   r   )r|   r$   r$   r%   r   9  s    
zSSLSocket.sessionc             C   s   || _ | jd k	r|| 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   E  s    
zSSLSocket.session_reusedc             C   s   t d| jj d S )NzCan't dup() %s instances)r   rl   r8   )r|   r$   r$   r%   dupK  s    zSSLSocket.dupc             C   s   d S )Nr$   )r|   msgr$   r$   r%   _checkClosedO  s    zSSLSocket._checkClosedc             C   s   | j s| j  d S )N)r   r   )r|   r$   r$   r%   _check_connectedS  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   r   rQ   r   r   rz   ZSSL_ERROR_EOFr   )r|   rS   r   xr$   r$   r%   r   [  s    zSSLSocket.readc             C   s"   | j   | jstd| jj|S )Nz(Write on closed or unwrapped SSL socket.)r   r   rQ   r   )r|   r   r$   r$   r%   r   m  s    zSSLSocket.writec             C   s   | j   | j  | jj|S )N)r   r   r   r   )r|   r   r$   r$   r%   r   v  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   rQ   rl   r   r1   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   rQ   rl   r1   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   rl   )r|   rz   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   rQ   rl   
memoryviewcastrS   r   r1   sendall)r|   r   r   r?   ZviewZ	byte_viewZamountr   r$   r$   r%   r     s    

"zSSLSocket.sendallc                s,   | j d krt j|||S | j|||S d S )N)r   rg   sendfileZ_sendfile_use_send)r|   fileoffsetr?   )rl   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   rQ   rl   r   r1   r   )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   rS   r   rQ   rl   r   r1   	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   rQ   rl   r1   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   rQ   rl   r1   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   rl   )r|   rz   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   rl   )r|   rz   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   r1   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   rQ   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   rQ   r   )r|   r$   r$   r%   r     s    
z&SSLSocket.verify_client_post_handshakec             C   s   d | _ tj|  d S )N)r   r1   _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   rQ   r   r   r   r   r   r   r   r1   
connect_exconnectr   r   r   )r|   r   r  r   Zrcr$   r$   r%   _real_connect2  s(    zSSLSocket._real_connectc             C   s   | j |d d S )NF)r  )r|   r   r$   r$   r%   r  K  s    zSSLSocket.connectc             C   s   | j |dS )NT)r  )r|   r   r$   r$   r%   r  P  s    zSSLSocket.connect_exc             C   s.   t j| \}}| jj|| j| jdd}||fS )NT)r   r   r   )r1   acceptr   r   r   r   )r|   Znewsockr   r$   r$   r%   r  U  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   a  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   j  s    
zSSLSocket.version)N)r   N)F)r   )N)r   )r   N)r   r   )Nr   )r   r   )Nr   )F)r  )0r8   r9   r:   r   r   r2   r3   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   rr   r$   r$   )rl   r%   r     s^   |

	












	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   t  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 GMTr[   r;   z*time data %r does not match format "%%b%s"rZ      )r  r  r  r  r  r  r  r  r  r  r  r  )Ztimer	  Zcalendarr
  indextitlerQ   )Z	cert_timer	  r
  ZmonthsZtime_formatZmonth_numberZ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textwrapZ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   rQ   stripendswithr"  rS   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   rd   T)r   r   _create_stdlib_contextr4   r   r   r$  )
r   r   r   hostZportr   r   r~   ZsslsockZdercertr$   r$   r%   get_server_certificate  s    
r,  c             C   s   t j| dS )Nz	<unknown>)_PROTOCOL_NAMESrR   )Zprotocol_coder$   r$   r%   get_protocol_name  s    r.  )r;   )arL   r!  rC   r   r^   collectionsr   enumr   Z_Enumr   Z_IntEnumr   Z_IntFlagr\   r   r   r   r	   r
   r   r   r   r   r   r   r   r   ri   r   rm   r   r   r   r   r   ImportErrorr   r   r   r   r   r   r   _convertr8   r    r   r!   __members__itemsr-  getattrZ_SSLv2_IF_EXISTSr   r/   r0   r1   r2   r3   r4   r5   r6   r  r   r   r   Zsocket_errorZHAS_TLS_UNIQUEr   Z_RESTRICTED_SERVER_CIPHERSrQ   r7   rK   rP   rX   rY   r]   rf   rs   ru   rt   r   r   r   Z_create_default_https_contextr*  r   r   r   r  r   r"  r$  r)  r,  r.  r$   r$   r$   r%   <module>]   s    
14g(    O
	