grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026B U&œ2²�›>ã @sŠdZddlZddlZddlmZddlmZmZ m Z ddl Z ddl m Z mZmZddl mZmZmZddl mZmZmZmZmZmZmZddl mZmZdd l mZmZm Z m!Z!ydd l m"Z"Wne#k rÔYnXdd l m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-dd l m.Z.m/Z/e j0d e1dd„e d�e j0de1dd„e d�e j0de1dd„e d�e j0de1dd„e d�e j0de1dd„e d�e j0de1dd„e d�e2j3Z4e2_4dd„e2j5 6¡DƒZ7e8e2ddƒZ9Gdd„de ƒZ:ej;d k�ròdd!l mm>Z>m?Z?m@Z@mAZAdd#l>mBZBmCZCddl>ZDddlEZEddlFZFddlGZGeHZId$gZJeKe d%ƒZLe.ZMeZNd&d'„ZOd(d)„ZPd*d+„ZQd,d-„ZRed.d/ƒZSd0d1„ZTGd2d3„d3ed3d4ƒƒZUGd5d6„d6eUeƒZVGd7d8„d8eƒZWeVjXfdddd9œd:d;„ZYe3feZdd?„Z[eYZ\e[Z]Gd@dA„dAƒZ^dBdC„Z_GdDdE„dEe>ƒZ`e`eW_ae^eW_bddd|ór,)ÚsourceÚOptionscCs | d¡S)NZOP_)r()r)r*r*r+r,�r-ZAlertDescriptioncCs | d¡S)NZALERT_DESCRIPTION_)r()r)r*r*r+r,†r-ZSSLErrorNumbercCs | d¡S)NZ SSL_ERROR_)r()r)r*r*r+r,‹r-Ú VerifyFlagscCs | d¡S)NZVERIFY_)r()r)r*r*r+r,�r-Ú VerifyModecCs | d¡S)NZCERT_)r()r)r*r*r+r,•r-cCsi|]\}}||“qSr*r*)Ú.0r)Úvaluer*r*r+ú ™sr4ZPROTOCOL_SSLv2c@s6eZdZejZejZejZ ej Z ej Z ejZejZdS)Ú TLSVersionN)Ú__name__Ú __module__Ú __qualname__Ú_sslZPROTO_MINIMUM_SUPPORTEDZMINIMUM_SUPPORTEDZ PROTO_SSLv3ÚSSLv3Z PROTO_TLSv1ZTLSv1Z PROTO_TLSv1_1ZTLSv1_1Z PROTO_TLSv1_2ZTLSv1_2Z PROTO_TLSv1_3ZTLSv1_3ZPROTO_MAXIMUM_SUPPORTEDZMAXIMUM_SUPPORTEDr*r*r*r+r5žsr5Úwin32)Úenum_certificatesÚ enum_crls)ÚsocketÚAF_INETÚ SOCK_STREAMÚcreate_connection)Ú SOL_SOCKETÚSO_TYPEz tls-uniqueÚHOSTFLAG_NEVER_CHECK_SUBJECTcCs¶|sdS| d¡}|s&| ¡| ¡kS|dkrsole wildcard without additional labels are not support: {!r}.z      rbÚDefaultVerifyPathszQcafile capath openssl_cafile_env openssl_cafile openssl_capath_env openssl_capathcCsdt ¡}tj |d|d¡}tj |d|d¡}ttj |¡rF|ndtj |¡rX|ndf|žŽS)z/Return paths to default cafile and capath. rrFééN) r9Úget_default_verify_pathsÚosÚenvironrYrcÚpathÚisfileÚisdir)ÚpartsÚcafileÚcapathr*r*r+rf\s rfcsDeZdZdZdZ‡fdd„Ze‡fdd„ƒZe‡fdd„ƒZ‡Z S) Ú _ASN1Objectz#ASN.1 object identifier lookup r*cstƒj|ft|dd�žŽS)NF)r))ÚsuperÚ__new__Ú_txt2obj)ÚclsÚoid)Ú __class__r*r+rqosz_ASN1Object.__new__cstƒj|ft|ƒžŽS)z3Create _ASN1Object from OpenSSL numeric ID )rprqÚ_nid2obj)rsZnid)rur*r+Úfromnidrsz_ASN1Object.fromnidcstƒj|ft|dd�žŽS)z=Create _ASN1Object from short name, long name or OID T)r))rprqrr)rsr))rur*r+Úfromnamexsz_ASN1Object.fromname) r6r7r8Ú__doc__Ú __slots__rqÚ classmethodrwrxÚ __classcell__r*r*)rur+rojs  roznid shortname longname oidc@seZdZdZdZdZdS)ÚPurposezDSSLContext purpose flags with X509v3 Extended Key Usage objects z1.3.6.1.5.5.7.3.1z1.3.6.1.5.5.7.3.2N)r6r7r8ryÚ SERVER_AUTHZ CLIENT_AUTHr*r*r*r+r}sr}csneZdZdZdZdZdZefdd„Zdd„Z d/d d „Z d0d d „Z dd„Z dd„Z dd„Zdd„Zejfdd„Zeedƒr¼e‡fdd„ƒZej‡fdd„ƒZe‡fdd„ƒZej‡fdd„ƒZe‡fdd „ƒZej‡fd!d „ƒZeed"ƒ�red#d$„ƒZejd%d$„ƒZn ed&d$„ƒZe‡fd'd(„ƒZe‡fd)d*„ƒZej‡fd+d*„ƒZe‡fd,d-„ƒZej‡fd.d-„ƒZ‡ZS)1Ú SSLContextz|An SSLContext holds various SSL-related configuration options and data, such as certificates and possibly a private key.)ZCAZROOTNcOst ||¡}|S)N)r rq)rsÚprotocolÚargsÚkwargsÚselfr*r*r+rqŽs zSSLContext.__new__cCs4|dkr dSt|tƒr&| d¡ d¡S| d¡SdS)NZidnaÚascii)Ú isinstanceÚstrÚencodeÚdecode)rƒrMr*r*r+Ú_encode_hostname’s  zSSLContext._encode_hostnameFTc Cs|jj|||||||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šszSSLContext.wrap_socketcCs|jj|||| |¡||d�S)N)r‹rŽr�r�)Ússlobject_classr’r‰)rƒÚincomingÚoutgoingr‹rŽr�r*r*r+Úwrap_bioªszSSLContext.wrap_biocCsdtƒ}xN|D]F}t|dƒ}t|ƒdks2t|ƒdkr:tdƒ‚| t|ƒ¡| |¡q W| |¡dS)Nr„réÿz(NPN protocols must be 1 to 255 in length)Ú bytearrayÚbytesr[r rZÚextendZ_set_npn_protocols)rƒZ npn_protocolsÚprotosr€Úbr*r*r+Úset_npn_protocols´s  zSSLContext.set_npn_protocolscs8ˆdkrdˆ_n$tˆƒs tdƒ‚‡‡fdd„}|ˆ_dS)Nznot a callable objectcsˆ |¡}ˆ|||ƒS)N)r‰)ÚsslobjZ servernameZsslctx)rƒÚserver_name_callbackr*r+Úshim_cbÆs z3SSLContext.set_servername_callback..shim_cb)Z sni_callbackÚcallableÚ TypeError)rƒr r¡r*)rƒr r+Úset_servername_callback¿s z"SSLContext.set_servername_callbackcCsdtƒ}xN|D]F}t|dƒ}t|ƒdks2t|ƒdkr:tdƒ‚| t|ƒ¡| |¡q W| |¡dS)Nr„rr˜z)ALPN protocols must be 1 to 255 in length)r™ršr[r rZr›Z_set_alpn_protocols)rƒZalpn_protocolsrœr€r�r*r*r+Úset_alpn_protocolsÌs  zSSLContext.set_alpn_protocolscCsztƒ}y@x:t|ƒD].\}}}|dkr|dks6|j|kr| |¡qWWntk rdt d¡YnX|rv|j|d�|S)NZx509_asnTz-unable to enumerate Windows certificate store)Úcadata)r™r<rtr›ÚPermissionErrorÚwarningsÚwarnÚload_verify_locations)rƒÚ storenameÚpurposeZcertsr_ÚencodingZtrustr*r*r+Ú_load_windows_store_certs×s z$SSLContext._load_windows_store_certscCsDt|tƒst|ƒ‚tjdkr8x|jD]}| ||¡q$W| ¡dS)Nr;)r…ror£ÚsysÚplatformÚ_windows_cert_storesr®Zset_default_verify_paths)rƒr¬r«r*r*r+Úload_default_certsås    zSSLContext.load_default_certsÚminimum_versioncs ttƒjƒS)N)r5rpr³)rƒ)rur*r+r³îszSSLContext.minimum_versioncs4|tjkr|jtjM_tttƒj ||¡dS)N) r5r:Úoptionsr/Z OP_NO_SSLv3rprr³Ú__set__)rƒr3)rur*r+r³òs cs ttƒjƒS)N)r5rpÚmaximum_version)rƒ)rur*r+r¶øszSSLContext.maximum_versioncstttƒj ||¡dS)N)rprr¶rµ)rƒr3)rur*r+r¶üscs ttƒjƒS)N)r/rpr´)rƒ)rur*r+r´szSSLContext.optionscstttƒj ||¡dS)N)rprr´rµ)rƒr3)rur*r+r´srDcCs|jtj@}|tjkS)N)Ú _host_flagsr9rD)rƒZncsr*r*r+Úhostname_checks_common_name s z&SSLContext.hostname_checks_common_namecCs,|r|jtjM_n|jtjO_dS)N)r·r9rD)rƒr3r*r*r+r¸scCsdS)NTr*)rƒr*r*r+r¸scs ttƒjƒS)N)r&rpr€)rƒ)rur*r+r€szSSLContext.protocolcs ttƒjƒS)N)r0rpÚ verify_flags)rƒ)rur*r+r¹szSSLContext.verify_flagscstttƒj ||¡dS)N)rprr¹rµ)rƒr3)rur*r+r¹!scs*tƒj}yt|ƒStk r$|SXdS)N)rpÚ verify_moder1rR)rƒr3)rur*r+rº%s zSSLContext.verify_modecstttƒj ||¡dS)N)rprrºrµ)rƒr3)rur*r+rº-s)FTTNN)FNN) r6r7r8ryr±r‘r”Ú PROTOCOL_TLSrqr‰r“r—ržr¤r¥r®r}r~r²Úhasattrr Úpropertyr³Úsetterr¶r´r9r¸r€r¹rºr|r*r*)rur+r†sB          r)rmrnr¦cCsdt|tƒst|ƒ‚ttƒ}|tjkr0t|_d|_ |s<|s<|rL|  |||¡n|jt kr`|  |¡|S)zíCreate a SSLContext object with default settings. NOTE: The protocol and settings may change anytime without prior deprecation. The values represent a fair balance between maximum compatibility and security. T) r…ror£rr»r}r~Ú CERT_REQUIREDrºÚcheck_hostnamerªÚ CERT_NONEr²)r¬rmrnr¦r�r*r*r+Úcreate_default_context2s     rÂF)Ú cert_reqsrÀr¬ÚcertfileÚkeyfilermrnr¦c Cs”t|tƒst|ƒ‚t|ƒ} |s$d| _|dk r2|| _|r„Z"ed?d@„ƒZ#‡fdAdB„Z$edCdD„ƒZ%edEdF„ƒZ&‡fdGdH„Z'edddIdJ„ƒZ(‡fdKdL„Z)dMdN„Z*dOdP„Z+‡fdQdR„Z,ededTdU„ƒZ-edVdW„ƒZ.‡Z/S)fÚ SSLSocketz¶This class implements a subtype of socket.socket that wraps the underlying OS socket in an SSL context when necessary, and provides read and write methods over that channel. cOst|jj›d�ƒ‚dS)NzX does not have a public constructor. Instances are returned by SSLContext.wrap_socket().)r£rur6)rƒr�r‚r*r*r+rÉ&szSSLSocket.__init__FTNc s–| tt¡tkrtdƒ‚|r8|r(tdƒ‚|dk r8tdƒ‚|jrJ|sJtdƒ‚t|j|j |j |  ¡d�}|j |f|Ž} t t| ƒjf|Ž|  | ¡¡| ¡|| _|| _d| _d| _|| _| |¡| _|| _|| _y |  ¡Wn6tk �r} z| jtjkrþ‚d} Wdd} ~ XYnXd} | | _ | �r’yH| jj!| || j| | jd�| _|�rj|  ¡} | d k�rbtd ƒ‚|  "¡Wn$ttfk �r�|  #¡‚YnX| 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�gzHdo_handshake_on_connect should not be specified for non-blocking sockets)$Z getsockoptrBrCr@ÚNotImplementedErrorrRrÀÚdictrèrérêrërqrprçrÉÚ settimeoutÚ gettimeoutÚdetachÚ_contextÚ_sessionZ_closedrËr‹r‰rŽrŒr�Ú getpeernamerQÚerrnoZENOTCONNÚ _connectedÚ _wrap_socketrÜÚclose) rsrŠr‹rŒr�rŽr�r�r‚rƒÚeZ connectedÚtimeout)rur*r+r’-s\        zSSLSocket._createcCs|jS)N)rñ)rƒr*r*r+r�lszSSLSocket.contextcCs||_||j_dS)N)rñrËr�)rƒrÌr*r*r+r�qscCs|jdk r|jjSdS)N)rËr�)rƒr*r*r+r�vs zSSLSocket.sessioncCs||_|jdk r||j_dS)N)ròrËr�)rƒr�r*r*r+r�|s cCs|jdk r|jjSdS)N)rËrÍ)rƒr*r*r+rÍ‚s zSSLSocket.session_reusedcCstd|jjƒ‚dS)NzCan't dup() %s instances)rìrur6)rƒr*r*r+Údupˆsz SSLSocket.dupcCsdS)Nr*)rƒÚmsgr*r*r+Ú _checkClosedŒszSSLSocket._checkClosedcCs|js| ¡dS)N)rõró)rƒr*r*r+Ú_check_connected�szSSLSocket._check_connectedéc Cs�| ¡|jdkrtdƒ‚y&|dk r2|j ||¡S|j |¡SWnJtk rŠ}z,|jdtkrx|jrx|dk rrdSdSn‚Wdd}~XYnXdS)zORead up to LEN bytes and return them. Return zero-length string on EOF.Nz'Read on closed or unwrapped SSL socket.rr-)rürËrRrÏr r�Z SSL_ERROR_EOFr�)rƒr[rÐÚxr*r*r+rϘs zSSLSocket.readcCs&| ¡|jdkrtdƒ‚|j |¡S)zhWrite DATA to the underlying SSL channel. Returns number of bytes of DATA actually transmitted.Nz(Write on closed or unwrapped SSL socket.)rürËrRrÒ)rƒrÓr*r*r+rÒ­s zSSLSocket.writecCs| ¡| ¡|j |¡S)N)rürýrËrÔ)rƒrÕr*r*r+rÔ¶szSSLSocket.getpeercertcCs*| ¡|jdkstjsdS|j ¡SdS)N)rürËr9rrÖ)rƒr*r*r+rÖ¼szSSLSocket.selected_npn_protocolcCs*| ¡|jdkstjsdS|j ¡SdS)N)rürËr9rr×)rƒr*r*r+r×Äsz SSLSocket.selected_alpn_protocolcCs$| ¡|jdkrdS|j ¡SdS)N)rürËrØ)rƒr*r*r+rØÌs zSSLSocket.ciphercCs$| ¡|jdkrdS|j ¡SdS)N)rürËrÙ)rƒr*r*r+rÙÔs zSSLSocket.shared_cipherscCs$| ¡|jdkrdS|j ¡SdS)N)rürËrÚ)rƒr*r*r+rÚÜs zSSLSocket.compressionrcsF| ¡|jdk r4|dkr(td|jƒ‚|j |¡Stƒ ||¡SdS)Nrz3non-zero flags not allowed in calls to send() on %s)rürËrRrurÒrpÚsend)rƒrÓÚflags)rur*r+räs   zSSLSocket.sendcsL| ¡|jdk r"td|jƒ‚n&|dkr8tƒ ||¡Stƒ |||¡SdS)Nz%sendto not allowed on instances of %s)rürËrRrurpÚsendto)rƒrÓZ flags_or_addrrT)rur*r+rïs  zSSLSocket.sendtocOstd|jƒ‚dS)Nz&sendmsg not allowed on instances of %s)rìru)rƒr�r‚r*r*r+ÚsendmsgùszSSLSocket.sendmsgc sš| ¡|jdk rˆ|dkr(td|jƒ‚d}t|ƒ�L}| d¡�6}t|ƒ}x&||krp| ||d…¡}||7}qLWWdQRXWdQRXntƒ  ||¡SdS)Nrz6non-zero flags not allowed in calls to sendall() on %sÚB) rürËrRruÚ memoryviewÚcastr[rrpÚsendall)rƒrÓrrHZviewZ byte_viewZamountrÑ)rur*r+rÿs   "zSSLSocket.sendallcs,|jdk r| |||¡Stƒ |||¡SdS)z…Send a file, possibly by using os.sendfile() if this is a clear-text socket. Return the total number of bytes sent. N)rËZ_sendfile_use_sendrpÚsendfile)rƒÚfileÚoffsetrH)rur*r+rs zSSLSocket.sendfilecsD| ¡|jdk r2|dkr(td|jƒ‚| |¡Stƒ ||¡SdS)Nrz3non-zero flags not allowed in calls to recv() on %s)rürËrRrurÏrpÚrecv)rƒÚbuflenr)rur*r+r s   zSSLSocket.recvcsj| ¡|r|dkrt|ƒ}n |dkr*d}|jdk rV|dkrJtd|jƒ‚| ||¡Stƒ |||¡SdS)Nirz8non-zero flags not allowed in calls to recv_into() on %s)rür[rËrRrurÏrpÚ recv_into)rƒrÐÚnbytesr)rur*r+r $s     zSSLSocket.recv_intocs4| ¡|jdk r"td|jƒ‚ntƒ ||¡SdS)Nz'recvfrom not allowed on instances of %s)rürËrRrurpÚrecvfrom)rƒr r)rur*r+r3s   zSSLSocket.recvfromcs6| ¡|jdk r"td|jƒ‚ntƒ |||¡SdS)Nz,recvfrom_into not allowed on instances of %s)rürËrRrurpÚ recvfrom_into)rƒrÐrr)rur*r+r;s   zSSLSocket.recvfrom_intocOstd|jƒ‚dS)Nz&recvmsg not allowed on instances of %s)rìru)rƒr�r‚r*r*r+ÚrecvmsgCszSSLSocket.recvmsgcOstd|jƒ‚dS)Nz+recvmsg_into not allowed on instances of %s)rìru)rƒr�r‚r*r*r+Ú recvmsg_intoGszSSLSocket.recvmsg_intocCs$| ¡|jdk r|j ¡SdSdS)Nr)rürËrÛ)rƒr*r*r+rÛKs  zSSLSocket.pendingcs| ¡d|_tƒ |¡dS)N)rürËrprÝ)rƒZhow)rur*r+rÝSszSSLSocket.shutdowncCs.|jr|j ¡}d|_|Stdt|ƒƒ‚dS)NzNo SSL wrapper around )rËrÝrRr†)rƒÚsr*r*r+rÞXs  zSSLSocket.unwrapcCs$|jr|j ¡Stdt|ƒƒ‚dS)NzNo SSL wrapper around )rËrãrRr†)rƒr*r*r+rãas z&SSLSocket.verify_client_post_handshakecsd|_tƒ ¡dS)N)rËrpÚ _real_close)rƒ)rur*r+rhszSSLSocket._real_closec CsF| ¡| ¡}z$|dkr(|r(| d¡|j ¡Wd| |¡XdS)Ng)rýrïrîrËrÜ)rƒÚblockrùr*r*r+rÜls  zSSLSocket.do_handshakec s¦|jrtdƒ‚|js|jdk r&tdƒ‚|jj|d|j||jd�|_y>|rVtƒ  |¡}nd}tƒ  |¡|s~d|_|j r~|  ¡|St tfk r d|_‚YnXdS)Nz!can't connect in server-side modez/attempt to connect already-connected SSLSocket!F)rÊr�T)r‹rRrõrËr�rörŽròrpÚ connect_exÚconnectrŒrÜrQ)rƒrTrZrc)rur*r+Ú _real_connectws( zSSLSocket._real_connectcCs| |d¡dS)zQConnects to remote ADDR, and then wraps the connection in an SSL channel.FN)r)rƒrTr*r*r+r‘szSSLSocket.connectcCs | |d¡S)zQConnects to remote ADDR, and then wraps the connection in an SSL channel.T)r)rƒrTr*r*r+r–szSSLSocket.connect_excs.tƒ ¡\}}|jj||j|jdd�}||fS)z¿Accepts a new connection from a remote client, and returns a tuple containing that new connection wrapped with a server-side SSL channel, and the address of the remote client.T)rŒr�r‹)rpÚacceptr�r“rŒr�)rƒZnewsockrT)rur*r+r›s zSSLSocket.acceptú tls-uniquecCs4|jdk r|j |¡S|tkr,td |¡ƒ‚dSdS)Nz({0} channel binding type not implemented)rËràÚCHANNEL_BINDING_TYPESrRrK)rƒrár*r*r+rà§s    zSSLSocket.get_channel_bindingcCs|jdk r|j ¡SdSdS)N)rËrâ)rƒr*r*r+râ²s  zSSLSocket.version)FTTNNN)N)rþN)F)r)N)r)rN)rþr)Nr)rþr)Nr)F)r)0r6r7r8ryrÉr{r’r½rær�r¾r�rÍrúrürýrÏrÒrÔrÖr×rØrÙrÚrrrrrr r rrrrrÛrÝrÞrãrrÜrrrrràrâr|r*r*)rur+rç!sf<                    rçTc Csl|r|stdƒ‚|r |s tdƒ‚t|ƒ} || _|r<|  |¡|rL|  ||¡| rZ|  | ¡| j||||d�S)Nz5certfile must be specified for server-side operationszcertfile must be specified)rŠr‹rŒr�)rRrrºrªrÆZ set_ciphersr“) rŠrÅrÄr‹rÃÚ ssl_versionÚca_certsrŒr�Zciphersr�r*r*r+r“¿s    r“cCs–ddlm}ddlm}d}d}y| |dd… ¡¡d}Wn$tk rbtd ||fƒ‚Yn0X||dd…|ƒ}||d|f|d d …ƒSdS) a‰Return the time in seconds since the Epoch, given the timestring representing the "notBefore" or "notAfter" date from a certificate in ``"%b %d %H:%M:%S %Y %Z"`` strptime format (C locale). "notBefore" or "notAfter" dates must use UTC (RFC 5280). Month is one of: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec UTC should be specified as GMT (see ASN1_TIME_print()) r)Ústrptime)Útimegm) ZJanZFebZMarZAprZMayZJunZJulZAugZSepZOctZNovZDecz %d %H:%M:%S %Y GMTNrerFz*time data %r does not match format "%%b%s"rdé)ZtimerZcalendarrÚindexÚtitlerR)Z cert_timerrZmonthsZ time_formatZ month_numberZttr*r*r+Úcert_time_to_secondsÛs  r#z-----BEGIN CERTIFICATE-----z-----END CERTIFICATE-----csRtt |¡ddƒ‰tg}|‡fdd„tdtˆƒdƒDƒ7}| td¡d |¡S)z[Takes a certificate in binary DER format and returns the PEM version of it as a string.ÚASCIIÚstrictcsg|]}ˆ||d…‘qS)é@r*)r2Úi)Úfr*r+ú sz(DER_cert_to_PEM_cert..rr&Ú ) r†Úbase64Zstandard_b64encodeÚ PEM_HEADERÚranger[rZÚ PEM_FOOTERr\)Zder_cert_bytesZssr*)r(r+ÚDER_cert_to_PEM_certüs "r/cCs\| t¡stdtƒ‚| ¡ t¡s0tdtƒ‚| ¡ttƒttƒ …}t |  dd¡¡S)zhTakes a certificate in ASCII PEM format and returns the DER-encoded version of it as a byte sequencez(Invalid PEM encoding; must start with %sz&Invalid PEM encoding; must end with %sr$r%) r(r,rRÚstripÚendswithr.r[r+Z decodebytesr‡)Zpem_cert_stringÚdr*r*r+ÚPEM_cert_to_DER_certs r3c Csd|\}}|dk rt}nt}t|||d�}t|ƒ�&}| |¡�}| d¡} WdQRXWdQRXt| ƒS)z÷Retrieve the certificate from the server at the specified address, and return it as a PEM-encoded string. If 'ca_certs' is specified, validate the server cert against it. If 'ssl_version' is specified, use it in the connection attempt.N)rÃrmT)r¿rÁÚ_create_stdlib_contextrAr“rÔr/) rTrrZhostZportrÃr�rŠZsslsockZdercertr*r*r+Úget_server_certificates  r5cCs t |d¡S)Nz )Ú_PROTOCOL_NAMESrY)Z protocol_coder*r*r+Úget_protocol_name&sr7)kryr¯rgÚ collectionsrÚenumrZ_EnumrZ_IntEnumrZ_IntFlagr9rrrr r r r r rrrrrrrrrrvrrrrrÚ ImportErrorrrrrrrr r!r"r#r$r%Ú_convertr6r&r»r'Ú __members__Úitemsr6räZ_SSLv2_IF_EXISTSr5r°r<r=r>r?r@rArBrCrPr+rôr¨rQZ socket_errorrr¼ZHAS_NEVER_CHECK_COMMON_NAMEZ_RESTRICTED_SERVER_CIPHERSrJrOrUrXrbrcrfror}rr~rÂrÁrÇZ_create_default_https_contextr4rÈrærçr‘r”r“r#r,r.r/r3r5r7r*r*r*r+Ú[sÄ $0    1# 9-(