o
    Œõ±j  ã                   @   s    d Z ddlmZmZmZmZ ddlZddlZddlZddl	m
Z
 ddlmZmZmZ ejdk r6ddlmZ ndd	lmZ d
d„ Zddd„Zdd„ Zddd„ZdS )zq
Encoding DER to PEM and decoding PEM to DER. Exports the following items:

 - armor()
 - detect()
 - unarmor()

é    )Úunicode_literalsÚdivisionÚabsolute_importÚprint_functionNé   )Úunwrap)Ú	type_nameÚstr_clsÚbyte_cls)é   )ÚStringIO)ÚBytesIOc                 C   s8   t | tƒsttdt| ƒƒƒ‚|  d¡dkp|  d¡dkS )zð
    Detect if a byte string seems to contain a PEM-encoded block

    :param byte_string:
        A byte string to look through

    :return:
        A boolean, indicating if a PEM-encoded block is contained in the byte
        string
    zC
            byte_string must be a byte string, not %s
            s
   -----BEGINéÿÿÿÿs
   ---- BEGIN)Ú
isinstancer
   Ú	TypeErrorr   Ú
_type_nameÚfind)Úbyte_string© r   ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asn1crypto/pem.pyÚdetect   s   
ür   c                 C   s0  t |tƒsttdt|ƒ ƒƒ‚t | tƒsttdt| ƒƒƒ‚|  ¡  d¡} tƒ }| 	d¡ | 	| ¡ | 	d¡ |r^|D ]}| 	| d¡¡ | 	d¡ | 	||  d¡¡ | 	d¡ q:| 	d¡ t
 |¡}t|ƒ}d}||k r…| 	|||d	 … ¡ | 	d¡ |d	7 }||k sm| 	d
¡ | 	| ¡ | 	d¡ | ¡ S )a  
    Armors a DER-encoded byte string in PEM

    :param type_name:
        A unicode string that will be capitalized and placed in the header
        and footer of the block. E.g. "CERTIFICATE", "PRIVATE KEY", etc. This
        will appear as "-----BEGIN CERTIFICATE-----" and
        "-----END CERTIFICATE-----".

    :param der_bytes:
        A byte string to be armored

    :param headers:
        An OrderedDict of the header lines to write after the BEGIN line

    :return:
        A byte string of the PEM block
    zA
            der_bytes must be a byte string, not %s
            zD
            type_name must be a unicode string, not %s
            Úasciis   -----BEGIN s   -----
s   : ó   
r   é@   s	   -----END )r   r
   r   r   r   r	   ÚupperÚencoder   ÚwriteÚbase64Ú	b64encodeÚlenÚgetvalue)r   Ú	der_bytesÚheadersÚoutputÚkeyÚ	b64_bytesÚb64_lenÚir   r   r   Úarmor2   sF   
þÿ
ü






ý


r(   c                 c   s,  � t | tƒsttdt| ƒƒƒ‚d}i }d}d}d}d}|  d¡D ]i}|dkr'q |dkrAt d|¡}|s4q | d¡ 	d¡}d	}d
}q |d
krc| 
d¡dkrOd}n| 	d¡}	|	 dd¡\}
}| ¡ ||
< q |dkr‰|dd… dv r…t |¡}|||fV  d}i }d}d}d	}q ||7 }q |rŽ|s”ttdƒƒ‚dS )ax  
    Convert a PEM-encoded byte string into one or more DER-encoded byte strings

    :param pem_bytes:
        A byte string of the PEM-encoded data

    :raises:
        ValueError - when the pem_bytes do not appear to be PEM-encoded bytes

    :return:
        A generator of 3-element tuples in the format: (object_type, headers,
        der_bytes). The object_type is a unicode string of what is between
        "-----BEGIN " and "-----". Examples include: "CERTIFICATE",
        "PUBLIC KEY", "PRIVATE KEY". The headers is a dict containing any lines
        in the form "Name: Value" that are right after the begin line.
    zA
            pem_bytes must be a byte string, not %s
            Útrashó    NFs1   ^(?:---- |-----)BEGIN ([A-Z0-9 ]+)(?: ----|-----)r   r   Tr"   ó   :r   Úbodyú:r   é   )s   -----s   ---- z|
            pem_bytes does not appear to contain PEM-encoded data - no
            BEGIN/END combination found
            )r   r
   r   r   r   Ú
splitlinesÚreÚmatchÚgroupÚdecoder   ÚsplitÚstripr   Ú	b64decodeÚ
ValueError)Ú	pem_bytesÚstater"   Úbase64_dataÚobject_typeÚfound_startÚ	found_endÚlineÚtype_name_matchÚdecoded_lineÚnameÚvaluer!   r   r   r   Ú_unarmorp   s^   €
ü

€ÿÿrC   Fc                 C   s   t | ƒ}|s
t|ƒS |S )a˜  
    Convert a PEM-encoded byte string into a DER-encoded byte string

    :param pem_bytes:
        A byte string of the PEM-encoded data

    :param multiple:
        If True, function will return a generator

    :raises:
        ValueError - when the pem_bytes do not appear to be PEM-encoded bytes

    :return:
        A 3-element tuple (object_name, headers, der_bytes). The object_name is
        a unicode string of what is between "-----BEGIN " and "-----". Examples
        include: "CERTIFICATE", "PUBLIC KEY", "PRIVATE KEY". The headers is a
        dict containing any lines in the form "Name: Value" that are right
        after the begin line.
    )rC   Únext)r8   ÚmultipleÚ	generatorr   r   r   ÚunarmorÄ   s   rG   )N)F)Ú__doc__Ú
__future__r   r   r   r   r   r0   ÚsysÚ_errorsr   Ú_typesr   r   r	   r
   Úversion_infoÚ	cStringIOr   r   Úior   r(   rC   rG   r   r   r   r   Ú<module>   s   	

>T