a
}|g] @ s` d Z ddlZddlZddlZddlZddlZddlmZ ddlmZ ddlm Z ddlm
Z
ddlmZ ddlmZ dd l
mZ dd
lmZ ddlmZ ddlmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z ddl!m"Z" ddl#m$Z$ ddl#m%Z% ddl#m&Z& ddl'Z'ddl(m)Z) ddl(m*Z* ddl+m,Z- ddl.m/Z/ ddl.m0Z0 ddl.m1Z1 ddl2m3Z3 erdd l4m5Z5 dd!l6m7Z7 dd"l8m9Z9 dd#l:m;Z; edoe?ee@ e@e@e@eAe1jBd(d)d*ZCdpe1jBeee@ e e@ f ee@ eAeAe1jDd,d-d.ZEeFeAd/d0d1ZGeFeFeAd2d3d4ZHe@eFe
e-jIe1jDee@ f d5d6d7ZJdqe?e@ee@ eFd9d:d;ZKee@eFf eAd<d=d>ZLe0jMdd?d@dAZNe0jMdd?dBdCZOeedDdEee"dFdGf eFeFejPddHdIdJZQe@e@ddKdLdMZRe0jMdd?dNdOZSeFe
e)jTe?f dPdQdRZUe-jIjVfeFee-jIe?f ee@ dSdTdUZWe-jIjVfeFee-jIe?f ee@ dSdVdWZXe-jIjVfeFee-jIe?f ee@ dXdYdZZYe-jIjVfeee)jT ee'jZ f ee-jIe?f eFd[d\d]Z[e@ejd^d_d`Z\e@ejd^dadbZ]e@e@dcdddeZ^e_dfej`Zae@e
e@e@f dgdhdiZbe@e?d^djdkZcdree@ e@eAe@dldmdnZddS )szCertbot 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)List)Optional)Set)Tuple)
TYPE_CHECKING)Union)x509)InvalidSignature)UnsupportedAlgorithm)default_backend)hashes)
serialization)ec)rsa)DSAPublicKey)ECDSA)EllipticCurvePublicKey)PKCS1v15)RSAPublicKey)Encoding)NoEncryption)
PrivateFormat)crypto)SSL)crypto_util)errors)
interfaces)util)os)Ed448PublicKey)Ed25519PublicKey)
X448PublicKey)X25519PublicKeyr secp256r1key-certbot.pemT)key_sizekey_dirkey_typeelliptic_curvekeynamestrict_permissionsreturnc
C s zt | |pd|d}W nF ty\ } z.tjddd tdt| |W Y d}~n
d}~0 0 d}|rt|d| tt j
||d d
\} }| | | W d n1 s0 Y |dkrtd| | ntd
| | t
||S )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.
r# )bitsr( r' Texc_infoz&Encountered error while making key: %sNi i wbr z Generating RSA key (%d bits): %sz"Generating ECDSA key (%d bits): %s)make_key
ValueErrorloggerdebugerrorstrr make_or_verify_dirunique_filer pathjoinwriteKey)
r% r&