U
    ÓZj  ã                   @   sx   d dl Z d dlmZ d dlmZ d dlZd dlmZ d dl	m
Z
mZmZ d dlmZ d dlmZmZ G dd	„ d	e
ƒZdS )
é    N)Údefault_backend)ÚCipher)ÚMessage)ÚPKeyÚOPENSSH_AUTH_MAGICÚ_unpad_openssh)Úb)ÚSSHExceptionÚPasswordRequiredExceptionc                   @   s`   e Zd ZdZd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S )Ú
Ed25519Keya  
    Representation of an `Ed25519 <https://ed25519.cr.yp.to/>`_ key.

    .. note::
        Ed25519 key support was added to OpenSSH in version 6.5.

    .. versionadded:: 2.2
    .. versionchanged:: 2.3
        Added a ``file_obj`` parameter to match other key classes.
    Nc           
   	   C   sÔ   d | _ d  }}|d kr&|d k	r&t|ƒ}|d k	rP| j|ddd� tj | ¡ ¡}nH|d k	r€t|dƒ�}|  d|¡\}	}W 5 Q R X n|d k	r˜|  d|¡\}	}|s |r¬|  	||¡}|d krÄ|d krÄt
dƒ‚|| _|| _d S )Nússh-ed25519z ssh-ed25519-cert-v01@openssh.com)ÚmsgZkey_typeZ	cert_typeÚrZOPENSSHz
need a key)Zpublic_blobr   Z_check_type_and_load_certÚnaclÚsigningZ	VerifyKeyÚ
get_binaryÚopenZ_read_private_keyÚ_parse_signing_key_dataÚ
ValueErrorÚ_signing_keyÚ_verifying_key)
Úselfr   ÚdataÚfilenameÚpasswordZfile_objZverifying_keyÚsigning_keyÚfZpkformat© r   úV/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/paramiko/ed25519key.pyÚ__init__*   s,    ýzEd25519Key.__init__c                 C   sp  ddl m} t|ƒ}| ttƒ¡tkr.tdƒ‚| ¡ }| ¡ }| ¡ }| 	¡ }|dkrl|sb|dkr¢tdƒ‚n6|dkrš|s€t
dƒ‚t|ƒ}	|	 ¡ }
|	 	¡ }ntdƒ‚|dkr¼||jkr¼tdƒ‚g }t|ƒD ]2}t| ¡ ƒ}| ¡ dkrìtdƒ‚| | ¡ ¡ qÈ| ¡ }|dk�r|}n||j| }tjt|ƒ|
|d |d	  |d
d�}t|d |d |d … ƒ|d ||d d … ƒtƒ d� ¡ }| |¡| ¡  }tt|ƒƒ}| 	¡ | 	¡ k�r¶tdƒ‚g }t|ƒD ]Ž}| ¡ dk�rÜtdƒ‚| ¡ }| ¡ }tj |d d… ¡}|j ¡ |  k�r6||   k�r6|dd … k�s<n t‚| |¡ | ¡  �qÂt|ƒdk�rhtdƒ‚|d S )Nr   )Ú	TransportzInvalid keyÚnoneÚbcryptzPrivate key file is encryptedr   zkey-sizez
block-sizeT)r   ÚsaltZdesired_key_bytesÚroundsZignore_few_roundsÚclassÚmode)Úbackendé    é   )Zparamiko.transportr    r   Ú	get_bytesÚlenr   r	   Úget_textr   Zget_intr
   Z_cipher_infoÚrangeÚappendr"   Úkdfr   r   r   Ú	decryptorÚupdateÚfinalizer   r   r   Z
SigningKeyÚ
verify_keyÚencodeÚAssertionError)r   r   r   r    ÚmessageZ
ciphernameZkdfnameZ
kdfoptionsZnum_keysr/   Zbcrypt_saltZbcrypt_roundsZpublic_keysÚ_ZpubkeyZprivate_ciphertextZprivate_dataÚcipherÚkeyr0   Zsigning_keysÚiÚpublicZkey_datar   r   r   r   r   G   sˆ    
ÿ


ù	ý
ÿþ
ý

ü
z"Ed25519Key._parse_signing_key_datac                 C   s>   |   ¡ r| jj}n| j}tƒ }| d¡ | | ¡ ¡ | ¡ S ©Nr   )Úcan_signr   r3   r   r   Ú
add_stringr4   Úasbytes)r   ÚvÚmr   r   r   r?   §   s    

zEd25519Key.asbytesc                 C   s$   |   ¡ r| jj}n| j}|  ¡ |fS ©N)r=   r   r3   r   Úget_name)r   r@   r   r   r   Ú_fields±   s    
zEd25519Key._fieldsc                 C   s   dS r<   r   ©r   r   r   r   rC   ¹   s    zEd25519Key.get_namec                 C   s   dS )Né   r   rE   r   r   r   Úget_bits¼   s    zEd25519Key.get_bitsc                 C   s
   | j d k	S rB   )r   rE   r   r   r   r=   ¿   s    zEd25519Key.can_signc                 C   s(   t ƒ }| d¡ | | j |¡j¡ |S r<   )r   r>   r   ÚsignÚ	signature)r   r   Ú	algorithmrA   r   r   r   Úsign_ssh_dataÂ   s    
zEd25519Key.sign_ssh_datac                 C   sJ   |  ¡ dkrdS z| j || ¡ ¡ W n tjjk
r@   Y dS X dS d S )Nr   FT)r,   r   Úverifyr   r   Ú
exceptionsZBadSignatureError)r   r   r   r   r   r   Úverify_ssh_sigÈ   s    zEd25519Key.verify_ssh_sig)NNNNN)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r?   ÚpropertyrD   rC   rG   r=   rK   rN   r   r   r   r   r      s             ÿ
`


r   )r"   Zcryptography.hazmat.backendsr   Z&cryptography.hazmat.primitives.ciphersr   Znacl.signingr   Zparamiko.messager   Zparamiko.pkeyr   r   r   Zparamiko.py3compatr   Zparamiko.ssh_exceptionr	   r
   r   r   r   r   r   Ú<module>   s   