
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    ¡ê,aHÆ  ã                
   @   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"k
rÐ   Y nX 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„ e1j4 5¡ 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@mAZAmBZBmCZC d d(l@mDZDmEZE 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[e2fe\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„ Zje2dfdVdW„ZkdXdY„ ZldS )Zé    N)Ú
namedtuple)ÚEnumÚIntEnumÚIntFlag)ÚOPENSSL_VERSION_NUMBERÚOPENSSL_VERSION_INFOÚOPENSSL_VERSION)Ú_SSLContextÚ	MemoryBIOÚ
SSLSession)ÚSSLErrorÚSSLZeroReturnErrorÚSSLWantReadErrorÚSSLWantWriteErrorÚSSLSyscallErrorÚSSLEOFErrorÚSSLCertVerificationError)Útxt2objÚnid2obj)ÚRAND_statusÚRAND_addÚ
RAND_bytesÚRAND_pseudo_bytes)ÚRAND_egd)
ÚHAS_SNIÚHAS_ECDHÚHAS_NPNÚHAS_ALPNÚ	HAS_SSLv2Ú	HAS_SSLv3Ú	HAS_TLSv1ÚHAS_TLSv1_1ÚHAS_TLSv1_2ÚHAS_TLSv1_3)Ú_DEFAULT_CIPHERSÚ_OPENSSL_API_VERSIONÚ
_SSLMethodc                 C   s   |   d¡o| dkS )NZ	PROTOCOL_ÚPROTOCOL_SSLv23©Ú
startswith©Úname© r,   ú(/opt/alt/python38/lib64/python3.8/ssl.pyÚ<lambda>|   ó    r.   )ÚsourceÚOptionsc                 C   s
   |   d¡S )NZOP_r(   r*   r,   r,   r-   r.   �   r/   ZAlertDescriptionc                 C   s
   |   d¡S )NZALERT_DESCRIPTION_r(   r*   r,   r,   r-   r.   †   r/   ZSSLErrorNumberc                 C   s
   |   d¡S )NZ
SSL_ERROR_r(   r*   r,   r,   r-   r.   ‹   r/   ÚVerifyFlagsc                 C   s
   |   d¡S )NZVERIFY_r(   r*   r,   r,   r-   r.   �   r/   Ú
VerifyModec                 C   s
   |   d¡S )NZCERT_r(   r*   r,   r,   r-   r.   •   r/   c                 C   s   i | ]\}}||“qS r,   r,   )Ú.0r+   Úvaluer,   r,   r-   Ú
<dictcomp>™   s      r6   ZPROTOCOL_SSLv2c                   @   s6   e Zd ZejZejZejZ	ej
ZejZejZejZdS )Ú
TLSVersionN)Ú__name__Ú
__module__Ú__qualname__Ú_sslZPROTO_MINIMUM_SUPPORTEDZMINIMUM_SUPPORTEDZPROTO_SSLv3ÚSSLv3ZPROTO_TLSv1ZTLSv1ZPROTO_TLSv1_1ZTLSv1_1ZPROTO_TLSv1_2ZTLSv1_2ZPROTO_TLSv1_3ZTLSv1_3ZPROTO_MAXIMUM_SUPPORTEDZMAXIMUM_SUPPORTEDr,   r,   r,   r-   r7   ž   s   r7   c                   @   s$   e Zd ZdZdZdZdZdZdZdS )Ú_TLSContentTypeé   é   é   é   é   é  N)	r8   r9   r:   ÚCHANGE_CIPHER_SPECÚALERTZ	HANDSHAKEZAPPLICATION_DATAÚHEADERZINNER_CONTENT_TYPEr,   r,   r,   r-   r=   ¨   s   r=   c                   @   s”   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#S )$Ú_TLSAlertTyper   é
   r>   r?   r@   é   é(   é)   é*   é+   é,   é-   é.   é/   é0   é1   é2   é3   é<   éF   éG   éP   éV   éZ   éd   ém   én   éo   ép   éq   ér   és   ét   éx   N)%r8   r9   r:   ZCLOSE_NOTIFYZUNEXPECTED_MESSAGEZBAD_RECORD_MACZDECRYPTION_FAILEDZRECORD_OVERFLOWZDECOMPRESSION_FAILUREZHANDSHAKE_FAILUREZNO_CERTIFICATEZBAD_CERTIFICATEZUNSUPPORTED_CERTIFICATEZCERTIFICATE_REVOKEDZCERTIFICATE_EXPIREDZCERTIFICATE_UNKNOWNZILLEGAL_PARAMETERZ
UNKNOWN_CAZACCESS_DENIEDZDECODE_ERRORZDECRYPT_ERRORZEXPORT_RESTRICTIONZPROTOCOL_VERSIONZINSUFFICIENT_SECURITYZINTERNAL_ERRORZINAPPROPRIATE_FALLBACKZUSER_CANCELEDZNO_RENEGOTIATIONZMISSING_EXTENSIONZUNSUPPORTED_EXTENSIONZCERTIFICATE_UNOBTAINABLEZUNRECOGNIZED_NAMEZBAD_CERTIFICATE_STATUS_RESPONSEZBAD_CERTIFICATE_HASH_VALUEZUNKNOWN_PSK_IDENTITYZCERTIFICATE_REQUIREDZNO_APPLICATION_PROTOCOLr,   r,   r,   r-   rG   ¶   sD   rG   c                   @   sd   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdS )Ú_TLSMessageTyper   é   é   é   é   é   é   é   é   é   é   é   é   é   r>   r?   r@   rA   é   éC   éþ   rC   N)r8   r9   r:   ZHELLO_REQUESTZCLIENT_HELLOZSERVER_HELLOZHELLO_VERIFY_REQUESTZNEWSESSION_TICKETZEND_OF_EARLY_DATAZHELLO_RETRY_REQUESTZENCRYPTED_EXTENSIONSZCERTIFICATEZSERVER_KEY_EXCHANGEZCERTIFICATE_REQUESTZSERVER_DONEZCERTIFICATE_VERIFYZCLIENT_KEY_EXCHANGEZFINISHEDZCERTIFICATE_URLZCERTIFICATE_STATUSZSUPPLEMENTAL_DATAZ
KEY_UPDATEZ
NEXT_PROTOZMESSAGE_HASHrD   r,   r,   r,   r-   rf   ß   s,   rf   Úwin32)Úenum_certificatesÚ	enum_crls)ÚsocketÚAF_INETÚSOCK_STREAMÚcreate_connection)Ú
SOL_SOCKETÚSO_TYPEú
tls-uniqueÚHOSTFLAG_NEVER_CHECK_SUBJECTc                 C   s¶   | sdS |   d¡}|s&|  ¡ | ¡ kS |dkr<td | ¡ƒ‚|  d¡\}}}d|krbtd | ¡ƒ‚|sttd | ¡ƒ‚|dkrŠtd | ¡ƒ‚| d¡\}}}|r¢|s¦dS | ¡ | ¡ kS )	NFÚ*rg   z1too many wildcards in certificate DNS name: {!r}.Ú.z9wildcard can only be present in the leftmost label: {!r}.z>sole wildcard without additional labels are not support: {!r}.z<partial wildcards in leftmost label are not supported: {!r}.)ÚcountÚlowerÚCertificateErrorÚformatÚ	partition)ZdnÚhostnameZ	wildcardsZdn_leftmostÚsepZdn_remainderZhostname_leftmostZhostname_remainderr,   r,   r-   Ú_dnsname_match  s@    

ÿÿÿÿÿÿÿr‹   c                 C   sœ   zt  | ¡}W n tk
r"   Y n"X t  |¡| kr6|S td | ¡ƒ‚zt  t j| ¡W S  tk
rv   td | ¡ƒ‚Y n tk
rˆ   Y nX td | ¡ƒ‚d S )Nz'{!r} is not a quad-dotted IPv4 address.z+{!r} is neither an IPv4 nor an IP6 address.z{!r} is not an IPv4 address.)	Ú_socketZ	inet_atonÚOSErrorZ	inet_ntoaÚ
ValueErrorr‡   Z	inet_ptonZAF_INET6ÚAttributeError)ZipnameÚaddrr,   r,   r-   Ú_inet_patonD  s$    ÿÿ
r‘   c                 C   s   t |  ¡ ƒ}||kS ©N)r‘   Úrstrip)Zcert_ipaddressÚhost_ipZipr,   r,   r-   Ú_ipaddress_matchg  s    r•   c                 C   sJ  | st dƒ‚zt|ƒ}W n t k
r0   d }Y nX g }|  dd¡}|D ]^\}}|dkrz|d krnt||ƒrn d S | |¡ qF|dkrF|d k	ršt||ƒrš d S | |¡ qF|sî|  dd¡D ]6}|D ],\}}|dkr¾t||ƒrà  d S | |¡ q¾q¶t|ƒdk�rtd	|d
 t	t
|ƒ¡f ƒ‚n,t|ƒdk�r>td||d f ƒ‚ntdƒ‚d S )Nztempty or no certificate, match_hostname needs a SSL socket or SSL context with either CERT_OPTIONAL or CERT_REQUIREDZsubjectAltNamer,   ZDNSz
IP AddressZsubjectZ
commonNamerg   z&hostname %r doesn't match either of %sz, zhostname %r doesn't match %rr   z=no appropriate commonName or subjectAltName fields were found)rŽ   r‘   Úgetr‹   Úappendr•   Úlenr†   ÚjoinÚmapÚrepr)Úcertr‰   r”   ZdnsnamesZsanÚkeyr5   Úsubr,   r,   r-   Úmatch_hostnames  sB    

þ
þrŸ   ÚDefaultVerifyPathszQcafile capath openssl_cafile_env openssl_cafile openssl_capath_env openssl_capathc                  C   sd   t  ¡ } tj | d | d ¡}tj | d | d ¡}ttj |¡rF|nd tj |¡rX|nd f| žŽ S )Nr   rg   rh   ri   )	r;   Úget_default_verify_pathsÚosÚenvironr–   r    ÚpathÚisfileÚisdir)ÚpartsÚcafileÚcapathr,   r,   r-   r¡   °  s    ÿþr¡   c                       s@   e Zd ZdZ‡ fdd„Ze‡ fdd„ƒZe‡ fdd„ƒZ‡  ZS )Ú_ASN1Objectr,   c                    s   t ƒ j| ft|dd�žŽ S )NFr*   ©ÚsuperÚ__new__Ú_txt2obj)ÚclsÚoid©Ú	__class__r,   r-   r­   Ã  s    z_ASN1Object.__new__c                    s   t ƒ j| ft|ƒžŽ S r’   )r¬   r­   Ú_nid2obj)r¯   Znidr±   r,   r-   ÚfromnidÆ  s    z_ASN1Object.fromnidc                    s   t ƒ j| ft|dd�žŽ S )NTr*   r«   )r¯   r+   r±   r,   r-   ÚfromnameÌ  s    z_ASN1Object.fromname)	r8   r9   r:   Ú	__slots__r­   Úclassmethodr´   rµ   Ú__classcell__r,   r,   r±   r-   rª   ¾  s   rª   znid shortname longname oidc                   @   s   e Zd ZdZdZdS )ÚPurposez1.3.6.1.5.5.7.3.1z1.3.6.1.5.5.7.3.2N)r8   r9   r:   ÚSERVER_AUTHZCLIENT_AUTHr,   r,   r,   r-   r¹   Ó  s   r¹   c                       sŒ  e Zd ZdZdZdZefdd„Zdd„ Zd1d	d
„Z	d2dd„Z
dd„ Zdd„ Zdd„ Zdd„ Zejfdd„Zeedƒr¸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eed!ƒ�red"d#„ ƒZejd$d#„ ƒZned%d#„ ƒZe‡ fd&d'„ƒZej‡ fd(d'„ƒZe‡ fd)d*„ƒZe‡ fd+d,„ƒZej‡ fd-d,„ƒZe‡ fd.d/„ƒZej‡ fd0d/„ƒZ‡  ZS )3Ú
SSLContext)ZCAZROOTNc                 O   s   t  | |¡}|S r’   )r	   r­   )r¯   ÚprotocolÚargsÚkwargsÚselfr,   r,   r-   r­   â  s    zSSLContext.__new__c                 C   s4   |d krd S t |tƒr&| d¡ d¡S | d¡S d S )NZidnaÚascii)Ú
isinstanceÚstrÚencodeÚdecode)r¿   r‰   r,   r,   r-   Ú_encode_hostnameæ  s
    
zSSLContext._encode_hostnameFTc              	   C   s   | j j|||||| |d�S )N)ÚsockÚserver_sideÚdo_handshake_on_connectÚsuppress_ragged_eofsÚserver_hostnameÚcontextÚsession)Ússlsocket_classÚ_create)r¿   rÆ   rÇ   rÈ   rÉ   rÊ   rÌ   r,   r,   r-   Úwrap_socketî  s    ùzSSLContext.wrap_socketc                 C   s   | j j||||  |¡|| d�S )N)rÇ   rÊ   rÌ   rË   )Ússlobject_classrÎ   rÅ   )r¿   ÚincomingÚoutgoingrÇ   rÊ   rÌ   r,   r,   r-   Úwrap_bioþ  s       ýzSSLContext.wrap_bioc                 C   s`   t ƒ }|D ]F}t|dƒ}t|ƒdks0t|ƒdkr8tdƒ‚| t|ƒ¡ | |¡ q
|  |¡ d S )NrÀ   r   éÿ   z(NPN protocols must be 1 to 255 in length)Ú	bytearrayÚbytesr˜   r   r—   ÚextendZ_set_npn_protocols)r¿   Znpn_protocolsÚprotosr¼   Úbr,   r,   r-   Úset_npn_protocols  s    
zSSLContext.set_npn_protocolsc                    s8   ˆd krd ˆ _ n$tˆƒs tdƒ‚‡ ‡fdd„}|ˆ _ d S )Nznot a callable objectc                    s   ˆ   |¡}ˆ| ||ƒS r’   )rÅ   )ÚsslobjZ
servernameZsslctx©r¿   Úserver_name_callbackr,   r-   Úshim_cb  s    
z3SSLContext.set_servername_callback.<locals>.shim_cb)Zsni_callbackÚcallableÚ	TypeError)r¿   rÝ   rÞ   r,   rÜ   r-   Úset_servername_callback  s    z"SSLContext.set_servername_callbackc                 C   s`   t ƒ }|D ]F}t|dƒ}t|ƒdks0t|ƒdkr8tdƒ‚| t|ƒ¡ | |¡ q
|  |¡ d S )NrÀ   r   rÔ   z)ALPN protocols must be 1 to 255 in length)rÕ   rÖ   r˜   r   r—   r×   Z_set_alpn_protocols)r¿   Zalpn_protocolsrØ   r¼   rÙ   r,   r,   r-   Úset_alpn_protocols   s    
zSSLContext.set_alpn_protocolsc                 C   sv   t ƒ }z<t|ƒD ].\}}}|dkr|dks4|j|kr| |¡ qW n tk
r`   t d¡ Y nX |rr| j|d� |S )NZx509_asnTz-unable to enumerate Windows certificate store)Úcadata)rÕ   rx   r°   r×   ÚPermissionErrorÚwarningsÚwarnÚload_verify_locations)r¿   Ú	storenameÚpurposeZcertsrœ   ÚencodingZtrustr,   r,   r-   Ú_load_windows_store_certs+  s    z$SSLContext._load_windows_store_certsc                 C   s@   t |tƒst|ƒ‚tjdkr4| jD ]}|  ||¡ q"|  ¡  d S )Nrw   )rÁ   rª   rà   ÚsysÚplatformÚ_windows_cert_storesrë   Zset_default_verify_paths)r¿   ré   rè   r,   r,   r-   Úload_default_certs9  s    


zSSLContext.load_default_certsÚminimum_versionc                    s   t tƒ jƒS r’   )r7   r¬   rð   ©r¿   r±   r,   r-   rð   B  s    zSSLContext.minimum_versionc                    s4   |t jkr|  jtj M  _tttƒj | |¡ d S r’   )	r7   r<   Úoptionsr1   ZOP_NO_SSLv3r¬   r»   rð   Ú__set__©r¿   r5   r±   r,   r-   rð   F  s    
c                    s   t tƒ jƒS r’   )r7   r¬   Úmaximum_versionrñ   r±   r,   r-   rõ   L  s    zSSLContext.maximum_versionc                    s   t ttƒj | |¡ d S r’   )r¬   r»   rõ   ró   rô   r±   r,   r-   rõ   P  s    c                    s   t tƒ jƒS r’   )r1   r¬   rò   rñ   r±   r,   r-   rò   T  s    zSSLContext.optionsc                    s   t ttƒj | |¡ d S r’   )r¬   r»   rò   ró   rô   r±   r,   r-   rò   X  s    r�   c                 C   s   | j tj@ }|tjkS r’   ©Z_host_flagsr;   r�   )r¿   Zncsr,   r,   r-   Úhostname_checks_common_name]  s    z&SSLContext.hostname_checks_common_namec                 C   s,   |r|  j tj M  _ n|  j tjO  _ d S r’   rö   rô   r,   r,   r-   r÷   b  s    c                 C   s   dS ©NTr,   rñ   r,   r,   r-   r÷   i  s    c                    s   t ƒ j}|d k	r|jS d S d S r’   )r¬   Ú_msg_callbackÚuser_function)r¿   Úinnerr±   r,   r-   rù   m  s    !zSSLContext._msg_callbackc                    sb   ˆ d kr t ttƒj | d ¡ d S tˆ dƒs8tˆ › d�ƒ‚‡ fdd„}ˆ |_t ttƒj | |¡ d S )NÚ__call__z is not callable.c                    sœ   zt |ƒ}W n tk
r    Y nX zt|ƒ}W n tk
rB   Y nX |tjkrTt}n|tjkrdt}nt}z||ƒ}W n tk
rˆ   Y nX ˆ | |||||ƒS r’   )r7   rŽ   r=   rF   rE   rG   rf   )ZconnÚ	directionÚversionZcontent_typeZmsg_typeÚdataZmsg_enum©Úcallbackr,   r-   rû   �  s,    

  ÿz'SSLContext._msg_callback.<locals>.inner)r¬   r»   rù   ró   Úhasattrrà   rú   )r¿   r  rû   r±   r   r-   rù   ”  s    
c                    s   t tƒ jƒS r’   )r&   r¬   r¼   rñ   r±   r,   r-   r¼   º  s    zSSLContext.protocolc                    s   t tƒ jƒS r’   )r2   r¬   Úverify_flagsrñ   r±   r,   r-   r  ¾  s    zSSLContext.verify_flagsc                    s   t ttƒj | |¡ d S r’   )r¬   r»   r  ró   rô   r±   r,   r-   r  Â  s    c                    s0   t ƒ j}z
t|ƒW S  tk
r*   | Y S X d S r’   )r¬   Úverify_moder3   rŽ   rô   r±   r,   r-   r  Æ  s
    
zSSLContext.verify_modec                    s   t ttƒj | |¡ d S r’   )r¬   r»   r  ró   rô   r±   r,   r-   r  Î  s    )FTTNN)FNN) r8   r9   r:   rî   rÍ   rÐ   ÚPROTOCOL_TLSr­   rÅ   rÏ   rÓ   rÚ   rá   râ   rë   r¹   rº   rï   r  r	   Úpropertyrð   Úsetterrõ   rò   r;   r÷   rù   r¼   r  r  r¸   r,   r,   r±   r-   r»   Ú  sl         ý
    ÿ




&%r»   )r¨   r©   rã   c                C   sŒ   t | tƒst| ƒ‚ttƒ}| tjkr0t|_d|_	|s<|s<|rL| 
|||¡ n|jtkr`| | ¡ t|dƒrˆtj d¡}|rˆtjjsˆ||_|S )NTÚkeylog_filenameÚSSLKEYLOGFILE)rÁ   rª   rà   r»   r  r¹   rº   ÚCERT_REQUIREDr  Úcheck_hostnamerç   Ú	CERT_NONErï   r  r¢   r£   r–   rì   ÚflagsÚignore_environmentr  )ré   r¨   r©   rã   rË   Ú
keylogfiler,   r,   r-   Úcreate_default_contextÓ  s    




r  F)Ú	cert_reqsr  ré   ÚcertfileÚkeyfiler¨   r©   rã   c                C   s¼   t |tƒst|ƒ‚t| ƒ}	|s$d|	_|d k	r2||	_|r<d|	_|rL|sLtdƒ‚|sT|r`|	 ||¡ |sl|sl|r||	 |||¡ n|	jt	kr�|	 
|¡ t|	dƒr¸tj d¡}
|
r¸tjjs¸|
|	_|	S )NFTúcertfile must be specifiedr  r	  )rÁ   rª   rà   r»   r  r  rŽ   Úload_cert_chainrç   r  rï   r  r¢   r£   r–   rì   r  r  r  )r¼   r  r  ré   r  r  r¨   r©   rã   rË   r  r,   r,   r-   Ú_create_unverified_contextö  s,    



r  c                   @   sð   e Zd Zdd„ Zed1dd„ƒZedd„ ƒZejd	d„ ƒZed
d„ ƒZ	e	jdd„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZd2dd„Zdd„ Zd3dd„Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd4d+d,„Zd-d.„ Zd/d0„ ZdS )5Ú	SSLObjectc                 O   s   t | jj› d�ƒ‚d S )NzU does not have a public constructor. Instances are returned by SSLContext.wrap_bio().©rà   r²   r8   ©r¿   r½   r¾   r,   r,   r-   Ú__init__;  s    ÿzSSLObject.__init__FNc           	      C   s*   |   | ¡}|j||||||d�}||_|S )N)rÇ   rÊ   ÚownerrÌ   )r­   Z	_wrap_bioÚ_sslobj)	r¯   rÑ   rÒ   rÇ   rÊ   rÌ   rË   r¿   rÛ   r,   r,   r-   rÎ   A  s    
   ýzSSLObject._createc                 C   s   | j jS r’   ©r  rË   rñ   r,   r,   r-   rË   M  s    zSSLObject.contextc                 C   s   || j _d S r’   r  ©r¿   Zctxr,   r,   r-   rË   R  s    c                 C   s   | j jS r’   ©r  rÌ   rñ   r,   r,   r-   rÌ   V  s    zSSLObject.sessionc                 C   s   || j _d S r’   r  ©r¿   rÌ   r,   r,   r-   rÌ   [  s    c                 C   s   | j jS r’   ©r  Úsession_reusedrñ   r,   r,   r-   r"  _  s    zSSLObject.session_reusedc                 C   s   | j jS r’   )r  rÇ   rñ   r,   r,   r-   rÇ   d  s    zSSLObject.server_sidec                 C   s   | j jS r’   )r  rÊ   rñ   r,   r,   r-   rÊ   i  s    zSSLObject.server_hostnameé   c                 C   s(   |d k	r| j  ||¡}n| j  |¡}|S r’   )r  Úread)r¿   r˜   ÚbufferÚvr,   r,   r-   r$  o  s    zSSLObject.readc                 C   s   | j  |¡S r’   )r  Úwrite©r¿   rÿ   r,   r,   r-   r'  {  s    zSSLObject.writec                 C   s   | j  |¡S r’   )r  Úgetpeercert©r¿   Zbinary_formr,   r,   r-   r)  ƒ  s    zSSLObject.getpeercertc                 C   s   t jr| j ¡ S d S r’   )r;   r   r  Úselected_npn_protocolrñ   r,   r,   r-   r+  Œ  s    zSSLObject.selected_npn_protocolc                 C   s   t jr| j ¡ S d S r’   )r;   r   r  Úselected_alpn_protocolrñ   r,   r,   r-   r,  “  s    z SSLObject.selected_alpn_protocolc                 C   s
   | j  ¡ S r’   )r  Úcipherrñ   r,   r,   r-   r-  š  s    zSSLObject.cipherc                 C   s
   | j  ¡ S r’   )r  Úshared_ciphersrñ   r,   r,   r-   r.  Ÿ  s    zSSLObject.shared_ciphersc                 C   s
   | j  ¡ S r’   )r  Úcompressionrñ   r,   r,   r-   r/  ¥  s    zSSLObject.compressionc                 C   s
   | j  ¡ S r’   )r  Úpendingrñ   r,   r,   r-   r0  ª  s    zSSLObject.pendingc                 C   s   | j  ¡  d S r’   )r  Údo_handshakerñ   r,   r,   r-   r1  ®  s    zSSLObject.do_handshakec                 C   s
   | j  ¡ S r’   )r  Úshutdownrñ   r,   r,   r-   Úunwrap²  s    zSSLObject.unwrapr€   c                 C   s   | j  |¡S r’   )r  Úget_channel_binding©r¿   Zcb_typer,   r,   r-   r4  ¶  s    zSSLObject.get_channel_bindingc                 C   s
   | j  ¡ S r’   ©r  rþ   rñ   r,   r,   r-   rþ   ¼  s    zSSLObject.versionc                 C   s
   | j  ¡ S r’   )r  Úverify_client_post_handshakerñ   r,   r,   r-   r7  Á  s    z&SSLObject.verify_client_post_handshake)FNNN)r#  N)F)r€   )r8   r9   r:   r  r·   rÎ   r  rË   r  rÌ   r"  rÇ   rÊ   r$  r'  r)  r+  r,  r-  r.  r/  r0  r1  r3  r4  rþ   r7  r,   r,   r,   r-   r  ,  sF         ÿ








	
r  c                 C   s   t t| jƒj| _| S r’   )Úgetattrr  r8   Ú__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d\‡ fd*d+„	Zd,d-„ Zd]‡ fd.d/„	Zd^‡ fd0d1„	Zd_‡ fd2d3„	Zd`‡ fd4d5„	Zda‡ fd6d7„	Zdb‡ fd8d9„	Zd:d;„ Z d<d=„ Z!ed>d?„ ƒZ"‡ fd@dA„Z#edBdC„ ƒZ$edDdE„ ƒZ%‡ fdFdG„Z&edcdHdI„ƒZ'‡ fdJdK„Z(dLdM„ Z)dNdO„ Z*‡ fdPdQ„Z+edddSdT„ƒZ,edUdV„ ƒZ-‡  Z.S )eÚ	SSLSocketc                 O   s   t | jj› d�ƒ‚d S )NzX does not have a public constructor. Instances are returned by SSLContext.wrap_socket().r  r  r,   r,   r-   r  Ð  s    ÿzSSLSocket.__init__FTNc              
      s–  |  tt¡tkrtdƒ‚|r8|r(tdƒ‚|d k	r8tdƒ‚|jrJ|sJtdƒ‚t|j|j	|j
| ¡ d�}| j| f|Ž}	tt|	ƒjf |Ž |	 | ¡ ¡ | ¡  ||	_||	_d|	_d |	_||	_| |¡|	_||	_||	_z|	 ¡  W n6 tk
�r }
 z|
jtjkrþ‚ d}W 5 d }
~
X Y nX d}||	_ |�r’zH|	jj!|	||	j|	|	jd�|	_|�rj|	 ¡ }|d	k�rbtd
ƒ‚|	 "¡  W n$ ttfk
�r�   |	 #¡  ‚ Y nX |	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©r  rÌ   ç        zHdo_handshake_on_connect should not be specified for non-blocking sockets)$Z
getsockoptr~   r   r|   ÚNotImplementedErrorrŽ   r  Údictr=  r>  r?  r@  r­   r¬   r<  r  Ú
settimeoutÚ
gettimeoutÚdetachÚ_contextÚ_sessionZ_closedr  rÇ   rÅ   rÊ   rÈ   rÉ   Úgetpeernamer�   ÚerrnoZENOTCONNÚ
_connectedÚ_wrap_socketr1  Úclose)r¯   rÆ   rÇ   rÈ   rÉ   rÊ   rË   rÌ   r¾   r¿   ÚeZ	connectedÚtimeoutr±   r,   r-   rÎ   ×  sj    
  þ   þ
zSSLSocket._createc                 C   s   | j S r’   )rH  rñ   r,   r,   r-   rË     s    zSSLSocket.contextc                 C   s   || _ || j_d S r’   )rH  r  rË   r  r,   r,   r-   rË     s    c                 C   s   | j d k	r| j jS d S r’   r  rñ   r,   r,   r-   rÌ      s    
zSSLSocket.sessionc                 C   s   || _ | jd k	r|| j_d S r’   )rI  r  rÌ   r   r,   r,   r-   rÌ   &  s    
c                 C   s   | j d k	r| j jS d S r’   r!  rñ   r,   r,   r-   r"  ,  s    
zSSLSocket.session_reusedc                 C   s   t d| jj ƒ‚d S )NzCan't dup() %s instances)rC  r²   r8   rñ   r,   r,   r-   Údup2  s    ÿzSSLSocket.dupc                 C   s   d S r’   r,   )r¿   Úmsgr,   r,   r-   Ú_checkClosed6  s    zSSLSocket._checkClosedc                 C   s   | j s|  ¡  d S r’   )rL  rJ  rñ   r,   r,   r-   Ú_check_connected:  s    zSSLSocket._check_connectedr#  c              
   C   s    |   ¡  | jd krtdƒ‚z*|d k	r4| j ||¡W S | j |¡W S W nV tk
rš } z8|jd tkrˆ| jrˆ|d k	r|W Y ¢dS W Y ¢dS n‚ W 5 d }~X Y nX d S )Nz'Read on closed or unwrapped SSL socket.r   r/   )rS  r  rŽ   r$  r   r½   ZSSL_ERROR_EOFrÉ   )r¿   r˜   r%  Úxr,   r,   r-   r$  B  s    

zSSLSocket.readc                 C   s&   |   ¡  | jd krtdƒ‚| j |¡S )Nz(Write on closed or unwrapped SSL socket.)rS  r  rŽ   r'  r(  r,   r,   r-   r'  W  s    
zSSLSocket.writec                 C   s   |   ¡  |  ¡  | j |¡S r’   )rS  rT  r  r)  r*  r,   r,   r-   r)  `  s    zSSLSocket.getpeercertc                 C   s*   |   ¡  | jd kstjsd S | j ¡ S d S r’   )rS  r  r;   r   r+  rñ   r,   r,   r-   r+  f  s    zSSLSocket.selected_npn_protocolc                 C   s*   |   ¡  | jd kstjsd S | j ¡ S d S r’   )rS  r  r;   r   r,  rñ   r,   r,   r-   r,  n  s    z SSLSocket.selected_alpn_protocolc                 C   s$   |   ¡  | jd krd S | j ¡ S d S r’   )rS  r  r-  rñ   r,   r,   r-   r-  v  s    
zSSLSocket.cipherc                 C   s$   |   ¡  | jd krd S | j ¡ S d S r’   )rS  r  r.  rñ   r,   r,   r-   r.  ~  s    
zSSLSocket.shared_ciphersc                 C   s$   |   ¡  | jd krd S | j ¡ S d S r’   )rS  r  r/  rñ   r,   r,   r-   r/  †  s    
zSSLSocket.compressionr   c                    sF   |   ¡  | jd k	r4|dkr(td| j ƒ‚| j |¡S tƒ  ||¡S d S )Nr   z3non-zero flags not allowed in calls to send() on %s)rS  r  rŽ   r²   r'  r¬   Úsend)r¿   rÿ   r  r±   r,   r-   rV  Ž  s    
ÿÿzSSLSocket.sendc                    sL   |   ¡  | jd k	r"td| j ƒ‚n&|d kr8tƒ  ||¡S tƒ  |||¡S d S )Nz%sendto not allowed on instances of %s)rS  r  rŽ   r²   r¬   Úsendto)r¿   rÿ   Zflags_or_addrr�   r±   r,   r-   rW  ™  s    
ÿzSSLSocket.sendtoc                 O   s   t d| j ƒ‚d S )Nz&sendmsg not allowed on instances of %s©rC  r²   r  r,   r,   r-   Úsendmsg£  s    ÿzSSLSocket.sendmsgc              
      s–   |   ¡  | jd k	r„|dkr(td| j ƒ‚d}t|ƒ�H}| d¡�2}t|ƒ}||k rn|  ||d … ¡}||7 }qJW 5 Q R X W 5 Q R X ntƒ  	||¡S d S )Nr   z6non-zero flags not allowed in calls to sendall() on %sÚB)
rS  r  rŽ   r²   Ú
memoryviewÚcastr˜   rV  r¬   Úsendall)r¿   rÿ   r  r„   ZviewZ	byte_viewZamountr&  r±   r,   r-   r]  ©  s    
ÿÿ zSSLSocket.sendallc                    s,   | j d k	r|  |||¡S tƒ  |||¡S d S r’   )r  Z_sendfile_use_sendr¬   Úsendfile)r¿   ÚfileÚoffsetr„   r±   r,   r-   r^  ¹  s    
zSSLSocket.sendfilec                    sD   |   ¡  | jd k	r2|dkr(td| j ƒ‚|  |¡S tƒ  ||¡S d S )Nr   z3non-zero flags not allowed in calls to recv() on %s)rS  r  rŽ   r²   r$  r¬   Úrecv©r¿   Zbuflenr  r±   r,   r-   ra  Ã  s    
ÿÿ
zSSLSocket.recvc                    sj   |   ¡  |r|d krt|ƒ}n|d kr*d}| jd k	rV|dkrJtd| j ƒ‚|  ||¡S tƒ  |||¡S d S )Nr#  r   z8non-zero flags not allowed in calls to recv_into() on %s)rS  r˜   r  rŽ   r²   r$  r¬   Ú	recv_into©r¿   r%  Únbytesr  r±   r,   r-   rc  Î  s    

ÿÿzSSLSocket.recv_intoc                    s4   |   ¡  | jd k	r"td| j ƒ‚ntƒ  ||¡S d S )Nz'recvfrom not allowed on instances of %s)rS  r  rŽ   r²   r¬   Úrecvfromrb  r±   r,   r-   rf  Ý  s    
ÿzSSLSocket.recvfromc                    s6   |   ¡  | jd k	r"td| j ƒ‚ntƒ  |||¡S d S )Nz,recvfrom_into not allowed on instances of %s)rS  r  rŽ   r²   r¬   Úrecvfrom_intord  r±   r,   r-   rg  å  s    
ÿzSSLSocket.recvfrom_intoc                 O   s   t d| j ƒ‚d S )Nz&recvmsg not allowed on instances of %srX  r  r,   r,   r-   Úrecvmsgí  s    ÿzSSLSocket.recvmsgc                 O   s   t d| j ƒ‚d S )Nz+recvmsg_into not allowed on instances of %srX  r  r,   r,   r-   Úrecvmsg_intoñ  s    ÿzSSLSocket.recvmsg_intoc                 C   s$   |   ¡  | jd k	r| j ¡ S dS d S )Nr   )rS  r  r0  rñ   r,   r,   r-   r0  õ  s    

zSSLSocket.pendingc                    s   |   ¡  d | _tƒ  |¡ d S r’   )rS  r  r¬   r2  )r¿   Zhowr±   r,   r-   r2  ý  s    zSSLSocket.shutdownc                 C   s.   | j r| j  ¡ }d | _ |S tdt| ƒ ƒ‚d S ©NzNo SSL wrapper around )r  r2  rŽ   rÂ   )r¿   Úsr,   r,   r-   r3    s
    
zSSLSocket.unwrapc                 C   s$   | j r| j  ¡ S tdt| ƒ ƒ‚d S rj  )r  r7  rŽ   rÂ   rñ   r,   r,   r-   r7    s    
z&SSLSocket.verify_client_post_handshakec                    s   d | _ tƒ  ¡  d S r’   )r  r¬   Ú_real_closerñ   r±   r,   r-   rl    s    zSSLSocket._real_closec              	   C   sF   |   ¡  |  ¡ }z$|dkr(|r(|  d ¡ | j ¡  W 5 |  |¡ X d S )NrB  )rT  rF  rE  r  r1  )r¿   ÚblockrP  r,   r,   r-   r1    s    
zSSLSocket.do_handshakec              	      s¨   | j rtdƒ‚| js| jd k	r&tdƒ‚| jj| d| j| | jd�| _z@|rVtƒ  	|¡}nd }tƒ  
|¡ |s~d| _| jr~|  ¡  |W 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!FrA  T)rÇ   rŽ   rL  r  rË   rM  rÊ   rI  r¬   Ú
connect_exÚconnectrÈ   r1  r�   )r¿   r�   rn  Zrcr±   r,   r-   Ú_real_connect!  s0       þzSSLSocket._real_connectc                 C   s   |   |d¡ d S )NF©rp  ©r¿   r�   r,   r,   r-   ro  ;  s    zSSLSocket.connectc                 C   s   |   |d¡S rø   rq  rr  r,   r,   r-   rn  @  s    zSSLSocket.connect_exc                    s.   t ƒ  ¡ \}}| jj|| j| jdd�}||fS )NT)rÈ   rÉ   rÇ   )r¬   ÚacceptrË   rÏ   rÈ   rÉ   )r¿   Znewsockr�   r±   r,   r-   rs  E  s    ýzSSLSocket.acceptr€   c                 C   s4   | j d k	r| j  |¡S |tkr,td |¡ƒ‚d S d S )Nz({0} channel binding type not implemented)r  r4  ÚCHANNEL_BINDING_TYPESrŽ   r‡   r5  r,   r,   r-   r4  Q  s    
ÿzSSLSocket.get_channel_bindingc                 C   s   | j d k	r| j  ¡ S d S d S r’   r6  rñ   r,   r,   r-   rþ   \  s    

zSSLSocket.version)FTTNNN)N)r#  N)F)r   )N)r   )r   N)r#  r   )Nr   )r#  r   )Nr   )F)r€   )/r8   r9   r:   r  r·   rÎ   r  r;  rË   r  rÌ   r"  rQ  rS  rT  r$  r'  r)  r+  r,  r-  r.  r/  rV  rW  rY  r]  r^  ra  rc  rf  rg  rh  ri  r0  r2  r3  r7  rl  r1  rp  ro  rn  rs  r4  rþ   r¸   r,   r,   r±   r-   r<  Ë  s†          þ>



	











r<  Tc
                 C   sl   |r|st dƒ‚|r |s t dƒ‚t|ƒ}
||
_|r<|
 |¡ |rL|
 ||¡ |	rZ|
 |	¡ |
j| |||d�S )Nz5certfile must be specified for server-side operationsr  )rÆ   rÇ   rÈ   rÉ   )rŽ   r»   r  rç   r  Zset_ciphersrÏ   )rÆ   r  r  rÇ   r  Ússl_versionÚca_certsrÈ   rÉ   ZciphersrË   r,   r,   r-   rÏ   i  s$    

 ýrÏ   c                 C   s–   ddl m} ddlm} d}d}z| | d d…  ¡ ¡d }W n$ tk
rb   td| |f ƒ‚Y n0X || dd … |ƒ}||d |f|d	d
…  ƒS d S )Nr   )Ústrptime)Útimegm)ZJanZFebZMarZAprZMayZJunZJulZAugZSepZOctZNovZDecz %d %H:%M:%S %Y GMTri   rg   z*time data %r does not match format "%%b%s"rh   rl   )Útimerw  Zcalendarrx  ÚindexÚtitlerŽ   )Z	cert_timerw  rx  ZmonthsZtime_formatZmonth_numberZttr,   r,   r-   Úcert_time_to_seconds…  s    
ÿr|  z-----BEGIN CERTIFICATE-----z-----END CERTIFICATE-----c                    sR   t t | ¡ddƒ‰ tg}|‡ fdd„tdtˆ ƒdƒD ƒ7 }| td ¡ d |¡S )NÚASCIIÚstrictc                    s   g | ]}ˆ ||d  … ‘qS )é@   r,   )r4   Úi©Úfr,   r-   Ú
<listcomp>¬  s     z(DER_cert_to_PEM_cert.<locals>.<listcomp>r   r  Ú
)	rÂ   Úbase64Zstandard_b64encodeÚ
PEM_HEADERÚranger˜   r—   Ú
PEM_FOOTERr™   )Zder_cert_bytesZssr,   r�  r-   ÚDER_cert_to_PEM_cert¦  s
    "r‰  c                 C   s\   |   t¡stdt ƒ‚|  ¡  t¡s0tdt ƒ‚|  ¡ ttƒttƒ … }t | 	dd¡¡S )Nz(Invalid PEM encoding; must start with %sz&Invalid PEM encoding; must end with %sr}  r~  )
r)   r†  rŽ   ÚstripÚendswithrˆ  r˜   r…  ZdecodebytesrÃ   )Zpem_cert_stringÚdr,   r,   r-   ÚPEM_cert_to_DER_cert°  s    
ÿÿr�  c           
   
   C   sd   | \}}|d k	rt }nt}t|||d�}t| ƒ�&}| |¡�}| d¡}	W 5 Q R X W 5 Q R X t|	ƒS )N)r  r¨   T)r
  r  Ú_create_stdlib_contextr}   rÏ   r)  r‰  )
r�   ru  rv  ZhostZ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‘  )mrì   r¢   Úcollectionsr   Úenumr   Z_Enumr   Z_IntEnumr   Z_IntFlagr;   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r®   r   r³   r   r   r   r   r   ÚImportErrorr   r   r   r   r   r   r    r!   r"   r#   r$   r%   Ú	_convert_r8   r&   r  r'   Ú__members__Úitemsr�  r8  Z_SSLv2_IF_EXISTSr7   r=   rG   rf   rí   rx   ry   rz   r{   r|   r}   r~   r   rŒ   r…  rK  rå   r�   Zsocket_errorrt  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;  r<  rÍ   rÐ   rÏ   r|  r†  rˆ  r‰  r�  r�  r‘  r,   r,   r,   r-   Ú<module>]   sö   $0 ý ý ý ý ý ý
)
1#9ÿ z ÿ#    ý/      û

