grthtrhthjhtyjytjytkergtrhtrjytjerhrfhU iÛf5Íã @sºdZddlZddlZddlmZddlmZmZ m Z ddl Z ddl m Z mZmZddl mZmZmZddl mZmZmZmZmZmZmZddl mZmZdd l mZmZm Z m!Z!zdd 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:Gd d!„d!e ƒZ;Gd"d#„d#e ƒZd&k�r"dd'l m?Z?m@Z@dd(lAmAZAmBZBmCZCmDZDdd)lAmEZEmFZFddlAZGddlHZHddlIZIddlJZJeKZLd*gZMeNe d+ƒZOe.ZPeZQd,d-„ZRd.d/„ZSd0d1„ZTd2d3„ZUed4d5ƒZVd6d7„ZWGd8d9„d9ed9d:ƒƒZXGd;d<„d„d>eƒZZeYj[fdddd?œd@dA„Z\e3fe]dBeYj[ddddddCœdDdE„Z^e\Z_e^Z`GdFdG„dGƒZadHdI„ZbGdJdK„dKeAƒZceceZ_deaeZ_edddBe]e3ddLdLdf dMdN„ZfdOdP„ZgdQZhdRZidSdT„ZjdUdV„Zke3dfdWdX„ZldYdZ„ZmdS)[aë This module provides some more Pythonic support for SSL. Object types: SSLSocket -- subtype of socket.socket which does SSL over the socket Exceptions: SSLError -- exception raised for I/O errors Functions: cert_time_to_seconds -- convert time string used for certificate notBefore and notAfter functions to integer seconds past the Epoch (the time values returned from time.time()) fetch_server_certificate (HOST, PORT) -- fetch the certificate provided by the server running on HOST at port PORT. No validation of the certificate is performed. Integer constants: SSL_ERROR_ZERO_RETURN SSL_ERROR_WANT_READ SSL_ERROR_WANT_WRITE SSL_ERROR_WANT_X509_LOOKUP SSL_ERROR_SYSCALL SSL_ERROR_SSL SSL_ERROR_WANT_CONNECT SSL_ERROR_EOF SSL_ERROR_INVALID_ERROR_CODE The following group define certificate requirements that one side is allowing/requiring from the other side: CERT_NONE - no certificates from the other side are required (or will be looked at if provided) CERT_OPTIONAL - certificates are not required, but if provided will be validated, and if validation fails, the connection will also fail CERT_REQUIRED - certificates are required, and will be validated, and if validation fails, the connection will also fail The following constants identify various SSL protocol variants: PROTOCOL_SSLv2 PROTOCOL_SSLv3 PROTOCOL_SSLv23 PROTOCOL_TLS PROTOCOL_TLS_CLIENT PROTOCOL_TLS_SERVER PROTOCOL_TLSv1 PROTOCOL_TLSv1_1 PROTOCOL_TLSv1_2 The following constants identify various SSL alert message descriptions as per http://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-6 ALERT_DESCRIPTION_CLOSE_NOTIFY ALERT_DESCRIPTION_UNEXPECTED_MESSAGE ALERT_DESCRIPTION_BAD_RECORD_MAC ALERT_DESCRIPTION_RECORD_OVERFLOW ALERT_DESCRIPTION_DECOMPRESSION_FAILURE ALERT_DESCRIPTION_HANDSHAKE_FAILURE ALERT_DESCRIPTION_BAD_CERTIFICATE ALERT_DESCRIPTION_UNSUPPORTED_CERTIFICATE ALERT_DESCRIPTION_CERTIFICATE_REVOKED ALERT_DESCRIPTION_CERTIFICATE_EXPIRED ALERT_DESCRIPTION_CERTIFICATE_UNKNOWN ALERT_DESCRIPTION_ILLEGAL_PARAMETER ALERT_DESCRIPTION_UNKNOWN_CA ALERT_DESCRIPTION_ACCESS_DENIED ALERT_DESCRIPTION_DECODE_ERROR ALERT_DESCRIPTION_DECRYPT_ERROR ALERT_DESCRIPTION_PROTOCOL_VERSION ALERT_DESCRIPTION_INSUFFICIENT_SECURITY ALERT_DESCRIPTION_INTERNAL_ERROR ALERT_DESCRIPTION_USER_CANCELLED ALERT_DESCRIPTION_NO_RENEGOTIATION ALERT_DESCRIPTION_UNSUPPORTED_EXTENSION ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE ALERT_DESCRIPTION_UNRECOGNIZED_NAME ALERT_DESCRIPTION_BAD_CERTIFICATE_STATUS_RESPONSE ALERT_DESCRIPTION_BAD_CERTIFICATE_HASH_VALUE ALERT_DESCRIPTION_UNKNOWN_PSK_IDENTITY é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Ú _SSLMethodcCs| d¡o|dkS)NZ PROTOCOL_ÚPROTOCOL_SSLv23©Ú startswith©Úname©r,ú(/opt/alt/python38/lib64/python3.8/ssl.pyÚ|ó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-Ú ™sr6ZPROTOCOL_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-r7žsr7c@s(eZdZdZdZdZdZdZdZdZ dS) Ú_TLSContentTypez@Content types (record layer) See RFC 8446, section B.1 ééééééN) r8r9r:Ú__doc__ÚCHANGE_CIPHER_SPECÚALERTZ HANDSHAKEZAPPLICATION_DATAÚHEADERZINNER_CONTENT_TYPEr,r,r,r-r=¨sr=c@s˜eZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$S)%Ú _TLSAlertTypezQAlert types for TLSContentType.ALERT messages See RFC 8466, section B.2 ré r>r?r@éé(é)é*é+é,é-é.é/é0é1é2é3é<éFéGéPéVéZédéménéoépéqérésétéxN)&r8r9r:rDZ CLOSE_NOTIFYZUNEXPECTED_MESSAGEZBAD_RECORD_MACZDECRYPTION_FAILEDZRECORD_OVERFLOWZDECOMPRESSION_FAILUREZHANDSHAKE_FAILUREZNO_CERTIFICATEZBAD_CERTIFICATEZUNSUPPORTED_CERTIFICATEZCERTIFICATE_REVOKEDZCERTIFICATE_EXPIREDZCERTIFICATE_UNKNOWNZILLEGAL_PARAMETERZ UNKNOWN_CAZ ACCESS_DENIEDZ DECODE_ERRORZ DECRYPT_ERRORZEXPORT_RESTRICTIONZPROTOCOL_VERSIONZINSUFFICIENT_SECURITYZINTERNAL_ERRORZINAPPROPRIATE_FALLBACKZ USER_CANCELEDZNO_RENEGOTIATIONZMISSING_EXTENSIONZUNSUPPORTED_EXTENSIONZCERTIFICATE_UNOBTAINABLEZUNRECOGNIZED_NAMEZBAD_CERTIFICATE_STATUS_RESPONSEZBAD_CERTIFICATE_HASH_VALUEZUNKNOWN_PSK_IDENTITYZCERTIFICATE_REQUIREDZNO_APPLICATION_PROTOCOLr,r,r,r-rH¶sFrHc@sheZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZdZdZdZdZdS)Ú_TLSMessageTypezFMessage types (handshake protocol) See RFC 8446, section B.3 réééééééé é é ééér>r?r@rAééCéþrCN)r8r9r:rDZ HELLO_REQUESTZ CLIENT_HELLOZ SERVER_HELLOZHELLO_VERIFY_REQUESTZNEWSESSION_TICKETZEND_OF_EARLY_DATAZHELLO_RETRY_REQUESTZENCRYPTED_EXTENSIONSZ CERTIFICATEZSERVER_KEY_EXCHANGEZCERTIFICATE_REQUESTZ SERVER_DONEZCERTIFICATE_VERIFYZCLIENT_KEY_EXCHANGEZFINISHEDZCERTIFICATE_URLZCERTIFICATE_STATUSZSUPPLEMENTAL_DATAZ KEY_UPDATEZ NEXT_PROTOZ MESSAGE_HASHrEr,r,r,r-rgßs.rgÚwin32)Úenum_certificatesÚ enum_crls)ÚsocketÚAF_INETÚ SOCK_STREAMÚcreate_connection)Ú SOL_SOCKETÚSO_TYPEú tls-uniqueÚHOSTFLAG_NEVER_CHECK_SUBJECTcCs¶|sdS| d¡}|s&| ¡| ¡kS|dkrsole wildcard without additional labels are not support: {!r}.ztd ||d fƒ‚ntdƒ‚dS)aíVerify that *cert* (in decoded format as returned by SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 rules are followed. The function matches IP addresses rather than dNSNames if hostname is a valid ipaddress string. IPv4 addresses are supported on all platforms. IPv6 addresses are supported on platforms with IPv6 support (AF_INET6 and inet_pton). CertificateError is raised on failure. On success, the function returns nothing. ztempty or no certificate, match_hostname needs a SSL socket or SSL context with either CERT_OPTIONAL or CERT_REQUIREDNZsubjectAltNamer,ZDNSz IP AddressZsubjectZ commonNamerhz&hostname %r doesn't match either of %sz, zhostname %r doesn't match %rrz=no appropriate commonName or subjectAltName fields were found) r�r’ÚgetrŒÚappendr•Úlenr‡ÚjoinÚmapÚrepr)ÚcertrŠr”ZdnsnamesZsanÚkeyr5Úsubr,r,r-Úmatch_hostnamessB         þ þrŸÚ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. rrhrirjN) r;Úget_default_verify_pathsÚosÚenvironr–r ÚpathÚisfileÚisdir)ÚpartsÚcafileÚcapathr,r,r-r¡°sÿþr¡csDeZdZdZdZ‡fdd„Ze‡fdd„ƒZe‡fdd„ƒZ‡Z S) Ú _ASN1Objectz#ASN.1 object identifier lookup r,cstƒj|ft|dd�žŽS)NFr*©ÚsuperÚ__new__Ú_txt2obj)ÚclsÚoid©Ú __class__r,r-r­Ãsz_ASN1Object.__new__cstƒj|ft|ƒžŽS)z3Create _ASN1Object from OpenSSL numeric ID )r¬r­Ú_nid2obj)r¯Znidr±r,r-ÚfromnidÆsz_ASN1Object.fromnidcstƒj|ft|dd�žŽS)z=Create _ASN1Object from short name, long name or OID Tr*r«)r¯r+r±r,r-ÚfromnameÌsz_ASN1Object.fromname) r8r9r:rDÚ __slots__r­Ú classmethodr´rµÚ __classcell__r,r,r±r-rª¾s rªznid 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)r8r9r:rDÚ SERVER_AUTHZ CLIENT_AUTHr,r,r,r-r¹Ósr¹cs�eZdZdZdZdZdZefdd„Zdd„Z d2d d „Z d3d 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(„ƒZej‡fd)d(„ƒZe‡fd*d+„ƒZe‡fd,d-„ƒZej‡fd.d-„ƒZe‡fd/d0„ƒZej‡fd1d0„ƒZ‡Z S)4Ú SSLContextz|An SSLContext holds various SSL-related configuration options and data, such as certificates and possibly a private key.)ZCAZROOTNcOst ||¡}|S©N)r r­)r¯ÚprotocolÚargsÚkwargsÚselfr,r,r-r­âs zSSLContext.__new__cCs4|dkr dSt|tƒr&| d¡ d¡S| d¡SdS)NZidnaÚascii)Ú isinstanceÚstrÚencodeÚdecode)rÀrŠr,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îsùzSSLContext.wrap_socketcCs|jj|||| |¡||d�S)N)rÈrËrÍrÌ)Ússlobject_classrÏrÆ)rÀÚincomingÚoutgoingrÈrËrÍr,r,r-Úwrap_bioþsýzSSLContext.wrap_biocCs`tƒ}|D]F}t|dƒ}t|ƒdks0t|ƒdkr8tdƒ‚| t|ƒ¡| |¡q | |¡dS)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_protocolss  zSSLContext.set_npn_protocolscs8ˆdkrdˆ_n$tˆƒs tdƒ‚‡‡fdd„}|ˆ_dS)Nznot a callable objectcsˆ |¡}ˆ|||ƒSr¼)rÆ)ÚsslobjZ servernameZsslctx©rÀÚserver_name_callbackr,r-Úshim_cbs z3SSLContext.set_servername_callback..shim_cb)Z sni_callbackÚcallableÚ TypeError)rÀrÞrßr,rÝr-Úset_servername_callbacks z"SSLContext.set_servername_callbackcCs`tƒ}|D]F}t|dƒ}t|ƒdks0t|ƒdkr8tdƒ‚| t|ƒ¡| |¡q | |¡dS)NrÁrrÕz)ALPN protocols must be 1 to 255 in length)rÖr×r˜r r—rØZ_set_alpn_protocols)rÀZalpn_protocolsrÙr½rÚr,r,r-Úset_alpn_protocols s  zSSLContext.set_alpn_protocolscCsvtƒ}z.inner)r¬r»rùrôÚhasattrrárú)rÀrrûr±rr-rù”s  cs ttƒjƒSr¼)r&r¬r½ròr±r,r-r½ºszSSLContext.protocolcs ttƒjƒSr¼)r2r¬Ú verify_flagsròr±r,r-r¾szSSLContext.verify_flagscstttƒj ||¡dSr¼)r¬r»rrôrõr±r,r-rÂscs0tƒj}z t|ƒWStk r*|YSXdSr¼)r¬Ú verify_moder3r�rõr±r,r-rÆs  zSSLContext.verify_modecstttƒj ||¡dSr¼)r¬r»rrôrõr±r,r-rÎs)FTTNN)FNN)!r8r9r:rDrïrÎrÑÚ PROTOCOL_TLSr­rÆrÐrÔrÛrârãrìr¹rºrðrr ÚpropertyrñÚsetterrörór;rørùr½rrr¸r,r,r±r-r»Úsn ý ÿ         &%r»)r¨r©räcCsŒt|tƒst|ƒ‚ttƒ}|tjkr0t|_d|_ |s<|s<|rL|  |||¡n|jt kr`|  |¡t |dƒrˆtj d¡}|rˆtjjsˆ||_|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Úkeylog_filenameÚ SSLKEYLOGFILE)rÂrªrár»rr¹rºÚ CERT_REQUIREDrÚcheck_hostnamerèÚ CERT_NONErðrr¢r£r–ríÚflagsÚignore_environmentr)rêr¨r©rärÌÚ keylogfiler,r,r-Úcreate_default_contextÓs        rF)Ú cert_reqsr rêÚcertfileÚkeyfiler¨r©rä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().rrr,r,r-rÐs ÿzSSLSocket.__init__FTNc sZ| tt¡tkrtdƒ‚|r8|r(tdƒ‚|dk r8tdƒ‚|jrJ|sJtdƒ‚t|j|j |j |  ¡d�}|j |f|Ž} t t| ƒjf|Ž| ¡} | ¡|| _|| _d| _d| _|| _| |¡| _|| _|| _z |  ¡Wnötk �rÌ} zÖ| jtjkrø‚d} |  ¡} |   d¡z|  !d¡}Wn>tk �rZ} z| jtjtj"fk�rF‚d}W5d} ~ XYnX|   | ¡|�r¼d }t#| j|ƒ}||_$d|_%z |  &¡Wntk �rªYnXz|‚W5d}XW5d} ~ XYnXd } |  '| ¡| | _(| �rVzH| jj)| || j| | jd �| _|�r.|  ¡}|d k�r&td ƒ‚|  *¡Wn$ttfk �rT|  &¡‚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ÚfilenoFrhr/z5Closed before TLS handshake with data in recv buffer.T©rrÍçzHdo_handshake_on_connect should not be specified for non-blocking sockets)+Z getsockoptrr€r}ÚNotImplementedErrorr�r Údictr<r=r>r?r­r¬r;rÚ gettimeoutÚdetachÚ_contextÚ_sessionZ_closedrrÈrÆrËrÉrÊÚ getpeernamerŽÚerrnoZENOTCONNZ getblockingZ setblockingÚrecvZEINVALr ÚreasonZlibraryÚcloseÚ settimeoutÚ _connectedÚ _wrap_socketr1)r¯rÇrÈrÉrÊrËrÌrÍr¿rÀZ sock_timeoutÚeZ connectedZblockingZnotconn_pre_handshake_datarKZ notconn_pre_handshake_data_errorÚtimeoutr±r,r-rÏ×s– þ        þ  zSSLSocket._createcCs|jSr¼)rFròr,r,r-rÌ7szSSLSocket.contextcCs||_||j_dSr¼)rFrrÌrr,r,r-rÌ<scCs|jdk r|jjSdSr¼rròr,r,r-rÍAs zSSLSocket.sessioncCs||_|jdk r||j_dSr¼)rGrrÍr r,r,r-rÍGs cCs|jdk r|jjSdSr¼r!ròr,r,r-r"Ms zSSLSocket.session_reusedcCstd|jjƒ‚dS)NzCan't dup() %s instances)rBr²r8ròr,r,r-ÚdupSsÿz SSLSocket.dupcCsdSr¼r,)rÀÚmsgr,r,r-Ú _checkClosedWszSSLSocket._checkClosedcCs|js| ¡dSr¼)rNrHròr,r,r-Ú_check_connected[szSSLSocket._check_connectedr#c Cs | ¡|jdkrtdƒ‚z*|dk r4|j ||¡WS|j |¡WSWnVtk rš}z8|jdtkrˆ|jrˆ|dk r|WY¢dSWY¢ dSn‚W5d}~XYnXdS)zORead up to LEN bytes and return them. Return zero-length string on EOF.Nz'Read on closed or unwrapped SSL socket.rr/)rTrr�r$r r¾Z SSL_ERROR_EOFrÊ)rÀr˜r%Úxr,r,r-r$cs   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.)rTrr�r'r(r,r,r-r'xs zSSLSocket.writecCs| ¡| ¡|j |¡Sr¼)rTrUrr)r*r,r,r-r)�szSSLSocket.getpeercertcCs*| ¡|jdkstjsdS|j ¡SdSr¼)rTrr;rr+ròr,r,r-r+‡szSSLSocket.selected_npn_protocolcCs*| ¡|jdkstjsdS|j ¡SdSr¼)rTrr;rr,ròr,r,r-r,�sz SSLSocket.selected_alpn_protocolcCs$| ¡|jdkrdS|j ¡SdSr¼)rTrr-ròr,r,r-r-—s zSSLSocket.ciphercCs$| ¡|jdkrdS|j ¡SdSr¼)rTrr.ròr,r,r-r.Ÿs zSSLSocket.shared_cipherscCs$| ¡|jdkrdS|j ¡SdSr¼)rTrr/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)rTrr�r²r'r¬Úsend)rÀrÿr r±r,r-rW¯s ÿÿ zSSLSocket.sendcsL| ¡|jdk r"td|jƒ‚n&|dkr8tƒ ||¡Stƒ |||¡SdS)Nz%sendto not allowed on instances of %s)rTrr�r²r¬Úsendto)rÀrÿZ flags_or_addrr‘r±r,r-rXºs ÿzSSLSocket.sendtocOstd|jƒ‚dS)Nz&sendmsg not allowed on instances of %s©rBr²rr,r,r-ÚsendmsgÄsÿzSSLSocket.sendmsgc s–| ¡|jdk r„|dkr(td|jƒ‚d}t|ƒ�H}| d¡�2}t|ƒ}||krn| ||d…¡}||7}qJW5QRXW5QRXntƒ  ||¡SdS)Nrz6non-zero flags not allowed in calls to sendall() on %sÚB) rTrr�r²Ú memoryviewÚcastr˜rWr¬Úsendall)rÀrÿr r…ZviewZ byte_viewZamountr&r±r,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)rZ_sendfile_use_sendr¬Úsendfile)rÀÚfileÚoffsetr…r±r,r-r_Ús zSSLSocket.sendfilecsD| ¡|jdk r2|dkr(td|jƒ‚| |¡Stƒ ||¡SdS)Nrz3non-zero flags not allowed in calls to recv() on %s)rTrr�r²r$r¬rJ©rÀZbuflenr r±r,r-rJäs ÿÿ zSSLSocket.recvcsj| ¡|r|dkrt|ƒ}n |dkr*d}|jdk rV|dkrJtd|jƒ‚| ||¡Stƒ |||¡SdS)Nr#rz8non-zero flags not allowed in calls to recv_into() on %s)rTr˜rr�r²r$r¬Ú recv_into©rÀr%Únbytesr r±r,r-rcïs   ÿÿ zSSLSocket.recv_intocs4| ¡|jdk r"td|jƒ‚ntƒ ||¡SdS)Nz'recvfrom not allowed on instances of %s)rTrr�r²r¬Úrecvfromrbr±r,r-rfþs  ÿzSSLSocket.recvfromcs6| ¡|jdk r"td|jƒ‚ntƒ |||¡SdS)Nz,recvfrom_into not allowed on instances of %s)rTrr�r²r¬Ú recvfrom_intordr±r,r-rgs  ÿzSSLSocket.recvfrom_intocOstd|jƒ‚dS)Nz&recvmsg not allowed on instances of %srYrr,r,r-ÚrecvmsgsÿzSSLSocket.recvmsgcOstd|jƒ‚dS)Nz+recvmsg_into not allowed on instances of %srYrr,r,r-Ú recvmsg_intosÿzSSLSocket.recvmsg_intocCs$| ¡|jdk r|j ¡SdSdS)Nr)rTrr0ròr,r,r-r0s  zSSLSocket.pendingcs| ¡d|_tƒ |¡dSr¼)rTrr¬r2)rÀZhowr±r,r-r2szSSLSocket.shutdowncCs.|jr|j ¡}d|_|Stdt|ƒƒ‚dS©NzNo SSL wrapper around )rr2r�rÃ)rÀÚsr,r,r-r3#s  zSSLSocket.unwrapcCs$|jr|j ¡Stdt|ƒƒ‚dSrj)rr7r�rÃròr,r,r-r7,s z&SSLSocket.verify_client_post_handshakecsd|_tƒ ¡dSr¼)rr¬Ú _real_closeròr±r,r-rl3szSSLSocket._real_closec CsF| ¡| ¡}z$|dkr(|r(| d¡|j ¡W5| |¡XdS)NrA)rUrDrMrr1)rÀÚblockrQr,r,r-r17s  zSSLSocket.do_handshakec s¨|jrtdƒ‚|js|jdk r&tdƒ‚|jj|d|j||jd�|_z@|rVtƒ  |¡}nd}tƒ  |¡|s~d|_|j r~|  ¡|WSt tfk r¢d|_‚YnXdS)Nz!can't connect in server-side modez/attempt to connect already-connected SSLSocket!Fr@T)rÈr�rNrrÌrOrËrGr¬Ú connect_exÚconnectrÉr1rŽ)rÀr‘rnZrcr±r,r-Ú _real_connectBs0þ zSSLSocket._real_connectcCs| |d¡dS)úQConnects to remote ADDR, and then wraps the connection in an SSL channel.FN©rp©rÀr‘r,r,r-ro\szSSLSocket.connectcCs | |d¡S)rqTrrrsr,r,r-rnaszSSLSocket.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È)r¬ÚacceptrÌrÐrÉrÊ)rÀZnewsockr‘r±r,r-rtfsýzSSLSocket.acceptr�cCs4|jdk r|j |¡S|tkr,td |¡ƒ‚dSdS)Nz({0} channel binding type not implemented)rr4ÚCHANNEL_BINDING_TYPESr�rˆr5r,r,r-r4rs  ÿzSSLSocket.get_channel_bindingcCs|jdk r|j ¡SdSdSr¼r6ròr,r,r-rþ}s  zSSLSocket.version)FTTNNN)N)r#N)F)r)N)r)rN)r#r)Nr)r#r)Nr)F)r�)0r8r9r:rDrr·rÏrr:rÌrrÍr"rRrTrUr$r'r)r+r,r-r.r/rWrXrZr^r_rJrcrfrgrhrir0r2r3r7rlr1rprornrtr4rþr¸r,r,r±r-r;Ësˆþ_                          r;Tc Csl|r|stdƒ‚|r |s tdƒ‚t|ƒ} || _|r<|  |¡|rL|  ||¡| rZ|  | ¡| j||||d�S)Nz5certfile must be specified for server-side operationsr)rÇrÈrÉrÊ)r�r»rrèrZ set_ciphersrÐ) rÇrrrÈrÚ ssl_versionÚca_certsrÉrÊZciphersrÌr,r,r-rЊs$   ýrÐcCs–ddlm}ddlm}d}d}z| |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 GMTNrjrhz*time data %r does not match format "%%b%s"rirm)ÚtimerxZcalendarryÚindexÚtitler�)Z cert_timerxryZmonthsZ 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,)r4Úi©Úfr,r-Ú Ísz(DER_cert_to_PEM_cert..rr€Ú ) rÃÚbase64Zstandard_b64encodeÚ PEM_HEADERÚranger˜r—Ú 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‡r�ÚstripÚendswithr‰r˜r†Z decodebytesrÄ)Zpem_cert_stringÚdr,r,r-ÚPEM_cert_to_DER_certÑs ÿÿrŽc Csd|\}}|dk rt}nt}t|||d�}t|ƒ�&}| |¡�}| d¡} W5QRXW5QRXt| ƒ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)rr¨T)r r Ú_create_stdlib_contextr~rÐr)rŠ) r‘rvrwZhostZportrrÌrÇZsslsockZdercertr,r,r-Úget_server_certificateÞsþ  r�cCs t |d¡S)Nz )Ú_PROTOCOL_NAMESr–)Z protocol_coder,r,r-Úget_protocol_nameñsr’)nrDrír¢Ú collectionsrÚenumrZ_EnumrZ_IntEnumrZ_IntFlagr;rrrr r r r r rrrrrrr®rr³rrrrrÚ ImportErrorrrrrrrr r!r"r#r$r%Ú _convert_r8r&rr'Ú __members__Úitemsr‘r8Z_SSLv2_IF_EXISTSr7r=rHrgrîryrzr{r|r}r~rr€r�r†rIrærŽZ socket_errorrurZHAS_NEVER_CHECK_COMMON_NAMEZ_RESTRICTED_SERVER_CIPHERSr‡rŒr’r•rŸr r¡rªr¹r»rºrr rZ_create_default_https_contextr�rr:r;rÎrÑrÐr}r‡r‰rŠrŽr�r’r,r,r,r-ÚsøY $0ýýýýýý   )  1# 9ÿzÿ #ý />û