o
    
ct                    @   s  d dl 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mZ d dl	m
Z
mZ d dlmZ d dlmZ d dlmZ d dlmZmZmZmZ d d	lmZmZmZ d d
lmZmZ d dlmZm Z m!Z! d dl"m#Z#m$Z$ d dl%m&Z& d dl'm(Z( d dl)m*Z*m+Z+ d dl,m-Z-m.Z. d dl/m0Z0m1Z1 d dl2m3Z3m4Z4 d dl5mZ6 d dl7m8Z8 d dl9m:Z:m;Z; d dl<m=Z= d dl>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZF d dlGmHZHmIZImJZJmKZK d dlLmMZMmNZNmOZO d dlPmQZQmRZR d dlSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_ d dl`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZi d dljmkZk d dllmmZm d dlnmoZompZpmqZqmrZrmsZs e td d!d"gZuG d#d$ d$ZvG d%d& d&ZwG d'd( d(Zxd)ewd*eTfd+d,Zyew ZzdS )-    N)contextmanager)utilsx509)UnsupportedAlgorithm_Reasons)aead)_CipherContext_CMACContext)_dh_params_dup_DHParameters_DHPrivateKey_DHPublicKey)_DSAParameters_DSAPrivateKey_DSAPublicKey)_EllipticCurvePrivateKey_EllipticCurvePublicKey)_ED448_KEY_SIZE_Ed448PrivateKey_Ed448PublicKey)_Ed25519PrivateKey_Ed25519PublicKey_HashContext_HMACContext)_POLY1305_KEY_SIZE_Poly1305Context)_RSAPrivateKey_RSAPublicKey)_X448PrivateKey_X448PublicKey)_X25519PrivateKey_X25519PublicKey)r   )binding)hashesserialization)AsymmetricPadding)dhdsaeced448ed25519rsax448x25519)MGF1OAEPPSSPKCS1v15)#CERTIFICATE_ISSUER_PUBLIC_KEY_TYPESPRIVATE_KEY_TYPESPUBLIC_KEY_TYPES)BlockCipherAlgorithmCipherAlgorithm)AESAES128AES256ARC4SM4CamelliaChaCha20	TripleDES_BlowfishInternal_CAST5Internal_IDEAInternal_SEEDInternal)	CBCCFBCFB8CTRECBGCMOFBXTSMode)scrypt)ssh)_ALLOWED_PKCS12_TYPES_PKCS12_CAS_TYPESPBESPKCS12CertificatePKCS12KeyAndCertificates
_MemoryBIObiochar_ptrc                   @   s   e Zd ZdS )_RC2N)__name__
__module____qualname__ r]   r]   Y/opt/certbot/lib/python3.10/site-packages/cryptography/hazmat/backends/openssl/backend.pyrY      s    rY   c                   @   s
  e Zd ZdZdZh dZefZej	ej
ejejejejejejejejejejfZejejejejfZdZdZdd> ZdZde> Z dd Z!d	e"fd
dZ#	d9de$de%j&e%j'e(j)  d	dfddZ*d	e$fddZ+d:ddZ,d:ddZ-e.j/dd Z0d:ddZ1d	e"fddZ2d	e"fddZ3d	e4fdd Z5d!e6d"ej7d	e8fd#d$Z9d"ej7fd%d&Z:d"ej7fd'd(Z;d"ej7d	e$fd)d*Z<d"ej7d	e$fd+d,Z=d	e$fd-d.Z>d"ej7d	e$fd/d0Z?d"ej7d	ej@fd1d2ZAd3eBd4eCd	e$fd5d6ZDd7d8 ZEd:d9d:ZFd3eBd4eCd	eGfd;d<ZHd3eBd4eCd	eGfd=d>ZId"ej7d	e$fd?d@ZJd"ej7dAe4dBe6dCe4dDe6d	e6fdEdFZKd	e%j'e(j) fdGdHZLd	e%j'e(jM fdIdJZNd	e4fdKdLZOd9dMe4fdNdOZPdPe4dQe4d	eQjRfdRdSZSdPe4dQe4d	e$fdTdUZTdVeQjUdWe$d	eQjRfdXdYZVdVeQjWd	eQjXfdZd[ZYd\d] ZZd^d_ Z[d`e6fdadbZ\dcdd Z]d	e6fdedfZ^dWe$d	e_fdgdhZ`d	eafdidjZbd"ej7d	e$fdkdlZcdmedd	e$fdndoZedQe4d	efjgfdpdqZhdrefjgd	efjifdsdtZjdQe4d	efjifdudvZkdwdx ZldVefjmd	efjifdydzZndVefjod	efjpfd{d|ZqdVefjrd	efjgfd}d~Zsdd Ztd	e$fddZud"ej7d	e$fddZvd	e$fddZwd"exd	eyfddZzd`e6de%j&e6 dWe$d	e_fddZ{d`e6d	eafddZ|d`e6d	e}j~fddZd`e6de%j&e6 dWe$d	e_fddZdd Zd`e6d	eafddZd`e6d	e}j~fddZdejd	e%jfddZde%jd	ejfddZdejd	e%jfddZdejd	e%jfddZdejded	e$fddZdejd	e$fddZdd Zdd Zd	e%jfddZdejd	e$fddZdejdejd	e$fddZdejd	ejfddZdVejd	ejfddZdVejd	ejfddZdejde6d	ejfddZde4dejd	ejfddZdejfddZde4fddńZd"ejdejd	e$fddǄZddɄ Zdejd	e4fdd˄Ze/dd̈́ Zddτ Zde4de4fddӄZdejdejdejd	e6fdd؄Zddڄ Zdd܄ Zdejdejd	e6fddބZd	e$fddZde4dQe4d	e}j~fddZdd Zdre}j~d	e}jfddZde4dQe4d	e}jfddZdVe}jd	e}jfddZdVe}jd	e}jfddZdVe}jd	e}j~fddZ	d9de4de4de%j&e4 d	e$fddZd	e$fddZd`e6d	ejfddZd`e6d	ejfddZdd Zd	ejfddZd	e$fdd Zd`e6d	ejfddZd`e6d	ejfddZd	ejfddZd	e$fddZd	e$fd	d
Zd`e6d	ejfddZd`e6d	ejfddZd	ejfddZd	e$fddZd`e6d	ejfddZd`e6d	ejfddZd	ejfddZdDe6dBe6dAe4de4de4de4d	e6fddZd	e$fddZe.j/dAe4d	e%je fdd ZdAe4d	dfd!d"Ze.j/d#d$ Zd`e6de%j&e6 d	e%je%j&e_ e%j&ej e%j'ej f fd%d&Zd`e6de%j&e6 d	efd'd(Zd)e%j&e6 d!e%j&e de%j&ej d*e%j&e%j'e  dejd	e6fd+d,Zd	e$fd-d.Zd!e6d	efd/d0Zd	e$fd1d2Zd`e6d	e%j'ej fd3d4Zd`e6d	e%j'ej fd5d6Zd7d8 ZdS (;  Backendz)
    OpenSSL API binding interfaces.
    openssl>      aes-128-ccm   aes-128-gcm   aes-192-ccm   aes-192-gcm   aes-256-ccm   aes-256-gcm   i     c                 C   s   t  | _| jj| _| jj| _|  | _i | _	| 
  | jr)| jjr)tdt n|   | jjg| _| jjrA| j| jj d S d S )Nz<OpenSSL FIPS mode is enabled. Can't enable DRBG fork safety.)r%   Binding_bindingffi_ffilib_lib_is_fips_enabled_fips_enabled_cipher_registry_register_default_ciphers"CRYPTOGRAPHY_NEEDS_OSRANDOM_ENGINEwarningswarnUserWarningactivate_osrandom_engineEVP_PKEY_DH	_dh_typesCryptography_HAS_EVP_PKEY_DHXappendEVP_PKEY_DHXselfr]   r]   r^   __init__   s    



zBackend.__init__returnc                 C   s   d |  | j| jjS )Nz3<OpenSSLBackend(version: {}, FIPS: {}, Legacy: {})>)formatopenssl_version_textrp   rj   _legacy_provider_loadedr}   r]   r]   r^   __repr__   s
   zBackend.__repr__Nokerrorsc                 C   s   t j| j||dS )N)r   )r%   _openssl_assertrn   )r~   r   r   r]   r]   r^   openssl_assert   s   zBackend.openssl_assertc                 C   s>   | j jr| j | jj}n| j  }|dkr| j   t|S Nr   )rn   Cryptography_HAS_300_FIPS&EVP_default_properties_is_fips_enabledrl   NULL	FIPS_modeERR_clear_errorbool)r~   moder]   r]   r^   ro      s   

zBackend._is_fips_enabledc                 C   s$   | j   |  sJ |  | _d S N)rj   _enable_fipsro   rp   r}   r]   r]   r^   r      s   
zBackend._enable_fipsc                 C   sn   | j jr3| j  }|| jjkr5| j | | j | jj}| |dk | j |}| |dk d S d S d S Nrh   )	rn   rs   ENGINE_get_default_RANDrl   r   ENGINE_unregister_RANDRAND_set_rand_methodr   ENGINE_finishr~   eresr]   r]   r^   activate_builtin_random   s   
zBackend.activate_builtin_randomc              
   c   s    | j | j j}| || jjk | j |}| |dk z |V  W | j |}| |dk | j |}| |dk d S | j |}| |dk | j |}| |dk w r   )	rn   ENGINE_by_idCryptography_osrandom_engine_idr   rl   r   ENGINE_initENGINE_freer   r   r]   r]   r^   _get_osurandom_engine   s   zBackend._get_osurandom_enginec                 C   sx   | j jr:|   |  }| j |}| |dk W d    n1 s$w   Y  | j | jj}| |dk d S d S r   )	rn   rs   r   r   ENGINE_set_default_RANDr   r   rl   r   r   r]   r]   r^   rw     s   
z Backend.activate_osrandom_enginec              	   C   st   | j dd}|  }| j|dt||| j jd}| |dk W d    n1 s,w   Y  | j |	dS )Nchar[]@   s   get_implementationr   ascii)
rl   newr   rn   ENGINE_ctrl_cmdlenr   r   stringdecode)r~   bufr   r   r]   r]   r^   osrandom_engine_implementation  s   
z&Backend.osrandom_engine_implementationc                 C   s   | j | j| jjdS )z
        Friendly string name of the loaded OpenSSL library. This is not
        necessarily the same version as it was compiled against.

        Example: OpenSSL 1.1.1d  10 Sep 2019
        r   )rl   r   rn   OpenSSL_versionOPENSSL_VERSIONr   r}   r]   r]   r^   r   !  s
   zBackend.openssl_version_textc                 C   s
   | j  S r   )rn   OpenSSL_version_numr}   r]   r]   r^   openssl_version_number,     
zBackend.openssl_version_numberkey	algorithmc                 C   s   t | ||S r   r   )r~   r   r   r]   r]   r^   create_hmac_ctx/     zBackend.create_hmac_ctxc                 C   sL   |j dks
|j dkrd|j |jd d}n|j d}| j|}|S )Nblake2bblake2sz{}{}   r   )namer   digest_sizeencodern   EVP_get_digestbyname)r~   r   algevp_mdr]   r]   r^   _evp_md_from_algorithm4  s   zBackend._evp_md_from_algorithmc                 C   s    |  |}| || jjk |S r   )r   r   rl   r   r~   r   r   r]   r]   r^   _evp_md_non_null_from_algorithm?  s   
z'Backend._evp_md_non_null_from_algorithmc                 C   s,   | j rt|| jsdS | |}|| jjkS NF)rp   
isinstance_fips_hashesr   rl   r   r   r]   r]   r^   hash_supportedD  s   
zBackend.hash_supportedc                 C       | j rt|tjrdS | |S r   rp   r   r&   SHA1r   r~   r   r]   r]   r^   signature_hash_supportedK  s   
z Backend.signature_hash_supportedc                 C      | j rdS | jjdkS NFrh   )rp   rn   Cryptography_HAS_SCRYPTr}   r]   r]   r^   scrypt_supportedT  s   zBackend.scrypt_supportedc                 C   r   )NTr   r   r]   r]   r^   hmac_supportedZ  s   
zBackend.hmac_supportedc                 C   
   t | |S r   r   r   r]   r]   r^   create_hash_ctxa  s   
zBackend.create_hash_ctxcipherr   c                 C   s^   | j rt|| jsdS z| jt|t|f }W n
 ty"   Y dS w || ||}| jj|kS r   )rp   r   _fips_ciphersrq   typeKeyErrorrl   r   )r~   r   r   adapter
evp_cipherr]   r]   r^   cipher_supportedf  s   zBackend.cipher_supportedc                 C   s0   ||f| j v rtd|||| j ||f< d S )Nz"Duplicate registration for: {} {}.)rq   
ValueErrorr   )r~   
cipher_clsmode_clsr   r]   r]   r^   register_cipher_adaptert  s   zBackend.register_cipher_adapterc                 C   s  t ttfD ]}ttttttt	fD ]}| 
||td qqtttttfD ]}| 
t|td q$ttttfD ]}| 
t|td q6| 
tttd | 
ttd td | 
t tt tttttfD ]}| 
t|td qd| jjsx| jjsttttfD ]}| 
t|td q~ttttfD ]}| 
t|td qtttgttttgD ]\}}| 
||td q| 
ttd td	 | 
ttd td
 d S d S )Nz+{cipher.name}-{cipher.key_size}-{mode.name}zdes-ede3-{mode.name}zdes-ede3chacha20zsm4-{mode.name}zbf-{mode.name}zseed-{mode.name}z{cipher.name}-{mode.name}rc4rc2)r:   r;   r<   rF   rI   rJ   rL   rG   rH   rK   r   GetCipherByNamer?   rA   r@   r   rM   _get_xts_cipherr>   rj   r   rn   #CRYPTOGRAPHY_OPENSSL_300_OR_GREATERrB   rE   	itertoolsproductrC   rD   r=   rY   )r~   r   r   r]   r]   r^   rr   }  s~   



z!Backend._register_default_ciphersc                 C      t | ||t jS r   )r   _ENCRYPTr~   r   r   r]   r]   r^   create_symmetric_encryption_ctx     z'Backend.create_symmetric_encryption_ctxc                 C   r   r   )r   _DECRYPTr   r]   r]   r^   create_symmetric_decryption_ctx  r   z'Backend.create_symmetric_decryption_ctxc                 C   s
   |  |S r   )r   r   r]   r]   r^   pbkdf2_hmac_supported  r   zBackend.pbkdf2_hmac_supportedlengthsalt
iterationskey_materialc           
   
   C   sh   | j d|}| |}| j |}| j|t||t|||||}	| |	dk | j |d d  S )Nunsigned char[]rh   )	rl   r   r   from_bufferrn   PKCS5_PBKDF2_HMACr   r   buffer)
r~   r   r   r   r   r   r   r   key_material_ptrr   r]   r]   r^   derive_pbkdf2_hmac  s   

zBackend.derive_pbkdf2_hmacc                 C      t | jS r   )r%   _consume_errorsrn   r}   r]   r]   r^   r        zBackend._consume_errorsc                 C   r   r   )r%   _consume_errors_with_textrn   r}   r]   r]   r^   r     r   z!Backend._consume_errors_with_textc                 C   sz   || j jksJ | | j|  | j|}| j d|}| j||}| |dk t	| j 
|d | d}|S )Nr   r   big)rl   r   r   rn   BN_is_negativeBN_num_bytesr   	BN_bn2binint
from_bytesr   )r~   bnbn_num_bytesbin_ptrbin_lenvalr]   r]   r^   
_bn_to_int  s   zBackend._bn_to_intnumc                 C   sn   |du s|| j jksJ |du r| j j}|t| d d d}| j|t||}| || j jk |S )a
  
        Converts a python integer to a BIGNUM. The returned BIGNUM will not
        be garbage collected (to support adding them to structs that take
        ownership of the object). Be sure to register it for GC if it will
        be discarded after use.
        Ng       @rh   r   )	rl   r   to_bytesr   
bit_lengthrn   	BN_bin2bnr   r   )r~   r  r   binarybn_ptrr]   r]   r^   
_int_to_bn  s   zBackend._int_to_bnpublic_exponentkey_sizec                 C   s   t || | j }| || jjk | j|| jj}| 	|}| j|| jj
}| j|||| jj}| |dk | |}t| ||ddS )Nrh   Tunsafe_skip_rsa_key_validation)r.   _verify_rsa_parametersrn   RSA_newr   rl   r   gcRSA_freer  BN_freeRSA_generate_key_ex_rsa_cdata_to_evp_pkeyr   )r~   r  r  	rsa_cdatar   r   evp_pkeyr]   r]   r^   generate_rsa_private_key  s   


z Backend.generate_rsa_private_keyc                 C   s   |dko|d@ dko|dkS )N   rh   r   i   r]   )r~   r  r  r]   r]   r^   !generate_rsa_parameters_supported"  s
   
z)Backend.generate_rsa_parameters_supportednumbersr  c              
   C   s6  t |j|j|j|j|j|j|jj	|jj
 | j }| || jjk | j|| jj}| |j}| |j}| |j}| |j}| |j}| |j}	| |jj	}
| |jj
}| j|||}| |dk | j|||
|}| |dk | j||||	}| |dk | |}t| |||dS )Nrh   r  )r.   _check_private_key_componentspqddmp1dmq1iqmppublic_numbersr   nrn   r  r   rl   r   r  r  r  RSA_set0_factorsRSA_set0_keyRSA_set0_crt_paramsr  r   )r~   r  r  r  r  r   r!  r"  r#  r$  r   r&  r   r  r]   r]   r^   load_rsa_private_numbers+  sD   


z Backend.load_rsa_private_numbersc                 C   s   t |j|j | j }| || jjk | j	|| jj
}| |j}| |j}| j|||| jj}| |dk | |}t| ||S r   )r.   _check_public_key_componentsr   r&  rn   r  r   rl   r   r  r  r  r(  r  r    )r~   r  r  r   r&  r   r  r]   r]   r^   load_rsa_public_numbersT  s   

zBackend.load_rsa_public_numbersc                 C   s2   | j  }| || jjk | j|| j j}|S r   )rn   EVP_PKEY_newr   rl   r   r  EVP_PKEY_freer~   r  r]   r]   r^   _create_evp_pkey_gcc  s   
zBackend._create_evp_pkey_gcc                 C   (   |   }| j||}| |dk |S r   )r0  rn   EVP_PKEY_set1_RSAr   )r~   r  r  r   r]   r]   r^   r  i     zBackend._rsa_cdata_to_evp_pkeydatac                 C   sH   | j |}| j|t|}| || j jk t| j || jj	|S )z
        Return a _MemoryBIO namedtuple of (BIO, char*).

        The char* is the storage for the BIO and it must stay alive until the
        BIO is finished with.
        )
rl   r   rn   BIO_new_mem_bufr   r   r   rV   r  BIO_free)r~   r4  data_ptrrW   r]   r]   r^   _bytes_to_bioo  s   zBackend._bytes_to_bioc                 C   sP   | j  }| || jjk | j |}| || jjk | j|| j j}|S )z.
        Creates an empty memory BIO.
        )rn   	BIO_s_memr   rl   r   BIO_newr  r6  )r~   
bio_methodrW   r]   r]   r^   _create_mem_bio_gc|  s   
zBackend._create_mem_bio_gcc                 C   s\   | j d}| j||}| |dk | |d | j jk | j |d |dd }|S )zE
        Reads a memory BIO. This only works on memory BIOs.
        zchar **r   N)rl   r   rn   BIO_get_mem_datar   r   r   )r~   rW   r   buf_lenbio_datar]   r]   r^   _read_mem_bio  s   zBackend._read_mem_bioc           
      C   s2  | j |}|| j jkr,| j |}| || jjk | j|| j j}t	| |||dS || j j
krs| j jss| j jss| j jss| j |}| || jjk | j|| j j}|  }| j ||}| |dk | j| |d|dS || j jkr| j |}| || jjk | j|| j j}t| ||S || j jkr| j |}| || jjk | j|| j j}t| ||S || jv r| j |}	| |	| jjk | j|	| j j}	t| |	|S |t| j ddkrt| |S |t| j ddkrt | |S || j j!krt"| |S |t| j ddkrt#| |S t$d)	zd
        Return the appropriate type of PrivateKey given an evp_pkey cdata
        pointer.
        r  rh   N)passwordr  EVP_PKEY_ED25519EVP_PKEY_X448EVP_PKEY_ED448Unsupported key type.)%rn   EVP_PKEY_idEVP_PKEY_RSAEVP_PKEY_get1_RSAr   rl   r   r  r  r   EVP_PKEY_RSA_PSSCRYPTOGRAPHY_IS_LIBRESSLCRYPTOGRAPHY_IS_BORINGSSL#CRYPTOGRAPHY_OPENSSL_LESS_THAN_111Er<  i2d_RSAPrivateKey_bioload_der_private_keyr@  EVP_PKEY_DSAEVP_PKEY_get1_DSADSA_freer   EVP_PKEY_ECEVP_PKEY_get1_EC_KEYEC_KEY_freer   ry   EVP_PKEY_get1_DHDH_freer   getattrr   r!   EVP_PKEY_X25519r#   r   r   )
r~   r  r  key_typer  rW   r   	dsa_cdataec_cdatadh_cdatar]   r]   r^   _evp_pkey_to_private_key  sl   






z Backend._evp_pkey_to_private_keyc           
      C   s4  | j |}|| j jkr*| j |}| || jjk | j|| j j}t	| ||S || j j
krn| j jsn| j jsn| j jsn| j |}| || jjk | j|| j j}|  }| j ||}| |dk | | |S || j jkr| j |}| || jjk | j|| j j}t| ||S || j jkr| j |}|| jjkr|  }td|| j|| j j}t| ||S || jv r| j |}	| |	| jjk | j|	| j j}	t| |	|S |t | j ddkrt!| |S |t | j ddkrt"| |S || j j#krt$| |S |t | j ddkrt%| |S t&d)zc
        Return the appropriate type of PublicKey given an evp_pkey cdata
        pointer.
        rh   zUnable to load EC keyrB  NrC  rD  rE  )'rn   rF  rG  rH  r   rl   r   r  r  r    rI  rJ  rK  rL  r<  i2d_RSAPublicKey_bioload_der_public_keyr@  rO  rP  rQ  r   rR  rS  r   r   rT  r   ry   rU  rV  r   rW  r   r"   rX  r$   r   r   )
r~   r  rY  r  rW   r   rZ  r[  r   r\  r]   r]   r^   _evp_pkey_to_public_key  s^   






zBackend._evp_pkey_to_public_keyc                 C   s   t |tjtjtjtjtjfS r   )r   r&   r   SHA224SHA256SHA384SHA512r   r]   r]   r^   _oaep_hash_supported  s   zBackend._oaep_hash_supportedpaddingc                 C   s   t |trdS t |tr&t |jtr&| jrt |jjtjrdS | 	|jjS t |t
r>t |jtr>| |jjo=| |jS dS )NTF)r   r4   r3   _mgfr1   rp   
_algorithmr&   r   r   r2   re  )r~   rf  r]   r]   r^   rsa_padding_supported  s   


zBackend.rsa_padding_supportedc              	   C   s~   |dvrt d| j }| || jjk | j|| jj}| j||| jjd| jj| jj| jj}| |dk t	| |S )N)i   rg   i   i   z0Key size must be 1024, 2048, 3072, or 4096 bits.r   rh   )
r   rn   DSA_newr   rl   r   r  rQ  DSA_generate_parameters_exr   )r~   r  ctxr   r]   r]   r^   generate_dsa_parameters0  s$   


zBackend.generate_dsa_parameters
parametersc                 C   sT   | j |j}| || jjk | j|| j j}| j | | 	|}t
| ||S r   )rn   DSAparams_dup
_dsa_cdatar   rl   r   r  rQ  DSA_generate_key_dsa_cdata_to_evp_pkeyr   )r~   rn  rl  r  r]   r]   r^   generate_dsa_private_keyH  s   
z Backend.generate_dsa_private_keyc                 C      |  |}| |S r   )rm  rs  )r~   r  rn  r]   r]   r^   'generate_dsa_private_key_and_parametersU  s   

z/Backend.generate_dsa_private_key_and_parametersc                 C   sB   | j ||||}| |dk | j |||}| |dk d S r   )rn   DSA_set0_pqgr   DSA_set0_key)r~   rZ  r  r   gpub_keypriv_keyr   r]   r]   r^   _dsa_cdata_set_values[  s   zBackend._dsa_cdata_set_valuesc           
      C   s   t | |jj}| j }| || jjk | j	|| jj
}| |j}| |j}| |j}| |jj}| |j}| |||||| | |}	t| ||	S r   )r*   _check_dsa_private_numbersr%  parameter_numbersrn   rj  r   rl   r   r  rQ  r  r  r   rx  yxr{  rr  r   )
r~   r  r}  rZ  r  r   rx  ry  rz  r  r]   r]   r^   load_dsa_private_numbersa  s   


z Backend.load_dsa_private_numbersc           	      C   s   t |j | j }| || jjk | j|| jj	}| 
|jj}| 
|jj}| 
|jj}| 
|j}| jj}| |||||| | |}t| ||S r   )r*   _check_dsa_parametersr}  rn   rj  r   rl   r   r  rQ  r  r  r   rx  r~  r{  rr  r   )	r~   r  rZ  r  r   rx  ry  rz  r  r]   r]   r^   load_dsa_public_numbersv  s   

zBackend.load_dsa_public_numbersc                 C   s   t | | j }| || jjk | j|| jj}| 	|j
}| 	|j}| 	|j}| j||||}| |dk t| |S r   )r*   r  rn   rj  r   rl   r   r  rQ  r  r  r   rx  rv  r   )r~   r  rZ  r  r   rx  r   r]   r]   r^   load_dsa_parameter_numbers  s   


z"Backend.load_dsa_parameter_numbersc                 C   r1  r   )r0  rn   EVP_PKEY_set1_DSAr   )r~   rZ  r  r   r]   r]   r^   rr    r3  zBackend._dsa_cdata_to_evp_pkeyc                 C   s   | j  S r   )rp   r}   r]   r]   r^   dsa_supported  s   zBackend.dsa_supportedc                 C   s   |   sdS | |S r   )r  r   r   r]   r]   r^   dsa_hash_supported  s   
zBackend.dsa_hash_supportedc                 C   s   |  |td|j S )N    )r   rF   
block_sizer   r]   r]   r^   cmac_algorithm_supported  s   z Backend.cmac_algorithm_supportedc                 C   r   r   r	   r   r]   r]   r^   create_cmac_ctx  r   zBackend.create_cmac_ctxrA  c                 C   s   |  | jj|||S r   )	_load_keyrn   PEM_read_bio_PrivateKey)r~   r4  rA  r  r]   r]   r^   load_pem_private_key  s   zBackend.load_pem_private_keyc                 C   s   |  |}| jd}| j|j| jj| j| jjd|}|| jjkr2| j	|| jj
}| |S |   | j|j}| |dk | j|j| jj| j| jjd|}|| jjkrq| j	|| jj}| |}t| ||S |   d S )NCRYPTOGRAPHY_PASSWORD_DATA *Cryptography_pem_password_cbrh   )r8  rl   r   rn   PEM_read_bio_PUBKEYrW   r   	addressof_original_libr  r.  r`  r   	BIO_resetr   PEM_read_bio_RSAPublicKeyr  r  r    _handle_key_loading_error)r~   r4  mem_biouserdatar  r   r  r]   r]   r^   load_pem_public_key  s:   


zBackend.load_pem_public_keyc                 C   s^   |  |}| j|j| jj| jj| jj}|| jjkr)| j|| jj}t| |S | 	  d S r   )
r8  rn   PEM_read_bio_DHparamsrW   rl   r   r  rV  r   r  )r~   r4  r  r\  r]   r]   r^   load_pem_parameters  s   

zBackend.load_pem_parametersc                 C   s:   |  |}| ||}|r| ||S | | jj|||S r   )r8  "_evp_pkey_from_der_traditional_keyr]  r  rn   d2i_PKCS8PrivateKey_bio)r~   r4  rA  r  r?  r   r]   r]   r^   rN    s   

zBackend.load_der_private_keyc                 C   sR   | j |j| jj}|| jjkr#| j|| j j}|d ur!td|S |   d S )N4Password was given but private key is not encrypted.)	rn   d2i_PrivateKey_biorW   rl   r   r  r.  	TypeErrorr   )r~   r?  rA  r   r]   r]   r^   r    s   z*Backend._evp_pkey_from_der_traditional_keyc                 C   s   |  |}| j|j| jj}|| jjkr#| j|| jj}| |S | 	  | j
|j}| |dk | j|j| jj}|| jjkrY| j|| jj}| |}t| ||S |   d S r   )r8  rn   d2i_PUBKEY_biorW   rl   r   r  r.  r`  r   r  r   d2i_RSAPublicKey_bior  r  r    r  )r~   r4  r  r  r   r  r]   r]   r^   r_    s    



zBackend.load_der_public_keyc                 C   s   |  |}| j|j| jj}|| jjkr#| j|| jj}t| |S | jj	rW| 
  | j|j}| |dk | j|j| jj}|| jjkrW| j|| jj}t| |S |   d S r   )r8  rn   d2i_DHparams_biorW   rl   r   r  rV  r   rz   r   r  r   d2i_DHxparams_bior  )r~   r4  r  r\  r   r]   r]   r^   load_der_parameters1  s   


zBackend.load_der_parameterscertc                 C   T   | tjj}| |}| j|j| jj	}| 
|| jj	k | j|| jj}|S r   )public_bytesr'   EncodingDERr8  rn   d2i_X509_biorW   rl   r   r   r  	X509_free)r~   r  r4  r  r   r]   r]   r^   
_cert2osslC     
zBackend._cert2osslr   c                 C   s4   |   }| j||}| |dk t| |S r   )r<  rn   i2d_X509_bior   	rust_x509load_der_x509_certificater@  )r~   r   rW   r   r]   r]   r^   
_ossl2certK  s   zBackend._ossl2certcsrc                 C   r  r   )r  r'   r  r  r8  rn   d2i_X509_REQ_biorW   rl   r   r   r  X509_REQ_free)r~   r  r4  r  x509_reqr]   r]   r^   	_csr2osslQ  r  zBackend._csr2osslcrlc                 C   r  r   )r  r'   r  r  r8  rn   d2i_X509_CRL_biorW   rl   r   r   r  X509_CRL_free)r~   r  r4  r  x509_crlr]   r]   r^   	_crl2osslY  r  zBackend._crl2ossl
public_keyc                 C   sJ   t |tttfstd| |}| j||j}|dkr#| 	  dS dS )NzGExpecting one of DSAPublicKey, RSAPublicKey, or EllipticCurvePublicKey.rh   FT)
r   r   r    r   r  r  rn   X509_CRL_verify	_evp_pkeyr   )r~   r  r  r  r   r]   r]   r^   _crl_is_signature_valida  s    
zBackend._crl_is_signature_validc                 C   s`   |  |}| j|}| || jjk | j|| jj}| j||}|dkr.| 	  dS dS )Nrh   FT)
r  rn   X509_REQ_get_pubkeyr   rl   r   r  r.  X509_REQ_verifyr   )r~   r  r  pkeyr   r]   r]   r^   _csr_is_signature_valid{  s   
zBackend._csr_is_signature_validc                 C   s"   | j |j|jdkrtdd S )Nrh   zKeys do not correspond)rn   EVP_PKEY_cmpr  r   )r~   key1key2r]   r]   r^   _check_keys_correspond  s   zBackend._check_keys_correspondc           	      C   s  |  |}| jd}|d ur#td| | j|}||_t||_||j	| jj
| j| jjd|}|| jj
kra|jdkr]|   |jdkrLtd|jdksSJ td|jd	 |   | j|| jj}|d urw|jdkrwtd
|d ur|jd	ks|d u sJ | ||S )Nr  rA  r  r   z3Password was not given but private key is encryptedzAPasswords longer than {} bytes are not supported by this backend.rh   r  )r8  rl   r   r   _check_bytesliker   rA  r   r   rW   r   r  rn   r  errorr   r  r   r   maxsizer  r  r.  calledr]  )	r~   openssl_read_funcr4  rA  r  r  r  password_ptrr  r]   r]   r^   r    sT   

	

zBackend._load_keyc                    s      }|s
td|d  jj jjs2|d  jj jjs2 jjr6|d  jj	 jj
r6tdt fdd|D rEtdt|}td|)Nz|Could not deserialize key data. The data may be in an incorrect format or it may be encrypted with an unsupported algorithm.r   z Bad decrypt. Incorrect password?c                 3   s$    | ]}|  jj jjV  qd S r   )_lib_reason_matchrn   ERR_LIB_EVP'EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM).0r  r}   r]   r^   	<genexpr>  s    
z4Backend._handle_key_loading_error.<locals>.<genexpr>z!Unsupported public key algorithm.zCould not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).)r   r   r  rn   r  EVP_R_BAD_DECRYPTERR_LIB_PKCS12!PKCS12_R_PKCS12_CIPHERFINAL_ERRORCryptography_HAS_PROVIDERSERR_LIB_PROVPROV_R_BAD_DECRYPTanyr%   _errors_with_text)r~   r   errors_with_textr]   r}   r^   r    s>   	

z!Backend._handle_key_loading_errorcurvec                 C   sp   z|  |}W n ty   | jj}Y nw | j|}|| jjkr'|   dS | || jjk | j	| dS )NFT)
_elliptic_curve_to_nidr   rn   	NID_undefEC_GROUP_new_by_curve_namerl   r   r   r   EC_GROUP_free)r~   r  	curve_nidgroupr]   r]   r^   elliptic_curve_supported  s   z Backend.elliptic_curve_supportedsignature_algorithmc                 C   s   t |tjsdS | |S r   )r   r+   ECDSAr  )r~   r  r  r]   r]   r^   ,elliptic_curve_signature_algorithm_supported  s   
z4Backend.elliptic_curve_signature_algorithm_supportedc                 C   sX   |  |r"| |}| j|}| |dk | |}t| ||S td|j	t
j)z@
        Generate a new private key on the named curve.
        rh   z#Backend object does not support {}.)r  _ec_key_new_by_curvern   EC_KEY_generate_keyr   _ec_cdata_to_evp_pkeyr   r   r   r   r   UNSUPPORTED_ELLIPTIC_CURVE)r~   r  r[  r   r  r]   r]   r^   #generate_elliptic_curve_private_key  s   



z+Backend.generate_elliptic_curve_private_keyc                 C   sz   |j }| |j}| j| |j| jj}| j	||}|dkr)| 
  td| ||j|j | |}t| ||S )Nrh   Invalid EC key.)r%  r  r  rl   r  r  private_valuern   BN_clear_freeEC_KEY_set_private_keyr   r   )_ec_key_set_public_key_affine_coordinatesr  r~  r  r   )r~   r  publicr[  r  r   r  r]   r]   r^   #load_elliptic_curve_private_numbers"  s   

z+Backend.load_elliptic_curve_private_numbersc                 C   s4   |  |j}| ||j|j | |}t| ||S r   )r  r  r  r  r~  r  r   )r~   r  r[  r  r]   r]   r^   "load_elliptic_curve_public_numbers9  s   

z*Backend.load_elliptic_curve_public_numberspoint_bytesc           	      C   s   |  |}| j|}| || jjk | j|}| || jjk | j|| jj}| 	  }| j
|||t||}|dkrI|   tdW d    n1 sSw   Y  | j||}| |dk | |}t| ||S )Nrh   z(Invalid public bytes for the given curve)r  rn   EC_KEY_get0_groupr   rl   r   EC_POINT_newr  EC_POINT_free_tmp_bn_ctxEC_POINT_oct2pointr   r   r   EC_KEY_set_public_keyr  r   )	r~   r  r  r[  r  pointbn_ctxr   r  r]   r]   r^    load_elliptic_curve_public_bytesD  s&   


z(Backend.load_elliptic_curve_public_bytesr  c              	   C   sb  |  |}| |\}}| j|}| || jjk | j|| jj}| 	|}| j|| jj
}|  >}| j|||| jj| jj|}	| |	dk | j|}
| j|}||||
||}	|	dkrm|   tdW d    n1 sww   Y  | j||}	| |	dk | 	|}| j|| jj
}| j||}	| |	dk | |}t| ||S )Nrh   z'Unable to derive key from private_value)r   _ec_key_determine_group_get_funcrn   r  r   rl   r   r  r  r  r  r  EC_POINT_mul
BN_CTX_getr   r   r  r  r  r   )r~   r  r  r[  get_funcr  r  valuer  r   bn_xbn_yprivater  r]   r]   r^   !derive_elliptic_curve_private_keyZ  s8   




z)Backend.derive_elliptic_curve_private_keyc                 C   rt  r   )r  _ec_key_new_by_curve_nid)r~   r  r  r]   r]   r^   r    s   

zBackend._ec_key_new_by_curver  c                 C   s0   | j |}| || jjk | j|| j jS r   )rn   EC_KEY_new_by_curve_namer   rl   r   r  rT  )r~   r  r[  r]   r]   r^   r	    s   z Backend._ec_key_new_by_curve_nidc                 C   s,   | j rt|| jsdS | |ot|tjS r   )rp   r   _fips_ecdh_curvesr  r+   ECDH)r~   r   r  r]   r]   r^   +elliptic_curve_exchange_algorithm_supported  s   z3Backend.elliptic_curve_exchange_algorithm_supportedc                 C   r1  r   )r0  rn   EVP_PKEY_set1_EC_KEYr   )r~   r[  r  r   r]   r]   r^   r    r3  zBackend._ec_cdata_to_evp_pkeyc                 C   sN   ddd}| |j|j}| j| }|| jjkr%td|jtj	|S )z/
        Get the NID for a curve name.
        
prime192v1
prime256v1)	secp192r1	secp256r1z${} is not a supported elliptic curve)
getr   rn   
OBJ_sn2nidr   r  r   r   r   r  )r~   r  curve_aliases
curve_namer  r]   r]   r^   r    s   

zBackend._elliptic_curve_to_nidc              	   c   sd    | j  }| || jjk | j|| j j}| j | z|V  W | j | d S | j | w r   )	rn   
BN_CTX_newr   rl   r   r  BN_CTX_freeBN_CTX_start
BN_CTX_end)r~   r  r]   r]   r^   r    s   
zBackend._tmp_bn_ctxc                 C   s   |  || jjk | jd}|  || jjk | j|}|  || jjk | j|}|  || jjk | j|}|  || jjk ||krR| jj	rR| jj
}n| jj}|sZJ ||fS )zu
        Given an EC_KEY determine the group and what function is required to
        get point coordinates.
        s   characteristic-two-field)r   rl   r   rn   r  r  r  EC_GROUP_method_ofEC_METHOD_get_field_typeCryptography_HAS_EC2M$EC_POINT_get_affine_coordinates_GF2m#EC_POINT_get_affine_coordinates_GFp)r~   rl  nid_two_fieldr  methodnidr  r]   r]   r^   r     s   
z(Backend._ec_key_determine_group_get_funcr  r~  c                 C   st   |dk s|dk rt d| j| || jj}| j| || jj}| j|||}|dkr8|   t ddS )zg
        Sets the public key point in the EC_KEY context to the affine x and y
        values.
        r   z2Invalid EC key. Both x and y must be non-negative.rh   r  N)r   rl   r  r  rn   r  (EC_KEY_set_public_key_affine_coordinatesr   )r~   rl  r  r~  r   r]   r]   r^   r    s   z1Backend._ec_key_set_public_key_affine_coordinatesencodingr   encryption_algorithmc           
      C   sN  t |tjs
tdt |tjstdt |tjstdt |tjr'd}n4t |tjr;|j}t	|dkr:t
dn t |tjrW|j|  u rNtjju rWn t
d|j}nt
d|tjju r|tjju rl| jj}n|tjju rw| jj}nt
d| |||S |tjju r
| jrt |tjst
d	| j|}	|tjju r|	| jjkr| jj}n|	| jjkr| jj}n|	| jjkr| jj}nt
d
| |||S |tjju r|rt
d|	| jjkr| jj}n|	| jjkr| jj}n|	| jjkr| jj }nt
d
| !||S t
d|tjju r#|tjju rt"#|||S t
dt
d)N/encoding must be an item from the Encoding enumz2format must be an item from the PrivateFormat enumzBEncryption algorithm must be a KeySerializationEncryption instance    i  zBPasswords longer than 1023 bytes are not supported by this backendzUnsupported encryption typezUnsupported encoding for PKCS8zCEncrypted traditional OpenSSL format is not supported in FIPS mode.z+Unsupported key type for TraditionalOpenSSLzDEncryption is not supported for DER encoded traditional OpenSSL keysz+Unsupported encoding for TraditionalOpenSSLz=OpenSSH private key format can only be used with PEM encodingformat is invalid with this key)$r   r'   r  r  PrivateFormatKeySerializationEncryptionNoEncryptionBestAvailableEncryptionrA  r   r   _KeySerializationEncryption_formatOpenSSHPKCS8PEMrn   PEM_write_bio_PKCS8PrivateKeyr  i2d_PKCS8PrivateKey_bio_private_key_bytes_via_bioTraditionalOpenSSLrp   rF  rG  PEM_write_bio_RSAPrivateKeyrO  PEM_write_bio_DSAPrivateKeyrR  PEM_write_bio_ECPrivateKeyrM  i2d_ECPrivateKey_bioi2d_DSAPrivateKey_bio_bio_func_outputrP   _serialize_ssh_private_key)
r~   r$  r   r%  r   r  cdatarA  	write_biorY  r]   r]   r^   _private_key_bytes  s   









zBackend._private_key_bytesc              	   C   s<   |s| j j}n| jd}| ||||t|| j j| j jS )Ns   aes-256-cbc)rl   r   rn   EVP_get_cipherbynamer;  r   )r~   r>  r  rA  r   r]   r]   r^   r4  `  s   
z"Backend._private_key_bytes_via_bioc                 G   s0   |   }||g|R  }| |dk | |S r   )r<  r   r@  )r~   r>  argsrW   r   r]   r]   r^   r;  q  s   
zBackend._bio_func_outputc                 C   s  t |tjs
tdt |tjstd|tjju r:|tjju r%| jj}n|tjj	u r0| jj
}ntd| ||S |tjju rp| j|}|| jjkrPtd|tjju r[| jj}n|tjj	u rf| jj}ntd| ||S |tjju r|tjju rt|S tdtd)Nr&  z1format must be an item from the PublicFormat enumz8SubjectPublicKeyInfo works only with PEM or DER encodingz+PKCS1 format is supported only for RSA keysz)PKCS1 works only with PEM or DER encodingz1OpenSSH format must be used with OpenSSH encodingr(  )r   r'   r  r  PublicFormatSubjectPublicKeyInfor1  rn   PEM_write_bio_PUBKEYr  i2d_PUBKEY_bior   r;  PKCS1rF  rG  PEM_write_bio_RSAPublicKeyr^  r/  rP   serialize_ssh_public_key)r~   r$  r   r   r  r=  r>  rY  r]   r]   r^   _public_key_bytesw  s@   




zBackend._public_key_bytesc                 C   
   | j j S r   rn   rK  r}   r]   r]   r^   dh_supported  r   zBackend.dh_supported	generatorc                 C   s   |t jk rtdt j|dvrtd| j }| || jjk | j	|| jj
}| j|||| jj}|dkrD|  }td|t| |S )Nz$DH key_size must be at least {} bits)      zDH generator must be 2 or 5rh   z Unable to generate DH parameters)r)   _MIN_MODULUS_SIZEr   r   rn   DH_newr   rl   r   r  rV  DH_generate_parameters_exr   r   )r~   rM  r  dh_param_cdatar   r   r]   r]   r^   generate_dh_parameters  s$   



zBackend.generate_dh_parametersc                 C   r1  r   )r0  rn   EVP_PKEY_set1_DHr   )r~   r\  r  r   r]   r]   r^   _dh_cdata_to_evp_pkey  r3  zBackend._dh_cdata_to_evp_pkeyc                 C   s<   t |j| }| j|}| |dk | |}t| ||S r   )r   	_dh_cdatarn   DH_generate_keyr   rV  r   )r~   rn  dh_key_cdatar   r  r]   r]   r^   generate_dh_private_key  s   
zBackend.generate_dh_private_keyc                 C   s   |  | ||S r   )rZ  rT  )r~   rM  r  r]   r]   r^   &generate_dh_private_key_and_parameters  s   
z.Backend.generate_dh_private_key_and_parametersc                 C   s8  |j j}| j }| || jjk | j|| jj}| 	|j
}| 	|j}|jd ur3| 	|j}n| jj}| 	|j j}| 	|j}| j||||}	| |	dk | j|||}	| |	dk | jdd}
| j||
}	| |	dk |
d dkr|jdkr|
d | jjA dkstd| |}t| ||S )Nrh   int[]r   rN  z.DH private numbers did not pass safety checks.)r%  r}  rn   rQ  r   rl   r   r  rV  r  r  rx  r   r~  r  DH_set0_pqgDH_set0_keyr   DH_checkDH_NOT_SUITABLE_GENERATORr   rV  r   )r~   r  r}  r\  r  rx  r   ry  rz  r   codesr  r]   r]   r^   load_dh_private_numbers  s4   



zBackend.load_dh_private_numbersc           
      C   s   | j  }| || jjk | j|| j j}|j}| |j	}| |j
}|jd ur2| |j}n| jj}| |j}| j ||||}| |dk | j ||| jj}| |dk | |}	t| ||	S r   )rn   rQ  r   rl   r   r  rV  r}  r  r  rx  r   r~  r]  r^  rV  r   )
r~   r  r\  r}  r  rx  r   ry  r   r  r]   r]   r^   load_dh_public_numbers  s    


zBackend.load_dh_public_numbersc                 C   s   | j  }| || jjk | j|| j j}| |j}| |j	}|j
d ur/| |j
}n| jj}| j ||||}| |dk t| |S r   )rn   rQ  r   rl   r   r  rV  r  r  rx  r   r]  r   )r~   r  r\  r  rx  r   r   r]   r]   r^   load_dh_parameter_numbers3  s   


z!Backend.load_dh_parameter_numbersr  rx  r   c                 C   s   | j  }| || jjk | j|| j j}| |}| |}|d ur+| |}n| jj}| j ||||}| |dk | j	dd}| j 
||}| |dk |d dkS )Nrh   r\  r   )rn   rQ  r   rl   r   r  rV  r  r]  r   r_  )r~   r  rx  r   r\  r   ra  r]   r]   r^   dh_parameters_supportedG  s   


zBackend.dh_parameters_supportedc                 C   s   | j jdkS r   )rn   rz   r}   r]   r]   r^   dh_x942_serialization_supported_  r   z'Backend.dh_x942_serialization_supportedc                 C   sh   t |dkr
td|  }| j|| jj}| |dk | j||t |}| |dk t| |S )N    z%An X25519 public key is 32 bytes longrh   )	r   r   r0  rn   EVP_PKEY_set_type
NID_X25519r   EVP_PKEY_set1_tls_encodedpointr$   )r~   r4  r  r   r]   r]   r^   x25519_load_public_bytesb  s   

z Backend.x25519_load_public_bytesc                 C   s   t |dkr
tdd}| d#}||dd< ||dd < | |}| j|j| jj}W d    n1 s7w   Y  | 	|| jjk | j
|| jj}| 	| j|| jjk t| |S )Nrg  z&An X25519 private key is 32 bytes longs   0. 0+en" 0   r      )r   r   _zeroed_bytearrayr8  rn   r  rW   rl   r   r   r  r.  rF  rX  r#   )r~   r4  pkcs8_prefixbarW   r  r]   r]   r^   x25519_load_private_bytesq  s   

z!Backend.x25519_load_private_bytesc                 C   s   | j || jj}| || jjk | j|| j j}| j |}| |dk | jd}| j 	||}| |dk | |d | jjk | j|d | j j
}|S )Nrh   EVP_PKEY **r   )rn   EVP_PKEY_CTX_new_idrl   r   r   r  EVP_PKEY_CTX_freeEVP_PKEY_keygen_initr   EVP_PKEY_keygenr.  )r~   r"  evp_pkey_ctxr   	evp_ppkeyr  r]   r]   r^   _evp_pkey_keygen_gc  s   zBackend._evp_pkey_keygen_gcc                 C      |  | jj}t| |S r   )ry  rn   ri  r#   r/  r]   r]   r^   x25519_generate_key     
zBackend.x25519_generate_keyc                 C   s   | j rdS | jj S r   )rp   rn   rJ  r}   r]   r]   r^   x25519_supported  s   
zBackend.x25519_supportedc                 C   s`   t |dkr
td| j| jj| jj|t |}| || jjk | j|| jj	}t
| |S )N8   z#An X448 public key is 56 bytes long)r   r   rn   EVP_PKEY_new_raw_public_keyNID_X448rl   r   r   r  r.  r"   r~   r4  r  r]   r]   r^   x448_load_public_bytes  s   
zBackend.x448_load_public_bytesc                 C   sl   t |dkr
td| j|}| j| jj| jj|t |}| || jjk | j	|| jj
}t| |S )Nr~  z$An X448 private key is 56 bytes long)r   r   rl   r   rn   EVP_PKEY_new_raw_private_keyr  r   r   r  r.  r!   r~   r4  r7  r  r]   r]   r^   x448_load_private_bytes  s   
zBackend.x448_load_private_bytesc                 C   rz  r   )ry  rn   r  r!   r/  r]   r]   r^   x448_generate_key  r|  zBackend.x448_generate_keyc                 C      | j rdS | jj o| jj S r   )rp   rn   rJ  rK  r}   r]   r]   r^   x448_supported  
   
zBackend.x448_supportedc                 C   s   | j rdS | jjS r   )rp   rn    CRYPTOGRAPHY_HAS_WORKING_ED25519r}   r]   r]   r^   ed25519_supported  s   zBackend.ed25519_supportedc                 C   sn   t d| t|tjkrtd| j| jj| j	j
|t|}| || j	j
k | j	|| jj}t| |S )Nr4  z&An Ed25519 public key is 32 bytes long)r   _check_bytesr   r-   _ED25519_KEY_SIZEr   rn   r  NID_ED25519rl   r   r   r  r.  r   r  r]   r]   r^   ed25519_load_public_bytes  s   
z!Backend.ed25519_load_public_bytesc                 C   sz   t |tjkrtdtd| | j|}| j	| jj
| jj|t |}| || jjk | j|| jj}t| |S )Nz'An Ed25519 private key is 32 bytes longr4  )r   r-   r  r   r   r  rl   r   rn   r  r  r   r   r  r.  r   r  r]   r]   r^   ed25519_load_private_bytes  s   
z"Backend.ed25519_load_private_bytesc                 C   rz  r   )ry  rn   r  r   r/  r]   r]   r^   ed25519_generate_key  r|  zBackend.ed25519_generate_keyc                 C   r  r   )rp   rn   #CRYPTOGRAPHY_OPENSSL_LESS_THAN_111BrK  r}   r]   r]   r^   ed448_supported  r  zBackend.ed448_supportedc                 C   sl   t d| t|tkrtd| j| jj| jj	|t|}| 
|| jj	k | j|| jj}t| |S )Nr4  z$An Ed448 public key is 57 bytes long)r   r  r   r   r   rn   r  	NID_ED448rl   r   r   r  r.  r   r  r]   r]   r^   ed448_load_public_bytes  s   
zBackend.ed448_load_public_bytesc                 C   sx   t d| t|tkrtd| j|}| j| jj	| jj
|t|}| || jj
k | j|| jj}t| |S )Nr4  z%An Ed448 private key is 57 bytes long)r   r  r   r   r   rl   r   rn   r  r  r   r   r  r.  r   r  r]   r]   r^   ed448_load_private_bytes  s   
z Backend.ed448_load_private_bytesc                 C   rz  r   )ry  rn   r  r   r/  r]   r]   r^   ed448_generate_key  r|  zBackend.ed448_generate_keyr&  rc                 C   s   | j d|}| j |}| j|t||t||||tj||
}	|	dkr9|  }
d| | d }t	d
||
| j |d d  S )Nr   rh      i   zJNot enough memory to derive key. These parameters require {} MB of memory.)rl   r   r   rn   EVP_PBE_scryptr   rO   
_MEM_LIMITr   MemoryErrorr   r   )r~   r   r   r   r&  r  r  r   r   r   r   
min_memoryr]   r]   r^   derive_scrypt  s.   	zBackend.derive_scryptc                 C   sH   t |}| jr|| jvrdS |dr| jjdkS | j|| jj	kS )NFs   -sivrh   )
r   _aead_cipher_namerp   
_fips_aeadendswithrn   r   r@  rl   r   )r~   r   cipher_namer]   r]   r^   aead_cipher_supportedA  s   

zBackend.aead_cipher_supportedc              
   c   s2    t |}z|V  W | || dS | || w )z
        This method creates a bytearray, which we copy data into (hopefully
        also from a mutable buffer that can be dynamically erased!), and then
        zero when we're done.
        N)	bytearray
_zero_data)r~   r   rp  r]   r]   r^   rn  O  s
   zBackend._zeroed_bytearrayc                 C   s   t |D ]}d||< qd S r   )range)r~   r4  r   ir]   r]   r^   r  \  s   
zBackend._zero_datac                 c   s~    |du r| j jV  dS t|}| j d|d }| j ||| z|V  W | | j d|| dS | | j d|| w )a  
        This method takes bytes, which can be a bytestring or a mutable
        buffer like a bytearray, and yields a null-terminated version of that
        data. This is required because PKCS12_parse doesn't take a length with
        its password char * and ffi.from_buffer doesn't provide null
        termination. So, to support zeroing the data via bytearray we
        need to build this ridiculous construct that copies the memory, but
        zeroes it after use.
        Nr   rh   z	uint8_t *)rl   r   r   r   memmover  cast)r~   r4  data_lenr   r]   r]   r^   _zeroed_null_terminated_bufc  s   2z#Backend._zeroed_null_terminated_bufc                 C   s2   |  ||}|j|jr|jjnd dd |jD fS )Nc                 S   s   g | ]}|j qS r]   )certificate)r  r  r]   r]   r^   
<listcomp>  s    zABackend.load_key_and_certificates_from_pkcs12.<locals>.<listcomp>)load_pkcs12r   r  r  additional_certs)r~   r4  rA  pkcs12r]   r]   r^   %load_key_and_certificates_from_pkcs12z  s
   z-Backend.load_key_and_certificates_from_pkcs12c                 C   sr  |d ur
t d| | |}| j|j| jj}|| jjkr'|   t	d| j
|| jj}| jd}| jd}| jd}| |}| j|||||}	W d    n1 s\w   Y  |	dkrm|   t	dd }
d }g }|d | jjkr| j
|d | jj}| j|dd	}|d | jjkr| j
|d | jj}| |}d }| j|| jj}|| jjkr| j|}t||}
|d | jjkr3| j
|d | jj}| j|d }| jjs| jjrt|}ntt|}|D ]@}| j||}| || jjk | j
|| jj}| |}d }| j|| jj}|| jjkr*| j|}|t|| qt||
|S )
NrA  z!Could not deserialize PKCS12 datarr  zX509 **zCryptography_STACK_OF_X509 **r   zInvalid password or PKCS12 dataFr  ) r   r  r8  rn   d2i_PKCS12_biorW   rl   r   r   r   r  PKCS12_freer   r  PKCS12_parser.  r]  r  r  X509_alias_get0r   rT   sk_X509_freesk_X509_numr   rK  r  reversedsk_X509_valuer   r{   rU   )r~   r4  rA  rW   p12evp_pkey_ptrx509_ptrsk_x509_ptrpassword_bufr   r  r   additional_certificatesr  r   cert_objr   
maybe_namesk_x509r  indicesr  	addl_cert	addl_namer]   r]   r^   r    sr   





zBackend.load_pkcs12r   casc                 C   s  d }|d urt d| t|tjrd}d}d}	d}
| jj}nt|tjrF| jj	r2| jj
}| jj
}n| jj}| jj}d}	d}
| jj}|j}nst|tjr|jtjju rd}d}d}	d}
|j}|j}|tju ro| jj}| jj}n|tju r| jj	s|td| jj
}| jj
}n|d u sJ |jd ur| jjstd| |j}| || jjk n| jj}|jd ur|j}	ntd|d u st|dkr| jj}nb| j }| j|| jj}g }|D ]O}t|t r|j!}| "|j#}| $|}| j%||d}| |dk W d    n	1 sw   Y  n| "|}|&| | j'||}t(|dk q| $|`}| $|0}|r>| "|n| jj}|d urK|j)}n| jj}| j*||||||||	|
d
}W d    n	1 siw   Y  | jjr|| jjkr| j+||d| jjd|
| W d    n	1 sw   Y  | || jjk | j|| jj,}| - }| j.||}| |dk | /|S )	Nr   r  r   i N  rh   z2PBESv2 is not supported by this version of OpenSSLzBSetting MAC algorithm is not supported by this version of OpenSSL.zUnsupported key encryption type)0r   r  r   r'   r+  rl   r   r,  rn   r   NID_aes_256_cbc&NID_pbe_WithSHA1And3_Key_TripleDES_CBCrA  r-  r.  r)  PKCS12_key_cert_algorithmrS   PBESv1SHA1And3KeyTripleDESCBCPBESv2SHA256AndAES256CBCr   
_hmac_hashCryptography_HAS_PKCS12_SET_MACr   r   _kdf_roundsr   r   sk_X509_new_nullr  r  rT   friendly_namer  r  r  X509_alias_set1r{   sk_X509_pushbackendr  PKCS12_createPKCS12_set_macr  r<  i2d_PKCS12_bior@  )r~   r   r   r  r  r%  rA  nid_certnid_keypkcs12_itermac_itermac_alg
keycertalgr  ossl_cascaca_aliasossl_caca_name_bufr   r  name_buf	ossl_certr  r  rW   r]   r]   r^   (serialize_key_and_certificates_to_pkcs12  s   

	











#
z0Backend.serialize_key_and_certificates_to_pkcs12c                 C   r   r   )rp   rn   Cryptography_HAS_POLY1305r}   r]   r]   r^   poly1305_supportedp	  s   zBackend.poly1305_supportedc                 C   s*   t d| t|tkrtdt| |S )Nr   zA poly1305 key is 32 bytes long)r   r  r   r   r   r   )r~   r   r]   r]   r^   create_poly1305_ctxu	  s   
zBackend.create_poly1305_ctxc                 C   rJ  r   rK  r}   r]   r]   r^   pkcs7_supported|	  r   zBackend.pkcs7_supportedc                 C   sn   t d| | |}| j|j| jj| jj| jj}|| jjkr)|   t	d| j
|| jj}| |S Nr4  zUnable to parse PKCS7 data)r   r  r8  rn   PEM_read_bio_PKCS7rW   rl   r   r   r   r  
PKCS7_free_load_pkcs7_certificatesr~   r4  rW   p7r]   r]   r^   load_pem_pkcs7_certificates	  s   

z#Backend.load_pem_pkcs7_certificatesc                 C   sb   t d| | |}| j|j| jj}|| jjkr#|   t	d| j
|| jj}| |S r  )r   r  r8  rn   d2i_PKCS7_biorW   rl   r   r   r   r  r  r  r  r]   r]   r^   load_der_pkcs7_certificates	  s   

z#Backend.load_der_pkcs7_certificatesc           
      C   s   | j |j}| || j jk || j jkrtd|tj	|j
jj}| j |}g }t|D ]2}| j ||}| || jjk | j |}| |dk | j|| j j}| |}	||	 q0|S )NzNOnly basic signed structures are currently supported. NID for this data was {}rh   )rn   OBJ_obj2nidr   r   r  NID_pkcs7_signedr   r   r   UNSUPPORTED_SERIALIZATIONr!  signr  r  r  r  rl   r   X509_up_refr  r  r  r{   )
r~   r  r"  r  r  certsr  r   r   r  r]   r]   r^   r  	  s(   

z Backend._load_pkcs7_certificatesr   )r   N)rZ   r[   r\   __doc__r   r  r:   r   r&   ra  rb  rc  rd  
SHA512_224
SHA512_256SHA3_224SHA3_256SHA3_384SHA3_512SHAKE128SHAKE256r   r+   	SECP224R1	SECP256R1	SECP384R1	SECP521R1r  _fips_rsa_min_key_size_fips_rsa_min_public_exponent_fips_dsa_min_modulus_fips_dh_min_key_size_fips_dh_min_modulusr   strr   r   typingOptionalListr%   _OpenSSLErrorr   ro   r   r   
contextlibr   r   rw   r   r   r   r   bytesHashAlgorithmr   r   r   r   r   r   r   r   HashContextr   r9   rN   r   r   rr   r   r   r   r   r   r   _OpenSSLErrorWithTextr   r  r  r.   RSAPrivateKeyr  r  RSAPrivateNumbersr*  RSAPublicNumbersRSAPublicKeyr,  r0  r  r8  r<  r@  r6   r]  r7   r`  re  r(   ri  r*   DSAParametersrm  DSAPrivateKeyrs  ru  r{  DSAPrivateNumbersr  DSAPublicNumbersDSAPublicKeyr  DSAParameterNumbersr  rr  r  r  r  r8   r
   r  r  r  r)   DHParametersr  rN  r  r_  r  r   CertificateAnyr  r  CertificateSigningRequestr  CertificateRevocationListr  r5   r  r  r  r  NoReturnr  EllipticCurver  EllipticCurveSignatureAlgorithmr  EllipticCurvePrivateKeyr  EllipticCurvePrivateNumbersr  EllipticCurvePublicNumbersEllipticCurvePublicKeyr  r  r  r  r	  r  r  r  r  r  r   r  r'   r  r)  r*  r?  r4  r;  rB  rI  rL  rT  rV  DHPrivateKeyrZ  r[  DHPrivateNumbersrb  DHPublicNumbersDHPublicKeyrc  DHParameterNumbersrd  re  rf  r0   X25519PublicKeyrk  X25519PrivateKeyrq  ry  r{  r}  r/   X448PublicKeyr  X448PrivateKeyr  r  r  r  r-   Ed25519PublicKeyr  Ed25519PrivateKeyr  r  r  r,   Ed448PublicKeyr  Ed448PrivateKeyr  r  r  r  Iteratorr  rn  r  r  Tupler  rU   r  rQ   rR   r  r  r   r  r  r  r  r  r]   r]   r]   r^   r_      sb   



	

	
	D






	
)

F9





*


4/





'



z
7



0



$#

K
 

r_   c                   @   s0   e Zd ZdefddZdededefddZd	S )
r   fmtc                 C   s
   || _ d S r   )_fmt)r~   r:  r]   r]   r^   r   	  r   zGetCipherByName.__init__r  r   r   c                 C   sd   | j j||d }|j|d}||jjkr,|jjr,|j	|jj|d|jj}|
  |S )N)r   r   r   )r;  r   lowerrn   r@  r   rl   r   Cryptography_HAS_300_EVP_CIPHEREVP_CIPHER_fetchr   )r~   r  r   r   r  r   r]   r]   r^   __call__	  s   
zGetCipherByName.__call__N)	rZ   r[   r\   r  r   r_   r9   rN   r?  r]   r]   r]   r^   r   	  s    r   r  r   c                 C   s"   d |jd }| j|dS )Nz
aes-{}-xtsrN  r   )r   r  rn   r@  r   )r  r   r   r  r]   r]   r^   r   	  s   r   ){collectionsr  r   r  rt   r   cryptographyr   r   cryptography.exceptionsr   r   $cryptography.hazmat.backends.opensslr   ,cryptography.hazmat.backends.openssl.ciphersr   )cryptography.hazmat.backends.openssl.cmacr
   'cryptography.hazmat.backends.openssl.dhr   r   r   r   (cryptography.hazmat.backends.openssl.dsar   r   r   'cryptography.hazmat.backends.openssl.ecr   r   *cryptography.hazmat.backends.openssl.ed448r   r   r   ,cryptography.hazmat.backends.openssl.ed25519r   r   +cryptography.hazmat.backends.openssl.hashesr   )cryptography.hazmat.backends.openssl.hmacr   -cryptography.hazmat.backends.openssl.poly1305r   r   (cryptography.hazmat.backends.openssl.rsar   r    )cryptography.hazmat.backends.openssl.x448r!   r"   +cryptography.hazmat.backends.openssl.x25519r#   r$   "cryptography.hazmat.bindings._rustr  $cryptography.hazmat.bindings.opensslr%   cryptography.hazmat.primitivesr&   r'   *cryptography.hazmat.primitives._asymmetricr(   )cryptography.hazmat.primitives.asymmetricr)   r*   r+   r,   r-   r.   r/   r0   1cryptography.hazmat.primitives.asymmetric.paddingr1   r2   r3   r4   /cryptography.hazmat.primitives.asymmetric.typesr5   r6   r7   &cryptography.hazmat.primitives.ciphersr8   r9   1cryptography.hazmat.primitives.ciphers.algorithmsr:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   ,cryptography.hazmat.primitives.ciphers.modesrF   rG   rH   rI   rJ   rK   rL   rM   rN   "cryptography.hazmat.primitives.kdfrO   ,cryptography.hazmat.primitives.serializationrP   3cryptography.hazmat.primitives.serialization.pkcs12rQ   rR   rS   rT   rU   
namedtuplerV   rY   r_   r   r   r  r]   r]   r]   r^   <module>   sv   (
8,                  B
