U
    
;g%                     @  s   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 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 G dd dZe ZdS )    )annotations)openssl)binding)hashes)AsymmetricPadding)ec)utils)MGF1OAEPPSSPKCS1v15)CipherAlgorithm)AES)CBCModec                   @  s^  e Zd ZdZ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dd	Z d
dddZ!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dZ'ddddd Z(ddd!d"Z)dddd#d$Z*d%d&dd'd(d)Z+dddd*d+Z,d,dd-d.Z-dddd/d0Z.d1dd2d3d4Z/d1dd2d5d6Z0ddd7d8Z1dddd9d:Z2ddd;d<Z3d=dd>d?d@Z4dAd=ddBdCdDZ5dEd=ddFdGdHZ6dddIdJZ7dddKdLZ8dddMdNZ9dddOdPZ:dddQdRZ;dddSdTZ<dddUdVZ=dddWdXZ>dddYdZZ?d[S )\Backendz)
    OpenSSL API binding interfaces.
    r   i   i     None)returnc                 C  s,   t  | _| jj| _| jj| _t | _	d S N)
r   ZBindingZ_bindingffi_ffilib_librust_opensslis_fips_enabled_fips_enabledself r   P/tmp/pip-unpacked-wheel-yjz0rwd7/cryptography/hazmat/backends/openssl/backend.py__init__E   s    


zBackend.__init__strc                 C  s    d|    d| j dtj dS )Nz<OpenSSLBackend(version: z, FIPS: z
, Legacy: z)>)openssl_version_textr   r   Z_legacy_provider_loadedr   r   r   r    __repr__K   s    zBackend.__repr__bool)okr   c                 C  s
   t |S r   )r   Z_openssl_assert)r   r&   r   r   r    openssl_assertR   s    zBackend.openssl_assertc                 C  s&   t t j t  stt  | _d S r   )r   Zenable_fipsZ
_providersr   AssertionErrorr   r   r   r   r    _enable_fipsU   s    zBackend._enable_fipsc                 C  s   t  S )z
        Friendly string name of the loaded OpenSSL library. This is not
        necessarily the same version as it was compiled against.

        Example: OpenSSL 3.2.1 30 Jan 2024
        )r   r#   r   r   r   r    r#   \   s    zBackend.openssl_version_textintc                 C  s   t  S r   )r   openssl_versionr   r   r   r    openssl_version_numbere   s    zBackend.openssl_version_numberzhashes.HashAlgorithm)	algorithmc                 C  sB   |j dkr&|j  |jd  d}n|j d}| j|}|S )N)blake2bblake2s   ascii)namedigest_sizeencoder   ZEVP_get_digestbyname)r   r-   Zalgevp_mdr   r   r    _evp_md_from_algorithmh   s    
zBackend._evp_md_from_algorithm)r-   r   c                 C  s,   | j rt|| jsdS | |}|| jjkS NF)r   
isinstance_fips_hashesr6   r   ZNULL)r   r-   r5   r   r   r    hash_supporteds   s    
zBackend.hash_supportedc                 C  s    | j rt|tjrdS | |S r7   r   r8   r   SHA1r:   r   r-   r   r   r    signature_hash_supportedz   s    z Backend.signature_hash_supportedc                 C  s   | j r
dS ttjdS d S )NFZderive_scrypt)r   hasattrr   Zkdfr   r   r   r    scrypt_supported   s    zBackend.scrypt_supportedc                 C  s    | j rt|tjrdS | |S )NTr;   r=   r   r   r    hmac_supported   s    zBackend.hmac_supportedr   r   )ciphermoder   c                 C  s$   | j rt|| jsdS tj||S r7   )r   r8   _fips_ciphersr   cipherscipher_supported)r   rB   rC   r   r   r    rF      s    zBackend.cipher_supportedc                 C  s
   |  |S r   )rA   r=   r   r   r    pbkdf2_hmac_supported   s    zBackend.pbkdf2_hmac_supportedzlist[rust_openssl.OpenSSLError]c                 C  s   t  S r   )r   Zcapture_error_stackr   r   r   r    _consume_errors   s    zBackend._consume_errorsc                 C  s4   | j rt|tjrdS t|tjtjtjtjtjfS r7   )r   r8   r   r<   SHA224SHA256SHA384SHA512r=   r   r   r    _oaep_hash_supported   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)r8   r   r   Z_mgfr	   r   
_algorithmr   r<   r:   r
   rM   r   rN   r   r   r    rsa_padding_supported   s     
 
zBackend.rsa_padding_supportedc                 C  s"   | j rt|trdS | |S d S r7   )r   r8   r   rQ   rP   r   r   r    rsa_encryption_supported   s    z Backend.rsa_encryption_supportedc                 C  s   t j o| j S r   )r   CRYPTOGRAPHY_IS_BORINGSSLr   r   r   r   r    dsa_supported   s    zBackend.dsa_supportedc                 C  s   |   sdS | |S r7   )rT   r>   r=   r   r   r    dsa_hash_supported   s    zBackend.dsa_hash_supportedc                 C  s   |  |td|j S )N    )rF   r   
block_sizer=   r   r   r    cmac_algorithm_supported   s     z Backend.cmac_algorithm_supportedzec.EllipticCurve)curver   c                 C  s"   | j rt|| jsdS tj|S r7   )r   r8   _fips_ecdh_curvesr   r   Zcurve_supported)r   rY   r   r   r    elliptic_curve_supported   s     z Backend.elliptic_curve_supportedz"ec.EllipticCurveSignatureAlgorithm)signature_algorithmrY   r   c                 C  s4   t |tjsdS | |o2t |jtjp2| |jS r7   )r8   r   ZECDSAr[   r-   
asym_utilsZ	Prehashedr:   )r   r\   rY   r   r   r    ,elliptic_curve_signature_algorithm_supported   s    

z4Backend.elliptic_curve_signature_algorithm_supportedzec.ECDH)r-   rY   r   c                 C  s   |  |ot|tjS r   )r[   r8   r   ZECDH)r   r-   rY   r   r   r    +elliptic_curve_exchange_algorithm_supported   s     z3Backend.elliptic_curve_exchange_algorithm_supportedc                 C  s   t j S r   r   rS   r   r   r   r    dh_supported   s    zBackend.dh_supportedc                 C  s   | j jdkS )Nr   )r   ZCryptography_HAS_EVP_PKEY_DHXr   r   r   r    dh_x942_serialization_supported   s    z'Backend.dh_x942_serialization_supportedc                 C  s   | j r
dS dS NFTr   r   r   r   r    x25519_supported   s    zBackend.x25519_supportedc                 C  s   | j r
dS tj otj S r7   r   r   ZCRYPTOGRAPHY_IS_LIBRESSLrS   r   r   r   r    x448_supported   s
    zBackend.x448_supportedc                 C  s   | j r
dS dS rc   rd   r   r   r   r    ed25519_supported  s    zBackend.ed25519_supportedc                 C  s   | j r
dS tj otj S r7   rf   r   r   r   r    ed448_supported  s
    zBackend.ed448_supportedc                 C  s   t jo| j S r   )r   Z#CRYPTOGRAPHY_OPENSSL_320_OR_GREATERr   r   r   r   r    ecdsa_deterministic_supported  s    z%Backend.ecdsa_deterministic_supportedc                 C  s   | j r
dS dS rc   rd   r   r   r   r    poly1305_supported  s    zBackend.poly1305_supportedc                 C  s   t j S r   r`   r   r   r   r    pkcs7_supported  s    zBackend.pkcs7_supportedN)@__name__
__module____qualname____doc__r2   r   rD   r   rI   rJ   rK   rL   Z
SHA512_224Z
SHA512_256ZSHA3_224ZSHA3_256ZSHA3_384ZSHA3_512ZSHAKE128ZSHAKE256r9   r   Z	SECP224R1Z	SECP256R1Z	SECP384R1Z	SECP521R1rZ   Z_fips_rsa_min_key_sizeZ_fips_rsa_min_public_exponentZ_fips_dsa_min_modulusZ_fips_dh_min_key_sizeZ_fips_dh_min_modulusr!   r$   r'   r)   r#   r,   r6   r:   r>   r@   rA   rF   rG   rH   rM   rQ   rR   rT   rU   rX   r[   r^   r_   ra   rb   re   rg   rh   ri   rj   rk   rl   r   r   r   r    r      st   			r   N)
__future__r   Z"cryptography.hazmat.bindings._rustr   r   Z$cryptography.hazmat.bindings.opensslr   Zcryptography.hazmat.primitivesr   Z*cryptography.hazmat.primitives._asymmetricr   Z)cryptography.hazmat.primitives.asymmetricr   r   r]   Z1cryptography.hazmat.primitives.asymmetric.paddingr	   r
   r   r   Z&cryptography.hazmat.primitives.ciphersr   Z1cryptography.hazmat.primitives.ciphers.algorithmsr   Z,cryptography.hazmat.primitives.ciphers.modesr   r   r   backendr   r   r   r    <module>   s     