U
    cc                     @   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	rt|d}| d|\}	}W 5 Q R X n|d k	r| d|\}	}|s|r| 	||}|d kr|d krt
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   7/tmp/pip-unpacked-wheel-rglolp_m/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rtdn6|dkr|st
dt|}	|	 }
|		 }ntd|dkr||jkrtdg }t|D ]2}t| }| dkrt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rtdg }t|D ]}| dkrtd| }| }tj|d d }|j |  kr6||   kr6|dd  ks<n t|| |  qt|dkrhtd|d S )Nr   )	TransportzInvalid keynonebcryptzPrivate key file is encryptedr   zkey-sizez
block-sizeT)r   Z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keyr/   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   r2   r   r   
add_stringr3   asbytes)r   vmr   r   r   r>      s    

zEd25519Key.asbytesc                 C   s$   |   r| jj}n| j}|  |fS N)r<   r   r2   r   get_name)r   r?   r   r   r   _fields   s    
zEd25519Key._fieldsc                 C   s   dS r;   r   r   r   r   r   rB      s    zEd25519Key.get_namec                 C   s   dS )N   r   rD   r   r   r   get_bits   s    zEd25519Key.get_bitsc                 C   s
   | j d k	S rA   )r   rD   r   r   r   r<      s    zEd25519Key.can_signc                 C   s(   t  }|d || j|j |S r;   )r   r=   r   sign	signature)r   r   	algorithmr@   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>   propertyrC   rB   rF   r<   rJ   rM   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   