
    _fi                   R   d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dlmZm	Z	 d dl
mZmZ d dlmZ d dlmZ d dlmZ d d	lmZmZ d d
lmZmZ d dlmZ d dlmZ d dlmZm Z  d dl!m"Z" d dl#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ d dl,m-Z-m.Z.m/Z/m0Z0 d dl1m2Z2m3Z3 d dl4m5Z5m6Z6 d dl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZC d dlDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZM d dlNmOZO d dlPmQZQmRZRmSZSmTZTmUZU  ejV        dddg          ZW G d d          ZX G d d          ZY G d d          ZZd$d#Z[ eY            Z\dS )%    )annotationsN)contextmanager)utilsx509)UnsupportedAlgorithm_Reasons)aead)_CipherContext_CMACContext)_EllipticCurvePrivateKey_EllipticCurvePublicKey)_RSAPrivateKey_RSAPublicKey)openssl)binding)hashesserialization)AsymmetricPadding)dhdsaeced448ed25519rsax448x25519)MGF1OAEPPSSPKCS1v15)PrivateKeyTypesPublicKeyTypes)BlockCipherAlgorithmCipherAlgorithm)AESAES128AES256ARC4SM4CamelliaChaCha20	TripleDES_BlowfishInternal_CAST5Internal_IDEAInternal_SEEDInternal)	CBCCFBCFB8CTRECBGCMOFBXTSMode)ssh)PBESPKCS12CertificatePKCS12KeyAndCertificatesPKCS12PrivateKeyTypes_PKCS12CATypes
_MemoryBIObiochar_ptrc                      e Zd ZdS )_RC2N)__name__
__module____qualname__     ^/var/www/html/env/lib/python3.11/site-packages/cryptography/hazmat/backends/openssl/backend.pyrE   rE   \   s        DrJ   rE   c                     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  ZdZdez  Z dd	Z!ddZ"	 dddZ#ddZ$ddZ%ddZ&ddZ'ddZ(ddZ)ddZ*ddZ+ddZ,dd"Z-dd#Z.dd$Z/dd&Z0dd'Z1dd(Z2dd*Z3dd+Z4dd-Z5dd1Z6dd2Z7dd6Z8dd9Z9d: Z:d; Z;dd?Z<d@ Z=ddAZ>ddCZ?ddEZ@ddFZAddIZBddJZCddLZDddOZEddPZFddRZGddUZHddWZIddXZJddYZKddZZLdd]ZMdd`ZNddaZOddcZPdddZQde ZRddfZSddgZTddkZUddmZVddpZWddqZXddsZYddvZZddyZ[d d{Z\dd}Z]ddZ^ddZ_ddZ`ddZaddZbddZcd ZdddZeefd             Zgd	dZhd
dZiddZjddZkddZlddZmddZnddZoddZpddZqddZrddZs	 dܐddZtddZuddZvddZwddZxddZyddZzddZ{ddZ|ddZ}ddZ~ddZddZddZddZddZddĄZddńZddƄZddȄZejf        dɄ             Zd d˄Zd!d̈́Zd"dӄZddԄZddՄZd#dׄZd#d؄Zd$dلZdS (%  Backendz)
    OpenSSL API binding interfaces.
    r   >      aes-128-ccm   aes-128-gcm   aes-192-ccm   aes-192-gcm   aes-256-ccm   aes-256-gcm   i     returnNonec                h   t          j                    | _        | j        j        | _        | j        j        | _        t          j                    | _	        i | _
        |                                  | j        j        g| _        | j        j        r&| j                            | j        j                   d S d S N)r   Binding_bindingffi_ffilib_librust_opensslis_fips_enabled_fips_enabled_cipher_registry_register_default_ciphersEVP_PKEY_DH	_dh_typesCryptography_HAS_EVP_PKEY_DHXappendEVP_PKEY_DHXselfs    rK   __init__zBackend.__init__   s    ))M%	M%	)9;;
  	 	&&((()/092 	:N!!$)"899999	: 	:rJ   strc                r    d                     |                                 | j        | j        j                  S )Nz3<OpenSSLBackend(version: {}, FIPS: {}, Legacy: {})>)formatopenssl_version_textrb   r[   _legacy_provider_loadedrj   s    rK   __repr__zBackend.__repr__   s7    DKK%%''M1
 
 	
rJ   Nokboolerrors7typing.Optional[typing.List[rust_openssl.OpenSSLError]]c                :    t          j        | j        ||          S )N)ru   )r   _openssl_assertr_   )rk   rs   ru   s      rK   openssl_assertzBackend.openssl_assert   s    
 &ty"VDDDDrJ   c                    | j                                          t          j                    sJ t          j                    | _        d S rY   )r[   _enable_fipsr`   ra   rb   rj   s    rK   r{   zBackend._enable_fips   sD     	""$$$+-----)9;;rJ   c                    | 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_   OpenSSL_versionOPENSSL_VERSIONdecoderj   s    rK   rp   zBackend.openssl_version_text   sA     yI%%di&?@@
 

&//	rJ   intc                4    | j                                         S rY   )r_   OpenSSL_version_numrj   s    rK   openssl_version_numberzBackend.openssl_version_number   s    y,,...rJ   	algorithmhashes.HashAlgorithmc                   |j         dk    s|j         dk    r7d                    |j         |j        dz                                d          }n|j                             d          }| j                            |          }|S )Nblake2bblake2sz{}{}   r}   )namero   digest_sizeencoder_   EVP_get_digestbyname)rk   r   algevp_mds       rK   _evp_md_from_algorithmzBackend._evp_md_from_algorithm   s~    >Y&&).I*E*E--	 5 9 fWoo C .''00C//44rJ   c                v    |                      |          }|                     || j        j        k               |S rY   )r   ry   r]   NULLrk   r   r   s      rK   _evp_md_non_null_from_algorithmz'Backend._evp_md_non_null_from_algorithm   s7    ,,Y77Fdin4555rJ   c                    | j         rt          || j                  sdS |                     |          }|| j        j        k    S NF)rb   
isinstance_fips_hashesr   r]   r   r   s      rK   hash_supportedzBackend.hash_supported   sH     	jD<M&N&N 	5,,Y77''rJ   c                r    | j         rt          |t          j                  rdS |                     |          S r   rb   r   r   SHA1r   rk   r   s     rK   signature_hash_supportedz Backend.signature_hash_supported   s;    
  	*Y"D"D 	5""9---rJ   c                4    | j         rdS | j        j        dk    S NFrU   )rb   r_   Cryptography_HAS_SCRYPTrj   s    rK   scrypt_supportedzBackend.scrypt_supported   s"     	:59499rJ   c                r    | j         rt          |t          j                  rdS |                     |          S )NTr   r   s     rK   hmac_supportedzBackend.hmac_supported   s9     	*Y"D"D 	4""9---rJ   cipherr%   moder:   c                    | j         rt          || j                  sdS 	 | j        t	          |          t	          |          f         }n# t
          $ r Y dS w xY w || ||          }| j        j        |k    S r   )rb   r   _fips_ciphersrc   typeKeyErrorr]   r   )rk   r   r   adapter
evp_ciphers        rK   cipher_supportedzBackend.cipher_supported   s     	 fd&899 u	+DLL$t**,DEGG 	 	 	55	WT6400
y~++s   )A
 

AAc                z    ||f| j         v r#t          d                    ||                    || j         ||f<   d S )Nz"Duplicate registration for: {} {}.)rc   
ValueErrorro   )rk   
cipher_clsmode_clsr   s       rK   register_cipher_adapterzBackend.register_cipher_adapter   sY    !T%:::4;;   
 7>j(2333rJ   c           	        t           t          t          fD ]U}t          t          t
          t          t          t          t          fD ]&}| 
                    ||t          d                     'Vt          t          t
          t          t          fD ]+}| 
                    t          |t          d                     ,t          t          t          t          fD ]+}| 
                    t          |t          d                     ,| 
                    t          t
          t          d                     | 
                    t          t          d           t          d                     | 
                    t           t           t"                     t
          t          t          t          t          fD ]+}| 
                    t$          |t          d                     ,| j        j        s| j        j        s]t          t          t          t
          fD ]+}| 
                    t.          |t          d                     ,t          t          t          t
          fD ]+}| 
                    t0          |t          d                     ,t3          j        t6          t8          gt          t          t          t
          g          D ])\  }}| 
                    ||t          d                     *| 
                    t:          t          d           t          d	                     | 
                    t<          t          d           t          d
                     d S d S )Nz+{cipher.name}-{cipher.key_size}-{mode.name}zdes-ede3-{mode.name}zdes-ede3chacha20zsm4-{mode.name}zbf-{mode.name}zseed-{mode.name}z{cipher.name}-{mode.name}rc4rc2)r&   r'   r(   r2   r5   r6   r8   r3   r4   r7   r   GetCipherByNamer+   r-   r,   r   r9   _get_xts_cipherr*   r[   rq   r_   #CRYPTOGRAPHY_OPENSSL_300_OR_GREATERr.   r1   	itertoolsproductr/   r0   r)   rE   )rk   r   r   s      rK   rd   z!Backend._register_default_ciphers  sA   / 	 	J #sCdC@  ,,#E     c3S1 	 	H(( MNN   
 c4- 	 	H((8_5K%L%L    	$$sOJ77	
 	
 	
 	$$d4jj/*"="=	
 	
 	
 	$$S#???c3S1 	 	H((X/@AA    M1	9@	 !#sC0  ,,%#$455   
 !#sC0  ,,!#$677   
 )2(9/c3$) )  $
H ,,#$?@@   
 ((d4jj/%"8"8   ((d4jj/%"8"8    ;	 	rJ   r
   c                :    t          | ||t           j                  S rY   )r
   _ENCRYPTrk   r   r   s      rK   create_symmetric_encryption_ctxz'Backend.create_symmetric_encryption_ctxL       dFD.2IJJJrJ   c                :    t          | ||t           j                  S rY   )r
   _DECRYPTr   s      rK   create_symmetric_decryption_ctxz'Backend.create_symmetric_decryption_ctxQ  r   rJ   c                ,    |                      |          S rY   )r   r   s     rK   pbkdf2_hmac_supportedzBackend.pbkdf2_hmac_supportedV  s    ""9---rJ   &typing.List[rust_openssl.OpenSSLError]c                (    t          j                    S rY   )r`   capture_error_stackrj   s    rK   _consume_errorszBackend._consume_errorsY  s    /111rJ   c                   || j         j        k    sJ |                     | j                            |                      | j                            |          }| j                             d|          }| j                            ||          }|                     |dk               t          	                    | j         
                    |          d |         d          }|S )Nzunsigned char[]r   big)r]   r   ry   r_   BN_is_negativeBN_num_bytesnew	BN_bn2binr   
from_bytesbuffer)rk   bnbn_num_bytesbin_ptrbin_lenvals         rK   
_bn_to_intzBackend._bn_to_int\  s    TY^####	 8 8 < <<===y--b11)-- 1<@@)%%b'22GqL)))nnTY--g66xx@%HH
rJ   numc                (   |                     t          |                                dz  dz             d          }| j                            |t          |          | j        j                  }|                     || j        j        k               |S )a
  
        Converts a python integer to a BIGNUM. The returned BIGNUM will not
        be garbage collected (to support adding them to structs that take
        ownership of the object). Be sure to register it for GC if it will
        be discarded after use.
        g       @rU   r   )	to_bytesr   
bit_lengthr_   	BN_bin2bnlenr]   r   ry   )rk   r   binarybn_ptrs       rK   
_int_to_bnzBackend._int_to_bnh  sx     c#.."2"2S"81"<==uEE$$VS[[$).IIFdin4555rJ   public_exponentkey_sizersa.RSAPrivateKeyc                2   t          j        ||           | j                                        }|                     || j        j        k               | j                            || j        j                  }| 	                    |          }| j                            || j        j
                  }| j                            |||| j        j                  }|                     |dk               |                     |          }t          | ||d          S )NrU   Tunsafe_skip_rsa_key_validation)r   _verify_rsa_parametersr_   RSA_newry   r]   r   gcRSA_freer   BN_freeRSA_generate_key_ex_rsa_cdata_to_evp_pkeyr   )rk   r   r   	rsa_cdatar   resevp_pkeys          rK   generate_rsa_private_keyz Backend.generate_rsa_private_keyt  s     	"?H===I%%''	I7888ILLDI,>??	___--Y\\"di/00i++xTY^
 
 	C1H%%%..y99 )Xd
 
 
 	
rJ   c                ,    |dk    o|dz  dk    o|dk    S )N   rU   r   i   rI   )rk   r   r   s      rK   !generate_rsa_parameters_supportedz)Backend.generate_rsa_parameters_supported  s/     q   !#q( C	
rJ   numbersrsa.RSAPrivateNumbersr   c           
        t          j        |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/          | |||          S )NrU   r   )r   _check_private_key_componentspqddmp1dmq1iqmppublic_numbersenr_   r   ry   r]   r   r   r   r   RSA_set0_factorsRSA_set0_keyRSA_set0_crt_paramsr   r   )rk   r   r   r   r   r   r   r   r   r   r  r  r   r   s                 rK   load_rsa_private_numbersz Backend.load_rsa_private_numbers  s   
 	)IIILLL"$"$		
 		
 		
 I%%''	I7888ILLDI,>??	OOGI&&OOGI&&OOGI&&w|,,w|,,w|,,OOG2455OOG2455i((Aq99C1H%%%i$$Y1a88C1H%%%i++ItT4HHC1H%%%..y99+I	
 
 
 	
rJ   rsa.RSAPublicNumbersrsa.RSAPublicKeyc                6   t          j        |j        |j                   | j                                        }|                     || j        j        k               | j        	                    || j        j
                  }|                     |j                  }|                     |j                  }| j                            |||| j        j                  }|                     |dk               |                     |          }t          | ||          S NrU   )r   _check_public_key_componentsr  r  r_   r   ry   r]   r   r   r   r   r  r   r   )rk   r   r   r  r  r   r   s          rK   load_rsa_public_numberszBackend.load_rsa_public_numbers  s     	(GI>>>I%%''	I7888ILLDI,>??	OOGI&&OOGI&&i$$Y1dinEEC1H%%%..y99T9h777rJ   c                    | j                                         }|                     || j        j        k               | j                            || j         j                  }|S rY   )r_   EVP_PKEY_newry   r]   r   r   EVP_PKEY_free)rk   r   s     rK   _create_evp_pkey_gczBackend._create_evp_pkey_gc  sQ    9))++H	67779<<$)*ABBrJ   c                    |                                  }| j                            ||          }|                     |dk               |S r  )r  r_   EVP_PKEY_set1_RSAry   )rk   r   r   r   s       rK   r   zBackend._rsa_cdata_to_evp_pkey  sG    ++--i))(I>>C1H%%%rJ   databytesrA   c                2   | 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]   from_bufferr_   BIO_new_mem_bufr   ry   r   rA   r   BIO_free)rk   r  data_ptrrB   s       rK   _bytes_to_biozBackend._bytes_to_bio  sx     9((..i''#d))<<C49>1222$),,sDI,>??JJJrJ   c                B   | j                                         }|                     || j        j        k               | j                             |          }|                     || j        j        k               | j                            || j         j                  }|S )z.
        Creates an empty memory BIO.
        )r_   	BIO_s_memry   r]   r   BIO_newr   r  )rk   
bio_methodrB   s      rK   _create_mem_bio_gczBackend._create_mem_bio_gc  s     Y((**
J$).8999i
++C49>1222ill3	 233
rJ   c                F   | 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]   r   r_   BIO_get_mem_datary   r   r   )rk   rB   bufbuf_lenbio_datas        rK   _read_mem_biozBackend._read_mem_bio  s     immI&&),,S#66GaK(((CFdin45559##CFG44QQQ7rJ   r"   c                   | j                             |          }|| j         j        k    ru| j                             |          }|                     || j        j        k               | j                            || j         j                  }t          | |||          S || j         j
        k    r| j         j        s| j         j        s| j         j        s| j                             |          }|                     || j        j        k               | j                            || j         j                  }|                                 }| j                             ||          }|                     |dk               |                     |                     |          d|          S || j         j        k    rEt&          j                            t-          | j                            d|                              S || j         j        k    rs| j                             |          }|                     || j        j        k               | j                            || j         j                  }t7          | ||          S || j        v rEt&          j                            t-          | j                            d|                              S |t=          | j         dd          k    rEt&          j                            t-          | j                            d|                              S |t=          | j         dd          k    rEt&          j                             t-          | j                            d|                              S || j         j!        k    rEt&          j"                            t-          | j                            d|                              S |t=          | j         dd          k    rEt&          j#                            t-          | j                            d|                              S tI          d	          )
zd
        Return the appropriate type of PrivateKey given an evp_pkey cdata
        pointer.
        r   rU   N)passwordr   	uintptr_tEVP_PKEY_ED25519EVP_PKEY_X448EVP_PKEY_ED448Unsupported key type.)%r_   EVP_PKEY_idEVP_PKEY_RSAEVP_PKEY_get1_RSAry   r]   r   r   r   r   EVP_PKEY_RSA_PSSCRYPTOGRAPHY_IS_LIBRESSLCRYPTOGRAPHY_IS_BORINGSSL#CRYPTOGRAPHY_OPENSSL_LESS_THAN_111Er   i2d_RSAPrivateKey_bioload_der_private_keyr&  EVP_PKEY_DSAr`   r   private_key_from_ptrr   castEVP_PKEY_ECEVP_PKEY_get1_EC_KEYEC_KEY_freer   rf   r   getattrr   r   EVP_PKEY_X25519r   r   r   )rk   r   r   key_typer   rB   r   ec_cdatas           rK   _evp_pkey_to_private_keyz Backend._evp_pkey_to_private_key  s    9((22ty---	33H==I	TY^ ;<<<	Y	0BCCI!/M	    	222I6 3I7 3 IA 3 	33H==I	TY^ ;<<<	Y	0BCCI))++C)11#yAACq))),,""3''/M -   
 ///#88DINN;99::   ...y55h??HDIN :;;;y||Hdi.CDDH+D(HEEE''?77DINN;99::   ,>EEEE'<<DINN;99::   OTBBBB$99DINN;99::   222&;;DINN;99::   ,<dCCCC%::DINN;99::   ''>???rJ   r#   c                   | j                             |          }|| j         j        k    rs| j                             |          }|                     || j        j        k               | j                            || j         j                  }t          | ||          S || j         j
        k    r| j         j        s| j         j        s| j         j        s| j                             |          }|                     || j        j        k               | j                            || j         j                  }|                                 }| j                             ||          }|                     |dk               |                     |                     |                    S || j         j        k    rEt&          j                            t-          | j                            d|                              S || j         j        k    r| j                             |          }|| j        j        k    r$|                                 }t7          d|          | j                            || j         j                  }t;          | ||          S || j        v rEt&          j                            t-          | j                            d|                              S |tA          | j         dd          k    rEt&          j!                            t-          | j                            d|                              S |tA          | j         dd          k    rEt&          j"                            t-          | j                            d|                              S || j         j#        k    rEt&          j$                            t-          | j                            d|                              S |tA          | j         dd          k    rEt&          j%                            t-          | j                            d|                              S tM          d          )	zc
        Return the appropriate type of PublicKey given an evp_pkey cdata
        pointer.
        rU   r)  zUnable to load EC keyr*  Nr+  r,  r-  )'r_   r.  r/  r0  ry   r]   r   r   r   r   r1  r2  r3  r4  r   i2d_RSAPublicKey_bioload_der_public_keyr&  r7  r`   r   public_key_from_ptrr   r9  r:  r;  r   r   r<  r   rf   r   r=  r   r   r>  r   r   r   )rk   r   r?  r   rB   r   r@  ru   s           rK   _evp_pkey_to_public_keyzBackend._evp_pkey_to_public_keyG  s    9((22ty---	33H==I	TY^ ;<<<	Y	0BCCI y(;;;	222I6 3I7 3 IA 3
 	33H==I	TY^ ;<<<	Y	0BCCI))++C)00i@@Cq)))++D,>,>s,C,CDDD///#77DINN;99::   ...y55h??H49>))--// !8&AAAy||Hdi.CDDH*48DDD''?66DINN;99::   ,>EEEE';;DINN;99::   OTBBBB$88DINN;99::   222&::DINN;99::   ,<dCCCC%99DINN;99::   ''>???rJ   c                    | j         rt          |t          j                  rdS t          |t          j        t          j        t          j        t          j        t          j        f          S r   )rb   r   r   r   SHA224SHA256SHA384SHA512r   s     rK   _oaep_hash_supportedzBackend._oaep_hash_supported  sX     	*Y"D"D 	5	
 	
 		
rJ   paddingr   c                   t          |t                    rdS t          |t                    rft          |j        t                    rL| j        r&t          |j        j        t          j                  rdS | 	                    |j        j                  S t          |t                    rSt          |j        t                    r9|                     |j        j                  o|                     |j                  S dS )NTF)r   r!   r    _mgfr   rb   
_algorithmr   r   r   r   rL  rk   rM  s     rK   rsa_padding_supportedzBackend.rsa_padding_supported  s    gx(( 	4%% 	*W\4*H*H 	 ! Dj'' ' D t**7<+BCCC&& 	:glD+I+I 	,,'  @++G,>??@ 5rJ   c                h    | j         rt          |t                    rdS |                     |          S r   )rb   r   r!   rR  rQ  s     rK   rsa_encryption_supportedz Backend.rsa_encryption_supported  s7     	7*Wh"?"? 	75--g666rJ   dsa.DSAParametersc                f    |dvrt          d          t          j                            |          S )N)i   rT   i   i   z0Key size must be 1024, 2048, 3072, or 4096 bits.)r   r`   r   generate_parameters)rk   r   s     rK   generate_dsa_parameterszBackend.generate_dsa_parameters  s<    333B   33H===rJ   
parametersdsa.DSAPrivateKeyc                *    |                                 S rY   generate_private_keyrk   rY  s     rK   generate_dsa_private_keyz Backend.generate_dsa_private_key       ..000rJ   c                V    |                      |          }|                     |          S rY   )rX  r_  )rk   r   rY  s      rK   'generate_dsa_private_key_and_parametersz/Backend.generate_dsa_private_key_and_parameters  s+     11(;;
,,Z888rJ   dsa.DSAPrivateNumbersc                h    t          j        |           t          j                             |          S rY   )r   _check_dsa_private_numbersr`   from_private_numbersrk   r   s     rK   load_dsa_private_numbersz Backend.load_dsa_private_numbers  s,     	&w///44W===rJ   dsa.DSAPublicNumbersdsa.DSAPublicKeyc                r    t          j        |j                   t          j                             |          S rY   )r   _check_dsa_parametersparameter_numbersr`   from_public_numbersrg  s     rK   load_dsa_public_numberszBackend.load_dsa_public_numbers  s/     	!'";<<<33G<<<rJ   dsa.DSAParameterNumbersc                h    t          j        |           t          j                             |          S rY   )r   rl  r`   from_parameter_numbersrg  s     rK   load_dsa_parameter_numbersz"Backend.load_dsa_parameter_numbers  s,     	!'***66w???rJ   c                ,    | j         j         o| j         S rY   )r_   r3  rb   rj   s    rK   dsa_supportedzBackend.dsa_supported  s    	33ND<N8N	
rJ   c                X    |                                  sdS |                     |          S r   )ru  r   r   s     rK   dsa_hash_supportedzBackend.dsa_hash_supported  s/    !!## 	5,,Y777rJ   c                X    |                      |t          d|j        z                      S )N    )r   r2   
block_sizer   s     rK   cmac_algorithm_supportedz Backend.cmac_algorithm_supported  s/    $$s7Y%99::
 
 	
rJ   r$   r   c                "    t          | |          S rY   r   r   s     rK   create_cmac_ctxzBackend.create_cmac_ctx  s    D),,,rJ   r(  typing.Optional[bytes]c                F    |                      | j        j        |||          S rY   )	_load_keyr_   PEM_read_bio_PrivateKey)rk   r  r(  r   s       rK   load_pem_private_keyzBackend.load_pem_private_key  s+     ~~I-*	
 
 	
rJ   c                   |                      |          }| j                            d          }| j                            |j        | j        j        | j                            | j        j        d          |          }|| j        j        k    r:| j        	                    || j        j
                  }|                     |          S |                                  | j                            |j                  }|                     |dk               | j                            |j        | j        j        | j                            | j        j        d          |          }|| j        j        k    rK| j        	                    || j        j                  }|                     |          }t%          | ||          S |                                  d S )NCRYPTOGRAPHY_PASSWORD_DATA *Cryptography_pem_password_cbrU   )r  r]   r   r_   PEM_read_bio_PUBKEYrB   r   	addressof_original_libr   r  rF  r   	BIO_resetry   PEM_read_bio_RSAPublicKeyr   r   r   _handle_key_loading_error)rk   r  mem_biouserdatar   r   r   s          rK   load_pem_public_keyzBackend.load_pem_public_key  s   $$T** 9==!?@@900KINI	')G  
 
 ty~%%y||Hdi.EFFH//999
   """)%%gk22Cq)))	;;		##I+-K   I DIN** ILLDI4FGG	66yAA$T9h???..00000rJ   dh.DHParametersc                @    t           j                            |          S rY   )r`   r   from_pem_parametersrk   r  s     rK   load_pem_parameterszBackend.load_pem_parameters      224888rJ   c                    |                      |          }|                     ||          }|r|                     ||          S |                     | j        j        |||          S rY   )r  "_evp_pkey_from_der_traditional_keyrA  r  r_   d2i_PKCS8PrivateKey_bio)rk   r  r(  r   r%  keys         rK   r6  zBackend.load_der_private_key  s{     %%d++55hII 	003   >>	1.	  rJ   c                   | j                             |j        | j        j                  }|| j        j        k    r8| j                            || j         j                  }|t          d          |S |                                  d S )N4Password was given but private key is not encrypted.)	r_   d2i_PrivateKey_biorB   r]   r   r   r  	TypeErrorr   )rk   r%  r(  r  s       rK   r  z*Backend._evp_pkey_from_der_traditional_key9  s    i**8<HH$).  ),,sDI$;<<C#J   J  """4rJ   c                   |                      |          }| j                            |j        | j        j                  }|| j        j        k    r:| j                            || j        j                  }|                     |          S | 	                                 | j        
                    |j                  }|                     |dk               | j                            |j        | j        j                  }|| j        j        k    rK| j                            || j        j                  }|                     |          }t          | ||          S |                                  d S r  )r  r_   d2i_PUBKEY_biorB   r]   r   r   r  rF  r   r  ry   d2i_RSAPublicKey_bior   r   r   r  )rk   r  r  r   r   r   s         rK   rD  zBackend.load_der_public_keyG  s<   $$T**9++GKHHty~%%y||Hdi.EFFH//999
   """)%%gk22Cq)))	66TY^ I DIN** ILLDI4FGG	66yAA$T9h???..00000rJ   c                @    t           j                            |          S rY   )r`   r   from_der_parametersr  s     rK   load_der_parameterszBackend.load_der_parameters^  r  rJ   certx509.Certificate
typing.Anyc                \   |                     t          j        j                  }|                     |          }| j                            |j        | j        j	                  }| 
                    || j        j	        k               | j                            || j        j                  }|S rY   )public_bytesr   EncodingDERr  r_   d2i_X509_biorB   r]   r   ry   r   	X509_free)rk   r  r  r  r   s        rK   
_cert2osslzBackend._cert2ossla  s      !7!;<<$$T**y%%gk49>BBDDIN2333y||D$)"566rJ   x509_ptrc                    |                                  }| j                            ||          }|                     |dk               t	          j        |                     |                    S r  )r   r_   i2d_X509_biory   r   load_der_x509_certificater&  )rk   r  rB   r   s       rK   
_ossl2certzBackend._ossl2certi  sa    %%''i$$S(33C1H%%%-d.@.@.E.EFFFrJ   r  r?   c                   |                     t          j        j        t          j        j        t          j                              }|                     |          }| j        	                    |j
        | j        j                  }|                     || j        j        k               | j                            || j        j                  S rY   )private_bytesr   r  r  PrivateFormatPKCS8NoEncryptionr  r_   r  rB   r]   r   ry   r   r  )rk   r  r  r  r   s        rK   	_key2osslzBackend._key2osslo  s      "&'-&((
 

 $$T**9//KIN
 
 	H	6777y||Hdi&=>>>rJ   c                p   |                      |          }| j                            d          }|Jt          j        d|           | j                            |          }||_        t          |          |_         ||j	        | j        j
        | j                            | j        j        d          |          }|| j        j
        k    r|j        dk    re|                                  |j        dk    rt!          d          |j        dk    sJ t#          d                    |j        d	z
                      |                                  | j                            || j        j                  }||j        dk    rt!          d
          ||j        d	k    s|J |                     ||          S )Nr  r(  r  r   z3Password was not given but private key is encryptedzAPasswords longer than {} bytes are not supported by this backend.rU   r  )r  r]   r   r   _check_bytesliker  r(  r   lengthrB   r   r  r_   r  errorr   r  r   ro   maxsizer  r   r  calledrA  )	rk   openssl_read_funcr  r(  r   r  r  password_ptrr   s	            rK   r  zBackend._load_key~  s    $$T**9==!?@@":x888900::L ,H!(mmHO$$KINI	')G  
 
 ty~%%~""$$&&&>R''#M   $>R////$++16(2BQ2F+G+G  
 ..0009<<$)*ABBHOq$8$8F  
  X_%9%9 ,,4
 
 	
rJ   typing.NoReturnc                                                      }|st          d          |d                              j        j         j        j                  sl|d                              j        j         j        j                  s< j        j        r?|d                              j        j	         j        j
                  rt          d          t           fd|D                       rt          d          t          d|          )Nz|Could not deserialize key data. The data may be in an incorrect format or it may be encrypted with an unsupported algorithm.r   z Bad decrypt. Incorrect password?c              3  l   K   | ].}|                     j        j        j        j                  V  /d S rY   )_lib_reason_matchr_   ERR_LIB_EVP'EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM).0r  rk   s     rK   	<genexpr>z4Backend._handle_key_loading_error.<locals>.<genexpr>  sY       
 

 	 ##	%	A 
 
 
 
 
 
rJ   z!Unsupported public key algorithm.zCould not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).)r   r   r  r_   r  EVP_R_BAD_DECRYPTERR_LIB_PKCS12!PKCS12_R_PKCS12_CIPHERFINAL_ERRORCryptography_HAS_PROVIDERSERR_LIB_PROVPROV_R_BAD_DECRYPTany)rk   ru   s   ` rK   r  z!Backend._handle_key_loading_error  sE   %%'' )	   1I''	%ty'B "	 ay**	(	; 	"	 	4"	 1I//I*I0 "	  ?@@@ 
 
 
 

  
 
 
 
 
 	 @AAA 4   rJ   curveec.EllipticCurvec                f   	 |                      |          }n# t          $ r | j        j        }Y nw xY w| j                            |          }|| j        j        k    r|                                  dS |                     || j        j        k               | j        	                    |           dS )NFT)
_elliptic_curve_to_nidr   r_   	NID_undefEC_GROUP_new_by_curve_namer]   r   r   ry   EC_GROUP_free)rk   r  	curve_nidgroups       rK   elliptic_curve_supportedz Backend.elliptic_curve_supported  s    	,33E::II# 	, 	, 	,	+III	, 	44Y??DIN""  """5	TY-@ @AAAI##E***4s    11signature_algorithm"ec.EllipticCurveSignatureAlgorithmc                d    t          |t          j                  sdS |                     |          S r   )r   r   ECDSAr  )rk   r  r  s      rK   ,elliptic_curve_signature_algorithm_supportedz4Backend.elliptic_curve_signature_algorithm_supported  s2     -rx88 	5,,U333rJ   ec.EllipticCurvePrivateKeyc                N   |                      |          rn|                     |          }| j                            |          }|                     |dk               |                     |          }t          | ||          S t          d|j         dt          j
                  )z@
        Generate a new private key on the named curve.
        rU   z Backend object does not support .)r  _ec_key_new_by_curver_   EC_KEY_generate_keyry   _ec_cdata_to_evp_pkeyr   r   r   r   UNSUPPORTED_ELLIPTIC_CURVE)rk   r  r@  r   r   s        rK   #generate_elliptic_curve_private_keyz+Backend.generate_elliptic_curve_private_key  s     ((// 	0077H)//99Cq)))11(;;H+D(HEEE&@5:@@@3  rJ   ec.EllipticCurvePrivateNumbersc           	        |j         }|                     |j                  }| j                            |                     |j                  | j        j                  }| j        	                    ||          }|dk    r#| 
                                 t          d          |                                 5 }|                     ||j        |j        |           | j                            |          }|                     || j        j        k               t&          j                            |          }|                     || j        j        k               | j                            |          }	|                     |	| j        j        k               | j                            |	| j        j                  }	| j                            ||	|| j        j        | j        j        |          }|                     |dk               | j                            |||	|          dk    rt          d          	 d d d            n# 1 swxY w Y   |                     |          }
t5          | ||
          S )NrU   Invalid EC key.r   )r  r  r  r]   r   r   private_valuer_   BN_clear_freeEC_KEY_set_private_keyr   r   _tmp_bn_ctx)_ec_key_set_public_key_affine_coordinatesxyEC_KEY_get0_groupry   r   backendEC_KEY_get0_public_keyEC_POINT_newEC_POINT_freeEC_POINT_mulEC_POINT_cmpr  r   )rk   r   publicr@  r  r   bn_ctxr  	set_pointcomputed_pointr   s              rK   #load_elliptic_curve_private_numbersz+Backend.load_elliptic_curve_private_numbers  s    ',,V\::	OOG122DI4K
 
 i..xGG!88  """./// 	46::&(FHf   I//99E 7888;;HEEI	TY^ ;<<<!Y33E::N$). @AAA!Y\\	 7 N )((		 C q)))	&&9nf   
 !!23335	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4B --h77'hAAAs   7F IIIec.EllipticCurvePublicNumbersec.EllipticCurvePublicKeyc                   |                      |j                  }|                                 5 }|                     ||j        |j        |           d d d            n# 1 swxY w Y   |                     |          }t          | ||          S rY   )r  r  r  r  r  r  r  r   )rk   r   r@  r  r   s        rK   "load_elliptic_curve_public_numbersz*Backend.load_elliptic_curve_public_numbersE  s     ,,W];; 	6::')WY  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 --h77&tXx@@@s   #AA"%A"point_bytesc           	         |                      |          }| j                            |          }|                     || j        j        k               | j                            |          }|                     || j        j        k               | j                            || j        j                  }| 	                                5 }| j        
                    |||t          |          |          }|dk    r#|                                  t          d          	 d d d            n# 1 swxY w Y   | j                            ||          }|                     |dk               |                     |          }t!          | ||          S )NrU   z(Invalid public bytes for the given curve)r  r_   r  ry   r]   r   r  r   r  r  EC_POINT_oct2pointr   r   r   EC_KEY_set_public_keyr  r   )	rk   r  r  r@  r  pointr  r   r   s	            rK    load_elliptic_curve_public_bytesz(Backend.load_elliptic_curve_public_bytesQ  s    ,,U33	++H55ETY^3444	&&u--ETY^3444	UDI$;<< 	M6)..uk3{+;+;V C axx$$&&& !KLLL 		M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M i--h>>C1H%%%--h77&tXx@@@s   	AD++D/2D/r  c           	     V   |                      |          }| j                            |          }|                     || j        j        k               | j                            |          }|                     || j        j        k               | j                            || j        j                  }| 	                    |          }| j                            || j        j
                  }|                                 5 }| j                            |||| j        j        | j        j        |          }|                     |dk               | j                            |          }	| j                            |          }
| j                            |||	|
|          }|dk    r#|                                  t!          d          	 d d d            n# 1 swxY w Y   | j                            ||          }|                     |dk               | 	                    |          }| j                            || j        j
                  }| j                            ||          }|                     |dk               |                     |          }t)          | ||          S )NrU   z'Unable to derive key from private_value)r  r_   r  ry   r]   r   r  r   r  r   r  r  r  
BN_CTX_getEC_POINT_get_affine_coordinatesr   r   r  r  r  r   )rk   r  r  r@  r  r  valuer  r   bn_xbn_yprivater   s                rK   !derive_elliptic_curve_private_keyz)Backend.derive_elliptic_curve_private_keyg  s    ,,U33	++H55ETY^3444	&&u--ETY^3444	UDI$;<<..	UDI$;<< 	L6)((ueTY^TY^V C q)))9''//D9''//D);;udD& C axx$$&&& !JKKK 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L  i--h>>C1H%%%//-00),,w	(?@@i..xAAC1H%%%--h77'hAAAs   CGGGc                V    |                      |          }|                     |          S rY   )r  _ec_key_new_by_curve_nid)rk   r  r  s      rK   r  zBackend._ec_key_new_by_curve  s)    //66	,,Y777rJ   r  c                    | j                             |          }|                     || j        j        k               | j                            || j         j                  S rY   )r_   EC_KEY_new_by_curve_namery   r]   r   r   r<  )rk   r  r@  s      rK   r  z Backend._ec_key_new_by_curve_nid  sO    955i@@H	6777y||Hdi&;<<<rJ   ec.ECDHc                    | j         rt          || j                  sdS |                     |          ot          |t          j                  S r   )rb   r   _fips_ecdh_curvesr  r   ECDH)rk   r   r  s      rK   +elliptic_curve_exchange_algorithm_supportedz3Backend.elliptic_curve_exchange_algorithm_supported  s]      	j4)'
 '
 	 5,,U33 

rw9
 9
 	
rJ   c                    |                                  }| j                            ||          }|                     |dk               |S r  )r  r_   EVP_PKEY_set1_EC_KEYry   )rk   r@  r   r   s       rK   r  zBackend._ec_cdata_to_evp_pkey  sG    ++--i,,Xx@@C1H%%%rJ   c                   ddd}|                     |j        |j                  }| j                            |                                          }|| j        j        k    r"t          |j         dt          j                  |S )z/
        Get the NID for a curve name.
        
prime192v1
prime256v1)	secp192r1	secp256r1z" is not a supported elliptic curve)	getr   r_   
OBJ_sn2nidr   r  r   r   r  )rk   r  curve_aliases
curve_namer  s        rK   r  zBackend._elliptic_curve_to_nid  s    
 '3NN"&&uz5:>>
I(():):)<)<==		+++&:AAA3   rJ   c              #  |  K   | j                                         }|                     || j        j        k               | j                            || j         j                  }| j                             |           	 |V  | j                             |           d S # | j                             |           w xY wrY   )	r_   
BN_CTX_newry   r]   r   r   BN_CTX_freeBN_CTX_start
BN_CTX_end)rk   r  s     rK   r  zBackend._tmp_bn_ctx  s      %%''Fdin4555fdi&;<<	v&&&	)LLLI  (((((DI  ((((s   ?B B;r  r  c                P   |dk     s|dk     rt          d          | j                            |                     |          | j        j                  }| j                            |                     |          | j        j                  }| j                            |          }|                     || j        j        k               | j        	                    |          }|                     || j        j        k               | j                            || j        j
                  }| j                            |||||          }|dk    r#|                                  t          d          | j                            ||          }|                     |dk               dS )zg
        Sets the public key point in the EC_KEY context to the affine x and y
        values.
        r   z2Invalid EC key. Both x and y must be non-negative.rU   r  N)r   r]   r   r   r_   r   r  ry   r   r  r  EC_POINT_set_affine_coordinatesr   r  )rk   r@  r  r  r  r  r  r   s           rK   r  z1Backend._ec_key_set_public_key_affine_coordinates  sy    q55AEED   ILL++TY->??ILL++TY->??	++H55ETY^3444	&&u--ETY^3444	UDI$;<<i775!Q
 
 !88  """.///i--h>>C1H%%%%%rJ   encodingserialization.Encodingro   serialization.PrivateFormatencryption_algorithm(serialization.KeySerializationEncryptionc                   t          |t          j                  st          d          t          |t          j                  st          d          t          |t          j                  st          d          t          |t          j                  rd}nt          |t          j                  r*|j        }t          |          dk    rt          d          nQt          |t          j                  r(|j        |cxu rt          j        j        u rn n|j        }nt          d          |t          j        j        u rf|t          j        j        u r| j        j        }n/|t          j        j        u r| j        j        }nt          d          |                     |||          S |t          j        j        u r3| j        r)t          |t          j                  st          d	          | j                            |          }	|t          j        j        u rR|	| j        j        k    r| j        j        }n|	| j        j        k    sJ | j        j        }|                     |||          S |t          j        j        u rb|rt          d
          |	| j        j        k    r| j        j        }n|	| j        j        k    sJ | j        j        }|                     ||          S t          d          |t          j        j        u r8|t          j        j        u rt?          j         |||          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 instancerJ   i  zBPasswords longer than 1023 bytes are not supported by this backendzUnsupported encryption typezUnsupported encoding for PKCS8zCEncrypted traditional OpenSSL format is not supported in FIPS mode.zDEncryption is not supported for DER encoded traditional OpenSSL keysz+Unsupported encoding for TraditionalOpenSSLz=OpenSSH private key format can only be used with PEM encodingformat is invalid with this key)!r   r   r  r  r  KeySerializationEncryptionr  BestAvailableEncryptionr(  r   r   _KeySerializationEncryption_formatOpenSSHr  PEMr_   PEM_write_bio_PKCS8PrivateKeyr  i2d_PKCS8PrivateKey_bio_private_key_bytes_via_bioTraditionalOpenSSLrb   r.  r/  PEM_write_bio_RSAPrivateKeyr:  PEM_write_bio_ECPrivateKeyr5  i2d_ECPrivateKey_bio_bio_func_outputr;   _serialize_ssh_private_key)
rk   r+  ro   r.  r  r   cdatar(  	write_bior?  s
             rK   _private_key_byteszBackend._private_key_bytes  s    (M$:;; 	OMNNN&-"=>> 	D    -"J
 
 	    *M,FGG 	<HH -"G
 
 	< ,4H8}}t## #   $ $m&O 
	< %,3 3 3 3*23 3 3 3 3 ,4HH:;;; ]0666=1555 IC		]3777 I=		 !ABBB228X  
 ]0CCC! *$m&@+ +  !.   y,,X66H=1555ty555 $	 EII#ty'<<<<< $	 DI66uh   =1555 $3   ty555 $	 ?II#ty'<<<<< $	 >I,,Y>>>JKKK ]0888=15555#7   %   :;;;rJ   c           	         |s| j         j        }n| j                            d          }|                     ||||t          |          | j         j        | j         j                  S )Ns   aes-256-cbc)r]   r   r_   EVP_get_cipherbynamer@  r   )rk   rC  r   r(  r   s        rK   r;  z"Backend._private_key_bytes_via_bioY  sj      	HJJ 77GGJ$$MMININ
 
 	
rJ   c                    |                                  } ||g|R  }|                     |dk               |                     |          S r  )r   ry   r&  )rk   rC  argsrB   r   s        rK   r@  zBackend._bio_func_outputl  sV    %%''i#d###C1H%%%!!#&&&rJ   serialization.PublicFormatc                   t          |t          j                  st          d          t          |t          j                  st          d          |t          j        j        u re|t          j        j        u r| j        j        }n/|t          j        j	        u r| j        j
        }nt          d          |                     ||          S |t          j        j        u r| j                            |          }|| j        j        k    rt          d          |t          j        j        u r| j        j        }n/|t          j        j	        u r| j        j        }nt          d          |                     ||          S |t          j        j        u r6|t          j        j        u rt'          j        |          S t          d          t          d          )Nr1  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 encodingr2  )r   r   r  r  PublicFormatSubjectPublicKeyInfor8  r_   PEM_write_bio_PUBKEYr  i2d_PUBKEY_bior   r@  PKCS1r.  r/  PEM_write_bio_RSAPublicKeyrC  r7  r;   serialize_ssh_public_key)rk   r+  ro   r  r   rB  rC  r?  s           rK   _public_key_byteszBackend._public_key_bytesr  s    (M$:;; 	OMNNN&-"<== 	C  
 ]/DDD=1555 I:		]3777 I4		 N   ((H=== ]/555y,,X66H49111 !NOOO=1555 I@		]3777 I:		 !LMMM((E::: ]/777=19993C888C   :;;;rJ   c                    | j         j         S rY   r_   r3  rj   s    rK   dh_supportedzBackend.dh_supported      9666rJ   	generatorc                B    t           j                            ||          S rY   )r`   r   rW  rk   rW  r   s      rK   generate_dh_parameterszBackend.generate_dh_parameters  s     229hGGGrJ   dh.DHPrivateKeyc                *    |                                 S rY   r\  r^  s     rK   generate_dh_private_keyzBackend.generate_dh_private_key  r`  rJ   c                T    |                      |                     ||                    S rY   )r]  rZ  rY  s      rK   &generate_dh_private_key_and_parametersz.Backend.generate_dh_private_key_and_parameters  s/     ++''	8<<
 
 	
rJ   dh.DHPrivateNumbersc                @    t           j                            |          S rY   )r`   r   rf  rg  s     rK   load_dh_private_numberszBackend.load_dh_private_numbers  s     33G<<<rJ   dh.DHPublicNumbersdh.DHPublicKeyc                @    t           j                            |          S rY   )r`   r   rn  rg  s     rK   load_dh_public_numberszBackend.load_dh_public_numbers  s     227;;;rJ   dh.DHParameterNumbersc                @    t           j                            |          S rY   )r`   r   rr  rg  s     rK   load_dh_parameter_numbersz!Backend.load_dh_parameter_numbers  s     55g>>>rJ   r   gr   typing.Optional[int]c                    	 t           j                            t          j        |||                     dS # t          $ r Y dS w xY w)N)r   rj  r   TF)r`   r   rr  DHParameterNumbersr   )rk   r   rj  r   s       rK   dh_parameters_supportedzBackend.dh_parameters_supported  sa    	O22%Q!444   4  	 	 	55	s   48 
AAc                "    | j         j        dk    S r  )r_   rg   rj   s    rK   dh_x942_serialization_supportedz'Backend.dh_x942_serialization_supported  s    y6!;;rJ   x25519.X25519PublicKeyc                @    t           j                            |          S rY   )r`   r   from_public_bytesr  s     rK   x25519_load_public_bytesz Backend.x25519_load_public_bytes  s    "44T:::rJ   x25519.X25519PrivateKeyc                @    t           j                            |          S rY   )r`   r   from_private_bytesr  s     rK   x25519_load_private_bytesz!Backend.x25519_load_private_bytes  s     "55d;;;rJ   c                >    t           j                                        S rY   )r`   r   generate_keyrj   s    rK   x25519_generate_keyzBackend.x25519_generate_key  s    "//111rJ   c                .    | j         rdS | j        j         S r   )rb   r_   #CRYPTOGRAPHY_LIBRESSL_LESS_THAN_370rj   s    rK   x25519_supportedzBackend.x25519_supported  s      	59@@@rJ   x448.X448PublicKeyc                @    t           j                            |          S rY   )r`   r   rs  r  s     rK   x448_load_public_byteszBackend.x448_load_public_bytes  s     224888rJ   x448.X448PrivateKeyc                @    t           j                            |          S rY   )r`   r   rw  r  s     rK   x448_load_private_byteszBackend.x448_load_private_bytes  s     33D999rJ   c                >    t           j                                        S rY   )r`   r   rz  rj   s    rK   x448_generate_keyzBackend.x448_generate_key  s     --///rJ   c                H    | j         rdS | j        j         o| j        j         S r   rb   r_   r2  r3  rj   s    rK   x448_supportedzBackend.x448_supported  2     	5	22 8I77	
rJ   c                ,    | j         rdS | j        j        S r   )rb   r_    CRYPTOGRAPHY_HAS_WORKING_ED25519rj   s    rK   ed25519_supportedzBackend.ed25519_supported  s     	5y99rJ   ed25519.Ed25519PublicKeyc                @    t           j                            |          S rY   )r`   r   rs  r  s     rK   ed25519_load_public_bytesz!Backend.ed25519_load_public_bytes  s     #55d;;;rJ   ed25519.Ed25519PrivateKeyc                @    t           j                            |          S rY   )r`   r   rw  r  s     rK   ed25519_load_private_bytesz"Backend.ed25519_load_private_bytes  s     #66t<<<rJ   c                >    t           j                                        S rY   )r`   r   rz  rj   s    rK   ed25519_generate_keyzBackend.ed25519_generate_key  s    #00222rJ   c                H    | j         rdS | j        j         o| j        j         S r   r  rj   s    rK   ed448_supportedzBackend.ed448_supported  r  rJ   ed448.Ed448PublicKeyc                @    t           j                            |          S rY   )r`   r   rs  r  s     rK   ed448_load_public_byteszBackend.ed448_load_public_bytes  s    !33D999rJ   ed448.Ed448PrivateKeyc                @    t           j                            |          S rY   )r`   r   rw  r  s     rK   ed448_load_private_bytesz Backend.ed448_load_private_bytes  s    !44T:::rJ   c                >    t           j                                        S rY   )r`   r   rz  rj   s    rK   ed448_generate_keyzBackend.ed448_generate_key  s    !..000rJ   c                ,    t          j        | |          S rY   )r	   _aead_cipher_supported)rk   r   s     rK   aead_cipher_supportedzBackend.aead_cipher_supported  s    *4888rJ   r  c                4    t          |          D ]}d||<   d S )Nr   )range)rk   r  r  is       rK   
_zero_datazBackend._zero_data"  s.     v 	 	ADGG	 	rJ   c              #    K   || j         j        V  dS t          |          }| j                             d|dz             }| j                             |||           	 |V  |                     | j                             d|          |           dS # |                     | j                             d|          |           w xY w)a  
        This method takes bytes, which can be a bytestring or a mutable
        buffer like a bytearray, and yields a null-terminated version of that
        data. This is required because PKCS12_parse doesn't take a length with
        its password char * and ffi.from_buffer doesn't provide null
        termination. So, to support zeroing the data via bytearray we
        need to build this ridiculous construct that copies the memory, but
        zeroes it after use.
        Nzchar[]rU   z	uint8_t *)r]   r   r   r   memmover  r9  )rk   r  data_lenr#  s       rK   _zeroed_null_terminated_bufz#Backend._zeroed_null_terminated_buf)  s       <).     4yyH)--(Q,77CIc4222L			 	{C @ @(KKKKK	{C @ @(KKKKs   B 1Cptyping.Tuple[typing.Optional[PrivateKeyTypes], typing.Optional[x509.Certificate], typing.List[x509.Certificate]]c                    |                      ||          }|j        |j        r|j        j        nd d |j        D             fS )Nc                    g | ]	}|j         
S rI   )certificate)r  r  s     rK   
<listcomp>zABackend.load_key_and_certificates_from_pkcs12.<locals>.<listcomp>K  s    BBB$TBBBrJ   )load_pkcs12r  r  r  additional_certs)rk   r  r(  pkcs12s       rK   %load_key_and_certificates_from_pkcs12z-Backend.load_key_and_certificates_from_pkcs12@  sP     !!$11J'-{<FK##BB&*ABBB
 	
rJ   r>   c                \   |t          j        d|           |                     |          }| j                            |j        | j        j                  }|| j        j        k    r#|                                  t          d          | j        
                    || j        j                  }| j                            d          }| j                            d          }| j                            d          }|                     |          5 }| j                            |||||          }	d d d            n# 1 swxY w Y   |	dk    r#|                                  t          d          d }
d }g }|d         | j        j        k    rB| j        
                    |d         | j        j                  }|                     |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        rt5          |          }nt7          t5          |                    }|D ]}| j                            ||          }|                     || j        j        k               | j        
                    || j        j                  }|                     |          }d }| j                            || j        j                  }|| j        j        k    r| j                            |          }|                    t+          ||                     t?          ||
|          S )
Nr(  z!Could not deserialize PKCS12 datazEVP_PKEY **zX509 **zCryptography_STACK_OF_X509 **r   zInvalid password or PKCS12 dataFr   ) r   r  r  r_   d2i_PKCS12_biorB   r]   r   r   r   r   PKCS12_freer   r  PKCS12_parser  rA  r  r  X509_alias_get0r~   r=   sk_X509_freesk_X509_numr   r3  r  reversedsk_X509_valuery   rh   r>   )rk   r  r(  rB   p12evp_pkey_ptrr  sk_x509_ptrpassword_bufr   r  r  additional_certificatesr   r   cert_objr   
maybe_namesk_x509r   indicesr  	addl_cert	addl_names                           rK   r  zBackend.load_pkcs12N  s    ":x888  &&i&&sw	??$).    """@AAAill3	 566y}}]339==++imm$CDD--h77 	<)((\<; C	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 !88  """>???"$?din,,y||LOTY5LMMH // 0  C A;$).((9<<TY-@AADt,,HD224HHJTY^++y''
33$Xt44Dq>TY^++ill;q>493IJJG)''A77C 	=/96/  **"5::..  y..w::##DDIN$:;;;y||D$)*=>> OOD11	 	!Y66tTY^LL
// $	 0 0 < <I'..%i;;    (T3JKKKs   D==EEr   &typing.Optional[PKCS12PrivateKeyTypes]!typing.Optional[x509.Certificate]cas,typing.Optional[typing.List[_PKCS12CATypes]]c                .
   d }|t          j        d|           t          |t          j                  rd}d}d}	d}
| j        j        }nt          |t          j                  rV| j        j	        r| j        j
        }| j        j
        }n| j        j        }| j        j        }d}	d}
| j        j        }|j        }n@t          |t          j                  r|j        t          j        j        u rd}d}d}	d}
|j        }|j        }|t$          j        u r| j        j        }| j        j        }nF|t$          j        u r4| j        j	        st+          d          | j        j
        }| j        j
        }n|J |j        Y| j        j        st+          d          |                     |j                  }|                     || j        j        k               n| j        j        }|j        |j        }	nt7          d          |t9          |          dk    r| j        j        }nL| j                                        }| j                            || j        j                  }g }|D ]}t          |t@                    r|j!        }| "                    |j#                  }|'| j        $                    || j        j        d          }n)| j        $                    ||t9          |                    }|                     |dk               n| "                    |          }|%                    |           | j        &                    ||          }tN                              |dk               
| (                    |          5 }| (                    |          5 }|r| "                    |          n| j        j        }|| )                    |          n| j        j        }| j        *                    ||||||||	|
d
  
        }d d d            n# 1 swxY w Y   | j        j        r:|| j        j        k    r*| j        +                    ||d| j        j        d|
|           d d d            n# 1 swxY w Y   |                     || j        j        k               | j                            || j        j,                  }| -                                }| j        .                    ||          }|                     |dk               | /                    |          S )	Nr   r  r   i N  rU   z2PBESv2 is not supported by this version of OpenSSLzBSetting MAC algorithm is not supported by this version of OpenSSL.zUnsupported key encryption type)0r   _check_bytesr   r   r  r]   r   r4  r_   r   NID_aes_256_cbc&NID_pbe_WithSHA1And3_Key_TripleDES_CBCr(  r5  r6  r  PKCS12_key_cert_algorithmr<   PBESv1SHA1And3KeyTripleDESCBCPBESv2SHA256AndAES256CBCr   
_hmac_hashCryptography_HAS_PKCS12_SET_MACr   ry   _kdf_roundsr   r   sk_X509_new_nullr   r  r=   friendly_namer  r  X509_alias_set1rh   sk_X509_pushr  r  r  PKCS12_createPKCS12_set_macr  r   i2d_PKCS12_bior&  )rk   r   r  r  r  r.  r(  nid_certnid_keypkcs12_itermac_itermac_alg
keycertalgr  ossl_cascaca_aliasossl_car   r  name_buf	ossl_cert	ossl_pkeyr  rB   s                            rK   (serialize_key_and_certificates_to_pkcs12z0Backend.serialize_key_and_certificates_to_pkcs12  s    vt,,,*M,FGG K	@HGKHinGG -"G
 
 E	@ y< K94)39K)JK HinG+4HH$m&O 0	@ %,*12 2
 HGKH+4H-AJT???9K)Jt<<<yD .L    94)3!))) $.:y@ ..   >>(3  ##Gty~$=>>>>).#/;2> >???;#c((a--inGGi0022Gill7DI,BCCG H 1 1b"344 2!/H"oobn==G'"i77#TY^R  #i77#Xs8}}  ''q1111"oob11G(((i,,Wg>>&&sax0000--h77  	<11$77 859MDOOD111ty~	+.?DNN3'''	  i--                ( 	9ty~--	(( IN  1 	  	  	  	  	  	  	  	  	  	  	  	  	  	  	D 	C49>1222ill3	 566%%''i&&sC00C!G$$$!!#&&&s8   >Q'A*P
>Q'
P	Q'P	A	Q''Q+.Q+c                4    | j         rdS | j        j        dk    S r   )rb   r_   Cryptography_HAS_POLY1305rj   s    rK   poly1305_supportedzBackend.poly1305_supported7  s"     	5y2a77rJ   c                    | j         j         S rY   rT  rj   s    rK   pkcs7_supportedzBackend.pkcs7_supported<  rV  rJ   typing.List[x509.Certificate]c                   t          j        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  r_   PEM_read_bio_PKCS7rB   r]   r   r   r   r   
PKCS7_free_load_pkcs7_certificatesrk   r  rB   p7s       rK   load_pem_pkcs7_certificatesz#Backend.load_pem_pkcs7_certificates?  s     	64(((  &&Y))GTY^TY^TY^
 
   """9:::Y\\"di233,,R000rJ   c                   t          j        d|           |                     |          }| j                            |j        | j        j                  }|| j        j        k    r#|                                  t          d          | j        
                    || j        j                  }|                     |          S r  )r   r  r  r_   d2i_PKCS7_biorB   r]   r   r   r   r   r  r  r  s       rK   load_der_pkcs7_certificatesz#Backend.load_der_pkcs7_certificatesN  s     	64(((  &&Y$$SWdin==  """9:::Y\\"di233,,R000rJ   c                   | j                             |j                  }|                     || j         j        k               || j         j        k    r-t          d                    |          t          j	                  g }|j
        j        | j        j        k    r|S |j
        j        j        }| j                             |          }t!          |          D ]j}| j                             ||          }|                     || j        j        k               |                     |          }|                    |           k|S )NzNOnly basic signed structures are currently supported. NID for this data was {})r_   OBJ_obj2nidr   ry   r  NID_pkcs7_signedr   ro   r   UNSUPPORTED_SERIALIZATIONr   signr]   r   r  r  r  r  r  rh   )	rk   r  nidcertsr  r   r  r   r  s	            rK   r  z Backend._load_pkcs7_certificates[  s"   i##BG,,C49#66777$),,,&((.s2   )+49	&&L$).i##G,,s 	 	A9**7A66D	 6777??4((DLLrJ   )rV   rW   )rV   rm   rY   )rs   rt   ru   rv   rV   rW   )rV   r   )r   r   )r   r   rV   rt   )rV   rt   )r   r%   r   r:   rV   rt   )r   r%   r   r:   rV   r
   )rV   r   )r   r   )r   r   r   r   rV   r   )r   r   r   r   rV   rt   )r   r   r   rt   rV   r   )r   r  rV   r	  )r  r  rV   rA   )rV   r  )r   rt   rV   r"   )rV   r#   )rM  r   rV   rt   )r   r   rV   rU  )rY  rU  rV   rZ  )r   r   rV   rZ  )r   rc  rV   rZ  )r   ri  rV   rj  )r   rp  rV   rU  )r   r$   rV   r   )r  r  r(  r~  r   rt   rV   r"   )r  r  rV   r#   )r  r  rV   r  )r  r  rV   r  )r  r  rV   r  )r  r?   rV   r  )rV   r"   )rV   r  )r  r  rV   rt   )r  r  r  r  rV   rt   )r  r  rV   r  )r   r  rV   r  )r   r  rV   r  )r  r  r  r  rV   r  )r  r   r  r  rV   r  )r  r  )r  r   )r   r  r  r  rV   rt   )r  r  rV   r   )r  r   r  r   rV   rW   )r+  r,  ro   r-  r.  r/  rV   r  )r+  r,  ro   rI  rV   r  )rW  r   r   r   rV   r  )rY  r  rV   r[  )rW  r   r   r   rV   r[  )r   r`  rV   r[  )r   rc  rV   rd  )r   rg  rV   r  )r   r   rj  r   r   rk  rV   rt   )r  r  rV   rq  )r  r  rV   ru  )rV   ru  )r  r  rV   r  )r  r  rV   r  )rV   r  )r  r  rV   r  )r  r  rV   r  )rV   r  )r  r  rV   r  )r  r  rV   r  )rV   r  )r  r   rV   rW   )r  r  r(  r~  rV   r  )r  r  r(  r~  rV   r>   )r   r~  r  r  r  r  r  r  r.  r/  rV   r  )r  r  rV   r  )rV   r  )rF   rG   rH   __doc__r   
_fips_aeadr&   r   r   rH  rI  rJ  rK  
SHA512_224
SHA512_256SHA3_224SHA3_256SHA3_384SHA3_512SHAKE128SHAKE256r   r   	SECP224R1	SECP256R1	SECP384R1	SECP521R1r  _fips_rsa_min_key_size_fips_rsa_min_public_exponent_fips_dsa_min_modulus_fips_dh_min_key_size_fips_dh_min_modulusrl   rr   ry   r{   rp   r   r   r   r   r   r   r   r   r   rd   r   r   r   r   r   r   r   r   r  r  r  r   r  r   r&  rA  rF  rL  rR  rT  rX  r_  rb  rh  ro  rs  ru  rw  r{  r}  r  r  r  r6  r  rD  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  rD  r;  r@  rR  rU  rZ  r]  r_  rb  rf  ri  rn  rp  rt  rx  r{  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  
contextlibr  r  r  r  r  r  r  r  r  rI   rJ   rK   rM   rM   `   s	         D  J FM 	L 	


	 "$)!I  55: : : :
 
 
 
 KOE E E E E< < < <	 	 	 	/ / / /	 	 	 	   
( ( ( (. . . .: : : :. . . ., , , ,> > > >B B B BHK K K K
K K K K
. . . .2 2 2 2
 
 
 

 
 
 

 
 
 
.
 
 
 
'
 '
 '
 '
R8 8 8 8    K K K K	 	 		 	 	 	J@ J@ J@ J@X=@ =@ =@ =@~
 
 
 
   &7 7 7 7> > > >1 1 1 1
9 9 9 9> > > >= = = =@ @ @ @
 
 
 

8 8 8 8

 
 
 

- - - -
 
 
 
(1 (1 (1 (1T9 9 9 9   4  1 1 1 1.9 9 9 9   G G G G? ? ? ?2
 2
 2
 2
h, , , ,\    	4 	4 	4 	4   ,2B 2B 2B 2Bh
A 
A 
A 
AA A A A,(B (B (B (BT8 8 8 8= = = =


 

 

 

     " ) ) ^)& & & &Bn< n< n< n<`
 
 
 
&' ' ' '5< 5< 5< 5<n7 7 7 7H H H H
1 1 1 1

 
 
 
= = = =
< < < <
? ? ? ? 9=
 
 
 
 
< < < <; ; ; ;< < < <
2 2 2 2A A A A
9 9 9 9: : : :0 0 0 0
 
 
 
: : : :
< < < <
= = = =
3 3 3 3
 
 
 
: : : :; ; ; ;1 1 1 19 9 9 9    L L L,
 
 
 
IL IL IL ILV\' \' \' \'|8 8 8 8
7 7 7 71 1 1 11 1 1 1     rJ   rM   c                      e Zd ZddZdd
ZdS )r   fmtrm   c                    || _         d S rY   )_fmt)rk   r  s     rK   rl   zGetCipherByName.__init__u  s    			rJ   r  rM   r   r%   r   r:   c                   | j                             ||                                          }|j                            |                    d                    }||j        j        k    rO|j        j        rC|j        	                    |j        j        |                    d          |j        j                  }|
                                 |S )N)r   r   r}   )r  ro   lowerr_   rF  r   r]   r   Cryptography_HAS_300_EVP_CIPHEREVP_CIPHER_fetchr   )rk   r  r   r   cipher_namer   s         rK   __call__zGetCipherByName.__call__x  s    i&&f4&@@FFHH\66w''
 

 ',+++< , !66!""7++! J 	!!!rJ   N)r  rm   )r  rM   r   r%   r   r:   )rF   rG   rH   rl   r!  rI   rJ   rK   r   r   t  s<                rJ   r   r  r   r&   c                x    d|j         dz   d}| j                            |                    d                    S )Nzaes-   z-xtsr}   )r   r_   rF  r   )r  r   r   r   s       rK   r   r     s=    3A-333K<,,[-?-?-H-HIIIrJ   )r  rM   r   r&   )]
__future__r   collectionsr  r   typingr   cryptographyr   r   cryptography.exceptionsr   r   $cryptography.hazmat.backends.opensslr	   ,cryptography.hazmat.backends.openssl.ciphersr
   )cryptography.hazmat.backends.openssl.cmacr   'cryptography.hazmat.backends.openssl.ecr   r   (cryptography.hazmat.backends.openssl.rsar   r   "cryptography.hazmat.bindings._rustr   r`   $cryptography.hazmat.bindings.opensslr   cryptography.hazmat.primitivesr   r   *cryptography.hazmat.primitives._asymmetricr   )cryptography.hazmat.primitives.asymmetricr   r   r   r   r   r   r   r   1cryptography.hazmat.primitives.asymmetric.paddingr   r   r    r!   /cryptography.hazmat.primitives.asymmetric.typesr"   r#   &cryptography.hazmat.primitives.ciphersr$   r%   1cryptography.hazmat.primitives.ciphers.algorithmsr&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   ,cryptography.hazmat.primitives.ciphers.modesr2   r3   r4   r5   r6   r7   r8   r9   r:   ,cryptography.hazmat.primitives.serializationr;   3cryptography.hazmat.primitives.serialization.pkcs12r<   r=   r>   r?   r@   
namedtuplerA   rE   rM   r   r   r  rI   rJ   rK   <module>r;     sh  
 # " " " " "              % % % % % % $ $ $ $ $ $ $ $ B B B B B B B B 5 5 5 5 5 5 G G G G G G B B B B B B               G F F F F F 8 8 8 8 8 8 @ @ @ @ @ @ @ @ H H H H H H	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	                                                    
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 = < < < < <              $[#L5*2EFF
	 	 	 	 	 	 	 	Q Q Q Q Q Q Q Qh8       2J J J J
 '))rJ   