3
گag @ s& d Z ddlZddlZddlZddlZddlmZ ddlmZ ddlmZ ddlm Z ddlm
Z
ddlmZ dd lmZ ddl
Z
dd
lmZ ddlmZ ddlmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl m!Z! ddl"m#Z# ddl"m$Z$ ddl"m%Z% ddl&Z&ddl'm(Z( ddl'm)Z) ddl*Z*ddl+Z,ddl-m.Z/ ddl0m1Z1 ddl0m2Z2 ddl0m3Z3 ddl4m5Z5 erddl6m7Z7 dd l8m9Z9 ej:e;Ze>e>e>e?e3j@d%d&d'ZAde=e>e>e>e>e3j@d(d)d*ZBde3j@eee> e e> f e>e?e?e3jCd,d-d.ZDe3j@e e> e>e3jCd/d0d1ZEeFe?d2d3d4ZGeFeFe?d5d6d7ZHe>eFe
e=e3jCee> f d8d9d:ZIde=e>ee> eFd<d=d>ZJe>e?d?d@dAZKe2jLddBdCdDZMe2jLddBdEdFZNeedGdHee!f eFeFejOddIdJdKZPe>e>ddLdMdNZQe2jLddBdOdPZReFe
e(jSe=f dQdRdSZTe(jUfeFee=eFgee(jSe(jVf f e=ee(jSe(jVf dTdUdVZWe(jUfeFee=eFgee(jSe(jVf f e=ee> dTdWdXZXe(jUfeFe=ee> dYdZd[ZYeFee=eFgee(jSe(jVf f e=ee> d\d]d^ZZee(jSe(jVf ee> d_d`daZ[e(jUfeFe=ee> dYdbdcZ\e(jUfeFe=ee> dddedfZ]e(jUfeee(jS ee&j^ f e=eFdgdhdiZ_e>ejdjdkdlZ`e>ejdjdmdnZae>ee(jSgeeF f ejdodpdqZbe>e>drdsdtZcejdduejeZfe>e
e>e>f dvdwdxZge>e=djdydzZhdee> e>e?e>d{d|d}ZidS )zCertbot 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)Ed25519PublicKeyrsa secp256r1key-certbot.pemT)key_sizekey_dirkey_typeelliptic_curvekeynamestrict_permissionsreturnc
C s yt | |pd|d}W nD tk
rZ } z(tjddd tjdt| |W Y dd}~X nX tj|d| tjt j
j||d d
\}} | |j| W dQ R X |dkrtjd| | ntjd
| | tj
| |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: 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&