U
    Øccœ  ã                   @   s„   d Z ddlmZ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ÚUnsupportedAlgorithm)Údefault_backend)ÚhashesÚserialization)ÚrsaÚpadding)ÚMessage)ÚPKey)ÚPY2)ÚSSHExceptionc                   @   sÐ   e Zd ZdZejejejejejejdœZd'dd„Z	e
dd„ ƒZe
dd	„ ƒZd
d„ Zdd„ Ze
dd„ ƒZdd„ Zdd„ Zdd„ Zd(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.
    )ússh-rsaússh-rsa-cert-v01@openssh.comzrsa-sha2-256z!rsa-sha2-256-cert-v01@openssh.comzrsa-sha2-512z!rsa-sha2-512-cert-v01@openssh.comNc                 C   s˜   d | _ d | _|d k	r$|  ||¡ d S |d k	r<|  ||¡ d S |d krT|d k	rTt|ƒ}|d k	rd|| _ n0| j|ddd tj| ¡ | ¡ d 	t
ƒ ¡| _ d S )Nr   r   )Ú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/tmp/pip-unpacked-wheel-rglolp_m/paramiko/rsakey.pyÚ__init__1   s.    	û ÿþzRSAKey.__init__c                 C   s   | j jS ©N)r   Úkey_size©r   r   r   r   ÚsizeR   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'   V   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*   ]   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__d   s    zRSAKey.__str__c                 C   s   |   ¡ | jj| jjfS r!   )Úget_namer'   r   r   r#   r   r   r   Ú_fieldsp   s    zRSAKey._fieldsc                 C   s   dS r(   r   r#   r   r   r   r1   t   s    zRSAKey.get_namec                 C   s   | j S r!   )r$   r#   r   r   r   Úget_bitsw   s    zRSAKey.get_bitsc                 C   s   t | jtjƒS r!   )r%   r   r   r&   r#   r   r   r   Úcan_signz   s    zRSAKey.can_signr   c                 C   sD   | j j|t ¡ | j| ƒ d}tƒ }| | dd¡¡ | |¡ |S )N)r   Ú	algorithmz-cert-v01@openssh.comÚ )r   Úsignr   ÚPKCS1v15ÚHASHESr	   r)   Úreplace)r   r   r5   Úsigr+   r   r   r   Úsign_ssh_data}   s    
ý
zRSAKey.sign_ssh_datac                 C   s¦   |  ¡ }|| jkrdS | j}t|tjƒr0| ¡ }| ¡ }|jt	|ƒd  }|dkrfd|d d  | }z | 
||t ¡ | j| ƒ ¡ W n tk
rœ   Y dS X dS d S )NFé   r   ó    é   T)Zget_textr9   r   r%   r   r&   r   Z
get_binaryr"   ÚlenÚverifyr   r8   r   )r   r   r   Zsig_algorithmr   r7   Zdiffr   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 rC   )Z_write_private_keyr   r   rD   rE   )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 rK   )Z_read_private_keyrL   )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ttfk
r\ } ztt|ƒƒ‚W 5 d }~X Y qÌX nl|| j	krÂ|  
|d¡\}}}}}}	tj||d}
tj||	|||d  ||	d  ||
d tƒ ¡}n
|  |¡ t|tjƒsÜt‚|| _d S )N)r   rH   Ziiiiiir   é   )ÚpÚqÚdZdmp1Zdmq1Úiqmpr'   )Z_PRIVATE_KEY_FORMAT_ORIGINALr   Zload_der_private_keyr   Ú
ValueErrorÚ	TypeErrorr   r   ÚstrZ_PRIVATE_KEY_FORMAT_OPENSSHZ_uint32_cstruct_unpackr   r   ZRSAPrivateNumbersZprivate_keyZ_got_bad_key_format_idr%   r&   ÚAssertionErrorr   )r   r   Zpkformatr   r   r   rP   rQ   rN   rO   r'   r   r   r   rL   É   s6    
  ÿ
 


ùø

zRSAKey._decode_key)NNNNNN)r   )N)N)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚSHA1ÚSHA256ÚSHA512r9   r    Úpropertyr$   r'   r*   r0   r2   r1   r3   r4   r<   rB   rF   rG   ÚstaticmethodrJ   r   r   rL   r   r   r   r   r   "   sF   ú      ù
!





r   N)rY   Zcryptography.exceptionsr   r   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   