o
    gz                     @   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 ur| || d S |d ur| || d S |d u r*|d ur*t|}|d ur3|| _ d S | 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#   I/var/www/html/api-tag/env/lib/python3.10/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 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      | j S r&   )r   r-   r#   r#   r$   r<   q      zRSAKey.get_namec                 C   r>   r&   )r.   r-   r#   r#   r$   get_bitst   r?   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 u 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   rB   sigr6   r#   r#   r$   sign_ssh_dataz   s   

zRSAKey.sign_ssh_datac                 C   s   |  }|| jvrdS | j}t|tjr| }| }|jt	|d  }|dkr3d|d d  | }z|
||t | j|   W dS  tyN   Y dS w )NF   r          T)get_textr(   r   r/   r   r0   r   
get_binaryr,   lenverifyr   rE   r   )r   r   r   sig_algorithmr   rD   diffr#   r#   r$   verify_ssh_sig   s$   
zRSAKey.verify_ssh_sigc                 C      | 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      
zRSAKey.write_private_key_filec                 C   rS   rT   )_write_private_keyr   r   rV   rW   )r   r"   r!   r#   r#   r$   write_private_key   rY   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      |  d||}| | d S NRSA)_read_private_key_file_decode_key)r   r    r!   r   r#   r#   r$   r         zRSAKey._from_private_key_filec                 C   rb   rc   )_read_private_keyrf   )r   r"   r!   r   r#   r#   r$   r      rg   zRSAKey._from_private_keyc              
   C   s   |\}}|| j kr*ztj|d t d}W nK tttfy) } ztt|d }~ww || j	kr[| 
|d\}}}}}}	tj||d}
tj||	|||d  ||	d  ||
dt }n| | t|tjshJ || _d S )N)r!   r]   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   r   )r   r   pkformatr   r   r   rm   rp   rk   rl   r2   r#   r#   r$   rf      s6   







zRSAKey._decode_key)NNNNNNr&   )__name__
__module____qualname____doc__r   r   SHA1SHA256SHA512r(   r%   classmethodr+   propertyr.   r2   r5   r;   r=   r<   r@   rA   rH   rR   rX   r[   staticmethodra   r   r   rf   r#   r#   r#   r$   r   !   sN    
!






r   N)r   cryptography.exceptionsr   r   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr   r   paramiko.messager	   paramiko.pkeyr
   paramiko.ssh_exceptionr   r   r#   r#   r#   r$   <module>   s   