U
    wez                     @   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   )msgkey_type	cert_typeen)keypublic_blob_from_private_key_from_private_key_filer	   _check_type_and_load_certnamer   RSAPublicNumbers	get_mpint
public_keyr   )selfr   datafilenamepasswordr   file_obj r#   n/mounts/lovelace/software/anaconda3/envs/qiime2-amplicon-2024.2/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   RSAPrivateKeyprivate_numberspublic_numbersr-   r#   r#   r$   r2   Z   s    zRSAKey.public_numbersc                 C   s6   t  }|| j || jj || jj | S r&   )r	   
add_stringr   	add_mpintr2   r   r   asbytes)r   mr#   r#   r$   r5   a   s
    zRSAKey.asbytesc                 C   s   |   jdddS )Nutf8ignore)errors)r5   decoder-   r#   r#   r$   __str__h   s    zRSAKey.__str__c                 C   s   |   | jj| jjfS r&   )get_namer2   r   r   r-   r#   r#   r$   _fieldsm   s    zRSAKey._fieldsc                 C   s   | j S r&   )r   r-   r#   r#   r$   r<   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   r0   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	   r3   replace)r   r   r@   sigr6   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)get_textr(   r   r/   r   r0   r   
get_binaryr,   lenverifyr   rC   r   )r   r   r   Zsig_algorithmr   rB   diffr#   r#   r$   verify_ssh_sig   s(    
   
zRSAKey.verify_ssh_sigc                 C   s   | j || jtjj|d d S N)r!   )_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 rP   )_write_private_keyr   r   rR   rS   )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  )public_exponentr,   backend)r   )r   generate_private_keyr   r   )bitsprogress_funcr   r#   r#   r$   generate   s    
  zRSAKey.generatec                 C   s   |  d||}| | d S NZRSA)_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 r]   )_read_private_keyr_   )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!   rX   Ziiiiiir      )pqddmp1dmq1iqmpr2   )_PRIVATE_KEY_FORMAT_ORIGINALr   load_der_private_keyr   
ValueError	TypeErrorr   r   str_PRIVATE_KEY_FORMAT_OPENSSH_uint32_cstruct_unpackr   r   RSAPrivateNumbersprivate_key_got_bad_key_format_idr/   r0   AssertionErrorr   )r   r   pkformatr   r   r   rd   rg   rb   rc   r2   r#   r#   r$   r_      s6    
  
 




zRSAKey._decode_key)NNNNNN)N)N)N)N)__name__
__module____qualname____doc__r   r   SHA1SHA256SHA512r(   r%   classmethodr+   propertyr.   r2   r5   r;   r=   r<   r>   r?   rF   rO   rT   rV   staticmethodr\   r   r   r_   r#   r#   r#   r$   r   !   sL         
!






r   N)rw   cryptography.exceptionsr   r   cryptography.hazmat.backendsr   Zcryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr   r   paramiko.messager	   paramiko.pkeyr
   paramiko.ssh_exceptionr   r   r#   r#   r#   r$   <module>   s   