U
    we!                     @   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)msgkey_type	cert_typerOPENSSHz
need a key)public_blobr   _check_type_and_load_certnamenaclsigningZ	VerifyKey
get_binaryopen_read_private_key_parse_signing_key_data
ValueError_signing_key_verifying_key)
selfr   datafilenamepasswordfile_objZverifying_keysigning_keyfpkformat r%   r/mounts/lovelace/software/anaconda3/envs/qiime2-amplicon-2024.2/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roundsignore_few_roundsclassmode)backend       )paramiko.transportr(   r   	get_byteslenr   r	   get_textr   get_intr
   _cipher_inforanger   appendr*   kdfr   r   r   	decryptorupdatefinalizer   r   r   Z
SigningKey
verify_keyencodeAssertionError)r   r   r    r(   message
ciphernamekdfname
kdfoptionsZnum_keysr;   Zbcrypt_saltZbcrypt_roundsZpublic_keys_pubkeyZprivate_ciphertextZprivate_datacipherkeyr<   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   r?   r   r   
add_stringr   r@   asbytes)r   vmr%   r%   r&   rO      s    
zEd25519Key.asbytesc                 C   s$   |   r| jj}n| j}|  |fS rL   )rM   r   r?   r   get_name)r   rP   r%   r%   r&   _fields   s    
zEd25519Key._fieldsc                 C   s   | j S rL   )r   r   r%   r%   r&   rR      s    zEd25519Key.get_namec                 C   s   dS )N   r%   rT   r%   r%   r&   get_bits   s    zEd25519Key.get_bitsc                 C   s
   | j d k	S rL   )r   rT   r%   r%   r&   rM      s    zEd25519Key.can_signc                 C   s*   t  }|| j || j|j |S rL   )r   rN   r   r   sign	signature)r   r   	algorithmrQ   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)r6   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   rO   propertyrS   rR   rV   rM   rZ   r]   r%   r%   r%   r&   r      s"            
`


r   )r*   cryptography.hazmat.backendsr   &cryptography.hazmat.primitives.ciphersr   Znacl.signingr   paramiko.messager   paramiko.pkeyr   r   r   paramiko.utilr   paramiko.ssh_exceptionr	   r
   r   r%   r%   r%   r&   <module>   s   