a
   Z{.                   @   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                   @   sZ   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
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 u r&|d ur&t|}|d urP| j|ddd tj| }n\|d urt|d }| d|\}	}W d    q1 s0    Y  n|d ur| d|\}	}|s|r| 	||}|d u r|d u 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/usr/lib/python3.9/site-packages/paramiko/ed25519key.py__init__*   s,    0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v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 J || |  qt|dkrhtd|d S )Nr   )	TransportzInvalid keyZnonebcryptzPrivate key file is encryptedr   zkey-sizez
block-sizeT)r   ZsaltZdesired_key_bytesroundsZignore_few_roundsclassmode)Zbackend       )Zparamiko.transportr    r   Z	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)r   r   r   r    messageZ
ciphernameZkdfnameZ
kdfoptionsZnum_keysr+   Zbcrypt_saltZbcrypt_roundsZpublic_keys_ZpubkeyZprivate_ciphertextZprivate_dataZcipherkeyr,   Zsigning_keysiZ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   r/   r   r   
add_stringr0   asbytes)r   vmr   r   r   r8      s    

zEd25519Key.asbytesc                 C   s(   |   r| jj}n| j}t|  |fS N)r6   r   r/   r   hashget_name)r   r9   r   r   r   __hash__   s    
zEd25519Key.__hash__c                 C   s   dS r5   r   r   r   r   r   r=      s    zEd25519Key.get_namec                 C   s   dS )N   r   r?   r   r   r   get_bits   s    zEd25519Key.get_bitsc                 C   s
   | j d uS r;   )r   r?   r   r   r   r6      s    zEd25519Key.can_signc                 C   s(   t  }|d || j|j |S r5   )r   r7   r   signZ	signature)r   r   r:   r   r   r   sign_ssh_data   s    
zEd25519Key.sign_ssh_datac                 C   sH   |  dkrdS z| j||  W n tjjy>   Y dS 0 dS d S )Nr   FT)r(   r   Zverifyr   r   
exceptionsZBadSignatureError)r   r   r   r   r   r   verify_ssh_sig   s    zEd25519Key.verify_ssh_sig)NNNNN)__name__
__module____qualname____doc__r   r   r8   r>   r=   rA   r6   rC   rE   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   