U
    ςdz                     @   sx   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 G d	d
 d
eZdS )z
RSA keys.
    )InvalidSignatureUnsupportedAlgorithm)default_backend)hashesserialization)rsapadding)Message)PKey)SSHExceptionc                   @   s   e Zd 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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)r   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|| _ n2| j|| jdd tj|	 |	 d
t | _ d S )Nr   )msgZkey_typeZ	cert_typeen)keyZpublic_blob_from_private_key_from_private_key_filer	   Z_check_type_and_load_certnamer   RSAPublicNumbersZ	get_mpint
public_keyr   )selfr   datafilenamepasswordr   file_obj r   L/var/www/html/myproject/myenv/lib/python3.8/site-packages/paramiko/rsakey.py__init__1   s.    	 zRSAKey.__init__c                 C   s   t | j S N)listHASHESkeys)clsr   r   r   identifiersR   s    zRSAKey.identifiersc                 C   s   | j jS r!   )r   key_sizer   r   r   r   sizeV   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,   Z   s    zRSAKey.public_numbersc                 C   s6   t  }|| j || jj || jj | S r!   )r	   
add_stringr   Z	add_mpintr,   r   r   asbytes)r   mr   r   r   r.   a   s
    zRSAKey.asbytesc                 C   s   |   jdddS )Nutf8ignore)errors)r.   decoder(   r   r   r   __str__h   s    zRSAKey.__str__c                 C   s   |   | jj| jjfS r!   )get_namer,   r   r   r(   r   r   r   _fieldsm   s    zRSAKey._fieldsc                 C   s   | j S r!   )r   r(   r   r   r   r5   q   s    zRSAKey.get_namec                 C   s   | j S r!   )r)   r(   r   r   r   get_bitst   s    zRSAKey.get_bitsc                 C   s   t | jtjS r!   )r*   r   r   r+   r(   r   r   r   can_signw   s    zRSAKey.can_signc                 C   sR   |d kr| j }| jj|t | j|  d}t }||dd || |S )N)r   	algorithmz-cert-v01@openssh.com )	r   r   signr   PKCS1v15r#   r	   r-   replace)r   r   r9   sigr/   r   r   r   sign_ssh_dataz   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_textr#   r   r*   r   r+   r   Z
get_binaryr'   lenverifyr   r<   r   )r   r   r   Zsig_algorithmr   r;   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 rG   )Z_write_private_keyr   r   rH   rI   )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 rO   )Z_read_private_keyrP   )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 qX nl|| j	kr| 
|d\}}}}}}	tj||d}
tj||	|||d  ||	d  ||
dt }n
| | t|tjst|| _d S )N)r   rL   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   rT   rU   rR   rS   r,   r   r   r   rP      s6    
  
 




zRSAKey._decode_key)NNNNNN)N)N)N)N)__name__
__module____qualname____doc__r   r   SHA1SHA256SHA512r#   r    classmethodr&   propertyr)   r,   r.   r4   r6   r5   r7   r8   r?   rF   rJ   rK   staticmethodrN   r   r   rP   r   r   r   r   r   !   sL         
!






r   N)r]   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.ssh_exceptionr   r   r   r   r   r   <module>   s   