§
    8·tc<  ã                   óœ   — d dgZ ddlZddlmZmZmZmZ ddlmZ ddl	m
Z
mZ ddlmZmZmZ ddlmZ dd	lmZ dd
lmZmZ dd„Zd„ Zdd„ZdS )ÚencodeÚdecodeé    N)Ú
a2b_base64Ú
b2a_base64ÚhexlifyÚ	unhexlify)ÚMD5)ÚpadÚunpad)ÚDESÚDES3ÚAES)ÚPBKDF1)Úget_random_bytes)ÚtobytesÚtostrc                 óZ  ‡ — |€t           }d|z  }|r¾ |d¦  «        }t          ||ddt          ¦  «        }|t          ||z   |ddt          ¦  «        z  }t          j        |t          j        |¦  «        }|dt          t          |¦  «                             ¦   «         ¦  «        z  z  }| 	                    t          ‰ |j        ¦  «        ¦  «        Š n|�t          d¦  «        ‚ˆ fd„t          d	t          ‰ ¦  «        d
¦  «        D ¦   «         }|d                     |¦  «        z  }|d|z  z  }|S )a4  Encode a piece of binary data into PEM format.

    Args:
      data (byte string):
        The piece of binary data to encode.
      marker (string):
        The marker for the PEM block (e.g. "PUBLIC KEY").
        Note that there is no official master list for all allowed markers.
        Still, you can refer to the OpenSSL_ source code.
      passphrase (byte string):
        If given, the PEM block will be encrypted. The key is derived from
        the passphrase.
      randfunc (callable):
        Random number generation function; it accepts an integer N and returns
        a byte string of random data, N bytes long. If not given, a new one is
        instantiated.

    Returns:
      The PEM block, as a string.

    .. _OpenSSL: https://github.com/openssl/openssl/blob/master/include/openssl/pem.h
    Nz-----BEGIN %s-----
é   é   é   z2Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,%s

zEmpty passwordc           
      ó^   •— g | ])}t          t          ‰||d z   …         ¦  «        ¦  «        ‘Œ*S )é0   )r   r   )Ú.0ÚiÚdatas     €ú3/usr/lib/python3/dist-packages/Cryptodome/IO/PEM.pyú
<listcomp>zencode.<locals>.<listcomp>Z   sE   ø€ ð 0ð 0ð 0Øõ •J˜t A a¨"¡f Hœ~Ñ.Ô.Ñ/Ô/ð 0ð 0ð 0ó    r   r   Ú z-----END %s-----)r   r   r	   r   ÚnewÚMODE_CBCr   r   ÚupperÚencryptr
   Ú
block_sizeÚ
ValueErrorÚrangeÚlenÚjoin)	r   ÚmarkerÚ
passphraseÚrandfuncÚoutÚsaltÚkeyÚobjencÚchunkss	   `        r   r   r   /   sA  ø€ ð0 ÐÝ#ˆà
  6Ñ
)€CØð +àˆx˜‰{Œ{ˆÝ�Z  r¨1­cÑ2Ô2ˆØ�v�c˜JÑ&¨¨a°µCÑ8Ô8Ñ8ˆÝ”˜#�tœ}¨dÑ3Ô3ˆØÐFÝ•'˜$‘-”-×%Ò%Ñ'Ô'Ñ(Ô(ñ)ñ 	)ˆð �~Š~�c $¨Ô(9Ñ:Ô:Ñ;Ô;ˆˆØ	Ð	ÝÐ)Ñ*Ô*Ð*ð0ð 0ð 0ð 0Ý˜Q¥ D¡	¤	¨2Ñ.Ô.ð0ñ 0ô 0€Fàˆ2�7Š7�6‰?Œ?Ñ€CØÐ Ñ&Ñ&€CØ€Jr   c                 ó  — dg}|dz   dz  }t          |¦  «        D ]I}t          j        |d         | z   |z   ¦  «                             ¦   «         }|                     |¦  «         ŒJd                     |¦  «        d |…         S )Nr   é   r   éÿÿÿÿ)r&   r	   r    ÚdigestÚappendr(   )r   r-   Úkey_lenÚdÚmÚ_Únds          r   Ú_EVP_BytesToKeyr;   a   s~   € Ø
ˆ€AØ	�2‰˜2Ñ€AÝ�1‰XŒXð ð ˆÝŒW�Q�r”U˜T‘\ DÑ(Ñ)Ô)×0Ò0Ñ2Ô2ˆØ	�Š�‰ŒˆˆØ�8Š8�A‰;Œ;�x˜�xÔ Ð r   c                 ó0  — t          j        d¦  «        }|                     | ¦  «        }|st          d¦  «        ‚|                     d¦  «        }t          j        d¦  «        }|                     | ¦  «        }|r|                     d¦  «        |k    rt          d¦  «        ‚|                      dd¦  «                             ¦   «         }|d                              d¦  «        �r:|st          d	¦  «        ‚|d
                              d¦  «        }t          |¦  «        d
k    s|d         dk    rt          d¦  «        ‚|d                              d¦  «        \  }}t          t          |¦  «        ¦  «        }d}	|dk    r3t          ||d¦  «        }
t          j        |
t          j        |¦  «        }�n`|dk    r3t          ||d¦  «        }
t!          j        |
t           j        |¦  «        }�n'|dk    r:t          ||dd…         d¦  «        }
t#          j        |
t"          j        |¦  «        }nç|dk    r:t          ||dd…         d¦  «        }
t#          j        |
t"          j        |¦  «        }n§|dk    r:t          ||dd…         d¦  «        }
t#          j        |
t"          j        |¦  «        }ng|                     ¦   «         dk    r=t          ||dd…         d¦  «        }
t#          j        |
t"          j        |¬¦  «        }d}	nt          d|z  ¦  «        ‚|d
d…         }nd}t)          d                     |dd…         ¦  «        ¦  «        }d}|rB|	r)t-          |                     |¦  «        |j        ¦  «        }n|                     |¦  «        }d}|||fS ) a  Decode a PEM block into binary.

    Args:
      pem_data (string):
        The PEM block.
      passphrase (byte string):
        If given and the PEM block is encrypted,
        the key will be derived from the passphrase.

    Returns:
      A tuple with the binary data, the marker string, and a boolean to
      indicate if decryption was performed.

    Raises:
      ValueError: if decoding fails, if the PEM file is encrypted and no passphrase has
                  been provided or if the passphrase is incorrect.
    z\s*-----BEGIN (.*)-----\s+zNot a valid PEM pre boundaryr   z-----END (.*)-----\s*$zNot a valid PEM post boundaryú r   zProc-Type:4,ENCRYPTEDz-PEM is encrypted, but no passphrase availableé   ú:r   zDEK-Infoz$PEM encryption format not supported.ú,TzDES-CBCr   zDES-EDE3-CBCé   zAES-128-CBCNr   zAES-192-CBCzAES-256-CBCé    zid-aes256-gcm)ÚnonceFz(Unsupport PEM encryption algorithm (%s).r3   )ÚreÚcompileÚmatchr%   ÚgroupÚsearchÚreplaceÚsplitÚ
startswithr'   r   r   r;   r   r    r!   r   r   ÚlowerÚMODE_GCMr   r(   r   Údecryptr$   )Úpem_datar*   Úrr8   r)   ÚlinesÚDEKÚalgor-   Úpaddingr.   Úobjdecr   Úenc_flags                 r   r   r   j   sj  € õ( 	Œ
Ð0Ñ1Ô1€AØ	�Š�ÑÔ€AØð 9ÝÐ7Ñ8Ô8Ð8Ø�WŠW�Q‰ZŒZ€Fõ 	Œ
Ð,Ñ-Ô-€AØ	�Š�ÑÔ€AØð :�—’˜‘
”
˜fÒ$Ð$ÝÐ8Ñ9Ô9Ð9ð ×Ò˜S "Ñ%Ô%×+Ò+Ñ-Ô-€Eð ˆQ„x×ÒÐ2Ñ3Ô3ñ "Øð 	NÝÐLÑMÔMÐMØ�AŒh�nŠn˜SÑ!Ô!ˆÝˆs‰8Œ8�qŠ=ˆ=˜C œF jÒ0Ð0ÝÐCÑDÔDÐDØ˜”V—\’\ #Ñ&Ô&‰
ˆˆdÝ� ™œÑ'Ô'ˆàˆà�9ÒÐÝ! *¨d°AÑ6Ô6ˆCÝ”W˜S¥#¤,°Ñ5Ô5ˆF‰FØ�^Ò#Ð#Ý! *¨d°BÑ7Ô7ˆCÝ”X˜c¥4¤=°$Ñ7Ô7ˆF‰FØ�]Ò"Ð"Ý! *¨d°2°A°2¬h¸Ñ;Ô;ˆCÝ”W˜S¥#¤,°Ñ5Ô5ˆFˆFØ�]Ò"Ð"Ý! *¨d°2°A°2¬h¸Ñ;Ô;ˆCÝ”W˜S¥#¤,°Ñ5Ô5ˆFˆFØ�]Ò"Ð"Ý! *¨d°2°A°2¬h¸Ñ;Ô;ˆCÝ”W˜S¥#¤,°Ñ5Ô5ˆFˆFØ�ZŠZ‰\Œ\˜_Ò,Ð,Ý! *¨d°2°A°2¬h¸Ñ;Ô;ˆCÝ”W˜S¥#¤,°dÐ;Ñ;Ô;ˆFØˆGˆGåÐGÈ$ÑNÑOÔOÐOØ�a�b�b”	ˆˆàˆõ �b—g’g˜e A b DœkÑ*Ô*Ñ+Ô+€DØ€HØð Øð 	(Ý˜Ÿš¨Ñ-Ô-¨vÔ/@ÑAÔAˆDˆDð —>’> $Ñ'Ô'ˆDØˆà�&˜(Ð#Ð#r   )NN)N)Ú__all__rD   Úbinasciir   r   r   r   ÚCryptodome.Hashr	   ÚCryptodome.Util.Paddingr
   r   ÚCryptodome.Cipherr   r   r   ÚCryptodome.Protocol.KDFr   ÚCryptodome.Randomr   ÚCryptodome.Util.py3compatr   r   r   r;   r   © r   r   ú<module>r`      s  ððD �XÐ
€à 	€	€	€	Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?à Ð Ð Ð Ð Ð Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø *Ð *Ð *Ð *Ð *Ð *Ø .Ð .Ð .Ð .Ð .Ð .Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4ð/ð /ð /ð /ðd!ð !ð !ðS$ð S$ð S$ð S$ð S$ð S$r   