U
    7Ó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   úQ/var/www/html/alexa-login-pro/venv/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 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   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   