U
    ςd!                     @   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                   @   sd   e Zd 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.
    zssh-ed25519Nc           
   	   C   s   d | _ d  }}|d kr&|d k	r&t|}|d k	rR| j|| j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 )Nz 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name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   P/var/www/html/myproject/myenv/lib/python3.8/site-packages/paramiko/ed25519key.py__init__,   s,    zEd25519Key.__init__c                 C   st  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 ]4}t| }| | j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 ]}| | jkrtd| }| }tj|d d }|j |  kr:||   kr:|dd  ks@n t|| |  qt|dkrltd|d S )Nr   )	TransportzInvalid keynonebcryptzPrivate key file is encryptedz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ranger   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   I   s    



	




z"Ed25519Key._parse_signing_key_datac                 C   s@   |   r| jj}n| j}t }|| j ||  | S N)	can_signr   r3   r   r   
add_stringr   r4   asbytes)r   vmr   r   r   r?      s    
zEd25519Key.asbytesc                 C   s$   |   r| jj}n| j}|  |fS r<   )r=   r   r3   r   get_name)r   r@   r   r   r   _fields   s    
zEd25519Key._fieldsc                 C   s   | j 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 r<   )r   rD   r   r   r   r=      s    zEd25519Key.can_signc                 C   s*   t  }|| j || j|j |S r<   )r   r>   r   r   sign	signature)r   r   	algorithmrA   r   r   r   sign_ssh_data   s    zEd25519Key.sign_ssh_datac                 C   sL   |  | jkrdS z| j||  W n tjjk
rB   Y dS X dS d S )NFT)r,   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   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.utilr   Zparamiko.ssh_exceptionr	   r
   r   r   r   r   r   <module>   s   