U
    <g                     @   s   d Z ddlZddlmZ ddlmZmZmZ ddlm	Z	 dddd	d
gZ
eeZdd ZedddZdd Zee ejddd	Zeee ejddd
ZejdddZejdddZdS )z/
Utility module to load keys and certificates.
    N)Optional)keyspemx509)serializationload_cert_from_pemderload_certs_from_pemderload_certs_from_pemder_dataload_private_key_from_pemder!load_private_key_from_pemder_datac              
   c   s:   | D ]0}t |d}| }W 5 Q R X t|E dH  qdS )z
    A convenience function to load PEM/DER-encoded certificates from files.

    :param cert_files:
        An iterable of file names.
    :return:
        A generator producing :class:`.asn1crypto.x509.Certificate` objects.
    rbN)openreadr	   )Z
cert_files	cert_filefcert_data_bytes r   0/tmp/pip-unpacked-wheel-w101_d3s/pyhanko/keys.pyr      s    	)r   c                 c   sr   t | r`t j| dd}|D ]@\}}}|dks:| dkrJtj|V  qtd| d qntj| V  dS )a  
    A convenience function to load PEM/DER-encoded certificates from
    binary data.

    :param cert_data_bytes:
        ``bytes`` object from which to extract certificates.
    :return:
        A generator producing :class:`.asn1crypto.x509.Certificate` objects.
    T)multipleNcertificatezSkipping PEM block of type z in CA chain file.)	r   detectZunarmorlowerr   Certificateloadloggerdebug)r   Zpems	type_name_derr   r   r   r	   %   s    

c                 C   s2   t t| g}t|dkr*td|  d|d S )z
    A convenience function to load a single PEM/DER-encoded certificate
    from a file.

    :param cert_file:
        A file name.
    :return:
        An :class:`.asn1crypto.x509.Certificate` object.
       zNumber of certs in z should be exactly 1r   )listr   len
ValueError)r   certsr   r   r   r   A   s    
)
passphrasereturnc              	   C   s*   t | d}| }W 5 Q R X t||dS )a  
    A convenience function to load PEM/DER-encoded keys from files.

    :param key_file:
        File to read the key from.
    :param passphrase:
        Key passphrase.
    :return:
        A private key encoded as an unencrypted PKCS#8 PrivateKeyInfo object.
    r   )r$   )r   r   r   )key_filer$   r   	key_bytesr   r   r   r
   Q   s    )r'   r$   r%   c                 C   s&   t | rtjntj}t|| |dS )a  
    A convenience function to load PEM/DER-encoded keys from binary data.

    :param key_bytes:
        ``bytes`` object to read the key from.
    :param passphrase:
        Key passphrase.
    :return:
        A private key encoded as an unencrypted PKCS#8 PrivateKeyInfo object.
    )password)r   r   r   load_pem_private_keyload_der_private_key(_translate_pyca_cryptography_key_to_asn1)r'   r$   Zload_funr   r   r   r   c   s    
)r%   c                 C   s"   t j| tjjtjjt	 S N)
r   PrivateKeyInfor   private_bytesr   EncodingDERPrivateFormatPKCS8NoEncryption)private_keyr   r   r   r+   z   s    r+   c                 C   s   t j| tjjS r,   )r   r   r   public_bytesr   r/   r0   )certr   r   r   )_translate_pyca_cryptography_cert_to_asn1   s    r7   )__doc__loggingtypingr   Z
asn1cryptor   r   r   Zcryptography.hazmat.primitivesr   __all__	getLogger__name__r   r   bytesr	   r   r-   r
   r   r+   r   r7   r   r   r   r   <module>   s0   
 