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#   ú:/usr/local/lib/python3.10/dist-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   