o
    c7                    @   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  d dl!m"Z"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llmmZmmnZn d dlompZpmqZqmrZrmsZsmtZt e ud d!d"gZvG d#d$ d$ZwG d%d& d&ZxG d'd( d(Zyd)exd*eTfd+d,Zzex Z{dS )-    N)contextmanager)utilsx509)UnsupportedAlgorithm_Reasons)aead)_CipherContext_CMACContext)_DHParameters_DHPrivateKey_DHPublicKey_dh_params_dup)_DSAParameters_DSAPrivateKey_DSAPublicKey)_EllipticCurvePrivateKey_EllipticCurvePublicKey)_Ed25519PrivateKey_Ed25519PublicKey)_ED448_KEY_SIZE_Ed448PrivateKey_Ed448PublicKey_HashContext_HMACContext)_POLY1305_KEY_SIZE_Poly1305Context)_RSAPrivateKey_RSAPublicKey)_X25519PrivateKey_X25519PublicKey)_X448PrivateKey_X448PublicKey)r   )binding)hashesserialization)AsymmetricPadding)dhdsaeced25519ed448rsax25519x448)MGF1OAEPPKCS1v15PSS)#CERTIFICATE_ISSUER_PUBLIC_KEY_TYPESPRIVATE_KEY_TYPESPUBLIC_KEY_TYPES)BlockCipherAlgorithmCipherAlgorithm)AESAES128AES256ARC4CamelliaChaCha20SM4	TripleDES_BlowfishInternal_CAST5Internal_IDEAInternal_SEEDInternal)	CBCCFBCFB8CTRECBGCMModeOFBXTS)scrypt)pkcs7ssh)PBESPKCS12CertificatePKCS12KeyAndCertificates_ALLOWED_PKCS12_TYPES_PKCS12_CAS_TYPES
_MemoryBIObioZchar_ptrc                   @   s   e Zd ZdS )_RC2N)__name__
__module____qualname__ r]   r]   Pusr/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#	dEde$de%j&e%j'e(j)  d	dfddZ*d	e$fddZ+dFddZ,dFddZ-e.j/dd Z0dFd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dFd9d: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dEdMe4fdNdOZPdPe4dQe4d	eQjRfdRdSZSdPe4dQe4d	e$fdTdUZTdVeQjUd	eQjRfdWdXZVdVeQjWd	eQjXfdYdZZYd[d\ ZZd]d^ Z[d_e6fd`daZ\dbdc Z]d	e6fdddeZ^d	e_fdfdgZ`d	eafdhdiZbd"ej7d	e$fdjdkZcdledd	e$fdmdnZedQe4d	efjgfdodpZhdqefjgd	efjifdrdsZjdQe4d	efjifdtduZkdvdw ZldVefjmd	efjifdxdyZndVefjod	efjpfdzd{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 d	e_fddZ{d_e6d	eafddZ|d_e6d	e}j~fddZd_e6de%j&e6 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Zde%jd	ejfddZdejd	e%jfddZde%jd	ejf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 Zdqe}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	dEde4de4de%j&e4 d	e$fddZd	e$fddZd_e6d	ejfddZd_e6d	ejfddZȐ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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d0d1Zd	e$fd2d3Zd!e6d	efd4d5Zd	e$fd6d7Zd_e6d	e%j'ej fd8d9Zd_e6d	e%j'ej fd:d;Zd<d= Zd>e%j'ej dejfd?d@ZdAejdejdBe%j'ej d	e6fdCdDZdS (G  Backendz)
    OpenSSL API binding interfaces.
    openssl>   s   aes-256-ccms   aes-192-gcms   aes-128-ccms   aes-128-gcms   aes-192-ccms   aes-256-gcm   i     c                 C   s   t  | _| jj| _| jj| _d| _|  | _	i | _
|   | j	r,| jjr,tdt n|   | jjg| _| jjrD| j| jj d S d S )NFz<OpenSSL FIPS mode is enabled. Can't enable DRBG fork safety.)r%   Binding_bindingffi_ffilib_lib_rsa_skip_check_key_is_fips_enabled_fips_enabled_cipher_registry_register_default_ciphers"CRYPTOGRAPHY_NEEDS_OSRANDOM_ENGINEwarningswarnUserWarningactivate_osrandom_engineZEVP_PKEY_DH	_dh_typesCryptography_HAS_EVP_PKEY_DHXappendZEVP_PKEY_DHXselfr]   r]   r^   __init__   s"   



zBackend.__init__returnc                 C   s   d |  | jS )Nz'<OpenSSLBackend(version: {}, FIPS: {})>)formatopenssl_version_textrk   rv   r]   r]   r^   __repr__   s   
zBackend.__repr__Nokerrorsc                 C   s   t j| j||dS )N)r~   )r%   Z_openssl_assertrh   )rw   r}   r~   r]   r]   r^   openssl_assert   s   zBackend.openssl_assertc                 C   sH   | j jr| j | jj}n
t| j ddd  }|dkr | j   t|S )NZ	FIPS_modec                   S   s   dS Nr   r]   r]   r]   r]   r^   <lambda>   s    z*Backend._is_fips_enabled.<locals>.<lambda>r   )rh   ZCryptography_HAS_300_FIPSZ&EVP_default_properties_is_fips_enabledrf   NULLgetattrZERR_clear_errorbool)rw   moder]   r]   r^   rj      s   
zBackend._is_fips_enabledc                 C   s$   | j   |  sJ |  | _d S N)rd   _enable_fipsrj   rk   rv   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 Nrb   )	rh   rn   ZENGINE_get_default_RANDrf   r   ZENGINE_unregister_RANDRAND_set_rand_methodr   ENGINE_finishrw   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   )	rh   ZENGINE_by_idZCryptography_osrandom_engine_idr   rf   r   ZENGINE_initZ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   )	rh   rn   r   r   ZENGINE_set_default_RANDr   r   rf   r   r   r]   r]   r^   rr     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)
rf   newr   rh   ZENGINE_ctrl_cmdlenr   r   stringdecode)rw   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   )rf   r   rh   ZOpenSSL_versionZOPENSSL_VERSIONr   rv   r]   r]   r^   r{   #  s
   zBackend.openssl_version_textc                 C   s
   | j  S r   )rh   ZOpenSSL_version_numrv   r]   r]   r^   openssl_version_number.     
zBackend.openssl_version_numberkey	algorithmc                 C   s   t | ||S r   r   )rw   r   r   r]   r]   r^   create_hmac_ctx1     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 )NZblake2bZblake2sz{}{}   r   )namerz   digest_sizeencoderh   ZEVP_get_digestbyname)rw   r   Zalgevp_mdr]   r]   r^   _evp_md_from_algorithm6  s   zBackend._evp_md_from_algorithmc                 C   s    |  |}| || jjk |S r   )r   r   rf   r   rw   r   r   r]   r]   r^   _evp_md_non_null_from_algorithmA  s   
z'Backend._evp_md_non_null_from_algorithmc                 C   s,   | j rt|| jsdS | |}|| jjkS NF)rk   
isinstance_fips_hashesr   rf   r   r   r]   r]   r^   hash_supportedF  s   
zBackend.hash_supportedc                 C       | j rt|tjrdS | |S r   rk   r   r&   SHA1r   rw   r   r]   r]   r^   signature_hash_supportedM  s   
z Backend.signature_hash_supportedc                 C      | j rdS | jjdkS NFrb   )rk   rh   ZCryptography_HAS_SCRYPTrv   r]   r]   r^   scrypt_supportedV  s   zBackend.scrypt_supportedc                 C   r   )NTr   r   r]   r]   r^   hmac_supported\  s   
zBackend.hmac_supportedc                 C   
   t | |S r   r   r   r]   r]   r^   create_hash_ctxc  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   )rk   r   _fips_ciphersrl   typeKeyErrorrf   r   )rw   r   r   adapter
evp_cipherr]   r]   r^   cipher_supportedh  s   zBackend.cipher_supportedc                 C   s0   ||f| j v rtd|||| j ||f< d S )Nz"Duplicate registration for: {} {}.)rl   
ValueErrorrz   )rw   
cipher_clsmode_clsr   r]   r]   r^   register_cipher_adapterv  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ttfD ]}| 
t|td qQttttfD ]}| 
t|td qctttgttttgD ]\}}| 
||td q{| 
ttd td | 
ttd td | 
ttd td	 | 
t tt tttttfD ]}| 
t|td
 qd S )Nz+{cipher.name}-{cipher.key_size}-{mode.name}zdes-ede3-{mode.name}zdes-ede3zbf-{mode.name}zseed-{mode.name}z{cipher.name}-{mode.name}Zrc4Zrc2Zchacha20zsm4-{mode.name})r:   r;   r<   rF   rI   rJ   rM   rG   rH   rK   r   GetCipherByNamer>   rA   rB   rE   	itertoolsproductrC   rD   r=   r   rY   r?   rN   _get_xts_cipherr@   )rw   r   r   r]   r]   r^   rm     sf   





z!Backend._register_default_ciphersc                 C      t | ||t jS r   )r   Z_ENCRYPTrw   r   r   r]   r]   r^   create_symmetric_encryption_ctx     z'Backend.create_symmetric_encryption_ctxc                 C   r   r   )r   Z_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[]rb   )	rf   r   r   from_bufferrh   ZPKCS5_PBKDF2_HMACr   r   buffer)
rw   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_errorsrh   rv   r]   r]   r^   r        zBackend._consume_errorsc                 C   r   r   )r%   _consume_errors_with_textrh   rv   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)rf   r   r   rh   ZBN_is_negativeZBN_num_bytesr   Z	BN_bn2binint
from_bytesr   )rw   bnZbn_num_bytesZbin_ptrZ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       @rb   r   )	rf   r   to_bytesr   
bit_lengthrh   Z	BN_bin2bnr   r   )rw   r   r   binaryZ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| ||| jS r   )r.   Z_verify_rsa_parametersrh   RSA_newr   rf   r   gcRSA_freer   BN_freeZRSA_generate_key_ex_rsa_cdata_to_evp_pkeyr   ri   )rw   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   rb   r   i   r]   )rw   r   r   r]   r]   r^   !generate_rsa_parameters_supported  s
   
z)Backend.generate_rsa_parameters_supportednumbersc              
   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| ||| jS r   )r.   Z_check_private_key_componentspqddmp1dmq1iqmppublic_numbersr   nrh   r   r   rf   r   r   r   r   ZRSA_set0_factorsRSA_set0_keyZRSA_set0_crt_paramsr   r   ri   )rw   r   r   r   r   r   r   r   r   r   r   r   r   r]   r]   r^   load_rsa_private_numbers  s>   



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.   Z_check_public_key_componentsr   r   rh   r   r   rf   r   r   r   r   r   r   r    )rw   r   r   r   r   r   r   r]   r]   r^   load_rsa_public_numbers@  s   

zBackend.load_rsa_public_numbersc                 C   s2   | j  }| || jjk | j|| j j}|S r   )rh   ZEVP_PKEY_newr   rf   r   r   EVP_PKEY_freerw   r   r]   r]   r^   _create_evp_pkey_gcO  s   
zBackend._create_evp_pkey_gcc                 C   (   |   }| j||}| |dk |S r   )r   rh   ZEVP_PKEY_set1_RSAr   )rw   r   r   r   r]   r]   r^   r   U     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.
        )
rf   r   rh   ZBIO_new_mem_bufr   r   r   rW   r   BIO_free)rw   r   data_ptrrX   r]   r]   r^   _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.
        )rh   Z	BIO_s_memr   rf   r   ZBIO_newr   r  )rw   Z
bio_methodrX   r]   r]   r^   _create_mem_bio_gch  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)rf   r   rh   ZBIO_get_mem_datar   r   r   )rw   rX   r   Zbuf_lenbio_datar]   r]   r^   _read_mem_bios  s   zBackend._read_mem_bioc           	      C   s6  | j |}|| j jkr,| j |}| || jjk | j|| j j}t	| ||| j
S || j jkrr| j jsr| j jsr| j jsr| 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 |t| j dd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.
        rb   N)passwordEVP_PKEY_ED25519EVP_PKEY_X448EVP_PKEY_X25519EVP_PKEY_ED448Unsupported key type.)%rh   EVP_PKEY_idEVP_PKEY_RSAEVP_PKEY_get1_RSAr   rf   r   r   r   r   ri   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   rs   EVP_PKEY_get1_DHDH_freer   r   r   r#   r!   r   r   )	rw   r   key_typer   rX   r   	dsa_cdataec_cdatadh_cdatar]   r]   r^   _evp_pkey_to_private_key~  s`   
	





z Backend._evp_pkey_to_private_keyc           
      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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 |t | j dd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.
        rb   zUnable to load EC keyr  Nr	  r
  r  r  )&rh   r  r  r  r   rf   r   r   r   r    r  r  r  r  r  i2d_RSAPublicKey_bioload_der_public_keyr  r  r  r  r   r  r  r   r   r  r   rs   r  r  r   r   r   r$   r"   r   r   )
rw   r   r  r   rX   r   r  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   r3   r4   Z_mgfr1   rk   Z
_algorithmr&   r   r   r2   r*  )rw   r+  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   ra   i   i   z0Key size must be 1024, 2048, 3072, or 4096 bits.r   rb   )
r   rh   DSA_newr   rf   r   r   r  ZDSA_generate_parameters_exr   )rw   r   ctxr   r]   r]   r^   generate_dsa_parameters  s$   


zBackend.generate_dsa_parameters
parametersc                 C   sT   | j |j}| || jjk | j|| j j}| j | | 	|}t
| ||S r   )rh   ZDSAparams_dupZ
_dsa_cdatar   rf   r   r   r  ZDSA_generate_key_dsa_cdata_to_evp_pkeyr   )rw   r0  r.  r   r]   r]   r^   generate_dsa_private_key/  s   
z Backend.generate_dsa_private_keyc                 C      |  |}| |S r   )r/  r2  )rw   r   r0  r]   r]   r^   'generate_dsa_private_key_and_parameters<  s   

z/Backend.generate_dsa_private_key_and_parametersc                 C   sB   | j ||||}| |dk | j |||}| |dk d S r   )rh   DSA_set0_pqgr   ZDSA_set0_key)rw   r  r   r   gpub_keypriv_keyr   r]   r]   r^   _dsa_cdata_set_valuesB  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*   Z_check_dsa_private_numbersr   parameter_numbersrh   r-  r   rf   r   r   r  r   r   r   r6  yxr9  r1  r   )
rw   r   r:  r  r   r   r6  r7  r8  r   r]   r]   r^   load_dsa_private_numbersH  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:  rh   r-  r   rf   r   r   r  r   r   r   r6  r;  r9  r1  r   )	rw   r   r  r   r   r6  r7  r8  r   r]   r]   r^   load_dsa_public_numbers]  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>  rh   r-  r   rf   r   r   r  r   r   r   r6  r5  r   )rw   r   r  r   r   r6  r   r]   r]   r^   load_dsa_parameter_numbersp  s   


z"Backend.load_dsa_parameter_numbersc                 C   r   r   )r   rh   ZEVP_PKEY_set1_DSAr   )rw   r  r   r   r]   r]   r^   r1    r   zBackend._dsa_cdata_to_evp_pkeyc                 C   s   | j  S r   )rk   rv   r]   r]   r^   dsa_supported  s   zBackend.dsa_supportedc                 C   s   |   sdS | |S r   )rA  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_ctxr  c                 C   s   |  | jj| j||S r   )	_load_keyrh   ZPEM_read_bio_PrivateKeyr"  )rw   r   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_cbrb   )r  rf   r   rh   ZPEM_read_bio_PUBKEYrX   r   	addressof_original_libr   r   r%  r   	BIO_resetr   ZPEM_read_bio_RSAPublicKeyr   r   r    _handle_key_loading_error)rw   r   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   )
r  rh   ZPEM_read_bio_DHparamsrX   rf   r   r   r  r   rN  )rw   r   rO  r!  r]   r]   r^   load_pem_parameters  s   

zBackend.load_pem_parametersc                 C   s:   |  |}| ||}|r| |S | | jj| j||S r   )r  "_evp_pkey_from_der_traditional_keyr"  rG  rh   Zd2i_PKCS8PrivateKey_bio)rw   r   r  r  r   r]   r]   r^   r    s   

zBackend.load_der_private_keyc                 C   sZ   | 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.)	rh   d2i_PrivateKey_biorX   rf   r   r   r   r   	TypeError)rw   r  r  r   r]   r]   r^   rS    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  rh   Zd2i_PUBKEY_biorX   rf   r   r   r   r%  r   rM  r   Zd2i_RSAPublicKey_bior   r   r    rN  )rw   r   rO  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   )r  rh   Zd2i_DHparams_biorX   rf   r   r   r  r   rt   r   rM  r   ZCryptography_d2i_DHxparams_biorN  )rw   r   rO  r!  r   r]   r]   r^   load_der_parameters  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DERr  rh   Zd2i_X509_biorX   rf   r   r   r   	X509_free)rw   rX  r   rO  r   r]   r]   r^   
_cert2ossl)     
zBackend._cert2osslr   c                 C   4   |   }| j||}| |dk t| |S r   )r  rh   Zi2d_X509_bior   	rust_x509Zload_der_x509_certificater  )rw   r   rX   r   r]   r]   r^   
_ossl2cert1  s   zBackend._ossl2certcsrc                 C   rY  r   )rZ  r'   r[  r\  r  rh   Zd2i_X509_REQ_biorX   rf   r   r   r   ZX509_REQ_free)rw   rc  r   rO  x509_reqr]   r]   r^   	_csr2ossl7  r_  zBackend._csr2osslrd  c                 C   r`  r   )r  rh   Zi2d_X509_REQ_bior   ra  Zload_der_x509_csrr  )rw   rd  rX   r   r]   r]   r^   	_ossl2csr?     zBackend._ossl2csrcrlc                 C   rY  r   )rZ  r'   r[  r\  r  rh   Zd2i_X509_CRL_biorX   rf   r   r   r   ZX509_CRL_free)rw   rh  r   rO  x509_crlr]   r]   r^   	_crl2osslG  r_  zBackend._crl2osslri  c                 C   r`  r   )r  rh   Zi2d_X509_CRL_bior   ra  Zload_der_x509_crlr  )rw   ri  rX   r   r]   r]   r^   	_ossl2crlO  rg  zBackend._ossl2crl
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.rb   FT)
r   r   r    r   rV  rj  rh   ZX509_CRL_verify	_evp_pkeyr   )rw   rh  rl  ri  r   r]   r]   r^   _crl_is_signature_validW  s    
zBackend._crl_is_signature_validc                 C   s`   |  |}| j|}| || jjk | j|| jj}| j||}|dkr.| 	  dS dS )Nrb   FT)
re  rh   ZX509_REQ_get_pubkeyr   rf   r   r   r   ZX509_REQ_verifyr   )rw   rc  rd  Zpkeyr   r]   r]   r^   _csr_is_signature_validq  s   
zBackend._csr_is_signature_validc                 C   s"   | j |j|jdkrtdd S )Nrb   zKeys do not correspond)rh   ZEVP_PKEY_cmprm  r   )rw   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r{|jdkr{td
|d ur|jd	ks|d u sJ ||S )NrI  r  rJ  r   z3Password was not given but private key is encryptedzAPasswords longer than {} bytes are not supported by this backend.rb   rT  )r  rf   r   r   _check_bytesliker   r  r   r   rX   r   rK  rh   rL  errorr   rV  r   rz   maxsizerN  r   r   called)	rw   Zopenssl_read_funcZconvert_funcr   r  rO  rP  Zpassword_ptrr   r]   r]   r^   rG    sJ   

	

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_matchrh   ERR_LIB_EVPZ'EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM).0rv  rv   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   ry  rh   rz  ZEVP_R_BAD_DECRYPTZERR_LIB_PKCS12Z!PKCS12_R_PKCS12_CIPHERFINAL_ERRORZCryptography_HAS_PROVIDERSZERR_LIB_PROVZPROV_R_BAD_DECRYPTanyr%   Z_errors_with_text)rw   r~   Zerrors_with_textr]   rv   r^   rN    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   rh   	NID_undefZEC_GROUP_new_by_curve_namerf   r   r   r   ZEC_GROUP_free)rw   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+   ZECDSAr  )rw   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.
        rb   z#Backend object does not support {}.)r  _ec_key_new_by_curverh   ZEC_KEY_generate_keyr   _ec_cdata_to_evp_pkeyr   r   rz   r   r   UNSUPPORTED_ELLIPTIC_CURVE)rw   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 )Nrb   Invalid EC key.)r   r  r~  rf   r   r   private_valuerh   BN_clear_freeEC_KEY_set_private_keyr   r   )_ec_key_set_public_key_affine_coordinatesr<  r;  r  r   )rw   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   )rw   r   r   r   r]   r]   r^   "load_elliptic_curve_public_numbers0  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 )Nrb   z(Invalid public bytes for the given curve)r  rh   EC_KEY_get0_groupr   rf   r   EC_POINT_newr   EC_POINT_free_tmp_bn_ctxZEC_POINT_oct2pointr   r   r   EC_KEY_set_public_keyr  r   )	rw   r~  r  r   r  pointbn_ctxr   r   r]   r]   r^    load_elliptic_curve_public_bytes;  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 )Nrb   z'Unable to derive key from private_value)r   _ec_key_determine_group_get_funcrh   r  r   rf   r   r   r  r   r  r  ZEC_POINT_mulZ
BN_CTX_getr   r   r  r  r  r   )rw   r  r~  r   get_funcr  r  valuer  r   Zbn_xZbn_yZprivater   r]   r]   r^   !derive_elliptic_curve_private_keyQ  s8   




z)Backend.derive_elliptic_curve_private_keyc                 C   r3  r   )r  _ec_key_new_by_curve_nid)rw   r~  r  r]   r]   r^   r  x  s   

zBackend._ec_key_new_by_curver  c                 C   s0   | j |}| || jjk | j|| j jS r   )rh   ZEC_KEY_new_by_curve_namer   rf   r   r   r  )rw   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   )rk   r   _fips_ecdh_curvesr  r+   ECDH)rw   r   r~  r]   r]   r^   +elliptic_curve_exchange_algorithm_supported  s   z3Backend.elliptic_curve_exchange_algorithm_supportedc                 C   r   r   )r   rh   ZEVP_PKEY_set1_EC_KEYr   )rw   r   r   r   r]   r]   r^   r    r   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.
        Z
prime192v1Z
prime256v1)Z	secp192r1Z	secp256r1z${} is not a supported elliptic curve)
getr   rh   
OBJ_sn2nidr   r  r   rz   r   r  )rw   r~  Zcurve_aliasesZ
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   )	rh   Z
BN_CTX_newr   rf   r   r   ZBN_CTX_freeZBN_CTX_startZ
BN_CTX_end)rw   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   rf   r   rh   r  r  r  ZEC_GROUP_method_ofZEC_METHOD_get_field_typeZCryptography_HAS_EC2MZ$EC_POINT_get_affine_coordinates_GF2mZ#EC_POINT_get_affine_coordinates_GFp)rw   r.  Z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.rb   r  N)r   rf   r   r   rh   r   Z(EC_KEY_set_public_key_affine_coordinatesr   )rw   r.  r<  r;  r   r]   r]   r^   r    s   z1Backend._ec_key_set_public_key_affine_coordinatesencodingrz   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[  rV  PrivateFormatKeySerializationEncryptionNoEncryptionBestAvailableEncryptionr  r   r   _KeySerializationEncryption_formatOpenSSHZPKCS8PEMrh   ZPEM_write_bio_PKCS8PrivateKeyr\  Zi2d_PKCS8PrivateKey_bio_private_key_bytes_via_bioZTraditionalOpenSSLrk   r  r  ZPEM_write_bio_RSAPrivateKeyr  ZPEM_write_bio_DSAPrivateKeyr  ZPEM_write_bio_ECPrivateKeyr  Zi2d_ECPrivateKey_bioZi2d_DSAPrivateKey_bio_bio_func_outputrQ   Z_serialize_ssh_private_key)
rw   r  rz   r  r   r   cdatar  	write_bior  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)rf   r   rh   EVP_get_cipherbynamer  r   )rw   r  r   r  r   r]   r]   r^   r  W  s   
z"Backend._private_key_bytes_via_bioc                 G   s0   |   }||g|R  }| |dk | |S r   )r  r   r  )rw   r  argsrX   r   r]   r]   r^   r  h  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[  rV  PublicFormatZSubjectPublicKeyInfor  rh   ZPEM_write_bio_PUBKEYr\  Zi2d_PUBKEY_bior   r  ZPKCS1r  r  ZPEM_write_bio_RSAPublicKeyr#  r  rQ   Zserialize_ssh_public_key)rw   r  rz   r   r   r  r  r  r]   r]   r^   _public_key_bytesn  s@   




zBackend._public_key_bytesc                 C   
   | j j S r   rh   r  rv   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 t| |S )Nz$DH key_size must be at least {} bits)      zDH generator must be 2 or 5rb   )r)   Z_MIN_MODULUS_SIZEr   rz   rh   DH_newr   rf   r   r   r  ZDH_generate_parameters_exr   )rw   r  r   Zdh_param_cdatar   r]   r]   r^   generate_dh_parameters  s    


zBackend.generate_dh_parametersc                 C   r   r   )r   rh   ZEVP_PKEY_set1_DHr   )rw   r!  r   r   r]   r]   r^   _dh_cdata_to_evp_pkey  r   zBackend._dh_cdata_to_evp_pkeyc                 C   s<   t |j| }| j|}| |dk | |}t| ||S r   )r   Z	_dh_cdatarh   ZDH_generate_keyr   r  r   )rw   r0  Zdh_key_cdatar   r   r]   r]   r^   generate_dh_private_key  s   
zBackend.generate_dh_private_keyc                 C   s   |  | ||S r   )r  r  )rw   r  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 )Nrb   int[]r   r  z.DH private numbers did not pass safety checks.)r   r:  rh   r  r   rf   r   r   r  r   r   r6  r   r;  r<  DH_set0_pqgDH_set0_keyr   Cryptography_DH_checkZDH_NOT_SUITABLE_GENERATORr   r  r   )rw   r   r:  r!  r   r6  r   r7  r8  r   codesr   r]   r]   r^   load_dh_private_numbers  s0   




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   )rh   r  r   rf   r   r   r  r:  r   r   r6  r   r;  r  r  r  r   )
rw   r   r!  r:  r   r6  r   r7  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   )rh   r  r   rf   r   r   r  r   r   r6  r   r  r   )rw   r   r!  r   r6  r   r   r]   r]   r^   load_dh_parameter_numbers(  s   


z!Backend.load_dh_parameter_numbersr   r6  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 )Nrb   r  r   )rh   r  r   rf   r   r   r  r   r  r   r  )rw   r   r6  r   r!  r   r  r]   r]   r^   dh_parameters_supported<  s   


zBackend.dh_parameters_supportedc                 C   s   | j jdkS r   )rh   rt   rv   r]   r]   r^   dh_x942_serialization_supportedT  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 longrb   )	r   r   r   rh   ZEVP_PKEY_set_type
NID_X25519r   ZEVP_PKEY_set1_tls_encodedpointr"   )rw   r   r   r   r]   r]   r^   x25519_load_public_bytesW  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 )Nr  z&An X25519 private key is 32 bytes longs   0. 0+en" 0   r      )r   r   _zeroed_bytearrayr  rh   rU  rX   rf   r   r   r   r   r  r
  r!   )rw   r   Zpkcs8_prefixbarX   r   r]   r]   r^   x25519_load_private_bytesf  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 )Nrb   EVP_PKEY **r   )rh   ZEVP_PKEY_CTX_new_idrf   r   r   r   ZEVP_PKEY_CTX_freeZEVP_PKEY_keygen_initr   ZEVP_PKEY_keygenr   )rw   r  Zevp_pkey_ctxr   Z	evp_ppkeyr   r]   r]   r^   _evp_pkey_keygen_gc  s   zBackend._evp_pkey_keygen_gcc                 C      |  | jj}t| |S r   )r  rh   r  r!   r   r]   r]   r^   x25519_generate_key     
zBackend.x25519_generate_keyc                 C      | j rdS | jj S r   )rk   rh   r  rv   r]   r]   r^   x25519_supported     
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   rh   EVP_PKEY_new_raw_public_keyNID_X448rf   r   r   r   r   r$   rw   r   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   rf   r   rh   EVP_PKEY_new_raw_private_keyr  r   r   r   r   r#   rw   r   r  r   r]   r]   r^   x448_load_private_bytes  s   
zBackend.x448_load_private_bytesc                 C   r  r   )r  rh   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   )rk   rh   Z"CRYPTOGRAPHY_OPENSSL_LESS_THAN_111r  rv   r]   r]   r^   x448_supported  
   
zBackend.x448_supportedc                 C   r  r   )rk   rh   #CRYPTOGRAPHY_OPENSSL_LESS_THAN_111Brv   r]   r]   r^   ed25519_supported  r  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 )Nr   z&An Ed25519 public key is 32 bytes long)r   _check_bytesr   r,   _ED25519_KEY_SIZEr   rh   r  NID_ED25519rf   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 longr   )r   r,   r  r   r   ru  rf   r   rh   r  r  r   r   r   r   r   r  r]   r]   r^   ed25519_load_private_bytes  s   
z"Backend.ed25519_load_private_bytesc                 C   r  r   )r  rh   r  r   r   r]   r]   r^   ed25519_generate_key  r  zBackend.ed25519_generate_keyc                 C   r  r   )rk   rh   r  r  rv   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 )Nr   z$An Ed448 public key is 57 bytes long)r   r  r   r   r   rh   r  	NID_ED448rf   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 )Nr   z%An Ed448 private key is 57 bytes long)r   ru  r   r   r   rf   r   rh   r  r  r   r   r   r   r   r  r]   r]   r^   ed448_load_private_bytes  s   
z Backend.ed448_load_private_bytesc                 C   r  r   )r  rh   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   rb      i   zJNot enough memory to derive key. These parameters require {} MB of memory.)rf   r   r   rh   ZEVP_PBE_scryptr   rO   Z
_MEM_LIMITr   MemoryErrorrz   r   )rw   r   r   r   r   r  r   r   r   r   r~   Z
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   -sivrb   )
r   Z_aead_cipher_namerk   
_fips_aeadendswithrh   #CRYPTOGRAPHY_OPENSSL_300_OR_GREATERr  rf   r   )rw   r   cipher_namer]   r]   r^   aead_cipher_supported6  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)rw   r   r  r]   r]   r^   r  D  s
   zBackend._zeroed_bytearrayc                 C   s   t |D ]}d||< qd S r   )range)rw   r   r   ir]   r]   r^   r  Q  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   rb   z	uint8_t *)rf   r   r   r   memmover  cast)rw   r   Zdata_lenr   r]   r]   r^   _zeroed_null_terminated_bufX  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{  rX  r]   r]   r^   
<listcomp>z  s    zABackend.load_key_and_certificates_from_pkcs12.<locals>.<listcomp>)load_pkcs12r   rX  r  Zadditional_certs)rw   r   r  pkcs12r]   r]   r^   %load_key_and_certificates_from_pkcs12o  s
   z-Backend.load_key_and_certificates_from_pkcs12c                 C   s~  |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  | jjri|   |	dkru|   t	dd }
d }g }|d | jjkr| j
|d | jj}| |}|d | jjkr| j
|d | jj}| |}d }| j|| jj}|| jjkr| j|}t||}
|d | jjkr9| 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r0| j|}|t|| qt ||
|S )Nr  z!Could not deserialize PKCS12 datar  zX509 **zCryptography_STACK_OF_X509 **r   zInvalid password or PKCS12 data)!r   ru  r  rh   Zd2i_PKCS12_biorX   rf   r   r   r   r   PKCS12_freer   r
  ZPKCS12_parseZ#CRYPTOGRAPHY_LIBRESSL_LESS_THAN_340r   r"  r]  rb  ZX509_alias_get0r   rS   sk_X509_freesk_X509_numr  r  r  reversedsk_X509_valuer   ru   rT   )rw   r   r  rX   p12Zevp_pkey_ptrZx509_ptrZsk_x509_ptrpassword_bufr   rX  r   Zadditional_certificatesr   r   Zcert_objr   Z
maybe_namesk_x509r   indicesr  Z	addl_certZ	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   rs  r   i N  rb   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  rf   r   r  rh   r  ZNID_aes_256_cbcZ&NID_pbe_WithSHA1And3_Key_TripleDES_CBCr  r  r  r  ZPKCS12Z_key_cert_algorithmrR   ZPBESv1SHA1And3KeyTripleDESCBCZPBESv2SHA256AndAES256CBCr   Z
_hmac_hashZCryptography_HAS_PKCS12_SET_MACr   r   Z_kdf_roundsr   r   sk_X509_new_nullr   r  rS   Zfriendly_namer^  r  r
  ZX509_alias_set1ru   sk_X509_pushbackendrm  ZPKCS12_createZPKCS12_set_macr  r  Zi2d_PKCS12_bior  )rw   r   r   rX  r  r  r  Znid_certZnid_keyZpkcs12_iterZmac_iterZmac_algZ
keycertalgr  Zossl_cascaZca_aliasZossl_caZca_name_bufr   r  Zname_buf	ossl_certr   r  rX   r]   r]   r^   (serialize_key_and_certificates_to_pkcs12  s   












#
z0Backend.serialize_key_and_certificates_to_pkcs12c                 C   r   r   )rk   rh   ZCryptography_HAS_POLY1305rv   r]   r]   r^   poly1305_supportedg	  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   ru  r   r   r   r   )rw   r   r]   r]   r^   create_poly1305_ctxl	  s   
zBackend.create_poly1305_ctxc                 C   r  r   r  rv   r]   r]   r^   pkcs7_supporteds	  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 Nr   zUnable to parse PKCS7 data)r   r  r  rh   ZPEM_read_bio_PKCS7rX   rf   r   r   r   r   
PKCS7_free_load_pkcs7_certificatesrw   r   rX   p7r]   r]   r^   load_pem_pkcs7_certificatesv	  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  r  rh   Zd2i_PKCS7_biorX   rf   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 {}rb   )rh   ZOBJ_obj2nidr   r   r  ZNID_pkcs7_signedr   rz   r   ZUNSUPPORTED_SERIALIZATIONr   signrX  r  r  r  rf   r   ZX509_up_refr   r]  rb  ru   )
rw   r(  r  r  r   certsr  r   r   rX  r]   r]   r^   r&  	  s(   

z Backend._load_pkcs7_certificatesr,  c           
      C   s"  t |}|rtdd |D std|tjjtjjfvr!td| j }| j	
|| jj}g }|D ]}| |}|| | j||}| |dk q3| j| j	j| j	j|| j	j| jj}|  }	|tjju rv| j|	|| j	jd}n|tjju s~J | j|	|}| |dk | |	S )Nc                 s   s    | ]	}t |tjV  qd S r   )r   r   Certificater  r]   r]   r^   r|  	  s    
z7Backend.pkcs7_serialize_certificates.<locals>.<genexpr>z.certs must be a list of certs with length >= 1z/encoding must DER or PEM from the Encoding enumrb   r   )listallrV  r'   r[  r  r\  rh   r  rf   r   r  r^  ru   r  r   
PKCS7_signr   PKCS7_PARTIALr  PEM_write_bio_PKCS7_streami2d_PKCS7_bior  )
rw   r,  r  Zcerts_sk
ossl_certsrX  r  r   r(  bio_outr]   r]   r^   pkcs7_serialize_certificates	  sD   



z$Backend.pkcs7_serialize_certificatesbuilderoptionsc                 C   s  |j d usJ | |j }| jj}d}t|jdkr| jj}n.| j }| j	|| jj
}g }|jD ]}	| |	}
||
 | j||
}| |dk q2tjj|v r_|| jjO }|| jjO }| j| jj| jj|| jj|}| || jjk | j	|| jj}d}tjj|v r|| jjO }ntjj|v r|| jjO }tjj|v r|| jjO }|jD ]#\}}}| |}
| |}| j||
|j||}| || jjk q|D ]}|tjju r|| jj O }q|tjj!u r|| jj"O }q| # }|t$j%j&u r| j'|||j(|}nK|t$j%j)u r%| j*||j(|}| |dk | j+|||j(|}n)|t$j%j,u s.J | j*||j(|}| |dk | jj-rG| .  | j/||}| |dk | 0|S )Nr   rb   )1_datar  rh   r1  r   Z_additional_certsrf   r   r  r   r  r^  ru   r  r   rP   PKCS7OptionsZDetachedSignatureZPKCS7_DETACHEDr0  r%  ZNoCapabilitiesZPKCS7_NOSMIMECAPZNoAttributesZPKCS7_NOATTRZNoCertsZPKCS7_NOCERTSZ_signersr   ZPKCS7_sign_add_signerrm  TextZ
PKCS7_TEXTZBinaryZPKCS7_BINARYr  r'   r[  ZSMIMEZSMIME_write_PKCS7rX   r  ZPKCS7_finalr2  r\  r  r   r3  r  )rw   r7  r  r8  rX   Z
init_flagsZfinal_flagsr,  r4  rX  r  r   r(  Zsigner_flagsr  Zprivate_keyZhash_algorithmZmdZp7signerinfooptionr5  r]   r]   r^   
pkcs7_sign	  s   










zBackend.pkcs7_signr   )ry   N)rZ   r[   r\   __doc__r   r  r:   r   r&   r&  r'  r(  r)  Z
SHA512_224Z
SHA512_256ZSHA3_224ZSHA3_256ZSHA3_384ZSHA3_512ZSHAKE128ZSHAKE256r   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_modulusrx   strr|   r   typingOptionalListr%   Z_OpenSSLErrorr   rj   r   r   
contextlibr   r   rr   r   r{   r   r   bytesZHashAlgorithmr   r   r   r   r   r   r   r   ZHashContextr   r9   rL   r   r   rm   r   r   r   r   r   r   Z_OpenSSLErrorWithTextr   r   r   r.   ZRSAPrivateKeyr   r   ZRSAPrivateNumbersr   ZRSAPublicNumbersZRSAPublicKeyr   r   r   r  r  r  r6   r"  r7   r%  r*  r(   r,  r*   ZDSAParametersr/  ZDSAPrivateKeyr2  r4  r9  ZDSAPrivateNumbersr=  ZDSAPublicNumbersZDSAPublicKeyr?  ZDSAParameterNumbersr@  r1  rA  rB  rE  r8   r
   rF  rH  rQ  r)   ZDHParametersrR  r  rS  r$  rW  r   r-  Anyr^  rb  ZCertificateSigningRequestre  rf  ZCertificateRevocationListrj  rk  r5   rn  ro  rr  rG  NoReturnrN  ZEllipticCurver  ZEllipticCurveSignatureAlgorithmr  ZEllipticCurvePrivateKeyr  ZEllipticCurvePrivateNumbersr  ZEllipticCurvePublicNumbersZEllipticCurvePublicKeyr  r  r  r  r  r  r  r  r  r  r  r  r'   r[  r  r  r  r  r  r  r  r  r  r  ZDHPrivateKeyr  r  ZDHPrivateNumbersr  ZDHPublicNumbersZDHPublicKeyr  ZDHParameterNumbersr  r  r  r/   ZX25519PublicKeyr  ZX25519PrivateKeyr  r  r  r  r0   ZX448PublicKeyr  ZX448PrivateKeyr  r  r  r  r,   ZEd25519PublicKeyr  ZEd25519PrivateKeyr  r  r  r-   ZEd448PublicKeyr  ZEd448PrivateKeyr  r  r  r  Iteratorr  r  r  r
  Tupler  rT   r  rU   rV   r   r!  r   r"  r#  r)  r*  r&  r6  rP   ZPKCS7SignatureBuilderr:  r=  r]   r]   r]   r^   r_      s~   


	

	
	4






	
$
@:






*




5/





'



z
7



0



$#

M
 


/
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)rw   rI  r]   r]   r^   rx   ?
  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   )rJ  rz   lowerrh   r  r   rf   r   ZCryptography_HAS_300_EVP_CIPHERZEVP_CIPHER_fetchr   )rw   r  r   r   r  r   r]   r]   r^   __call__B
  s   zGetCipherByName.__call__N)	rZ   r[   r\   r?  rx   r_   r9   rL   rL  r]   r]   r]   r^   r   >
  s    r   r  r   c                 C   s"   d |jd }| j|dS )Nz
aes-{}-xtsr  r   )rz   r   rh   r  r   )r  r   r   r  r]   r]   r^   r   W
  s   r   )|collectionsrC  r   r@  ro   r   cryptographyr   r   Zcryptography.exceptionsr   r   Z$cryptography.hazmat.backends.opensslr   Z,cryptography.hazmat.backends.openssl.ciphersr   Z)cryptography.hazmat.backends.openssl.cmacr
   Z'cryptography.hazmat.backends.openssl.dhr   r   r   r   Z(cryptography.hazmat.backends.openssl.dsar   r   r   Z'cryptography.hazmat.backends.openssl.ecr   r   Z,cryptography.hazmat.backends.openssl.ed25519r   r   Z*cryptography.hazmat.backends.openssl.ed448r   r   r   Z+cryptography.hazmat.backends.openssl.hashesr   Z)cryptography.hazmat.backends.openssl.hmacr   Z-cryptography.hazmat.backends.openssl.poly1305r   r   Z(cryptography.hazmat.backends.openssl.rsar   r    Z+cryptography.hazmat.backends.openssl.x25519r!   r"   Z)cryptography.hazmat.backends.openssl.x448r#   r$   Z"cryptography.hazmat.bindings._rustra  Z$cryptography.hazmat.bindings.opensslr%   Zcryptography.hazmat.primitivesr&   r'   Z*cryptography.hazmat.primitives._asymmetricr(   Z)cryptography.hazmat.primitives.asymmetricr)   r*   r+   r,   r-   r.   r/   r0   Z1cryptography.hazmat.primitives.asymmetric.paddingr1   r2   r3   r4   Z/cryptography.hazmat.primitives.asymmetric.typesr5   r6   r7   Z&cryptography.hazmat.primitives.ciphersr8   r9   Z1cryptography.hazmat.primitives.ciphers.algorithmsr:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   Z,cryptography.hazmat.primitives.ciphers.modesrF   rG   rH   rI   rJ   rK   rL   rM   rN   Z"cryptography.hazmat.primitives.kdfrO   Z,cryptography.hazmat.primitives.serializationrP   rQ   Z3cryptography.hazmat.primitives.serialization.pkcs12rR   rS   rT   rU   rV   
namedtuplerW   rY   r_   r   r   r  r]   r]   r]   r^   <module>   sx   (
8,	                   J
