o
    g!                     @   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                   @   sf   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 u r|d urt|}|d ur)| j|| jdd tj| }n.|d urKt|d}| 	d|\}	}W d    n1 sEw   Y  n|d urW| 	d|\}	}|s[|ra| 
||}|d u rm|d u rmt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signing	VerifyKey
get_binaryopen_read_private_key_parse_signing_key_data
ValueError_signing_key_verifying_key)
selfr   datafilenamepasswordfile_objverifying_keysigning_keyfpkformat r'   M/var/www/html/api-tag/env/lib/python3.10/site-packages/paramiko/ed25519key.py__init__,   s0   
zEd25519Key.__init__c                 C   sn  ddl m} t|}|tttkrtd| }| }| }|	 }|dkr6|s1|dkr5tdn|dkrM|s@t
dt|}	|	 }
|		 }ntd|dkr^||jvr^tdg }t|D ]}t| }| | jkrwtd||  qd| }|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 ]G}| | jkrtd| }| }tj|d d }|j |  kr||   kr|dd  ksJ  J || |  qt|dkr3td|d S )Nr   )	TransportzInvalid keynonebcryptzPrivate key file is encryptedzkey-sizez
block-sizeT)r!   salt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   
SigningKey
verify_keyencode)r   r   r!   r*   message
ciphernamekdfname
kdfoptionsnum_keysr>   bcrypt_saltbcrypt_roundspublic_keys_pubkeyprivate_ciphertextprivate_datacipherkeyr?   signing_keysipublic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   rC   r   r   
add_stringr   rD   asbytes)r   vmr'   r'   r(   rZ      s   
zEd25519Key.asbytesc                 C   s$   |   r	| jj}n| j}|  |fS rW   )rX   r   rC   r   get_name)r   r[   r'   r'   r(   _fields   s   
zEd25519Key._fieldsc                 C   s   | j S rW   )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 rW   )r   r_   r'   r'   r(   rX      s   
zEd25519Key.can_signc                 C   s*   t  }|| j || j|j |S rW   )r   rY   r   r   sign	signature)r   r   	algorithmr\   r'   r'   r(   sign_ssh_data   s   zEd25519Key.sign_ssh_datac                 C   sD   |  | jkr	dS z| j||  W dS  tjjy!   Y dS w )NFT)r9   r   r   verifyr   r   
exceptionsBadSignatureError)r   r   r   r'   r'   r(   verify_ssh_sig   s   zEd25519Key.verify_ssh_sig)NNNNNrW   )__name__
__module____qualname____doc__r   r)   r   rZ   propertyr^   r]   ra   rX   re   ri   r'   r'   r'   r(   r      s    
`


r   )r,   cryptography.hazmat.backendsr   &cryptography.hazmat.primitives.ciphersr   nacl.signingr   paramiko.messager   paramiko.pkeyr   r   r   paramiko.utilr   paramiko.ssh_exceptionr	   r
   r   r'   r'   r'   r(   <module>   s   