o
    ™¨Êhî< ã                   @   s2  d dl mZmZmZ 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
Zd dlZd dlmZmZ d dlmZmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZm Z  d dl!m"Z" d dl#m$Z$ d d	l%m&Z& d d
l'm(Z(m)Z) d dl*m+Z+m,Z,m-Z-m.Z. d dl/m0Z0m1Z1m2Z2 d dl3m4Z4m5Z5 d dl6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z? d dl@mAZA d dlBmCZC d dlDmEZEmFZF d dlGmHZHmIZI d dlJmKZKmLZL d dlMmNZNmOZOmPZPmQZQ d dlRmSZS d dlTmUZUmVZV d dlWmXZXmYZYmZZZ d dl[m\Z\m]Z]m^Z^m_Z_ d dl`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZi d dljmkZkmlZlmmZmmnZnmoZompZpmqZqmrZr d dlsmtZt d dlumvZv e wdddg¡Zxe ye¡e ye¡e ye¡e ye¡e ye¡e ye¡e ye¡e ye¡e ye¡e ye¡e ye¡e ye ¡e zeS {¡ j|j}e¡G d d!„ d!e~ƒƒƒƒƒƒƒƒƒƒƒƒƒƒZG d"d#„ d#e~ƒZ€d$d%„ Z�eƒ Z‚dS )&é    )Úabsolute_importÚdivisionÚprint_functionN)Úcontextmanager)ÚutilsÚx509)ÚUnsupportedAlgorithmÚ_Reasons)ÚCMACBackendÚCipherBackendÚDERSerializationBackendÚ	DHBackendÚ
DSABackendÚEllipticCurveBackendÚHMACBackendÚHashBackendÚPBKDF2HMACBackendÚPEMSerializationBackendÚ
RSABackendÚScryptBackendÚX509Backend)Úaead)Ú_CipherContext©Ú_CMACContext)Ú_CRL_ENTRY_REASON_ENUM_TO_CODEÚ	_Integers)Ú_DHParametersÚ_DHPrivateKeyÚ_DHPublicKeyÚ_dh_params_dup)Ú_DSAParametersÚ_DSAPrivateKeyÚ_DSAPublicKey)Ú_EllipticCurvePrivateKeyÚ_EllipticCurvePublicKey)	Ú$_CRL_ENTRY_EXTENSION_ENCODE_HANDLERSÚ_CRL_EXTENSION_ENCODE_HANDLERSÚ_EXTENSION_ENCODE_HANDLERSÚ)_OCSP_BASICRESP_EXTENSION_ENCODE_HANDLERSÚ'_OCSP_REQUEST_EXTENSION_ENCODE_HANDLERSÚ_encode_asn1_int_gcÚ_encode_asn1_str_gcÚ_encode_name_gcÚ_txt2obj_gc©Ú_HashContext©Ú_HMACContext)Ú_OCSPRequestÚ_OCSPResponse)Ú_RSAPrivateKeyÚ_RSAPublicKey)Ú_X25519PrivateKeyÚ_X25519PublicKey)Ú_CertificateÚ_CertificateRevocationListÚ_CertificateSigningRequestÚ_RevokedCertificate)Úbinding)ÚhashesÚserialization)ÚdsaÚecÚrsa)ÚMGF1ÚOAEPÚPKCS1v15ÚPSS)	ÚAESÚARC4ÚBlowfishÚCAST5ÚCamelliaÚChaCha20ÚIDEAÚSEEDÚ	TripleDES)ÚCBCÚCFBÚCFB8ÚCTRÚECBÚGCMÚOFBÚXTS)Úscrypt)ÚocspÚ
_MemoryBIOÚbioÚchar_ptrc                   @   sš  e Zd ZdZdZdd„ Zdd„ Zdd„ Zej	d	d
„ ƒZ
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zdâd2d3„Zd4d5„ Zd6d7„ Z d8d9„ Z!d:d;„ Z"d<d=„ Z#d>d?„ Z$d@dA„ Z%dBdC„ Z&dDdE„ Z'dFdG„ Z(dHdI„ Z)dJdK„ Z*dLdM„ Z+dNdO„ Z,dPdQ„ Z-dRdS„ Z.dTdU„ Z/dVdW„ Z0dXdY„ Z1dZd[„ Z2d\d]„ Z3d^d_„ Z4d`da„ Z5dbdc„ Z6ddde„ Z7dfdg„ Z8dhdi„ Z9djdk„ Z:dldm„ Z;dndo„ Z<dpdq„ Z=drds„ Z>dtdu„ Z?dvdw„ Z@dxdy„ ZAdzd{„ ZBd|d}„ ZCd~d„ ZDd€d�„ ZEd‚dƒ„ ZFd„d…„ ZGd†d‡„ ZHdˆd‰„ ZIdŠd‹„ ZJdŒd�„ ZKdŽd�„ ZLd�d‘„ ZMd’d“„ ZNd”d•„ ZOd–d—„ ZPd˜d™„ ZQdšd›„ ZRdœd�„ ZSdždŸ„ ZTd d¡„ ZUd¢d£„ ZVd¤d¥„ ZWd¦d§„ ZXd¨d©„ ZYdªd«„ ZZd¬d­„ Z[d®d¯„ Z\d°d±„ Z]e	d²d³„ ƒZ^d´dµ„ Z_d¶d·„ Z`d¸d¹„ Zadºd»„ Zbd¼d½„ Zcd¾d¿„ ZddÀdÁ„ ZedÂdÃ„ ZfdÄdÅ„ ZgdÆdÇ„ ZhdÈdÉ„ ZidÊdË„ ZjdÌdÍ„ ZkdÎdÏ„ ZldâdÐdÑ„ZmdÒdÓ„ ZndÔdÕ„ ZodÖd×„ ZpdØdÙ„ ZqdÚdÛ„ ZrdÜdÝ„ ZsdÞdß„ Ztdàdá„ Zud1S )ãÚBackendz)
    OpenSSL API binding interfaces.
    Úopensslc                 C   s`   t  ¡ | _| jj| _| jj| _i | _|  ¡  |  	¡  | jj
g| _| jjr.| j | jj¡ d S d S ©N)r=   ÚBindingÚ_bindingÚffiÚ_ffiÚlibÚ_libÚ_cipher_registryÚ_register_default_ciphersÚactivate_osrandom_engineÚEVP_PKEY_DHÚ	_dh_typesÚCryptography_HAS_EVP_PKEY_DHXÚappendÚEVP_PKEY_DHX©Úself© rp   ú^/var/www/html/env/lib/python3.10/site-packages/cryptography/hazmat/backends/openssl/backend.pyÚ__init__f   s   


ÿzBackend.__init__c                 C   s   t  | j|¡S r_   )r=   Ú_openssl_assertre   )ro   Úokrp   rp   rq   Úopenssl_assertr   s   zBackend.openssl_assertc                 C   sN   | j  ¡ }|| jjkr%| j  |¡ | j  ¡  | j  |¡}|  |dk¡ d S d S ©Né   )re   ÚENGINE_get_default_RANDrc   ÚNULLÚENGINE_unregister_RANDÚRAND_cleanupÚENGINE_finishru   ©ro   ÚeÚresrp   rp   rq   Úactivate_builtin_randomu   s   

úzBackend.activate_builtin_randomc              
   c   s¶   � | j  | jj¡}|  || jjk¡ | j  |¡}|  |dk¡ z |V  W | j  |¡}|  |dk¡ | j  	|¡}|  |dk¡ d S | j  |¡}|  |dk¡ | j  	|¡}|  |dk¡ w rv   )
re   ÚENGINE_by_idra   Ú_osrandom_engine_idru   rc   ry   ÚENGINE_initÚENGINE_freer|   r}   rp   rp   rq   Ú_get_osurandom_engine€   s   €üzBackend._get_osurandom_enginec                 C   sX   |   ¡  |  ¡ �}| j |¡}|  |dk¡ W d   ƒ n1 s w   Y  | j ¡  d S rv   )r€   r…   re   ÚENGINE_set_default_RANDru   r{   r}   rp   rp   rq   rh   ”   s   
ýz Backend.activate_osrandom_enginec              	   C   st   | j  dd¡}|  ¡ �}| j |dt|ƒ|| j jd¡}|  |dk¡ W d   ƒ n1 s,w   Y  | j  |¡ 	d¡S )Núchar[]é@   s   get_implementationr   Úascii)
rc   Únewr…   re   ÚENGINE_ctrl_cmdÚlenry   ru   ÚstringÚdecode)ro   Úbufr~   r   rp   rp   rq   Úosrandom_engine_implementationž   s   

þüz&Backend.osrandom_engine_implementationc                 C   s   | j  | j | jj¡¡ d¡S )z¿
        Friendly string name of the loaded OpenSSL library. This is not
        necessarily the same version as it was compiled against.

        Example: OpenSSL 1.0.1e 11 Feb 2013
        r‰   )rc   r�   re   ÚOpenSSL_versionÚOPENSSL_VERSIONrŽ   rn   rp   rp   rq   Úopenssl_version_text§   s
   ÿþzBackend.openssl_version_textc                 C   s
   | j  ¡ S r_   )re   ÚOpenSSL_version_numrn   rp   rp   rq   Úopenssl_version_number²   ó   
zBackend.openssl_version_numberc                 C   s   t | ||ƒS r_   r1   )ro   ÚkeyÚ	algorithmrp   rp   rq   Úcreate_hmac_ctxµ   ó   zBackend.create_hmac_ctxc                 C   sL   |j dks
|j dkrd |j |jd ¡ d¡}n|j  d¡}| j |¡}|S )NÚblake2bÚblake2sz{0}{1}é   r‰   )ÚnameÚformatÚdigest_sizeÚencodere   ÚEVP_get_digestbyname)ro   r˜   ÚalgÚevp_mdrp   rp   rq   Ú_evp_md_from_algorithm¸   s   ÿþzBackend._evp_md_from_algorithmc                 C   s    |   |¡}|  || jjk¡ |S r_   )r¥   ru   rc   ry   ©ro   r˜   r¤   rp   rp   rq   Ú_evp_md_non_null_from_algorithmÃ   s   
z'Backend._evp_md_non_null_from_algorithmc                 C   s   |   |¡}|| jjkS r_   )r¥   rc   ry   r¦   rp   rp   rq   Úhash_supportedÈ   s   
zBackend.hash_supportedc                 C   ó
   |   |¡S r_   ©r¨   ©ro   r˜   rp   rp   rq   Úhmac_supportedÌ   r–   zBackend.hmac_supportedc                 C   ó
   t | |ƒS r_   r/   r«   rp   rp   rq   Úcreate_hash_ctxÏ   r–   zBackend.create_hash_ctxc                 C   sH   z| j t|ƒt|ƒf }W n
 ty   Y dS w || ||ƒ}| jj|kS ©NF)rf   ÚtypeÚKeyErrorrc   ry   )ro   ÚcipherÚmodeÚadapterÚ
evp_cipherrp   rp   rq   Úcipher_supportedÒ   s   ÿzBackend.cipher_supportedc                 C   s0   ||f| j v rtd ||¡ƒ‚|| j ||f< d S )Nz$Duplicate registration for: {0} {1}.)rf   Ú
ValueErrorrŸ   )ro   Ú
cipher_clsÚmode_clsr´   rp   rp   rq   Úregister_cipher_adapterÚ   s
   ÿzBackend.register_cipher_adapterc                 C   s@  t ttttttfD ]}|  t|t	dƒ¡ q	t ttttfD ]}|  t
|t	dƒ¡ qt tttfD ]}|  t|t	dƒ¡ q.|  ttt	dƒ¡ t tttfD ]}|  t|t	dƒ¡ qIt tttfD ]}|  t|t	dƒ¡ q[t ttgt tttg¡D ]\}}|  ||t	dƒ¡ qs|  ttd ƒt	dƒ¡ |  ttd ƒt	dƒ¡ |  ttt¡ d S )	Nz+{cipher.name}-{cipher.key_size}-{mode.name}zdes-ede3-{mode.name}zdes-ede3zbf-{mode.name}zseed-{mode.name}z{cipher.name}-{mode.name}Úrc4Úchacha20)rP   rS   rT   rV   rQ   rR   rU   rº   rG   ÚGetCipherByNamerK   rO   rI   rN   Ú	itertoolsÚproductrJ   rM   rH   r°   rL   rW   Ú_get_xts_cipher)ro   r¹   r¸   rp   rp   rq   rg   á   sn   ýýýýýý
þýýýz!Backend._register_default_ciphersc                 C   ó   t | ||t jƒS r_   )r   Ú_ENCRYPT©ro   r²   r³   rp   rp   rq   Úcreate_symmetric_encryption_ctx  ó   z'Backend.create_symmetric_encryption_ctxc                 C   rÁ   r_   )r   Ú_DECRYPTrÃ   rp   rp   rq   Úcreate_symmetric_decryption_ctx  rÅ   z'Backend.create_symmetric_decryption_ctxc                 C   r©   r_   )r¬   r«   rp   rp   rq   Úpbkdf2_hmac_supported   r–   zBackend.pbkdf2_hmac_supportedc           	   
   C   s\   | j  d|¡}|  |¡}| j |t|ƒ|t|ƒ||||¡}|  |dk¡ | j  |¡d d … S ©Núunsigned char[]rw   )rc   rŠ   r§   re   ÚPKCS5_PBKDF2_HMACrŒ   ru   Úbuffer)	ro   r˜   ÚlengthÚsaltÚ
iterationsÚkey_materialr�   r¤   r   rp   rp   rq   Úderive_pbkdf2_hmac#  s   
ø
zBackend.derive_pbkdf2_hmacc                 C   s   t  | j¡S r_   )r=   Ú_consume_errorsre   rn   rp   rp   rq   rÒ   4  rš   zBackend._consume_errorsc                 C   s¨   || j jksJ ‚tjs4| j |¡}| j  d|¡}| j ||¡}|  |dk¡ t	 
| j  |¡d |… d¡S | j |¡}|  || j jk¡ | j  |¡}| j |¡ t	|dƒS )NrÊ   r   Úbigé   )rc   ry   ÚsixÚPY2re   ÚBN_num_bytesrŠ   Ú	BN_bn2binru   ÚintÚ
from_bytesrÌ   Ú	BN_bn2hexr�   ÚOPENSSL_free)ro   ÚbnÚbn_num_bytesÚbin_ptrÚbin_lenÚ	hex_cdataÚhex_strrp   rp   rq   Ú
_bn_to_int7  s   
zBackend._bn_to_intNc                 C   sÞ   |du s|| j jksJ ‚|du r| j j}tjs:| t| ¡ d d ƒd¡}| j |t	|ƒ|¡}|  
|| j jk¡ |S t|ƒ d¡dd…  d¡}| j  d¡}||d	< | j ||¡}|  
|d	k¡ |  
|d	 | j jk¡ |d	 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       @rw   rÓ   ÚLé   r‰   ú	BIGNUM **r   )rc   ry   rÕ   rÖ   Úto_bytesrÙ   Ú
bit_lengthre   Ú	BN_bin2bnrŒ   ru   ÚhexÚrstripr¡   rŠ   Ú	BN_hex2bn)ro   ÚnumrÝ   ÚbinaryÚbn_ptrÚhex_numr   rp   rp   rq   Ú
_int_to_bnJ  s   zBackend._int_to_bnc                 C   s�   t  ||¡ | j ¡ }|  || jjk¡ | j || jj¡}|  	|¡}| j || jj
¡}| j |||| jj¡}|  |dk¡ |  |¡}t| ||ƒS rv   )rB   Ú_verify_rsa_parametersre   ÚRSA_newru   rc   ry   ÚgcÚRSA_freerñ   ÚBN_freeÚRSA_generate_key_exÚ_rsa_cdata_to_evp_pkeyr5   )ro   Úpublic_exponentÚkey_sizeÚ	rsa_cdatarÝ   r   Úevp_pkeyrp   rp   rq   Úgenerate_rsa_private_keyi  s   

ÿ
z Backend.generate_rsa_private_keyc                 C   s   |dko|d@ dko|dkS )Né   rw   r   é   rp   )ro   rù   rú   rp   rp   rq   Ú!generate_rsa_parameters_supported{  s   ÿz)Backend.generate_rsa_parameters_supportedc              
   C   sR  t  |j|j|j|j|j|j|jj	|jj
¡ | j ¡ }|  || jjk¡ | j || jj¡}|  |j¡}|  |j¡}|  |j¡}|  |j¡}|  |j¡}|  |j¡}|  |jj	¡}	|  |jj
¡}
| j |||¡}|  |dk¡ | j ||
|	|¡}|  |dk¡ | j ||||¡}|  |dk¡ | j || jj¡}|  |dk¡ |  |¡}t| ||ƒS rv   )rB   Ú_check_private_key_componentsÚpÚqÚdÚdmp1Údmq1ÚiqmpÚpublic_numbersr~   Únre   ró   ru   rc   ry   rô   rõ   rñ   ÚRSA_set0_factorsÚRSA_set0_keyÚRSA_set0_crt_paramsÚRSA_blinding_onrø   r5   )ro   Únumbersrû   r  r  r  r  r  r  r~   r	  r   rü   rp   rp   rq   Úload_rsa_private_numbers  s>   ø


z Backend.load_rsa_private_numbersc                 C   s�   t  |j|j¡ | j ¡ }|  || jjk¡ | j 	|| jj
¡}|  |j¡}|  |j¡}| j |||| jj¡}|  |dk¡ |  |¡}t| ||ƒS rv   )rB   Ú_check_public_key_componentsr~   r	  re   ró   ru   rc   ry   rô   rõ   rñ   r  rø   r6   )ro   r  rû   r~   r	  r   rü   rp   rp   rq   Úload_rsa_public_numbers¡  s   

zBackend.load_rsa_public_numbersc                 C   s2   | j  ¡ }|  || jjk¡ | j || j j¡}|S r_   )re   ÚEVP_PKEY_newru   rc   ry   rô   ÚEVP_PKEY_free)ro   rü   rp   rp   rq   Ú_create_evp_pkey_gc®  s   
zBackend._create_evp_pkey_gcc                 C   ó(   |   ¡ }| j ||¡}|  |dk¡ |S rv   )r  re   ÚEVP_PKEY_set1_RSAru   )ro   rû   rü   r   rp   rp   rq   rø   ´  ó   zBackend._rsa_cdata_to_evp_pkeyc                 C   sJ   | j  d|¡}| j |t|ƒ¡}|  || j jk¡ t| j  || jj	¡|ƒS )z®
        Return a _MemoryBIO namedtuple of (BIO, char*).

        The char* is the storage for the BIO and it must stay alive until the
        BIO is finished with.
        r‡   )
rc   rŠ   re   ÚBIO_new_mem_bufrŒ   ru   ry   rZ   rô   ÚBIO_free)ro   ÚdataÚdata_char_pr[   rp   rp   rq   Ú_bytes_to_bioº  s   ÿzBackend._bytes_to_bioc                 C   sP   | j  ¡ }|  || jjk¡ | j  |¡}|  || jjk¡ | j || j j¡}|S )z.
        Creates an empty memory BIO.
        )re   Ú	BIO_s_memru   rc   ry   ÚBIO_newrô   r  )ro   Ú
bio_methodr[   rp   rp   rq   Ú_create_mem_bio_gcÉ  s   
zBackend._create_mem_bio_gcc                 C   s\   | j  d¡}| j ||¡}|  |dk¡ |  |d | j jk¡ | j  |d |¡dd… }|S )zE
        Reads a memory BIO. This only works on memory BIOs.
        zchar **r   N)rc   rŠ   re   ÚBIO_get_mem_dataru   ry   rÌ   )ro   r[   r�   Úbuf_lenÚbio_datarp   rp   rq   Ú_read_mem_bioÔ  s   zBackend._read_mem_bioc                 C   ó2  | j  |¡}|| j jkr*| j  |¡}|  || jjk¡ | j || j j¡}t	| ||ƒS || j j
krN| j  |¡}|  || jjk¡ | j || j j¡}t| ||ƒS || j jkrr| j  |¡}|  || jjk¡ | j || j j¡}t| ||ƒS || jv r•| j  |¡}|  || jjk¡ | j || j j¡}t| ||ƒS tdƒ‚)zd
        Return the appropriate type of PrivateKey given an evp_pkey cdata
        pointer.
        úUnsupported key type.)re   ÚEVP_PKEY_idÚEVP_PKEY_RSAÚEVP_PKEY_get1_RSAru   rc   ry   rô   rõ   r5   ÚEVP_PKEY_DSAÚEVP_PKEY_get1_DSAÚDSA_freer"   ÚEVP_PKEY_ECÚEVP_PKEY_get1_EC_KEYÚEC_KEY_freer$   rj   ÚEVP_PKEY_get1_DHÚDH_freer   r   ©ro   rü   Úkey_typerû   Ú	dsa_cdataÚec_cdataÚdh_cdatarp   rp   rq   Ú_evp_pkey_to_private_keyß  ó,   
z Backend._evp_pkey_to_private_keyc                 C   r%  )zc
        Return the appropriate type of PublicKey given an evp_pkey cdata
        pointer.
        r&  )re   r'  r(  r)  ru   rc   ry   rô   rõ   r6   r*  r+  r,  r#   r-  r.  r/  r%   rj   r0  r1  r   r   r2  rp   rp   rq   Ú_evp_pkey_to_public_keyþ  r8  zBackend._evp_pkey_to_public_keyc                 C   s2   | j jrt|tjtjtjtjtjfƒS t|tjƒS r_   )	re   ÚCryptography_HAS_RSA_OAEP_MDÚ
isinstancer>   ÚSHA1ÚSHA224ÚSHA256ÚSHA384ÚSHA512r«   rp   rp   rq   Ú_oaep_hash_supported  s   ûÿ
zBackend._oaep_hash_supportedc                 C   sŠ   t |tƒrdS t |tƒrt |jtƒr|  |jj¡S t |tƒrCt |jtƒrC|  |jj¡oB|  |j¡oB|j	d u pBt
|j	ƒdkpB| jjdkS dS )NTr   rw   F)r;  rE   rF   Ú_mgfrC   r¨   Ú
_algorithmrD   rA  Ú_labelrŒ   re   ÚCryptography_HAS_RSA_OAEP_LABEL)ro   Úpaddingrp   rp   rq   Úrsa_padding_supported+  s   

ÿ
û	zBackend.rsa_padding_supportedc              	   C   s~   |dvrt dƒ‚| j ¡ }|  || jjk¡ | j || jj¡}| j ||| jjd| jj| jj| jj¡}|  |dk¡ t	| |ƒS )N)i   i   i   z+Key size must be 1024 or 2048 or 3072 bits.r   rw   )
r·   re   ÚDSA_newru   rc   ry   rô   r,  ÚDSA_generate_parameters_exr!   )ro   rú   Úctxr   rp   rp   rq   Úgenerate_dsa_parameters<  s   
þ
zBackend.generate_dsa_parametersc                 C   sT   | j  |j¡}|  || jjk¡ | j || j j¡}| j  |¡ |  	|¡}t
| ||ƒS r_   )re   ÚDSAparams_dupÚ
_dsa_cdataru   rc   ry   rô   r,  ÚDSA_generate_keyÚ_dsa_cdata_to_evp_pkeyr"   )ro   Ú
parametersrJ  rü   rp   rp   rq   Úgenerate_dsa_private_keyM  s   
z Backend.generate_dsa_private_keyc                 C   s   |   |¡}|  |¡S r_   )rK  rQ  )ro   rú   rP  rp   rp   rq   Ú'generate_dsa_private_key_and_parametersV  s   

z/Backend.generate_dsa_private_key_and_parametersc                 C   sB   | j  ||||¡}|  |dk¡ | j  |||¡}|  |dk¡ d S rv   )re   ÚDSA_set0_pqgru   ÚDSA_set0_key)ro   r4  r  r  ÚgÚpub_keyÚpriv_keyr   rp   rp   rq   Ú_dsa_cdata_set_valuesZ  s   zBackend._dsa_cdata_set_valuesc           
      C   s¨   t  |¡ |jj}| j ¡ }|  || jjk¡ | j 	|| jj
¡}|  |j¡}|  |j¡}|  |j¡}|  |jj¡}|  |j¡}|  ||||||¡ |  |¡}	t| ||	ƒS r_   )r@   Ú_check_dsa_private_numbersr  Úparameter_numbersre   rH  ru   rc   ry   rô   r,  rñ   r  r  rU  ÚyÚxrX  rO  r"   )
ro   r  rZ  r4  r  r  rU  rV  rW  rü   rp   rp   rq   Úload_dsa_private_numbers`  s   


z Backend.load_dsa_private_numbersc           	      C   s¢   t  |j¡ | j ¡ }|  || jjk¡ | j || jj	¡}|  
|jj¡}|  
|jj¡}|  
|jj¡}|  
|j¡}| jj}|  ||||||¡ |  |¡}t| ||ƒS r_   )r@   Ú_check_dsa_parametersrZ  re   rH  ru   rc   ry   rô   r,  rñ   r  r  rU  r[  rX  rO  r#   )	ro   r  r4  r  r  rU  rV  rW  rü   rp   rp   rq   Úload_dsa_public_numberss  s   

zBackend.load_dsa_public_numbersc                 C   s†   t  |¡ | j ¡ }|  || jjk¡ | j || jj¡}|  	|j
¡}|  	|j¡}|  	|j¡}| j ||||¡}|  |dk¡ t| |ƒS rv   )r@   r^  re   rH  ru   rc   ry   rô   r,  rñ   r  r  rU  rS  r!   )ro   r  r4  r  r  rU  r   rp   rp   rq   Úload_dsa_parameter_numbers„  s   


z"Backend.load_dsa_parameter_numbersc                 C   r  rv   )r  re   ÚEVP_PKEY_set1_DSAru   )ro   r4  rü   r   rp   rp   rq   rO  ’  r  zBackend._dsa_cdata_to_evp_pkeyc                 C   r©   r_   rª   r«   rp   rp   rq   Údsa_hash_supported˜  r–   zBackend.dsa_hash_supportedc                 C   s   dS )NTrp   )ro   r  r  rU  rp   rp   rq   Údsa_parameters_supported›  s   z Backend.dsa_parameters_supportedc                 C   s   |   |td|j ƒ¡S )Nó    )r¶   rP   Ú
block_sizer«   rp   rp   rq   Úcmac_algorithm_supportedž  s   ÿz Backend.cmac_algorithm_supportedc                 C   r­   r_   r   r«   rp   rp   rq   Úcreate_cmac_ctx£  r–   zBackend.create_cmac_ctxc           
         s’  t |tjƒs
tdƒ‚t |tjƒrt |tjƒstdƒ‚ˆ  |¡}ˆ j	 
¡ }ˆ  |ˆ jjk¡ ˆ j |ˆ j	j¡}ˆ j	 |tjjj¡}ˆ  |dk¡ ˆ j	 |tˆ |jƒ¡}ˆ  |dk¡ | ¡ }ˆ j	 ||j¡}ˆ  |dk¡ ˆ j	 ¡ }ˆ  |ˆ jjk¡ ˆ j |‡ fdd„¡}ˆ j|jt|ˆ j	jdd� ˆ j	  ||¡}ˆ  |dk¡ ˆ j	 !||j|¡}|dkrÄˆ  "¡ }	ˆ  |	d  #ˆ j	j$ˆ j	j%¡¡ td	ƒ‚t&ˆ |ƒS )
Nú.Algorithm must be a registered hash algorithm.z5MD5 is not a supported hash algorithm for EC/DSA CSRsrw   c                    s   ˆ j  | ˆ j ˆ j jd¡¡S )NÚX509_EXTENSION_free)re   Úsk_X509_EXTENSION_pop_freerc   Ú	addressofÚ_original_lib)r\  rn   rp   rq   Ú<lambda>Ð  s
    ÿÿz)Backend.create_x509_csr.<locals>.<lambda>F©Ú
extensionsÚhandlersÚx509_objÚadd_funcrô   r   úDigest too big for RSA key)'r;  r>   ÚHashAlgorithmÚ	TypeErrorÚMD5rB   ÚRSAPrivateKeyr·   r§   re   ÚX509_REQ_newru   rc   ry   rô   ÚX509_REQ_freeÚX509_REQ_set_versionr   ÚVersionÚv1ÚvalueÚX509_REQ_set_subject_namer-   Ú_subject_nameÚ
public_keyÚX509_REQ_set_pubkeyÚ	_evp_pkeyÚsk_X509_EXTENSION_new_nullÚ_create_x509_extensionsÚ_extensionsr(   Úsk_X509_EXTENSION_insertÚX509_REQ_add_extensionsÚX509_REQ_signrÒ   Ú_lib_reason_matchÚERR_LIB_RSAÚ RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEYr;   )
ro   ÚbuilderÚprivate_keyr˜   r¤   Úx509_reqr   r€  Úsk_extensionÚerrorsrp   rn   rq   Úcreate_x509_csr¦  sh   
ÿ
þÿ

ÿÿ

þ
ûÿþÿ
zBackend.create_x509_csrc           	      C   s¶  t |tjƒs
tdƒ‚t |tjƒstdƒ‚t |tjƒr$t |tjƒs$t	dƒ‚|  
|¡}| j ¡ }| j |tjj¡}| j ||jj¡}|  |dk¡ | j |t| |jƒ¡}|  |dk¡ | j ||jj¡}|  |dk¡ t| |jƒ}| j ||¡}|  |dk¡ |  | j |¡|j ¡ |  | j !|¡|j"¡ | j#|j$t%|| jj&dd� | j '|t| |j(ƒ¡}|  |dk¡ | j )||j|¡}|dkrÖ|  *¡ }|  |d  +| jj,| jj-¡¡ t	dƒ‚t.| |ƒS )	NúBuilder type mismatch.rh  z=MD5 is not a supported hash algorithm for EC/DSA certificatesrw   Trn  r   rs  )/r;  r   ÚCertificateBuilderru  r>   rt  rv  rB   rw  r·   r§   re   ÚX509_newrc   rô   ÚbackendÚ	X509_freeÚX509_set_versionÚ_versionr}  ru   ÚX509_set_subject_namer-   r  ÚX509_set_pubkeyÚ_public_keyr‚  r+   Ú_serial_numberÚX509_set_serialNumberÚ_set_asn1_timeÚX509_get_notBeforeÚ_not_valid_beforeÚX509_get_notAfterÚ_not_valid_afterr„  r…  r(   ÚX509_add_extÚX509_set_issuer_nameÚ_issuer_nameÚ	X509_signrÒ   r‰  rŠ  r‹  r9   )	ro   rŒ  r�  r˜   r¤   Ú	x509_certr   Úserial_numberr�  rp   rp   rq   Úcreate_x509_certificateó  sr   
ÿ
þÿ

ÿÿÿÿû	ÿÿþÿ
zBackend.create_x509_certificatec                 C   sZ   t  | ¡ ¡}| j ||¡}|| jjkr+|  ¡ }|  |d  	| jj
| jj¡¡ tdƒ‚d S )Nr   zVInvalid time. This error can occur if you set a time too far in the future on Windows.)ÚcalendarÚtimegmÚ	timetuplere   ÚASN1_TIME_setrc   ry   rÒ   ru   r‰  ÚERR_LIB_ASN1ÚASN1_R_ERROR_GETTING_TIMEr·   )ro   Ú	asn1_timeÚtimeÚ	timestampr   r�  rp   rp   rq   rž  F  s   þÿÿøzBackend._set_asn1_timec                 C   s>   | j  ¡ }|  || jjk¡ | j || j j¡}|  ||¡ |S r_   )re   ÚASN1_TIME_newru   rc   ry   rô   ÚASN1_TIME_freerž  )ro   r±  r°  rp   rp   rq   Ú_create_asn1_timeV  s
   
zBackend._create_asn1_timec                 C   s²  t |tjƒs
tdƒ‚t |tjƒstdƒ‚t |tjƒr$t |tjƒs$t	dƒ‚|  
|¡}| j ¡ }| j |tjj¡}| j |d¡}|  |dk¡ | j |t| |jƒ¡}|  |dk¡ |  |j¡}| j ||¡}|  |dk¡ |  |j¡}| j ||¡}|  |dk¡ | j|jt|| jjdd� |jD ] }	| j  |	j!¡}
|  |
| jj"k¡ | j #||
¡}|  |dk¡ q�| j $||j%|¡}|dkrÔ|  &¡ }|  |d  '| jj(| jj)¡¡ t	dƒ‚t*| |ƒS )	Nr’  rh  z5MD5 is not a supported hash algorithm for EC/DSA CRLsrw   Trn  r   rs  )+r;  r   Ú CertificateRevocationListBuilderru  r>   rt  rv  rB   rw  r·   r§   re   ÚX509_CRL_newrc   rô   r•  ÚX509_CRL_freeÚX509_CRL_set_versionru   ÚX509_CRL_set_issuer_namer-   r¥  rµ  Ú_last_updateÚX509_CRL_set_lastUpdateÚ_next_updateÚX509_CRL_set_nextUpdater„  r…  r'   ÚX509_CRL_add_extÚ_revoked_certificatesÚCryptography_X509_REVOKED_dupÚ_x509_revokedry   ÚX509_CRL_add0_revokedÚX509_CRL_signr‚  rÒ   r‰  rŠ  r‹  r:   )ro   rŒ  r�  r˜   r¤   Úx509_crlr   Úlast_updateÚnext_updateÚrevoked_certÚrevokedr�  rp   rp   rq   Úcreate_x509_crl]  sj   
ÿ
þÿ

ÿû
	ÿÿþÿ
zBackend.create_x509_crlc           
      C   sd   t |ƒD ]+\}}|  ||¡}|  || jjk¡ |r"| j || jj¡}||||ƒ}	|  |	dk¡ qd S rv   )Ú	enumerateÚ_create_x509_extensionru   rc   ry   rô   re   ri  )
ro   ro  rp  rq  rr  rô   ÚiÚ	extensionÚx509_extensionr   rp   rp   rq   r„  ¨  s   ÿÿõzBackend._create_x509_extensionsc                 C   s2   t | |jjƒ}| j | jj||jrd|¡S d|¡S )Nrw   r   )r.   ÚoidÚdotted_stringre   ÚX509_EXTENSION_create_by_OBJrc   ry   Úcritical)ro   rÎ  r}  Úobjrp   rp   rq   Ú_create_raw_x509_extension·  s   ÿÿz"Backend._create_raw_x509_extensionc                 C   s  t |jtjƒrt| |jjƒ}|  ||¡S t |jtjƒr2tdd„ |jD ƒƒ ¡ }t| |ƒ}|  ||¡S t |jtj	ƒrKt
j ¡  ¡ }t| |ƒ}|  ||¡S z||j }W n tya   td |j¡ƒ‚w || |jƒ}| j |jj d¡¡}t || jjk¡ | j ||jr‡d|¡S d|¡S )Nc                 S   s   g | ]}|j ‘qS rp   )r}  )Ú.0r\  rp   rp   rq   Ú
<listcomp>Â  s    z2Backend._create_x509_extension.<locals>.<listcomp>zExtension not supported: {0}r‰   rw   r   )r;  r}  r   ÚUnrecognizedExtensionr,   rÕ  Ú
TLSFeaturer   ÚdumpÚPrecertPoisonÚ
asn1cryptoÚcoreÚNullrÐ  r±   ÚNotImplementedErrorrŸ   re   ÚOBJ_txt2nidrÑ  r¡   r•  ru   Ú	NID_undefÚX509V3_EXT_i2drÓ  )ro   rp  rÎ  r}  Úasn1r¡   Ú
ext_structÚnidrp   rp   rq   rÌ  ½  s8   


ÿÿÿÿÿzBackend._create_x509_extensionc                 C   s¸   t |tjƒs
tdƒ‚| j ¡ }|  || jjk¡ | j 	|| jj
¡}t| |jƒ}| j ||¡}|  |dk¡ |  |j¡}| j ||¡}|  |dk¡ | j|jt|| jjdd� t| d |ƒS )Nr’  rw   Trn  )r;  r   ÚRevokedCertificateBuilderru  re   ÚX509_REVOKED_newru   rc   ry   rô   ÚX509_REVOKED_freer+   rœ  ÚX509_REVOKED_set_serialNumberrµ  Ú_revocation_dateÚX509_REVOKED_set_revocationDater„  r…  r&   ÚX509_REVOKED_add_extr<   )ro   rŒ  Úx509_revokedr¨  r   Úrev_daterp   rp   rq   Úcreate_x509_revoked_certificateÚ  s*   
ÿûz'Backend.create_x509_revoked_certificatec                 C   s   |   | jj| j||¡S r_   )Ú	_load_keyre   ÚPEM_read_bio_PrivateKeyr7  )ro   r  Úpasswordrp   rp   rq   Úload_pem_private_keyó  s   üzBackend.load_pem_private_keyc                 C   sÖ   |   |¡}| j |j| jj| jj| jj¡}|| jjkr)| j || jj¡}|  |¡S |  	¡  | j 
|j¡}|  |dk¡ | j |j| jj| jj| jj¡}|| jjkre| j || jj¡}|  |¡}t| ||ƒS |  ¡  d S rv   )r  re   ÚPEM_read_bio_PUBKEYr[   rc   ry   rô   r  r9  rÒ   Ú	BIO_resetru   ÚPEM_read_bio_RSAPublicKeyrõ   rø   r6   Ú_handle_key_loading_error©ro   r  Úmem_biorü   r   rû   rp   rp   rq   Úload_pem_public_keyû  s$   
ÿ
ÿ
zBackend.load_pem_public_keyc                 C   s^   |   |¡}| j |j| jj| jj| jj¡}|| jjkr)| j || jj¡}t| |ƒS |  	¡  d S r_   )
r  re   ÚPEM_read_bio_DHparamsr[   rc   ry   rô   r1  r   r÷  )ro   r  rù  r6  rp   rp   rq   Úload_pem_parameters  s   
ÿ
zBackend.load_pem_parametersc                 C   s:   |   |¡}|  ||¡}|r|  |¡S |  | jj| j||¡S r_   )r  Ú"_evp_pkey_from_der_traditional_keyr7  rð  re   Úd2i_PKCS8PrivateKey_bio)ro   r  rò  r#  r—   rp   rp   rq   Úload_der_private_key  s   

üzBackend.load_der_private_keyc                 C   sR   | j  |j| jj¡}|| jjkr#| j || j j¡}|d ur!tdƒ‚|S |  ¡  d S )Nú4Password was given but private key is not encrypted.)	re   Úd2i_PrivateKey_bior[   rc   ry   rô   r  ru  rÒ   )ro   r#  rò  r—   rp   rp   rq   rý  2  s   ÿz*Backend._evp_pkey_from_der_traditional_keyc                 C   s¾   |   |¡}| j |j| jj¡}|| jjkr#| j || jj¡}|  |¡S |  	¡  | j 
|j¡}|  |dk¡ | j |j| jj¡}|| jjkrY| j || jj¡}|  |¡}t| ||ƒS |  ¡  d S rv   )r  re   Úd2i_PUBKEY_bior[   rc   ry   rô   r  r9  rÒ   rõ  ru   Úd2i_RSAPublicKey_biorõ   rø   r6   r÷  rø  rp   rp   rq   Úload_der_public_key@  s    


ÿ
zBackend.load_der_public_keyc                 C   sº   |   |¡}| j |j| jj¡}|| jjkr#| j || jj¡}t| |ƒS | jj	rW|  
¡  | j |j¡}|  |dk¡ | j |j| jj¡}|| jjkrW| j || jj¡}t| |ƒS |  ¡  d S rv   )r  re   Úd2i_DHparams_bior[   rc   ry   rô   r1  r   rk   rÒ   rõ  ru   ÚCryptography_d2i_DHxparams_bior÷  )ro   r  rù  r6  r   rp   rp   rq   Úload_der_parametersW  s$   

ÿ

ÿ
zBackend.load_der_parametersc                 C   ób   |   |¡}| j |j| jj| jj| jj¡}|| jjkr#|  ¡  tdƒ‚| j || jj	¡}t
| |ƒS ©NzUnable to load certificate)r  re   ÚPEM_read_bio_X509r[   rc   ry   rÒ   r·   rô   r–  r9   ©ro   r  rù  r   rp   rp   rq   Úload_pem_x509_certificatem  ó   
ÿ
z!Backend.load_pem_x509_certificatec                 C   óV   |   |¡}| j |j| jj¡}|| jjkr|  ¡  tdƒ‚| j || jj	¡}t
| |ƒS r	  )r  re   Úd2i_X509_bior[   rc   ry   rÒ   r·   rô   r–  r9   r  rp   rp   rq   Úload_der_x509_certificatey  ó   

z!Backend.load_der_x509_certificatec                 C   r  ©NzUnable to load CRL)r  re   ÚPEM_read_bio_X509_CRLr[   rc   ry   rÒ   r·   rô   r¸  r:   ©ro   r  rù  rÅ  rp   rp   rq   Úload_pem_x509_crlƒ  r  zBackend.load_pem_x509_crlc                 C   r  r  )r  re   Úd2i_X509_CRL_bior[   rc   ry   rÒ   r·   rô   r¸  r:   r  rp   rp   rq   Úload_der_x509_crl�  r  zBackend.load_der_x509_crlc                 C   r  ©NzUnable to load request)r  re   ÚPEM_read_bio_X509_REQr[   rc   ry   rÒ   r·   rô   ry  r;   ©ro   r  rù  rŽ  rp   rp   rq   Úload_pem_x509_csr™  r  zBackend.load_pem_x509_csrc                 C   r  r  )r  re   Úd2i_X509_REQ_bior[   rc   ry   rÒ   r·   rô   ry  r;   r  rp   rp   rq   Úload_der_x509_csr¥  r  zBackend.load_der_x509_csrc           
      C   s.  |   |¡}|d urt|tƒstdƒ‚| j d¡}|d ur+| j d|¡}||_t|ƒ|_||j	| jj
| j | jjd¡|ƒ}|| jj
krn|jdkrj|  ¡ }	|  |	¡ |jdkrYtdƒ‚|jdks`J ‚td	 |jd
 ¡ƒ‚|  ¡  | j || jj¡}|d ur„|jdkr„tdƒ‚|d ur�|jd
ks“|d u s“J ‚||ƒS )NzPassword must be byteszCRYPTOGRAPHY_PASSWORD_DATA *zchar []ÚCryptography_pem_password_cbr   éÿÿÿÿz3Password was not given but private key is encryptedéþÿÿÿzBPasswords longer than {0} bytes are not supported by this backend.rw   r   )r  r;  Úbytesru  rc   rŠ   rò  rŒ   rÍ   r[   ry   rk  re   rl  ÚerrorrÒ   ru   r·   rŸ   Úmaxsizer÷  rô   r  Úcalled)
ro   Úopenssl_read_funcÚconvert_funcr  rò  rù  ÚuserdataÚpassword_bufrü   r�  rp   rp   rq   rð  ¯  sL   

ÿú	


ÿþÿzBackend._load_keyc                    sÒ   ˆ   ¡ }|s
tdƒ‚|d  ˆ jjˆ jj¡s"|d  ˆ jjˆ jj¡r&tdƒ‚|d  ˆ jjˆ jj¡s>|d  ˆ jj	ˆ jj
¡rDtdtjƒ‚t‡ fdd„|D ƒƒrStdƒ‚|d jˆ jjˆ jj	ˆ jjfv seJ ‚tdƒ‚)NzCould not deserialize key data.r   z Bad decrypt. Incorrect password?z0PEM data is encrypted with an unsupported cipherc                 3   s$   � | ]}|  ˆ jjˆ jj¡V  qd S r_   )r‰  re   ÚERR_LIB_EVPÚ'EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM)rÖ  r"  rn   rp   rq   Ú	<genexpr>þ  s   € üþ
ÿz4Backend._handle_key_loading_error.<locals>.<genexpr>z!Unsupported public key algorithm.)rÒ   r·   r‰  re   r)  ÚEVP_R_BAD_DECRYPTÚERR_LIB_PKCS12Ú!PKCS12_R_PKCS12_CIPHERFINAL_ERRORÚEVP_R_UNKNOWN_PBE_ALGORITHMÚERR_LIB_PEMÚPEM_R_UNSUPPORTED_ENCRYPTIONr   r	   ÚUNSUPPORTED_CIPHERÚanyrd   r®  )ro   r�  rp   rn   rq   r÷  â  sF   ÿÿþýÿÿÿýþû
ýz!Backend._handle_key_loading_errorc                 C   sš   z|   |¡}W n ty   | jj}Y nw | j |¡}|| jjkr<|  ¡ }|  || jjkp8|d  	| jj
| jj¡¡ dS |  || jjk¡ | j |¡ dS )Nr   FT)Ú_elliptic_curve_to_nidr   re   rá  ÚEC_GROUP_new_by_curve_namerc   ry   rÒ   ru   r‰  Ú
ERR_LIB_ECÚEC_R_UNKNOWN_GROUPÚEC_GROUP_free)ro   ÚcurveÚ	curve_nidÚgroupr�  rp   rp   rq   Úelliptic_curve_supported  s&   ÿþþz Backend.elliptic_curve_supportedc                 C   s   t |tjƒsdS |  |¡S r¯   )r;  rA   ÚECDSAr<  )ro   Úsignature_algorithmr9  rp   rp   rq   Ú,elliptic_curve_signature_algorithm_supported&  s   
z4Backend.elliptic_curve_signature_algorithm_supportedc                 C   sˆ   |   |¡r:|  |¡}| j |¡}|  || jjk¡ | j || jj¡}| j 	|¡}|  |dk¡ |  
|¡}t| ||ƒS td |j¡tjƒ‚)z@
        Generate a new private key on the named curve.
        rw   z$Backend object does not support {0}.)r<  r4  re   ÚEC_KEY_new_by_curve_nameru   rc   ry   rô   r/  ÚEC_KEY_generate_keyÚ_ec_cdata_to_evp_pkeyr$   r   rŸ   rž   r	   ÚUNSUPPORTED_ELLIPTIC_CURVE)ro   r9  r:  r5  r   rü   rp   rp   rq   Ú#generate_elliptic_curve_private_key/  s   



þz+Backend.generate_elliptic_curve_private_keyc                 C   s    |j }|  |j¡}| j |¡}|  || jjk¡ | j || jj	¡}| j |  
|j¡| jj¡}| j ||¡}|  |dk¡ |  ||j|j¡}|  |¡}t| ||ƒS rv   )r  r4  r9  re   r@  ru   rc   ry   rô   r/  rñ   Úprivate_valueÚBN_clear_freeÚEC_KEY_set_private_keyÚ)_ec_key_set_public_key_affine_coordinatesr\  r[  rB  r$   )ro   r  Úpublicr:  r5  rE  r   rü   rp   rp   rq   Ú#load_elliptic_curve_private_numbersG  s   ÿ
ÿ
z+Backend.load_elliptic_curve_private_numbersc                 C   sd   |   |j¡}| j |¡}|  || jjk¡ | j || jj¡}|  	||j
|j¡}|  |¡}t| ||ƒS r_   )r4  r9  re   r@  ru   rc   ry   rô   r/  rH  r\  r[  rB  r%   )ro   r  r:  r5  rü   rp   rp   rq   Ú"load_elliptic_curve_public_numbers]  s   
ÿ
z*Backend.load_elliptic_curve_public_numbersc              	   C   sˆ  |   |¡}| j |¡}|  || jjk¡ | j || jj¡}|  |¡\}}| j 	|¡}|  || jjk¡ | j || jj
¡}|  |¡}| j || jj¡}|  ¡ �9}	| j |||| jj| jj|	¡}
|  |
dk¡ | j |	¡}| j |	¡}||||||	ƒ}
|  |
dk¡ W d   ƒ n1 sŠw   Y  | j ||¡}
|  |
dk¡ |  |¡}| j || jj¡}| j ||¡}
|  |
dk¡ |  |¡}t| ||ƒS rv   )r4  re   r@  ru   rc   ry   rô   r/  Ú _ec_key_determine_group_get_funcÚEC_POINT_newÚEC_POINT_freerñ   rF  Ú_tmp_bn_ctxÚEC_POINT_mulÚ
BN_CTX_getÚEC_KEY_set_public_keyrG  rB  r$   )ro   rE  r9  r:  r5  Úget_funcr;  Úpointr}  Úbn_ctxr   Úbn_xÚbn_yÚprivaterü   rp   rp   rq   Ú!derive_elliptic_curve_private_keyj  s8   


ÿ÷

z)Backend.derive_elliptic_curve_private_keyc                 C   r  )NzUnable to load OCSP request)r  re   Úd2i_OCSP_REQUEST_bior[   rc   ry   rÒ   r·   rô   ÚOCSP_REQUEST_freer3   )ro   r  rù  Úrequestrp   rp   rq   Úload_der_ocsp_request�  r  zBackend.load_der_ocsp_requestc                 C   r  )NzUnable to load OCSP response)r  re   Úd2i_OCSP_RESPONSE_bior[   rc   ry   rÒ   r·   rô   ÚOCSP_RESPONSE_freer4   )ro   r  rù  Úresponserp   rp   rq   Úload_der_ocsp_responseš  r  zBackend.load_der_ocsp_responsec           	      C   s®   | j  ¡ }|  || jjk¡ | j || j j¡}|j\}}}|  |¡}| j  	||j
|j
¡}|  || jjk¡ | j  ||¡}|  || jjk¡ | j|jt|| j jdd� t| |ƒS )NTrn  )re   ÚOCSP_REQUEST_newru   rc   ry   rô   r[  Ú_requestr§   ÚOCSP_cert_to_idÚ_x509ÚOCSP_request_add0_idr„  r…  r*   ÚOCSP_REQUEST_add_extr3   )	ro   rŒ  Úocsp_reqÚcertÚissuerr˜   r¤   ÚcertidÚonereqrp   rp   rq   Úcreate_ocsp_request¤  s&   


ÿû
zBackend.create_ocsp_requestc              	   C   sø  | j  ¡ }|  || jjk¡ | j || j j¡}|  |jj	¡}| j  
||jjj|jjj¡}|  || jjk¡ | j || j j¡}|jjd u rGd}nt|jj }|jjd u rX| jj}n|  |jj¡}| jj}	|jjd urp|  |jj¡}	|  |jj¡}
| j  |||jjj|||
|	¡}|  || jjk¡ |  |¡}|j\}}| j j}|tjju r©|| j jO }|jd urÃ|jD ]}| j  ||j¡}|  |dk¡ q±| j |j!t"|| j j#dd� | j  $||j|j%|| jj|¡}|dkrú|  &¡ }|  |d  '| j j(| j j)¡¡ t*dƒ‚|S )Nr  rw   Trn  r   z,responder_cert must be signed by private_key)+re   ÚOCSP_BASICRESP_newru   rc   ry   rô   ÚOCSP_BASICRESP_freer§   Ú	_responserC  rd  Ú_certre  Ú_issuerÚOCSP_CERTID_freeÚ_revocation_reasonr   Ú_revocation_timerµ  r½  Ú_this_updateÚOCSP_basic_add1_statusÚ_cert_statusr}  Ú_responder_idÚOCSP_NOCERTSrY   ÚOCSPResponderEncodingÚHASHÚOCSP_RESPID_KEYÚ_certsÚOCSP_basic_add1_certr„  r…  r)   ÚOCSP_BASICRESP_add_extÚOCSP_basic_signr‚  rÒ   r‰  ÚERR_LIB_X509ÚX509_R_KEY_VALUES_MISMATCHr·   )ro   rŒ  r�  r˜   Úbasicr¤   rk  ÚreasonÚrev_timerÇ  Úthis_updater   Úresponder_certÚresponder_encodingÚflagsri  r�  rp   rp   rq   Ú_create_ocsp_basic_response¹  sˆ   
ÿ
þÿ
ÿÿù	



û

þþÿz#Backend._create_ocsp_basic_responsec                 C   sb   |t jju r|  |||¡}n| jj}| j |j|¡}|  	|| jjk¡ | j 
|| jj¡}t| |ƒS r_   )rY   ÚOCSPResponseStatusÚ
SUCCESSFULr‹  rc   ry   re   ÚOCSP_response_creater}  ru   rô   r_  r4   )ro   Úresponse_statusrŒ  r�  r˜   r„  Ú	ocsp_resprp   rp   rq   Úcreate_ocsp_response	  s   ÿÿ
zBackend.create_ocsp_responsec                 C   s   |   |¡o
t|tjƒS r_   )r<  r;  rA   ÚECDH)ro   r˜   r9  rp   rp   rq   Ú+elliptic_curve_exchange_algorithm_supported  s   

þz3Backend.elliptic_curve_exchange_algorithm_supportedc                 C   r  rv   )r  re   ÚEVP_PKEY_set1_EC_KEYru   )ro   r5  rü   r   rp   rp   rq   rB    r  zBackend._ec_cdata_to_evp_pkeyc                 C   sN   dddœ}|  |j|j¡}| j | ¡ ¡}|| jjkr%td |j¡tj	ƒ‚|S )z/
        Get the NID for a curve name.
        Ú
prime192v1Ú
prime256v1)Ú	secp192r1Ú	secp256r1z%{0} is not a supported elliptic curve)
Úgetrž   re   Ú
OBJ_sn2nidr¡   rá  r   rŸ   r	   rC  )ro   r9  Úcurve_aliasesÚ
curve_namer:  rp   rp   rq   r4  %  s   þ
þzBackend._elliptic_curve_to_nidc              	   c   sd   � | j  ¡ }|  || jjk¡ | j || j j¡}| j  |¡ z|V  W | j  |¡ d S | j  |¡ w r_   )	re   Ú
BN_CTX_newru   rc   ry   rô   ÚBN_CTX_freeÚBN_CTX_startÚ
BN_CTX_end)ro   rU  rp   rp   rq   rO  9  s   €
zBackend._tmp_bn_ctxc                 C   s¼   |   || jjk¡ | j d¡}|   || jjk¡ | j |¡}|   || jjk¡ | j |¡}|   || jjk¡ | j |¡}|   || jjk¡ ||krR| jj	rR| jj
}n| jj}|sZJ ‚||fS )zu
        Given an EC_KEY determine the group and what function is required to
        get point coordinates.
        s   characteristic-two-field)ru   rc   ry   re   rš  rá  ÚEC_KEY_get0_groupÚEC_GROUP_method_ofÚEC_METHOD_get_field_typeÚCryptography_HAS_EC2MÚ$EC_POINT_get_affine_coordinates_GF2mÚ#EC_POINT_get_affine_coordinates_GFp)ro   rJ  Únid_two_fieldr;  Úmethodrå  rS  rp   rp   rq   rL  D  s   
z(Backend._ec_key_determine_group_get_funcc                 C   st   |dk s|dk rt dƒ‚| j |  |¡| jj¡}| j |  |¡| jj¡}| j |||¡}|dkr8|  ¡  t 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.rw   zInvalid EC key.)r·   rc   rô   rñ   re   rö   Ú(EC_KEY_set_public_key_affine_coordinatesrÒ   )ro   rJ  r\  r[  r   rp   rp   rq   rH  `  s   ÿz1Backend._ec_key_set_public_key_affine_coordinatesc                 C   s¬  t |tjƒs
tdƒ‚t |tjƒstdƒ‚t |tjƒr#d}d}| jj}n t |tjƒr?| j	 
d¡}|j}t|ƒ}|dkr>tdƒ‚ntdƒ‚| j	 |¡}	|tjju r‰|tjju r\| j	j}
|}n\|tjju sdJ ‚|	| j	jkro| j	j}
n|	| j	jkrz| j	j}
n|	| j	jks‚J ‚| j	j}
|}n/|tjju r´|tjju r¥t |tjƒsŸtd	ƒ‚|  |	|¡S |tjju s­J ‚| j	j}
|}ntd
ƒ‚|  ¡ }|
|||||| jj| jjƒ}|  |dk¡ |  |¡S )Nz2format must be an item from the PrivateFormat enumzBEncryption algorithm must be a KeySerializationEncryption instanceó    r   s   aes-256-cbciÿ  zBPasswords longer than 1023 bytes are not supported by this backendzUnsupported encryption typezDEncryption is not supported for DER encoded traditional OpenSSL keysú/encoding must be an item from the Encoding enumrw   ) r;  r?   ÚPrivateFormatru  ÚKeySerializationEncryptionÚNoEncryptionrc   ry   ÚBestAvailableEncryptionre   ÚEVP_get_cipherbynamerò  rŒ   r·   r'  ÚEncodingÚPEMÚPKCS8ÚPEM_write_bio_PKCS8PrivateKeyÚTraditionalOpenSSLr(  ÚPEM_write_bio_RSAPrivateKeyr*  ÚPEM_write_bio_DSAPrivateKeyr-  ÚPEM_write_bio_ECPrivateKeyÚDERÚ"_private_key_bytes_traditional_derÚi2d_PKCS8PrivateKey_bior   ru   r$  )ro   ÚencodingrŸ   Úencryption_algorithmrü   Úcdatarò  Úpasslenrµ   r3  Ú	write_bior—   r[   r   rp   rp   rq   Ú_private_key_bytest  s„   ÿÿÿ
ÿÿÿÿ

ÿÿù	
zBackend._private_key_bytesc                 C   sp   || j jkr| j j}n|| j jkr| j j}n|  || j jk¡ | j j}|  ¡ }|||ƒ}|  |dk¡ |  	|¡S rv   )
re   r(  Úi2d_RSAPrivateKey_bior-  Úi2d_ECPrivateKey_bioru   r*  Úi2d_DSAPrivateKey_bior   r$  )ro   r3  r¾  rÀ  r[   r   rp   rp   rq   rº  Å  s   



z*Backend._private_key_bytes_traditional_derc           	      C   s   t |tjƒs
tdƒ‚|tjju s|tjju r+|tjjus"|tjjur&tdƒ‚|  |¡S |tjju rK|tjj	u r<| j
j}n|tjju sDJ ‚| j
j}|}n0|tjju rw| j
 |¡| j
jks]J ‚|tjj	u rh| j
j}n|tjju spJ ‚| j
j}|}ntdƒ‚|  ¡ }|||ƒ}|  |dk¡ |  |¡S )Nr«  z1OpenSSH format must be used with OpenSSH encodingz1format must be an item from the PublicFormat enumrw   )r;  r?   r±  ru  ÚPublicFormatÚOpenSSHr·   Ú_openssh_public_key_bytesÚSubjectPublicKeyInfor²  re   ÚPEM_write_bio_PUBKEYr¹  Úi2d_PUBKEY_bioÚPKCS1r'  r(  ÚPEM_write_bio_RSAPublicKeyÚi2d_RSAPublicKey_bior   ru   r$  )	ro   r¼  rŸ   r—   rü   r¾  rÀ  r[   r   rp   rp   rq   Ú_public_key_bytesÓ  s<   ÿ


ÿ

zBackend._public_key_bytesc                 C   s*  t |tjƒr | ¡ }dt t d¡t |j	¡ t |j
¡ ¡ S t |tjƒrO| ¡ }|j}dt t d¡t |j¡ t |j¡ t |j¡ t |j¡ ¡ S t |tjƒsWJ ‚| ¡ }ztjdtjdtjdit|jƒ }W n tyx   tdƒ‚w d	| d
 t t d	| ¡t |¡ t | ¡ ¡ ¡ S )Ns   ssh-rsa s   ssh-rsas   ssh-dss s   ssh-dsss   nistp256s   nistp384s   nistp521zZOnly SECP256R1, SECP384R1, and SECP521R1 curves are supported by the SSH public key formats   ecdsa-sha2-ó    )r;  rB   ÚRSAPublicKeyr  Úbase64Ú	b64encoder?   Ú_ssh_write_stringÚ_ssh_write_mpintr~   r	  r@   ÚDSAPublicKeyrZ  r  r  rU  r[  rA   ÚEllipticCurvePublicKeyÚ	SECP256R1Ú	SECP384R1Ú	SECP521R1r°   r9  r±   r·   Úencode_point)ro   r—   r  rZ  rœ  rp   rp   rq   rÇ  ÿ  sX   
ÿ
þÿ
ÿ
þ
ý
üÿýüÿÿÿþÿz!Backend._openssh_public_key_bytesc                 C   sÌ   |t jju r
tdƒ‚| j d¡}| j || jj|| jj¡ |t jj	u r5|d | jjkr0| jj
}n!| jj}n|t jju rM|d | jjkrH| jj}n	| jj}ntdƒ‚|  ¡ }|||ƒ}|  |dk¡ |  |¡S )Nz!OpenSSH encoding is not supportedræ   r   r«  rw   )r?   r±  rÆ  ru  rc   rŠ   re   ÚDH_get0_pqgry   r²  ÚPEM_write_bio_DHxparamsÚPEM_write_bio_DHparamsr¹  ÚCryptography_i2d_DHxparams_bioÚi2d_DHparams_bior   ru   r$  )ro   r¼  rŸ   r¾  r  rÀ  r[   r   rp   rp   rq   Ú_parameter_bytes%  s.   ÿý





zBackend._parameter_bytesc                 C   s|   |dk rt dƒ‚|dvrt dƒ‚| j ¡ }|  || jjk¡ | j || jj¡}| j |||| jj¡}|  |dk¡ t	| |ƒS )Nrÿ   z%DH key_size must be at least 512 bits)rå   é   zDH generator must be 2 or 5rw   )
r·   re   ÚDH_newru   rc   ry   rô   r1  ÚDH_generate_parameters_exr   )ro   Ú	generatorrú   Údh_param_cdatar   rp   rp   rq   Úgenerate_dh_parametersC  s   
ü
zBackend.generate_dh_parametersc                 C   r  rv   )r  re   ÚEVP_PKEY_set1_DHru   )ro   r6  rü   r   rp   rp   rq   Ú_dh_cdata_to_evp_pkeyX  r  zBackend._dh_cdata_to_evp_pkeyc                 C   s<   t |j| ƒ}| j |¡}|  |dk¡ |  |¡}t| ||ƒS rv   )r    Ú	_dh_cdatare   ÚDH_generate_keyru   rè  r   )ro   rP  Údh_key_cdatar   rü   rp   rp   rq   Úgenerate_dh_private_key^  s
   
zBackend.generate_dh_private_keyc                 C   s   |   |  ||¡¡S r_   )rì  ræ  )ro   rä  rú   rp   rp   rq   Ú&generate_dh_private_key_and_parametersh  s   
ÿz.Backend.generate_dh_private_key_and_parametersc                 C   s8  |j j}| j ¡ }|  || jjk¡ | j || jj¡}|  	|j
¡}|  	|j¡}|jd ur3|  	|j¡}n| jj}|  	|j j¡}|  	|j¡}| j ||||¡}	|  |	dk¡ | j |||¡}	|  |	dk¡ | j dd¡}
| j ||
¡}	|  |	dk¡ |
d dkr‘|jdkr�|
d | jjA dks‘tdƒ‚|  |¡}t| ||ƒS )Nrw   úint[]r   rå   z.DH private numbers did not pass safety checks.)r  rZ  re   râ  ru   rc   ry   rô   r1  rñ   r  rU  r  r[  r\  ÚDH_set0_pqgÚDH_set0_keyrŠ   ÚCryptography_DH_checkÚDH_NOT_SUITABLE_GENERATORr·   rè  r   )ro   r  rZ  r6  r  rU  r  rV  rW  r   Úcodesrü   rp   rp   rq   Úload_dh_private_numbersl  s4   



ÿ
zBackend.load_dh_private_numbersc           
      C   sÐ   | j  ¡ }|  || jjk¡ | j || j j¡}|j}|  |j	¡}|  |j
¡}|jd ur2|  |j¡}n| jj}|  |j¡}| j  ||||¡}|  |dk¡ | j  ||| jj¡}|  |dk¡ |  |¡}	t| ||	ƒS rv   )re   râ  ru   rc   ry   rô   r1  rZ  rñ   r  rU  r  r[  rï  rð  rè  r   )
ro   r  r6  rZ  r  rU  r  rV  r   rü   rp   rp   rq   Úload_dh_public_numbersœ  s    


zBackend.load_dh_public_numbersc                 C   s�   | j  ¡ }|  || jjk¡ | j || j j¡}|  |j¡}|  |j	¡}|j
d ur/|  |j
¡}n| jj}| j  ||||¡}|  |dk¡ t| |ƒS rv   )re   râ  ru   rc   ry   rô   r1  rñ   r  rU  r  rï  r   )ro   r  r6  r  rU  r  r   rp   rp   rq   Úload_dh_parameter_numbers·  s   


z!Backend.load_dh_parameter_numbersc                 C   s´   | j  ¡ }|  || jjk¡ | j || j j¡}|  |¡}|  |¡}|d ur+|  |¡}n| jj}| j  ||||¡}|  |dk¡ | j 	dd¡}| j  
||¡}|  |dk¡ |d dkS )Nrw   rî  r   )re   râ  ru   rc   ry   rô   r1  rñ   rï  rŠ   rñ  )ro   r  rU  r  r6  r   ró  rp   rp   rq   Údh_parameters_supportedÉ  s   


zBackend.dh_parameters_supportedc                 C   s   | j jdkS rv   )re   rk   rn   rp   rp   rq   Údh_x942_serialization_supportedß  rš   z'Backend.dh_x942_serialization_supportedc                    sx   t ˆ |ƒ}ˆ j d¡}ˆ j ||¡}ˆ  |d ˆ jjk¡ ˆ j |‡ fdd„¡}ˆ  |dk¡ ˆ j |d |¡d d … S )Nzunsigned char **r   c                    s   ˆ j  | d ¡S )Nr   )re   rÜ   )Úpointerrn   rp   rq   rm  è  s    z)Backend.x509_name_bytes.<locals>.<lambda>)	r-   rc   rŠ   re   Úi2d_X509_NAMEru   ry   rô   rÌ   )ro   rž   Ú	x509_nameÚppr   rp   rn   rq   Úx509_name_bytesâ  s   
ÿzBackend.x509_name_bytesc                 C   sT   |   ¡ }| j || jj¡}t |dk¡ | j ||t|ƒ¡}t |dk¡ t| |ƒS rv   )	r  re   ÚEVP_PKEY_set_typeÚ
NID_X25519r•  ru   ÚEVP_PKEY_set1_tls_encodedpointrŒ   r8   )ro   r  rü   r   rp   rp   rq   Úx25519_load_public_bytesí  s   
ÿ
z Backend.x25519_load_public_bytesc                 C   sn   d}|   || ¡}tj |j| jj¡}|  || jjk¡ | j || jj	¡}|  | j 
|¡| jjk¡ t| |ƒS )Ns   0. 0+en" )r  r•  re   r  r[   rc   ry   ru   rô   r  r'  ÚEVP_PKEY_X25519r7   )ro   r  Úpkcs8_prefixr[   rü   rp   rp   rq   Úx25519_load_private_bytes÷  s   ÿ
z!Backend.x25519_load_private_bytesc                 C   s²   | j  | j 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¡}t| |ƒS )Nrw   zEVP_PKEY **r   )re   ÚEVP_PKEY_CTX_new_idrÿ  rc   ry   ru   rô   ÚEVP_PKEY_CTX_freeÚEVP_PKEY_keygen_initrŠ   ÚEVP_PKEY_keygenr  r7   )ro   Úevp_pkey_ctxr   Ú	evp_ppkeyrü   rp   rp   rq   Úx25519_generate_key  s   ÿÿ
zBackend.x25519_generate_keyc                 C   s   | j jS r_   )re   Ú#CRYPTOGRAPHY_OPENSSL_110_OR_GREATERrn   rp   rp   rq   Úx25519_supported   s   zBackend.x25519_supportedc           	      C   sX   | j  d|¡}| j |t|ƒ|t|ƒ|||tj||¡
}|  |dk¡ | j  |¡d d … S rÉ   )	rc   rŠ   re   ÚEVP_PBE_scryptrŒ   rX   Ú
_MEM_LIMITru   rÌ   )	ro   rÐ   rÎ   rÍ   r	  Úrr  r�   r   rp   rp   rq   Úderive_scrypt#  s   þzBackend.derive_scryptc                 C   s   t  |¡}| j |¡| jjkS r_   )r   Ú_aead_cipher_namere   r°  rc   ry   )ro   r²   Úcipher_namerp   rp   rq   Úaead_cipher_supported,  s   
ÿzBackend.aead_cipher_supportedr_   )vÚ__name__Ú
__module__Ú__qualname__Ú__doc__rž   rr   ru   r€   Ú
contextlibr   r…   rh   r�   r“   r•   r™   r¥   r§   r¨   r¬   r®   r¶   rº   rg   rÄ   rÇ   rÈ   rÑ   rÒ   rã   rñ   rý   r   r  r  r  rø   r  r   r$  r7  r9  rA  rG  rK  rQ  rR  rX  r]  r_  r`  rO  rb  rc  rf  rg  r‘  r©  rž  rµ  rÊ  r„  rÕ  rÌ  rï  ró  rú  rü  rÿ  rý  r  r  r  r  r  r  r  r  rð  r÷  r<  r?  rD  rJ  rK  rY  r]  ra  rm  r‹  r‘  r“  rB  r4  rO  rL  rH  rÁ  rº  rÎ  rÇ  rà  ræ  rè  rì  rí  rô  rõ  rö  r÷  rø  rý  r  r  r  r  r  r  rp   rp   rp   rq   r]   Q   sè    

	9
"	MSK


3-	&

P

Q,&
0

	r]   c                   @   s   e Zd Zdd„ Zdd„ ZdS )r½   c                 C   s
   || _ d S r_   )Ú_fmt)ro   Úfmtrp   rp   rq   rr   4  r–   zGetCipherByName.__init__c                 C   s&   | j j||d� ¡ }|j | d¡¡S )N)r²   r³   r‰   )r  rŸ   Úlowerre   r°  r¡   )ro   r•  r²   r³   r  rp   rp   rq   Ú__call__7  s   zGetCipherByName.__call__N)r  r  r  rr   r  rp   rp   rp   rq   r½   3  s    r½   c                 C   s"   d  |jd ¡}| j | d¡¡S )Nzaes-{0}-xtsrå   r‰   )rŸ   rú   re   r°  r¡   )r•  r²   r³   r  rp   rp   rq   rÀ   <  s   rÀ   )ƒÚ
__future__r   r   r   rÑ  rª  Úcollectionsr  r¾   r   Úasn1crypto.corerÜ  rÕ   Úcryptographyr   r   Úcryptography.exceptionsr   r	   Ú'cryptography.hazmat.backends.interfacesr
   r   r   r   r   r   r   r   r   r   r   r   r   Ú$cryptography.hazmat.backends.opensslr   Ú,cryptography.hazmat.backends.openssl.ciphersr   Ú)cryptography.hazmat.backends.openssl.cmacr   Ú0cryptography.hazmat.backends.openssl.decode_asn1r   r   Ú'cryptography.hazmat.backends.openssl.dhr   r   r   r    Ú(cryptography.hazmat.backends.openssl.dsar!   r"   r#   Ú'cryptography.hazmat.backends.openssl.ecr$   r%   Ú0cryptography.hazmat.backends.openssl.encode_asn1r&   r'   r(   r)   r*   r+   r,   r-   r.   Ú+cryptography.hazmat.backends.openssl.hashesr0   Ú)cryptography.hazmat.backends.openssl.hmacr2   Ú)cryptography.hazmat.backends.openssl.ocspr3   r4   Ú(cryptography.hazmat.backends.openssl.rsar5   r6   Ú+cryptography.hazmat.backends.openssl.x25519r7   r8   Ú)cryptography.hazmat.backends.openssl.x509r9   r:   r;   r<   Ú$cryptography.hazmat.bindings.opensslr=   Úcryptography.hazmat.primitivesr>   r?   Ú)cryptography.hazmat.primitives.asymmetricr@   rA   rB   Ú1cryptography.hazmat.primitives.asymmetric.paddingrC   rD   rE   rF   Ú1cryptography.hazmat.primitives.ciphers.algorithmsrG   rH   rI   rJ   rK   rL   rM   rN   rO   Ú,cryptography.hazmat.primitives.ciphers.modesrP   rQ   rR   rS   rT   rU   rV   rW   Ú"cryptography.hazmat.primitives.kdfrX   Úcryptography.x509rY   Ú
namedtuplerZ   Úregister_interfaceÚregister_interface_ifr`   rd   ÚCryptography_HAS_SCRYPTÚobjectr]   r½   rÀ   r•  rp   rp   rp   rq   Ú<module>   sŠ   <,,(ÿ*               b	
