
    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)lzCertbot 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}|rt        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.*GKRZ
 H0BC**GGLL'*E49x 	!KK 	!uLL;XxPLL=xR88Hg&&%  R$'=s3xH		! 	!s#   C )D	D8DDDprivkeynamesr:   must_staplec                    t        j                  | j                  ||      }d}|rt        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5G Le-?@"..GGLL015$@| 	!KK 	!'688L'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)zValidate 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^    --&zz#..*++<< 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)zDoes 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"5w?Dzz$<< 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5G..sC8HgH5A7JJ << P	PsD/C|| 	P,,>EEg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FtLMMkkm$/	W	,,TUU	.!'')D>>N$8$8$:; ,,)=n=M'NOO..'+-
 ll#C#J#J>#Z[[  %%\\ 33!- & 

 $$V%8%8(CllMTTU]^__!!&"5"5s;;  	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)zIs 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)zVerifies 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:??3DoFWXE	Y.**D1 	WY11)..2BODUVD	W,,,,b$..$2L2L $ = =	?	Y 	Y	W 	W Z!12 &$f^%=%=qA 	#ll9%%	&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&> ?	
 ll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.
    zverifying 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-  "SYY &$fY !% 	 	#ll9%%&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(   .++, 	&
OO%E	&.**+ 	$y>>#D	$.//0 	.N&++-I	.5LY&HI!(()C)CDI,,y)) '	& 	&	$ 	$	. 	.  &NUUVWX	#ll9%%<< 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
=0s   )	r   rS   rb   load_certificaterV   appendr   rc   r;   )r^   openssl_errors	file_typer6   s       rB   pyopenssl_load_certificater     s     N))6+?+?@ )		)**9d;YFF)
 ,,,33CHH =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$'MsSVx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67HC8) * *r   r   c                 8    t        | t        j                  |      S )zGet 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 )zGet 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 )zGet 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     'sF,K,KSQQr   r   filetypec                 .    t        j                  | |      S )zDump 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 )zWhen 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     9fkk&?&?@@r   c                 J    t        | t        j                  j                        S )zWhen 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     9fkk&>&>??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':':AFFHEF tIll[\\&q^T9Qq>4&q^T9Qr?D&r"-tYrs^E hh45O#**73M??=))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fkkm**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
5zA~ll ? @ 	@ RWXIM //0C0C 3 3T:<<BFH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)zRetrieve 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':':AFFH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   zCertbot 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3y@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 .'# .'# .'!$.'=@.'%).'59XX.'d HL2$(( 25cCH1D+E 2XVY] 2"2@D2PTPXPX2J5 T (E E d (KS K K%TXXtCy8P2Q K: 05-1-<3 -< -<%c]-<6;-<`5e,   T**B*B Tt T$&j.F.F &4 &0;eL:LN^,BL,=-O 'P ; &+; 6;; 5;4H4H	; NR	;6&C &3 &4 &,Z%=%= $ 62U 2uV[[#5E/F 2( "(!4!4u !)3,fkk6>>>Y8Z*Z![9>v{{FNN?Z9[ +1*=*=* **2C<v{{GM~~HV BW 4W +X* %(* CGs)* 06/B/B ,U , ,tCy ,BU B+3S%L%HNIW CX 5X ,YB &)B .2#YBQ5fnnA\;] Q,0IQ 170C0C ,e ,# ,S	 , /5.A.A 	RE 	R 	Rd3i 	R *0)<)<
Bd6;;&7f>S>S9T&T U 
B#&
BAF
B	A 	A!2!2 	A	@ 	@ 1 1 	@*s *$fkk]HUO%CD*IQIZIZ*8  $  II@ @sCx @8$C $C $ 5:tCy S -1>Ar   