a
   £ÑcL› Ç“ã                   @   s€   d Z ddlmZ ddlmZ ddl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 dd	lmZ G d
d„ deƒZdS )z
RSA keys.
é    )ÚInvalidSignature)Údefault_backend)ÚhashesÚserialization)ÚrsaÚpadding)ÚMessage)ÚPKey)ÚPY2)ÚSSHExceptionc                   @   s¬   e Zd ZdZd%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d„Zd'dd„Zed(dd„ƒZdd „ Zd!d"„ Zd#d$„ ZdS ))ÚRSAKeyzZ
    Representation of an RSA key which can be used to sign and verify SSH2
    data.
    Nc                 C   s˜   d | _ d | _|d ur$|  ||¡ d S |d ur<|  ||¡ d S |d u rT|d urTt|ƒ}|d urd|| _ n0| j|ddd tj| ¡ | ¡ d 	t
ƒ ¡| _ d S )Nússh-rsazssh-rsa-cert-v01@openssh.com)ÚmsgZkey_typeZ	cert_type©ÚeÚn)ÚkeyZpublic_blobÚ_from_private_keyÚ_from_private_key_filer   Z_check_type_and_load_certr   ÚRSAPublicNumbersZ	get_mpintÚ
public_keyr   )Úselfr   ÚdataÚfilenameÚpasswordr   Úfile_obj© r   ú3/usr/lib/python3.9/site-packages/paramiko/rsakey.pyÚ__init__(   s,    	ýÿþzRSAKey.__init__c                 C   s   | j jS ©N)r   Úkey_size©r   r   r   r   ÚsizeG   s    zRSAKey.sizec                 C   s(   t | jtjƒr| j ¡ jS | j ¡ S d S r   )Ú
isinstancer   r   ÚRSAPrivateKeyZprivate_numbersÚpublic_numbersr!   r   r   r   r%   K   s    zRSAKey.public_numbersc                 C   s4   t ƒ }| d¡ | | jj¡ | | jj¡ | ¡ S ©Nr   )r   Ú
add_stringZ	add_mpintr%   r   r   Úasbytes)r   Úmr   r   r   r(   R   s
    
zRSAKey.asbytesc                 C   s"   t r|  ¡ S |  ¡ jdddS d S )NÚutf8Úignore)Úerrors)r
   r(   Údecoder!   r   r   r   Ú__str__Y   s    zRSAKey.__str__c                 C   s   t |  ¡ | jj| jjfƒS r   )ÚhashÚget_namer%   r   r   r!   r   r   r   Ú__hash__e   s    ÿzRSAKey.__hash__c                 C   s   dS r&   r   r!   r   r   r   r0   j   s    zRSAKey.get_namec                 C   s   | j S r   )r"   r!   r   r   r   Úget_bitsm   s    zRSAKey.get_bitsc                 C   s   t | jtjƒS r   )r#   r   r   r$   r!   r   r   r   Úcan_signp   s    zRSAKey.can_signc                 C   s8   | j j|t ¡ t ¡ d}tƒ }| d¡ | |¡ |S )N)r   Ú	algorithmr   )r   Úsignr   ÚPKCS1v15r   ÚSHA1r   r'   )r   r   Zsigr)   r   r   r   Úsign_ssh_datas   s    ÿ

zRSAKey.sign_ssh_datac                 C   sh   |  ¡ dkrdS | j}t|tjƒr*| ¡ }z | | ¡ |t 	¡ t
 ¡ ¡ W n ty^   Y dS 0 dS d S )Nr   FT)Zget_textr   r#   r   r$   r   ZverifyZ
get_binaryr   r6   r   r7   r   )r   r   r   r   r   r   r   Úverify_ssh_sig}   s    ÿzRSAKey.verify_ssh_sigc                 C   s   | j || jtjj|d d S ©N)r   )Z_write_private_key_filer   r   ÚPrivateFormatÚTraditionalOpenSSL)r   r   r   r   r   r   Úwrite_private_key_file   s    üzRSAKey.write_private_key_filec                 C   s   | j || jtjj|d d S r:   )Z_write_private_keyr   r   r;   r<   )r   r   r   r   r   r   Úwrite_private_key•   s    üzRSAKey.write_private_keyc                 C   s   t jd| tƒ d}t|dS )a$  
        Generate a new private RSA key.  This factory function can be used to
        generate a new host key or authentication key.

        :param int bits: number of bits the generated key should be.
        :param progress_func: Unused
        :return: new `.RSAKey` private key
        i  )Zpublic_exponentr    Úbackend)r   )r   Zgenerate_private_keyr   r   )ÚbitsZprogress_funcr   r   r   r   Úgenerate   s    
ÿzRSAKey.generatec                 C   s   |   d||¡}|  |¡ d S ©NZRSA)Z_read_private_key_fileÚ_decode_key)r   r   r   r   r   r   r   r   ®   s    zRSAKey._from_private_key_filec                 C   s   |   d||¡}|  |¡ d S rB   )Z_read_private_keyrC   )r   r   r   r   r   r   r   r   ²   s    zRSAKey._from_private_keyc              
   C   sâ   |\}}|| j kr\ztj|d tƒ d}W qÈ tyX } ztt|ƒƒ‚W Y d }~qÈd }~0 0 nl|| jkr¾|  |d¡\}}}}}}	t	j
||d}
t	j||	|||d  ||	d  ||
d tƒ ¡}n
|  |¡ t|t	jƒsØJ ‚|| _d S )N)r   r?   Ziiiiiir   é   )ÚpÚqÚdZdmp1Zdmq1Úiqmpr%   )Z_PRIVATE_KEY_FORMAT_ORIGINALr   Zload_der_private_keyr   Ú
ValueErrorr   ÚstrZ_PRIVATE_KEY_FORMAT_OPENSSHZ_uint32_cstruct_unpackr   r   ZRSAPrivateNumbersZprivate_keyZ_got_bad_key_format_idr#   r$   r   )r   r   Zpkformatr   r   r   rG   rH   rE   rF   r%   r   r   r   rC   ¶   s2    
ÿ
$


ùø

zRSAKey._decode_key)NNNNNN)N)N)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úpropertyr"   r%   r(   r.   r1   r0   r2   r3   r8   r9   r=   r>   ÚstaticmethodrA   r   r   rC   r   r   r   r   r   "   s6         ù





r   N)rN   Zcryptography.exceptionsr   Zcryptography.hazmat.backendsr   Zcryptography.hazmat.primitivesr   r   Z)cryptography.hazmat.primitives.asymmetricr   r   Zparamiko.messager   Zparamiko.pkeyr	   Zparamiko.py3compatr
   Zparamiko.ssh_exceptionr   r   r   r   r   r   Ú<module>   s   