a
    ϏPf                     @  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mZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ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" d dl#m$Z$ d dl%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 d dl2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z; d dl<m=Z=m>Z>m?Z?m@Z@mAZA eBdddgZCG dd dZDG dd dZEG dd dZFdddddZGeE ZHdS )     )annotationsN)utilsx509)UnsupportedAlgorithm)aead)_CipherContext)openssl)binding)hashesserialization)AsymmetricPadding)ec)r   )MGF1OAEPPSSPKCS1v15)PrivateKeyTypes)CipherAlgorithm)AESAES128AES256ARC4SM4CamelliaChaCha20	TripleDES_BlowfishInternal_CAST5Internal_IDEAInternal_SEEDInternal)	CBCCFBCFB8CTRECBGCMOFBXTSMode)PBESPKCS12CertificatePKCS12KeyAndCertificatesPKCS12PrivateKeyTypes_PKCS12CATypes
_MemoryBIObioZchar_ptrc                   @  s   e Zd ZdS )_RC2N)__name__
__module____qualname__ r4   r4   m/var/www/html/python-backend/venv/lib/python3.9/site-packages/cryptography/hazmat/backends/openssl/backend.pyr0   G   s   r0   c                   @  s  e Zd ZU dZdZh dZded< 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
ddZ"dd
ddZ#dddd	dddZ$d	d
ddZ%dd
ddZ&dd
ddZ'dddd Z(ddd!d"Z)ddd#d$d%Z*ddd#d&d'Z+dd
d(d)Z,ddd#d*d+Z-d,d-dd.d/d0Z.d	d
d1d2Z/d	d
d3d4Z0d,d-d5d.d6d7Z1d,d-d5d.d8d9Z2ddd#d:d;Z3d<d
d=d>Z4dddd?d@dAZ5dBdCdDdEdFZ6dGdH Z7dBd
dIdJZ8ddd#dKdLZ9dMddNdOdPZ:dMddNdQdRZ;dd
dSdTZ<ddd#dUdVZ=dd
dWdXZ>dYdZd[d\d]Z?dZdYd^d_d`Z@dadZdbdcddZAd<dedfdgdhZBdiddjdkdlZCdmdiddndodpZDdqdiddrdsdtZEdd
dudvZFdd
dwdxZGdd
dydzZHdd
d{d|ZIdd
d}d~ZJdd
ddZKdd
ddZLdd	dddZMeNjOdd ZPdBdddddZQdBdddddZRddddddBdddZSdd
ddZTdd
ddZUdS )Backendz)
    OpenSSL API binding interfaces.
    r   >   s   aes-256-ccms   aes-128-gcms   aes-192-gcms   aes-192-ccms   aes-256-gcms   aes-128-ccmztyping.ClassVar[set[bytes]]
_fips_aeadi   i     None)returnc                 C  s:   t  | _| jj| _| jj| _t | _	i | _
|   d S N)r	   ZBinding_bindingffi_ffilib_librust_opensslis_fips_enabled_fips_enabled_cipher_registry_register_default_ciphersselfr4   r4   r5   __init__}   s    



zBackend.__init__strc                 C  s   d |  | jtjS )Nz3<OpenSSLBackend(version: {}, FIPS: {}, Legacy: {})>)formatopenssl_version_textrC   rA   _legacy_provider_loadedrF   r4   r4   r5   __repr__   s
    zBackend.__repr__Nboolz&list[rust_openssl.OpenSSLError] | None)okerrorsr:   c                 C  s   t j||dS )N)rP   )r	   Z_openssl_assert)rG   rO   rP   r4   r4   r5   openssl_assert   s    zBackend.openssl_assertc                 C  s$   | j   t sJ t | _d S r;   )r<   _enable_fipsrA   rB   rC   rF   r4   r4   r5   rR      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)r>   stringr@   ZOpenSSL_versionOPENSSL_VERSIONdecoderF   r4   r4   r5   rK      s
    zBackend.openssl_version_textintc                 C  s
   | j  S r;   )r@   ZOpenSSL_version_numrF   r4   r4   r5   openssl_version_number   s    zBackend.openssl_version_numberzhashes.HashAlgorithm)	algorithmc                 C  sB   |j dv r&|j  |jd  d}n|j d}| j|}|S )N)blake2bblake2s   rS   )namedigest_sizeencoder@   ZEVP_get_digestbyname)rG   rY   algevp_mdr4   r4   r5   _evp_md_from_algorithm   s    
zBackend._evp_md_from_algorithmc                 C  s    |  |}| || jjk |S r;   )rb   rQ   r>   NULLrG   rY   ra   r4   r4   r5   _evp_md_non_null_from_algorithm   s    
z'Backend._evp_md_non_null_from_algorithm)rY   r:   c                 C  s,   | j rt|| jsdS | |}|| jjkS NF)rC   
isinstance_fips_hashesrb   r>   rc   rd   r4   r4   r5   hash_supported   s    
zBackend.hash_supportedc                 C  s    | j rt|tjrdS | |S rf   rC   rg   r
   SHA1ri   rG   rY   r4   r4   r5   signature_hash_supported   s    z Backend.signature_hash_supportedc                 C  s   | j r
dS | jjdkS d S )NFr8   )rC   r@   ZCryptography_HAS_SCRYPTrF   r4   r4   r5   scrypt_supported   s    zBackend.scrypt_supportedc                 C  s    | j rt|tjrdS | |S )NTrj   rl   r4   r4   r5   hmac_supported   s    zBackend.hmac_supportedr   r(   )ciphermoder:   c                 C  s^   | j rt|| jsdS z| jt|t|f }W n tyD   Y dS 0 || ||}| jj|kS rf   )rC   rg   _fips_ciphersrD   typeKeyErrorr>   rc   )rG   rp   rq   adapter
evp_cipherr4   r4   r5   cipher_supported   s    zBackend.cipher_supportedc                 C  s6   ||f| j v r$td| d| d|| j ||f< d S )NzDuplicate registration for:  .)rD   
ValueError)rG   
cipher_clsmode_clsru   r4   r4   r5   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 qHttttfD ]}| 
t|td ql| 
tttd | 
ttd t| jjrdnd | 
t tt tttttt	fD ]}| 
t|td qtjs| jjsttttfD ]}| 
t|td q
ttttfD ]}| 
t|td q0tttgttttgD ]\}}| 
||td	 qb| 
ttd td
 | 
ttd td d S )Nz+{cipher.name}-{cipher.key_size}-{mode.name}zdes-ede3-{mode.name}zdes-ede3ZchachaZchacha20zsm4-{mode.name}zbf-{mode.name}zseed-{mode.name}z{cipher.name}-{mode.name}Zrc4Zrc2) r   r   r   r    r#   r$   r&   r!   r"   r%   r}   GetCipherByNamer   r   r   rs   r@   CRYPTOGRAPHY_IS_LIBRESSLr'   _get_xts_cipherr   rA   rL   #CRYPTOGRAPHY_OPENSSL_300_OR_GREATERr   r   	itertoolsproductr   r   r   r0   )rG   r{   r|   r4   r4   r5   rE      s    



z!Backend._register_default_ciphersr   c                 C  s   t | ||t jS r;   )r   Z_ENCRYPTrG   rp   rq   r4   r4   r5   create_symmetric_encryption_ctx8  s    z'Backend.create_symmetric_encryption_ctxc                 C  s   t | ||t jS r;   )r   Z_DECRYPTr   r4   r4   r5   create_symmetric_decryption_ctx=  s    z'Backend.create_symmetric_decryption_ctxc                 C  s
   |  |S r;   )ro   rl   r4   r4   r5   pbkdf2_hmac_supportedB  s    zBackend.pbkdf2_hmac_supportedzlist[rust_openssl.OpenSSLError]c                 C  s   t  S r;   )rA   Zcapture_error_stackrF   r4   r4   r5   _consume_errorsE  s    zBackend._consume_errors)public_exponentkey_sizer:   c                 C  s   |dko|d@ dko|dkS )N   r8   r   i   r4   )rG   r   r   r4   r4   r5   !generate_rsa_parameters_supportedH  s
    
z)Backend.generate_rsa_parameters_supportedbytesr.   )datar:   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.
        )
r>   Zfrom_bufferr@   ZBIO_new_mem_buflenrQ   rc   r.   gcBIO_free)rG   r   Zdata_ptrr/   r4   r4   r5   _bytes_to_bioQ  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.
        )r@   Z	BIO_s_memrQ   r>   rc   ZBIO_newr   r   )rG   Z
bio_methodr/   r4   r4   r5   _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)r>   newr@   ZBIO_get_mem_datarQ   rc   buffer)rG   r/   bufbuf_lenZbio_datar4   r4   r5   _read_mem_bioi  s    zBackend._read_mem_bioc                 C  s4   | j rt|tjrdS t|tjtjtjtjtjfS rf   )rC   rg   r
   rk   SHA224SHA256SHA384SHA512rl   r4   r4   r5   _oaep_hash_supportedt  s    zBackend._oaep_hash_supportedr   )paddingr:   c                 C  s   t |trdS t |trNt |jtrN| jr>t |jjtjr>dS | 	|jjS n4t |t
r~t |jtr~| |jjo|| |jS dS d S )NTF)rg   r   r   Z_mgfr   rC   
_algorithmr
   rk   ri   r   r   rG   r   r4   r4   r5   rsa_padding_supported  s    


zBackend.rsa_padding_supportedc                 C  s"   | j rt|trdS | |S d S rf   )rC   rg   r   r   r   r4   r4   r5   rsa_encryption_supported  s    z Backend.rsa_encryption_supportedc                 C  s   | j j o| j S r;   )r@   CRYPTOGRAPHY_IS_BORINGSSLrC   rF   r4   r4   r5   dsa_supported  s    zBackend.dsa_supportedc                 C  s   |   sdS | |S rf   )r   rm   rl   r4   r4   r5   dsa_hash_supported  s    zBackend.dsa_hash_supportedc                 C  s   |  |td|j S )N    )rw   r    
block_sizerl   r4   r4   r5   cmac_algorithm_supported  s    z Backend.cmac_algorithm_supportedzx509.Certificatez
typing.Any)certr:   c                 C  sT   | tjj}| |}| j|j| jj	}| 
|| jj	k | j|| jj}|S r;   )Zpublic_bytesr   EncodingDERr   r@   Zd2i_X509_bior/   r>   rc   rQ   r   	X509_free)rG   r   r   mem_bior   r4   r4   r5   
_cert2ossl  s    
zBackend._cert2ossl)x509_ptrr:   c                 C  s4   |   }| j||}| |dk t| |S Nr8   )r   r@   Zi2d_X509_biorQ   r   Zload_der_x509_certificater   )rG   r   r/   resr4   r4   r5   
_ossl2cert  s    zBackend._ossl2certr,   )keyr:   c                 C  s\   | tjjtjjt }| |}| j	|j
| jj}| || jjk | j|| jjS r;   )Zprivate_bytesr   r   r   PrivateFormatZPKCS8NoEncryptionr   r@   Zd2i_PrivateKey_bior/   r>   rc   rQ   r   EVP_PKEY_free)rG   r   r   r   evp_pkeyr4   r4   r5   	_key2ossl  s    
zBackend._key2osslztyping.NoReturn)rP   r:   c                   s   |st dn|d  jj jjs^|d  jj jjs^ jjrh|d  jj jj	rht dn*t
 fdd|D rt dn
t d|d S )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_matchr@   ERR_LIB_EVPZ'EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM).0errorrF   r4   r5   	<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).)rz   r   r@   r   ZEVP_R_BAD_DECRYPTZERR_LIB_PKCS12Z!PKCS12_R_PKCS12_CIPHERFINAL_ERRORZCryptography_HAS_PROVIDERSZERR_LIB_PROVZPROV_R_BAD_DECRYPTany)rG   rP   r4   rF   r5   _handle_key_loading_error  s:    	


z!Backend._handle_key_loading_errorzec.EllipticCurve)curver:   c                 C  s"   | j rt|| jsdS tj|S rf   )rC   rg   _fips_ecdh_curvesrA   r   Zcurve_supported)rG   r   r4   r4   r5   elliptic_curve_supported  s
    z Backend.elliptic_curve_supportedz"ec.EllipticCurveSignatureAlgorithm)signature_algorithmr   r:   c                 C  s4   t |tjsdS | |o2t |jtjp2| |jS rf   )rg   r   ZECDSAr   rY   
asym_utilsZ	Prehashedri   )rG   r   r   r4   r4   r5   ,elliptic_curve_signature_algorithm_supported  s    

z4Backend.elliptic_curve_signature_algorithm_supportedzec.ECDH)rY   r   r:   c                 C  s   |  |ot|tjS r;   )r   rg   r   ZECDH)rG   rY   r   r4   r4   r5   +elliptic_curve_exchange_algorithm_supported  s    z3Backend.elliptic_curve_exchange_algorithm_supportedc                 C  s
   | j j S r;   r@   r   rF   r4   r4   r5   dh_supported  s    zBackend.dh_supportedc                 C  s   | j jdkS r   )r@   ZCryptography_HAS_EVP_PKEY_DHXrF   r4   r4   r5   dh_x942_serialization_supported  s    z'Backend.dh_x942_serialization_supportedc                 C  s   | j r
dS dS NFTrC   rF   r4   r4   r5   x25519_supported  s    zBackend.x25519_supportedc                 C  s   | j r
dS | jj o| jj S rf   rC   r@   r   r   rF   r4   r4   r5   x448_supported  s
    
zBackend.x448_supportedc                 C  s   | j r
dS dS r   r   rF   r4   r4   r5   ed25519_supported&  s    zBackend.ed25519_supportedc                 C  s   | j r
dS | jj o| jj S rf   r   rF   r4   r4   r5   ed448_supported+  s
    
zBackend.ed448_supportedc                 C  s   t | |S r;   )r   Z_aead_cipher_supported)rG   rp   r4   r4   r5   aead_cipher_supported3  s    zBackend.aead_cipher_supported)lengthr:   c                 C  s   t |D ]}d||< qd S )Nr   )range)rG   r   r   ir4   r4   r5   
_zero_data6  s    zBackend._zero_datac                 c  s|   |du r| j jV  ndt|}| j d|d }| j ||| z |V  W | | j d|| n| | j d|| 0 dS )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[]r8   z	uint8_t *)r>   rc   r   r   Zmemmover   cast)rG   r   data_lenr   r4   r4   r5   _zeroed_null_terminated_buf=  s    z#Backend._zeroed_null_terminated_bufzbytes | NonezNtuple[PrivateKeyTypes | None, x509.Certificate | None, list[x509.Certificate]])r   passwordr:   c                 C  s2   |  ||}|j|jr|jjnd dd |jD fS )Nc                 S  s   g | ]
}|j qS r4   )certificate)r   r   r4   r4   r5   
<listcomp>_      zABackend.load_key_and_certificates_from_pkcs12.<locals>.<listcomp>)load_pkcs12r   r   r   Zadditional_certs)rG   r   r   Zpkcs12r4   r4   r5   %load_key_and_certificates_from_pkcs12T  s
    z-Backend.load_key_and_certificates_from_pkcs12r+   c                 C  s  |d urt d| | |}| j|j| jj}|| jjkrN|   t	d| j
|| jj}| jd}| jd}| jd}| |$}| j|||||}	W d    n1 s0    Y  |	dkr|   t	dd }
d }g }|d | jjkr,| j
|d | jj}tjjt| jd|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r| 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rn| 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 dataZ	uintptr_tF)Zunsafe_skip_rsa_key_validation)$r   Z_check_bytesliker   r@   Zd2i_PKCS12_bior/   r>   rc   r   rz   r   PKCS12_freer   r   ZPKCS12_parser   rA   keysZprivate_key_from_ptrrW   r   r   r   ZX509_alias_get0rT   r*   sk_X509_freeZsk_X509_numr   r   r   reversedZsk_X509_valuerQ   appendr+   )rG   r   r   r/   p12Zevp_pkey_ptrr   Zsk_x509_ptrpassword_bufr   r   r   Zadditional_certificatesr   r   Zcert_objr]   Z
maybe_namesk_x509numindicesr   Z	addl_certZ	addl_namer4   r4   r5   r   b  sr    

"



zBackend.load_pkcs12zPKCS12PrivateKeyTypes | Nonezx509.Certificate | Nonezlist[_PKCS12CATypes] | Nonez(serialization.KeySerializationEncryption)r]   r   r   casencryption_algorithmr:   c                 C  s  d }|d urt d| t|tjr@d}d}d}	d}
| jj}nDt|tjr| jj	rf| jj
}| jj
}n| jj}| jj}d}	d}
| jj}|j}nt|tjr||jtjju r|d}d}d}	d}
|j}|j}|tju r| jj}| jj}n>|tju r| jj	std| jj
}| jj
}n|d u s"J |jd ur`| jjs@t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 ]}t|t r0|j!}| "|j#}|d u r| j$|| jjd}n| j$||t|}| |dk n
| "|}|%| | j&||}t'|dk q| (|}| (|}|r| "|n| jj}|d ur| )|n| jj}| j*||||||||	|
d
}|| jjkr| + }td	|W d    n1 s0    Y  | jjrB|| jjkrB| j,||d| jjd|
| W d    n1 sX0    Y  | || jjk | j|| jj-}| . }| j/||}| |dk | 0|S )
Nr]   r   i N  r8   z2PBESv2 is not supported by this version of OpenSSLzBSetting MAC algorithm is not supported by this version of OpenSSL.zUnsupported key encryption typez=Failed to create PKCS12 (does the key match the certificate?))1r   _check_bytesrg   r   r   r>   rc   ZBestAvailableEncryptionr@   r   ZNID_aes_256_cbcZ&NID_pbe_WithSHA1And3_Key_TripleDES_CBCr   Z_KeySerializationEncryption_formatr   ZPKCS12Z_key_cert_algorithmr)   ZPBESv1SHA1And3KeyTripleDESCBCZPBESv2SHA256AndAES256CBCr   Z
_hmac_hashZCryptography_HAS_PKCS12_SET_MACre   rQ   Z_kdf_roundsrz   r   Zsk_X509_new_nullr   r   r*   Zfriendly_namer   r   ZX509_alias_set1r   Zsk_X509_pushbackendr   r   ZPKCS12_creater   ZPKCS12_set_macr   r   Zi2d_PKCS12_bior   )rG   r]   r   r   r   r   r   Znid_certZnid_keyZpkcs12_iterZmac_iterZmac_algZ
keycertalgr   Zossl_cascaZca_aliasZossl_car   r   Zname_bufZ	ossl_certZ	ossl_pkeyr   rP   r/   r4   r4   r5   (serialize_key_and_certificates_to_pkcs12  s    
	











$	
$
z0Backend.serialize_key_and_certificates_to_pkcs12c                 C  s.   | j r
dS | jjs| jjrdS | jjdkS d S )NFTr8   )rC   r@   r   r   ZCryptography_HAS_POLY1305rF   r4   r4   r5   poly1305_supportedU  s    zBackend.poly1305_supportedc                 C  s
   | j j S r;   r   rF   r4   r4   r5   pkcs7_supported`  s    zBackend.pkcs7_supported)N)Vr1   r2   r3   __doc__r]   r7   __annotations__r   rr   r
   r   r   r   r   Z
SHA512_224Z
SHA512_256ZSHA3_224ZSHA3_256ZSHA3_384ZSHA3_512ZSHAKE128ZSHAKE256rh   r   Z	SECP224R1Z	SECP256R1Z	SECP384R1Z	SECP521R1r   Z_fips_rsa_min_key_sizeZ_fips_rsa_min_public_exponentZ_fips_dsa_min_modulusZ_fips_dh_min_key_sizeZ_fips_dh_min_modulusrH   rM   rQ   rR   rK   rX   rb   re   ri   rm   rn   ro   rw   r}   rE   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   
contextlibcontextmanagerr   r   r   r   r   r   r4   r4   r4   r5   r6   K   s   


 	J	.
L (r6   c                   @  s,   e Zd ZddddZddddd	d
ZdS )r~   rI   )fmtc                 C  s
   || _ d S r;   )_fmt)rG   r   r4   r4   r5   rH   e  s    zGetCipherByName.__init__r6   r   r(   )r   rp   rq   c                 C  sd   | j j||d }|j|d}||jjkrX|jjrX|j	|jj|d|jj}|
  |S )N)rp   rq   rS   )r   rJ   lowerr@   EVP_get_cipherbynamer_   r>   rc   ZCryptography_HAS_300_EVP_CIPHERZEVP_CIPHER_fetchr   )rG   r   rp   rq   cipher_namerv   r4   r4   r5   __call__h  s    
zGetCipherByName.__call__N)r1   r2   r3   rH   r   r4   r4   r4   r5   r~   d  s   r~   r   )r   rp   c                 C  s$   d|j d  d}| j|dS )Nzaes-   z-xtsrS   )r   r@   r   r_   )r   rp   rq   r   r4   r4   r5   r   }  s    r   )I
__future__r   collectionsr   r   typingZcryptographyr   r   Zcryptography.exceptionsr   Z$cryptography.hazmat.backends.opensslr   Z,cryptography.hazmat.backends.openssl.ciphersr   Z"cryptography.hazmat.bindings._rustr   rA   Z$cryptography.hazmat.bindings.opensslr	   Zcryptography.hazmat.primitivesr
   r   Z*cryptography.hazmat.primitives._asymmetricr   Z)cryptography.hazmat.primitives.asymmetricr   r   Z1cryptography.hazmat.primitives.asymmetric.paddingr   r   r   r   Z/cryptography.hazmat.primitives.asymmetric.typesr   Z&cryptography.hazmat.primitives.ciphersr   Z1cryptography.hazmat.primitives.ciphers.algorithmsr   r   r   r   r   r   r   r   r   r   r   r   Z,cryptography.hazmat.primitives.ciphers.modesr    r!   r"   r#   r$   r%   r&   r'   r(   Z3cryptography.hazmat.primitives.serialization.pkcs12r)   r*   r+   r,   r-   
namedtupler.   r0   r6   r~   r   r   r4   r4   r4   r5   <module>   s@   8,      