U f&K@sLUddlmZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl m Z m Z ddlmZmZdZdZdZdZd gZejeeeeefZd d d DZd ddddddZd dd ddddddZejrddlmZddlm Z ddl!mZ"Gddde ddZ#iZ$de%d<zddlZdd lm&Z&mZm'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.mZm/Z/e+Z0eree)e*ej1j2ej3ej1j2d!krej4ndsdZd"D]BZ5ze6e/e5e$e6ed#e5<Wne7k rYqYnXqddl!mZWn2e8k r&d$Z'd%Z(d&Z-d'Z.dZ0Z+d(Z,YnXej9de:dfZ;d)d d*d+d,d-ZdQd5d5d5d6d5d5d7d8d9d:Z?ej@dRdd?d@dAdBdCZAej@dSdddDdAdEdCZAdTdddDdAdFdCZAdGddHdIdJZBd ddKdLdMZCdUdsr)) md5)(sha1)@sha256str_TYPE_VERSION_INFOz_TYPE_VERSION_INFO | Nonebool)implementation_name version_infopypy_version_inforeturncCs\|dkr|dkS|dkrT|dd}|d}|dkr<|dkpR|dkrL|d kpR|d kSd SdS) aReturn True for CPython 3.8.9+, 3.9.3+ or 3.10+ and PyPy 7.3.8+ where setting SSLContext.hostname_checks_common_name to False works. Outside of CPython and PyPy we don't know which implementations work or not so we conservatively use our hostname matching as we know that works on all implementations. https://github.com/urllib3/urllib3/issues/2192#issuecomment-821832963 https://foss.heptapod.net/pypy/pypy/-/issues/3539 pypy)cpythonNr)r"r# )r"r%r")r" Fr)rrrZ major_minormicrorrr_is_bpo_43522_fixeds r(int)openssl_versionopenssl_version_numberrrrrcCs&|d}|dk}|o$|p$t|||S)NzOpenSSL i) startswithr()r*r+rrrZ is_opensslZis_openssl_issue_14579_fixedrrr(_is_has_never_check_common_name_reliable<s  r-) VerifyMode) TypedDict) SSLTransportc@s&eZdZUded<ded<ded<dS)_TYPE_PEER_CERT_RET_DICTztuple[tuple[str, str], ...]subjectAltNamez'tuple[tuple[tuple[str, str], ...], ...]subjectrZ serialNumberN)__name__ __module__ __qualname____annotations__rrrrr1Xs r1)totalzdict[int, int]_SSL_VERSION_TO_TLS_VERSION) CERT_REQUIREDHAS_NEVER_CHECK_COMMON_NAMEOP_NO_COMPRESSION OP_NO_TICKETOPENSSL_VERSIONOPENSSL_VERSION_NUMBER PROTOCOL_TLSPROTOCOL_TLS_CLIENT OP_NO_SSLv2 OP_NO_SSLv3 SSLContext TLSVersionr )TLSv1TLSv1_1TLSv1_2 PROTOCOL_ii@iiz bytes | NoneNone)cert fingerprintrcCs|dkrtd|dd}t|}|tkr>td|t|}|dkr^td|t|}||}t ||std|d| d dS) z Checks if given fingerprint matches the supplied certificate. :param cert: Certificate as bytes object. :param fingerprint: Fingerprint as string of hexdigits, can be interspersed by colons. NzNo certificate for the peer.:zFingerprint of invalid length: zAHash function implementation unavailable for fingerprint length: z&Fingerprints did not match. Expected "z", got "") rreplacelowerlen HASHFUNC_MAPgetrencodedigesthmaccompare_digesthex)rLrM digest_lengthhashfuncfingerprint_bytes cert_digestrrrassert_fingerprints"     r_zNone | int | strr.) candidatercCs@|dkr tSt|trr?r@rArBrCrEPROTOCOL_SSLv23implementationnamerrattrr r ImportErrorUnionrZ_TYPE_PEER_CERT_RETr_rfriroverloadrrrrrrrrs      8 " ,,*J