
    \jNE              
      >   U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
 ddlmZmZ ddlmZmZ dZdZdZdZd	gZeeeeeef   Zd
D  ci c]  \  } }|  ee|d       c}} Z	 	 	 	 d(dZej:                  rd dlmZ d dlm Z  ddl!mZ"  G d de d      Z#i Z$de%d<   	 d dlZd dlm&Z&mZm'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/mZm0Z0 e*Z1er
 ee)      sdZdD ]  Z2	  ee0e2      e$ eede2       <    ddl!mZ ejj                  de6df   Z7d)dZ8d*dZ9d+d Z:	 	 	 	 	 	 	 d,	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d-d!Z;ejx                  	 	 	 	 	 	 	 	 	 	 	 	 d.	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d/d"       Z=ejx                  	 	 	 	 	 	 	 	 	 	 	 	 d.	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d0d#       Z=	 	 	 	 	 	 	 	 	 	 	 	 d1	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d0d$Z=d2d%Z>d3d&Z?	 d4	 	 	 	 	 	 	 	 	 d5d'Z@yc c}} w # e3$ r Y #w xY w# e4$ r dZ'dZ(dZ.dZ/dxZ1Z*dZ+dZ,dZ-Y w xY w)6    )annotationsN)	unhexlify   )ProxySchemeUnsupportedSSLError   )_BRACELESS_IPV6_ADDRZ_RE_IPV4_REFzhttp/1.1))    md5)(   sha1)@   sha256c                (    | j                  d      }|S )NzOpenSSL )
startswith)openssl_version
is_openssls     ;/root/env/lib/python3.12/site-packages/urllib3/util/ssl_.py(_is_has_never_check_common_name_reliabler      s    
 !++J7J    )
VerifyMode)	TypedDict)SSLTransportc                  ,    e Zd ZU ded<   ded<   ded<   y)_TYPE_PEER_CERT_RET_DICTztuple[tuple[str, str], ...]subjectAltNamez'tuple[tuple[tuple[str, str], ...], ...]subjectstrserialNumberN)__name__
__module____qualname____annotations__ r   r   r   r   .   s    3388r   r   )totalzdict[int, int]_SSL_VERSION_TO_TLS_VERSION)CERT_REQUIREDHAS_NEVER_CHECK_COMMON_NAMEOP_NO_COMPRESSIONOP_NO_TICKETOPENSSL_VERSIONPROTOCOL_TLSPROTOCOL_TLS_CLIENTVERIFY_X509_PARTIAL_CHAINVERIFY_X509_STRICTOP_NO_SSLv2OP_NO_SSLv3
SSLContext
TLSVersion)TLSv1TLSv1_1TLSv1_2	PROTOCOL_i   i @  i   i      i   r   c                   | t        d      |j                  dd      j                         }t        |      }|t        vrt        d|       t        j                  |      }|t        d|       t        |j                               } ||       j                         }t        j                  ||      s t        d| d|j                          d	      y)
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.
    NzNo certificate for the peer.: zFingerprint of invalid length: zAHash function implementation unavailable for fingerprint length: z&Fingerprints did not match. Expected "z", got "")r   replacelowerlenHASHFUNC_MAPgetr   encodedigesthmaccompare_digesthex)certfingerprintdigest_lengthhashfuncfingerprint_bytescert_digests         r   assert_fingerprintrN   k   s     |566%%c2.446K$ML(8FGG.HOP]_
 	

 "+"4"4"674.'')K{,=>4[M+//J[I\\]^
 	
 ?r   c                    | t         S t        | t              r(t        t        | d      }|t        t        d| z         }|S | S )a  
    Resolves the argument to a numeric constant, which can be passed to
    the wrap_socket function/method from the ssl module.
    Defaults to :data:`ssl.CERT_REQUIRED`.
    If given a string it is assumed to be the name of the constant in the
    :mod:`ssl` module or its abbreviation.
    (So you can specify `REQUIRED` instead of `CERT_REQUIRED`.
    If it's neither `None` nor a string we assume it is already the numeric
    constant which can directly be passed to wrap_socket.
    NCERT_)r(   
isinstancer   getattrssl	candidateress     r   resolve_cert_reqsrW      sI     )S!c9d+;#w23C
r   c                    | t         S t        | t              r@t        t        | d      }|t        t        d| z         }t        j                  t        |      S | S )z 
    like resolve_cert_reqs
    Nr8   )r-   rQ   r   rR   rS   typingcastintrT   s     r   resolve_ssl_versionr\      sU     )S!c9d+;#{Y67C{{3$$r   c                4   t         t        d      | dt        t        fvrs||t	        d      t
        j                  | t        j                        }t
        j                  | t        j                        }t        j                  dt        d       t        t              }|||_        nt        j                  |_        |||_        |r|j!                  |       |t"        j$                  n|}|&d}|t&        z  }|t(        z  }|t*        z  }|t,        z  }|xj.                  |z  c_        |'d}t0        j2                  dk\  r|t4        z  }|t6        z  }|xj8                  |z  c_        t;        |d	d      d
|_        |t"        j$                  k(  rt>        s||_         d
|_!        nd|_!        ||_         d|_"        dtF        jH                  v r=tF        jJ                  jM                  tF        jH                  j                  d            }nd}|r||_'        |S )a#  Creates and configures an :class:`ssl.SSLContext` instance for use with urllib3.

    :param ssl_version:
        The desired protocol version to use. This will default to
        PROTOCOL_SSLv23 which will negotiate the highest protocol that both
        the server and your installation of OpenSSL support.

        This parameter is deprecated instead use 'ssl_minimum_version'.
    :param ssl_minimum_version:
        The minimum version of TLS to be used. Use the 'ssl.TLSVersion' enum for specifying the value.
    :param ssl_maximum_version:
        The maximum version of TLS to be used. Use the 'ssl.TLSVersion' enum for specifying the value.
        Not recommended to set to anything other than 'ssl.TLSVersion.MAXIMUM_SUPPORTED' which is the
        default value.
    :param cert_reqs:
        Whether to require the certificate verification. This defaults to
        ``ssl.CERT_REQUIRED``.
    :param options:
        Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``,
        ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``, and ``ssl.OP_NO_TICKET``.
    :param ciphers:
        Which cipher suites to allow the server to select. Defaults to either system configured
        ciphers if OpenSSL 1.1.1+, otherwise uses a secure default set of ciphers.
    :param verify_flags:
        The flags for certificate verification operations. These default to
        ``ssl.VERIFY_X509_PARTIAL_CHAIN`` and ``ssl.VERIFY_X509_STRICT`` for Python 3.13+.
    :returns:
        Constructed SSLContext object with specified options
    :rtype: SSLContext
    Nz7Can't create an SSLContext object without an ssl modulezZCan't specify both 'ssl_version' and either 'ssl_minimum_version' or 'ssl_maximum_version'zi'ssl_version' option is deprecated and will be removed in urllib3 v3.0. Instead use 'ssl_minimum_version'r   )category
stacklevelr   )      post_handshake_authTFSSLKEYLOGFILE)(r3   	TypeErrorr-   r.   
ValueErrorr'   rB   r4   MINIMUM_SUPPORTEDMAXIMUM_SUPPORTEDwarningswarnFutureWarningminimum_versionr7   maximum_versionset_ciphersrS   r(   r1   r2   r*   r+   optionssysversion_infor/   r0   verify_flagsrR   rb   IS_PYOPENSSLverify_modecheck_hostnamehostname_checks_common_nameosenvironpath
expandvarskeylog_filename)	ssl_version	cert_reqsrn   ciphersssl_minimum_versionssl_maximum_versionrq   contextsslkeylogfiles	            r   create_urllib3_contextr      s   N QRR 4/BCC *.A.MA  #>"A"AZ99# #>"A"AZ99# MMM&	 ,-G&"5","4"4&"5 G$ &/%6!!II;; 	$$
 	<OOwO w&55L..LL( w-t4@&*# C%%%l'!%!&'*/G'"**$**2::>>/+JK"/Nr   c                     y Nr%   sockkeyfilecertfiler|   ca_certsserver_hostnamer{   r}   ssl_contextca_cert_dirkey_passwordca_cert_data
tls_in_tlss                r   ssl_wrap_socketr   G  s     r   c                     y r   r%   r   s                r   r   r   Y  s     (+r   c                   |}|t        |||      }|s|	s|r	 |j                  ||	|       n|t	        |d      r|j                          |r|
t        |      rt        d      |r(|
|j                  ||       n|j                  |||
       |j                  t               t        | |||      }|S # t        $ r}t        |      |d}~ww xY w)a  
    All arguments except for server_hostname, ssl_context, tls_in_tls, ca_cert_data and
    ca_cert_dir have the same meaning as they do when using
    :func:`ssl.create_default_context`, :meth:`ssl.SSLContext.load_cert_chain`,
    :meth:`ssl.SSLContext.set_ciphers` and :meth:`ssl.SSLContext.wrap_socket`.

    :param server_hostname:
        When SNI is supported, the expected hostname of the certificate
    :param ssl_context:
        A pre-made :class:`SSLContext` object. If none is provided, one will
        be created using :func:`create_urllib3_context`.
    :param ciphers:
        A string of ciphers we wish the client to support.
    :param ca_cert_dir:
        A directory containing CA certificates in multiple separate files, as
        supported by OpenSSL's -CApath flag or the capath argument to
        SSLContext.load_verify_locations().
    :param key_password:
        Optional password if the keyfile is encrypted.
    :param ca_cert_data:
        Optional string containing CA certificates in PEM format suitable for
        passing as the cadata parameter to SSLContext.load_verify_locations()
    :param tls_in_tls:
        Use SSLTransport to wrap the existing socket.
    N)r}   load_default_certsz5Client private key is encrypted, password is required)r   load_verify_locationsOSErrorr   hasattrr   _is_key_file_encryptedload_cert_chainset_alpn_protocolsALPN_PROTOCOLS_ssl_wrap_socket_impl)r   r   r   r|   r   r   r{   r}   r   r   r   r   r   r   essl_socks                   r   r   r   k  s    P G )iQ;,	%))(KN 
	2F!G""$
 <',B7,KNOO##Hg6##Hg|D~.$T7JPHO-  	%1+1$	%s   B5 5	C>C

Cc                    t        | t              r| j                  d      } t        t	        j
                  |       xs t        j
                  |             S )zDetects whether the hostname given is an IPv4 or IPv6 address.
    Also detects IPv6 addresses with Zone IDs.

    :param str hostname: Hostname to examine.
    :return: True if the hostname is an IP address, False otherwise.
    ascii)rQ   bytesdecodeboolr
   matchr	   )hostnames    r   is_ipaddressr     sA     (E"??7+x(T,D,J,J8,TUUr   c                p    t        |       5 }|D ]  }d|v s ddd       y 	 ddd       y# 1 sw Y   yxY w)z*Detects if a key file is encrypted or not.	ENCRYPTEDNTF)open)key_fileflines      r   r   r     sI    	h 1 	Dd"	 	  s   
,,,5c                    |r3t         st        d      t        j                  |       t        | ||      S |j                  | |      S )Nz0TLS in TLS requires support for the 'ssl' module)r   )r   r   $_validate_ssl_context_for_tls_in_tlswrap_socket)r   r   r   r   s       r   r   r     sO     (B  	99+FD+??""4"IIr   )r   r   returnr   )rH   zbytes | NonerI   r   r   None)rU   None | int | strr   r   )rU   r   r   r[   )NNNNNNN)r{   
int | Noner|   r   rn   r   r}   
str | Noner~   r   r   r   rq   r   r   ssl.SSLContext)............)r   socket.socketr   r   r   r   r|   r   r   r   r   r   r{   r   r}   r   r   ssl.SSLContext | Noner   r   r   r   r   None | str | bytesr   ztyping.Literal[False]r   zssl.SSLSocket)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    ssl.SSLSocket | SSLTransportType)NNNNNNNNNNNF)r   zstr | bytesr   r   )r   r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   )A
__future__r   hashlibrE   rv   socketro   rY   rh   binasciir   
exceptionsr   r   urlr	   r
   r3   r   r)   rr   r   tupler[   r   _TYPE_VERSION_INFOrR   rA   r   TYPE_CHECKINGrS   r   r   ssltransportSSLTransportTyper   r'   r$   r(   r*   r+   r,   r-   r.   r/   r0   r1   r2   r4   PROTOCOL_SSLv23attrAttributeErrorImportErrorUnionr   _TYPE_PEER_CERT_RETrN   rW   r\   r   overloadr   r   r   r   )length	algorithms   00r   <module>r      s   "   	  
    9 3
# 3S#s23 
 I	 GGY--	 
 >9E  /1 ^ 0.     #O #+S, ',# 0 	LSDM'y5G(HI + ll#=ud#JK 
D." # &*&*#PPP P 	P
 $P $P P Pf  "%!),!"'*(+
  	
      '   % &  "  "%!),!"'*+
++ + 	+
 +  + + + '+ + + %+ + &+ +&  "&")-"#'+G
GG G 	G
 G  G G G 'G G G %G G &GT
V #'	J
JJ J  	J
 &JkB  		  LKK%&&Ol 's<   G/(5H G54H 5G>:H =G>>H HH