o
    ïT·jÀE  ã                	   @  sÈ  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 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„ dD ƒZd^dd„Zejr~d dlm Z  d dlm!Z! ddl"mZ# G dd„ de!d	d�Z$i Z%de&d< zQd 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/m0Z0mZm1Z1 e+Z2er±ee*ƒs±d	ZdD ]Z3ze4e1e3ƒe%e4ede3› �ƒ< W q³ e5yÍ   Y q³w ddl"mZ W n e6yð   dZ(d Z)d!Z/d"Z0d Z2Z+d#Z,d$Z-d%Z.Y nw ej7de8df Z9d_d*d+„Z:d`d/d0„Z;dad2d3„Z<							dbdcd>d?„Z=ej>	@	@	@	@	@	@	@	@	@	@	@	@dddedPdQ„ƒZ?ej>	@	@	@	@	@	@	@	@	@	@	@	@dddfdSdQ„ƒZ?													dgdfdTdQ„Z?dhdWdX„Z@didZd[„ZA	djdkd\d]„ZBdS )lé    )ÚannotationsN)ÚError)Ú	unhexlifyé   )ÚProxySchemeUnsupportedÚSSLErroré   )Ú_BRACELESS_IPV6_ADDRZ_REÚ_IPV4_REFzhttp/1.1c                 C  s   i | ]\}}|t t|d ƒ“qS ©N)ÚgetattrÚhashlib)Ú.0ÚlengthÚ	algorithm© r   úT/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/urllib3/util/ssl_.pyÚ
<dictcomp>   s    ÿÿr   ))é    Úmd5)é(   Úsha1)é@   Úsha256Úopenssl_versionÚstrÚreturnÚboolc                 C  s   |   d¡}|S )NzOpenSSL )Ú
startswith)r   Ú
is_opensslr   r   r   Ú(_is_has_never_check_common_name_reliable   s   
r    )Ú
VerifyMode)Ú	TypedDict)ÚSSLTransportc                   @  s&   e Zd ZU ded< ded< ded< dS )Ú_TYPE_PEER_CERT_RET_DICTztuple[tuple[str, str], ...]ÚsubjectAltNamez'tuple[tuple[tuple[str, str], ...], ...]Úsubjectr   ÚserialNumberN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   r   r   r   r$   /   s   
 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   Úcertúbytes | NoneÚfingerprintÚNonec              
   C  sÈ   | du rt dƒ‚| dd¡ ¡ }t|ƒ}|tvrt d|› �ƒ‚t |¡}|du r/t d|› �ƒ‚zt| ¡ ƒ}W n tyH } zt |ƒ|‚d}~ww || ƒ 	¡ }t
 ||¡sbt d|› d| ¡ › d	�ƒ‚dS )
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ÚBinasciiErrorÚdigestÚhmacÚcompare_digestÚhex)r@   rB   Údigest_lengthÚhashfuncÚfingerprint_bytesÚeÚcert_digestr   r   r   Úassert_fingerprintl   s.   

ÿ
€ÿÿÿrW   Ú	candidateúNone | int | strr!   c                 C  s@   | du rt S t| tƒrtt| dƒ}|du rttd|  ƒ}|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   r   Ússl©rX   Úresr   r   r   Úresolve_cert_reqs‘   s   
r_   Úintc                 C  sH   | du rt S t| tƒr"tt| dƒ}|du rttd|  ƒ}t t|¡S | S )z 
    like resolve_cert_reqs
    Nr>   )r3   r[   r   r   r\   ÚtypingÚcastr`   r]   r   r   r   Úresolve_ssl_version¨   s   
rc   Ússl_versionú
int | NoneÚ	cert_reqsÚoptionsÚciphersú
str | NoneÚssl_minimum_versionÚssl_maximum_versionÚverify_flagsússl.SSLContextc           	      C  s”  t du rtdƒ‚| dttfvr1|dus|durtdƒ‚t | tj¡}t | tj	¡}t
jdtdd� t tƒ}|dur=||_ntj|_|durH||_|rO| |¡ |du rVtjn|}|du rnd}|tO }|tO }|tO }|tO }| j|O  _|du rˆd}tjdkrˆ|tO }|tO }| j|O  _t|d	dƒduršd
|_|tjkr¨ts¨||_ d
|_!nd|_!||_ d|_"dt#j$v rÁt#j% &t#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)(r9   Ú	TypeErrorr3   r4   Ú
ValueErrorr-   rK   r:   ÚMINIMUM_SUPPORTEDÚMAXIMUM_SUPPORTEDÚwarningsÚwarnÚFutureWarningÚminimum_versionr=   Úmaximum_versionÚset_ciphersr\   r.   r7   r8   r0   r1   rg   ÚsysÚversion_infor5   r6   rl   r   rr   ÚIS_PYOPENSSLÚverify_modeÚcheck_hostnameÚhostname_checks_common_nameÚosÚenvironÚpathÚ
expandvarsÚkeylog_filename)	rd   rf   rg   rh   rj   rk   rl   ÚcontextÚsslkeylogfiler   r   r   Úcreate_urllib3_context¸   sl   'ÿÿÿü


r‹   .Úsockúsocket.socketÚkeyfileÚcertfileÚca_certsÚserver_hostnameÚssl_contextússl.SSLContext | NoneÚca_cert_dirÚkey_passwordÚca_cert_dataúNone | str | bytesÚ
tls_in_tlsútyping.Literal[False]ússl.SSLSocketc                 C  ó   d S r   r   ©rŒ   rŽ   r�   rf   r�   r‘   rd   rh   r’   r”   r•   r–   r˜   r   r   r   Ússl_wrap_socketK  ó   r�   ú ssl.SSLSocket | SSLTransportTypec                 C  r›   r   r   rœ   r   r   r   r�   ]  rž   c              
   C  sÖ   |}|du rt |||d�}|s|	s|r.z	| ||	|¡ W n ty- } zt|ƒ|‚d}~ww |du r;t|dƒr;| ¡  |rI|
du rIt|ƒrItdƒ‚|r]|
du rV| ||¡ n| |||
¡ | t	¡ t
| |||ƒ}|S )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)rh   Ú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�   rf   r�   r‘   rd   rh   r’   r”   r•   r–   r˜   r‰   rU   Ússl_sockr   r   r   r�   o  s*   (
€ÿ
Úhostnameústr | bytesc                 C  s,   t | tƒr
|  d¡} tt | ¡pt | ¡ƒS )zæDetects 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)r[   ÚbytesÚdecoder   r
   Úmatchr	   )rª   r   r   r   Úis_ipaddress¹  s   

r°   Úkey_filec                 C  sR   t | ƒ�}|D ]}d|v r W d  ƒ dS qW d  ƒ dS 1 s"w   Y  dS )z*Detects if a key file is encrypted or not.Ú	ENCRYPTEDNTF)Úopen)r±   ÚfÚliner   r   r   r¤   Æ  s   
üþ
ÿúr¤   c                 C  s4   |rt stdƒ‚t  |¡ t | ||ƒS |j| |d�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‘   r   r   r   r¨   Ñ  s   ÿ
r¨   )r   r   r   r   )r@   rA   rB   r   r   rC   )rX   rY   r   r!   )rX   rY   r   r`   )NNNNNNN)rd   re   rf   re   rg   re   rh   ri   rj   re   rk   re   rl   re   r   rm   )............)rŒ   r�   rŽ   ri   r�   ri   rf   re   r�   ri   r‘   ri   rd   re   rh   ri   r’   r“   r”   ri   r•   ri   r–   r—   r˜   r™   r   rš   )rŒ   r�   rŽ   ri   r�   ri   rf   re   r�   ri   r‘   ri   rd   re   rh   ri   r’   r“   r”   ri   r•   ri   r–   r—   r˜   r   r   rŸ   )NNNNNNNNNNNF)rª   r«   r   r   )r±   r   r   r   r   )
rŒ   r�   r’   rm   r˜   r   r‘   ri   r   rŸ   )CÚ
__future__r   r   rO   r„   Úsocketr~   ra   rx   Úbinasciir   rM   r   Ú
exceptionsr   r   Úurlr	   r
   r9   r#   r/   r€   r§   Útupler`   r   Ú_TYPE_VERSION_INFOrJ   r    ÚTYPE_CHECKINGr\   r!   r"   ÚssltransportÚSSLTransportTyper$   r-   r+   r.   r0   r1   r2   r3   r4   r5   r6   r7   r8   r:   ÚPROTOCOL_SSLv23Úattrr   ÚAttributeErrorÚImportErrorÚUnionr­   Ú_TYPE_PEER_CERT_RETrW   r_   rc   r‹   Úoverloadr�   r°   r¤   r¨   r   r   r   r   Ú<module>   sâ    þ

<ÿÿÿø

%
ù óóó
J
ü