
     hg                       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 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-m.Z. d dl/m0Z0m1Z1 d dl2m3Z4 d dl5m6Z6 d dl7m8Z8m9Z9 d dl:m;Z; d dl<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZD d dlEmFZFmGZGmHZHmIZI d dlJmKZKmLZL d dlMmNZNmOZO d dlPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\ d dl]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZf d dlgmhZh d dlimjZj d dlkmlZlmmZmmnZnmoZompZp  e jq        dd d!g          Zr G d" d#          Zs G d$ d%          Zt G d& d'          Zud(etd)eQfd*Zv et            ZwdS )+    N)contextmanager)utilsx509)UnsupportedAlgorithm_Reasons)aead)_CipherContext_CMACContext)_dh_params_dup_DHParameters_DHPrivateKey_DHPublicKey)_DSAParameters_DSAPrivateKey_DSAPublicKey)_EllipticCurvePrivateKey_EllipticCurvePublicKey)_ED448_KEY_SIZE_Ed448PrivateKey_Ed448PublicKey)_Ed25519PrivateKey_Ed25519PublicKey_HashContext_HMACContext)_POLY1305_KEY_SIZE_Poly1305Context)_RSAPrivateKey_RSAPublicKey)_X448PrivateKey_X448PublicKey)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)scrypt)ssh)PBESPKCS12CertificatePKCS12KeyAndCertificatesPKCS12PrivateKeyTypes_PKCS12CATypes
_MemoryBIObiochar_ptrc                       e Zd ZdS )_RC2N)__name__
__module____qualname__     h/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/cryptography/hazmat/backends/openssl/backend.pyrY   rY   {   s        Dr^   rY   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!de"fd
Z#	 dde$de%j&        e%j'        e(j)                          ddfdZ*de$fdZ+ddZ,ddZ-e.j/        d             Z0ddZ1de"fdZ2de"fdZ3de4fdZ5de6dej7        de8fdZ9dej7        fdZ:dej7        fdZ;dej7        de$fdZ<dej7        de$fdZ=de$fdZ>dej7        de$fdZ?dej7        dej@        fdZAd eBd!eCde$fd"ZDdd#ZEdd$ZFd eBd!eCdeGfd%ZHd eBd!eCdeGfd&ZIdej7        de$fd'ZJdej7        d(e4d)e6d*e4d+e6de6fd,ZKde%j'        e(j)                 fd-ZLde4fd.ZMdd/e4fd0ZNd1e4d2e4deOjP        fd3ZQd1e4d2e4de$fd4ZRd5eOjS        d6e$deOjP        fd7ZTd5eOjU        deOjV        fd8ZWd9 ZXd: ZYd;e6deZfd<Z[d= Z\de6fd>Z]d6e$de^fd?Z_de`fd@Zadej7        de$fdAZbdBecde$fdCZddBecde$fdDZed2e4defjg        fdEZhdFefjg        defji        fdGZjd2e4defji        fdHZk	 	 ddIZld5efjm        defji        fdJZnd5efjo        defjp        fdKZqd5efjr        defjg        fdLZsdM Ztde$fdNZudej7        de$fdOZvde$fdPZwdexdeyfdQZzd;e6dRe%j&        e6         d6e$de^fdSZ{d;e6de`fdTZ|d;e6de}j~        fdUZd;e6dRe%j&        e6         d6e$de^fdVZdW Zd;e6de`fdXZd;e6de}j~        fdYZdZej        de%j        fd[Zd\e%j        dej        fd]Zdd^Zde^fd_Zde%j        fd`Zdaej        de$fdbZdcej        daej        de$fddZdaej        dej        fdeZd5ej        dej        fdfZd5ej        dej        fdgZdaej        dhe6dej        fdiZdje4daej        dej        fdkZdaej        fdlZdme4fdnZdej        daej        de$fdoZdp Zdaej        de4fdqZe/dr             Zdse4dte4ddfduZdvej        dwej        dxej        de6fdyZde6fdzZde6fd{Zdvej        dwej        de6fd|Zde$fd}Zd~e4d2e4de}j~        fdZd ZdFe}j~        de}j        fdZd~e4d2e4de}j        fdZd5e}j        de}j        fdZd5e}j        de}j        fdZd5e}j        de}j~        fdZ	 dde4de4de%j&        e4         de$fdZde$fdZd;e6dej        fdZd;e6dej        fdZd Zdej        fdZde$fdZd;e6dej        fdZd;e6dej        fdZdej        fdZde$fdZde$fdZd;e6dej        fdZd;e6dej        fdZdej        fdZde$fdZd;e6dej        fdZd;e6dej        fdZdej        fdZd+e6d)e6d(e4de4de4de4de6fdZde$fdZd(e4ddfdZe.j/        d             Zd;e6dRe%j&        e6         de%j        e%j&        e^         e%j&        ej                 e%j'        ej                 f         fdZd;e6dRe%j&        e6         defdZde%j&        e6         de%j&        e         dZe%j&        ej                 de%j&        e%j'        e                  dxej        de6fdZde$fdZde6defdZde$fdZd;e6de%j'        ej                 fdZd;e6de%j'        ej                 fdZde%j'        ej                 f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     returnNc                    t          j                    | _        | j        j        | _        | j        j        | _        |                                 | _        i | _	        | 
                                 | j        r'| j        j        rt          j        dt                     n|                                  | j        j        g| _        | j        j        r&| j                            | j        j                   d S d S )Nz<OpenSSL FIPS mode is enabled. Can't enable DRBG fork safety.)r%   Binding_bindingffi_ffilib_lib_is_fips_enabled_fips_enabled_cipher_registry_register_default_ciphers"CRYPTOGRAPHY_NEEDS_OSRANDOM_ENGINEwarningswarnUserWarningactivate_osrandom_engineEVP_PKEY_DH	_dh_typesCryptography_HAS_EVP_PKEY_DHXappendEVP_PKEY_DHXselfs    r_   __init__zBackend.__init__   s    ))M%	M%	!2244
  	 	&&((( 	,$)"N 	,MN   
 ))+++)/092 	:N!!$)"899999	: 	:r^   c                 r    d                     |                                 | j        | j        j                  S )Nz3<OpenSSLBackend(version: {}, FIPS: {}, Legacy: {})>)formatopenssl_version_textrs   rm   _legacy_provider_loadedr   s    r_   __repr__zBackend.__repr__   s7    DKK%%''M1
 
 	
r^   okerrorsc                 :    t          j        | j        ||          S )N)r   )r%   _openssl_assertrq   )r   r   r   s      r_   openssl_assertzBackend.openssl_assert   s    
 &ty"VDDDDr^   c                     | j         j        r%| j                             | j        j                  }n| j                                         }|dk    r| j                                          t          |          S Nr   )rq   Cryptography_HAS_300_FIPS&EVP_default_properties_is_fips_enabledro   NULL	FIPS_modeERR_clear_errorbool)r   modes     r_   rr   zBackend._is_fips_enabled   sm    9. 	)9CC	 DD 9&&((D199I%%'''Dzzr^   c                     | j                                          |                                 sJ |                                 | _        d S N)rm   _enable_fipsrr   rs   r   s    r_   r   zBackend._enable_fips   sJ     	""$$$$$&&&&&!2244r^   c                    | j         j        r| j                                         }|| j        j        k    r| j                             |           | j                             | j        j                  }|                     |dk               | j                             |          }|                     |dk               d S d S d S Nri   )	rq   rv   ENGINE_get_default_RANDro   r   ENGINE_unregister_RANDRAND_set_rand_methodr   ENGINE_finishr   eress      r_   activate_builtin_randomzBackend.activate_builtin_random   s    97 
	.	1133ADIN""	00333i44TY^DD##C1H---i--a00##C1H-----
	. 
	. #"r^   c              #     K   | j                             | j         j                  }|                     || j        j        k               | j                             |          }|                     |dk               	 |V  | j                             |          }|                     |dk               | j                             |          }|                     |dk               d S # | j                             |          }|                     |dk               | j                             |          }|                     |dk               w xY wr   )	rq   ENGINE_by_idCryptography_osrandom_engine_idr   ro   r   ENGINE_initENGINE_freer   r   s      r_   _get_osurandom_enginezBackend._get_osurandom_engine   s?      I""49#LMMA/000i##A&&C1H%%%	*GGG )''**Cq))))))!,,Cq)))))	 )''**Cq))))))!,,Cq))))s   >C* *A(Ec                    | j         j        r|                                  |                                 5 }| j                             |          }|                     |dk               d d d            n# 1 swxY w Y   | j                             | j        j                  }|                     |dk               d S d S r   )	rq   rv   r   r   ENGINE_set_default_RANDr   r   ro   r   r   s      r_   rz   z Backend.activate_osrandom_engine
  s    97 		*((***++-- .i77::##C1H---. . . . . . . . . . . . . . .
 )00@@Cq)))))		* 		*s   4A55A9<A9c           	         | j                             dd          }|                                 5 }| j                            |dt          |          || j         j        d          }|                     |dk               d d d            n# 1 swxY w Y   | j                             |          	                    d          S )Nchar[]@   s   get_implementationr   ascii)
ro   newr   rq   ENGINE_ctrl_cmdlenr   r   stringdecode)r   bufr   r   s       r_   osrandom_engine_implementationz&Backend.osrandom_engine_implementation  s    immHb))'')) 	)Q)++(#c((C C a(((		) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)
 y$$++G444s   ABBB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
        r   )ro   r   rq   OpenSSL_versionOPENSSL_VERSIONr   r   s    r_   r   zBackend.openssl_version_text  sA     yI%%di&?@@
 

&//	r^   c                 4    | j                                         S r   )rq   OpenSSL_version_numr   s    r_   openssl_version_numberzBackend.openssl_version_number*  s    y,,...r^   key	algorithmc                 $    t          | ||          S r   r   )r   r   r   s      r_   create_hmac_ctxzBackend.create_hmac_ctx-  s     D#y111r^   c                    |j         dk    s|j         dk    r7d                    |j         |j        dz                                d          }n|j                             d          }| j                            |          }|S )Nblake2bblake2sz{}{}   r   )namer   digest_sizeencoderq   EVP_get_digestbyname)r   r   algevp_mds       r_   _evp_md_from_algorithmzBackend._evp_md_from_algorithm2  s~    >Y&&).I*E*E--	 5 9 fWoo C .''00C//44r^   c                 v    |                      |          }|                     || j        j        k               |S r   )r   r   ro   r   r   r   r   s      r_   _evp_md_non_null_from_algorithmz'Backend._evp_md_non_null_from_algorithm=  s7    ,,Y77Fdin4555r^   c                     | j         rt          || j                  sdS |                     |          }|| j        j        k    S NF)rs   
isinstance_fips_hashesr   ro   r   r   s      r_   hash_supportedzBackend.hash_supportedB  sH     	jD<M&N&N 	5,,Y77''r^   c                 r    | j         rt          |t          j                  rdS |                     |          S r   rs   r   r&   SHA1r   r   r   s     r_   signature_hash_supportedz Backend.signature_hash_supportedI  s;    
  	*Y"D"D 	5""9---r^   c                 4    | j         rdS | j        j        dk    S NFri   )rs   rq   Cryptography_HAS_SCRYPTr   s    r_   scrypt_supportedzBackend.scrypt_supportedR  s"     	:59499r^   c                 r    | j         rt          |t          j                  rdS |                     |          S )NTr   r   s     r_   hmac_supportedzBackend.hmac_supportedX  s9     	*Y"D"D 	4""9---r^   c                 "    t          | |          S r   r   r   s     r_   create_hash_ctxzBackend.create_hash_ctx_  s     D),,,r^   cipherr   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   )rs   r   _fips_ciphersrt   typeKeyErrorro   r   )r   r   r   adapter
evp_ciphers        r_   cipher_supportedzBackend.cipher_supportedd  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: {} {}.)rt   
ValueErrorr   )r   
cipher_clsmode_clsr   s       r_   register_cipher_adapterzBackend.register_cipher_adapterr  sY    !T%:::4;;   
 7>j(2333r^   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)r9   r:   r;   rE   rH   rI   rK   rF   rG   rJ   r   GetCipherByNamer>   r@   r?   r   rL   _get_xts_cipherr=   rm   r   rq   #CRYPTOGRAPHY_OPENSSL_300_OR_GREATERrA   rD   	itertoolsproductrB   rC   r<   rY   )r   r   r   s      r_   ru   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    ;	 	r^   c                 :    t          | ||t           j                  S r   )r	   _ENCRYPTr   r   r   s      r_   create_symmetric_encryption_ctxz'Backend.create_symmetric_encryption_ctx       dFD.2IJJJr^   c                 :    t          | ||t           j                  S r   )r	   _DECRYPTr   s      r_   create_symmetric_decryption_ctxz'Backend.create_symmetric_decryption_ctx  r   r^   c                 ,    |                      |          S r   )r   r   s     r_   pbkdf2_hmac_supportedzBackend.pbkdf2_hmac_supported  s    ""9---r^   lengthsalt
iterationskey_materialc           
         | j                             d|          }|                     |          }| j                             |          }| j                            |t          |          |t          |          ||||          }	|                     |	dk               | j                             |          d d          S )Nunsigned char[]ri   )	ro   r   r   from_bufferrq   PKCS5_PBKDF2_HMACr   r   buffer)
r   r   r   r  r  r  r   r   key_material_ptrr   s
             r_   derive_pbkdf2_hmaczBackend.derive_pbkdf2_hmac  s     imm-v6655i@@900>>i))II	
 	
 	C1H%%%y$$QQQ''r^   c                 (    t          j                    S r   )rust_opensslcapture_error_stackr   s    r_   _consume_errorszBackend._consume_errors  s    /111r^   c                    || j         j        k    sJ |                     | j                            |                      | j                            |          }| j                             d|          }| j                            ||          }|                     |dk               t          	                    | j         
                    |          d |         d          }|S )Nr  r   big)ro   r   r   rq   BN_is_negativeBN_num_bytesr   	BN_bn2binint
from_bytesr  )r   bnbn_num_bytesbin_ptrbin_lenvals         r_   
_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
r^   numc                 X   ||| j         j        k    sJ || j         j        }|                    t          |                                dz  dz             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       @ri   r  )	ro   r   to_bytesr  
bit_lengthrq   	BN_bin2bnr   r   )r   r  r  binarybn_ptrs        r_   
_int_to_bnzBackend._int_to_bn  s     zR49>1111:Bc#.."2"2S"81"<==uEE$$VS[["==Fdin4555r^   public_exponentkey_sizec                 2   t          j        ||           | j                                        }|                     || j        j        k               | j                            || j        j                  }| 	                    |          }| j                            || j        j
                  }| j                            |||| j        j                  }|                     |dk               |                     |          }t          | ||d          S )Nri   Tunsafe_skip_rsa_key_validation)r.   _verify_rsa_parametersrq   RSA_newr   ro   r   gcRSA_freer#  BN_freeRSA_generate_key_ex_rsa_cdata_to_evp_pkeyr    )r   r$  r%  	rsa_cdatar  r   evp_pkeys          r_   generate_rsa_private_keyz Backend.generate_rsa_private_key  s     	"?H===I%%''	I7888ILLDI,>??	___--Y\\"di/00i++xTY^
 
 	C1H%%%..y99 )Xd
 
 
 	
r^   c                 ,    |dk    o|dz  dk    o|dk    S )N   ri   r   i   r]   )r   r$  r%  s      r_   !generate_rsa_parameters_supportedz)Backend.generate_rsa_parameters_supported  s/     q   !#q( C	
r^   numbersr(  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 )Nri   r'  )r.   _check_private_key_componentspqddmp1dmq1iqmppublic_numbersr   nrq   r*  r   ro   r   r+  r,  r#  RSA_set0_factorsRSA_set0_keyRSA_set0_crt_paramsr/  r    )r   r6  r(  r0  r9  r:  r;  r<  r=  r>  r   r@  r   r1  s                 r_   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	
 
 
 	
r^   c                 6   t          j        |j        |j                   | j                                        }|                     || j        j        k               | j        	                    || j        j
                  }|                     |j                  }|                     |j                  }| j                            |||| j        j                  }|                     |dk               |                     |          }t          | ||          S r   )r.   _check_public_key_componentsr   r@  rq   r*  r   ro   r   r+  r,  r#  rB  r/  r!   )r   r6  r0  r   r@  r   r1  s          r_   load_rsa_public_numberszBackend.load_rsa_public_numbersM  s     	(GI>>>I%%''	I7888ILLDI,>??	OOGI&&OOGI&&i$$Y1dinEEC1H%%%..y99T9h777r^   c                     | j                                         }|                     || j        j        k               | j                            || j         j                  }|S r   )rq   EVP_PKEY_newr   ro   r   r+  EVP_PKEY_freer   r1  s     r_   _create_evp_pkey_gczBackend._create_evp_pkey_gc\  sQ    9))++H	67779<<$)*ABBr^   c                     |                                  }| j                            ||          }|                     |dk               |S r   )rL  rq   EVP_PKEY_set1_RSAr   )r   r0  r1  r   s       r_   r/  zBackend._rsa_cdata_to_evp_pkeyb  G    ++--i))(I>>C1H%%%r^   datac                 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.
        )
ro   r  rq   BIO_new_mem_bufr   r   r   rU   r+  BIO_free)r   rP  data_ptrrV   s       r_   _bytes_to_biozBackend._bytes_to_bioh  sx     9((..i''#d))<<C49>1222$),,sDI,>??JJJr^   c                 B   | j                                         }|                     || j        j        k               | j                             |          }|                     || j        j        k               | j                            || j         j                  }|S )z.
        Creates an empty memory BIO.
        )rq   	BIO_s_memr   ro   r   BIO_newr+  rS  )r   
bio_methodrV   s      r_   _create_mem_bio_gczBackend._create_mem_bio_gcu  s     Y((**
J$).8999i
++C49>1222ill3	 233
r^   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)ro   r   rq   BIO_get_mem_datar   r   r  )r   rV   r   buf_lenbio_datas        r_   _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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    rs| j                             |          }|                     || j        j        k               | j                            || j         j                  }t+          | ||          S || j         j        k    rs| j                             |          }|                     || j        j        k               | j                            || j         j                  }t3          | ||          S || j        v rs| j                             |          }	|                     |	| j        j        k               | j                            |	| j         j                  }	t;          | |	|          S |t=          | j         dd          k    rt?          | |          S |t=          | j         dd          k    rtA          | |          S || j         j!        k    rEtD          j#        $                    tK          | j        &                    d|                              S |t=          | j         dd          k    rtO          | |          S tQ          d	          )
zd
        Return the appropriate type of PrivateKey given an evp_pkey cdata
        pointer.
        r'  ri   N)passwordr(  EVP_PKEY_ED25519EVP_PKEY_X448	uintptr_tEVP_PKEY_ED448Unsupported key type.))rq   EVP_PKEY_idEVP_PKEY_RSAEVP_PKEY_get1_RSAr   ro   r   r+  r,  r    EVP_PKEY_RSA_PSSCRYPTOGRAPHY_IS_LIBRESSLCRYPTOGRAPHY_IS_BORINGSSL#CRYPTOGRAPHY_OPENSSL_LESS_THAN_111ErZ  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   r|   EVP_PKEY_get1_DHDH_freer   getattrr   r"   EVP_PKEY_X25519r  r0   private_key_from_ptrr  castr   r   )
r   r1  r(  key_typer0  rV   r   	dsa_cdataec_cdatadh_cdatas
             r_   _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 -   
 ///	33H==I	TY^ ;<<<	Y	0BCCI!$	8<<<...y55h??HDIN :;;;y||Hdi.CDDH+D(HEEE''y11(;;HDIN :;;;y||Hdi.?@@H x:::,>EEEE%dH555OTBBBB"4222222&;;DINN;99::   ,<dCCCC#D(333&'>???r^   c                 2   | 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    rs| j                             |          }|                     || j        j        k               | j                            || j         j                  }t+          | ||          S || j         j        k    r| j                             |          }|| j        j        k    r$|                                 }t3          d|          | j                            || j         j                  }t7          | ||          S || j        v rs| j                             |          }	|                     |	| j        j        k               | j                            |	| j         j                  }	t?          | |	|          S |tA          | j         dd          k    rtC          | |          S |tA          | j         dd          k    rtE          | |          S || j         j#        k    rEtH          j%        &                    tO          | j        (                    d|                              S |tA          | j         dd          k    rtS          | |          S tU          d          )	zc
        Return the appropriate type of PublicKey given an evp_pkey cdata
        pointer.
        ri   zUnable to load EC keyrb  Nrc  rd  re  rf  )+rq   rg  rh  ri  r   ro   r   r+  r,  r!   rj  rk  rl  rm  rZ  i2d_RSAPublicKey_bioload_der_public_keyr_  rp  rq  rr  r   rs  rt  r  r   ru  r   r|   rv  rw  r   rx  r   r#   ry  r  r0   public_key_from_ptrr  r{  r   r   )
r   r1  r|  r0  rV   r   r}  r~  r   r  s
             r_   _evp_pkey_to_public_keyzBackend._evp_pkey_to_public_key  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///	33H==I	TY^ ;<<<	Y	0BCCI y(;;;...y55h??H49>))--// !8&AAAy||Hdi.CDDH*48DDD''y11(;;HDIN :;;;y||Hdi.?@@Hh999,>EEEE$T8444OTBBBB!$111222&::DINN;99::   ,<dCCCC"4222&'>???r^   c                     | j         rt          |t          j                  rdS t          |t          j        t          j        t          j        t          j        t          j        f          S r   )rs   r   r&   r   SHA224SHA256SHA384SHA512r   s     r_   _oaep_hash_supportedzBackend._oaep_hash_supported  sX     	*Y"D"D 	5	
 	
 		
r^   paddingc                    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   r4   r3   _mgfr1   rs   
_algorithmr&   r   r   r2   r  r   r  s     r_   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,>??@ 5r^   c                 h    | j         rt          |t                    rdS |                     |          S r   )rs   r   r4   r  r  s     r_   rsa_encryption_supportedz Backend.rsa_encryption_supported0  s7     	7*Wh"?"? 	75--g666r^   c           	         |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   rh   i   i   z0Key size must be 1024, 2048, 3072, or 4096 bits.r   ri   )
r   rq   DSA_newr   ro   r   r+  rr  DSA_generate_parameters_exr   )r   r%  ctxr   s       r_   generate_dsa_parameterszBackend.generate_dsa_parameters6  s    333B   i!!C49>1222ill3	 233i22ININININ
 
 	C1H%%%dC(((r^   
parametersc                 P   | j                             |j                  }|                     || j        j        k               | j                            || j         j                  }| j                             |           | 	                    |          }t          | ||          S r   )rq   DSAparams_dup
_dsa_cdatar   ro   r   r+  rr  DSA_generate_key_dsa_cdata_to_evp_pkeyr   )r   r  r  r1  s       r_   generate_dsa_private_keyz Backend.generate_dsa_private_keyN  s     i%%!
 
 	C49>1222ill3	 233	""3'''..s33dC222r^   c                 V    |                      |          }|                     |          S r   )r  r  )r   r%  r  s      r_   'generate_dsa_private_key_and_parametersz/Backend.generate_dsa_private_key_and_parameters[  s+     11(;;
,,Z888r^   c                     | j                             ||||          }|                     |dk               | j                             |||          }|                     |dk               d S r   )rq   DSA_set0_pqgr   DSA_set0_key)r   r}  r9  r:  gpub_keypriv_keyr   s           r_   _dsa_cdata_set_valueszBackend._dsa_cdata_set_valuesa  sn     i$$Y1a88C1H%%%i$$YBBC1H%%%%%r^   c                    t          j        |           |j        j        }| j                                        }|                     || j        j        k               | j        	                    || j        j
                  }|                     |j                  }|                     |j                  }|                     |j                  }|                     |j        j                  }|                     |j                  }|                     ||||||           |                     |          }	t'          | ||	          S r   )r*   _check_dsa_private_numbersr?  parameter_numbersrq   r  r   ro   r   r+  rr  r#  r9  r:  r  yxr  r  r   )
r   r6  r  r}  r9  r:  r  r  r  r1  s
             r_   load_dsa_private_numbersz Backend.load_dsa_private_numbersi  s    	&w///#2DI%%''	I7888ILLDI,>??	OO-/00OO-/00OO-/00//'"8":;;??79--""9aAwIII..y99dIx888r^   c                 |   t          j        |j                   | j                                        }|                     || j        j        k               | j                            || j        j	                  }| 
                    |j        j                  }| 
                    |j        j                  }| 
                    |j        j                  }| 
                    |j                  }| j        j        }|                     ||||||           |                     |          }t#          | ||          S r   )r*   _check_dsa_parametersr  rq   r  r   ro   r   r+  rr  r#  r9  r:  r  r  r  r  r   )	r   r6  r}  r9  r:  r  r  r  r1  s	            r_   load_dsa_public_numberszBackend.load_dsa_public_numbers~  s    	!'";<<<I%%''	I7888ILLDI,>??	OOG5788OOG5788OOG5788//'),,9>""9aAwIII..y99T9h777r^   c                    t          j        |           | j                                        }|                     || j        j        k               | j                            || j        j                  }| 	                    |j
                  }| 	                    |j                  }| 	                    |j                  }| j                            ||||          }|                     |dk               t          | |          S r   )r*   r  rq   r  r   ro   r   r+  rr  r#  r9  r:  r  r  r   )r   r6  r}  r9  r:  r  r   s          r_   load_dsa_parameter_numbersz"Backend.load_dsa_parameter_numbers  s     	!'***I%%''	I7888ILLDI,>??	OOGI&&OOGI&&OOGI&&i$$Y1a88C1H%%%dI...r^   c                     |                                  }| j                            ||          }|                     |dk               |S r   )rL  rq   EVP_PKEY_set1_DSAr   )r   r}  r1  r   s       r_   r  zBackend._dsa_cdata_to_evp_pkey  rO  r^   c                     | j          S r   )rs   r   s    r_   dsa_supportedzBackend.dsa_supported  s    %%%r^   c                 X    |                                  sdS |                     |          S r   )r  r   r   s     r_   dsa_hash_supportedzBackend.dsa_hash_supported  s/    !!## 	5,,Y777r^   c                 X    |                      |t          d|j        z                      S )N    )r   rE   
block_sizer   s     r_   cmac_algorithm_supportedz Backend.cmac_algorithm_supported  s/    $$s7Y%99::
 
 	
r^   c                 "    t          | |          S r   r
   r   s     r_   create_cmac_ctxzBackend.create_cmac_ctx  s    D),,,r^   ra  c                 F    |                      | j        j        |||          S r   )	_load_keyrq   PEM_read_bio_PrivateKey)r   rP  ra  r(  s       r_   load_pem_private_keyzBackend.load_pem_private_key  s+     ~~I-*	
 
 	
r^   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_cbri   )rU  ro   r   rq   PEM_read_bio_PUBKEYrV   r   	addressof_original_libr+  rJ  r  r  	BIO_resetr   PEM_read_bio_RSAPublicKeyr,  r/  r!   _handle_key_loading_error)r   rP  mem_biouserdatar1  r   r0  s          r_   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0r^   c                 b   |                      |          }| j                            |j        | j        j        | j        j        | j        j                  }|| j        j        k    r5| j                            || j        j                  }t          | |          S | 	                                 d S r   )
rU  rq   PEM_read_bio_DHparamsrV   ro   r   r+  rw  r   r  )r   rP  r  r  s       r_   load_pem_parameterszBackend.load_pem_parameters  s    $$T**922K
 
 ty~%%y||Hdi.?@@H x000**,,,,,r^   c                     |                      |          }|                     ||          }|r|                     ||          S |                     | j        j        |||          S r   )rU  "_evp_pkey_from_der_traditional_keyr  r  rq   d2i_PKCS8PrivateKey_bio)r   rP  ra  r(  r^  r   s         r_   ro  zBackend.load_der_private_key  s{     %%d++55hII 	003   >>	1.	  r^   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.)	rq   d2i_PrivateKey_biorV   ro   r   r+  rJ  	TypeErrorr  )r   r^  ra  r   s       r_   r  z*Backend._evp_pkey_from_der_traditional_key  s    i**8<HH$).  ),,sDI$;<<C#J   J  """4r^   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   )rU  rq   d2i_PUBKEY_biorV   ro   r   r+  rJ  r  r  r  r   d2i_RSAPublicKey_bior,  r/  r!   r  )r   rP  r  r1  r   r0  s         r_   r  zBackend.load_der_public_key"  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0r^   c                    |                      |          }| j                            |j        | j        j                  }|| j        j        k    r5| j                            || j        j                  }t          | |          S | j        j	        r| 
                                 | j                            |j                  }|                     |dk               | j                            |j        | j        j                  }|| j        j        k    r5| j                            || j        j                  }t          | |          S |                                  d S r   )rU  rq   d2i_DHparams_biorV   ro   r   r+  rw  r   r}   r  r  r   d2i_DHxparams_bior  )r   rP  r  r  r   s        r_   load_der_parameterszBackend.load_der_parameters9  s'   $$T**9--gk49>JJty~%%y||Hdi.?@@H x000Y4 	5  """)%%gk22Cq)))y227;	OOH49>))9<<$)2CDD$T8444&&(((((r^   certc                 \   |                     t          j        j                  }|                     |          }| j                            |j        | j        j	                  }| 
                    || j        j	        k               | j                            || j        j                  }|S r   )public_bytesr'   EncodingDERrU  rq   d2i_X509_biorV   ro   r   r   r+  	X509_free)r   r  rP  r  r   s        r_   
_cert2osslzBackend._cert2osslK  s      !7!;<<$$T**y%%gk49>BBDDIN2333y||D$)"566r^   x509_ptrc                     |                                  }| j                            ||          }|                     |dk               t	          j        |                     |                    S r   )rZ  rq   i2d_X509_bior   r   load_der_x509_certificater_  )r   r  rV   r   s       r_   
_ossl2certzBackend._ossl2certS  sa    %%''i$$S(33C1H%%%-d.@.@.E.EFFFr^   c                 v    | j                             |j        |j                  dk    rt          d          d S )Nri   zKeys do not correspond)rq   EVP_PKEY_cmp	_evp_pkeyr   )r   key1key2s      r_   _check_keys_correspondzBackend._check_keys_correspondY  s;    9!!$.$.AAQFF5666 GFr^   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  ra  r  r   z3Password was not given but private key is encryptedzAPasswords longer than {} bytes are not supported by this backend.ri   r  )rU  ro   r   r   _check_bytesliker  ra  r   r   rV   r   r  rq   r  errorr  r  r   r   maxsizer  r+  rJ  calledr  )	r   openssl_read_funcrP  ra  r(  r  r  password_ptrr1  s	            r_   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
 
 	
r^   c                                                       }|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 r   )_lib_reason_matchrq   ERR_LIB_EVP'EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM).0r  r   s     r_   	<genexpr>z4Backend._handle_key_loading_error.<locals>.<genexpr>  sY       
 

 	 ##	%	A 
 
 
 
 
 
r^   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  rq   r   EVP_R_BAD_DECRYPTERR_LIB_PKCS12!PKCS12_R_PKCS12_CIPHERFINAL_ERRORCryptography_HAS_PROVIDERSERR_LIB_PROVPROV_R_BAD_DECRYPTany)r   r   s   ` r_   r  z!Backend._handle_key_loading_error  sE   %%'' )	   1I''	%ty'B "	 ay**	(	; 	"	 	4"	 1I//I*I0 "	  ?@@@ 
 
 
 

  
 
 
 
 
 	 @AAA 4   r^   curvec                 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   rq   	NID_undefEC_GROUP_new_by_curve_namero   r   r  r   EC_GROUP_free)r   r  	curve_nidgroups       r_   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_algorithmc                 d    t          |t          j                  sdS |                     |          S r   )r   r+   ECDSAr  )r   r  r  s      r_   ,elliptic_curve_signature_algorithm_supportedz4Backend.elliptic_curve_signature_algorithm_supported  s2     -rx88 	5,,U333r^   c                 N   |                      |          rn|                     |          }| j                            |          }|                     |dk               |                     |          }t          | ||          S t          d|j         dt          j
                  )z@
        Generate a new private key on the named curve.
        ri   z Backend object does not support .)r  _ec_key_new_by_curverq   EC_KEY_generate_keyr   _ec_cdata_to_evp_pkeyr   r   r   r   UNSUPPORTED_ELLIPTIC_CURVE)r   r  r~  r   r1  s        r_   #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  r^   c           	         |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 )Nri   Invalid EC key.r   )r?  r  r  ro   r+  r#  private_valuerq   BN_clear_freeEC_KEY_set_private_keyr  r   _tmp_bn_ctx)_ec_key_set_public_key_affine_coordinatesr  r  EC_KEY_get0_groupr   r   backendEC_KEY_get0_public_keyEC_POINT_newEC_POINT_freeEC_POINT_mulEC_POINT_cmpr  r   )r   r6  publicr~  r!  r   bn_ctxr  	set_pointcomputed_pointr1  s              r_   #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c                    |                      |j                  }|                                 5 }|                     ||j        |j        |           d d d            n# 1 swxY w Y   |                     |          }t          | ||          S r   )r  r  r$  r%  r  r  r  r   )r   r6  r~  r.  r1  s        r_   "load_elliptic_curve_public_numbersz*Backend.load_elliptic_curve_public_numbers$  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 )Nri   z(Invalid public bytes for the given curve)r  rq   r&  r   ro   r   r)  r+  r*  r$  EC_POINT_oct2pointr   r  r   EC_KEY_set_public_keyr  r   )	r   r  r4  r~  r  pointr.  r   r1  s	            r_    load_elliptic_curve_public_bytesz(Backend.load_elliptic_curve_public_bytes0  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 )Nri   z'Unable to derive key from private_value)r  rq   r&  r   ro   r   r)  r+  r*  r#  r"  r$  r+  
BN_CTX_getEC_POINT_get_affine_coordinatesr  r   r7  r#  r  r   )r   r!  r  r~  r  r8  valuer.  r   bn_xbn_yprivater1  s                r_   !derive_elliptic_curve_private_keyz)Backend.derive_elliptic_curve_private_keyF  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 r   )r  _ec_key_new_by_curve_nid)r   r  r  s      r_   r  zBackend._ec_key_new_by_curvep  s)    //66	,,Y777r^   r  c                     | j                             |          }|                     || j        j        k               | j                            || j         j                  S r   )rq   EC_KEY_new_by_curve_namer   ro   r   r+  ru  )r   r  r~  s      r_   rC  z Backend._ec_key_new_by_curve_nidt  sO    955i@@H	6777y||Hdi&;<<<r^   c                     | j         rt          || j                  sdS |                     |          ot          |t          j                  S r   )rs   r   _fips_ecdh_curvesr  r+   ECDH)r   r   r  s      r_   +elliptic_curve_exchange_algorithm_supportedz3Backend.elliptic_curve_exchange_algorithm_supportedy  s]      	j4)'
 '
 	 5,,U33 

rw9
 9
 	
r^   c                     |                                  }| j                            ||          }|                     |dk               |S r   )rL  rq   EVP_PKEY_set1_EC_KEYr   )r   r~  r1  r   s       r_   r  zBackend._ec_cdata_to_evp_pkey  sG    ++--i,,Xx@@C1H%%%r^   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   rq   
OBJ_sn2nidr   r  r   r   r  )r   r  curve_aliases
curve_namer  s        r_   r  zBackend._elliptic_curve_to_nid  s    
 '3NN"&&uz5:>>
I(():):)<)<==		+++&:AAA3   r^   c              #   |  K   | j                                         }|                     || j        j        k               | j                            || j         j                  }| j                             |           	 |V  | j                             |           d S # | j                             |           w xY wr   )	rq   
BN_CTX_newr   ro   r   r+  BN_CTX_freeBN_CTX_start
BN_CTX_end)r   r.  s     r_   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.ri   r   N)r   ro   r+  r#  rq   r-  r&  r   r   r)  r*  EC_POINT_set_affine_coordinatesr  r7  )r   r~  r  r  r.  r  r8  r   s           r_   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%%%%%r^   encodingr   encryption_algorithmc                 <   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 r| j        r)t          |t          j                  st          d	          | j                            |          }	|t          j        j        u r}|	| j        j        k    r| j        j        }nI|	| j        j        k    r| j        j        }n,|	| j        j        k    r| j        j        }nt          d
          |                     |||          S |t          j        j        u r|rt          d          |	| j        j        k    r| j        j        }nI|	| j        j        k    r| j        j        }n,|	| j        j        k    r| j        j         }nt          d
          | !                    ||          S t          d          |t          j        j        u r8|t          j        j        u rtE          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 instancer^   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  r  PrivateFormatKeySerializationEncryptionNoEncryptionBestAvailableEncryptionra  r   r   _KeySerializationEncryption_formatOpenSSHPKCS8PEMrq   PEM_write_bio_PKCS8PrivateKeyr  i2d_PKCS8PrivateKey_bio_private_key_bytes_via_bioTraditionalOpenSSLrs   rg  rh  PEM_write_bio_RSAPrivateKeyrp  PEM_write_bio_DSAPrivateKeyrs  PEM_write_bio_ECPrivateKeyrn  i2d_ECPrivateKey_bioi2d_DSAPrivateKey_bio_bio_func_outputrO   _serialize_ssh_private_key)
r   r\  r   r]  r   r1  cdatara  	write_bior|  s
             r_   _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!777 $	 EII!666 $	 DII$E   66uh   =1555 $3   ty555 $	 ?II!666 $	 >II!777 $	 ?II$E   ,,Y>>>JKKK ]0888=15555#7   %   :;;;r^   c           	          |s| j         j        }n| j                            d          }|                     ||||t          |          | j         j        | j         j                  S )Ns   aes-256-cbc)ro   r   rq   EVP_get_cipherbynamers  r   )r   rv  r1  ra  r   s        r_   rl  z"Backend._private_key_bytes_via_bioB  sj      	HJJ 77GGJ$$MMININ
 
 	
r^   c                     |                                  } ||g|R  }|                     |dk               |                     |          S r   )rZ  r   r_  )r   rv  argsrV   r   s        r_   rs  zBackend._bio_func_outputU  sV    %%''i#d###C1H%%%!!#&&&r^   c                    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          )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  r  PublicFormatSubjectPublicKeyInfori  rq   PEM_write_bio_PUBKEYr  i2d_PUBKEY_bior   rs  PKCS1rg  rh  PEM_write_bio_RSAPublicKeyr  rg  rO   serialize_ssh_public_key)r   r\  r   r   r1  ru  rv  r|  s           r_   _public_key_byteszBackend._public_key_bytes[  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   :;;;r^   c                     | j         j         S r   rq   rl  r   s    r_   dh_supportedzBackend.dh_supported      9666r^   	generatorc                 $   |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    r$|                                 }t          d|          t          | |          S )Nz$DH key_size must be at least {} bits)      zDH generator must be 2 or 5ri   z Unable to generate DH parameters)r)   _MIN_MODULUS_SIZEr   r   rq   DH_newr   ro   r   r+  rw  DH_generate_parameters_exr  r   )r   r  r%  dh_param_cdatar   r   s         r_   generate_dh_parameterszBackend.generate_dh_parameters  s    b***6==(    F"":;;;))++Ndin<===ndi6GHHi11Hi
 
 !88))++F?HHHT>222r^   c                     |                                  }| j                            ||          }|                     |dk               |S r   )rL  rq   EVP_PKEY_set1_DHr   )r   r  r1  r   s       r_   _dh_cdata_to_evp_pkeyzBackend._dh_cdata_to_evp_pkey  sG    ++--i((8<<C1H%%%r^   c                     t          |j        |           }| j                            |          }|                     |dk               |                     |          }t          | ||          S r   )r   	_dh_cdatarq   DH_generate_keyr   r  r   )r   r  dh_key_cdatar   r1  s        r_   generate_dh_private_keyzBackend.generate_dh_private_key  so     & $
 
 i''55C1H%%%--l;;T<:::r^   c                 T    |                      |                     ||                    S r   )r  r  )r   r  r%  s      r_   &generate_dh_private_key_and_parametersz.Backend.generate_dh_private_key_and_parameters  s/     ++''	8<<
 
 	
r^   c                 P   |j         j        }| j                                        }|                     || j        j        k               | j                            || j        j                  }| 	                    |j
                  }| 	                    |j                  }|j        | 	                    |j                  }n| j        j        }| 	                    |j         j                  }| 	                    |j                  }| j                            ||||          }	|                     |	dk               | j                            |||          }	|                     |	dk               | j                            dd          }
| j                            ||
          }	|                     |	dk               |
d         dk    r3|j        dk    r|
d         | j        j        z  dk    st)          d          |                     |          }t-          | ||          S )Nri   int[]r   r  z.DH private numbers did not pass safety checks.)r?  r  rq   r  r   ro   r   r+  rw  r#  r9  r  r:  r  r  DH_set0_pqgDH_set0_keyr   DH_checkDH_NOT_SUITABLE_GENERATORr   r  r   )r   r6  r  r  r9  r  r:  r  r  r   codesr1  s               r_   load_dh_private_numberszBackend.load_dh_private_numbers  s    $2D9##%%H	67779<<$)*;<<OO-/00OO-/00* 1 344AA	A//'"8":;;??79--i##HaA66C1H%%%i##Hgx@@C1H%%%	gq))i  511C1H%%% 8q==1$$a49>>!CCMNNN--h77T8X666r^   c                     | j                                         }|                     || j        j        k               | j                            || j         j                  }|j        }|                     |j	                  }|                     |j
                  }|j        |                     |j                  }n| j        j        }|                     |j                  }| j                             ||||          }|                     |dk               | j                             ||| j        j                  }|                     |dk               |                     |          }	t!          | ||	          S r   )rq   r  r   ro   r   r+  rw  r  r#  r9  r  r:  r  r  r  r  r   )
r   r6  r  r  r9  r  r:  r  r   r1  s
             r_   load_dh_public_numberszBackend.load_dh_public_numbers  sJ    9##%%H	67779<<$)*;<<#5OO-/00OO-/00* 1 344AA	A//'),,i##HaA66C1H%%%i##Hgty~FFC1H%%%--h77D(H555r^   c                    | j                                         }|                     || j        j        k               | j                            || j         j                  }|                     |j                  }|                     |j	                  }|j
        |                     |j
                  }n| j        j        }| j                             ||||          }|                     |dk               t          | |          S r   )rq   r  r   ro   r   r+  rw  r#  r9  r  r:  r  r   )r   r6  r  r9  r  r:  r   s          r_   load_dh_parameter_numbersz!Backend.load_dh_parameter_numbers  s     9##%%H	67779<<$)*;<<OOGI&&OOGI&&9 	**AA	Ai##HaA66C1H%%%T8,,,r^   r9  r  r:  c                    | j                                         }|                     || j        j        k               | j                            || j         j                  }|                     |          }|                     |          }||                     |          }n| j        j        }| j                             ||||          }|                     |dk               | j        	                    dd          }| j         
                    ||          }|                     |dk               |d         dk    S )Nri   r  r   )rq   r  r   ro   r   r+  rw  r#  r  r   r  )r   r9  r  r:  r  r   r  s          r_   dh_parameters_supportedzBackend.dh_parameters_supported+  s    9##%%H	67779<<$)*;<<OOAOOA=""AA	Ai##HaA66C1H%%%	gq))i  511C1H%%%Qx1}r^   c                 "    | j         j        dk    S r   )rq   r}   r   s    r_   dh_x942_serialization_supportedz'Backend.dh_x942_serialization_supportedC  s    y6!;;r^   c                 @    t           j                            |          S r   )r  r0   from_public_bytesr   rP  s     r_   x25519_load_public_bytesz Backend.x25519_load_public_bytesF  s    "44T:::r^   c                 @    t           j                            |          S r   )r  r0   from_private_bytesr  s     r_   x25519_load_private_bytesz!Backend.x25519_load_private_bytesI  s     "55d;;;r^   c                    | 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 )Nri   EVP_PKEY **r   )rq   EVP_PKEY_CTX_new_idro   r   r   r+  EVP_PKEY_CTX_freeEVP_PKEY_keygen_initr   EVP_PKEY_keygenrJ  )r   nidevp_pkey_ctxr   	evp_ppkeyr1  s         r_   _evp_pkey_keygen_gczBackend._evp_pkey_keygen_gcN  s   y44S$).IILDIN:;;;y||L$)2MNNi,,\::C1H%%%IMM-00	i''i@@C1H%%%IaLDIN:;;;9<<	!di.EFFr^   c                 >    t           j                                        S r   )r  r0   generate_keyr   s    r_   x25519_generate_keyzBackend.x25519_generate_key[  s    "//111r^   c                 .    | j         rdS | j        j         S r   )rs   rq   #CRYPTOGRAPHY_LIBRESSL_LESS_THAN_370r   s    r_   x25519_supportedzBackend.x25519_supported^  s      	59@@@r^   c                 r   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   rq   EVP_PKEY_new_raw_public_keyNID_X448ro   r   r   r+  rJ  r#   r   rP  r1  s      r_   x448_load_public_byteszBackend.x448_load_public_bytesc  s    t99??BCCC988I	c$ii
 
 	H	67779<<$)*ABBdH---r^   c                    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   ro   r  rq   EVP_PKEY_new_raw_private_keyr  r   r   r+  rJ  r"   r   rP  rT  r1  s       r_   x448_load_private_byteszBackend.x448_load_private_bytesn  s    t99??CDDD9((..999I	#d))
 
 	H	67779<<$)*ABBtX...r^   c                 `    |                      | j        j                  }t          | |          S r   )r  rq   r  r"   rK  s     r_   x448_generate_keyzBackend.x448_generate_keyz  s*    ++DI,>??tX...r^   c                 H    | j         rdS | j        j         o| j        j         S r   )rs   rq   rk  rl  r   s    r_   x448_supportedzBackend.x448_supported~  s2     	5	22 8I77	
r^   c                 ,    | j         rdS | j        j        S r   )rs   rq    CRYPTOGRAPHY_HAS_WORKING_ED25519r   s    r_   ed25519_supportedzBackend.ed25519_supported  s     	5y99r^   c                    t          j        d|           t          |          t          j        k    rt          d          | j                            | j        j        | j	        j
        |t          |                    }|                     || j	        j
        k               | j	                            || j        j                  }t          | |          S )NrP  z&An Ed25519 public key is 32 bytes long)r   _check_bytesr   r-   _ED25519_KEY_SIZEr   rq   r  NID_ED25519ro   r   r   r+  rJ  r   r  s      r_   ed25519_load_public_bytesz!Backend.ed25519_load_public_bytes  s     	64(((t99111EFFF988I!49>4T
 
 	H	67779<<$)*ABB x000r^   c                    t          |          t          j        k    rt          d          t	          j        d|           | j                            |          }| j        	                    | j        j
        | j        j        |t          |                    }|                     || j        j        k               | j                            || j        j                  }t          | |          S )Nz'An Ed25519 private key is 32 bytes longrP  )r   r-   r  r   r   r  ro   r  rq   r  r  r   r   r+  rJ  r   r  s       r_   ed25519_load_private_bytesz"Backend.ed25519_load_private_bytes  s     t99111FGGGvt,,,9((..999I!49>8SYY
 
 	H	67779<<$)*ABB!$111r^   c                 `    |                      | j        j                  }t          | |          S r   )r  rq   r  r   rK  s     r_   ed25519_generate_keyzBackend.ed25519_generate_key  s*    ++DI,ABB!$111r^   c                 H    | j         rdS | j        j         o| j        j         S r   )rs   rq   #CRYPTOGRAPHY_OPENSSL_LESS_THAN_111Brl  r   s    r_   ed448_supportedzBackend.ed448_supported  s2     	5	== 8I77	
r^   c                    t          j        d|           t          |          t          k    rt	          d          | j                            | j        j        | j        j	        |t          |                    }| 
                    || j        j	        k               | j                            || j        j                  }t          | |          S )NrP  z$An Ed448 public key is 57 bytes long)r   r  r   r   r   rq   r  	NID_ED448ro   r   r   r+  rJ  r   r  s      r_   ed448_load_public_byteszBackend.ed448_load_public_bytes  s    64(((t99''CDDD988Is4yy
 
 	H	67779<<$)*ABBtX...r^   c                    t          j        d|           t          |          t          k    rt	          d          | j                            |          }| j                            | j        j	        | j        j
        |t          |                    }|                     || j        j
        k               | j                            || j        j                  }t          | |          S )NrP  z%An Ed448 private key is 57 bytes long)r   r  r   r   r   ro   r  rq   r  r  r   r   r+  rJ  r   r  s       r_   ed448_load_private_bytesz Backend.ed448_load_private_bytes  s    vt,,,t99''DEEE9((..999I3t99
 
 	H	67779<<$)*ABBh///r^   c                 `    |                      | j        j                  }t          | |          S r   )r  rq   r  r   rK  s     r_   ed448_generate_keyzBackend.ed448_generate_key  s*    ++DI,?@@h///r^   r@  rc                    | j                             d|          }| j                             |          }| j                            |t          |          |t          |          |||t          j        ||
  
        }	|	dk    rB|                                 }
d|z  |z  dz  }t          d
                    |          |
          | j                             |          d d          S )Nr  ri      i   zJNot enough memory to derive key. These parameters require {} MB of memory.)ro   r   r  rq   EVP_PBE_scryptr   rN   
_MEM_LIMITr  MemoryErrorr   r  )r   r  r  r   r@  r  r9  r   r	  r   r   
min_memorys               r_   derive_scryptzBackend.derive_scrypt  s     imm-v66900>>i&&II
 
 !88))++F q11J$$*F:$6$6  
 y$$QQQ''r^   c                     t          j        |          }| j        r|| j        vrdS |                    d          r| j        j        dk    S | j                            |          | j        j	        k    S )NFs   -sivri   )
r   _aead_cipher_namers   
_fips_aeadendswithrq   r   ry  ro   r   )r   r   cipher_names      r_   aead_cipher_supportedzBackend.aead_cipher_supported  sy    ,V44 	+T_"D"D5 (( 	9@AEE 	..{;;ty~Mr^   c                 4    t          |          D ]}d||<   d S r   )range)r   rP  r   is       r_   
_zero_datazBackend._zero_data  s.     v 	 	ADGG	 	r^   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.
        Nr   ri   z	uint8_t *)ro   r   r   r   memmover  r{  )r   rP  data_lenr   s       r_   _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c                     |                      ||          }|j        |j        r|j        j        nd d |j        D             fS )Nc                     g | ]	}|j         
S r]   )certificate)r  r  s     r_   
<listcomp>zABackend.load_key_and_certificates_from_pkcs12.<locals>.<listcomp>0  s    BBB$TBBBr^   )load_pkcs12r   r  r  additional_certs)r   rP  ra  pkcs12s       r_   %load_key_and_certificates_from_pkcs12z-Backend.load_key_and_certificates_from_pkcs12%  sP     !!$11J'-{<FK##BB&*ABBB
 	
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 )
Nra  z!Could not deserialize PKCS12 datar  zX509 **zCryptography_STACK_OF_X509 **r   zInvalid password or PKCS12 dataFr'  ) r   r  rU  rq   d2i_PKCS12_biorV   ro   r   r  r   r+  PKCS12_freer   r  PKCS12_parserJ  r  r  r  X509_alias_get0r   rQ   sk_X509_freesk_X509_numr   rl  r  reversedsk_X509_valuer   r~   rR   )r   rP  ra  rV   p12evp_pkey_ptrr  sk_x509_ptrpassword_bufr   r  r   additional_certificatesr1  r   cert_objr   
maybe_namesk_x509r  indicesr  	addl_cert	addl_names                           r_   r  zBackend.load_pkcs123  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   casc                 
   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        }||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  ri   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'   rc  ro   r   rd  rq   r   NID_aes_256_cbc&NID_pbe_WithSHA1And3_Key_TripleDES_CBCra  re  rf  ra  PKCS12_key_cert_algorithmrP   PBESv1SHA1And3KeyTripleDESCBCPBESv2SHA256AndAES256CBCr   
_hmac_hashCryptography_HAS_PKCS12_SET_MACr   r   _kdf_roundsr   r   sk_X509_new_nullr+  r
  rQ   friendly_namer  r  X509_alias_set1r~   sk_X509_pushr'  r  r  PKCS12_createPKCS12_set_macr  rZ  i2d_PKCS12_bior_  )r   r   r   r  r  r]  ra  nid_certnid_keypkcs12_itermac_itermac_alg
keycertalgr  ossl_cascaca_aliasossl_car   r  name_buf	ossl_certr1  r  rV   s                            r_   (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~	?"}HH#y~Hi--                * 	9ty~--	(( IN  3!	 !	 !	 !	 !	 !	 !	 !	 !	 !	 !	 !	 !	 !	 !	F 	C49>1222ill3	 566%%''i&&sC00C!G$$$!!#&&&s8   >QAO=1Q=P	QP	A	QQ!Qc                 4    | j         rdS | j        j        dk    S r   )rs   rq   Cryptography_HAS_POLY1305r   s    r_   poly1305_supportedzBackend.poly1305_supported	  s"     	5y2a77r^   c                     t          j        d|           t          |          t          k    rt	          d          t          | |          S )Nr   zA poly1305 key is 32 bytes long)r   r  r   r   r   r   )r   r   s     r_   create_poly1305_ctxzBackend.create_poly1305_ctx"	  sF    uc***s88)))>???c***r^   c                     | j         j         S r   r  r   s    r_   pkcs7_supportedzBackend.pkcs7_supported)	  r  r^   c                    t          j        d|           |                     |          }| j                            |j        | j        j        | j        j        | j        j                  }|| j        j        k    r#|                                  t          d          | j        
                    || j        j                  }|                     |          S NrP  zUnable to parse PKCS7 data)r   r  rU  rq   PEM_read_bio_PKCS7rV   ro   r   r  r   r+  
PKCS7_free_load_pkcs7_certificatesr   rP  rV   p7s       r_   load_pem_pkcs7_certificatesz#Backend.load_pem_pkcs7_certificates,	  s     	64(((  &&Y))GTY^TY^TY^
 
   """9:::Y\\"di233,,R000r^   c                    t          j        d|           |                     |          }| j                            |j        | j        j                  }|| j        j        k    r#|                                  t          d          | j        
                    || j        j                  }|                     |          S r@  )r   r  rU  rq   d2i_PKCS7_biorV   ro   r   r  r   r+  rB  rC  rD  s       r_   load_der_pkcs7_certificatesz#Backend.load_der_pkcs7_certificates;	  s     	64(((  &&Y$$SWdin==  """9:::Y\\"di233,,R000r^   c                 R   | j                             |j                  }|                     || j         j        k               || j         j        k    r-t          d                    |          t          j	                  |j
        j        j        }| j                             |          }g }t          |          D ]j}| j                             ||          }|                     || j        j        k               |                     |          }|                    |           k|S )NzNOnly basic signed structures are currently supported. NID for this data was {})rq   OBJ_obj2nidr   r   r  NID_pkcs7_signedr   r   r   UNSUPPORTED_SERIALIZATIONr;  signr  r  r  r  ro   r   r  r~   )	r   rE  r  r  r  certsr  r   r  s	            r_   rC  z Backend._load_pkcs7_certificatesH	  s
   i##BG,,C49#66777$),,,&((.s2   $).i##G,,s 	 	A9**7A66D	 6777??4((DLLr^   )rj   Nr   )rZ   r[   r\   __doc__r   r  r9   r   r&   r  r  r  r  
SHA512_224
SHA512_256SHA3_224SHA3_256SHA3_384SHA3_512SHAKE128SHAKE256r   r+   	SECP224R1	SECP256R1	SECP384R1	SECP521R1rG  _fips_rsa_min_key_size_fips_rsa_min_public_exponent_fips_dsa_min_modulus_fips_dh_min_key_size_fips_dh_min_modulusr   strr   r   typingOptionalListr  OpenSSLErrorr   rr   r   r   
contextlibr   r   rz   r   r   r  r   bytesHashAlgorithmr   r   r   r   r   r   r   r   HashContextr   r8   rM   r   r   ru   r	   r   r   r   r
  r  r  r#  r.   RSAPrivateKeyr2  r5  RSAPrivateNumbersrD  RSAPublicNumbersRSAPublicKeyrG  rL  r/  rU   rU  rZ  r_  r5   r  r6   r  r  r(   r  r  r*   DSAParametersr  DSAPrivateKeyr  r  r  DSAPrivateNumbersr  DSAPublicNumbersDSAPublicKeyr  DSAParameterNumbersr  r  r  r  r  r7   r   r  r  r  r)   DHParametersr  ro  r  r  r  r   CertificateAnyr  r  r  r  NoReturnr  EllipticCurver  EllipticCurveSignatureAlgorithmr  EllipticCurvePrivateKeyr  EllipticCurvePrivateNumbersr1  EllipticCurvePublicNumbersEllipticCurvePublicKeyr3  r9  rA  r  rC  rH  rI  r  r  r$  r%  r'   r  ra  rb  rw  rl  rs  r}  r  r  r  r  DHPrivateKeyr  r  DHPrivateNumbersr  DHPublicNumbersDHPublicKeyr  DHParameterNumbersr  r  r  r0   X25519PublicKeyr  X25519PrivateKeyr  r  r  r  r/   X448PublicKeyr  X448PrivateKeyr  r  r  r  r-   Ed25519PublicKeyr  Ed25519PrivateKeyr  r  r  r,   Ed448PublicKeyr  Ed448PrivateKeyr  r  r  r  r  r  Tupler  rR   r  rS   rT   r7  r:  r   r<  r>  rF  rI  rC  r]   r^   r_   ra   ra      s|         D  J FM 	L 	


	 "$)!I  55: : : :,
# 
 
 
 
 KOE EE L,E FGE 
	E E E E$    5 5 5 5. . . . * * *&
* 
* 
* 
*5 5 5 5 5	c 	 	 	 	/ / / / /22%+%92	2 2 2 2
	0D 	 	 	 	9M    
((< ( ( ( ( (.-.	. . . .:$ : : : :.(< . . . . .---		- - - -
, ,d ,t , , , ,> > > >B B B BHK%K-1K	K K K K
K%K-1K	K K K K
.v/C . . . . .('( ( 	(
 ( ( 
( ( ( (02\-F!G 2 2 2 2
 
 
 
 
 c    "
"
.1
		
 
 
 
.
"
.1
	
 
 
 
'
&'
 )-'
 
		'
 '
 '
 '
R8+8		8 8 8 8    K% KJ K K K K	 	 		E 	 	 	 	F@8<F@	F@ F@ F@ F@P9@> 9@ 9@ 9@ 9@v
f.B 
t 
 
 
 
-> 4    &70A 7d 7 7 7 7) )8I ) ) ) )03+3		3 3 3 399		9 9 9 9&	& & & &9,9		9 9 9 9*8+8		8 8 8 8&/./		/ / / /   &t & & & &8F,@ 8T 8 8 8 8

T 
 
 
 

-)= -, - - - -

 /%(
 )-	

 

 
 
 
(1 (1. (1 (1 (1 (1T
- 
-"/ 
- 
- 
- 
- /%( )-	
 
   4  1 1. 1 1 1 1.) )"/ ) ) ) )$t/ FJ    G6: G$2B G G G G7 7 7 72
	2
 2
 2
 2
h,6? , , , ,\b.> 4     	4?	4 	4 
		4 	4 	4 	4%		#   ,2B52B		#2B 2B 2B 2Bh
A4
A		"
A 
A 
A 
AA%A49A		"A A A A,(B (B)+)9(B		#(B (B (B (BT8"*: 8 8 8 8=# = = = =




)+)9

	

 

 

 

  B,<     " ) ) ^)& & 	& 
& & & &Bx<(x< +x< ,F	x< 
x< x< x< x<t
	
 
 
 
&'E ' ' ' '5<(5< *5< 
5< 5< 5< 5<n7d 7 7 7 733(+3	3 3 3 34  ;/;	; ; ; ;

(+
	
 
 
 
.7*.7	.7 .7 .7 .7`6)6	6 6 6 6:-,-	- - - -* 9= !'!5	   0< < < < <;U ;v7M ; ; ; ;<<		 < < < <
  2V%< 2 2 2 2A$ A A A A
	.5 	.T5G 	. 	. 	. 	.
/E 
/d6I 
/ 
/ 
/ 
//4#6 / / / /
 
 
 
 
:4 : : : :
11		!1 1 1 1 22		"2 2 2 2 2g&? 2 2 2 2
 
 
 
 
/E /e6J / / / /0U 0u7L 0 0 0 00E$9 0 0 0 0!(!( !( 	!(
 !( !( !( 
!( !( !( !(Ft    s t     L L L,

%+_U%;
	(()D$%	'

 
 
 
ILIL%+_U%;IL	!IL IL IL ILV]'oe$]' _23]' od./	]'
 _V[89]' ,F]' 
]' ]' ]' ]'~8D 8 8 8 8
+u +1A + + + +7 7 7 7 711	T%	&1 1 1 111	T%	&1 1 1 1fk$:J.K      r^   ra   c                   .    e Zd ZdefdZdededefdZdS )r   fmtc                     || _         d S r   )_fmt)r   r  s     r_   r   zGetCipherByName.__init___	  s    			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  r   lowerrq   ry  r   ro   r   Cryptography_HAS_300_EVP_CIPHEREVP_CIPHER_fetchr  )r   r'  r   r   r  r   s         r_   __call__zGetCipherByName.__call__b	  s    i&&f4&@@FFHH\66w''
 

 ',+++< , !66!""7++! J 	!!!r^   N)	rZ   r[   r\   rb  r   ra   r8   rM   r  r]   r^   r_   r   r   ^	  sX        C            r^   r   r'  r   c                 x    d|j         dz   d}| j                            |                    d                    S )Nzaes-r  z-xtsr   )r%  rq   ry  r   )r'  r   r   r  s       r_   r   r   w	  s=    3A-333K<,,[-?-?-H-HIIIr^   )xcollectionsrg  r   rc  rw   r   cryptographyr   r   cryptography.exceptionsr   r   $cryptography.hazmat.backends.opensslr   ,cryptography.hazmat.backends.openssl.ciphersr	   )cryptography.hazmat.backends.openssl.cmacr   'cryptography.hazmat.backends.openssl.dhr   r   r   r   (cryptography.hazmat.backends.openssl.dsar   r   r   'cryptography.hazmat.backends.openssl.ecr   r   *cryptography.hazmat.backends.openssl.ed448r   r   r   ,cryptography.hazmat.backends.openssl.ed25519r   r   +cryptography.hazmat.backends.openssl.hashesr   )cryptography.hazmat.backends.openssl.hmacr   -cryptography.hazmat.backends.openssl.poly1305r   r   (cryptography.hazmat.backends.openssl.rsar    r!   )cryptography.hazmat.backends.openssl.x448r"   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/   r0   1cryptography.hazmat.primitives.asymmetric.paddingr1   r2   r3   r4   /cryptography.hazmat.primitives.asymmetric.typesr5   r6   &cryptography.hazmat.primitives.ciphersr7   r8   1cryptography.hazmat.primitives.ciphers.algorithmsr9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   ,cryptography.hazmat.primitives.ciphers.modesrE   rF   rG   rH   rI   rJ   rK   rL   rM   "cryptography.hazmat.primitives.kdfrN   ,cryptography.hazmat.primitives.serializationrO   3cryptography.hazmat.primitives.serialization.pkcs12rP   rQ   rR   rS   rT   
namedtuplerU   rY   ra   r   r   r'  r]   r^   r_   <module>r     s                 % % % % % % $ $ $ $ $ $ $ $ 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                    
                
        E D D D D D B B B B B B                      G F F F F F 8 8 8 8 8 8 @ @ @ @ @ @ @ @ H H H H H H	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	                                                    
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 6 5 5 5 5 5 < < < < < <              $[#L5*2EFF
	 	 	 	 	 	 	 	\# \# \# \# \# \# \# \#~F       2JW Jc J J J J
 '))r^   