grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026 й¼]p¥ã#@s‰ddlZddlZddlZddlZddlZddlmZddlmZ m Z ddl Z ddl m Z mZmZddl mZmZddl mZmZmZmZmZmZddl mZmZmZddl mZmZdd l mZm Z m!Z!m"Z"ydd l m#Z#Wne$k rJYnXd d „Z%e%d ƒe%dƒe%dƒe%dƒddl m&Z&m'Z'm(Z(m)Z)ddl m*Z*e j+de,dd„de ƒe-j.Z/e-_/dd„e-j0j1ƒDƒZ2y e3Z4Wne5k r dZ4YnXej6dkrFddl m7Z7m8Z8ddl9m9Z9m:Z:m;Z;m<Z<ddl9m=Z=m>Z>ddl?Z?ddl@Z@ddlAZAeBZCe jDr½dgZEngZEdZFdZGGd d!„d!eHƒZId"d#d$„ZJd%d&„ZKd'd(„ZLed)d*ƒZMd+d,„ZNGd-d.„d.ed.d/ƒƒZOGd0d1„d1eOe ƒZPGd2d3„d3eƒZQePjRd4dd5dd6dd7d8„ZSe.d9dd:d;d<ePjRd=dd>dd4dd5dd6dd?d@„ZTeSZUeTZVGdAdB„dBƒZWGdCdD„dDe9ƒZXddd;ee.ddEdEddFdG„ ZYdHdI„ZZdJZ[dKZ\dLdM„Z]dNdO„Z^e.ddPdQ„Z_dRdS„Z`dS)TéN)Ú namedtuple)ÚEnumÚIntEnum)ÚOPENSSL_VERSION_NUMBERÚOPENSSL_VERSION_INFOÚOPENSSL_VERSION)Ú _SSLContextÚ MemoryBIO)ÚSSLErrorÚSSLZeroReturnErrorÚSSLWantReadErrorÚSSLWantWriteErrorÚSSLSyscallErrorÚ SSLEOFError)Ú CERT_NONEÚ CERT_OPTIONALÚ CERT_REQUIRED)Útxt2objÚnid2obj)Ú RAND_statusÚRAND_addÚ RAND_bytesÚRAND_pseudo_bytes)ÚRAND_egdcCs@x9ttƒD]+}|j|ƒr tt|ƒtƒ|„sr,ÚsourcecCsi|]\}}||“qSr!r!)Ú.0r+Úvaluer!r!r"ú ˆs r0Úwin32)Úenum_certificatesÚ enum_crls)ÚsocketÚAF_INETÚ SOCK_STREAMÚcreate_connection)Ú SOL_SOCKETÚSO_TYPEz tls-uniquezŸ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:!3DESz©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@seZdZdS)ÚCertificateErrorN)Ú__name__Ú __module__Ú __qualname__r!r!r!r"r:Çs r:éc CsAg}|sdS|jdƒ^}}|jdƒ}||krVtdt|ƒƒ‚|sr|jƒ|jƒkS|dkrŽ|jdƒnY|jdƒs¬|jdƒrÅ|jtj|ƒƒn"|jtj|ƒj ddƒƒx$|D]}|jtj|ƒƒqîWtj d d j |ƒd tj ƒ}|j |ƒS) NFÚ.Ú*z,too many wildcards in certificate DNS name: z[^.]+zxn--z\*z[^.]*z\Az\.z\Z)ÚsplitÚcountr:ÚreprÚlowerÚappendrÚreÚescapeÚreplaceÚcompileÚjoinÚ IGNORECASEÚmatch) ZdnÚhostnameZ max_wildcardsZpatsZleftmostZ remainderZ wildcardsZfragÚpatr!r!r"Ú_dnsname_matchËs&  " &rOcCstj|jƒƒ}||kS)N)Ú ipaddressÚ ip_addressÚrstrip)ZipnameÚhost_ipZipr!r!r"Ú_ipaddress_matchüsrTcCsÄ|stdƒ‚ytj|ƒ}Wntk r?d}YnXg}|jdfƒ}x‡|D]\}}|dkr¦|dkr–t||ƒr–dS|j|ƒq_|dkr_|dk rÑt||ƒrÑdS|j|ƒq_W|sHx]|jdfƒD]I}x@|D]8\}}|dkrt||ƒr3dS|j|ƒqWqûWt|ƒdkr…td|d j t t |ƒƒfƒ‚n;t|ƒdkr´td ||d fƒ‚n td ƒ‚dS) Nztempty or no certificate, match_hostname needs a SSL socket or SSL context with either CERT_OPTIONAL or CERT_REQUIREDZsubjectAltNameZDNSz IP AddressZsubjectZ commonNamer>z&hostname %r doesn't match either of %sz, zhostname %r doesn't match %rrz=no appropriate commonName or subjectAltName fields were found) Ú ValueErrorrPrQÚgetrOrErTÚlenr:rJÚmaprC)ÚcertrMrSZdnsnamesZsanÚkeyr/Úsubr!r!r"Úmatch_hostnames>      %r\ÚDefaultVerifyPathszQcafile capath openssl_cafile_env openssl_cafile openssl_capath_env openssl_capathcCs†tjƒ}tjj|d|dƒ}tjj|d|dƒ}ttjj|ƒra|ndtjj|ƒr||nd|ŒS)Nrr>éé) rÚget_default_verify_pathsÚosÚenvironrVr]ÚpathÚisfileÚisdir)ÚpartsÚcafileÚcapathr!r!r"r`?s  r`csXeZdZfZ‡fdd†Ze‡fdd†ƒZe‡fdd†ƒZ‡S)Ú _ASN1Objectcstƒj|t|ddƒŒS)Nr+F)ÚsuperÚ__new__Ú_txt2obj)ÚclsÚoid)Ú __class__r!r"rkRsz_ASN1Object.__new__cstƒj|t|ƒŒS)N)rjrkÚ_nid2obj)rmZnid)ror!r"ÚfromnidUsz_ASN1Object.fromnidcstƒj|t|ddƒŒS)Nr+T)rjrkrl)rmr+)ror!r"Úfromname[sz_ASN1Object.fromname)r;r<r=Ú __slots__rkÚ classmethodrqrrr!r!)ror"riMs riznid shortname longname oidc@seZdZdZdZdS)ÚPurposez1.3.6.1.5.5.7.3.1z1.3.6.1.5.5.7.3.2N)r;r<r=Ú SERVER_AUTHÚ CLIENT_AUTHr!r!r!r"rubs ruc@sšeZdZdZdZedd„Zedd„Zd d d d d d „Zd d dd„Z dd„Z dd„Z dd„Z e jdd„Zd S)Ú SSLContextÚprotocolÚ __weakref__ÚCAÚROOTcOs/tj||ƒ}|tkr+|jtƒ|S)N)rrkÚ_SSLv2_IF_EXISTSÚ set_ciphersÚ_DEFAULT_CIPHERS)rmryÚargsÚkwargsÚselfr!r!r"rkps  zSSLContext.__new__cCs ||_dS)N)ry)r‚ryr!r!r"Ú__init__vszSSLContext.__init__FTNc Cs+td|d|d|d|d|d|ƒS)NÚsockÚ server_sideÚdo_handshake_on_connectÚsuppress_ragged_eofsÚserver_hostnameÚ_context)Ú SSLSocket)r‚r„r…r†r‡rˆr!r!r"Ú wrap_socketys zSSLContext.wrap_socketcCs(|j||d|d|ƒ}t|ƒS)Nr…rˆ)Z _wrap_bioÚ SSLObject)r‚ZincomingZoutgoingr…rˆÚsslobjr!r!r"Úwrap_bioƒs zSSLContext.wrap_biocCsŠtƒ}xm|D]e}t|dƒ}t|ƒdksIt|ƒdkrUtdƒ‚|jt|ƒƒ|j|ƒqW|j|ƒdS)NÚasciiréÿz(NPN protocols must be 1 to 255 in length)Ú bytearrayÚbytesrWr rEÚextendZ_set_npn_protocols)r‚Ú npn_protocolsÚprotosryÚbr!r!r"Úset_npn_protocols‰s  $ zSSLContext.set_npn_protocolscCsŠtƒ}xm|D]e}t|dƒ}t|ƒdksIt|ƒdkrUtdƒ‚|jt|ƒƒ|j|ƒqW|j|ƒdS)Nr�rr�z)ALPN protocols must be 1 to 255 in length)r‘r’rWr rEr“Z_set_alpn_protocols)r‚Zalpn_protocolsr•ryr–r!r!r"Úset_alpn_protocols”s  $ zSSLContext.set_alpn_protocolsc Cs�tƒ}yXxQt|ƒD]C\}}}|dkr|dksO|j|kr|j|ƒqWWntk r‚tjdƒYnX|r™|jd|ƒ|S)NZx509_asnTz-unable to enumerate Windows certificate storeÚcadata)r‘r2rnr“ÚPermissionErrorÚwarningsÚwarnÚload_verify_locations)r‚Ú storenameÚpurposeZcertsrYÚencodingZtrustr!r!r"Ú_load_windows_store_certsŸs   z$SSLContext._load_windows_store_certscCs\t|tƒst|ƒ‚tjdkrNx!|jD]}|j||ƒq4W|jƒdS)Nr1)Ú isinstanceriÚ TypeErrorÚsysÚplatformÚ_windows_cert_storesr¡Zset_default_verify_paths)r‚rŸržr!r!r"Úload_default_certs­s  zSSLContext.load_default_certs)ryrz)r{r|)r;r<r=rsr¦Ú PROTOCOL_TLSrkrƒr‹rŽr—r˜r¡rurvr§r!r!r!r"rxis  rxrgrhr™cCs9t|tƒst|ƒ‚ttƒ}|jtO_|jtO_|jtt ddƒO_|t j kr„t |_ d|_nm|t jkrñ|jtt ddƒO_|jtt ddƒO_|jtt ddƒO_|jtƒ|s|s|r|j|||ƒn|j tkr5|j|ƒ|S)NZOP_NO_COMPRESSIONrTZOP_CIPHER_SERVER_PREFERENCEZOP_SINGLE_DH_USEZOP_SINGLE_ECDH_USE)r¢rir£rxr¨ÚoptionsÚ OP_NO_SSLv2Ú OP_NO_SSLv3rrrurvrÚ verify_modeÚcheck_hostnamerwr~Ú_RESTRICTED_SERVER_CIPHERSr�rr§)rŸrgrhr™Úcontextr!r!r"Úcreate_default_context¶s&      r°Ú cert_reqsr­FrŸÚcertfileÚkeyfilec Csàt|tƒst|ƒ‚t|ƒ} | jtO_| jtO_|dk rZ|| _|| _|r|| r|t dƒ‚|sˆ|r˜| j ||ƒ|sª|sª|rÀ| j |||ƒn| jt krÜ| j |ƒ| S)Nzcertfile must be specified)r¢rir£rxr©rªr«r¬r­rUÚload_cert_chainr�rr§) ryr±r­rŸr²r³rgrhr™r¯r!r!r"Ú_create_unverified_contextæs"          rµc@seZdZddd„Zedd„ƒZejdd„ƒZedd„ƒZed d „ƒZd dd d „Z dd„Z ddd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$d%„Zd&d'„ZdS)(rŒNcCs||_|p||j_dS)N)Ú_sslobjÚowner)r‚r�r·r!r!r"rƒ's zSSLObject.__init__cCs |jjS)N)r¶r¯)r‚r!r!r"r¯,szSSLObject.contextcCs||j_dS)N)r¶r¯)r‚Úctxr!r!r"r¯1scCs |jjS)N)r¶r…)r‚r!r!r"r…5szSSLObject.server_sidecCs |jjS)N)r¶rˆ)r‚r!r!r"rˆ:szSSLObject.server_hostnameicCs:|dk r$|jj||ƒ}n|jj|ƒ}|S)N)r¶Úread)r‚rWÚbufferÚvr!r!r"r¹@s zSSLObject.readcCs|jj|ƒS)N)r¶Úwrite)r‚Údatar!r!r"r¼LszSSLObject.writeFcCs|jj|ƒS)N)r¶Zpeer_certificate)r‚Ú binary_formr!r!r"Ú getpeercertTszSSLObject.getpeercertcCstjr|jjƒSdS)N)rr&r¶Úselected_npn_protocol)r‚r!r!r"rÀ]s zSSLObject.selected_npn_protocolcCstjr|jjƒSdS)N)rr'r¶Úselected_alpn_protocol)r‚r!r!r"rÁds z SSLObject.selected_alpn_protocolcCs |jjƒS)N)r¶Úcipher)r‚r!r!r"rÂkszSSLObject.ciphercCs |jjƒS)N)r¶Úshared_ciphers)r‚r!r!r"rÃpszSSLObject.shared_cipherscCs |jjƒS)N)r¶Ú compression)r‚r!r!r"rÄvszSSLObject.compressioncCs |jjƒS)N)r¶Úpending)r‚r!r!r"rÅ{szSSLObject.pendingcCsH|jjƒ|jjrD|js.tdƒ‚t|jƒ|jƒdS)Nz-check_hostname needs server_hostname argument)r¶Ú do_handshaker¯r­rˆrUr\r¿)r‚r!r!r"rÆs     zSSLObject.do_handshakecCs |jjƒS)N)r¶Úshutdown)r‚r!r!r"ÚunwrapˆszSSLObject.unwrapz tls-uniquecCsF|tkrtdƒ‚|dkr9tdj|ƒƒ‚|jjƒS)Nz Unsupported channel binding typez tls-uniquez({0} channel binding type not implemented)ÚCHANNEL_BINDING_TYPESrUÚNotImplementedErrorÚformatr¶Z tls_unique_cb)r‚Úcb_typer!r!r"Úget_channel_bindingŒs    zSSLObject.get_channel_bindingcCs |jjƒS)N)r¶Úversion)r‚r!r!r"rΘszSSLObject.version)r;r<r=rƒÚpropertyr¯Úsetterr…rˆr¹r¼r¿rÀrÁrÂrÃrÄrÅrÆrÈrÍrÎr!r!r!r"rŒs$          rŒcsAeZdZddddeeddeeddddddddd„Zedd„ƒZ e j d d„ƒZ d d „Z dd d „Z dd„Z dddd„Zdd„Zddd„Zdd„Zdd„Zdd„Zdd„Zdd „Zdd!d"„Zdd#d$„Zd%d&„Zdd'd(„Zdd‡fd)d*†Zddd+d,„Zddd-d.„Zddd/d0„Zddd1d2„Zd3d4„Zd5d6„Z d7d8„Z!d9d:„Z"d;d<„Z#d=d>„Z$dd?d@„Z%dAdB„Z&dCdD„Z'dEdF„Z(dGdH„Z)dIdJdK„Z*dLdM„Z+‡S)NrŠNFTrcCs,|r||_nñ|r+| r+tdƒ‚|rD| rDtdƒ‚|rW| rW|}t|ƒ|_||j_|rˆ|jj|ƒ|r¡|jj||ƒ|r·|jj|ƒ|rÍ|jj|ƒ||_||_ ||_ ||_ ||_ ||_ |jttƒtkr'tdƒ‚|r?|r?tdƒ‚|jjr^| r^tdƒ‚||_||_||_| |_|dk râtj|d|jd|jd|jd |jƒƒ|j|jƒƒ|j ƒnA| dk rtj|d | ƒntj|d| d| d| ƒy|j!ƒWn@t"k rs}z |j#t#j$kr[‚d }WYdd}~XnXd }d |_%d|_&||_'|r(ye|jj(|||ƒ}t)|d |ƒ|_&|rÿ|jƒ}|d krõtdƒ‚|j*ƒWn%t"tfk r'|j+ƒ‚YnXdS)Nz5certfile must be specified for server-side operationszcertfile must be specifiedz!only stream sockets are supportedz4server_hostname can only be specified in client modez'check_hostname requires server_hostnameÚfamilyÚtypeÚprotoÚfilenoFTr·gzHdo_handshake_on_connect should not be specified for non-blocking sockets),r‰rUrxr¬r�r´r—r~r³r²r±Ú ssl_versionÚca_certsÚciphersÚ getsockoptr8r9r6rÊr­r…rˆr†r‡r4rƒrÑrÒrÓrÔÚ settimeoutÚ gettimeoutÚdetachÚ getpeernameÚOSErrorÚerrnoZENOTCONNÚ_closedr¶Ú _connectedÚ _wrap_socketrŒrÆÚclose)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ˆ                                      zSSLSocket.__init__cCs|jS)N)r‰)r‚r!r!r"r¯þszSSLSocket.contextcCs||_||j_dS)N)r‰r¶r¯)r‚r¸r!r!r"r¯s cCstd|jjƒ‚dS)NzCan't dup() %s instances)ÚNotImplementedror;)r‚r!r!r"Údupsz SSLSocket.dupcCsdS)Nr!)r‚Úmsgr!r!r"Ú _checkClosed szSSLSocket._checkClosedcCs|js|jƒdS)N)ràrÜ)r‚r!r!r"Ú_check_connecteds zSSLSocket._check_connectedicCs˜|jƒ|jstdƒ‚y|jj||ƒSWn[tk r“}z;|jdtkr~|jr~|dk rwdSdSn‚WYdd}~XnXdS)Nz'Read on closed or unwrapped SSL socket.ró)rèr¶rUr¹r r€Z SSL_ERROR_EOFr‡)r‚rWrºÚxr!r!r"r¹s    zSSLSocket.readcCs/|jƒ|jstdƒ‚|jj|ƒS)Nz(Write on closed or unwrapped SSL socket.)rèr¶rUr¼)r‚r½r!r!r"r¼)s   zSSLSocket.writecCs$|jƒ|jƒ|jj|ƒS)N)rèrér¶r¿)r‚r¾r!r!r"r¿2s  zSSLSocket.getpeercertcCs3|jƒ|j stj r"dS|jjƒSdS)N)rèr¶rr&rÀ)r‚r!r!r"rÀ<s zSSLSocket.selected_npn_protocolcCs3|jƒ|j stj r"dS|jjƒSdS)N)rèr¶rr'rÁ)r‚r!r!r"rÁCs z SSLSocket.selected_alpn_protocolcCs(|jƒ|jsdS|jjƒSdS)N)rèr¶rÂ)r‚r!r!r"rÂJs  zSSLSocket.ciphercCs$|jƒ|jsdS|jjƒS)N)rèr¶rÃ)r‚r!r!r"rÃQs  zSSLSocket.shared_cipherscCs(|jƒ|jsdS|jjƒSdS)N)rèr¶rÄ)r‚r!r!r"rÄWs  zSSLSocket.compressioncCsY|jƒ|jrB|dkr2td|jƒ‚|jj|ƒStj|||ƒSdS)Nrz3non-zero flags not allowed in calls to send() on %s)rèr¶rUror¼r4Úsend)r‚r½Úflagsr!r!r"rì^s    zSSLSocket.sendcCsb|jƒ|jr)td|jƒ‚n5|dkrHtj|||ƒStj||||ƒSdS)Nz%sendto not allowed on instances of %s)rèr¶rUror4Úsendto)r‚r½Z flags_or_addrÚaddrr!r!r"rîis   zSSLSocket.sendtocOstd|jƒ‚dS)Nz&sendmsg not allowed on instances of %s)rÊro)r‚r€r�r!r!r"ÚsendmsgsszSSLSocket.sendmsgcCs•|jƒ|jr~|dkr2td|jƒ‚t|ƒ}d}x3||kry|j||d…ƒ}||7}qGW|Stj|||ƒSdS)Nrz6non-zero flags not allowed in calls to sendall() on %s)rèr¶rUrorWrìr4Úsendall)r‚r½ríÚamountrBr»r!r!r"rñys     zSSLSocket.sendallcs<|jdkr%tƒj|||ƒS|j|||ƒSdS)N)r¶rjÚsendfileÚ_sendfile_use_send)r‚ÚfileÚoffsetrB)ror!r"ró‰szSSLSocket.sendfilecCsV|jƒ|jr?|dkr2td|jƒ‚|j|ƒStj|||ƒSdS)Nrz3non-zero flags not allowed in calls to recv() on %s)rèr¶rUror¹r4Úrecv)r‚Úbuflenrír!r!r"r÷“s     zSSLSocket.recvcCs�|jƒ|r+|dkr+t|ƒ}n|dkr=d}|jru|dkretd|jƒ‚|j||ƒStj||||ƒSdS)Nirz8non-zero flags not allowed in calls to recv_into() on %s)rèrWr¶rUror¹r4Ú recv_into)r‚rºÚnbytesrír!r!r"rùžs     zSSLSocket.recv_intocCs@|jƒ|jr)td|jƒ‚ntj|||ƒSdS)Nz'recvfrom not allowed on instances of %s)rèr¶rUror4Úrecvfrom)r‚rørír!r!r"rû­s   zSSLSocket.recvfromcCsC|jƒ|jr)td|jƒ‚ntj||||ƒSdS)Nz,recvfrom_into not allowed on instances of %s)rèr¶rUror4Ú recvfrom_into)r‚rºrúrír!r!r"rüµs   zSSLSocket.recvfrom_intocOstd|jƒ‚dS)Nz&recvmsg not allowed on instances of %s)rÊro)r‚r€r�r!r!r"Úrecvmsg½szSSLSocket.recvmsgcOstd|jƒ‚dS)Nz+recvmsg_into not allowed on instances of %s)rÊro)r‚r€r�r!r!r"Ú recvmsg_intoÁszSSLSocket.recvmsg_intocCs(|jƒ|jr |jjƒSdSdS)Nr)rèr¶rÅ)r‚r!r!r"rÅÅs   zSSLSocket.pendingcCs'|jƒd|_tj||ƒdS)N)rèr¶r4rÇ)r‚Úhowr!r!r"rÇÌs  zSSLSocket.shutdowncCs?|jr%|jjƒ}d|_|Stdt|ƒƒ‚dS)NzNo SSL wrapper around )r¶rÈrUÚstr)r‚Úsr!r!r"rÈÑs   zSSLSocket.unwrapcCsd|_tj|ƒdS)N)r¶r4Ú _real_close)r‚r!r!r"rÙs zSSLSocket._real_closec Cs[|jƒ|jƒ}z0|dkr8|r8|jdƒ|jjƒWd|j|ƒXdS)Ng)rérÚrÙr¶rÆ)r‚Úblockrär!r!r"rÆÝs   zSSLSocket.do_handshakec Csà|jrtdƒ‚|jr*tdƒ‚|jj|d|jƒ}t|d|ƒ|_y[|rxtj ||ƒ}nd}tj ||ƒ|s°d|_|j r°|j ƒ|SWn$t tfk rÛd|_‚YnXdS)Nz!can't connect in server-side modez/attempt to connect already-connected SSLSocket!Fr·T)r…rUràr¯rárˆrŒr¶r4Ú connect_exÚconnectr†rÆrÝ)r‚rïrr�Úrcr!r!r"Ú _real_connectès&        zSSLSocket._real_connectcCs|j|dƒdS)NF)r)r‚rïr!r!r"rszSSLSocket.connectcCs|j|dƒS)NT)r)r‚rïr!r!r"rszSSLSocket.connect_excCsItj|ƒ\}}|jj|d|jd|jddƒ}||fS)Nr†r‡r…T)r4Úacceptr¯r‹r†r‡)r‚Znewsockrïr!r!r"r s    zSSLSocket.acceptz tls-uniquecCs#|jdkrdS|jj|ƒS)N)r¶rÍ)r‚rÌr!r!r"rÍszSSLSocket.get_channel_bindingcCs |jdkrdS|jjƒS)N)r¶rÎ)r‚r!r!r"rÎszSSLSocket.version),r;r<r=rr¨r5r6rƒ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ÆrrrrrÍrÎr!r!)ror"rŠžsV    T                       rŠTc CsCtd|d|d|d|d|d|d|d|d |d | ƒ S) Nr„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 Cs½ddlm}ddlm}d}d}y'|j|dd…jƒƒd}Wn(tk r}td||fƒ‚Yn<X||dd…|ƒ}||d|f|dd…ƒSdS)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"r^é) r r r rrrrrrrrr)Útimer Zcalendarr ÚindexÚtitlerU)Z cert_timer r ZmonthsZ time_formatZ month_numberÚttr!r!r"Úcert_time_to_seconds9s ' rz-----BEGIN CERTIFICATE-----z-----END CERTIFICATE-----cCs?ttj|ƒddƒ}tdtj|dƒdtdS)NÚASCIIÚstrictÚ é@)rÚbase64Zstandard_b64encodeÚ PEM_HEADERÚtextwrapÚfillÚ PEM_FOOTER)Zder_cert_bytesÚfr!r!r"ÚDER_cert_to_PEM_certZsr'cCs€|jtƒstdtƒ‚|jƒjtƒsDtdtƒ‚|jƒttƒttƒ …}tj|j ddƒƒS)Nz(Invalid PEM encoding; must start with %sz&Invalid PEM encoding; must end with %srr) rr"rUÚstripÚendswithr%rWr!Z decodebytesÚencode)Zpem_cert_stringÚdr!r!r"ÚPEM_cert_to_DER_certcs  #r,c Cs‡|\}}|dk r!t}nt}t|d|d|ƒ}t|ƒ�/}|j|ƒ�}|jdƒ} WdQRXWdQRXt| ƒS)Nr±rgT)rrÚ_create_stdlib_contextr7r‹r¿r') rïrÕrÖÚhostÚportr±r¯r„ZsslsockZdercertr!r!r"Úget_server_certificateps     r0cCstj|dƒS)Nz )Ú_PROTOCOL_NAMESrV)Z protocol_coder!r!r"Úget_protocol_nameƒsr2)arPr#rFr¤raÚ collectionsrÚenumrZ_EnumrÚ_IntEnumrrrrrr r r r r rrrrrrrlrrprrrrrÚ ImportErrorr#r$r%r&r'r(Ú_convertr;r)r¨r*Ú __members__Úitemsr1ZPROTOCOL_SSLv2r}Ú NameErrorr¥r2r3r4r5r6r7r8r9r!rÞr›rÝZ socket_errorZHAS_TLS_UNIQUErÉrr®rUr:rOrTr\r]r`rirurxrvr°rµZ_create_default_https_contextr-rŒrŠr‹rr"r%r'r,r0r2r!r!r!r"Ú[s¢      ."      "    "     1 4  M/  '‡ÿŒ