<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
3
ꅭh                @   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-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 d dl6m7Z7m8Z8m9Z9m:Z: d dl;m<Z<m=Z=m>Z> d dl?m@Z@mAZA d dlBmCZCmDZD d dlEmFZFmGZGmHZH d dlImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZR d dlSmTZT d dlUmVZV d dlWmXZXmYZY d dlZm[Z[m\Z\ d dl]m^Z^m_Z_ d dl`maZambZb d dlcmdZdmeZe d dlfmgZgmhZhmiZimjZj d dlkmlZl d dlmmnZnmoZo d dlpmqZqmrZrmsZsmtZtmuZu d dlvmwZwmxZxmyZymzZz d dl{m|Z|m}Z}m~Z~mZmZmZmZmZmZ d d lmZmZmZmZmZmZmZmZ d d!lmZ d d"lmZmZ 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jelj 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_CRL_EXTENSION_HANDLERS_EXTENSION_HANDLERS_BASE_EXTENSION_HANDLERS_SCT"_OCSP_BASICRESP_EXTENSION_HANDLERS_OCSP_REQ_EXTENSION_HANDLERS'_OCSP_SINGLERESP_EXTENSION_HANDLERS_SCT_REVOKED_EXTENSION_HANDLERS_X509ExtensionParser)_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)pkcs7ssh)ocsp
_MemoryBIObioZchar_ptrc               @   s   e Zd ZdS )_RC2N)__name__
__module____qualname__ rw   rw   /usr/lib64/python3.6/backend.pyrs      s   rs   c               @   s|  e Zd ZdZdZddddddhZeefZe	j
e	je	je	je	je	je	je	je	je	je	je	je	jfZd	Zd
Zdd	> Zd	Zde> Zdd Zd-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/d0 Z0d1d2 Z1d3d4 Z2d5d6 Z3d7d8 Z4d9d: Z5d;d< Z6d=d> Z7d?d@ Z8dAdB Z9d.dCdDZ:dEdF Z;dGdH Z<dIdJ Z=dKdL Z>dMdN Z?dOdP Z@dQdR ZAdSdT ZBdUdV ZCdWdX ZDdYdZ ZEd[d\ ZFd]d^ ZGd_d` ZHdadb ZIdcdd ZJdedf ZKdgdh ZLdidj ZMdkdl ZNdmdn ZOdodp ZPdqdr ZQdsdt ZRdudv ZSdwdx ZTdydz ZUd{d| ZVd}d~ ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd Zadd Zbdd Zcdd 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~e"dd΄ ZddЄ Zdd҄ ZddԄ Zddք Zdd؄ Zddڄ Zdd܄ Zddބ Zdd Zdd Zdd Zdd Zdd Zdd Zd/ddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd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 Ze!j"dd Zdd Ze!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, ZdS (0  Backendz)
    OpenSSL API binding interfaces.
    Zopenssls   aes-128-ccms   aes-192-ccms   aes-256-ccms   aes-128-gcms   aes-192-gcms   aes-256-gcmi   i     c             C   s   t j | _| jj| _| jj| _| j | _i | _	| j
  | j  | j  | jrb| jjrbtjdt n| j  | jjg| _| jjr| jj| jj d S )Nz<OpenSSL FIPS mode is enabled. Can't enable DRBG fork safety.)rP   BindingZ_bindingZffi_ffilib_lib_is_fips_enabled_fips_enabled_cipher_registry_register_default_ciphers_register_x509_ext_parsers_register_x509_encoders"CRYPTOGRAPHY_NEEDS_OSRANDOM_ENGINEwarningswarnUserWarningactivate_osrandom_engineZEVP_PKEY_DH	_dh_typesCryptography_HAS_EVP_PKEY_DHXappendZEVP_PKEY_DHX)selfrw   rw   rx   __init__   s     



zBackend.__init__Nc             C   s   t j| j||dS )N)errors)rP   Z_openssl_assertr~   )r   okr   rw   rw   rx   openssl_assert   s    zBackend.openssl_assertc             C   s2   t | jddd }| }|dkr*| jj  t|S )NZ	FIPS_modec               S   s   dS )Nr   rw   rw   rw   rw   rx   <lambda>   s    z*Backend._is_fips_enabled.<locals>.<lambda>r   )getattrr~   ZERR_clear_errorbool)r   Z	fips_modemoderw   rw   rx   r      s
    
zBackend._is_fips_enabledc             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 )Nrz   )	r~   r   ZENGINE_get_default_RANDr|   r   ZENGINE_unregister_RANDRAND_set_rand_methodr   ENGINE_finish)r   eresrw   rw   rx   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 )Nrz   )	r~   ZENGINE_by_idZCryptography_osrandom_engine_idr   r|   r   ZENGINE_initZENGINE_freer   )r   r   r   rw   rw   rx   _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 )Nrz   )	r~   r   r   r   ZENGINE_set_default_RANDr   r   r|   r   )r   r   r   rw   rw   rx   r     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)
r|   newr   r~   ZENGINE_ctrl_cmdlenr   r   stringdecode)r   bufr   r   rw   rw   rx   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.1.1d  10 Sep 2019
        r   )r|   r   r~   ZOpenSSL_versionZOPENSSL_VERSIONr   )r   rw   rw   rx   openssl_version_text4  s    zBackend.openssl_version_textc             C   s
   | j j S )N)r~   ZOpenSSL_version_num)r   rw   rw   rx   openssl_version_number?  s    zBackend.openssl_version_numberc             C   s   t | ||S )N)rA   )r   key	algorithmrw   rw   rx   create_hmac_ctxB  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 )NZblake2bZblake2sz{}{}   r   )nameformatZdigest_sizeencoder~   ZEVP_get_digestbyname)r   r   Zalgevp_mdrw   rw   rx   _evp_md_from_algorithmE  s    zBackend._evp_md_from_algorithmc             C   s    | j |}| j|| jjk |S )N)r   r   r|   r   )r   r   r   rw   rw   rx   _evp_md_non_null_from_algorithmP  s    
z'Backend._evp_md_non_null_from_algorithmc             C   s.   | j rt|| j rdS | j|}|| jjkS )NF)r   
isinstance_fips_hashesr   r|   r   )r   r   r   rw   rw   rx   hash_supportedU  s    
zBackend.hash_supportedc             C   s
   | j |S )N)r   )r   r   rw   rw   rx   hmac_supported\  s    zBackend.hmac_supportedc             C   s
   t | |S )N)r@   )r   r   rw   rw   rx   create_hash_ctx_  s    zBackend.create_hash_ctxc             C   s`   | j rt|| j rdS y| jt|t|f }W n tk
rF   dS X || ||}| jj|kS )NF)r   r   _fips_ciphersr   typeKeyErrorr|   r   )r   cipherr   adapter
evp_cipherrw   rw   rx   cipher_supportedb  s    zBackend.cipher_supportedc             C   s0   ||f| j krtdj|||| j ||f< d S )Nz"Duplicate registration for: {} {}.)r   
ValueErrorr   )r   
cipher_clsmode_clsr   rw   rw   rx   register_cipher_adapterl  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)re   rh   ri   rk   rf   rg   rj   r   r\   GetCipherByNamer`   rd   r^   rc   	itertoolsproductr_   rb   r]   r   rs   ra   rl   _get_xts_cipher)r   r   r   rw   rw   rx   r   u  sB    z!Backend._register_default_ciphersc             C   s   t j }tj }| jjr,|jt |jt t| | jj	| jj
|d| _t| | jj| jj|d| _t| | jj| jjtd| _t| | jj| jjtd| _t| | jj| jjtd| _t| | jj| jjtd| _t| | jj| jj|d| _ d S )N)Z	ext_countZget_exthandlers)!r"   copyr'   r~   ZCryptography_HAS_SCTupdater#   r&   r(   ZX509_get_ext_countZX509_get_extZ_certificate_extension_parserZsk_X509_EXTENSION_numZsk_X509_EXTENSION_valueZ_csr_extension_parserZX509_REVOKED_get_ext_countZX509_REVOKED_get_extZ_revoked_cert_extension_parserZX509_CRL_get_ext_countZX509_CRL_get_extr!   Z_crl_extension_parserZOCSP_REQUEST_get_ext_countZOCSP_REQUEST_get_extr%   Z_ocsp_req_ext_parserZOCSP_BASICRESP_get_ext_countZOCSP_BASICRESP_get_extr$   Z_ocsp_basicresp_ext_parserZOCSP_SINGLERESP_get_ext_countZOCSP_SINGLERESP_get_extZ_ocsp_singleresp_ext_parser)r   Zext_handlersZsingleresp_handlersrw   rw   rx   r     sP    







z"Backend._register_x509_ext_parsersc             C   s6   t j | _tj | _tj | _tj | _t	j | _
d S )N)r9   r   _extension_encode_handlersr8   _crl_extension_encode_handlersr7   $_crl_entry_extension_encode_handlersr;   '_ocsp_request_extension_encode_handlersr:   )_ocsp_basicresp_extension_encode_handlers)r   rw   rw   rx   r     s
    



zBackend._register_x509_encodersc             C   s   t | ||t jS )N)r   Z_ENCRYPT)r   r   r   rw   rw   rx   create_symmetric_encryption_ctx  s    z'Backend.create_symmetric_encryption_ctxc             C   s   t | ||t jS )N)r   Z_DECRYPT)r   r   r   rw   rw   rx   create_symmetric_decryption_ctx  s    z'Backend.create_symmetric_decryption_ctxc             C   s
   | j |S )N)r   )r   r   rw   rw   rx   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[]rz   )	r|   r   r   from_bufferr~   ZPKCS5_PBKDF2_HMACr   r   buffer)
r   r   lengthsaltZ
iterationskey_materialr   r   key_material_ptrr   rw   rw   rx   derive_pbkdf2_hmac  s    
zBackend.derive_pbkdf2_hmacc             C   s   t j| jS )N)rP   _consume_errorsr~   )r   rw   rw   rx   r     s    zBackend._consume_errorsc             C   s   t j| jS )N)rP   _consume_errors_with_textr~   )r   rw   rw   rx   r     s    z!Backend._consume_errors_with_textc             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   )r|   r   AssertionErrorsixPY2r~   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_cdataZhex_strrw   rw   rx   
_bn_to_int  s    zBackend._bn_to_intc             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       @rz   r   L   r   z	BIGNUM **r   )r|   r   r   r   r   to_bytesr   
bit_lengthr~   Z	BN_bin2bnr   r   hexrstripr   r   Z	BN_hex2bn)r   numr   ZbinaryZbn_ptrZhex_numr   rw   rw   rx   
_int_to_bn  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 )Nrz   )rW   Z_verify_rsa_parametersr~   RSA_newr   r|   r   gcRSA_freer   BN_freeZRSA_generate_key_ex_rsa_cdata_to_evp_pkeyrF   )r   public_exponentkey_size	rsa_cdatar   r   evp_pkeyrw   rw   rx   generate_rsa_private_key=  s    


z Backend.generate_rsa_private_keyc             C   s   |dko|d@ dko|dkS )N   rz   r   i   rw   )r   r   r   rw   rw   rx   !generate_rsa_parameters_supportedO  s    z)Backend.generate_rsa_parameters_supportedc          	   C   s2  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|}t| ||S )Nrz   )rW   Z_check_private_key_componentspqddmp1dmq1iqmppublic_numbersr   nr~   r   r   r|   r   r   r   r   ZRSA_set0_factorsRSA_set0_keyZRSA_set0_crt_paramsr   rF   )r   numbersr   r   r   r   r   r   r   r   r   r   r   rw   rw   rx   load_rsa_private_numbersV  s8    


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 )Nrz   )rW   Z_check_public_key_componentsr   r   r~   r   r   r|   r   r   r   r   r   r   rG   )r   r   r   r   r   r   r   rw   rw   rx   load_rsa_public_numbersv  s    

zBackend.load_rsa_public_numbersc             C   s2   | j j }| j|| jjk | jj|| j j}|S )N)r~   ZEVP_PKEY_newr   r|   r   r   EVP_PKEY_free)r   r   rw   rw   rx   _create_evp_pkey_gc  s    
zBackend._create_evp_pkey_gcc             C   s(   | j  }| jj||}| j|dk |S )Nrz   )r  r~   ZEVP_PKEY_set1_RSAr   )r   r   r   r   rw   rw   rx   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.
        )
r|   r   r~   ZBIO_new_mem_bufr   r   r   rq   r   BIO_free)r   datadata_ptrrr   rw   rw   rx   _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.
        )r~   Z	BIO_s_memr   r|   r   ZBIO_newr   r  )r   Z
bio_methodrr   rw   rw   rx   _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)r|   r   r~   ZBIO_get_mem_datar   r   r   )r   rr   r   Zbuf_lenbio_datarw   rw   rx   _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.)r~   EVP_PKEY_idEVP_PKEY_RSAEVP_PKEY_get1_RSAr   r|   r   r   r   rF   EVP_PKEY_DSAEVP_PKEY_get1_DSADSA_freer.   EVP_PKEY_ECEVP_PKEY_get1_EC_KEYEC_KEY_freer0   r   EVP_PKEY_get1_DHDH_freer*   r   r2   rJ   rH   r5   r	   )r   r   key_typer   	dsa_cdataec_cdatadh_cdatarw   rw   rx   _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.)r~   r  r  r  r   r|   r   r   r   rG   r  r  r  r/   r  r  r  r1   r   r  r  r+   r   r3   rK   rI   r6   r	   )r   r   r  r   r  r  r  rw   rw   rx   _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)	r~   ZCryptography_HAS_RSA_OAEP_MDr   rQ   SHA1SHA224SHA256SHA384SHA512)r   r   rw   rw   rx   _oaep_hash_supported  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   rz   F)r   rZ   r[   Z_mgfrX   r   
_algorithmrY   r&  Z_labelr   r~   ZCryptography_HAS_RSA_OAEP_LABEL)r   Zpaddingrw   rw   rx   rsa_padding_supported  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            z0Key size must be 1024, 2048, 3072, or 4096 bits.r   rz   )r)  r*  r+  r,  )
r   r~   DSA_newr   r|   r   r   r  ZDSA_generate_parameters_exr-   )r   r   ctxr   rw   rw   rx   generate_dsa_parameters(  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)r~   ZDSAparams_dupZ
_dsa_cdatar   r|   r   r   r  ZDSA_generate_key_dsa_cdata_to_evp_pkeyr.   )r   
parametersr.  r   rw   rw   rx   generate_dsa_private_key@  s    
z Backend.generate_dsa_private_keyc             C   s   | j |}| j|S )N)r/  r2  )r   r   r1  rw   rw   rx   'generate_dsa_private_key_and_parametersI  s    
z/Backend.generate_dsa_private_key_and_parametersc             C   sB   | j j||||}| j|dk | j j|||}| j|dk d S )Nrz   )r~   DSA_set0_pqgr   ZDSA_set0_key)r   r  r   r   gpub_keypriv_keyr   rw   rw   rx   _dsa_cdata_set_valuesM  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)rS   Z_check_dsa_private_numbersr   parameter_numbersr~   r-  r   r|   r   r   r  r   r   r   r5  yxr8  r0  r.   )
r   r   r9  r  r   r   r5  r6  r7  r   rw   rw   rx   load_dsa_private_numbersS  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)rS   _check_dsa_parametersr9  r~   r-  r   r|   r   r   r  r   r   r   r5  r:  r8  r0  r/   )	r   r   r  r   r   r5  r6  r7  r   rw   rw   rx   load_dsa_public_numbersf  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 )Nrz   )rS   r=  r~   r-  r   r|   r   r   r  r   r   r   r5  r4  r-   )r   r   r  r   r   r5  r   rw   rw   rx   load_dsa_parameter_numbersw  s    

z"Backend.load_dsa_parameter_numbersc             C   s(   | j  }| jj||}| j|dk |S )Nrz   )r  r~   ZEVP_PKEY_set1_DSAr   )r   r  r   r   rw   rw   rx   r0    s    zBackend._dsa_cdata_to_evp_pkeyc             C   s
   | j |S )N)r   )r   r   rw   rw   rx   dsa_hash_supported  s    zBackend.dsa_hash_supportedc             C   s   dS )NTrw   )r   r   r   r5  rw   rw   rx   dsa_parameters_supported  s    z Backend.dsa_parameters_supportedc             C   s   | j |td|j S )N    )r   re   Z
block_size)r   r   rw   rw   rx   cmac_algorithm_supported  s    z Backend.cmac_algorithm_supportedc             C   s
   t | |S )N)r   )r   r   rw   rw   rx   create_cmac_ctx  s    zBackend.create_cmac_ctxc             C   s   t |tjtjfr$|d k	r|tdnXt |tjtj	t
jfsDtdn8t |tjsZtdn"t |tjr|t |tj r|tdd S )Nz8algorithm must be None when signing via ed25519 or ed448z;Key must be an rsa, dsa, ec, ed25519, or ed448 private key.z.Algorithm must be a registered hash algorithm.z2MD5 hash algorithm is only supported with RSA keys)r   rU   Ed25519PrivateKeyrV   Ed448PrivateKeyr   rW   ZRSAPrivateKeyrS   ZDSAPrivateKeyrT   ZEllipticCurvePrivateKey	TypeErrorrQ   ZHashAlgorithmZMD5)r   private_keyr   rw   rw   rx   _x509_check_signature_params  s     
z$Backend._x509_check_signature_paramsc                s  t |tjstd j||  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 j| jjdd  jj||} j|dk xN|jD ]D\}	}
t |	j} jj ||tj!j"j#j|
t$|
} j|dk q8W  jj%||j|}|dkr j& }t'd|t( |S )	NzBuilder type mismatch.rz   c                s    j j|  jj j jdS )NX509_EXTENSION_free)r~   Zsk_X509_EXTENSION_pop_freer|   	addressof_original_lib)r;  )r   rw   rx   r     s   z)Backend.create_x509_csr.<locals>.<lambda>F)
extensionsr   x509_objadd_funcr   r   zSigning failed))r   r   Z CertificateSigningRequestBuilderrG  rI  _evp_md_x509_null_if_eddsar~   ZX509_REQ_newr   r|   r   r   X509_REQ_freeZX509_REQ_set_versionZVersionZv1valueZX509_REQ_set_subject_namer>   _subject_name
public_keyZX509_REQ_set_pubkey	_evp_pkeyZsk_X509_EXTENSION_new_null_create_x509_extensions_extensionsr   Zsk_X509_EXTENSION_insertZX509_REQ_add_extensions_attributesr?   dotted_stringZX509_REQ_add1_attr_by_OBJr   Z	_ASN1TypeZ
UTF8Stringr   ZX509_REQ_signr   r   rN   )r   builderrH  r   r   x509_reqr   rT  Zsk_extensionZattr_oidZattr_valobjr   rw   )r   rx   create_x509_csr  sT    

	



zBackend.create_x509_csrc       	      C   sx  t |tjstd| j|| | j||}| jj }| jj	|| 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| j|| jj dd | jj!|t| |j"}| j|dk | jj#||j|}|dkrn| j$ }t%d|t&| |S )NzBuilder type mismatch.rz   T)rM  r   rN  rO  r   r   zSigning failed)'r   r   ZCertificateBuilderrG  rI  rP  r~   ZX509_newr|   r   	X509_freeZX509_set_versionZ_versionrR  r   ZX509_set_subject_namer>   rS  ZX509_set_pubkeyZ_public_keyrU  r<   _serial_numberZX509_set_serialNumber_set_asn1_timeZX509_getm_notBeforeZ_not_valid_beforeZX509_getm_notAfterZ_not_valid_afterrV  rW  r   ZX509_add_extZX509_set_issuer_name_issuer_nameZ	X509_signr   r   rL   )	r   rZ  rH  r   r   Z	x509_certr   serial_numberr   rw   rw   rx   create_x509_certificate  sF    


zBackend.create_x509_certificatec             C   s(   t |tjtjfr| jjS | j|S d S )N)r   rU   rE  rV   rF  r|   r   r   )r   rH  r   rw   rw   rx   rP  ;  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%SZrz   )ZyearZstrftimer   r~   ZASN1_TIME_set_stringr   )r   	asn1_timetimeZasn1_strr   rw   rw   rx   r`  D  s
    
zBackend._set_asn1_timec             C   s>   | j j }| j|| jjk | jj|| j j}| j|| |S )N)r~   ZASN1_TIME_newr   r|   r   r   ZASN1_TIME_freer`  )r   re  rd  rw   rw   rx   _create_asn1_timeL  s
    
zBackend._create_asn1_timec             C   sx  t |tjstd| j|| | j||}| jj }| jj	|| 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| j|| jjdd xJ|jD ]@}	| jj|	j}
| j|
| jjk | jj||
}| j|dk qW | jj||j|}|dkrn| j  }t!d|t"| |S )NzBuilder type mismatch.rz   T)rM  r   rN  rO  r   r   zSigning failed)#r   r   Z CertificateRevocationListBuilderrG  rI  rP  r~   ZX509_CRL_newr|   r   X509_CRL_freeZX509_CRL_set_versionr   ZX509_CRL_set_issuer_namer>   ra  rf  Z_last_updateZX509_CRL_set_lastUpdate_next_updateZX509_CRL_set_nextUpdaterV  rW  r   ZX509_CRL_add_extZ_revoked_certificatesZX509_REVOKED_dupZ_x509_revokedr   ZX509_CRL_add0_revokedZX509_CRL_signrU  r   r   rM   )r   rZ  rH  r   r   x509_crlr   Zlast_updatenext_updateZrevoked_certZrevokedr   rw   rw   rx   create_x509_crlS  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 )Nrz   )	enumerate_create_x509_extensionr   r|   r   r   r~   rJ  )
r   rM  r   rN  rO  r   i	extensionZx509_extensionr   rw   rw   rx   rV    s    zBackend._create_x509_extensionsc             C   s.   t | |jj}| jj| jj||jr&dnd|S )Nrz   r   )r?   oidrY  r~   ZX509_EXTENSION_create_by_OBJr|   r   critical)r   ro  rR  r\  rw   rw   rx   _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}| j|| jjk | jj||jr
dnd|S d S )Nc             S   s   g | ]}t tt|jqS rw   )r   r   r   rR  ).0r;  rw   rw   rx   
<listcomp>  s   z2Backend._create_x509_extension.<locals>.<listcomp>zExtension not supported: {}r   rz   r   )r   rR  r   ZUnrecognizedExtensionr=   rr  Z
TLSFeaturer   r   ZPrecertPoisonr   rp  r   NotImplementedErrorr   r~   ZOBJ_txt2nidrY  r   r   	NID_undefZX509V3_EXT_i2drq  )r   r   ro  rR  Zasn1r   Z
ext_structnidrw   rw   rx   rm    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| j|| jjdd t| d |S )NzBuilder type mismatch.rz   T)rM  r   rN  rO  r   )r   r   ZRevokedCertificateBuilderrG  r~   ZX509_REVOKED_newr   r|   r   r   ZX509_REVOKED_freer<   r_  ZX509_REVOKED_set_serialNumberrf  Z_revocation_dateZX509_REVOKED_set_revocationDaterV  rW  r   ZX509_REVOKED_add_extrO   )r   rZ  Zx509_revokedrb  r   Zrev_daterw   rw   rx   create_x509_revoked_certificate  s&    
z'Backend.create_x509_revoked_certificatec             C   s   | j | jj| j||S )N)	_load_keyr~   ZPEM_read_bio_PrivateKeyr  )r   r  passwordrw   rw   rx   load_pem_private_key  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 )Nrz   )r  r~   ZPEM_read_bio_PUBKEYrr   r|   r   r   r  r   r   	BIO_resetr   ZPEM_read_bio_RSAPublicKeyr   r   rG   _handle_key_loading_error)r   r  mem_bior   r   r   rw   rw   rx   load_pem_public_key  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  r~   ZPEM_read_bio_DHparamsrr   r|   r   r   r  r)   r}  )r   r  r~  r  rw   rw   rx   load_pem_parameters  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  ry  r~   Zd2i_PKCS8PrivateKey_bio)r   r  rz  r
  r   rw   rw   rx   load_der_private_key  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.)	r~   d2i_PrivateKey_biorr   r|   r   r   r  rG  r   )r   r
  rz  r   rw   rw   rx   r    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 )Nrz   )r  r~   Zd2i_PUBKEY_biorr   r|   r   r   r  r   r   r|  r   Zd2i_RSAPublicKey_bior   r   rG   r}  )r   r  r~  r   r   r   rw   rw   rx   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 )Nrz   )r  r~   Zd2i_DHparams_biorr   r|   r   r   r  r)   r   r   r|  r   ZCryptography_d2i_DHxparams_bior}  )r   r  r~  r  r   rw   rw   rx   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  r~   ZPEM_read_bio_X509rr   r|   r   r   r   r   r^  rL   )r   r  r~  r   rw   rw   rx   load_pem_x509_certificateS  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  r~   Zd2i_X509_biorr   r|   r   r   r   r   r^  rL   )r   r  r~  r   rw   rw   rx   load_der_x509_certificateb  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  r~   ZPEM_read_bio_X509_CRLrr   r|   r   r   r   r   rg  rM   )r   r  r~  ri  rw   rw   rx   load_pem_x509_crll  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  r~   Zd2i_X509_CRL_biorr   r|   r   r   r   r   rg  rM   )r   r  r~  ri  rw   rw   rx   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  r~   ZPEM_read_bio_X509_REQrr   r|   r   r   r   r   rQ  rN   )r   r  r~  r[  rw   rw   rx   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  r~   Zd2i_X509_REQ_biorr   r|   r   r   r   r   rQ  rN   )r   r  r~  r[  rw   rw   rx   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 *rz  ZCryptography_pem_password_cbr   rz   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  r|   r   r   _check_bytesliker   rz  r   r   rr   r   rK  r~   rL  errorr   r   rG  r   r   r   maxsizer}  r   r  Zcalled)
r   Zopenssl_read_funcZconvert_funcr  rz  r~  ZuserdataZpassword_ptrr   r   rw   rw   rx   ry    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)_lib_reason_matchr~   ERR_LIB_EVPZ'EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM)rs  r  )r   rw   rx   	<genexpr>  s   z4Backend._handle_key_loading_error.<locals>.<genexpr>z!Unsupported public key algorithm.)r   r   r  r~   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anyr}   ZERR_LIB_ASN1r   )r   r   rw   )r   rx   r}    s2    






z!Backend._handle_key_loading_errorc             C   sv   y| j |}W n tk
r*   | jj}Y nX | jj|}|| jjkrP| j  dS | j|| jjk | jj	| dS d S )NFT)
_elliptic_curve_to_nidr	   r~   rv  ZEC_GROUP_new_by_curve_namer|   r   r   r   ZEC_GROUP_free)r   curve	curve_nidgrouprw   rw   rx   elliptic_curve_supported  s    z Backend.elliptic_curve_supportedc             C   s   t |tjsdS | j|S )NF)r   rT   ZECDSAr  )r   Zsignature_algorithmr  rw   rw   rx   ,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.
        rz   z#Backend object does not support {}.N)r  _ec_key_new_by_curver~   ZEC_KEY_generate_keyr   _ec_cdata_to_evp_pkeyr0   r	   r   r   r
   UNSUPPORTED_ELLIPTIC_CURVE)r   r  r  r   r   rw   rw   rx   #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 )Nrz   )r   r  r  r|   r   r   private_valuer~   BN_clear_freeEC_KEY_set_private_keyr   )_ec_key_set_public_key_affine_coordinatesr;  r:  r  r0   )r   r   Zpublicr  r  r   r   rw   rw   rx   #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  r1   )r   r   r  r   rw   rw   rx   "load_elliptic_curve_public_numbers8  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 )Nrz   z(Invalid public bytes for the given curve)r  r~   EC_KEY_get0_groupr   r|   r   EC_POINT_newr   EC_POINT_free_tmp_bn_ctxZEC_POINT_oct2pointr   r   r   EC_KEY_set_public_keyr  r1   )	r   r  Zpoint_bytesr  r  pointbn_ctxr   r   rw   rw   rx    load_elliptic_curve_public_bytesA  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 )Nrz   )r   _ec_key_determine_group_get_funcr~   r  r   r|   r   r   r  r   r  r  ZEC_POINT_mulZ
BN_CTX_getr  r  r  r0   )r   r  r  r  get_funcr  r  rR  r  r   Zbn_xZbn_yZprivater   rw   rw   rx   !derive_elliptic_curve_private_keyU  s.    




z)Backend.derive_elliptic_curve_private_keyc             C   s   | j |}| j|S )N)r  _ec_key_new_by_curve_nid)r   r  r  rw   rw   rx   r  x  s    
zBackend._ec_key_new_by_curvec             C   sB   | j j|}| j|| jjk | j j|tj j | jj|| j j	S )N)
r~   ZEC_KEY_new_by_curve_namer   r|   r   ZEC_KEY_set_asn1_flagbackendZOPENSSL_EC_NAMED_CURVEr   r  )r   r  r  rw   rw   rx   r  |  s
    z Backend._ec_key_new_by_curve_nidc             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  r~   Zd2i_OCSP_REQUEST_biorr   r|   r   r   r   r   OCSP_REQUEST_freerB   )r   r  r~  Zrequestrw   rw   rx   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  r~   Zd2i_OCSP_RESPONSE_biorr   r|   r   r   r   r   OCSP_RESPONSE_freerC   )r   r  r~  Zresponserw   rw   rx   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| j|| j jdd t| |S )NT)rM  r   rN  rO  r   )r~   ZOCSP_REQUEST_newr   r|   r   r   r  Z_requestr   OCSP_cert_to_id_x509ZOCSP_request_add0_idrV  rW  r   ZOCSP_REQUEST_add_extrB   )	r   rZ  Zocsp_reqcertZissuerr   r   certidZonereqrw   rw   rx   create_ocsp_request  s     

zBackend.create_ocsp_requestc             C   s  | 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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rb|| jjO }|j d k	rx.|j D ]$}| jj!||j}| j|dk qvW | j"|j#| j$|| jj%dd | jj&||j|j'|| jj|}|dkr| j( }t)d||S )Nrz   T)rM  r   rN  rO  r   zAError while signing. responder_cert must be signed by private_keyr  )*rI  r~   ZOCSP_BASICRESP_newr   r|   r   r   ZOCSP_BASICRESP_freer   Z	_responser'  r  Z_certr  Z_issuerZOCSP_CERTID_freeZ_revocation_reasonr    Z_revocation_timerf  rh  Z_this_updateZOCSP_basic_add1_statusZ_cert_statusrR  rP  Z_responder_idZOCSP_NOCERTSrp   ZOCSPResponderEncodingZHASHZOCSP_RESPID_KEYZ_certsZOCSP_basic_add1_certrV  rW  r   ZOCSP_BASICRESP_add_extZOCSP_basic_signrU  r   r   )r   rZ  rH  r   basicr   r  reasonZrev_timerj  Zthis_updater   Zresponder_certZresponder_encodingflagsr  r   rw   rw   rx   _create_ocsp_basic_response  s|    







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)rp   ZOCSPResponseStatusZ
SUCCESSFULr  r|   r   r~   ZOCSP_response_createrR  r   r   r  rC   )r   Zresponse_statusrZ  rH  r   r  Z	ocsp_resprw   rw   rx   create_ocsp_response  s    
zBackend.create_ocsp_responsec             C   s   | j |ot|tjS )N)r  r   rT   ZECDH)r   r   r  rw   rw   rx   +elliptic_curve_exchange_algorithm_supported  s    z3Backend.elliptic_curve_exchange_algorithm_supportedc             C   s(   | j  }| jj||}| j|dk |S )Nrz   )r  r~   ZEVP_PKEY_set1_EC_KEYr   )r   r  r   r   rw   rw   rx   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   r~   
OBJ_sn2nidr   rv  r	   r   r
   r  )r   r  Zcurve_aliasesZ
curve_namer  rw   rw   rx   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)	r~   Z
BN_CTX_newr   r|   r   r   ZBN_CTX_freeZBN_CTX_startZ
BN_CTX_end)r   r  rw   rw   rx   r  2  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   r|   r   r~   r  rv  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  methodrw  r  rw   rw   rx   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.rz   zInvalid EC key.)r   r|   r   r   r~   r   Z(EC_KEY_set_public_key_affine_coordinatesr   )r   r.  r;  r:  r   rw   rw   rx   r  Y  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s<tdt |tjrNd}n0t |tjrv|j}t	|dkr~t
dnt
d|tjjkr|tjjkr| jj}n|tjjkr| jj}nt
d| j|||S |tjjkr| jrt |tj rt
d	| jj|}	|tjjkrn|	| jjkr(| jj}n8|	| jjkr@| jj}n |	| jjkrX| jj}nt
d
| j|||S |tjjkr|rt
d|	| jjkr| jj}n8|	| jjkr| jj}n |	| jjkr| jj}nt
d
| j||S t
d|tjjkr|tjjkrt j!||S t
dt
dd S )Nz/encoding must be an item from the Encoding enumz2format must be an item from the PrivateFormat enumzBEncryption algorithm must be a KeySerializationEncryption instance    i  zBPasswords longer than 1023 bytes are not supported by this backendzUnsupported encryption typezUnsupported encoding for PKCS8zCEncrypted traditional OpenSSL format is not supported in FIPS mode.z+Unsupported key type for TraditionalOpenSSLzDEncryption is not supported for DER encoded traditional OpenSSL keysz+Unsupported encoding for TraditionalOpenSSLz=OpenSSH private key format can only be used with PEM encodingzformat is invalid with this key)"r   rR   EncodingrG  ZPrivateFormatZKeySerializationEncryptionNoEncryptionBestAvailableEncryptionrz  r   r   ZPKCS8PEMr~   ZPEM_write_bio_PKCS8PrivateKeyDERZi2d_PKCS8PrivateKey_bio_private_key_bytes_via_bioZTraditionalOpenSSLr   r  r  ZPEM_write_bio_RSAPrivateKeyr  ZPEM_write_bio_DSAPrivateKeyr  ZPEM_write_bio_ECPrivateKeyZi2d_RSAPrivateKey_bioZi2d_ECPrivateKey_bioZi2d_DSAPrivateKey_bio_bio_func_outputOpenSSHro   Zserialize_ssh_private_key)
r   encodingr   encryption_algorithmr   r   cdatarz  	write_bior  rw   rw   rx   _private_key_bytesm  s~    











zBackend._private_key_bytesc             C   s<   |s| j j}n| jjd}| j||||t|| j j| j jS )Ns   aes-256-cbc)r|   r   r~   EVP_get_cipherbynamer  r   )r   r  r   rz  r   rw   rw   rx   r    s    
z"Backend._private_key_bytes_via_bioc             G   s.   | j  }||f| }| j|dk | j|S )Nrz   )r	  r   r  )r   r  argsrr   r   rw   rw   rx   r    s    zBackend._bio_func_outputc             C   s  t |tjstdt |tjs(td|tjjkrt|tjjkrJ| jj}n|tjj	kr`| jj
}ntd| j||S |tjjkr| jj|}|| jjkrtd|tjjkr| jj}n|tjj	kr| jj}ntd| j||S |tjjkr|tjjkrtj|S tdtdd S )Nz/encoding must be an item from the Encoding enumz1format must be an item from the PublicFormat enumz8SubjectPublicKeyInfo works only with PEM or DER encodingz+PKCS1 format is supported only for RSA keysz)PKCS1 works only with PEM or DER encodingz1OpenSSH format must be used with OpenSSH encodingzformat is invalid with this key)r   rR   r  rG  ZPublicFormatZSubjectPublicKeyInfor  r~   ZPEM_write_bio_PUBKEYr  Zi2d_PUBKEY_bior   r  ZPKCS1r  r  ZPEM_write_bio_RSAPublicKeyZi2d_RSAPublicKey_bior  ro   Zserialize_ssh_public_key)r   r  r   r   r   r  r  r  rw   rw   rx   _public_key_bytes  s:    




zBackend._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 enumrz   )rR   r  r  rG  r|   r   r~   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  rr   r   rw   rw   rx   _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 5rz   )r   r  )
r   r~   DH_newr   r|   r   r   r  ZDH_generate_parameters_exr)   )r   	generatorr   Zdh_param_cdatar   rw   rw   rx   generate_dh_parameters6  s    
zBackend.generate_dh_parametersc             C   s(   | j  }| jj||}| j|dk |S )Nrz   )r  r~   ZEVP_PKEY_set1_DHr   )r   r  r   r   rw   rw   rx   _dh_cdata_to_evp_pkeyH  s    zBackend._dh_cdata_to_evp_pkeyc             C   s<   t |j| }| jj|}| j|dk | j|}t| ||S )Nrz   )r,   Z	_dh_cdatar~   ZDH_generate_keyr   r  r*   )r   r1  Zdh_key_cdatar   r   rw   rw   rx   generate_dh_private_keyN  s
    
zBackend.generate_dh_private_keyc             C   s   | j | j||S )N)r  r  )r   r  r   rw   rw   rx   &generate_dh_private_key_and_parametersX  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 )Nrz   zint[]r   r   z.DH private numbers did not pass safety checks.)r   r9  r~   r  r   r|   r   r   r  r   r   r5  r   r:  r;  DH_set0_pqgDH_set0_keyr   Cryptography_DH_checkZDH_NOT_SUITABLE_GENERATORr   r  r*   )r   r   r9  r  r   r5  r   r6  r7  r   codesr   rw   rw   rx   load_dh_private_numbers]  s0    



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 )Nrz   )r~   r  r   r|   r   r   r  r9  r   r   r5  r   r:  r  r  r  r+   )
r   r   r  r9  r   r5  r   r6  r   r   rw   rw   rx   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 )Nrz   )r~   r  r   r|   r   r   r  r   r   r5  r   r  r)   )r   r   r  r   r5  r   r   rw   rw   rx   load_dh_parameter_numbers  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 )Nrz   zint[]r   )r~   r  r   r|   r   r   r  r   r  r   r  )r   r   r5  r   r  r   r  rw   rw   rx   dh_parameters_supported  s    


zBackend.dh_parameters_supportedc             C   s   | j jdkS )Nrz   )r~   r   )r   rw   rw   rx   dh_x942_serialization_supported  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   )r~   r   )Zpointer)r   rw   rx   r     s    z)Backend.x509_name_bytes.<locals>.<lambda>)	r>   r|   r   r~   Zi2d_X509_NAMEr   r   r   r   )r   r   Z	x509_nameZppr   rw   )r   rx   x509_name_bytes  s    
zBackend.x509_name_bytesc             C   sh   t |dkrtd| j }| jj|| jj}| j|dk | jj||t |}| j|dk t| |S )N    z%An X25519 public key is 32 bytes longrz   )	r   r   r  r~   ZEVP_PKEY_set_type
NID_X25519r   ZEVP_PKEY_set1_tls_encodedpointrI   )r   r  r   r   rw   rw   rx   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|}| 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  r~   r  rr   r|   r   r   r   r  r  r  rH   )r   r  Zpkcs8_prefixbarr   r   rw   rw   rx   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 )Nrz   zEVP_PKEY **r   )r~   ZEVP_PKEY_CTX_new_idr|   r   r   r   ZEVP_PKEY_CTX_freeZEVP_PKEY_keygen_initr   ZEVP_PKEY_keygenr  )r   rw  Zevp_pkey_ctxr   Z	evp_ppkeyr   rw   rw   rx   _evp_pkey_keygen_gc	  s    zBackend._evp_pkey_keygen_gcc             C   s   | j | jj}t| |S )N)r  r~   r  rH   )r   r   rw   rw   rx   x25519_generate_key	  s    zBackend.x25519_generate_keyc             C   s   | j r
dS | jjS )NF)r   r~   Z#CRYPTOGRAPHY_OPENSSL_110_OR_GREATER)r   rw   rw   rx   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   r~   EVP_PKEY_new_raw_public_keyNID_X448r|   r   r   r   r  rK   )r   r  r   rw   rw   rx   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   r|   r   r~   EVP_PKEY_new_raw_private_keyr  r   r   r   r  rJ   )r   r  r  r   rw   rw   rx   x448_load_private_bytes.	  s    zBackend.x448_load_private_bytesc             C   s   | j | jj}t| |S )N)r  r~   r  rJ   )r   r   rw   rw   rx   x448_generate_key:	  s    zBackend.x448_generate_keyc             C   s   | j r
dS | jj S )NF)r   r~   Z"CRYPTOGRAPHY_OPENSSL_LESS_THAN_111)r   rw   rw   rx   x448_supported>	  s    zBackend.x448_supportedc             C   s   | j r
dS | jj S )NF)r   r~   #CRYPTOGRAPHY_OPENSSL_LESS_THAN_111B)r   rw   rw   rx   ed25519_supportedC	  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   rU   _ED25519_KEY_SIZEr   r~   r  NID_ED25519r|   r   r   r   r  r3   )r   r  r   rw   rw   rx   ed25519_load_public_bytesH	  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   rU   r  r   r   r  r|   r   r~   r  r  r   r   r   r  r2   )r   r  r  r   rw   rw   rx   ed25519_load_private_bytesV	  s    z"Backend.ed25519_load_private_bytesc             C   s   | j | jj}t| |S )N)r  r~   r  r2   )r   r   rw   rw   rx   ed25519_generate_keyd	  s    zBackend.ed25519_generate_keyc             C   s   | j r
dS | jj S )NF)r   r~   r  )r   rw   rw   rx   ed448_supportedh	  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   r4   r   r~   r  	NID_ED448r|   r   r   r   r  r6   )r   r  r   rw   rw   rx   ed448_load_public_bytesm	  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   r4   r   r|   r   r~   r  r  r   r   r   r  r5   )r   r  r  r   rw   rw   rx   ed448_load_private_bytesz	  s    z Backend.ed448_load_private_bytesc             C   s   | j | jj}t| |S )N)r  r~   r  r5   )r   r   rw   rw   rx   ed448_generate_key	  s    zBackend.ed448_generate_keyc             C   s   | j jd|}| j j|}| jj|t||t||||tj||
}	|	dkrr| j }
d| | d }t	dj
||
| j j|d d  S )Nzunsigned char[]rz      i   r   zJNot enough memory to derive key. These parameters require {} MB of memory.i   )r|   r   r   r~   ZEVP_PBE_scryptr   rm   Z
_MEM_LIMITr   MemoryErrorr   r   )r   r   r   r   r   rr   r   r   r   r   Z
min_memoryrw   rw   rx   derive_scrypt	  s*    zBackend.derive_scryptc             C   s2   t j|}| jr|| jkrdS | jj|| jjkS )NF)r   Z_aead_cipher_namer   
_fips_aeadr~   r  r|   r   )r   r   cipher_namerw   rw   rx   aead_cipher_supported	  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  rw   rw   rx   r  	  s    
zBackend._zeroed_bytearrayc             C   s   xt |D ]}d||< q
W d S )Nr   )r   )r   r  r   rn  rw   rw   rx   r  	  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[]rz   z	uint8_t *)r|   r   r   r   Zmemmover  cast)r   r  Zdata_lenr   rw   rw   rx   _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k | jj
|| jj}|jt| | qxW ||
|fS )Nrz  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  r~   Zd2i_PKCS12_biorr   r|   r   r   r   r   PKCS12_freer   r  ZPKCS12_parser  r  r^  rL   sk_X509_freesk_X509_numr   sk_X509_valuer   r   )r   r  rz  rr   p12Zevp_pkey_ptrZx509_ptrZsk_x509_ptrpassword_bufr   r  r   Zadditional_certificatesr   r   sk_x509r   rn  rw   rw   rx   %load_key_and_certificates_from_pkcs12	  sF    


z-Backend.load_key_and_certificates_from_pkcs12c             C   s  d }|d k	rt jd| t|tjr6d}d}d}	d}
n4t|tjrb| jj}| jj}d}	d}
|j}nt	d|d ks~t
|dkr| jj}nL| jj }| jj|| jj}x.t|D ]"}| jj||j}tj|dk qW | j|Z}| j|D}| jj|||r|jn| jj|r|jn| jj||||	|
d
}W d Q R X W d Q R X | j|| jjk | jj|| jj}| j }| jj||}| j|dk | j|S )Nr   rz   r   i N  zUnsupported key encryption typer  r  )r   r  r   rR   r  r  r~   Z&NID_pbe_WithSHA1And3_Key_TripleDES_CBCrz  r   r   r|   r   sk_X509_new_nullr   r  reversedsk_X509_pushr  r  r   r  ZPKCS12_createrU  r  r	  Zi2d_PKCS12_bior  )r   r   r   r  Zcasr  rz  Znid_certZnid_keyZpkcs12_iterZmac_iterr  Zcar   r  Zname_bufr  rr   rw   rw   rx   (serialize_key_and_certificates_to_pkcs12
  sT    


z0Backend.serialize_key_and_certificates_to_pkcs12c             C   s   | j r
dS | jjdkS )NFrz   )r   r~   ZCryptography_HAS_POLY1305)r   rw   rw   rx   poly1305_supportedF
  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   rD   r   rE   )r   r   rw   rw   rx   create_poly1305_ctxK
  s    zBackend.create_poly1305_ctxc             C   sn   t jd| | j|}| jj|j| jj| jj| jj}|| jjkrR| j  t	d| jj
|| jj}| j|S )Nr  zUnable to parse PKCS7 data)r   r  r  r~   ZPEM_read_bio_PKCS7rr   r|   r   r   r   r   
PKCS7_free_load_pkcs7_certificates)r   r  rr   p7rw   rw   rx   load_pem_pkcs7_certificatesR
  s    
z#Backend.load_pem_pkcs7_certificatesc             C   sb   t jd| | j|}| jj|j| jj}|| jjkrF| j  t	d| jj
|| jj}| j|S )Nr  zUnable to parse PKCS7 data)r   r  r  r~   Zd2i_PKCS7_biorr   r|   r   r   r   r   r  r   )r   r  rr   r!  rw   rw   rx   load_der_pkcs7_certificates_
  s    
z#Backend.load_der_pkcs7_certificatesc       	      C   s   | j j|j}| j|| j jk || j jkr>tdj|tj	g }|j
j| jjkrV|S |j
jj}| j j|}xlt|D ]`}| j j||}| j|| jjk | j j|}| j|dk | jj|| j j}|jt| | qvW |S )NzNOnly basic signed structures are currently supported. NID for this data was {}rz   )r~   ZOBJ_obj2nidr   r   rv  ZNID_pkcs7_signedr	   r   r
   ZUNSUPPORTED_SERIALIZATIONr   Zsignr|   r   r  r  r   r  ZX509_up_refr   r^  r   rL   )	r   r!  rw  certsr  r   rn  r   r   rw   rw   rx   r   j
  s(    
z Backend._load_pkcs7_certificatesc             C   s  | j |j}| jj}d}t|jdkr0| jj}nJ| jj }| jj	|| jj
}x,|jD ]"}| jj||j}	| j|	dk qTW tjj|kr|| jjO }|| jjO }| jj| jj| jj|| jj|}
| j|
| jjk | jj	|
| jj}
d}tjj|kr|| jjO }ntjj|kr|| jjO }tjj|kr6|| jjO }xJ|jD ]@\}}}| j|}| jj|
|j|j||}| j|| jjk q>W xD|D ]<}|tjjkr|| jjO }n|tjj kr|| jj!O }qW | j" }|t#j$j%kr| jj&||
|j'|}	n|t#j$j(kr8| jj)|
|j'|}	| j|	dk | jj*||
|j'|}	n@|t#j$j+ksJt,| jj)|
|j'|}	| j|	dk | jj-||
}	| j|	dk | j.|S )Nr   rz   )/r  _datar~   ZPKCS7_PARTIALr   Z_additional_certsr|   r   r  r   r  r  r  r   rn   ZPKCS7OptionsZDetachedSignatureZPKCS7_DETACHEDZ
PKCS7_signr  ZNoCapabilitiesZPKCS7_NOSMIMECAPZNoAttributesZPKCS7_NOATTRZNoCertsZPKCS7_NOCERTSZ_signersr   ZPKCS7_sign_add_signerrU  ZTextZ
PKCS7_TEXTZBinaryZPKCS7_BINARYr	  rR   r  ZSMIMEZSMIME_write_PKCS7rr   r  ZPKCS7_finalZPEM_write_bio_PKCS7_streamr  r   Zi2d_PKCS7_bior  )r   rZ  r  Zoptionsrr   Z
init_flagsZfinal_flagsr$  r  r   r!  Zsigner_flagsZcertificaterH  Zhash_algorithmZmdZp7signerinfoZoptionZbio_outrw   rw   rx   
pkcs7_sign
  sj    



zBackend.pkcs7_sign)N)N)N)rt   ru   rv   __doc__r   r
  r\   rd   r   rQ   r!  r"  r#  r$  r%  Z
SHA512_224Z
SHA512_256ZSHA3_224ZSHA3_256ZSHA3_384ZSHA3_512ZSHAKE128ZSHAKE256r   Z_fips_rsa_min_key_sizeZ_fips_rsa_min_public_exponentZ_fips_dsa_min_modulusZ_fips_dh_min_key_sizeZ_fips_dh_min_modulusr   r   r   r   
contextlibr   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/  r2  r3  r8  r<  r>  r?  r0  r@  rA  rC  rD  rI  r]  rc  rP  r`  rf  rk  rV  rr  rm  rx  r{  r  r  r  r  r  r  r  r  r  r  r  r  ry  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  r  r  r  r"  r#  r   r&  rw   rw   rw   rx   ry      sV  	
	-5 ++	HB	8"


1)		#

Ui0
."
.@ry   c               @   s   e Zd Zdd Zdd ZdS )r   c             C   s
   || _ d S )N)_fmt)r   Zfmtrw   rw   rx   r   
  s    zGetCipherByName.__init__c             C   s&   | j j||dj }|jj|jdS )N)r   r   r   )r)  r   lowerr~   r  r   )r   r  r   r   r  rw   rw   rx   __call__
  s    zGetCipherByName.__call__N)rt   ru   rv   r   r+  rw   rw   rw   rx   r   
  s   r   c             C   s"   dj |jd }| jj|jdS )Nz
aes-{}-xtsr   r   )r   r   r~   r  r   )r  r   r   r  rw   rw   rx   r   
  s    r   )Z
__future__r   r   r   collectionsr(  r   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    r!   r"   r#   r$   r%   r&   r'   r(   Z'cryptography.hazmat.backends.openssl.dhr)   r*   r+   r,   Z(cryptography.hazmat.backends.openssl.dsar-   r.   r/   Z'cryptography.hazmat.backends.openssl.ecr0   r1   Z,cryptography.hazmat.backends.openssl.ed25519r2   r3   Z*cryptography.hazmat.backends.openssl.ed448r4   r5   r6   Z0cryptography.hazmat.backends.openssl.encode_asn1r7   r8   r9   r:   r;   r<   r=   r>   r?   Z+cryptography.hazmat.backends.openssl.hashesr@   Z)cryptography.hazmat.backends.openssl.hmacrA   Z)cryptography.hazmat.backends.openssl.ocsprB   rC   Z-cryptography.hazmat.backends.openssl.poly1305rD   rE   Z(cryptography.hazmat.backends.openssl.rsarF   rG   Z+cryptography.hazmat.backends.openssl.x25519rH   rI   Z)cryptography.hazmat.backends.openssl.x448rJ   rK   Z)cryptography.hazmat.backends.openssl.x509rL   rM   rN   rO   Z$cryptography.hazmat.bindings.opensslrP   Zcryptography.hazmat.primitivesrQ   rR   Z)cryptography.hazmat.primitives.asymmetricrS   rT   rU   rV   rW   Z1cryptography.hazmat.primitives.asymmetric.paddingrX   rY   rZ   r[   Z1cryptography.hazmat.primitives.ciphers.algorithmsr\   r]   r^   r_   r`   ra   rb   rc   rd   Z,cryptography.hazmat.primitives.ciphers.modesre   rf   rg   rh   ri   rj   rk   rl   Z"cryptography.hazmat.primitives.kdfrm   Z,cryptography.hazmat.primitives.serializationrn   ro   Zcryptography.x509rp   
namedtuplerq   objectrs   Zregister_interfaceZregister_interface_ifr{   r}   ZCryptography_HAS_SCRYPTry   r   r   r  rw   rw   rw   rx   <module>   s   <,,,(
                     5	