Ë
    M/Åe`  ã                   ó  — d 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 ddlm	Z	 ddlm
Z
 ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z" ddl!m#Z# ddl!m$Z$ ddl%Z%ddl&m'Z' ddl&m(Z( ddl)Z)ddl*m+Z, ddl-m.Z. ddl-m/Z/ ddl-m0Z0 ddl1m2Z2 erddl3m4Z4 dd l5m6Z6 dd!l7m8Z8 dd"l9m:Z:  ejv                  e<«      Z=	 	 	 dhd#e>d$ee?   d%e?d&e?d'e?d(e@d)e0j‚                  fd*„ZB	 did+e0j‚                  d,eee?   e	e?   f   d-ee?   d.e@d(e@d)e0j†                  fd/„ZDd0eEd)e@fd1„ZFd0eEd+eEd)e@fd2„ZGd3e?d4eEd)e
e>e0j†                  ee?   f   fd5„ZH	 	 djd6e>d%e?d&ee?   d)eEfd7„ZId+ee?eEf   d)e@fd8„ZJd9e/j–                  d)dfd:„ZLd9e/j–                  d)dfd;„ZMd<eed=d>ee d?d@f   dAeEdBeEdCejœ                  d)df
dD„ZOdEe?dFe?d)dfdG„ZPd9e/j–                  d)dfdH„ZQd4eEd)e
e'j¤                  e>f   fdI„ZSe'j¨                  fdJeEdKee>eEgee'j¤                  e'jª                  f   f   dLe>d)ee'j¤                  e'jª                  f   fdM„ZVe'j¨                  fdJeEdKee>eEgee'j¤                  e'jª                  f   f   dLe>d)ee?   fdN„ZWe'j¨                  fdOeEdLe>d)ee?   fdP„ZXdQeEdKee>eEgee'j¤                  e'jª                  f   f   dLe>d)ee?   fdR„ZYdSee'j¤                  e'jª                  f   d)ee?   fdT„ZZe'j¨                  fdOeEdLe>d)ee?   fdU„Z[e'j¨                  fd0eEdLe>d)ee?   fdV„Z\e'j¨                  fdWeee'j¤                     ee%jº                     f   dXe>d)eEfdY„Z^dEe?d)ej                  fdZ„Z_dEe?d)ej                  fd[„Z`dEe?d\ee'j¤                  geeE   f   d)ej                  fd]„Zad^e?d)e?fd_„Zb ejÆ                  d`ejÈ                  «      Zedae?d)e
e?e?f   fdb„ZfdEe?d)e>fdc„Zg	 dkddee?   dee?dfe@d)e?fdg„Zhy)lz¦Certbot client crypto utility functions.

.. todo:: Make the transition to use PSS rather than PKCS1_v1_5 when the server
    is capable of handling the signatures.

é    N)ÚCallable)ÚList)ÚOptional)ÚSet)ÚTuple)ÚTYPE_CHECKING)ÚUnion)Úx509)ÚInvalidSignature)ÚUnsupportedAlgorithm)Údefault_backend)Úhashes)Úec)ÚDSAPublicKey)ÚECDSA)ÚEllipticCurvePublicKey)ÚPKCS1v15)ÚRSAPublicKey)ÚEncoding)ÚNoEncryption)ÚPrivateFormat)Úcrypto)ÚSSL)Úcrypto_util)Úerrors)Ú
interfaces)Úutil)Úos)ÚEd448PublicKey)ÚEd25519PublicKey)ÚX448PublicKey)ÚX25519PublicKeyÚkey_sizeÚkey_dirÚkey_typeÚelliptic_curveÚkeynameÚstrict_permissionsÚreturnc                 óD  — 	 t        | |xs d|¬«      }d}|rŸt        j                  |d|«       t        j                  t        j                  j                  ||«      d	d
«      \  }	}|	5  |	j                  |«       ddd«       |dk(  rt        j                  d| |«       nt        j                  d| |«       t        j                  ||«      S # t        $ r=}t        j                  dd¬«       t        j	                  dt        |«      «       |‚d}~ww xY w# 1 sw Y   ŒœxY w)a$  Initializes and saves a privkey.

    Inits key and saves it in PEM format on the filesystem.

    .. note:: keyname is the attempted filename, it may be different if a file
        already exists at the path.

    :param int key_size: key size in bits if key size is rsa.
    :param str key_dir: Optional key save directory.
    :param str key_type: Key Type [rsa, ecdsa]
    :param str elliptic_curve: Name of the elliptic curve if key type is ecdsa.
    :param str keyname: Filename of key
    :param bool strict_permissions: If true and key_dir exists, an exception is raised if
        the directory doesn't have 0700 permissions or isn't owned by the current user.

    :returns: Key
    :rtype: :class:`certbot.util.Key`

    :raises ValueError: If unable to generate the key given key_size.

    Ú	secp256r1)Úbitsr&   r%   Ú T©Úexc_infoz&Encountered error while making key: %sNiÀ  i€  ÚwbÚrsaz Generating RSA key (%d bits): %sz"Generating ECDSA key (%d bits): %s)Úmake_keyÚ
ValueErrorÚloggerÚdebugÚerrorÚstrr   Úmake_or_verify_dirÚunique_filer   ÚpathÚjoinÚwriteÚKey)
r#   r$   r%   r&   r'   r(   Úkey_pemÚerrÚkey_pathÚkey_fs
             ú5/usr/lib/python3/dist-packages/certbot/crypto_util.pyÚgenerate_keyrC   8   sþ   € ð0ÜØ¨.Ò*G¸KÐRZô
ˆð €HÙÜ×Ñ ¨Ð0BÔCÜ×*Ñ*Ü�G‰G�L‰L˜ 'Ó*¨E°4ó9‰ˆˆxàñ 	!Ø�K‰K˜Ô ÷	!à�uÒÜ�L‰LÐ;¸XÀxÕPä�L‰LÐ=¸xÈÔRä�8‰8�H˜gÓ&Ð&øô% ò Ü�‰�R $ˆÔ'Ü�‰Ð=¼sÀ3»xÔHØˆ	ûðú÷	!ð 	!ús#   ‚C Á)DÃ	DÃ8DÄDÄDÚprivkeyÚnamesr:   Úmust_staplec                 ó–  — t        j                  | j                  ||¬«      }d}|r�t        j                  |d|«       t        j
                  t        j                  j                  |d«      dd«      \  }}|5  |j                  |«       ddd«       t        j                  d|«       t        j                  ||d«      S # 1 sw Y   Œ6xY w)	aC  Initialize a CSR with the given private key.

    :param privkey: Key to include in the CSR
    :type privkey: :class:`certbot.util.Key`
    :param set names: `str` names to include in the CSR
    :param str path: Optional certificate save directory.
    :param bool must_staple: If true, include the TLS Feature extension "OCSP Must-Staple"
    :param bool strict_permissions: If true and path exists, an exception is raised if
        the directory doesn't have 0755 permissions or isn't owned by the current user.

    :returns: CSR
    :rtype: :class:`certbot.util.CSR`

    )rF   Nií  zcsr-certbot.pemi¤  r0   zCreating CSR: %sÚpem)Úacme_crypto_utilÚmake_csrrH   r   r8   r9   r   r:   r;   r<   r4   r5   ÚCSR)rD   rE   r:   rF   r(   Úcsr_pemÚcsr_filenameÚcsr_fs           rB   Úgenerate_csrrO   i   s¯   € ô  ×'Ñ'Ø�‰�U¨ô5€Gð €LÙÜ×Ñ  eÐ-?Ô@Ü"×.Ñ.Ü�G‰G�L‰L˜Ð0Ó1°5¸$ó@Ñˆˆ|àñ 	!Ø�K‰K˜Ô ÷	!ä�‰Ð'¨Ô6ä�8‰8�L '¨5Ó1Ð1÷		!ð 	!ús   Á8B?Â?CÚcsrc                 óê   — 	 t        j                  t         j                  | «      }|j                  |j	                  «       «      S # t         j
                  $ r t        j                  dd¬«       Y yw xY w)z¡Validate CSR.

    Check if `csr` is a valid CSR for the given domains.

    :param bytes csr: CSR in PEM.

    :returns: Validity of CSR.
    :rtype: bool

    r-   Tr.   F)r   Úload_certificate_requestÚFILETYPE_PEMÚverifyÚ
get_pubkeyÚErrorr4   r5   )rP   Úreqs     rB   Ú	valid_csrrX   Ž   s^   € ðÜ×-Ñ-Ü×Ñ ó&ˆà�z‰z˜#Ÿ.™.Ó*Ó+Ð+øÜ�<‰<ò Ü�‰�R $ˆÔ'Ùðús   ‚AA Á*A2Á1A2c                 ó  — t        j                  t         j                  | «      }t        j                  t         j                  |«      }	 |j	                  |«      S # t         j
                  $ r t        j                  dd¬«       Y yw xY w)zýDoes private key correspond to the subject public key in the CSR?

    :param bytes csr: CSR in PEM.
    :param bytes privkey: Private key file contents (PEM)

    :returns: Correspondence of private key to CSR subject public key.
    :rtype: bool

    r-   Tr.   F)r   rR   rS   Úload_privatekeyrT   rV   r4   r5   )rP   rD   rW   Úpkeys       rB   Úcsr_matches_pubkeyr\   ¢   sq   € ô ×
)Ñ
)Ü×Ñ˜Só"€Cä×!Ñ!¤&×"5Ñ"5°wÓ?€DðØ�z‰z˜$ÓÐøÜ�<‰<ò Ü�‰�R $ˆÔ'Ùðús   Á
A Á*BÂBÚcsrfileÚdatac                 ó¨  — t         j                  }t         j                  }	  |t         j                  |«      }t        |«      }t        j                  ||«      }|t        j                  | |d¬«      |fS # t         j                  $ rI 	  |||«      }n;# t         j                  $ r% t        j                  dj                  | «      «      ‚w xY wY Œ—w xY w)a1  Import a CSR file, which can be either PEM or DER.

    :param str csrfile: CSR filename
    :param bytes data: contents of the CSR file

    :returns: (`crypto.FILETYPE_PEM`,
               util.CSR object representing the CSR,
               list of domains requested in the CSR)
    :rtype: tuple

    zFailed to parse CSR file: {0}rH   )Úfiler^   Úform)r   rS   rR   ÚFILETYPE_ASN1rV   r   ÚformatÚ"_get_names_from_loaded_cert_or_reqÚdump_certificate_requestr   rK   )r]   r^   ÚPEMÚloadrP   ÚdomainsÚdata_pems          rB   Úimport_csr_filerj   ¶   sÇ   € ô ×
Ñ
€CÜ×*Ñ*€DðPá”6×'Ñ'¨Ó.ˆô 1°Ó5€Gä×.Ñ.¨s°CÓ8€HØ”—‘˜g¨H¸5ÔAÀ7ÐJÐJøô �<‰<ò Pð	PÙ�s˜D“/‰CøÜ�|‰|ò 	PÜ—,‘,Ð>×EÑEÀgÓNÓOÐOð	Púñ ðPús)   ¢A5 Á5CÂ		BÂCÂ8CÃCÃCr,   c                 ó4  — |dk(  r_| dk  r$t        j                  dj                  | «      «      ‚t        j                  «       }|j                  t        j                  | «       �n5|dk(  �r|st        j                  d«      ‚	 |j                  «       }|dv r]t        t        |j                  «       «      }|st        j                  d|› �«      ‚t        j                   |«       t        «       ¬«      }n$t        j                  d	j                  |«      «      ‚	 |j                  t         j"                  t$        j&                  t)        «       ¬«      }t        j*                  t        j,                  |«      }n$t        j                  dj                  |«      «      ‚t        j.                  t        j,                  |«      S # t        $ r% t        j                  d	j                  |«      «      ‚t        $ r$}|t        j                  t        |«      «      ‚d
}~ww xY w)a“  Generate PEM encoded RSA|EC key.

    :param int bits: Number of bits if key_type=rsa. At least 2048 for RSA.
    :param str key_type: The type of key to generate, but be rsa or ecdsa
    :param str elliptic_curve: The elliptic curve to use.

    :returns: new RSA or ECDSA key in PEM form with specified number of bits
              or of type ec_curve when key_type ecdsa is used.
    :rtype: str
    r1   é   zUnsupported RSA key length: {}Úecdsaz3When key_type == ecdsa, elliptic_curve must be set.)Ú	SECP256R1Ú	SECP384R1Ú	SECP521R1zInvalid curve type: )ÚcurveÚbackendzUnsupported elliptic curve: {}N)Úencodingrc   Úencryption_algorithmz0Invalid key_type specified: {}.  Use [rsa|ecdsa])r   rV   rc   r   ÚPKeyrC   ÚTYPE_RSAÚupperÚgetattrr   Úgenerate_private_keyr   Ú	TypeErrorr   r7   Úprivate_bytesr   rf   r   ÚTraditionalOpenSSLr   rZ   rS   Údump_privatekey)	r,   r%   r&   ÚkeyÚnamerq   Ú_keyÚeÚ_key_pems	            rB   r2   r2   Ó   s·  € ð �5ÒØ�$Š;Ü—,‘,Ð?×FÑFÀtÓLÓMÐMä�k‰k‹mˆØ×ÑœŸ™¨$Ö/Ø	�WÓ	ÙÜ—,‘,ÐTÓUÐUð	.Ø!×'Ñ'Ó)ˆDØÐ>Ñ>Ü¤ N×$8Ñ$8Ó$:Ó;�ÙÜ Ÿ,™,Ð)=¸nÐ=MÐ'NÓOÐOÜ×.Ñ.Ù›'Ü+Ó-ô‘ô
 —l‘lÐ#C×#JÑ#JÈ>Ó#ZÓ[Ð[ð ð ×%Ñ%Ü—\‘\Ü ×3Ñ3Ü!-£ð &ó 
ˆô
 ×$Ñ$¤V×%8Ñ%8¸(ÓC‰ä�l‰lÐM×TÑTÐU]Ó^Ó_Ð_Ü×!Ñ!¤&×"5Ñ"5°sÓ;Ð;øô ò 	XÜ—,‘,Ð?×FÑFÀ~ÓVÓWÐWÜ#ò 	.ØœŸ™¤c¨!£fÓ-Ð-ûð	.ús   ÂBF> Æ>5HÇ3HÈHc                 ó¦   — 	 t        j                  t         j                  | «      j                  «       S # t        t         j
                  f$ r Y yw xY w)zŽIs valid RSA private key?

    :param privkey: Private key file contents in PEM

    :returns: Validity of private key.
    :rtype: bool

    F)r   rZ   rS   Úcheckrz   rV   )rD   s    rB   Úvalid_privkeyr…     sG   € ðÜ×%Ñ%Ü×Ñ ó*ß*/©%«'ð	2øä”v—|‘|Ð$ò Ùðús   ‚14 ´AÁAÚrenewable_certc                 óp   — t        | «       t        | «       t        | j                  | j                  «       y)a©  For checking that your certs were not corrupted on disk.

    Several things are checked:
        1. Signature verification for the cert.
        2. That fullchain matches cert and chain when concatenated.
        3. Check that the private key matches the certificate.

    :param renewable_cert: cert to verify
    :type renewable_cert: certbot.interfaces.RenewableCert

    :raises errors.Error: If verification fails.
    N)Úverify_renewable_cert_sigÚverify_fullchainÚverify_cert_matches_priv_keyÚ	cert_pathr@   )r†   s    rB   Úverify_renewable_certrŒ     s*   € ô ˜nÔ-Ü�^Ô$Ü  ×!9Ñ!9¸>×;RÑ;RÕSó    c                 óº  — 	 t        | j                  d«      5 }t        j                  |j	                  «       t        «       «      }ddd«       t        | j                  d«      5 }t        j                  |j	                  «       t        «       «      }ddd«       j                  «       }j                  sJ ‚t        ||j                  |j                  |j                  «       y# 1 sw Y   ŒŸxY w# 1 sw Y   Œ`xY w# t        t        t        f$ rK}dj                  | j                  |«      }t         j#                  |«       t%        j&                  |«      ‚d}~ww xY w)zØVerifies the signature of a RenewableCert object.

    :param renewable_cert: cert to verify
    :type renewable_cert: certbot.interfaces.RenewableCert

    :raises errors.Error: If signature verification fails.
    ÚrbNzbverifying the signature of the certificate located at {0} has failed.                 Details: {1})ÚopenÚ
chain_pathr
   Úload_pem_x509_certificateÚreadr   r‹   Ú
public_keyÚsignature_hash_algorithmÚverify_signed_payloadÚ	signatureÚtbs_certificate_bytesÚIOErrorr3   r   rc   r4   Ú	exceptionr   rV   )r†   Ú
chain_fileÚchainÚ	cert_fileÚcertÚpkr�   Ú	error_strs           rB   rˆ   rˆ   %  s%  € ð&Ü�.×+Ñ+¨TÓ2ð 	Y°jÜ×2Ñ2°:·?±?Ó3DÄoÓFWÓXˆE÷	Yä�.×*Ñ*¨DÓ1ð 	W°YÜ×1Ñ1°)·.±.Ó2BÄOÓDUÓVˆD÷	Wà×ÑÓˆØ×,Ò,Ð,Ð,Ü˜b $§.¡.°$×2LÑ2LØ $× =Ñ =õ	?÷	Yð 	Yú÷	Wð 	Wûô ”ZÔ!1Ð2ò &ðß$™f ^×%=Ñ%=¸qÓAð 	ä×Ñ˜Ô#Ü�l‰l˜9Ó%Ð%ûð	&úsH   ‚C; ˜-C#ÁC; Á#-C/ÂAC; Ã#C,Ã(C; Ã/C8Ã4C; Ã;EÄAEÅEr”   r    r   r"   r!   r—   Úpayloadr•   c                 óà   — t        | t        «      r| j                  ||t        «       |«       yt        | t        «      r| j                  ||t        |«      «       yt        j                  d«      ‚)a»  Check the signature of a payload.

    :param RSAPublicKey/EllipticCurvePublicKey public_key: the public_key to check signature
    :param bytes signature: the signature bytes
    :param bytes payload: the payload bytes
    :param hashes.HashAlgorithm signature_hash_algorithm: algorithm used to hash the payload

    :raises InvalidSignature: If signature verification fails.
    :raises errors.Error: If public key type is not supported
    zUnsupported public key type.N)Ú
isinstancer   rT   r   r   r   r   rV   )r”   r—   r¡   r•   s       rB   r–   r–   =  sb   € ô �*œlÔ+Ø×ÑØ�w¤£
Ð,Dõ	
ô 
�JÔ 6Ô	7Ø×ÑØ�w¤Ð&>Ó ?õ	
ô �l‰lÐ9Ó:Ð:r�   r‹   r@   c                 ól  — 	 t        j                  t         j                  «      }|j                  | «       |j	                  |«       |j                  «        y# t        t         j                  f$ rB}dj                  | ||«      }t        j                  |«       t        j                  |«      ‚d}~ww xY w)zÏ Verifies that the private key and cert match.

    :param str cert_path: path to a cert in PEM format
    :param str key_path: path to a private key file

    :raises errors.Error: If they don't match.
    zˆverifying the certificate located at {0} matches the                 private key located at {1} has failed.                 Details: {2}N)r   ÚContextÚSSLv23_METHODÚuse_certificate_fileÚuse_privatekey_fileÚcheck_privatekeyr™   rV   rc   r4   rš   r   )r‹   r@   Úcontextr�   r    s        rB   rŠ   rŠ   X  s–   € ð&Ü—+‘+œc×/Ñ/Ó0ˆØ×$Ñ$ YÔ/Ø×#Ñ# HÔ-Ø× Ñ Õ"øÜ”S—Y‘YÐò &ðç$™f YØ  !ó%ð 	ô 	×Ñ˜Ô#Ü�l‰l˜9Ó%Ð%ûð&ús   ‚AA ÁB3Á1=B.Â.B3c                 óž  — 	 t        | j                  «      5 }|j                  «       }ddd«       t        | j                  «      5 }|j                  «       }ddd«       t        | j                  «      5 }|j                  «       }ddd«       z   k7  r2d}|j                  | j                  «      }t        j                  |«      ‚y# 1 sw Y   Œ xY w# 1 sw Y   Œ~xY w# 1 sw Y   Œ\xY w# t        $ r@}dj                  |«      }t        j                  |«       t        j                  |«      ‚d}~wt        j                  $ r}|‚d}~ww xY w)zõ Verifies that fullchain is indeed cert concatenated with chain.

    :param renewable_cert: cert to verify
    :type renewable_cert: certbot.interfaces.RenewableCert

    :raises errors.Error: If cert and chain do not combine to fullchain.
    Nz.fullchain does not match cert + chain for {0}!z8reading one of cert, chain, or fullchain has failed: {0})r�   r‘   r“   r‹   Úfullchain_pathrc   Úlineagenamer   rV   r™   r4   rš   )	r†   r›   rœ   r�   rž   Úfullchain_fileÚ	fullchainr    r�   s	            rB   r‰   r‰   n  s(  € ðÜ�.×+Ñ+Ó,ð 	&°
Ø—O‘OÓ%ˆE÷	&ä�.×*Ñ*Ó+ð 	$¨yØ—>‘>Ó#ˆD÷	$ä�.×/Ñ/Ó0ð 	.°NØ&×+Ñ+Ó-ˆI÷	.à�5‰L˜YÒ&ØHˆIØ!×(Ñ(¨×)CÑ)CÓDˆIÜ—,‘,˜yÓ)Ð)ð '÷	&ð 	&ú÷	$ð 	$ú÷	.ð 	.ûô ò &ØN×UÑUÐVWÓXˆ	Ü×Ñ˜Ô#Ü�l‰l˜9Ó%Ð%ûÜ�<‰<ò Øˆûðúsj   ‚C+ —C¨C+ ÁCÁC+ Á3CÂAC+ ÃCÃC+ ÃCÃC+ ÃC(Ã$C+ Ã+	EÃ4;D/Ä/EÅEÅEc                 óZ  — g }t         j                  t         j                  fD ]  }	 t        j                  || «      |fc S  t        j                  dj                  dj                  d„ |D «       «      «      «      ‚# t         j                  $ r}|j                  |«       Y d}~Œ‚d}~ww xY w)z:Load PEM/DER certificate.

    :raises errors.Error:

    NzUnable to load: {0}ú,c              3   ó2   K  — | ]  }t        |«      –— Œ y ­w©N)r7   )Ú.0r6   s     rB   ú	<genexpr>z-pyopenssl_load_certificate.<locals>.<genexpr>—  s   è ø€ ò =0ØŒˆE�
ñ=0ùs   ‚)	r   rS   rb   Úload_certificaterV   Úappendr   rc   r;   )r^   Úopenssl_errorsÚ	file_typer6   s       rB   Úpyopenssl_load_certificaterº   ‰  s¦   € ð €Nä×)Ñ)¬6×+?Ñ+?Ð@ò )ˆ	ð	)Ü×*Ñ*¨9°dÓ;¸YÐFÒFð)ô
 �,‰,Ð,×3Ñ3°C·H±Hñ =0Ø .ô=0ó 50ó 1ó 2ð 2øô �|‰|ò 	)Ø×!Ñ! %×(Ñ(ûð	)ús   §A<Á<B*ÂB%Â%B*Úcert_or_req_strÚ	load_funcÚtypc                 óº   — 	  ||| «      S # t         j                  $ r<}t        j                  dd¬«       t        j	                  dt        |«      «       ‚ d }~ww xY w)Nr-   Tr.   z6Encountered error while loading certificate or csr: %s)r   rV   r4   r5   r6   r7   )r»   r¼   r½   r?   s       rB   Ú_load_cert_or_reqr¿   ›  sO   € ðÙ˜˜oÓ.Ð.øÜ�<‰<ò Ü�‰�R $ˆÔ'Ü�‰ÐMÌsÐSVËxÔXØûðús   ‚ ‹Až7AÁAc                 óB   — t        j                  t        | ||«      «      S r³   )rI   Ú_pyopenssl_cert_or_req_sanr¿   )r»   r¼   r½   s      rB   Ú_get_sans_from_cert_or_reqrÂ   ¦  s&   € ô
 ×6Ñ6Ô7HØ˜ Có8)ó *ð *r�   rž   c                 ó8   — t        | t        j                  |«      S )zóGet a list of Subject Alternative Names from a certificate.

    :param str cert: Certificate (encoded).
    :param typ: `crypto.FILETYPE_PEM` or `crypto.FILETYPE_ASN1`

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

    )rÂ   r   r¶   ©rž   r½   s     rB   Úget_sans_from_certrÅ   ¯  s   € ô &ØŒf×%Ñ% só,ð ,r�   Úcert_or_reqc                 ó2   — t        | ||«      }t        |«      S r³   )r¿   rd   )rÆ   r¼   r½   Úloaded_cert_or_reqs       rB   Ú_get_names_from_cert_or_reqrÉ   ½  s   € ô +¨;¸	À3ÓGÐÜ-Ð.@ÓAÐAr�   rÈ   c                 ó,   — t        j                  | «      S r³   )rI   Ú _pyopenssl_cert_or_req_all_names)rÈ   s    rB   rd   rd   Å  s   € ô ×<Ñ<Ð=OÓPÐPr�   c                 ó8   — t        | t        j                  |«      S )zìGet a list of domains from a cert, including the CN if it is set.

    :param str cert: Certificate (encoded).
    :param typ: `crypto.FILETYPE_PEM` or `crypto.FILETYPE_ASN1`

    :returns: A list of domain names.
    :rtype: list

    )rÉ   r   r¶   rÄ   s     rB   Úget_names_from_certrÍ   Ë  s   € ô 'ØŒf×%Ñ% só,ð ,r�   c                 ó8   — t        | t        j                  |«      S )záGet a list of domains from a CSR, including the CN if it is set.

    :param str csr: CSR (encoded).
    :param typ: `crypto.FILETYPE_PEM` or `crypto.FILETYPE_ASN1`
    :returns: A list of domain names.
    :rtype: list

    )rÉ   r   rR   )rP   r½   s     rB   Úget_names_from_reqrÏ   Ù  s   € ô ' s¬F×,KÑ,KÈSÓQÐQr�   rœ   Úfiletypec                 ó.   — t        j                  | |«      S )z–Dump certificate chain into a bundle.

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

    )rI   Údump_pyopenssl_chain)rœ   rÐ   s     rB   rÒ   rÒ   å  s   € ô ×0Ñ0°¸ÓAÐAr�   c                 óJ   — t        | t        j                  j                  «      S )zÕWhen does the cert at cert_path start being valid?

    :param str cert_path: path to a cert in PEM format

    :returns: the notBefore value from the cert at cert_path
    :rtype: :class:`datetime.datetime`

    )Ú_notAfterBeforer   ÚX509Úget_notBefore©r‹   s    rB   Ú	notBeforerØ   ò  s   € ô ˜9¤f§k¡k×&?Ñ&?Ó@Ð@r�   c                 óJ   — t        | t        j                  j                  «      S )zÓWhen does the cert at cert_path stop being valid?

    :param str cert_path: path to a cert in PEM format

    :returns: the notAfter value from the cert at cert_path
    :rtype: :class:`datetime.datetime`

    )rÔ   r   rÕ   Úget_notAfterr×   s    rB   ÚnotAfterrÛ   þ  s   € ô ˜9¤f§k¡k×&>Ñ&>Ó?Ð?r�   Úmethodc                 ó’  — t        | d«      5 }t        j                  t        j                  |j	                  «       «      }ddd«        |«      }|st        j                  d«      ‚|dd d|dd d|dd d	|dd
 d|d
d d|dd g}dj                  |«      }|j                  d«      }t        j                  |«      S # 1 sw Y   Œ~xY w)aP  Internal helper function for finding notbefore/notafter.

    :param str cert_path: path to a cert in PEM format
    :param function method: one of ``crypto.X509.get_notBefore``
        or ``crypto.X509.get_notAfter``

    :returns: the notBefore or notAfter value from the cert at cert_path
    :rtype: :class:`datetime.datetime`

    r�   Nz>Error while invoking timestamp method, None has been returned.r   é   ó   -é   é   ó   Té
   ó   :é   r�   Úascii)r�   r   r¶   rS   r“   r   rV   r;   ÚdecodeÚ	pyrfc3339Úparse)r‹   rÜ   Úfr
   Ú	timestampÚreformatted_timestampÚtimestamp_bytesÚtimestamp_strs           rB   rÔ   rÔ   
  sÜ   € ô 
ˆi˜Ó	ð F !Ü×&Ñ&¤v×':Ñ':¸A¿F¹F»HÓEˆ÷Fñ �t“€IÙÜ�l‰lÐ[Ó\Ð\Ø& q¨˜^¨T°9¸Q¸q°>À4Ø& q¨˜^¨T°9¸Q¸r°?ÀDØ& r¨"Ð-¨t°Y¸r¸s°^ðEÐð —h‘hÐ4Ó5€OØ#×*Ñ*¨7Ó3€MÜ�?‰?˜=Ó)Ð)÷Fð Fús   �3B=Â=CÚfilenamec                 ó  — t        j                  «       }t        | d«      5 }|j                  |j	                  «       j                  d«      «       ddd«       |j                  «       S # 1 sw Y   |j                  «       S xY w)aN  Compute a sha256sum of a file.

    NB: In given file, platform specific newlines characters will be converted
    into their equivalent unicode counterparts before calculating the hash.

    :param str filename: path to the file whose hash will be computed

    :returns: sha256 digest of the file in hexadecimal
    :rtype: str
    ÚrzUTF-8N)ÚhashlibÚsha256r�   Úupdater“   ÚencodeÚ	hexdigest)rï   ró   Úfile_ds      rB   Ú	sha256sumrø   &  sg   € ô �^‰^Ó€FÜ	ˆh˜Ó	ð 5 Ø�‰�f—k‘k“m×*Ñ*¨7Ó3Ô4÷5à×ÑÓÐ÷5à×ÑÓÐús   ¡/A(Á(B s@   -----BEGIN CERTIFICATE-----?
.+??
-----END CERTIFICATE-----?
Úfullchain_pemc           
      óŒ  — t         j                  | j                  «       «      }t        |«      dk  rt	        j
                  d«      ‚|D �cg c]V  }t        j                  t        j                  t        j                  t        j                  |«      «      j                  «       ‘ŒX }}|d   dj                  |dd «      fS c c}w )a  Split fullchain_pem into cert_pem and chain_pem

    :param str fullchain_pem: concatenated cert + chain

    :returns: tuple of string cert_pem and chain_pem
    :rtype: tuple

    :raises errors.Error: If there are less than 2 certificates in the chain.

    é   zPfailed to parse fullchain into cert and chain: less than 2 certificates in chainr   r-   é   N)ÚCERT_PEM_REGEXÚfindallrõ   Úlenr   rV   r   Údump_certificaterS   r¶   rç   r;   )rù   Úcertsrž   Úcerts_normalizeds       rB   Úcert_and_chain_from_fullchainr  A  sÄ   € ô ×"Ñ" =×#7Ñ#7Ó#9Ó:€EÜ
ˆ5ƒz�A‚~Ü�l‰lð ?ó @ð 	@ð RWöXØIMô ×/Ñ/´×0CÑ0CÜ×Ñ¤× 3Ñ 3°TÓ:ó<ß<B¹F»HñEð XÐð Xð ˜QÑ §¡Ð)9¸!¸"Ð)=Ó!>Ð?Ð?ùò	Xs   ÁACc                 óÊ   — t        | d«      5 }t        j                  t        j                  |j	                  «       «      }ddd«        j
                  «       S # 1 sw Y   ŒxY w)z¾Retrieve the serial number of a certificate from certificate path

    :param str cert_path: path to a cert in PEM format

    :returns: serial number of the certificate
    :rtype: int
    r�   N)r�   r   r¶   rS   r“   Úget_serial_number)r‹   rê   r
   s      rB   Úget_serial_from_certr  ]  sX   € ô 
ˆi˜Ó	ð F !Ü×&Ñ&¤v×':Ñ':¸A¿F¹F»HÓEˆ÷Fà!ˆ4×!Ñ!Ó#Ð#÷Fð Fús   �3AÁA"Ú
fullchainsÚ	issuer_cnÚwarn_on_no_matchc                 ój  — | D ]’  }t         j                  |j                  «       «      }t        j                  |d   t        «       «      }|j                  j                  t        j                  j                  «      }|sŒ}|d   j                  |k(  sŒ�|c S  |rt        j                  d|«       | d   S )a'  Chooses the first certificate chain from fullchains whose topmost
    intermediate has an Issuer Common Name matching issuer_cn (in other words
    the first chain which chains to a root whose name matches issuer_cn).

    :param fullchains: The list of fullchains in PEM chain format.
    :type fullchains: `list` of `str`
    :param `str` issuer_cn: The exact Subject Common Name to match against any
        issuer in the certificate chain.

    :returns: The best-matching fullchain, PEM-encoded, or the first if none match.
    :rtype: `str`
    éÿÿÿÿr   z¥Certbot has been configured to prefer certificate chains with issuer '%s', but no chain from the CA matched this issuer. Using the default certificate chain instead.)rý   rþ   rõ   r
   r’   r   ÚissuerÚget_attributes_for_oidÚNameOIDÚCOMMON_NAMEÚvaluer4   Úwarning)r  r  r	  rœ   r  Útop_certÚtop_issuer_cns          rB   Úfind_chain_with_issuerr  k  s    € ð ò ˆÜ×&Ñ& u§|¡|£~Ó6ˆÜ×1Ñ1°%¸±)¼_Ó=NÓOˆØ Ÿ™×>Ñ>¼t¿|¹|×?WÑ?WÓXˆÚ˜]¨1Ñ-×3Ñ3°yÓ@ØŠLðñ Ü�‰ð =à>Gô	Ið �a‰=Ðr�   )r1   r+   zkey-certbot.pemT)FT)rl   r1   N)F)iÚ__doc__Údatetimerò   ÚloggingÚreÚtypingr   r   r   r   r   r   r	   Úcryptographyr
   Úcryptography.exceptionsr   r   Úcryptography.hazmat.backendsr   Úcryptography.hazmat.primitivesr   Ú)cryptography.hazmat.primitives.asymmetricr   Ú-cryptography.hazmat.primitives.asymmetric.dsar   Ú,cryptography.hazmat.primitives.asymmetric.ecr   r   Ú1cryptography.hazmat.primitives.asymmetric.paddingr   Ú-cryptography.hazmat.primitives.asymmetric.rsar   Ú,cryptography.hazmat.primitives.serializationr   r   r   ÚjosepyÚOpenSSLr   r   rè   Úacmer   rI   Úcertbotr   r   r   Úcertbot.compatr   Ú/cryptography.hazmat.primitives.asymmetric.ed448r   Ú1cryptography.hazmat.primitives.asymmetric.ed25519r    Ú.cryptography.hazmat.primitives.asymmetric.x448r!   Ú0cryptography.hazmat.primitives.asymmetric.x25519r"   Ú	getLoggerÚ__name__r4   Úintr7   Úboolr=   rC   rK   rO   ÚbytesrX   r\   rj   r2   r…   ÚRenewableCertrŒ   rˆ   ÚHashAlgorithmr–   rŠ   r‰   rÕ   rº   rS   ÚX509Reqr¿   rÂ   rÅ   rÉ   rd   rÍ   rÏ   ÚComparableX509rÒ   rØ   rÛ   rÔ   rø   ÚcompileÚDOTALLrý   r  r  r  © r�   rB   ú<module>r9     sê  ðñó Û Û Û 	Ý Ý Ý Ý Ý Ý  Ý å Ý 4Ý 8Ý 8Ý 1Ý 8Ý FÝ >Ý OÝ FÝ FÝ AÝ EÝ FÛ Ý Ý Û å 0Ý Ý Ý Ý ñ ÝNÝRÝLÝPà	ˆ×	Ñ	˜8Ó	$€ð
 INØCTØ,0ñ.'˜3ð .'¨°#©ð .'À#ð .'Ø!$ð.'Ø=@ð.'à%)ð.'à59·X±Xó.'ðd HLñ2˜$Ÿ(™(ð 2¨5°°c±¸CÀ¹HÐ1DÑ+Eð 2ÈXÐVYÉ]ð 2Ø"ð2Ø@Dð2ØPT×PXÑPXó2ðJ�5ð ˜Tó ð(˜Eð ¨Eð °dó ð(K˜Sð K¨ð K°%¸¸T¿X¹XÀtÈCÁyÐ8PÑ2Qó Kð: 05Ø-1ñ-<�3ð -<¨ð -<Ø% c™]ð-<Ø6;ó-<ð`˜5  e Ñ,ð °ó ð T¨*×*BÑ*Bð TÀtó Tð$&¨j×.FÑ.Fð &È4ó &ð0; e¨LÐ:LÐN^Ø,BÀLØ,=¸ð-Oñ 'Pð ;ð &+ð;ð 6;ð;ð 5;×4HÑ4Hð	;ð NRó	;ð6&¨Cð &¸3ð &À4ó &ð, Z×%=Ñ%=ð À$ó ð62 Uð 2¨u°V·[±[À#Ð5EÑ/Fó 2ð( "(×!4Ñ!4ñ uð Ø!)¨3°¨,¸¸f¿k¹kÈ6Ï>É>Ð>YÑ8ZÐ*ZÑ![ðàðà9>¸v¿{¹{ÈFÏNÉNÐ?ZÑ9[óð +1×*=Ñ*=ñ*°ð *Ø*2°C¸°<ÀÀvÇ{Á{ØGMÇ~Á~ðHVñ BWð 4Wñ +Xð*ð %(ð*ð CGÀsÁ)ó*ð 06×/BÑ/Bñ ,˜Uð ,¨ð ,ÀtÈCÁyó ,ðB¨Uð BØ+3°S¸%°LÀ%ÈÏÉØHNÏÉðIWñ CXð 5Xñ ,YðBð &)ðBð .2°#©YóBðQ¸5ÀÇÁÈfÏnÉnÐA\Ñ;]ð QØ,0°©IóQð 17×0CÑ0Cñ ,˜eð ,¨#ð ,ÈÈSÉ	ó ,ð /5×.AÑ.Añ 	R˜Eð 	R¨ð 	RÀdÈ3Áió 	Rð *0×)<Ñ)<ñ
B  d¨6¯;©;Ñ&7¸¸f×>SÑ>SÑ9TÐ&TÑ Uð 
BØ#&ð
BØAFó
Bð	A˜ð 	A ×!2Ñ!2ó 	Að	@˜ð 	@ × 1Ñ 1ó 	@ð*˜sð *Ø$ f§k¡k ]°H¸U±OÐ%CÑDð*ØIQ×IZÑIZó*ð8˜ð  ó ð$ �—‘ðð ‡I�Ió€ð@°ð @¸¸sÀC¸x¹ó @ð8$ Cð $¨Có $ð 5:ñ t¨C¡yð ¸Sð Ø-1ðØ>Aôr�   