HEX
Server: Apache
System: Linux srv1.prosuiteplus.com 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
User: prosuiteplus (1001)
PHP: 8.3.20
Disabled: NONE
Upload Files
File: //usr/lib/python3/dist-packages/acme/__pycache__/crypto_util.cpython-38.pyc
U

�*Pd�+�@s�dZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
ddl	mZddlm
Z
ddlmZddlmZddlmZdd	lmZe�e�ZejZGd
d�de�Zdd
edfdd�Zddd�Zdd�Zdd�Zddd�Ze
jfdd�Z dS) zCrypto utilities.�N)�crypto)�SSL)�errors)�Callable)�Optional)�Tuple)�Unionc@sDeZdZdZefdd�Zdd�Zdd�ZGdd	�d	e�Z	d
d�Z
dS)
�	SSLSocketz�SSL wrapper for sockets.

    :ivar socket sock: Original wrapped socket.
    :ivar dict certs: Mapping from domain names (`bytes`) to
        `OpenSSL.crypto.X509`.
    :ivar method: See `OpenSSL.SSL.Context` for allowed values.

    cCs||_||_||_dS�N)�sock�certs�method)�selfrrr
�r�2/usr/lib/python3/dist-packages/acme/crypto_util.py�__init__(szSSLSocket.__init__cCst|j|�Sr
)�getattrr�r�namerrr�__getattr__-szSSLSocket.__getattr__cCs�|��}z|j|\}}Wn"tk
r<t�d|�YdSXt�|j�}|�tj	�|�tj
�|�|�|�|�|�
|�dS)a�SNI certificate callback.

        This method will set a new OpenSSL context object for this
        connection when an incoming connection provides an SNI name
        (in order to serve the appropriate certificate, if any).

        :param connection: The TLS connection object on which the SNI
            extension was received.
        :type connection: :class:`OpenSSL.Connection`

        z-Server name (%s) not recognized, dropping SSLN)Zget_servernamer�KeyError�logger�debugr�Contextr
�set_options�OP_NO_SSLv2�OP_NO_SSLv3Zuse_privatekeyZuse_certificateZset_context)r�
connectionZserver_name�key�certZnew_contextrrr�_pick_certificate_cb0s�

zSSLSocket._pick_certificate_cbc@s(eZdZdZdd�Zdd�Zdd�ZdS)	zSSLSocket.FakeConnectionzFake OpenSSL.SSL.Connection.cCs
||_dSr
)�_wrapped)rrrrrrOsz!SSLSocket.FakeConnection.__init__cCst|j|�Sr
)rr!rrrrrRsz$SSLSocket.FakeConnection.__getattr__cGs
|j��Sr
)r!�shutdown)rZunused_argsrrrr"Usz!SSLSocket.FakeConnection.shutdownN)�__name__�
__module__�__qualname__�__doc__rrr"rrrr�FakeConnectionJsr'c
Cs�|j��\}}t�|j�}|�tj�|�tj�|�|j	�|�
t�||��}|��t
�d|�z|��Wn.tjk
r�}zt�|��W5d}~XYnX||fS)NzPerforming handshake with %s)r�acceptrrr
rrrZset_tlsext_servername_callbackr r'�
ConnectionZset_accept_staterr�do_handshake�Error�socket�error)rrZaddr�contextZssl_sockr-rrrr(YszSSLSocket.acceptN)r#r$r%r&�_DEFAULT_SSL_METHODrrr �objectr'r(rrrrr	sr	i�i,)�rc
Cst�|�}|�|�d|i}zBt�d|||r@d�|d|d�nd�||f}tj|f|�}	Wn.tjk
r�}
zt	�
|
��W5d}
~
XYnXt�|	��h}t�
||�}|��|�|�z|��|��Wn.tj
k
r�}
zt	�
|
��W5d}
~
XYnXW5QRX|��S)a�Probe SNI server for SSL certificate.

    :param bytes name: Byte string to send as the server name in the
        client hello message.
    :param bytes host: Host to connect to.
    :param int port: Port to connect to.
    :param int timeout: Timeout in seconds.
    :param method: See `OpenSSL.SSL.Context` for allowed values.
    :param tuple source_address: Enables multi-path probing (selection
        of source interface). See `socket.creation_connection` for more
        info. Available only in Python 2.7+.

    :raises acme.errors.Error: In case of any problems.

    :returns: SSL certificate presented by the server.
    :rtype: OpenSSL.crypto.X509

    �source_addressz!Attempting to connect to %s:%d%s.z
 from {0}:{1}r�r1N)rrZset_timeoutrr�formatr,Zcreate_connectionr-rr+�
contextlib�closingr)Zset_connect_stateZset_tlsext_host_namer*r"Zget_peer_certificate)
rZhostZportZtimeoutr
r2r.Z
socket_kwargsZsocket_tuplerr-ZclientZ
client_sslrrr�	probe_snios:

���
&r7FcCs�t�tj|�}t��}tjddd�dd�|D���d�d�g}|rX|�tjddd	d��|�|�|�	|�|�
d
�|�|d�t�tj|�S)a�Generate a CSR containing a list of domains as subjectAltNames.

    :param buffer private_key_pem: Private key, in PEM PKCS#8 format.
    :param list domains: List of DNS names to include in subjectAltNames of CSR.
    :param bool must_staple: Whether to include the TLS Feature extension (aka
        OCSP Must Staple: https://tools.ietf.org/html/rfc7633).
    :returns: buffer PEM-encoded Certificate Signing Request.
    �subjectAltNameF�, css|]}d|VqdS)zDNS:Nr��.0�drrr�	<genexpr>�szmake_csr.<locals>.<genexpr>�ascii�Zcritical�values1.3.6.1.5.5.7.1.24sDER:30:03:02:01:05r�sha256)
rZload_privatekey�FILETYPE_PEMZX509Req�
X509Extension�join�encode�append�add_extensions�
set_pubkey�set_version�sign�dump_certificate_request)Zprivate_key_pem�domainsZmust_stapleZprivate_keyZcsr�
extensionsrrr�make_csr�s2	����


�rNcs6|��j�t|�}�dkr|S�g�fdd�|D�S)Ncsg|]}|�kr|�qSrrr:�Zcommon_namerr�
<listcomp>�sz4_pyopenssl_cert_or_req_all_names.<locals>.<listcomp>)�get_subject�CN�_pyopenssl_cert_or_req_san)Zloaded_cert_or_reqZsansrrOr� _pyopenssl_cert_or_req_all_names�s

rTcsxd�d}d��t|tj�r$tj}ntj}|tj|��d�}t�d|�}|dkrTgn|�	d��
|�}��fdd	�|D�S)
a�Get Subject Alternative Names from certificate or CSR using pyOpenSSL.

    .. todo:: Implement directly in PyOpenSSL!

    .. note:: Although this is `acme` internal API, it is used by
        `letsencrypt`.

    :param cert_or_req: Certificate or CSR.
    :type cert_or_req: `OpenSSL.crypto.X509` or `OpenSSL.crypto.X509Req`.

    :returns: A list of Subject Alternative Names.
    :rtype: `list` of `unicode`

    �:r9ZDNSzutf-8z5X509v3 Subject Alternative Name:(?: critical)?\s*(.*)Nr3cs$g|]}|���r|���d�qS)r3)�
startswith�split)r;�part�Zpart_separator�prefixrrrP�s
�z._pyopenssl_cert_or_req_san.<locals>.<listcomp>)�
isinstancer�X509�dump_certificaterKZ
FILETYPE_TEXT�decode�re�search�grouprW)Zcert_or_reqZparts_separator�func�text�matchZ
sans_partsrrYrrS�s�rS�:	Tc	Cs�|std��t��}|�tt�t�d��d��|�	d�t�
ddd�g}|d|��_|�
|���|svt|�dkr�|�tj
d	d
d�dd
�|D��d��|�|�|�|dkr�dn|�|�|�|�|�|�|d�|S)a�Generate new self-signed certificate.

    :type domains: `list` of `unicode`
    :param OpenSSL.crypto.PKey key:
    :param bool force_san:

    If more than one domain is provided, all of the domains are put into
    ``subjectAltName`` X.509 extension and first domain is set as the
    subject CN. If only one domain is provided no ``subjectAltName``
    extension is used, unless `force_san` is ``True``.

    z0Must provide one or more hostnames for the cert.��sbasicConstraintsTsCA:TRUE, pathlen:0rr3r8Fs, css|]}d|��VqdS)sDNS:N)rEr:rrrr=szgen_ss_cert.<locals>.<genexpr>r?NrA)�AssertionErrorrr\Zset_serial_number�int�binasciiZhexlify�os�urandomrIrCrQrRZ
set_issuer�lenrFrDrGZgmtime_adj_notBeforeZgmtime_adj_notAfterrHrJ)rrLZ
not_beforeZvalidityZ	force_sanrrMrrr�gen_ss_cert�s0
���


rncs$�fdd��d��fdd�|D��S)z�Dump certificate chain into a bundle.

    :param list chain: List of `OpenSSL.crypto.X509` (or wrapped in
        :class:`josepy.util.ComparableX509`).

    :returns: certificate chain bundle
    :rtype: bytes

    cst|tj�r|j}t��|�Sr
)r[�joseZComparableX509�wrappedrr])r)�filetyperr�
_dump_cert,sz(dump_pyopenssl_chain.<locals>._dump_cert�c3s|]}�|�VqdSr
r)r;r)rrrrr=4sz'dump_pyopenssl_chain.<locals>.<genexpr>)rD)�chainrqr)rrrqr�dump_pyopenssl_chains
ru)F)NreT)!r&rjr5Zloggingrkr_r,ZjosepyroZOpenSSLrrZacmerZacme.magic_typingrrrrZ	getLoggerr#rZ
SSLv23_METHODr/r0r	r7rNrTrSrnrBrurrrr�<module>s:
	P�
1
 +�
,