3
K^|                @   s  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m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mZmZ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- d dl.m/Z/m0Z0m1Z1m2Z2 d dl3m4Z4m5Z5m6Z6 d dl7m8Z8m9Z9 d dl:m;Z;m<Z< d dl=m>Z>m?Z?m@Z@ d dlAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJ d dlKmLZL d dlMmNZN d dlOmPZPmQZQ d dlRmSZSmTZT d dlUmVZVmWZW d dlXmYZYmZZZ d dl[m\Z\m]Z] d dl^m_Z_m`Z`maZambZb d dlcmdZd d dlemfZfmgZg d dlhmiZimjZjmkZkmlZlmmZm d dlnmoZompZpmqZqmrZr d dlsmtZtmuZumvZvmwZwmxZxmyZymzZzm{Z{m|Z| d d l}m~Z~mZmZmZmZmZmZmZ d d!lmZ d d"lmZ d d#lmZ ejd$d%d&gZG d'd( d(eZejeejeejeejeejeejeeje ejeeje!eje#eje"eje%ejedj jje$G d)d* d*eZG d+d, d,eZd-d. Ze ZdS )/    )absolute_importdivisionprint_functionN)contextmanager)range)utilsx509)UnsupportedAlgorithm_Reasons)INTEGERNULLSEQUENCE
encode_derencode_der_integer)CMACBackendCipherBackendDERSerializationBackend	DHBackend
DSABackendEllipticCurveBackendHMACBackendHashBackendPBKDF2HMACBackendPEMSerializationBackend
RSABackendScryptBackendX509Backend)aead)_CipherContext)_CMACContext)_CRL_ENTRY_REASON_ENUM_TO_CODE)_DHParameters_DHPrivateKey_DHPublicKey_dh_params_dup)_DSAParameters_DSAPrivateKey_DSAPublicKey)_EllipticCurvePrivateKey_EllipticCurvePublicKey)_Ed25519PrivateKey_Ed25519PublicKey)_ED448_KEY_SIZE_Ed448PrivateKey_Ed448PublicKey)	$_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)_POLY1305_KEY_SIZE_Poly1305Context)_RSAPrivateKey_RSAPublicKey)_X25519PrivateKey_X25519PublicKey)_X448PrivateKey_X448PublicKey)_Certificate_CertificateRevocationList_CertificateSigningRequest_RevokedCertificate)binding)hashesserialization)dsaeced25519ed448rsa)MGF1OAEPPKCS1v15PSS)	AESARC4BlowfishCAST5CamelliaChaCha20IDEASEED	TripleDES)CBCCFBCFB8CTRECBGCMOFBXTS)scrypt)ssh)ocsp
_MemoryBIObioZchar_ptrc               @   s   e Zd ZdS )_RC2N)__name__
__module____qualname__ rn   rn   P/tmp/pip-unpacked-wheel-vvkwn1hz/cryptography/hazmat/backends/openssl/backend.pyrj   b   s   rj   c               @   sv  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 ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`e	dd Zadd Zbdd Zcdd Zddd ZeddÄ Zfddń ZgddǄ ZhddɄ Zidd˄ Zjdd̈́ Zkddτ Zlddф Zmddӄ ZnddՄ ZodddׄZpddل Zqddۄ Zrdd݄ Zsdd߄ Ztdd Zudd Zvdd Zwdd Zxdd Zydd Zzdd Z{dd Z|dd Z}dd Z~dd Zdd Zdd Zdd Zdd Zdd Zd d Zej	dd Zdd Zej	dd Zdd	 Zd
d Zdd Zd1S (  Backendz)
    OpenSSL API binding interfaces.
    Zopensslc             C   s\   t j | _| jj| _| jj| _i | _| j  | j	  | jj
g| _| jjrX| jj| jj d S )N)rH   BindingZ_bindingffi_ffilib_lib_cipher_registry_register_default_ciphersactivate_osrandom_engineZEVP_PKEY_DH	_dh_typesCryptography_HAS_EVP_PKEY_DHXappendZEVP_PKEY_DHX)selfrn   rn   ro   __init__{   s    


zBackend.__init__c             C   s   t j| j|S )N)rH   Z_openssl_assertru   )r|   okrn   rn   ro   openssl_assert   s    zBackend.openssl_assertc             C   sf   | j jrb| j j }|| jjkrb| j j| | j j| jj}| j|dk | j j|}| j|dk d S )N   )	ru   Cryptography_HAS_ENGINEZENGINE_get_default_RANDrs   r   ZENGINE_unregister_RANDRAND_set_rand_methodr   ENGINE_finish)r|   eresrn   rn   ro   activate_builtin_random   s    
zBackend.activate_builtin_randomc             c   s   | j j| j j}| j|| jjk | j j|}| j|dk z
|V  W d | j j|}| j|dk | j j|}| j|dk X d S )Nr   )	ru   ZENGINE_by_idZCryptography_osrandom_engine_idr   rs   r   ZENGINE_initZENGINE_freer   )r|   r   r   rn   rn   ro   _get_osurandom_engine   s    
zBackend._get_osurandom_enginec          
   C   s`   | j jr\| j  | j  }| j j|}| j|dk W d Q R X | j j| jj}| j|dk d S )Nr   )	ru   r   r   r   ZENGINE_set_default_RANDr   r   rs   r   )r|   r   r   rn   rn   ro   rx      s    
z Backend.activate_osrandom_enginec             C   s`   | j jdd}| j 2}| jj|dt||| j jd}| j|dk W d Q R X | j j|j	dS )Nzchar[]@   s   get_implementationr   ascii)
rs   newr   ru   ZENGINE_ctrl_cmdlenr   r   stringdecode)r|   bufr   r   rn   rn   ro   osrandom_engine_implementation   s    

z&Backend.osrandom_engine_implementationc             C   s   | j j| j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   )rs   r   ru   ZOpenSSL_versionOPENSSL_VERSIONr   )r|   rn   rn   ro   openssl_version_text   s    zBackend.openssl_version_textc             C   s
   | j j S )N)ru   ZOpenSSL_version_num)r|   rn   rn   ro   openssl_version_number   s    zBackend.openssl_version_numberc             C   s   t | ||S )N)r9   )r|   key	algorithmrn   rn   ro   create_hmac_ctx   s    zBackend.create_hmac_ctxc             C   sL   |j dks|j dkr0dj|j |jd jd}n|j jd}| jj|}|S )Nblake2bblake2sz{}{}   r   )nameformatdigest_sizeencoderu   ZEVP_get_digestbyname)r|   r   Zalgevp_mdrn   rn   ro   _evp_md_from_algorithm   s    zBackend._evp_md_from_algorithmc             C   s    | j |}| j|| jjk |S )N)r   r   rs   r   )r|   r   r   rn   rn   ro   _evp_md_non_null_from_algorithm   s    
z'Backend._evp_md_non_null_from_algorithmc             C   s   | j |}|| jjkS )N)r   rs   r   )r|   r   r   rn   rn   ro   hash_supported   s    
zBackend.hash_supportedc             C   s
   | j |S )N)r   )r|   r   rn   rn   ro   hmac_supported   s    zBackend.hmac_supportedc             C   s
   t | |S )N)r8   )r|   r   rn   rn   ro   create_hash_ctx   s    zBackend.create_hash_ctxc             C   sH   y| j t|t|f }W n tk
r.   dS X || ||}| jj|kS )NF)rv   typeKeyErrorrs   r   )r|   ciphermodeadapter
evp_cipherrn   rn   ro   cipher_supported   s    zBackend.cipher_supportedc             C   s0   ||f| j krtdj|||| j ||f< d S )Nz"Duplicate registration for: {} {}.)rv   
ValueErrorr   )r|   
cipher_clsmode_clsr   rn   rn   ro   register_cipher_adapter   s    
zBackend.register_cipher_adapterc             C   sn  x,t ttttttgD ]}| jt|t	d qW x(t ttttgD ]}| jt
|t	d q>W x&t tttgD ]}| jt|t	d qfW | jttt	d x&t tttgD ]}| jt|t	d qW x&t tttgD ]}| jt|t	d qW x6tjttgt tttgD ]\}}| j||t	d qW | jttd t	d | jttd t	d | jttd t	d	 | j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}Zrc4Zrc2Zchacha20)r]   r`   ra   rc   r^   r_   rb   r   rT   GetCipherByNamerX   r\   rV   r[   	itertoolsproductrW   rZ   rU   r   rj   rY   rd   _get_xts_cipher)r|   r   r   rn   rn   ro   rw      s^    


z!Backend._register_default_ciphersc             C   s   t | ||t jS )N)r   Z_ENCRYPT)r|   r   r   rn   rn   ro   create_symmetric_encryption_ctx7  s    z'Backend.create_symmetric_encryption_ctxc             C   s   t | ||t jS )N)r   Z_DECRYPT)r|   r   r   rn   rn   ro   create_symmetric_decryption_ctx:  s    z'Backend.create_symmetric_decryption_ctxc             C   s
   | j |S )N)r   )r|   r   rn   rn   ro   pbkdf2_hmac_supported=  s    zBackend.pbkdf2_hmac_supportedc       
   	   C   sh   | j jd|}| j|}| j j|}| jj|t||t|||||}	| j|	dk | j j|d d  S )Nzunsigned char[]r   )	rs   r   r   from_bufferru   ZPKCS5_PBKDF2_HMACr   r   buffer)
r|   r   lengthsaltZ
iterationskey_materialr   r   key_material_ptrr   rn   rn   ro   derive_pbkdf2_hmac@  s    
zBackend.derive_pbkdf2_hmacc             C   s   t j| jS )N)rH   _consume_errorsru   )r|   rn   rn   ro   r   R  s    zBackend._consume_errorsc             C   s   || j jksttjs~| jj|}| j jd|}| jj||}| j	|dk t
j| j j|d | d}| jj|rz| }|S | jj|}| j	|| j jk | j j|}| jj| t
|dS d S )Nzunsigned char[]r   big   )rs   r   AssertionErrorsixPY2ru   ZBN_num_bytesr   Z	BN_bn2binr   int
from_bytesr   ZBN_is_negativeZ	BN_bn2hexr   OPENSSL_free)r|   bnZbn_num_bytesZbin_ptrZbin_lenvalZ	hex_cdatahex_strrn   rn   ro   
_bn_to_intU  s    zBackend._bn_to_intNc             C   s   |dks|| j jkst|dkr(| j j}tjst|jt|j d d d}| jj	|t
||}| j|| j jk |S t|jddd jd}| j jd}||d	< | jj||}| j|d	k | j|d	 | j jk |d	 S 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       @r   r   L   r   z	BIGNUM **r   )rs   r   r   r   r   to_bytesr   
bit_lengthru   Z	BN_bin2bnr   r   hexrstripr   r   Z	BN_hex2bn)r|   numr   binaryZbn_ptrZhex_numr   rn   rn   ro   
_int_to_bnk  s    zBackend._int_to_bnc             C   s   t j|| | jj }| j|| jjk | jj|| jj}| j	|}| jj|| jj
}| jj|||| jj}| j|dk | j|}t| ||S )Nr   )rO   Z_verify_rsa_parametersru   RSA_newr   rs   r   gcRSA_freer   BN_freeZRSA_generate_key_ex_rsa_cdata_to_evp_pkeyr>   )r|   public_exponentkey_size	rsa_cdatar   r   evp_pkeyrn   rn   ro   generate_rsa_private_key  s    


z Backend.generate_rsa_private_keyc             C   s   |dko|d@ dko|dkS )N   r   r   i   rn   )r|   r   r   rn   rn   ro   !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 }| j|| jjk | jj|| jj}| j|j}| j|j}| j|j}| j|j}| j|j}| j|j}| j|jj	}	| j|jj
}
| jj|||}| j|dk | jj||
|	|}| j|dk | jj||||}| j|dk | jj|| jj}| j|dk | j|}t| ||S )Nr   )rO   Z_check_private_key_componentspqddmp1dmq1iqmppublic_numbersr   nru   r   r   rs   r   r   r   r   ZRSA_set0_factorsRSA_set0_keyZRSA_set0_crt_paramsZRSA_blinding_onr   r>   )r|   numbersr   r   r   r   r   r   r   r   r   r   r   rn   rn   ro   load_rsa_private_numbers  s<    


z Backend.load_rsa_private_numbersc             C   s   t j|j|j | jj }| j|| jjk | jj	|| jj
}| j|j}| j|j}| jj|||| jj}| j|dk | j|}t| ||S )Nr   )rO   Z_check_public_key_componentsr   r   ru   r   r   rs   r   r   r   r   r   r   r?   )r|   r   r   r   r   r   r   rn   rn   ro   load_rsa_public_numbers  s    

zBackend.load_rsa_public_numbersc             C   s2   | j j }| j|| jjk | jj|| j j}|S )N)ru   ZEVP_PKEY_newr   rs   r   r   EVP_PKEY_free)r|   r   rn   rn   ro   _create_evp_pkey_gc  s    
zBackend._create_evp_pkey_gcc             C   s(   | j  }| jj||}| j|dk |S )Nr   )r   ru   ZEVP_PKEY_set1_RSAr   )r|   r   r   r   rn   rn   ro   r     s    zBackend._rsa_cdata_to_evp_pkeyc             C   sH   | j j|}| jj|t|}| j|| j jk t| j 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.
        )
rs   r   ru   ZBIO_new_mem_bufr   r   r   rh   r   BIO_free)r|   datadata_ptrri   rn   rn   ro   _bytes_to_bio  s
    zBackend._bytes_to_bioc             C   sP   | j j }| j|| jjk | j j|}| j|| jjk | jj|| j j}|S )z.
        Creates an empty memory BIO.
        )ru   Z	BIO_s_memr   rs   r   ZBIO_newr   r   )r|   Z
bio_methodri   rn   rn   ro   _create_mem_bio_gc  s    
zBackend._create_mem_bio_gcc             C   s\   | j jd}| jj||}| j|dk | j|d | j jk | j j|d |dd }|S )zE
        Reads a memory BIO. This only works on memory BIOs.
        zchar **r   N)rs   r   ru   ZBIO_get_mem_datar   r   r   )r|   ri   r   Zbuf_lenbio_datarn   rn   ro   _read_mem_bio  s    zBackend._read_mem_bioc             C   s  | j j|}|| j jkrT| j j|}| j|| jjk | jj|| j j}t	| ||S || j j
kr| j j|}| j|| jjk | jj|| j j}t| ||S || j jkr| j j|}| j|| jjk | jj|| j j}t| ||S || jkr,| j j|}| j|| jjk | jj|| j j}t| ||S |t| j ddkrJt| |S |t| j ddkrht| |S |t| j ddkrt| |S |t| j ddkrt| |S tddS )zd
        Return the appropriate type of PrivateKey given an evp_pkey cdata
        pointer.
        EVP_PKEY_ED25519NEVP_PKEY_X448EVP_PKEY_X25519EVP_PKEY_ED448zUnsupported key type.)ru   EVP_PKEY_idEVP_PKEY_RSAEVP_PKEY_get1_RSAr   rs   r   r   r   r>   EVP_PKEY_DSAEVP_PKEY_get1_DSADSA_freer&   EVP_PKEY_ECEVP_PKEY_get1_EC_KEYEC_KEY_freer(   ry   EVP_PKEY_get1_DHDH_freer"   getattrr*   rB   r@   r-   r	   )r|   r   key_typer   	dsa_cdataec_cdatadh_cdatarn   rn   ro   _evp_pkey_to_private_key   s<    



z Backend._evp_pkey_to_private_keyc             C   s  | j j|}|| j jkrT| j j|}| j|| jjk | jj|| j j}t	| ||S || j j
kr| j j|}| j|| jjk | jj|| j j}t| ||S || j jkr| j j|}| j|| jjk | jj|| j j}t| ||S || jkr,| j j|}| j|| jjk | jj|| j j}t| ||S |t| j ddkrJt| |S |t| j ddkrht| |S |t| j ddkrt| |S |t| j ddkrt| |S tddS )zc
        Return the appropriate type of PublicKey given an evp_pkey cdata
        pointer.
        r   Nr   r   r   zUnsupported key type.)ru   r   r   r   r   rs   r   r   r   r?   r   r   r   r'   r   r   r   r)   ry   r   r  r#   r  r+   rC   rA   r.   r	   )r|   r   r  r   r  r  r  rn   rn   ro   _evp_pkey_to_public_key+  s<    



zBackend._evp_pkey_to_public_keyc             C   s6   | j jr&t|tjtjtjtjtjfS t|tjS d S )N)	ru   ZCryptography_HAS_RSA_OAEP_MD
isinstancerI   SHA1SHA224SHA256SHA384SHA512)r|   r   rn   rn   ro   _oaep_hash_supportedV  s    
zBackend._oaep_hash_supportedc             C   s   t |trdS t |tr2t |jtr2| j|jjS t |trt |jtr| j|jjo| j|jo|j	d kpt
|j	dkp| jjdkS dS d S )NTr   r   F)r	  rR   rS   Z_mgfrP   r   
_algorithmrQ   r  Z_labelr   ru   ZCryptography_HAS_RSA_OAEP_LABEL)r|   paddingrn   rn   ro   rsa_padding_supportedd  s    
zBackend.rsa_padding_supportedc             C   s~   |dkrt d| jj }| j|| jjk | jj|| jj}| jj||| jjd| jj| jj| jj}| j|dk t	| |S )N         z+Key size must be 1024 or 2048 or 3072 bits.r   r   )r  r  r  )
r   ru   DSA_newr   rs   r   r   r   ZDSA_generate_parameters_exr%   )r|   r   ctxr   rn   rn   ro   generate_dsa_parametersu  s    
zBackend.generate_dsa_parametersc             C   sT   | j j|j}| j|| jjk | jj|| j j}| j j| | j	|}t
| ||S )N)ru   ZDSAparams_dupZ
_dsa_cdatar   rs   r   r   r   ZDSA_generate_key_dsa_cdata_to_evp_pkeyr&   )r|   
parametersr  r   rn   rn   ro   generate_dsa_private_key  s    
z Backend.generate_dsa_private_keyc             C   s   | j |}| j|S )N)r  r  )r|   r   r  rn   rn   ro   'generate_dsa_private_key_and_parameters  s    
z/Backend.generate_dsa_private_key_and_parametersc             C   sB   | j j||||}| j|dk | j j|||}| j|dk d S )Nr   )ru   DSA_set0_pqgr   ZDSA_set0_key)r|   r  r   r   gpub_keypriv_keyr   rn   rn   ro   _dsa_cdata_set_values  s    zBackend._dsa_cdata_set_valuesc       
      C   s   t j| |jj}| jj }| j|| jjk | jj	|| jj
}| j|j}| j|j}| j|j}| j|jj}| j|j}| j|||||| | j|}	t| ||	S )N)rK   Z_check_dsa_private_numbersr   parameter_numbersru   r  r   rs   r   r   r   r   r   r   r  yxr!  r  r&   )
r|   r   r"  r  r   r   r  r  r   r   rn   rn   ro   load_dsa_private_numbers  s    


z Backend.load_dsa_private_numbersc       	      C   s   t j|j | jj }| j|| jjk | jj|| jj	}| j
|jj}| j
|jj}| j
|jj}| j
|j}| jj}| j|||||| | j|}t| ||S )N)rK   _check_dsa_parametersr"  ru   r  r   rs   r   r   r   r   r   r   r  r#  r!  r  r'   )	r|   r   r  r   r   r  r  r   r   rn   rn   ro   load_dsa_public_numbers  s    

zBackend.load_dsa_public_numbersc             C   s   t j| | jj }| j|| jjk | jj|| jj}| j	|j
}| j	|j}| j	|j}| jj||||}| j|dk t| |S )Nr   )rK   r&  ru   r  r   rs   r   r   r   r   r   r   r  r  r%   )r|   r   r  r   r   r  r   rn   rn   ro   load_dsa_parameter_numbers  s    

z"Backend.load_dsa_parameter_numbersc             C   s(   | j  }| jj||}| j|dk |S )Nr   )r   ru   ZEVP_PKEY_set1_DSAr   )r|   r  r   r   rn   rn   ro   r    s    zBackend._dsa_cdata_to_evp_pkeyc             C   s
   | j |S )N)r   )r|   r   rn   rn   ro   dsa_hash_supported  s    zBackend.dsa_hash_supportedc             C   s   dS )NTrn   )r|   r   r   r  rn   rn   ro   dsa_parameters_supported  s    z Backend.dsa_parameters_supportedc             C   s   | j |td|j S )N    )r   r]   
block_size)r|   r   rn   rn   ro   cmac_algorithm_supported  s    z Backend.cmac_algorithm_supportedc             C   s
   t | |S )N)r   )r|   r   rn   rn   ro   create_cmac_ctx  s    zBackend.create_cmac_ctxc       
         s  t |tjstdt |tjtjfr8|d k	rptdn8t |t	j
sNtdn"t |t	jrpt |tj rptd j||} jj } j| jjk  jj| jj} jj|tjjj} j|dk  jj|t |j} j|dk |j } jj||j} j|dk  jj  } j| jjk  jj| fdd} j!|j"t#| jj$dd	  jj%||} j|dk  jj&||j|}|d
krȈ j' }	 j|	d
 j( jj) jj* tdt+ |S )NzBuilder type mismatch.z8algorithm must be None when signing via ed25519 or ed448z.Algorithm must be a registered hash algorithm.z5MD5 is not a supported hash algorithm for EC/DSA CSRsr   c                s    j j|  jj j jdS )NX509_EXTENSION_free)ru   Zsk_X509_EXTENSION_pop_freers   	addressof_original_lib)r$  )r|   rn   ro   <lambda>  s   z)Backend.create_x509_csr.<locals>.<lambda>F)
extensionshandlersx509_objadd_funcr   r   zDigest too big for RSA key),r	  r   Z CertificateSigningRequestBuilder	TypeErrorrM   Ed25519PrivateKeyrN   Ed448PrivateKeyr   rI   HashAlgorithmMD5rO   RSAPrivateKey_evp_md_x509_null_if_eddsaru   ZX509_REQ_newr   rs   r   r   X509_REQ_freeZX509_REQ_set_versionVersionZv1valueZX509_REQ_set_subject_namer6   _subject_name
public_keyZX509_REQ_set_pubkey	_evp_pkeyZsk_X509_EXTENSION_new_null_create_x509_extensions_extensionsr1   Zsk_X509_EXTENSION_insertZX509_REQ_add_extensionsZX509_REQ_signr   _lib_reason_matchERR_LIB_RSA RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEYrF   )
r|   builderprivate_keyr   r   x509_reqr   rB  Zsk_extensionerrorsrn   )r|   ro   create_x509_csr  sb    




zBackend.create_x509_csrc       	      C   s  t |tjstdt |tjtjfr8|d k	rLtdnt |t	j
sLtdt |t	jrnt |tj rntd| j||}| jj }| jj|tjj}| jj||jj}| j|dk | jj|t| |j}| j|dk | jj||jj}| j|dk t| |j }| jj!||}| j|dk | j"| jj#||j$ | j"| jj%||j& | j'|j(t)|| jj*dd | jj+|t| |j,}| j|dk | jj-||j|}|dkr| j. }| j|d j/| jj0| jj1 td	t2| |S )
NzBuilder type mismatch.z8algorithm must be None when signing via ed25519 or ed448z.Algorithm must be a registered hash algorithm.z8MD5 is only (reluctantly) supported for RSA certificatesr   T)r3  r4  r5  r6  r   r   zDigest too big for RSA key)3r	  r   ZCertificateBuilderr7  rM   r8  rN   r9  r   rI   r:  r;  rO   r<  r=  ru   ZX509_newrs   r   backend	X509_freeZX509_set_version_versionr@  r   ZX509_set_subject_namer6   rA  ZX509_set_pubkeyZ_public_keyrC  r4   _serial_numberZX509_set_serialNumber_set_asn1_timeZX509_getm_notBeforeZ_not_valid_beforeZX509_getm_notAfterZ_not_valid_afterrD  rE  r1   ZX509_add_extZX509_set_issuer_name_issuer_nameZ	X509_signr   rF  rG  rH  rD   )	r|   rI  rJ  r   r   Z	x509_certr   serial_numberrL  rn   rn   ro   create_x509_certificate4  sd    

zBackend.create_x509_certificatec             C   s(   t |tjtjfr| jjS | j|S d S )N)r	  rM   r8  rN   r9  rs   r   r   )r|   rJ  r   rn   rn   ro   r=    s    z"Backend._evp_md_x509_null_if_eddsac             C   sL   |j dkr|jdjd}n|jdjd}| jj||}| j|dk d S )Ni  z%Y%m%d%H%M%SZr   z%y%m%d%H%M%SZr   )yearstrftimer   ru   ZASN1_TIME_set_stringr   )r|   	asn1_timetimeZasn1_strr   rn   rn   ro   rR    s
    
zBackend._set_asn1_timec             C   s>   | j j }| j|| jjk | jj|| j j}| j|| |S )N)ru   ZASN1_TIME_newr   rs   r   r   ZASN1_TIME_freerR  )r|   rY  rX  rn   rn   ro   _create_asn1_time  s
    
zBackend._create_asn1_timec             C   s  t |tjstdt |tjtjfr8|d k	rLtdnt |t	j
sLtdt |t	jrnt |tj rntd| j||}| jj }| jj|tjj}| jj|d}| j|dk | jj|t| |j}| j|dk | j|j}| jj||}| j|dk | j|j}| jj||}| j|dk | j|j t!|| jj"dd xL|j#D ]B}	| jj$|	j%}
| j|
| jj&k | jj'||
}| j|dk qHW | jj(||j)|}|dkr| j* }| j|d j+| jj,| jj- td	t.| |S )
NzBuilder type mismatch.z8algorithm must be None when signing via ed25519 or ed448z.Algorithm must be a registered hash algorithm.z5MD5 is not a supported hash algorithm for EC/DSA CRLsr   T)r3  r4  r5  r6  r   r   zDigest too big for RSA key)/r	  r   Z CertificateRevocationListBuilderr7  rM   r8  rN   r9  r   rI   r:  r;  rO   r<  r=  ru   ZX509_CRL_newrs   r   rN  X509_CRL_freeZX509_CRL_set_versionr   ZX509_CRL_set_issuer_namer6   rS  rZ  _last_updateZX509_CRL_set_lastUpdate_next_updateZX509_CRL_set_nextUpdaterD  rE  r0   ZX509_CRL_add_extZ_revoked_certificatesZCryptography_X509_REVOKED_dupZ_x509_revokedr   ZX509_CRL_add0_revokedZX509_CRL_signrC  r   rF  rG  rH  rE   )r|   rI  rJ  r   r   x509_crlr   Zlast_updatenext_updateZrevoked_certZrevokedrL  rn   rn   ro   create_x509_crl  sb    

zBackend.create_x509_crlc       
      C   sh   xbt |D ]V\}}| j||}| j|| jjk |rF| jj|| jj}||||}	| j|	dk q
W d S )Nr   )	enumerate_create_x509_extensionr   rs   r   r   ru   r/  )
r|   r3  r4  r5  r6  r   i	extensionZx509_extensionr   rn   rn   ro   rD    s    zBackend._create_x509_extensionsc             C   s.   t | |jj}| jj| jj||jr&dnd|S )Nr   r   )r7   oiddotted_stringru   ZX509_EXTENSION_create_by_OBJrs   r   critical)r|   rd  r@  objrn   rn   ro   _create_raw_x509_extension  s    z"Backend._create_raw_x509_extensionc             C   s  t |jtjr(t| |jj}| j||S t |jtjrfttfdd |jD  }t| |}| j||S t |jtj	rt| tt
}| j||S y||j }W n$ tk
r   tdj|jY nX || |j}| jj|jjjd}tj|| jjk | jj||jr
dnd|S d S )Nc             S   s   g | ]}t tt|jqS rn   )r   r   r   r@  ).0r$  rn   rn   ro   
<listcomp>  s   z2Backend._create_x509_extension.<locals>.<listcomp>zExtension not supported: {}r   r   r   )r	  r@  r   ZUnrecognizedExtensionr5   ri  Z
TLSFeaturer   r   ZPrecertPoisonr   re  r   NotImplementedErrorr   ru   ZOBJ_txt2nidrf  r   rN  r   	NID_undefZX509V3_EXT_i2drg  )r|   r4  rd  r@  Zasn1r   Z
ext_structnidrn   rn   ro   rb  
  s0    
zBackend._create_x509_extensionc             C   s   t |tjstd| jj }| j|| jjk | jj	|| jj
}t| |j}| jj||}| j|dk | j|j}| jj||}| j|dk | j|jt|| jjdd t| d |S )NzBuilder type mismatch.r   T)r3  r4  r5  r6  r   )r	  r   ZRevokedCertificateBuilderr7  ru   ZX509_REVOKED_newr   rs   r   r   ZX509_REVOKED_freer4   rQ  ZX509_REVOKED_set_serialNumberrZ  Z_revocation_dateZX509_REVOKED_set_revocationDaterD  rE  r/   ZX509_REVOKED_add_extrG   )r|   rI  Zx509_revokedrT  r   Zrev_datern   rn   ro   create_x509_revoked_certificate,  s&    
z'Backend.create_x509_revoked_certificatec             C   s   | j | jj| j||S )N)	_load_keyru   ZPEM_read_bio_PrivateKeyr  )r|   r   passwordrn   rn   ro   load_pem_private_keyE  s
    zBackend.load_pem_private_keyc             C   s   | j |}| jj|j| jj| jj| jj}|| jjkrR| jj|| jj}| j|S | j	  | jj
|j}| j|dk | jj|j| jj| jj| jj}|| jjkr| jj|| jj}| j|}t| ||S | j  d S )Nr   )r   ru   ZPEM_read_bio_PUBKEYri   rs   r   r   r   r  r   	BIO_resetr   ZPEM_read_bio_RSAPublicKeyr   r   r?   _handle_key_loading_error)r|   r   mem_bior   r   r   rn   rn   ro   load_pem_public_keyM  s     


zBackend.load_pem_public_keyc             C   s^   | j |}| jj|j| jj| jj| jj}|| jjkrR| jj|| jj}t| |S | j	  d S )N)
r   ru   ZPEM_read_bio_DHparamsri   rs   r   r   r  r!   rt  )r|   r   ru  r  rn   rn   ro   load_pem_parametersf  s    

zBackend.load_pem_parametersc             C   s>   | j |}| j||}|r$| j|S | j| jj| j||S d S )N)r   "_evp_pkey_from_der_traditional_keyr  rp  ru   Zd2i_PKCS8PrivateKey_bio)r|   r   rq  r   r   rn   rn   ro   load_der_private_keyq  s    

zBackend.load_der_private_keyc             C   sV   | j j|j| jj}|| jjkrF| jj|| j j}|d k	rBtd|S | j  d S d S )Nz4Password was given but private key is not encrypted.)	ru   d2i_PrivateKey_biori   rs   r   r   r   r7  r   )r|   r   rq  r   rn   rn   ro   rx    s    z*Backend._evp_pkey_from_der_traditional_keyc             C   s   | j |}| jj|j| jj}|| jjkrF| jj|| jj}| j|S | j	  | jj
|j}| j|dk | jj|j| jj}|| jjkr| jj|| jj}| j|}t| ||S | j  d S )Nr   )r   ru   Zd2i_PUBKEY_biori   rs   r   r   r   r  r   rs  r   Zd2i_RSAPublicKey_bior   r   r?   rt  )r|   r   ru  r   r   r   rn   rn   ro   load_der_public_key  s    


zBackend.load_der_public_keyc             C   s   | j |}| jj|j| jj}|| jjkrF| jj|| jj}t| |S | jj	r| j
  | jj|j}| j|dk | jj|j| jj}|| jjkr| jj|| jj}t| |S | j  d S )Nr   )r   ru   Zd2i_DHparams_biori   rs   r   r   r  r!   rz   r   rs  r   ZCryptography_d2i_DHxparams_biort  )r|   r   ru  r  r   rn   rn   ro   load_der_parameters  s     


zBackend.load_der_parametersc             C   sb   | j |}| jj|j| jj| jj| jj}|| jjkrF| j  td| jj|| jj	}t
| |S )NzwUnable to load certificate. See https://cryptography.io/en/latest/faq/#why-can-t-i-import-my-pem-file for more details.)r   ru   ZPEM_read_bio_X509ri   rs   r   r   r   r   rO  rD   )r|   r   ru  r   rn   rn   ro   load_pem_x509_certificate  s    
z!Backend.load_pem_x509_certificatec             C   sV   | j |}| jj|j| jj}|| jjkr:| j  td| jj|| jj	}t
| |S )NzUnable to load certificate)r   ru   Zd2i_X509_biori   rs   r   r   r   r   rO  rD   )r|   r   ru  r   rn   rn   ro   load_der_x509_certificate  s    
z!Backend.load_der_x509_certificatec             C   sb   | j |}| jj|j| jj| jj| jj}|| jjkrF| j  td| jj|| jj	}t
| |S )NzoUnable to load CRL. See https://cryptography.io/en/latest/faq/#why-can-t-i-import-my-pem-file for more details.)r   ru   ZPEM_read_bio_X509_CRLri   rs   r   r   r   r   r[  rE   )r|   r   ru  r^  rn   rn   ro   load_pem_x509_crl  s    
zBackend.load_pem_x509_crlc             C   sV   | j |}| jj|j| jj}|| jjkr:| j  td| jj|| jj	}t
| |S )NzUnable to load CRL)r   ru   Zd2i_X509_CRL_biori   rs   r   r   r   r   r[  rE   )r|   r   ru  r^  rn   rn   ro   load_der_x509_crl  s    
zBackend.load_der_x509_crlc             C   sb   | j |}| jj|j| jj| jj| jj}|| jjkrF| j  td| jj|| jj	}t
| |S )NzsUnable to load request. See https://cryptography.io/en/latest/faq/#why-can-t-i-import-my-pem-file for more details.)r   ru   ZPEM_read_bio_X509_REQri   rs   r   r   r   r   r>  rF   )r|   r   ru  rK  rn   rn   ro   load_pem_x509_csr  s    
zBackend.load_pem_x509_csrc             C   sV   | j |}| jj|j| jj}|| jjkr:| j  td| jj|| jj	}t
| |S )NzUnable to load request)r   ru   Zd2i_X509_REQ_biori   rs   r   r   r   r   r>  rF   )r|   r   ru  rK  rn   rn   ro   load_der_x509_csr   s    
zBackend.load_der_x509_csrc       
      C   s*  | j |}| jjd}|d k	rFtjd| | jj|}||_t||_||j	| jj
| jj| jjd|}|| jj
kr|jdkr| j }	| j|	 |jd
krtdq|jdksttdj|jd n| j  | jj|| jj}|d k	o|jdk rtd	|d k	r|jdks"|d ks"t||S )NzCRYPTOGRAPHY_PASSWORD_DATA *rq  ZCryptography_pem_password_cbr   r   z3Password was not given but private key is encryptedr   zAPasswords longer than {} bytes are not supported by this backend.z4Password was given but private key is not encrypted.)r   rs   r   r   _check_bytesliker   rq  r   r   ri   r   r0  ru   r1  errorr   r   r7  r   r   r   maxsizert  r   r   called)
r|   Zopenssl_read_funcZconvert_funcr   rq  ru  ZuserdataZpassword_ptrr   rL  rn   rn   ro   rp  
  s@    





zBackend._load_keyc                s    j  }|stdn|d j jj jjsF|d j jj jjrPtdn|d j jj jjs|d j jj	 jj
rtdtjnLt fdd|D rtdn,|d j jj jj	 jjfksttdd S )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jV  qd S )N)rF  ru   ERR_LIB_EVPZ'EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM)rj  r  )r|   rn   ro   	<genexpr>X  s   z4Backend._handle_key_loading_error.<locals>.<genexpr>z!Unsupported public key algorithm.)r   r   rF  ru   r  ZEVP_R_BAD_DECRYPTZERR_LIB_PKCS12Z!PKCS12_R_PKCS12_CIPHERFINAL_ERRORZEVP_R_UNKNOWN_PBE_ALGORITHMZERR_LIB_PEMZPEM_R_UNSUPPORTED_ENCRYPTIONr	   r
   ZUNSUPPORTED_CIPHERanyrt   ZERR_LIB_ASN1r   )r|   rL  rn   )r|   ro   rt  ;  s2    






z!Backend._handle_key_loading_errorc             C   s   y| j |}W n tk
r*   | jj}Y nX | jj|}|| jjkrz| j }| j|| jjkpr|d j	| jj
| jj dS | j|| jjk | jj| dS d S )Nr   FT)_elliptic_curve_to_nidr	   ru   rm  ZEC_GROUP_new_by_curve_namers   r   r   r   rF  Z
ERR_LIB_ECZEC_R_UNKNOWN_GROUPZEC_GROUP_free)r|   curve	curve_nidgrouprL  rn   rn   ro   elliptic_curve_supportedh  s     z Backend.elliptic_curve_supportedc             C   s   t |tjsdS | j|S )NF)r	  rL   ZECDSAr  )r|   Zsignature_algorithmr  rn   rn   ro   ,elliptic_curve_signature_algorithm_supported  s    z4Backend.elliptic_curve_signature_algorithm_supportedc             C   s\   | j |rD| j|}| jj|}| j|dk | j|}t| ||S tdj|j	t
jdS )z@
        Generate a new private key on the named curve.
        r   z#Backend object does not support {}.N)r  _ec_key_new_by_curveru   ZEC_KEY_generate_keyr   _ec_cdata_to_evp_pkeyr(   r	   r   r   r
   UNSUPPORTED_ELLIPTIC_CURVE)r|   r  r  r   r   rn   rn   ro   #generate_elliptic_curve_private_key  s    



z+Backend.generate_elliptic_curve_private_keyc             C   sp   |j }| j|j}| jj| j|j| jj}| jj	||}| j
|dk | j||j|j}| j|}t| ||S )Nr   )r   r  r  rs   r   r   private_valueru   BN_clear_freeEC_KEY_set_private_keyr   )_ec_key_set_public_key_affine_coordinatesr$  r#  r  r(   )r|   r   publicr  r  r   r   rn   rn   ro   #load_elliptic_curve_private_numbers  s    
z+Backend.load_elliptic_curve_private_numbersc             C   s4   | j |j}| j||j|j}| j|}t| ||S )N)r  r  r  r$  r#  r  r)   )r|   r   r  r   rn   rn   ro   "load_elliptic_curve_public_numbers  s
    
z*Backend.load_elliptic_curve_public_numbersc       	      C   s   | j |}| jj|}| j|| jjk | jj|}| j|| jjk | jj|| jj}| j	 6}| jj
|||t||}|dkr| j  tdW d Q R X | jj||}| j|dk | j|}t| ||S )Nr   z(Invalid public bytes for the given curve)r  ru   EC_KEY_get0_groupr   rs   r   EC_POINT_newr   EC_POINT_free_tmp_bn_ctxZEC_POINT_oct2pointr   r   r   EC_KEY_set_public_keyr  r)   )	r|   r  Zpoint_bytesr  r  pointbn_ctxr   r   rn   rn   ro    load_elliptic_curve_public_bytes  s     


z(Backend.load_elliptic_curve_public_bytesc             C   sD  | j |}| j|\}}| jj|}| j|| jjk | jj|| jj}| j	|}| jj|| jj
}| j h}| jj|||| jj| jj|}	| j|	dk | jj|}
| jj|}||||
||}	| j|	dk W d Q R X | jj||}	| j|	dk | j	|}| jj|| jj
}| jj||}	| j|	dk | j|}t| ||S )Nr   )r   _ec_key_determine_group_get_funcru   r  r   rs   r   r   r  r   r  r  ZEC_POINT_mulZ
BN_CTX_getr  r  r  r(   )r|   r  r  r  get_funcr  r  r@  r  r   Zbn_xZbn_yprivater   rn   rn   ro   !derive_elliptic_curve_private_key  s.    




z)Backend.derive_elliptic_curve_private_keyc             C   s:   | j |}| jj|}| j|| jjk | jj|| jjS )N)r  ru   ZEC_KEY_new_by_curve_namer   rs   r   r   r   )r|   r  r  r  rn   rn   ro   r    s    
zBackend._ec_key_new_by_curvec             C   sV   | j |}| jj|j| jj}|| jjkr:| j  td| jj|| jj	}t
| |S )NzUnable to load OCSP request)r   ru   Zd2i_OCSP_REQUEST_biori   rs   r   r   r   r   OCSP_REQUEST_freer:   )r|   r   ru  requestrn   rn   ro   load_der_ocsp_request  s    
zBackend.load_der_ocsp_requestc             C   sV   | j |}| jj|j| jj}|| jjkr:| j  td| jj|| jj	}t
| |S )NzUnable to load OCSP response)r   ru   Zd2i_OCSP_RESPONSE_biori   rs   r   r   r   r   OCSP_RESPONSE_freer;   )r|   r   ru  responsern   rn   ro   load_der_ocsp_response  s    
zBackend.load_der_ocsp_responsec       	      C   s   | j j }| j|| jjk | jj|| j j}|j\}}}| j|}| j j	||j
|j
}| j|| jjk | j j||}| j|| jjk | j|jt|| j jdd t| |S )NT)r3  r4  r5  r6  r   )ru   ZOCSP_REQUEST_newr   rs   r   r   r  _requestr   OCSP_cert_to_id_x509ZOCSP_request_add0_idrD  rE  r3   ZOCSP_REQUEST_add_extr:   )	r|   rI  Zocsp_reqcertZissuerr   r   certidZonereqrn   rn   ro   create_ocsp_request  s"    

zBackend.create_ocsp_requestc             C   s  | j j }| j|| jjk | jj|| j j}| j|jj	}| j j
||jjj|jjj}| j|| jjk | jj|| j j}|jjd krd}nt|jj }|jjd kr| jj}n| j|jj}| jj}	|jjd k	r| j|jj}	| j|jj}
| j j|||jjj|||
|	}| j|| jjk | j||}|j\}}| j j}|tjjkrV|| j jO }|jd k	rx.|jD ]$}| j j ||j}| j|dk qjW | j!|j"t#|| j j$dd | j j%||j|j&|| jj|}|dkr| j' }| j|d j(| j j)| j j* t+d|S )Nr   T)r3  r4  r5  r6  r   r   z,responder_cert must be signed by private_keyr  ),ru   ZOCSP_BASICRESP_newr   rs   r   r   ZOCSP_BASICRESP_freer   	_responser  r  Z_certr  Z_issuerZOCSP_CERTID_freeZ_revocation_reasonr    Z_revocation_timerZ  r]  Z_this_updateZOCSP_basic_add1_statusZ_cert_statusr@  r=  Z_responder_idZOCSP_NOCERTSrg   ZOCSPResponderEncodingHASHZOCSP_RESPID_KEYZ_certsZOCSP_basic_add1_certrD  rE  r2   ZOCSP_BASICRESP_add_extZOCSP_basic_signrC  r   rF  ZERR_LIB_X509ZX509_R_KEY_VALUES_MISMATCHr   )r|   rI  rJ  r   basicr   r  reasonZrev_timer_  Zthis_updater   Zresponder_certZresponder_encodingflagsr  rL  rn   rn   ro   _create_ocsp_basic_response  st    









z#Backend._create_ocsp_basic_responsec             C   sb   |t jjkr| j|||}n| jj}| jj|j|}| j	|| jjk | jj
|| jj}t| |S )N)rg   ZOCSPResponseStatusZ
SUCCESSFULr  rs   r   ru   ZOCSP_response_creater@  r   r   r  r;   )r|   Zresponse_statusrI  rJ  r   r  Z	ocsp_resprn   rn   ro   create_ocsp_responsek  s    
zBackend.create_ocsp_responsec             C   s   | j |ot|tjS )N)r  r	  rL   ZECDH)r|   r   r  rn   rn   ro   +elliptic_curve_exchange_algorithm_supported{  s    
z3Backend.elliptic_curve_exchange_algorithm_supportedc             C   s(   | j  }| jj||}| j|dk |S )Nr   )r   ru   ZEVP_PKEY_set1_EC_KEYr   )r|   r  r   r   rn   rn   ro   r    s    zBackend._ec_cdata_to_evp_pkeyc             C   sN   ddd}|j |j|j}| jj|j }|| jjkrJtdj|jtj	|S )z/
        Get the NID for a curve name.
        Z
prime192v1Z
prime256v1)Z	secp192r1Z	secp256r1z${} is not a supported elliptic curve)
getr   ru   
OBJ_sn2nidr   rm  r	   r   r
   r  )r|   r  Zcurve_aliases
curve_namer  rn   rn   ro   r    s    
zBackend._elliptic_curve_to_nidc             c   sX   | j j }| j|| jjk | jj|| j j}| j j| z
|V  W d | j j| X d S )N)	ru   Z
BN_CTX_newr   rs   r   r   ZBN_CTX_freeZBN_CTX_startZ
BN_CTX_end)r|   r  rn   rn   ro   r    s    

zBackend._tmp_bn_ctxc             C   s   | j || jjk | jjd}| j || jjk | jj|}| j || jjk | jj|}| j || jjk | jj|}| j || jjk ||kr| jj	r| jj
}n| jj}|st||fS )zu
        Given an EC_KEY determine the group and what function is required to
        get point coordinates.
        s   characteristic-two-field)r   rs   r   ru   r  rm  r  ZEC_GROUP_method_ofZEC_METHOD_get_field_typeZCryptography_HAS_EC2MZ$EC_POINT_get_affine_coordinates_GF2mZ#EC_POINT_get_affine_coordinates_GFpr   )r|   r  Znid_two_fieldr  methodrn  r  rn   rn   ro   r    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| j|| jj}| jj|||}|dkrp| j  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.r   zInvalid EC key.)r   rs   r   r   ru   r   Z(EC_KEY_set_public_key_affine_coordinatesr   )r|   r  r$  r#  r   rn   rn   ro   r    s    z1Backend._ec_key_set_public_key_affine_coordinatesc             C   s  t |tjstd|tjjkr(td|tjjkr<td|tjjkrPtdt |tjsdtdt |tj	rd}d}| j
j}n@t |tjr| jjd}|j}t|}|d	krtd
ntd| jj|}	|tjjkrX|tjjkr| jj}
|}n`|tjjkst|	| jjkr | jj}
n2|	| jjkr8| jj}
n|	| jjksJt| jj}
|}nf|tjjkr|tjjkrt |tj	std| j|	|S |tjjkst| jj}
|}ntd| j  }|
|||||| j
j| j
j}| j!|dk | j"|S )Nz2format must be an item from the PrivateFormat enumz-X9.62 format is only valid for EC public keysz/raw format is invalid with this key or encodingz/raw encoding is invalid with this key or formatzBEncryption 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 keysz-encoding must be Encoding.PEM or Encoding.DERr   )#r	  rJ   ZPrivateFormatr7  EncodingX962r   RawZKeySerializationEncryptionZNoEncryptionrs   r   ZBestAvailableEncryptionru   EVP_get_cipherbynamerq  r   r   PEMZPKCS8ZPEM_write_bio_PKCS8PrivateKeyZTraditionalOpenSSLr   r   ZPEM_write_bio_RSAPrivateKeyr   ZPEM_write_bio_DSAPrivateKeyr   ZPEM_write_bio_ECPrivateKeyDER"_private_key_bytes_traditional_derZi2d_PKCS8PrivateKey_bior   r   r   )r|   encodingr   Zencryption_algorithmr   cdatarq  Zpasslenr   r  	write_bior   ri   r   rn   rn   ro   _private_key_bytes  s|    



zBackend._private_key_bytesc             C   sp   || j jkr| j j}n0|| j jkr,| j j}n| j|| j jk | j j}| j }|||}| j|dk | j	|S )Nr   )
ru   r   Zi2d_RSAPrivateKey_bior   Zi2d_ECPrivateKey_bior   r   Zi2d_DSAPrivateKey_bior   r   )r|   r  r  r  ri   r   rn   rn   ro   r  5  s    


z*Backend._private_key_bytes_traditional_derc       	      C   sl  t |tjstd|tjjtjjfkr0td|tjjkrDtd|tjjkrXtd|tjj	ksp|tjj	kr|tjj	k	s|tjj	k	rtd| j
|S |tjjkr|tjjkr| jj}n|tjjkst| jj}|}nh|tjjkr:| jj|| jjkst|tjjkr| jj}n|tjjks,t| jj}|}ntd| j }|||}| j|dk | j|S )Nz/encoding must be an item from the Encoding enumz-Point formats are not valid for this key typez/raw format is invalid with this key or encodingz/raw encoding is invalid with this key or formatz1OpenSSH format must be used with OpenSSH encodingz1format must be an item from the PublicFormat enumr   )r	  rJ   r  r7  PublicFormatUncompressedPointZCompressedPointr   r  OpenSSH_openssh_public_key_bytesZSubjectPublicKeyInfor  ru   ZPEM_write_bio_PUBKEYr  r   Zi2d_PUBKEY_bioZPKCS1r   r   ZPEM_write_bio_RSAPublicKeyZi2d_RSAPublicKey_bior   r   r   )	r|   r  r   r   r   r  r  ri   r   rn   rn   ro   _public_key_bytesC  sF    



zBackend._public_key_bytesc             C   s  t |tjr@|j }dtjtjdtj|j	 tj|j
  S t |tjr|j }|j}dtjtjdtj|j tj|j tj|j tj|j  S t |tjr|jtjjtjj}dtjtjdtj|  S t |tjr~|j }y$tjdtjdtjd	it|j }W n t k
r4   t!d
Y nX |jtjj"tjj#}d| d tjtjd| tj| tj|  S t!dd S )Ns   ssh-rsa s   ssh-rsas   ssh-dss s   ssh-dsss   ssh-ed25519 s   ssh-ed25519s   nistp256s   nistp384s   nistp521zZOnly SECP256R1, SECP384R1, and SECP521R1 curves are supported by the SSH public key formats   ecdsa-sha2-    z3OpenSSH encoding is not supported for this key type)$r	  rO   ZRSAPublicKeyr   base64	b64encoderf   Z_ssh_write_stringZ_ssh_write_mpintr   r   rK   ZDSAPublicKeyr"  r   r   r  r#  rM   ZEd25519PublicKeyZpublic_bytesrJ   r  r  r  rL   ZEllipticCurvePublicKeyZ	SECP256R1Z	SECP384R1Z	SECP521R1r   r  r   r   r  r  )r|   r   r   r"  Z	raw_bytesr  r  rn   rn   ro   r    sF    ,


z!Backend._openssh_public_key_bytesc             C   s   |t jjkrtd| jjd}| jj|| jj|| jj |t jj	krj|d | jjkr`| jj
}q| jj}n8|t jjkr|d | jjkr| jj}q| jj}ntd| j }|||}| j|dk | j|S )Nz!OpenSSH encoding is not supportedz	BIGNUM **r   z/encoding must be an item from the Encoding enumr   )rJ   r  r  r7  rs   r   ru   ZDH_get0_pqgr   r  ZPEM_write_bio_DHxparamsZPEM_write_bio_DHparamsr  ZCryptography_i2d_DHxparams_bioZi2d_DHparams_bior   r   r   )r|   r  r   r  r   r  ri   r   rn   rn   ro   _parameter_bytes  s*    





zBackend._parameter_bytesc             C   s|   |dk rt d|dkr t d| jj }| j|| jjk | jj|| jj}| jj|||| jj}| j|dk t	| |S )Ni   z%DH key_size must be at least 512 bitsr      zDH generator must be 2 or 5r   )r   r  )
r   ru   DH_newr   rs   r   r   r  ZDH_generate_parameters_exr!   )r|   	generatorr   Zdh_param_cdatar   rn   rn   ro   generate_dh_parameters  s    

zBackend.generate_dh_parametersc             C   s(   | j  }| jj||}| j|dk |S )Nr   )r   ru   ZEVP_PKEY_set1_DHr   )r|   r  r   r   rn   rn   ro   _dh_cdata_to_evp_pkey  s    zBackend._dh_cdata_to_evp_pkeyc             C   s<   t |j| }| jj|}| j|dk | j|}t| ||S )Nr   )r$   Z	_dh_cdataru   ZDH_generate_keyr   r  r"   )r|   r  Zdh_key_cdatar   r   rn   rn   ro   generate_dh_private_key  s
    
zBackend.generate_dh_private_keyc             C   s   | j | j||S )N)r  r  )r|   r  r   rn   rn   ro   &generate_dh_private_key_and_parameters  s    z.Backend.generate_dh_private_key_and_parametersc             C   s@  |j j}| jj }| j|| jjk | jj|| jj}| j	|j
}| j	|j}|jd k	rf| j	|j}n| jj}| j	|j j}| j	|j}| jj||||}	| j|	dk | jj|||}	| j|	dk | jjdd}
| jj||
}	| j|	dk |
d dkr*|jdko|
d | jjA dk r*td| j|}t| ||S )Nr   zint[]r   r   z.DH private numbers did not pass safety checks.)r   r"  ru   r  r   rs   r   r   r  r   r   r  r   r#  r$  DH_set0_pqgDH_set0_keyr   Cryptography_DH_checkZDH_NOT_SUITABLE_GENERATORr   r  r"   )r|   r   r"  r  r   r  r   r  r   r   codesr   rn   rn   ro   load_dh_private_numbers  s2    



zBackend.load_dh_private_numbersc       
      C   s   | j j }| j|| jjk | jj|| j j}|j}| j|j	}| j|j
}|jd k	rd| j|j}n| jj}| j|j}| j j||||}| j|dk | j j||| jj}| j|dk | j|}	t| ||	S )Nr   )ru   r  r   rs   r   r   r  r"  r   r   r  r   r#  r  r  r  r#   )
r|   r   r  r"  r   r  r   r  r   r   rn   rn   ro   load_dh_public_numbers,  s     


zBackend.load_dh_public_numbersc             C   s   | j j }| j|| jjk | jj|| j j}| j|j}| j|j	}|j
d k	r^| j|j
}n| jj}| j j||||}| j|dk t| |S )Nr   )ru   r  r   rs   r   r   r  r   r   r  r   r  r!   )r|   r   r  r   r  r   r   rn   rn   ro   load_dh_parameter_numbersG  s    

z!Backend.load_dh_parameter_numbersc             C   s   | j j }| j|| jjk | jj|| j j}| j|}| j|}|d k	rV| j|}n| jj}| j j||||}| j|dk | jj	dd}| j j
||}| j|dk |d dkS )Nr   zint[]r   )ru   r  r   rs   r   r   r  r   r  r   r  )r|   r   r  r   r  r   r  rn   rn   ro   dh_parameters_supportedY  s    


zBackend.dh_parameters_supportedc             C   s   | j jdkS )Nr   )ru   rz   )r|   rn   rn   ro   dh_x942_serialization_supportedo  s    z'Backend.dh_x942_serialization_supportedc                sx   t  |} jjd} jj||} j|d  jjk  jj| fdd} j|dk  jj|d |d d  S )Nzunsigned char **r   c                s    j j| d S )Nr   )ru   r   )pointer)r|   rn   ro   r2  x  s    z)Backend.x509_name_bytes.<locals>.<lambda>)	r6   rs   r   ru   Zi2d_X509_NAMEr   r   r   r   )r|   r   Z	x509_nameppr   rn   )r|   ro   x509_name_bytesr  s    
zBackend.x509_name_bytesc             C   sh   t |dkrtd| j }| jj|| jj}tj|dk | jj||t |}tj|dk t	| |S )N    z%An X25519 public key is 32 bytes longr   )
r   r   r   ru   ZEVP_PKEY_set_type
NID_X25519rN  r   ZEVP_PKEY_set1_tls_encodedpointrA   )r|   r   r   r   rn   rn   ro   x25519_load_public_bytes}  s    z Backend.x25519_load_public_bytesc             C   s   t |dkrtdd}| jd<}||dd< ||dd < | j|}tjj|j| jj	}W d Q R X | j
|| jj	k | jj|| jj}| j
| jj|| jjk t| |S )Nr  z&An X25519 private key is 32 bytes longs   0. 0+en" 0   r   r   )r   r   _zeroed_bytearrayr   rN  ru   rz  ri   rs   r   r   r   r   r   r   r@   )r|   r   Zpkcs8_prefixbari   r   rn   rn   ro   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}| j j|}| j|dk | jjd}| j j	||}| j|dk | j|d | jjk | jj|d | j j
}|S )Nr   zEVP_PKEY **r   )ru   ZEVP_PKEY_CTX_new_idrs   r   r   r   ZEVP_PKEY_CTX_freeZEVP_PKEY_keygen_initr   ZEVP_PKEY_keygenr   )r|   rn  Zevp_pkey_ctxr   Z	evp_ppkeyr   rn   rn   ro   _evp_pkey_keygen_gc  s    zBackend._evp_pkey_keygen_gcc             C   s   | j | jj}t| |S )N)r  ru   r  r@   )r|   r   rn   rn   ro   x25519_generate_key  s    zBackend.x25519_generate_keyc             C   s   | j jS )N)ru   Z#CRYPTOGRAPHY_OPENSSL_110_OR_GREATER)r|   rn   rn   ro   x25519_supported  s    zBackend.x25519_supportedc             C   s`   t |dkrtd| jj| jj| jj|t |}| j|| jjk | jj|| jj	}t
| |S )N8   z#An X448 public key is 56 bytes long)r   r   ru   EVP_PKEY_new_raw_public_keyNID_X448rs   r   r   r   r   rC   )r|   r   r   rn   rn   ro   x448_load_public_bytes  s    zBackend.x448_load_public_bytesc             C   sl   t |dkrtd| jj|}| jj| jj| jj|t |}| j|| jjk | jj	|| jj
}t| |S )Nr  z$An X448 private key is 56 bytes long)r   r   rs   r   ru   EVP_PKEY_new_raw_private_keyr  r   r   r   r   rB   )r|   r   r   r   rn   rn   ro   x448_load_private_bytes  s    zBackend.x448_load_private_bytesc             C   s   | j | jj}t| |S )N)r  ru   r  rB   )r|   r   rn   rn   ro   x448_generate_key  s    zBackend.x448_generate_keyc             C   s
   | j j S )N)ru   "CRYPTOGRAPHY_OPENSSL_LESS_THAN_111)r|   rn   rn   ro   x448_supported  s    zBackend.x448_supportedc             C   s
   | j j S )N)ru   #CRYPTOGRAPHY_OPENSSL_LESS_THAN_111B)r|   rn   rn   ro   ed25519_supported  s    zBackend.ed25519_supportedc             C   sn   t jd| t|tjkr"td| jj| jj| j	j
|t|}| j|| j	j
k | j	j|| jj}t| |S )Nr   z&An Ed25519 public key is 32 bytes long)r   _check_bytesr   rM   _ED25519_KEY_SIZEr   ru   r  NID_ED25519rs   r   r   r   r   r+   )r|   r   r   rn   rn   ro   ed25519_load_public_bytes  s    z!Backend.ed25519_load_public_bytesc             C   sz   t |tjkrtdtjd| | jj|}| jj	| jj
| jj|t |}| j|| jjk | jj|| jj}t| |S )Nz'An Ed25519 private key is 32 bytes longr   )r   rM   r  r   r   r  rs   r   ru   r  r   r   r   r   r   r*   )r|   r   r   r   rn   rn   ro   ed25519_load_private_bytes  s    z"Backend.ed25519_load_private_bytesc             C   s   | j | jj}t| |S )N)r  ru   r   r*   )r|   r   rn   rn   ro   ed25519_generate_key  s    zBackend.ed25519_generate_keyc             C   s
   | j j S )N)ru   r  )r|   rn   rn   ro   ed448_supported	  s    zBackend.ed448_supportedc             C   sl   t jd| t|tkr td| jj| jj| jj	|t|}| j
|| jj	k | jj|| jj}t| |S )Nr   z$An Ed448 public key is 57 bytes long)r   r  r   r,   r   ru   r  	NID_ED448rs   r   r   r   r   r.   )r|   r   r   rn   rn   ro   ed448_load_public_bytes	  s    zBackend.ed448_load_public_bytesc             C   sx   t jd| t|tkr td| jj|}| jj| jj	| jj
|t|}| j|| jj
k | jj|| jj}t| |S )Nr   z%An Ed448 private key is 57 bytes long)r   r  r   r,   r   rs   r   ru   r  r  r   r   r   r   r-   )r|   r   r   r   rn   rn   ro   ed448_load_private_bytes	  s    z Backend.ed448_load_private_bytesc             C   s   | j | jj}t| |S )N)r  ru   r  r-   )r|   r   rn   rn   ro   ed448_generate_key!	  s    zBackend.ed448_generate_keyc             C   s   | j jd|}| j j|}| jj|t||t||||tj||
}	|	dkr| j }
| jj	s| j
|
d j| jj| jjp|
d j| jj| jj d| | d }tdj|| j j|d d  S )	Nzunsigned char[]r   r      i   r   zJNot enough memory to derive key. These parameters require {} MB of memory.i   )rs   r   r   ru   ZEVP_PBE_scryptr   re   Z
_MEM_LIMITr   r  r   rF  r  ZERR_R_MALLOC_FAILUREZEVP_R_MEMORY_LIMIT_EXCEEDEDMemoryErrorr   r   )r|   r   r   r   r   rr   r   r   r   rL  Z
min_memoryrn   rn   ro   derive_scrypt%	  s(    
zBackend.derive_scryptc             C   s   t j|}| jj|| jjkS )N)r   Z_aead_cipher_nameru   r  rs   r   )r|   r   cipher_namern   rn   ro   aead_cipher_supportedD	  s    
zBackend.aead_cipher_supportedc             c   s&   t |}z
|V  W d| j|| X dS )z
        This method creates a bytearray, which we copy data into (hopefully
        also from a mutable buffer that can be dynamically erased!), and then
        zero when we're done.
        N)	bytearray
_zero_data)r|   r   r  rn   rn   ro   r  J	  s    
zBackend._zeroed_bytearrayc             C   s   xt |D ]}d||< q
W d S )Nr   )r   )r|   r   r   rc  rn   rn   ro   r  W	  s    zBackend._zero_datac             c   sf   |dkr| j jV  nNt|}| j jd|d }| j j||| z
|V  W d| j| j jd|| X dS )a  
        This method takes bytes, which can be a bytestring or a mutable
        buffer like a bytearray, and yields a null-terminated version of that
        data. This is required because PKCS12_parse doesn't take a length with
        its password char * and ffi.from_buffer doesn't provide null
        termination. So, to support zeroing the data via bytearray we
        need to build this ridiculous construct that copies the memory, but
        zeroes it after use.
        Nzchar[]r   z	uint8_t *)rs   r   r   r   memmover  cast)r|   r   Zdata_lenr   rn   rn   ro   _zeroed_null_terminated_buf^	  s    
z#Backend._zeroed_null_terminated_bufc             C   s  |d k	rt jd| | j|}| jj|j| jj}|| jjkrN| j  t	d| jj
|| jj}| jjd}| jjd}| jjd}| j|}| jj|||||}	W d Q R X |	dkr| j  t	dd }
d }g }|d | jjkr| jj
|d | jj}| j|}|d | jjkr6| jj
|d | jj}t| |}
|d | jjkr| jj
|d | jj}| jj|d }xTt|D ]H}| jj||}| jj
|| jj}| j|| jjk |jt| | qxW ||
|fS )Nrq  z!Could not deserialize PKCS12 datazEVP_PKEY **zX509 **zCryptography_STACK_OF_X509 **r   zInvalid password or PKCS12 data)r   r  r   ru   Zd2i_PKCS12_biori   rs   r   r   r   r   ZPKCS12_freer   r  ZPKCS12_parser   r  rO  rD   Zsk_X509_freeZsk_X509_numr   Zsk_X509_valuer   r{   )r|   r   rq  ri   Zp12Zevp_pkey_ptrZx509_ptrZsk_x509_ptrZpassword_bufr   r  r   Zadditional_certificatesr   r   Zsk_x509r   rc  rn   rn   ro   %load_key_and_certificates_from_pkcs12u	  sF    


z-Backend.load_key_and_certificates_from_pkcs12c             C   s   | j jdkS )Nr   )ru   ZCryptography_HAS_POLY1305)r|   rn   rn   ro   poly1305_supported	  s    zBackend.poly1305_supportedc             C   s*   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   rn   rn   ro   create_poly1305_ctx	  s    zBackend.create_poly1305_ctx)N)N)rk   rl   rm   __doc__r   r}   r   r   
contextlibr   r   rx   r   r   r   r   r   r   r   r   r   r   r   rw   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'  r(  r  r)  r*  r-  r.  rM  rU  r=  rR  rZ  r`  rD  ri  rb  ro  rr  rv  rw  ry  rx  r{  r|  r}  r~  r  r  r  r  rp  rt  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  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  r  r  r  r  r  r  r  rn   rn   rn   ro   rp   f   s  	="++	UYQ"


1-	"

P_=5
0".rp   c               @   s   e Zd Zdd Zdd ZdS )r   c             C   s
   || _ d S )N)_fmt)r|   fmtrn   rn   ro   r}   	  s    zGetCipherByName.__init__c             C   s&   | j j||dj }|jj|jdS )N)r   r   r   )r  r   lowerru   r  r   )r|   rN  r   r   r  rn   rn   ro   __call__	  s    zGetCipherByName.__call__N)rk   rl   rm   r}   r  rn   rn   rn   ro   r   	  s   r   c             C   s"   dj |jd }| jj|jdS )Nz
aes-{}-xtsr   r   )r   r   ru   r  r   )rN  r   r   r  rn   rn   ro   r   	  s    r   )
__future__r   r   r   r  collectionsr  r   r   r   Z	six.movesr   Zcryptographyr   r   Zcryptography.exceptionsr	   r
   Zcryptography.hazmat._derr   r   r   r   r   Z'cryptography.hazmat.backends.interfacesr   r   r   r   r   r   r   r   r   r   r   r   r   Z$cryptography.hazmat.backends.opensslr   Z,cryptography.hazmat.backends.openssl.ciphersr   Z)cryptography.hazmat.backends.openssl.cmacr   Z0cryptography.hazmat.backends.openssl.decode_asn1r    Z'cryptography.hazmat.backends.openssl.dhr!   r"   r#   r$   Z(cryptography.hazmat.backends.openssl.dsar%   r&   r'   Z'cryptography.hazmat.backends.openssl.ecr(   r)   Z,cryptography.hazmat.backends.openssl.ed25519r*   r+   Z*cryptography.hazmat.backends.openssl.ed448r,   r-   r.   Z0cryptography.hazmat.backends.openssl.encode_asn1r/   r0   r1   r2   r3   r4   r5   r6   r7   Z+cryptography.hazmat.backends.openssl.hashesr8   Z)cryptography.hazmat.backends.openssl.hmacr9   Z)cryptography.hazmat.backends.openssl.ocspr:   r;   Z-cryptography.hazmat.backends.openssl.poly1305r<   r=   Z(cryptography.hazmat.backends.openssl.rsar>   r?   Z+cryptography.hazmat.backends.openssl.x25519r@   rA   Z)cryptography.hazmat.backends.openssl.x448rB   rC   Z)cryptography.hazmat.backends.openssl.x509rD   rE   rF   rG   Z$cryptography.hazmat.bindings.opensslrH   Zcryptography.hazmat.primitivesrI   rJ   Z)cryptography.hazmat.primitives.asymmetricrK   rL   rM   rN   rO   Z1cryptography.hazmat.primitives.asymmetric.paddingrP   rQ   rR   rS   Z1cryptography.hazmat.primitives.ciphers.algorithmsrT   rU   rV   rW   rX   rY   rZ   r[   r\   Z,cryptography.hazmat.primitives.ciphers.modesr]   r^   r_   r`   ra   rb   rc   rd   Z"cryptography.hazmat.primitives.kdfre   Z,cryptography.hazmat.primitives.serializationrf   Zcryptography.x509rg   
namedtuplerh   objectrj   Zregister_interfaceZregister_interface_ifrq   rt   ZCryptography_HAS_SCRYPTrp   r   r   rN  rn   rn   rn   ro   <module>   s   <,,(                   K	