
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
ct„jÝ­  ã               @   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�ræd 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|ƒƒ q¨W 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	ršt||ƒršd S |j|ƒ qJW |sôxF| jdf ƒD ]6}x0|D ](\}}|dkrÄt||ƒrâd S |j|ƒ qÄW qºW 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rÔtdƒ‚|rô|rätdƒ‚|d k	rôtdƒ‚| jj�r| �rtdƒ‚|| _|| _|| _|| _|| _|d k	�rftj| |j|j|j|jƒ d� |j ƒ }|j!ƒ  n,|d k	�r€t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&|ƒ |�rŠd}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
	