o
    Þý°j½y  ã                   @   sú   g d ¢Z ddlZddlZddlmZ ddlmZmZmZ ddl	m
Z
mZ ddlmZ ddlmZ ddlmZmZmZ dd	lmZmZmZ G d
d„ deƒZd#dd„Zd$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 d!„Z#e#Z$d"Z%dS )&)ÚgenerateÚ	constructÚ
import_keyÚRsaKeyÚoidé    N)ÚRandom)ÚtobytesÚbordÚtostr)ÚDerSequenceÚDerNull)Úbytes_to_long)ÚInteger)Útest_probable_primeÚgenerate_probable_primeÚ	COMPOSITE)Ú_expand_subject_public_key_infoÚ_create_subject_public_key_infoÚ _extract_subject_public_key_infoc                   @   sV  e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZedd	„ ƒZed
d„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZe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d0d1„ Zd2d3„ Z	6	5dKd7d8„Zd9d:„ Zd;d<„ Z d=d>„ Z!d?d@„ Z"dAdB„ Z#dCdD„ Z$dEdF„ Z%dGdH„ Z&dIdJ„ Z'd5S )Lr   a×  Class defining an RSA key, private or public.
    Do not instantiate directly.
    Use :func:`generate`, :func:`construct` or :func:`import_key` instead.

    :ivar n: RSA modulus
    :vartype n: integer

    :ivar e: RSA public exponent
    :vartype e: integer

    :ivar d: RSA private exponent
    :vartype d: integer

    :ivar p: First factor of the RSA modulus
    :vartype p: integer

    :ivar q: Second factor of the RSA modulus
    :vartype q: integer

    :ivar invp: Chinese remainder component (:math:`p^{-1} \text{mod } q`)
    :vartype invp: integer

    :ivar invq: Chinese remainder component (:math:`q^{-1} \text{mod } p`)
    :vartype invq: integer

    :ivar u: Same as ``invp``
    :vartype u: integer
    c                 K   s�   t | ¡ ƒ}t dƒ}|t dƒB }|||fvrtdƒ‚| ¡ D ]\}}t| d| |ƒ q||krF| j| jd  | _| j| jd  | _	d| _
dS dS )a.  Build an RSA key.

        :Keywords:
          n : integer
            The modulus.
          e : integer
            The public exponent.
          d : integer
            The private exponent. Only required for private keys.
          p : integer
            The first factor of the modulus. Only required for private keys.
          q : integer
            The second factor of the modulus. Only required for private keys.
          u : integer
            The CRT coefficient (inverse of p modulo q). Only required for
            private keys.
        ©ÚnÚe)ÚpÚqÚdÚuzSome RSA components are missingÚ_é   N)ÚsetÚkeysÚ
ValueErrorÚitemsÚsetattrÚ_dÚ_pÚ_dpÚ_qÚ_dqÚ_invq)ÚselfÚkwargsÚ	input_setÚ
public_setÚprivate_setÚ	componentÚvalue© r0   ú‹/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/Cryptodome/PublicKey/RSA.pyÚ__init__R   s   
ýzRsaKey.__init__c                 C   ó
   t | jƒS ©N)ÚintÚ_n©r)   r0   r0   r1   r   q   ó   
zRsaKey.nc                 C   r3   r4   )r5   Ú_er7   r0   r0   r1   r   u   r8   zRsaKey.ec                 C   ó   |   ¡ stdƒ‚t| jƒS )Nz-No private exponent available for public keys)Úhas_privateÚAttributeErrorr5   r#   r7   r0   r0   r1   r   y   ó   
zRsaKey.dc                 C   r:   )Nz.No CRT component 'p' available for public keys)r;   r<   r5   r$   r7   r0   r0   r1   r      r=   zRsaKey.pc                 C   r:   )Nz.No CRT component 'q' available for public keys)r;   r<   r5   r&   r7   r0   r0   r1   r   …   r=   zRsaKey.qc                 C   r:   )Nz/No CRT component 'dp' available for public keys)r;   r<   r5   r%   r7   r0   r0   r1   Údp‹   r=   z	RsaKey.dpc                 C   r:   )Nz/No CRT component 'dq' available for public keys)r;   r<   r5   r'   r7   r0   r0   r1   Údq‘   r=   z	RsaKey.dqc                 C   s4   |   ¡ stdƒ‚| jd u r| j | j¡| _t| jƒS )Nz1No CRT component 'invq' available for public keys)r;   r<   r(   r&   Úinverser$   r5   r7   r0   r0   r1   Úinvq—   s
   

zRsaKey.invqc                 C   s   | j S r4   )r   r7   r0   r0   r1   ÚinvpŸ   s   zRsaKey.invpc                 C   r:   )Nz.No CRT component 'u' available for public keys)r;   r<   r5   Ú_ur7   r0   r0   r1   r   £   r=   zRsaKey.uc                 C   s
   | j  ¡ S )zSize of the RSA modulus in bits©r6   Úsize_in_bitsr7   r0   r0   r1   rE   ©   r8   zRsaKey.size_in_bitsc                 C   s   | j  ¡ d d d S )z9The minimal amount of bytes that can hold the RSA modulusr   é   rD   r7   r0   r0   r1   Úsize_in_bytes­   s   zRsaKey.size_in_bytesc                 C   s>   d|  kr| j k stdƒ‚ tdƒ‚ttt|ƒ| j| j ƒƒS )Nr   zPlaintext too large)r6   r    r5   Úpowr   r9   )r)   Ú	plaintextr0   r0   r1   Ú_encrypt±   s
   ÿzRsaKey._encryptc           	      C   sÂ   d|  kr| j k stdƒ‚ tdƒ‚|  ¡ stdƒ‚tjd| j d�}t|ƒt|| j| j ƒ | j  }t|| j| j	ƒ}t|| j
| jƒ}|| | j | j }|| j	 | }t | | j ¡|| j ¡}|S )Nr   zCiphertext too largezThis is not a private keyr   )Úmin_inclusiveÚmax_exclusive)r6   r    r;   Ú	TypeErrorr   Úrandom_rangerH   r9   r%   r$   r'   r&   rC   Ú_mult_modulo_bytesr@   )	r)   Ú
ciphertextÚrÚcpÚm1Úm2ÚhÚmpÚresultr0   r0   r1   Ú_decrypt_to_bytes¶   s$   ÿ
ýzRsaKey._decrypt_to_bytesc                 C   s   t |  |¡ƒS )zLegacy private method)r   rX   ©r)   rP   r0   r0   r1   Ú_decryptÏ   s   zRsaKey._decryptc                 C   s
   t | dƒS )z"Whether this is an RSA private keyr#   )Úhasattrr7   r0   r0   r1   r;   Ô   s   
zRsaKey.has_privatec                 C   ó   dS ©NTr0   r7   r0   r0   r1   Úcan_encryptÙ   ó   zRsaKey.can_encryptc                 C   r\   r]   r0   r7   r0   r0   r1   Úcan_signÜ   r_   zRsaKey.can_signc                 C   s   t | j| jd�S )z^A matching RSA public key.

        Returns:
            a new :class:`RsaKey` object
        r   )r   r6   r9   r7   r0   r0   r1   Ú
public_keyß   s   zRsaKey.public_keyc                 C   sH   |   ¡ |  ¡ kr
dS | j|jks| j|jkrdS |   ¡ sdS | j|jkS )NFT)r;   r   r   r   ©r)   Úotherr0   r0   r1   Ú__eq__ç   s   zRsaKey.__eq__c                 C   s
   | |k S r4   r0   rb   r0   r0   r1   Ú__ne__ð   s   
zRsaKey.__ne__c                 C   s   ddl m} |‚)Nr   )ÚPicklingError)Úpicklerf   )r)   rf   r0   r0   r1   Ú__getstate__ó   s   zRsaKey.__getstate__c                 C   sP   |   ¡ rdt| jƒt| jƒt| jƒt| jƒf }nd}dt| jƒt| jƒ|f S )Nz, d=%d, p=%d, q=%d, u=%dÚ zRsaKey(n=%d, e=%d%s))r;   r5   r#   r$   r&   rC   r6   r9   )r)   Úextrar0   r0   r1   Ú__repr__ø   s   ÿzRsaKey.__repr__c                 C   s"   |   ¡ rd}nd}d|t| ƒf S )NÚPrivateÚPublicz%s RSA key at 0x%X)r;   Úid)r)   Úkey_typer0   r0   r1   Ú__str__   s   zRsaKey.__str__ÚPEMNr   c                 C   sê  |durt |ƒ}|du rtj}|dkrRdd„ | j| jfD ƒ\}}t|d ƒd@ r,d| }t|d ƒd@ r8d| }d||g}	d	 d
d„ |	D ƒ¡}
dt |
¡dd…  S |  	¡ rÄt
d| j| j| j| j| j| j| jd  | j| jd  t| jƒ | j¡g	ƒ ¡ }|dkrŽd}|dkr�|r�tdƒ‚nEddlm} |dkr©|du r©d}|j|tdtƒ d�}n*d}|sµ|r³tdƒ‚d}|j|t|||tƒ d�}d}nd}ttt
| j| jgƒtƒ ƒ}|dkrÙ|S |dkrïddlm} | ||||¡}t |ƒS td| ƒ‚)aÜ  Export this RSA key.

        Keyword Args:
          format (string):
            The desired output format:

            - ``'PEM'``. (default) Text output, according to `RFC1421`_/`RFC1423`_.
            - ``'DER'``. Binary output.
            - ``'OpenSSH'``. Text output, according to the OpenSSH specification.
              Only suitable for public keys (not private keys).

            Note that PEM contains a DER structure.

          passphrase (bytes or string):
            (*Private keys only*) The passphrase to protect the
            private key.

          pkcs (integer):
            (*Private keys only*) The standard to use for
            serializing the key: PKCS#1 or PKCS#8.

            With ``pkcs=1`` (*default*), the private key is encoded with a
            simple `PKCS#1`_ structure (``RSAPrivateKey``). The key cannot be
            securely encrypted.

            With ``pkcs=8``, the private key is encoded with a `PKCS#8`_ structure
            (``PrivateKeyInfo``). PKCS#8 offers the best ways to securely
            encrypt the key.

            .. note::
                This parameter is ignored for a public key.
                For DER and PEM, the output is always an
                ASN.1 DER ``SubjectPublicKeyInfo`` structure.

          protection (string):
            (*For private keys only*)
            The encryption scheme to use for protecting the private key
            using the passphrase.

            You can only specify a value if ``pkcs=8``.
            For all possible protection schemes,
            refer to :ref:`the encryption parameters of PKCS#8<enc_params>`.
            The recommended value is
            ``'PBKDF2WithHMAC-SHA512AndAES256-CBC'``.

            If ``None`` (default), the behavior depends on :attr:`format`:

            - if ``format='PEM'``, the obsolete PEM encryption scheme is used.
              It is based on MD5 for key derivation, and 3DES for encryption.

            - if ``format='DER'``, the ``'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC'``
              scheme is used.

          prot_params (dict):
            (*For private keys only*)

            The parameters to use to derive the encryption key
            from the passphrase. ``'protection'`` must be also specified.
            For all possible values,
            refer to :ref:`the encryption parameters of PKCS#8<enc_params>`.
            The recommendation is to use ``{'iteration_count':21000}`` for PBKDF2,
            and ``{'iteration_count':131072}`` for scrypt.

          randfunc (callable):
            A function that provides random bytes. Only used for PEM encoding.
            The default is :func:`Cryptodome.Random.get_random_bytes`.

        Returns:
          bytes: the encoded key

        Raises:
          ValueError:when the format is unknown or when you try to encrypt a private
            key with *DER* format and PKCS#1.

        .. warning::
            If you don't provide a pass phrase, the private key will be
            exported in the clear!

        .. _RFC1421:    http://www.ietf.org/rfc/rfc1421.txt
        .. _RFC1423:    http://www.ietf.org/rfc/rfc1423.txt
        .. _`PKCS#1`:   http://www.ietf.org/rfc/rfc3447.txt
        .. _`PKCS#8`:   http://www.ietf.org/rfc/rfc5208.txt
        NÚOpenSSHc                 S   s   g | ]}|  ¡ ‘qS r0   )Úto_bytes©Ú.0Úxr0   r0   r1   Ú
<listcomp>d  s    z%RsaKey.export_key.<locals>.<listcomp>r   é€   ó    s   ssh-rsaó    c                 S   s    g | ]}t  d t|ƒ¡| ‘qS )ú>I)ÚstructÚpackÚlen)ru   Úkpr0   r0   r1   rw   j  s     ó   ssh-rsa éÿÿÿÿr   zRSA PRIVATE KEYÚDERz&PKCS#1 private key cannot be encrypted©ÚPKCS8rq   zPRIVATE KEY)Ú
key_paramszENCRYPTED PRIVATE KEYz"'protection' parameter must be setz"PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC)Úprot_paramsr…   z
PUBLIC KEY©rq   z3Unknown key format '%s'. Cannot export the RSA key.)r   r   Úget_random_bytesr9   r6   r	   ÚjoinÚbinasciiÚ
b2a_base64r;   r   r   r   r   r   r   r   r@   Úencoder    ÚCryptodome.IOr„   Úwrapr   r   r   rq   )r)   ÚformatÚ
passphraseÚpkcsÚ
protectionÚrandfuncr†   Úe_bytesÚn_bytesÚkeypartsÚ	keystringÚ
binary_keyro   r„   rq   Úpem_strr0   r0   r1   Ú
export_key  s|   V
ø	÷
€
ÿýÿýzRsaKey.export_keyc                 O   s   | j |i |¤ŽS ©ú:meta private:)rš   )r)   Úargsr*   r0   r0   r1   Ú	exportKey£  s   zRsaKey.exportKeyc                 C   s   |   ¡ S r›   )ra   r7   r0   r0   r1   Ú	publickey§  ó   zRsaKey.publickeyc                 C   ó   t dƒ‚©rœ   z0Use module Cryptodome.Signature.pkcs1_15 instead©ÚNotImplementedError)r)   ÚMÚKr0   r0   r1   Úsign¬  r    zRsaKey.signc                 C   r¡   r¢   r£   )r)   r¥   Ú	signaturer0   r0   r1   Úverify°  r    zRsaKey.verifyc                 C   r¡   ©rœ   z/Use module Cryptodome.Cipher.PKCS1_OAEP insteadr£   )r)   rI   r¦   r0   r0   r1   Úencrypt´  r    zRsaKey.encryptc                 C   r¡   rª   r£   rY   r0   r0   r1   Údecrypt¸  r    zRsaKey.decryptc                 C   ó   t ‚r›   r£   ©r)   r¥   ÚBr0   r0   r1   Úblind¼  ó   zRsaKey.blindc                 C   r­   r›   r£   r®   r0   r0   r1   ÚunblindÀ  r±   zRsaKey.unblindc                 C   r­   r›   r£   r7   r0   r0   r1   ÚsizeÄ  r±   zRsaKey.size)rq   Nr   NNN)(Ú__name__Ú
__module__Ú__qualname__Ú__doc__r2   Úpropertyr   r   r   r   r   r>   r?   rA   rB   r   rE   rG   rJ   rX   rZ   r;   r^   r`   ra   rd   re   rh   rk   rp   rš   rž   rŸ   r§   r©   r«   r¬   r°   r²   r³   r0   r0   r0   r1   r   4   sd    









	
ÿ r   é  c                    sv  | dk rt dƒ‚ˆ d dksˆ dk rt dƒ‚|du rtj}tdƒ }}tˆ ƒ‰ | ¡ | kr£|d| d > k r£| d }| | }tdƒd| d >  ¡  ‰‰||kr[tdƒd| d >  ¡ ‰‡ ‡fd	d
„}t|||d�‰tdƒ| d d > ‰‡ ‡‡‡fdd„}t|||d�}	ˆ|	 }ˆd  |	d ¡}
ˆ  |
¡}| ¡ | kr£|d| d > k s5ˆ|	kr¬|	ˆ‰}	ˆ |	¡}t	|ˆ |ˆ|	|d�S )aF  Create a new RSA key pair.

    The algorithm closely follows NIST `FIPS 186-4`_ in its
    sections B.3.1 and B.3.3. The modulus is the product of
    two non-strong probable primes.
    Each prime passes a suitable number of Miller-Rabin tests
    with random bases and a single Lucas test.

    Args:
      bits (integer):
        Key length, or size (in bits) of the RSA modulus.
        It must be at least 1024, but **2048 is recommended.**
        The FIPS standard only defines 1024, 2048 and 3072.
    Keyword Args:
      randfunc (callable):
        Function that returns random bytes.
        The default is :func:`Cryptodome.Random.get_random_bytes`.
      e (integer):
        Public RSA exponent. It must be an odd positive integer.
        It is typically a small number with very few ones in its
        binary representation.
        The FIPS standard requires the public exponent to be
        at least 65537 (the default).

    Returns: an RSA key object (:class:`RsaKey`, with private key).

    .. _FIPS 186-4: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf
    i   z"RSA modulus length must be >= 1024é   r   é   zBRSA public exponent must be a positive, odd integer larger than 2.Nr   c                    s   | ˆko| d   ˆ ¡dkS ©Nr   )Úgcd©Ú	candidate)r   Úmin_pr0   r1   Úfilter_pý  s   zgenerate.<locals>.filter_p)Ú
exact_bitsr“   Úprime_filteréd   c                    s*   | ˆko| d   ˆ ¡dkot| ˆ ƒˆkS r¼   )r½   Úabsr¾   )r   Úmin_distanceÚmin_qr   r0   r1   Úfilter_q  s
   ÿþzgenerate.<locals>.filter_q©r   r   r   r   r   r   )
r    r   rˆ   r   rE   Úsqrtr   Úlcmr@   r   )Úbitsr“   r   r   r   Úsize_qÚsize_prÁ   rÈ   r   rË   r   r0   )r   rÆ   rÀ   rÇ   r   r1   r   É  sB   þþ
á!

r   Tc                 C   sæ  G dd„ dt ƒ}|ƒ }td| ƒD ]\}}t||t|ƒƒ q|j}|j}t|dƒs/t||d�}n›|j}	t|dƒr>|j	}
|j
}nt|	| d }|}|d d	krV|d }|d d	ksLd
}tdƒ}|s |dk r t|ƒ}||k r–t|||ƒ}|dkrŽ||d krŽt|d|ƒdkrŽt|ƒ |d ¡}
d}n|d9 }||k sj|d7 }|s |dk sb|s¦tdƒ‚||
 d	ks®J ‚||
 }t|dƒr»|j}n|
 |¡}t|||	|
||d�}|�rq|dksÕ||krÙtdƒ‚t|ƒ |¡dkrætdƒ‚|d@ sîtdƒ‚| ¡ �rq|	dksû|	|krÿtdƒ‚t|ƒ |	¡dk�rtdƒ‚|
| |k�rtdƒ‚t|
ƒtk�r#tdƒ‚t|ƒtk�r.tdƒ‚|
d |d  }||
d  |d ¡ }||	 t|ƒ dk�rPtdƒ‚t|dƒ�rq|dk�s`||k�rdtdƒ‚|
| | dk�rqtdƒ‚|S )a3  Construct an RSA key from a tuple of valid RSA components.

    The modulus **n** must be the product of two primes.
    The public exponent **e** must be odd and larger than 1.

    In case of a private key, the following equations must apply:

    .. math::

        \begin{align}
        p*q &= n \\
        e*d &\equiv 1 ( \text{mod lcm} [(p-1)(q-1)]) \\
        p*u &\equiv 1 ( \text{mod } q)
        \end{align}

    Args:
        rsa_components (tuple):
            A tuple of integers, with at least 2 and no
            more than 6 items. The items come in the following order:

            1. RSA modulus *n*.
            2. Public exponent *e*.
            3. Private exponent *d*.
               Only required if the key is private.
            4. First factor of *n* (*p*).
               Optional, but the other factor *q* must also be present.
            5. Second factor of *n* (*q*). Optional.
            6. CRT coefficient *q*, that is :math:`p^{-1} \text{mod }q`. Optional.

    Keyword Args:
        consistency_check (boolean):
            If ``True``, the library will verify that the provided components
            fulfil the main RSA properties.

    Raises:
        ValueError: when the key being imported fails the most basic RSA validity checks.

    Returns: An RSA key object (:class:`RsaKey`).
    c                   @   s   e Zd ZdS )zconstruct.<locals>.InputCompsN)r´   rµ   r¶   r0   r0   r0   r1   Ú
InputCompsD  s    rÏ   rÉ   r   r   r   r   rº   r   FrÄ   Tz2Unable to compute factors p and q from exponent d.r   zInvalid RSA public exponentz-RSA public exponent is not coprime to moduluszRSA modulus is not oddzInvalid RSA private exponentz.RSA private exponent is not coprime to modulusz RSA factors do not match moduluszRSA factor p is compositezRSA factor q is compositezInvalid RSA conditionzInvalid RSA component uzInvalid RSA component u with p)ÚobjectÚzipr"   r   r   r   r[   r   r   r   r   rH   r½   r    r   r@   r;   r   r   r5   )Úrsa_componentsÚconsistency_checkrÏ   Úinput_compsÚcompr/   r   r   Úkeyr   r   r   ÚktotÚtÚspottedÚaÚkÚcandr   ÚphirË   r0   r0   r1   r     s†   )

ÿ$÷ò


r   c                 G   sN   t ƒ j| ddd�}|d dkrtdƒ‚t|dd… t|d ƒ |d	 ¡g ƒS )
Né	   T©Únr_elementsÚonly_ints_expectedr   z(No PKCS#1 encoding of an RSA private keyr   é   é   é   )r   Údecoder    r   r   r@   ©Úencodedr*   Úderr0   r0   r1   Ú_import_pkcs1_private«  s   (ré   c                 G   s   t ƒ j| ddd�}t|ƒS )Nrº   Trß   )r   rå   r   ræ   r0   r0   r1   Ú_import_pkcs1_public¿  s   rê   c                 G   s6   t df}t| ƒ\}}}||vs|d urtdƒ‚t|ƒS )Nú1.2.840.113549.1.1.10zNo RSA subjectPublicKeyInfo)r   r   r    rê   )rç   r*   ÚoidsÚalgoidÚencoded_keyÚparamsr0   r0   r1   Ú_import_subjectPublicKeyInfoÈ  s
   rð   c                 G   s   t | ƒ}t|ƒS r4   )r   rð   )rç   r*   Úsp_infor0   r0   r1   Ú_import_x509_certÒ  s   rò   c                 C   sB   ddl m} tdf}| | |¡}|d |vrtdƒ‚t|d |ƒS )Nr   rƒ   rë   zNo PKCS#8 encoded RSA keyr   )r�   r„   r   Úunwrapr    Ú_import_keyDER)rç   r�   r„   rì   rÛ   r0   r0   r1   Ú_import_pkcs8Ø  s   rõ   c              	   C   sB   t ttttf}|D ]}z|| |ƒW   S  ty   Y q	w tdƒ‚)z@Import an RSA key (public or private half), encoded in DER form.úRSA key format is not supported)ré   rê   rð   rò   rõ   r    )Ú
extern_keyr�   Ú	decodingsÚdecodingr0   r0   r1   rô   ã  s   üÿrô   c                 C   s´   ddl m}m}m}m} || |ƒ\}}|dkrtdƒ‚||ƒ\}}||ƒ\}	}||ƒ\}
}||ƒ\}}||ƒ\}}||ƒ\}}||ƒ\}}||ƒ dd„ ||	|
|||fD ƒ}t|ƒS )Nr   )Úimport_openssh_private_genericÚ
read_bytesÚread_stringÚcheck_paddingzssh-rsazThis SSH key is not RSAc                 S   s   g | ]}t  |¡‘qS r0   )r   Ú
from_bytesrt   r0   r0   r1   rw   	  s    z/_import_openssh_private_rsa.<locals>.<listcomp>)Ú_opensshrú   rû   rü   rý   r    r   )ÚdataÚpasswordrú   rû   rü   rý   Ússh_nameÚ	decryptedr   r   r   Úiqmpr   r   r   ÚpaddedÚbuildr0   r0   r1   Ú_import_openssh_private_rsaõ  s   r  c                 C   sV  ddl m} t| ƒ} |durt|ƒ}|  d¡r+t| ƒ}| ||¡\}}}t||ƒ}|S |  d¡rD| t| ƒ|¡\}}}|r?d}t||ƒS |  d¡r”t 	|  
d¡d ¡}	g }
t|	ƒd	kr€t d
|	dd	… ¡d }|
 |	d	d	| … ¡ |	d	| d… }	t|	ƒd	ks[t |
d ¡}t |
d ¡}t||gƒS t| ƒdkr§t| d ƒdkr§t| |ƒS tdƒ‚)aé  Import an RSA key (public or private).

    Args:
      extern_key (string or byte string):
        The RSA key to import.

        The following formats are supported for an RSA **public key**:

        - X.509 certificate (binary or PEM format)
        - X.509 ``subjectPublicKeyInfo`` DER SEQUENCE (binary or PEM
          encoding)
        - `PKCS#1`_ ``RSAPublicKey`` DER SEQUENCE (binary or PEM encoding)
        - An OpenSSH line (e.g. the content of ``~/.ssh/id_ecdsa``, ASCII)

        The following formats are supported for an RSA **private key**:

        - PKCS#1 ``RSAPrivateKey`` DER SEQUENCE (binary or PEM encoding)
        - `PKCS#8`_ ``PrivateKeyInfo`` or ``EncryptedPrivateKeyInfo``
          DER SEQUENCE (binary or PEM encoding)
        - OpenSSH (text format, introduced in `OpenSSH 6.5`_)

        For details about the PEM encoding, see `RFC1421`_/`RFC1423`_.

      passphrase (string or byte string):
        For private keys only, the pass phrase that encrypts the key.

    Returns: An RSA key object (:class:`RsaKey`).

    Raises:
      ValueError/IndexError/TypeError:
        When the given key cannot be parsed (possibly because the pass
        phrase is wrong).

    .. _RFC1421: http://www.ietf.org/rfc/rfc1421.txt
    .. _RFC1423: http://www.ietf.org/rfc/rfc1423.txt
    .. _`PKCS#1`: http://www.ietf.org/rfc/rfc3447.txt
    .. _`PKCS#8`: http://www.ietf.org/rfc/rfc5208.txt
    .. _`OpenSSH 6.5`: https://flak.tedunangst.com/post/new-openssh-key-format-and-bcrypt-pbkdf
    r   r‡   Ns   -----BEGIN OPENSSH PRIVATE KEYs   -----r€   ó    r   rã   r{   rº   é0   rö   )r�   rq   r   Ú
startswithr
   rå   r  rô   rŠ   Ú
a2b_base64Úsplitr~   r|   ÚunpackÚappendr   rþ   r   r	   r    )r÷   r�   rq   Útext_encodedÚopenssh_encodedÚmarkerÚenc_flagrW   rè   r—   r–   Úlengthr   r   r0   r0   r1   r     s8   )




ý
r   z1.2.840.113549.1.1.1)Nr¹   )Tr4   )&Ú__all__rŠ   r|   Ú
Cryptodomer   ÚCryptodome.Util.py3compatr   r	   r
   ÚCryptodome.Util.asn1r   r   ÚCryptodome.Util.numberr   ÚCryptodome.Math.Numbersr   ÚCryptodome.Math.Primalityr   r   r   ÚCryptodome.PublicKeyr   r   r   rÐ   r   r   r   ré   rê   rð   rò   rõ   rô   r  r   Ú	importKeyr   r0   r0   r0   r1   Ú<module>   s6      

R 	

P
