3
uQh•  ã               @   s~   d Z ddlZddlZejeef Zeejeef dœdd„Zeeeej	e dœdd„Z
eeed	œd
d„Zeeed	œdd„ZdS )z0Functions that load and write PEM-encoded files.é    N)Ú
pem_markerÚreturnc             C   s,   t | tƒs| jdƒ} d|  d d|  d fS )z:
    Returns the start and end PEM markers, as bytes.
    Úasciis   -----BEGIN s   -----s	   -----END )Ú
isinstanceÚbytesÚencode)r   © r   ú&/tmp/pip-build-2nz6shyl/rsa/rsa/pem.pyÚ_markers   s    


r
   )ÚcontentsÚ	pem_startÚpem_endr   c             c   s–   d}d}xh| j ƒ D ]\}|jƒ }|s$q||krF|r<td| ƒ‚d}d}q|sLq|r^||kr^d}P d|krhq|V  qW |s‚td| ƒ‚|r’td| ƒ‚dS )z7Generator over PEM lines between pem_start and pem_end.FzSeen start marker "%r" twiceTó   :zNo PEM start marker "%r" foundzNo PEM end marker "%r" foundN)Ú
splitlinesÚstripÚ
ValueError)r   r   r   Zin_pem_partZseen_pem_startÚliner   r   r	   Ú
_pem_lines&   s0    
r   )r   r   r   c             C   sJ   t | tƒs| jdƒ} t|ƒ\}}dd„ t| ||ƒD ƒ}dj|ƒ}tj|ƒS )aÑ  Loads a PEM file.

    :param contents: the contents of the file to interpret
    :param pem_marker: the marker of the PEM content, such as 'RSA PRIVATE KEY'
        when your file has '-----BEGIN RSA PRIVATE KEY-----' and
        '-----END RSA PRIVATE KEY-----' markers.

    :return: the base64-decoded content between the start and end markers.

    @raise ValueError: when the content is invalid, for example when the start
        marker cannot be found.

    r   c             S   s   g | ]}|‘qS r   r   )Ú.0r   r   r   r	   ú
<listcomp>g   s    zload_pem.<locals>.<listcomp>ó    )r   r   r   r
   r   ÚjoinÚbase64Ústandard_b64decode)r   r   r   r   Ú	pem_linesZpemr   r   r	   Úload_pemS   s    


r   c             C   sv   t |ƒ\}}tj| ƒjddƒ}|g}x2tdt|ƒdƒD ]}|||d … }|j|ƒ q6W |j|ƒ |jdƒ dj|ƒS )aj  Saves a PEM file.

    :param contents: the contents to encode in PEM format
    :param pem_marker: the marker of the PEM content, such as 'RSA PRIVATE KEY'
        when your file has '-----BEGIN RSA PRIVATE KEY-----' and
        '-----END RSA PRIVATE KEY-----' markers.

    :return: the base64-encoded content between the start and end markers, as bytes.

    ó   
r   r   é@   )r
   r   Ústandard_b64encodeÚreplaceÚrangeÚlenÚappendr   )r   r   r   r   Zb64r   Zblock_startÚblockr   r   r	   Úsave_pemn   s    

r$   )Ú__doc__r   ÚtypingÚUnionÚstrr   Z	FlexiTextÚTupler
   ÚIteratorr   r   r$   r   r   r   r	   Ú<module>   s   -