o
    ei                    @  s
  d dl m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 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" d dl#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ d dl,m-Z-m.Z.m/Z/m0Z0 d dl1m2Z2m3Z3 d dl4m5Z5m6Z6 d dl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZC d dlDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZM d dlNmOZO d dlPmQZQmRZRmSZSmTZTmUZU eVdddgZWG dd dZXG dd dZYG dd dZZd%d#d$Z[eY Z\dS )&    )annotationsN)contextmanager)utilsx509)UnsupportedAlgorithm_Reasons)aead)_CipherContext_CMACContext)_EllipticCurvePrivateKey_EllipticCurvePublicKey)_RSAPrivateKey_RSAPublicKey)openssl)binding)hashesserialization)AsymmetricPadding)dhdsaeced448ed25519rsax448x25519)MGF1OAEPPSSPKCS1v15)PrivateKeyTypesPublicKeyTypes)BlockCipherAlgorithmCipherAlgorithm)AESAES128AES256ARC4SM4CamelliaChaCha20	TripleDES_BlowfishInternal_CAST5Internal_IDEAInternal_SEEDInternal)	CBCCFBCFB8CTRECBGCMOFBXTSMode)ssh)PBESPKCS12CertificatePKCS12KeyAndCertificatesPKCS12PrivateKeyTypes_PKCS12CATypes
_MemoryBIObiochar_ptrc                   @  s   e Zd ZdS )_RC2N)__name__
__module____qualname__ rG   rG   _/var/www/html/venv/lib/python3.10/site-packages/cryptography/hazmat/backends/openssl/backend.pyrC   \   s    rC   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 dId	d
Z!dJddZ"	dKdLddZ#dIddZ$dJddZ%dMddZ&dNddZ'dNd d!Z(dOd"d#Z)dOd$d%Z*dPd&d'Z+dOd(d)Z,dQd.d/Z-dId0d1Z.dId2d3Z/dRd5d6Z0dRd7d8Z1dOd9d:Z2dSd<d=Z3dMd>d?Z4dTdAdBZ5dUdFdGZ6dVdHdIZ7dWdMdNZ8dXdQdRZ9dSdT Z:dUdV Z;dYdZd[Z<d\d] Z=dZd^d_Z>d[dadbZ?d\dddeZ@dOdfdgZAd]djdkZBd]dldmZCd^dodpZDd_dsdtZEd`dudvZFdadxdyZGdbd|d}ZHdcddZIdPddZJdOddZKdPddZLddddZMdeddZNdfddZOdgddZPdeddZQdd ZRdfddZSdgddZTdhddZUdiddZVdjddZWdkddZXdlddZYdmddZZdnddZ[doddZ\dpddZ]dqddZ^drddZ_dsddĄZ`dtddƄZaduddɄZbdvdd̄Zcdd΄ ZddwddЄZeefdd҄ ZgdxddքZhdyddބZidZddZjdZddZkdzddZldPddZmd{ddZnd|ddZod}ddZpd~ddZqdddZrdddZs	dKdddZtdPd dZudddZvdddZwddd	ZxdPd
dZydddZzdddZ{dddZ|dPddZ}dPddZ~dddZdddZdddZdPd d!Zdd#d$Zdd&d'Zdd(d)ZdPd*d+Zdd-d.Zejfd/d0 Zdd2d3Zdd5d6Zdd<d=ZdPd>d?ZdPd@dAZddCdDZddEdFZddGdHZdS (  Backendz)
    OpenSSL API binding interfaces.
    r   >      aes-128-ccm   aes-128-gcm   aes-192-ccm   aes-192-gcm   aes-256-ccm   aes-256-gcm   i     returnNonec                 C  sb   t  | _| jj| _| jj| _t | _	i | _
|   | jjg| _| jjr/| j| jj d S d S N)r   Binding_bindingffi_ffilib_librust_opensslis_fips_enabled_fips_enabled_cipher_registry_register_default_ciphersEVP_PKEY_DH	_dh_typesCryptography_HAS_EVP_PKEY_DHXappendEVP_PKEY_DHXselfrG   rG   rH   __init__   s   



zBackend.__init__strc                 C  s   d |  | j| jjS )Nz3<OpenSSLBackend(version: {}, FIPS: {}, Legacy: {})>)formatopenssl_version_textr]   rV   _legacy_provider_loadedre   rG   rG   rH   __repr__   s
   zBackend.__repr__Nokboolerrors7typing.Optional[typing.List[rust_openssl.OpenSSLError]]c                 C  s   t j| j||dS )N)ro   )r   _openssl_assertrZ   )rf   rm   ro   rG   rG   rH   openssl_assert   s   zBackend.openssl_assertc                 C  s$   | j   t sJ t | _d S rT   )rV   _enable_fipsr[   r\   r]   re   rG   rG   rH   rs      s   
zBackend._enable_fipsc                 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
        ascii)rX   stringrZ   OpenSSL_versionOPENSSL_VERSIONdecodere   rG   rG   rH   rj      s
   zBackend.openssl_version_textintc                 C  s
   | j  S rT   )rZ   OpenSSL_version_numre   rG   rG   rH   openssl_version_number      
zBackend.openssl_version_number	algorithmhashes.HashAlgorithmc                 C  sL   |j dks
|j dkrd|j |jd d}n|j d}| j|}|S )Nblake2bblake2sz{}{}   rt   )nameri   digest_sizeencoderZ   EVP_get_digestbyname)rf   r}   algevp_mdrG   rG   rH   _evp_md_from_algorithm   s   zBackend._evp_md_from_algorithmc                 C  s    |  |}| || jjk |S rT   )r   rr   rX   NULLrf   r}   r   rG   rG   rH   _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)r]   
isinstance_fips_hashesr   rX   r   r   rG   rG   rH   hash_supported   s   
zBackend.hash_supportedc                 C      | j rt|tjrdS | |S r   r]   r   r   SHA1r   rf   r}   rG   rG   rH   signature_hash_supported   s   
z Backend.signature_hash_supportedc                 C     | j rdS | jjdkS NFrQ   )r]   rZ   Cryptography_HAS_SCRYPTre   rG   rG   rH   scrypt_supported   s   zBackend.scrypt_supportedc                 C  r   )NTr   r   rG   rG   rH   hmac_supported   s   
zBackend.hmac_supportedcipherr$   moder9   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   )r]   r   _fips_ciphersr^   typeKeyErrorrX   r   )rf   r   r   adapter
evp_cipherrG   rG   rH   cipher_supported   s   zBackend.cipher_supportedc                 C  s0   ||f| j v rtd|||| j ||f< d S )Nz"Duplicate registration for: {} {}.)r^   
ValueErrorri   )rf   
cipher_clsmode_clsr   rG   rG   rH   register_cipher_adapter   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'   r1   r4   r5   r7   r2   r3   r6   r   GetCipherByNamer*   r,   r+   r   r8   _get_xts_cipherr)   rV   rk   rZ   #CRYPTOGRAPHY_OPENSSL_300_OR_GREATERr-   r0   	itertoolsproductr.   r/   r(   rC   )rf   r   r   rG   rG   rH   r_     s~   



z!Backend._register_default_ciphersr	   c                 C     t | ||t jS rT   )r	   _ENCRYPTrf   r   r   rG   rG   rH   create_symmetric_encryption_ctxL     z'Backend.create_symmetric_encryption_ctxc                 C  r   rT   )r	   _DECRYPTr   rG   rG   rH   create_symmetric_decryption_ctxQ  r   z'Backend.create_symmetric_decryption_ctxc                 C  s
   |  |S rT   )r   r   rG   rG   rH   pbkdf2_hmac_supportedV  r|   zBackend.pbkdf2_hmac_supported&typing.List[rust_openssl.OpenSSLError]c                 C  s   t  S rT   )r[   capture_error_stackre   rG   rG   rH   _consume_errorsY  s   zBackend._consume_errorsc                 C  sz   || j jksJ | | j|  | j|}| j d|}| j||}| |dk t	| j 
|d | d}|S )Nzunsigned char[]r   big)rX   r   rr   rZ   BN_is_negativeBN_num_bytesnew	BN_bn2binry   
from_bytesbuffer)rf   bnbn_num_bytesbin_ptrbin_lenvalrG   rG   rH   
_bn_to_int\  s   zBackend._bn_to_intnumc                 C  sJ   | t| d d d}| j|t|| jj}| || 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.
        g       @rQ   r   )	to_bytesry   
bit_lengthrZ   	BN_bin2bnlenrX   r   rr   )rf   r   binarybn_ptrrG   rG   rH   
_int_to_bnh  s   zBackend._int_to_bnpublic_exponentkey_sizersa.RSAPrivateKeyc                 C  s   t || | j }| || jjk | j|| jj}| 	|}| j|| jj
}| j|||| jj}| |dk | |}t| ||ddS )NrQ   Tunsafe_skip_rsa_key_validation)r   _verify_rsa_parametersrZ   RSA_newrr   rX   r   gcRSA_freer   BN_freeRSA_generate_key_ex_rsa_cdata_to_evp_pkeyr   )rf   r   r   	rsa_cdatar   resevp_pkeyrG   rG   rH   generate_rsa_private_keyt  s   


z Backend.generate_rsa_private_keyc                 C  s   |dko|d@ dko|dkS )N   rQ   r   i   rG   )rf   r   r   rG   rG   rH   !generate_rsa_parameters_supported  s
   
z)Backend.generate_rsa_parameters_supportednumbersrsa.RSAPrivateNumbersr   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 )NrQ   r   )r   _check_private_key_componentspqddmp1dmq1iqmppublic_numbersenrZ   r   rr   rX   r   r   r   r   RSA_set0_factorsRSA_set0_keyRSA_set0_crt_paramsr   r   )rf   r   r   r   r   r   r   r   r   r   r   r   r   r   rG   rG   rH   load_rsa_private_numbers  sD   


z Backend.load_rsa_private_numbersrsa.RSAPublicNumbersrsa.RSAPublicKeyc                 C  s   t |j|j | j }| || jjk | j	|| jj
}| |j}| |j}| j|||| jj}| |dk | |}t| ||S NrQ   )r   _check_public_key_componentsr   r   rZ   r   rr   rX   r   r   r   r   r   r   r   )rf   r   r   r   r   r   r   rG   rG   rH   load_rsa_public_numbers  s   

zBackend.load_rsa_public_numbersc                 C  s2   | j  }| || jjk | j|| j j}|S rT   )rZ   EVP_PKEY_newrr   rX   r   r   EVP_PKEY_free)rf   r   rG   rG   rH   _create_evp_pkey_gc  s   
zBackend._create_evp_pkey_gcc                 C  (   |   }| j||}| |dk |S r   )r   rZ   EVP_PKEY_set1_RSArr   )rf   r   r   r   rG   rG   rH   r        zBackend._rsa_cdata_to_evp_pkeydatabytesr@   c                 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.
        )
rX   from_bufferrZ   BIO_new_mem_bufr   rr   r   r@   r   BIO_free)rf   r   data_ptrrA   rG   rG   rH   _bytes_to_bio  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.
        )rZ   	BIO_s_memrr   rX   r   BIO_newr   r   )rf   
bio_methodrA   rG   rG   rH   _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)rX   r   rZ   BIO_get_mem_datarr   r   r   )rf   rA   bufbuf_lenbio_datarG   rG   rH   _read_mem_bio  s   zBackend._read_mem_bior!   c                 C  s,  | 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rtjt| jd|S || j jkr| j |}| || jjk | j|| j j}t| ||S || jv rtjt| jd|S |t| j ddkrtjt| jd|S |t| j ddkrtj t| jd|S || j j!krtj"t| jd|S |t| j ddkrtj#t| jd|S t$d	)
zd
        Return the appropriate type of PrivateKey given an evp_pkey cdata
        pointer.
        r   rQ   N)passwordr   	uintptr_tEVP_PKEY_ED25519EVP_PKEY_X448EVP_PKEY_ED448Unsupported key type.)%rZ   EVP_PKEY_idEVP_PKEY_RSAEVP_PKEY_get1_RSArr   rX   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_DSAr[   r   private_key_from_ptrry   castEVP_PKEY_ECEVP_PKEY_get1_EC_KEYEC_KEY_freer   ra   r   getattrr   r   EVP_PKEY_X25519r   r   r   )rf   r   r   key_typer   rA   r   ec_cdatarG   rG   rH   _evp_pkey_to_private_key  sv   	
z Backend._evp_pkey_to_private_keyr"   c                 C  s.  | 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rtjt| jd|S || j jkr| j |}|| jjkr|  }td|| j|| j j}t| ||S || jv rtjt| jd|S |t | j ddkrtj!t| jd|S |t | j ddkrtj"t| jd|S || j j#krtj$t| jd|S |t | j ddkrtj%t| jd|S t&d)	zc
        Return the appropriate type of PublicKey given an evp_pkey cdata
        pointer.
        rQ   r  zUnable to load EC keyr  Nr  r  r  )'rZ   r  r  r  rr   rX   r   r   r   r   r  r  r  r  r  i2d_RSAPublicKey_bioload_der_public_keyr
  r  r[   r   public_key_from_ptrry   r  r  r  r   r   r  r   ra   r   r   r   r   r!  r   r   r   )rf   r   r"  r   rA   r   r#  ro   rG   rG   rH   _evp_pkey_to_public_keyG  sh   

zBackend._evp_pkey_to_public_keyc                 C  s4   | j rt|tjrdS t|tjtjtjtjtjfS r   )r]   r   r   r   SHA224SHA256SHA384SHA512r   rG   rG   rH   _oaep_hash_supported  s   zBackend._oaep_hash_supportedpaddingr   c                 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   r    r   _mgfr   r]   
_algorithmr   r   r   r   r-  rf   r.  rG   rG   rH   rsa_padding_supported  s   


zBackend.rsa_padding_supportedc                 C  s   | j r
t|tr
dS | |S r   )r]   r   r    r2  r1  rG   rG   rH   rsa_encryption_supported  s   
z Backend.rsa_encryption_supporteddsa.DSAParametersc                 C  s   |dvrt dtj|S )N)i   rP   i   i   z0Key size must be 1024, 2048, 3072, or 4096 bits.)r   r[   r   generate_parameters)rf   r   rG   rG   rH   generate_dsa_parameters  s
   zBackend.generate_dsa_parameters
parametersdsa.DSAPrivateKeyc                 C     |  S rT   generate_private_keyrf   r7  rG   rG   rH   generate_dsa_private_key     z Backend.generate_dsa_private_keyc                 C     |  |}| |S rT   )r6  r=  )rf   r   r7  rG   rG   rH   'generate_dsa_private_key_and_parameters  s   

z/Backend.generate_dsa_private_key_and_parametersdsa.DSAPrivateNumbersc                 C     t | tj |S rT   )r   _check_dsa_private_numbersr[   from_private_numbersrf   r   rG   rG   rH   load_dsa_private_numbers     
z Backend.load_dsa_private_numbersdsa.DSAPublicNumbersdsa.DSAPublicKeyc                 C  s   t |j tj |S rT   )r   _check_dsa_parametersparameter_numbersr[   from_public_numbersrE  rG   rG   rH   load_dsa_public_numbers  s   zBackend.load_dsa_public_numbersdsa.DSAParameterNumbersc                 C  rB  rT   )r   rJ  r[   from_parameter_numbersrE  rG   rG   rH   load_dsa_parameter_numbers  rG  z"Backend.load_dsa_parameter_numbersc                 C  s   | j j o| j S rT   )rZ   r  r]   re   rG   rG   rH   dsa_supported  s   zBackend.dsa_supportedc                 C  s   |   sdS | |S r   )rQ  r   r   rG   rG   rH   dsa_hash_supported  s   
zBackend.dsa_hash_supportedc                 C  s   |  |td|j S )N    )r   r1   
block_sizer   rG   rG   rH   cmac_algorithm_supported  s   z Backend.cmac_algorithm_supportedr#   r   c                 C  s
   t | |S rT   r
   r   rG   rG   rH   create_cmac_ctx  r|   zBackend.create_cmac_ctxr  typing.Optional[bytes]c                 C  s   |  | jj|||S rT   )	_load_keyrZ   PEM_read_bio_PrivateKey)rf   r   r  r   rG   rG   rH   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_cbrQ   )r  rX   r   rZ   PEM_read_bio_PUBKEYrA   r   	addressof_original_libr   r   r(  r   	BIO_resetrr   PEM_read_bio_RSAPublicKeyr   r   r   _handle_key_loading_error)rf   r   mem_biouserdatar   r   r   rG   rG   rH   load_pem_public_key  s:   


zBackend.load_pem_public_keydh.DHParametersc                 C     t j|S rT   )r[   r   from_pem_parametersrf   r   rG   rG   rH   load_pem_parameters     zBackend.load_pem_parametersc                 C  s:   |  |}| ||}|r| ||S | | jj|||S rT   )r  "_evp_pkey_from_der_traditional_keyr$  rX  rZ   d2i_PKCS8PrivateKey_bio)rf   r   r  r   r	  keyrG   rG   rH   r    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.)	rZ   d2i_PrivateKey_biorA   rX   r   r   r   	TypeErrorr   )rf   r	  r  rn  rG   rG   rH   rl  9  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   )r  rZ   d2i_PUBKEY_biorA   rX   r   r   r   r(  r   r`  rr   d2i_RSAPublicKey_bior   r   r   rb  )rf   r   rc  r   r   r   rG   rG   rH   r&  G  s    



zBackend.load_der_public_keyc                 C  rg  rT   )r[   r   from_der_parametersri  rG   rG   rH   load_der_parameters^  rk  zBackend.load_der_parameterscertx509.Certificate
typing.Anyc                 C  sT   | tjj}| |}| j|j| jj	}| 
|| jj	k | j|| jj}|S rT   )public_bytesr   EncodingDERr  rZ   d2i_X509_biorA   rX   r   rr   r   	X509_free)rf   rv  r   rc  r   rG   rG   rH   
_cert2ossla  s   
zBackend._cert2osslx509_ptrc                 C  s4   |   }| j||}| |dk t| |S r   )r  rZ   i2d_X509_biorr   r   load_der_x509_certificater
  )rf   r  rA   r   rG   rG   rH   
_ossl2certi  s   zBackend._ossl2certrn  r>   c                 C  s\   | tjjtjjt }| |}| j	|j
| jj}| || jjk | j|| jjS rT   )private_bytesr   rz  r{  PrivateFormatPKCS8NoEncryptionr  rZ   rp  rA   rX   r   rr   r   r   )rf   rn  r   rc  r   rG   rG   rH   	_key2osslo  s   
zBackend._key2osslc           	      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[  r  r\  r   z3Password was not given but private key is encryptedzAPasswords longer than {} bytes are not supported by this backend.rQ   ro  )r  rX   r   r   _check_bytesliker   r  r   lengthrA   r   r^  rZ   r_  errorr   rq  r   ri   maxsizerb  r   r   calledr$  )	rf   openssl_read_funcr   r  r   rc  rd  password_ptrr   rG   rG   rH   rX  ~  sL   

	

zBackend._load_keytyping.NoReturnc                   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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 rT   )_lib_reason_matchrZ   ERR_LIB_EVP'EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM).0r  re   rG   rH   	<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  rZ   r  EVP_R_BAD_DECRYPTERR_LIB_PKCS12!PKCS12_R_PKCS12_CIPHERFINAL_ERRORCryptography_HAS_PROVIDERSERR_LIB_PROVPROV_R_BAD_DECRYPTany)rf   ro   rG   re   rH   rb    s<   	
z!Backend._handle_key_loading_errorcurveec.EllipticCurvec                 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   rZ   	NID_undefEC_GROUP_new_by_curve_namerX   r   r   rr   EC_GROUP_free)rf   r  	curve_nidgrouprG   rG   rH   elliptic_curve_supported  s   z Backend.elliptic_curve_supportedsignature_algorithm"ec.EllipticCurveSignatureAlgorithmc                 C  s   t |tjsdS | |S r   )r   r   ECDSAr  )rf   r  r  rG   rG   rH   ,elliptic_curve_signature_algorithm_supported  s   
z4Backend.elliptic_curve_signature_algorithm_supportedec.EllipticCurvePrivateKeyc                 C  sZ   |  |r"| |}| j|}| |dk | |}t| ||S td|j dt	j
)z@
        Generate a new private key on the named curve.
        rQ   z Backend object does not support .)r  _ec_key_new_by_curverZ   EC_KEY_generate_keyrr   _ec_cdata_to_evp_pkeyr   r   r   r   UNSUPPORTED_ELLIPTIC_CURVE)rf   r  r#  r   r   rG   rG   rH   #generate_elliptic_curve_private_key  s   


z+Backend.generate_elliptic_curve_private_keyec.EllipticCurvePrivateNumbersc              	   C  sZ  |j }| |j}| j| |j| jj}| j	||}|dkr)| 
  td|  m}| ||j|j| | j|}| || jjk tj|}| || jjk | j|}	| |	| jjk | j|	| jj}	| j||	|| jj| jj|}| |dk | j|||	|dkrtdW d    n1 sw   Y  | |}
t| ||
S )NrQ   Invalid EC key.r   )r   r  r  rX   r   r   private_valuerZ   BN_clear_freeEC_KEY_set_private_keyr   r   _tmp_bn_ctx)_ec_key_set_public_key_affine_coordinatesxyEC_KEY_get0_grouprr   r   backendEC_KEY_get0_public_keyEC_POINT_newEC_POINT_freeEC_POINT_mulEC_POINT_cmpr  r   )rf   r   publicr#  r  r   bn_ctxr  	set_pointcomputed_pointr   rG   rG   rH   #load_elliptic_curve_private_numbers  sR   

!z+Backend.load_elliptic_curve_private_numbersec.EllipticCurvePublicNumbersec.EllipticCurvePublicKeyc                 C  s^   |  |j}|  }| ||j|j| W d    n1 sw   Y  | |}t| ||S rT   )r  r  r  r  r  r  r  r   )rf   r   r#  r  r   rG   rG   rH   "load_elliptic_curve_public_numbersE  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 )NrQ   z(Invalid public bytes for the given curve)r  rZ   r  rr   rX   r   r  r   r  r  EC_POINT_oct2pointr   r   r   EC_KEY_set_public_keyr  r   )	rf   r  r  r#  r  pointr  r   r   rG   rG   rH    load_elliptic_curve_public_bytesQ  s&   


z(Backend.load_elliptic_curve_public_bytesr  c              	   C  sv  |  |}| j|}| || jjk | j|}| || jjk | j|| jj}| 	|}| j|| jj
}|  @}| j|||| jj| jj|}| |dk | j|}	| j|}
| j|||	|
|}|dkrw|   tdW d    n1 sw   Y  | j||}| |dk | 	|}| j|| jj
}| j||}| |dk | |}t| ||S )NrQ   z'Unable to derive key from private_value)r  rZ   r  rr   rX   r   r  r   r  r   r  r  r  
BN_CTX_getEC_POINT_get_affine_coordinatesr   r   r  r  r  r   )rf   r  r  r#  r  r  valuer  r   bn_xbn_yprivater   rG   rG   rH   !derive_elliptic_curve_private_keyg  s>   





z)Backend.derive_elliptic_curve_private_keyc                 C  r?  rT   )r  _ec_key_new_by_curve_nid)rf   r  r  rG   rG   rH   r    s   

zBackend._ec_key_new_by_curver  c                 C  s0   | j |}| || jjk | j|| j jS rT   )rZ   EC_KEY_new_by_curve_namerr   rX   r   r   r  )rf   r  r#  rG   rG   rH   r    s   z Backend._ec_key_new_by_curve_nidec.ECDHc                 C  s,   | j rt|| jsdS | |ot|tjS r   )r]   r   _fips_ecdh_curvesr  r   ECDH)rf   r}   r  rG   rG   rH   +elliptic_curve_exchange_algorithm_supported  s   z3Backend.elliptic_curve_exchange_algorithm_supportedc                 C  r   r   )r   rZ   EVP_PKEY_set1_EC_KEYrr   )rf   r#  r   r   rG   rG   rH   r    r   zBackend._ec_cdata_to_evp_pkeyc                 C  sN   ddd}| |j|j}| j| }|| jjkr%t|j dtj|S )z/
        Get the NID for a curve name.
        
prime192v1
prime256v1)	secp192r1	secp256r1z" is not a supported elliptic curve)	getr   rZ   
OBJ_sn2nidr   r  r   r   r  )rf   r  curve_aliases
curve_namer  rG   rG   rH   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 rT   )	rZ   
BN_CTX_newrr   rX   r   r   BN_CTX_freeBN_CTX_start
BN_CTX_end)rf   r  rG   rG   rH   r    s   
zBackend._tmp_bn_ctxr  r  c                 C  s   |dk s|dk rt d| j| || jj}| j| || jj}| j|}| || jjk | j	|}| || jjk | j|| jj
}| j|||||}|dkra|   t d| j||}| |dk 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.rQ   r  N)r   rX   r   r   rZ   r   r  rr   r   r  r  EC_POINT_set_affine_coordinatesr   r  )rf   r#  r  r  r  r  r  r   rG   rG   rH   r    s&   
z1Backend._ec_key_set_public_key_affine_coordinatesencodingserialization.Encodingri   serialization.PrivateFormatencryption_algorithm(serialization.KeySerializationEncryptionc           
      C  s  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sJ | jj}| |||S |tjju r|rt
d
|	| jjkr| jj}n|	| jjksJ | jj}| ||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.zDEncryption 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   rz  rq  r  KeySerializationEncryptionr  BestAvailableEncryptionr  r   r   _KeySerializationEncryption_formatOpenSSHr  PEMrZ   PEM_write_bio_PKCS8PrivateKeyr{  i2d_PKCS8PrivateKey_bio_private_key_bytes_via_bioTraditionalOpenSSLr]   r  r  PEM_write_bio_RSAPrivateKeyr  PEM_write_bio_ECPrivateKeyr  i2d_ECPrivateKey_bio_bio_func_outputr:   _serialize_ssh_private_key)
rf   r  ri   r  rn  r   cdatar  	write_bior"  rG   rG   rH   _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)rX   r   rZ   EVP_get_cipherbynamer  r   )rf   r  r   r  r   rG   rG   rH   r  Y  s   
z"Backend._private_key_bytes_via_bioc                 G  s0   |   }||g|R  }| |dk | |S r   )r  rr   r
  )rf   r  argsrA   r   rG   rG   rH   r  l  s   
zBackend._bio_func_outputserialization.PublicFormatc                 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   rz  rq  PublicFormatSubjectPublicKeyInfor  rZ   PEM_write_bio_PUBKEYr{  i2d_PUBKEY_bior   r  PKCS1r  r  PEM_write_bio_RSAPublicKeyr%  r  r:   serialize_ssh_public_key)rf   r  ri   rn  r   r  r  r"  rG   rG   rH   _public_key_bytesr  s@   




zBackend._public_key_bytesc                 C  
   | j j S rT   rZ   r  re   rG   rG   rH   dh_supported  r|   zBackend.dh_supported	generatorc                 C  s   t j||S rT   )r[   r   r5  rf   r  r   rG   rG   rH   generate_dh_parameters  s   zBackend.generate_dh_parametersdh.DHPrivateKeyc                 C  r9  rT   r:  r<  rG   rG   rH   generate_dh_private_key  r>  zBackend.generate_dh_private_keyc                 C  s   |  | ||S rT   )r  r  r  rG   rG   rH   &generate_dh_private_key_and_parameters  s   
z.Backend.generate_dh_private_key_and_parametersdh.DHPrivateNumbersc                 C  rg  rT   )r[   r   rD  rE  rG   rG   rH   load_dh_private_numbers     zBackend.load_dh_private_numbersdh.DHPublicNumbersdh.DHPublicKeyc                 C  rg  rT   )r[   r   rL  rE  rG   rG   rH   load_dh_public_numbers  r  zBackend.load_dh_public_numbersdh.DHParameterNumbersc                 C  rg  rT   )r[   r   rO  rE  rG   rG   rH   load_dh_parameter_numbers  r  z!Backend.load_dh_parameter_numbersr   gr   typing.Optional[int]c                 C  s4   zt jtj|||d W dS  ty   Y dS w )N)r   r   r   FT)r[   r   rO  DHParameterNumbersr   )rf   r   r   r   rG   rG   rH   dh_parameters_supported  s   zBackend.dh_parameters_supportedc                 C  s   | j jdkS r   )rZ   rb   re   rG   rG   rH   dh_x942_serialization_supported  rk  z'Backend.dh_x942_serialization_supportedx25519.X25519PublicKeyc                 C  rg  rT   )r[   r   from_public_bytesri  rG   rG   rH   x25519_load_public_bytes  rk  z Backend.x25519_load_public_bytesx25519.X25519PrivateKeyc                 C  rg  rT   )r[   r   from_private_bytesri  rG   rG   rH   x25519_load_private_bytes  r  z!Backend.x25519_load_private_bytesc                 C  
   t j S rT   )r[   r   generate_keyre   rG   rG   rH   x25519_generate_key  r|   zBackend.x25519_generate_keyc                 C  s   | j rdS | jj S r   )r]   rZ   #CRYPTOGRAPHY_LIBRESSL_LESS_THAN_370re   rG   rG   rH   x25519_supported  s   
zBackend.x25519_supportedx448.X448PublicKeyc                 C  rg  rT   )r[   r   r&  ri  rG   rG   rH   x448_load_public_bytes  rk  zBackend.x448_load_public_bytesx448.X448PrivateKeyc                 C  rg  rT   )r[   r   r)  ri  rG   rG   rH   x448_load_private_bytes  rk  zBackend.x448_load_private_bytesc                 C  r+  rT   )r[   r   r,  re   rG   rG   rH   x448_generate_key  r|   zBackend.x448_generate_keyc                 C     | j rdS | jj o| jj S r   r]   rZ   r  r  re   rG   rG   rH   x448_supported  
   
zBackend.x448_supportedc                 C  s   | j rdS | jjS r   )r]   rZ    CRYPTOGRAPHY_HAS_WORKING_ED25519re   rG   rG   rH   ed25519_supported  s   zBackend.ed25519_supporteded25519.Ed25519PublicKeyc                 C  rg  rT   )r[   r   r&  ri  rG   rG   rH   ed25519_load_public_bytes  r  z!Backend.ed25519_load_public_bytesed25519.Ed25519PrivateKeyc                 C  rg  rT   )r[   r   r)  ri  rG   rG   rH   ed25519_load_private_bytes  r  z"Backend.ed25519_load_private_bytesc                 C  r+  rT   )r[   r   r,  re   rG   rG   rH   ed25519_generate_key  r|   zBackend.ed25519_generate_keyc                 C  r5  r   r6  re   rG   rG   rH   ed448_supported  r8  zBackend.ed448_supporteded448.Ed448PublicKeyc                 C  rg  rT   )r[   r   r&  ri  rG   rG   rH   ed448_load_public_bytes  rk  zBackend.ed448_load_public_bytesed448.Ed448PrivateKeyc                 C  rg  rT   )r[   r   r)  ri  rG   rG   rH   ed448_load_private_bytes  rk  z Backend.ed448_load_private_bytesc                 C  r+  rT   )r[   r   r,  re   rG   rG   rH   ed448_generate_key  r|   zBackend.ed448_generate_keyc                 C  s   t | |S rT   )r   _aead_cipher_supported)rf   r   rG   rG   rH   aead_cipher_supported  rk  zBackend.aead_cipher_supportedr  c                 C  s   t |D ]}d||< qd S )Nr   )range)rf   r   r  irG   rG   rH   
_zero_data"  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.
        Nzchar[]rQ   z	uint8_t *)rX   r   r   r   memmoverJ  r  )rf   r   data_lenr  rG   rG   rH   _zeroed_null_terminated_buf)  s   2z#Backend._zeroed_null_terminated_bufptyping.Tuple[typing.Optional[PrivateKeyTypes], typing.Optional[x509.Certificate], typing.List[x509.Certificate]]c                 C  s2   |  ||}|j|jr|jjnd dd |jD fS )Nc                 S  s   g | ]}|j qS rG   )certificate)r  rv  rG   rG   rH   
<listcomp>K  s    zABackend.load_key_and_certificates_from_pkcs12.<locals>.<listcomp>)load_pkcs12rn  rv  rO  additional_certs)rf   r   r  pkcs12rG   rG   rH   %load_key_and_certificates_from_pkcs12@  s
   z-Backend.load_key_and_certificates_from_pkcs12r=   c                 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 )
Nr  z!Could not deserialize PKCS12 datazEVP_PKEY **zX509 **zCryptography_STACK_OF_X509 **r   zInvalid password or PKCS12 dataFr   ) r   r  r  rZ   d2i_PKCS12_biorA   rX   r   r   r   r   PKCS12_freer   rM  PKCS12_parser   r$  r}  r  X509_alias_get0ru   r<   sk_X509_freesk_X509_numr   r  rH  reversedsk_X509_valuerr   rc   r=   )rf   r   r  rA   p12evp_pkey_ptrr  sk_x509_ptrpassword_bufr   rv  rn  additional_certificatesr   r   cert_objr   
maybe_namesk_x509r   indicesrI  	addl_cert	addl_namerG   rG   rH   rQ  N  sr   





zBackend.load_pkcs12r   &typing.Optional[PKCS12PrivateKeyTypes]!typing.Optional[x509.Certificate]cas,typing.Optional[typing.List[_PKCS12CATypes]]c                 C  sz  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}n]| j }| j|| jj}g }|D ]J}t|t r|j!}| "|j#}|d u r| j$|| jjd}n
| j$||t|}| |dk n| "|}|%| | j&||}t'|dk q| (|a}| (|1}|r9| "|n| jj}|d urG| )|n| jj}| j*||||||||	|
d
}W d    n	1 sew   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  rQ   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   _check_bytesr   r   r  rX   r   r  rZ   r   NID_aes_256_cbc&NID_pbe_WithSHA1And3_Key_TripleDES_CBCr  r  r  r  PKCS12_key_cert_algorithmr;   PBESv1SHA1And3KeyTripleDESCBCPBESv2SHA256AndAES256CBCr   
_hmac_hashCryptography_HAS_PKCS12_SET_MACr   rr   _kdf_roundsr   r   sk_X509_new_nullr   rY  r<   friendly_namer~  rO  X509_alias_set1rc   sk_X509_pushr  rM  r  PKCS12_createPKCS12_set_macrV  r  i2d_PKCS12_bior
  )rf   r   rn  rv  rj  r  r  nid_certnid_keypkcs12_itermac_itermac_alg
keycertalgrd  ossl_cascaca_aliasossl_car   r`  name_buf	ossl_cert	ossl_pkeyr]  rA   rG   rG   rH   (serialize_key_and_certificates_to_pkcs12  s   













"
z0Backend.serialize_key_and_certificates_to_pkcs12c                 C  r   r   )r]   rZ   Cryptography_HAS_POLY1305re   rG   rG   rH   poly1305_supported7  s   zBackend.poly1305_supportedc                 C  r  rT   r  re   rG   rG   rH   pkcs7_supported<  r|   zBackend.pkcs7_supportedtyping.List[x509.Certificate]c                 C  sn   t d| | |}| j|j| jj| jj| jj}|| jjkr)|   t	d| j
|| jj}| |S Nr   zUnable to parse PKCS7 data)r   rl  r  rZ   PEM_read_bio_PKCS7rA   rX   r   r   r   r   
PKCS7_free_load_pkcs7_certificatesrf   r   rA   p7rG   rG   rH   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   rl  r  rZ   d2i_PKCS7_biorA   rX   r   r   r   r   r  r  r  rG   rG   rH   load_der_pkcs7_certificatesN  s   

z#Backend.load_der_pkcs7_certificatesc           	      C  s   | j |j}| || j jk || j jkrtd|tj	g }|j
j| jjkr+|S |j
jj}| j |}t|D ]}| j ||}| || jjk | |}|| q:|S )NzNOnly basic signed structures are currently supported. NID for this data was {})rZ   OBJ_obj2nidr   rr   r  NID_pkcs7_signedr   ri   r   UNSUPPORTED_SERIALIZATIONr   signrX   r   rv  rZ  rH  r\  r  rc   )	rf   r  nidcertsrd  r   rI  r   rv  rG   rG   rH   r  [  s&   

z Backend._load_pkcs7_certificates)rR   rS   )rR   rh   rT   )rm   rn   ro   rp   rR   rS   )rR   ry   )r}   r~   )r}   r~   rR   rn   )rR   rn   )r   r$   r   r9   rR   rn   )r   r$   r   r9   rR   r	   )rR   r   )r   ry   )r   ry   r   ry   rR   r   )r   ry   r   ry   rR   rn   )r   r   r   rn   rR   r   )r   r   rR   r   )r   r   rR   r@   )rR   r   )r   rn   rR   r!   )rR   r"   )r.  r   rR   rn   )r   ry   rR   r4  )r7  r4  rR   r8  )r   ry   rR   r8  )r   rA  rR   r8  )r   rH  rR   rI  )r   rN  rR   r4  )r}   r#   rR   r   )r   r   r  rW  r   rn   rR   r!   )r   r   rR   r"   )r   r   rR   rf  )rv  rw  rR   rx  )r  rx  rR   rw  )rn  r>   rR   rx  )rR   r!   )rR   r  )r  r  rR   rn   )r  r  r  r  rR   rn   )r  r  rR   r  )r   r  rR   r  )r   r  rR   r  )r  r  r  r   rR   r  )r  ry   r  r  rR   r  )r  r  )r  ry   )r}   r  r  r  rR   rn   )r  r  rR   ry   )r  ry   r  ry   rR   rS   )r  r  ri   r  r  r  rR   r   )r  r  ri   r  rR   r   )r  ry   r   ry   rR   rf  )r7  rf  rR   r  )r  ry   r   ry   rR   r  )r   r  rR   r  )r   r  rR   r  )r   r  rR   rf  )r   ry   r   ry   r   r!  rR   rn   )r   r   rR   r%  )r   r   rR   r(  )rR   r(  )r   r   rR   r0  )r   r   rR   r2  )rR   r2  )r   r   rR   r;  )r   r   rR   r=  )rR   r=  )r   r   rR   rA  )r   r   rR   rC  )rR   rC  )r  ry   rR   rS   )r   r   r  rW  rR   rN  )r   r   r  rW  rR   r=   )r   rW  rn  rh  rv  ri  rj  rk  r  r  rR   r   )r   r   rR   r  )rR   r  )rD   rE   rF   __doc__r   
_fips_aeadr%   r   r   r)  r*  r+  r,  
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_modulusrg   rl   rr   rs   rj   r{   r   r   r   r   r   r   r   r   r_   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r
  r$  r(  r-  r2  r3  r6  r=  r@  rF  rM  rP  rQ  rR  rU  rV  rZ  re  rj  r  rl  r&  ru  r~  r  r  rX  rb  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r#  r$  r'  r*  r-  r/  r1  r3  r4  r7  r:  r<  r>  r?  r@  rB  rD  rE  rG  rJ  
contextlibrM  rT  rQ  r  r  r  r  r  r  rG   rG   rG   rH   rI   `   s    

		D	)L?*4.4*

!p7K rI   c                   @  s    e Zd ZdddZdddZdS )r   fmtrh   c                 C  s
   || _ d S rT   )_fmt)rf   r  rG   rG   rH   rg   u  r|   zGetCipherByName.__init__r  rI   r   r$   r   r9   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   rt   )r  ri   lowerrZ   r  r   rX   r   Cryptography_HAS_300_EVP_CIPHEREVP_CIPHER_fetchr   )rf   r  r   r   cipher_namer   rG   rG   rH   __call__x  s   zGetCipherByName.__call__N)r  rh   )r  rI   r   r$   r   r9   )rD   rE   rF   rg   r  rG   rG   rG   rH   r   t  s    
r   r  r   r%   c                 C  s$   d|j d  d}| j|dS )Nzaes-   z-xtsrt   )r   rZ   r  r   )r  r   r   r  rG   rG   rH   r     s   r   )r  rI   r   r%   )]
__future__r   collectionsr  r   typingr   cryptographyr   r   cryptography.exceptionsr   r   $cryptography.hazmat.backends.opensslr   ,cryptography.hazmat.backends.openssl.ciphersr	   )cryptography.hazmat.backends.openssl.cmacr   'cryptography.hazmat.backends.openssl.ecr   r   (cryptography.hazmat.backends.openssl.rsar   r   "cryptography.hazmat.bindings._rustr   r[   $cryptography.hazmat.bindings.opensslr   cryptography.hazmat.primitivesr   r   *cryptography.hazmat.primitives._asymmetricr   )cryptography.hazmat.primitives.asymmetricr   r   r   r   r   r   r   r   1cryptography.hazmat.primitives.asymmetric.paddingr   r   r   r    /cryptography.hazmat.primitives.asymmetric.typesr!   r"   &cryptography.hazmat.primitives.ciphersr#   r$   1cryptography.hazmat.primitives.ciphers.algorithmsr%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   ,cryptography.hazmat.primitives.ciphers.modesr1   r2   r3   r4   r5   r6   r7   r8   r9   ,cryptography.hazmat.primitives.serializationr:   3cryptography.hazmat.primitives.serialization.pkcs12r;   r<   r=   r>   r?   
namedtupler@   rC   rI   r   r   r  rG   rG   rG   rH   <module>   sZ   (
8,              "

